Eccomi, allora, ho risolto quasi tutto!
Inannzitutto mi rimangio quello che ho scritto il post precedente. Nel senso che stavo operando nelle tabelle, quindi era tutto coerente da quel punto di vista!
Metto il nuovo codice:
Private Sub Comando333_Click()
'On Error GoTo Err_Handler
'Purpose: Duplicate the main form record and related records in the subform.
Dim strSql As String 'SQL statement.
Dim lngID As String 'Primary key value of the new record.
'Save any edits first
If Me.Dirty Then
Me.Dirty = False
End If
'Make sure there is a record to duplicate.
If Me.NewRecord Then
MsgBox "Seleziona l'Ordine da Duplicare"
Else
'Duplicate the main record: add to form's clone.
With Me.RecordsetClone
.AddNew
!IdOC = "" & DMax("IdOc", "OrdineCliente") + 1 & ""
!AnnoOC = Me.AnnoOC
!Cliente = Me.Cliente
!DescrizioneOC = Me.DescrizioneOC
!ScontoOC = Me.ScontoOC
!CondizioniPagamento = Me.CondizioniPagamento
!ModalitàConsegna = Me.ModalitàConsegna
!TrasportoOC = Me.TrasportoOC
!NoteOC = Me.NoteOC
!NumeroPreventivo = Me.NumeroPreventivo
!AnnoPreventivo = Me.AnnoPreventivo
!NormativeRiferimentoOC = Me.NormativeRiferimentoOC
!CertificatiRichiestiOC = Me.CertificatiRichiestiOC
'etc for other fields.
.Update
'Save the primary key value, to use as the foreign key for the related records.
.Bookmark = .LastModified
lngID = !IdOC
'Duplicate the related records: append query.
If Me.Figlio298.Form.RecordsetClone.RecordCount > 0 Then
strSql = "INSERT INTO [Commessa] ( OrdineCliente, IDCommessa, Cantiere, AnnoCommessa, Cliente, LavorazioneCommessa, NumeroProgetto, QuantitàDaProdurre, Importo, ScontoCommessa, CertificatiRichiesti ) " & _
"SELECT '" & lngID & "' As OrdineCliente , '" & lngID & Right(Me!Figlio298!IdCommessa, 4) & "' as IDCommessa, Cantiere,'" & Year(Now()) & "' As AnnoCommessa, Cliente, LavorazioneCommessa, NumeroProgetto, QuantitàDaProdurre, Importo, ScontoCommessa, CertificatiRichiesti " & _
"FROM [Commessa] WHERE OrdineCliente = '" & Me.IdOC & "';"
DBEngine(0)(0).Execute strSql, dbFailOnError
Else
MsgBox "L'Ordine Cliente è stato duplicato, Ma non ci sono commesse correlate."
End If
'Display the new duplicate.
Me.Bookmark = .LastModified
End With
End If
Exit_Handler:
Exit Sub
Err_Handler:
MsgBox "Error " & Err.Number & " - " & Err.Description, , "cmdDupe_Click"
Resume Exit_Handler
End Sub
Il primo "errore" l'ho fatto nella generazione del record della maschera principale, poichè il mio "IDOC" doveva essere di tipo stringa...mentre scritto com'era me lo metteva di tipo numerico.
Aggiungendo due doppi apici all'inizio ed alla fine, mi sembra di aver corretto l'errore.
Cioè al posto di
!IdOC = & DMax("IdOc", "OrdineCliente") + 1 &
ho scritto:
!IdOC = "" & DMax("IdOc", "OrdineCliente") + 1 & ""
(ho corretto anche un po' l'espressione...che faceva delle operazioni inutili)
Per quanto riguarda la query aveva alcuni problemini.
Il primo (quello che generava l'errore) era dovuto sempre al fatto che io facevo riferimento a stringhe...quindi me la sono cavata pure qui mettendo singoli apici, cioè:
al posto di:
"SELECT " & lngID & " As OrdineCliente...
ho messo:
"SELECT ' " & lngID & " ' As OrdineCliente...
E, al posto di:
...WHERE OrdineCliente = " & Me.IdOC & ";"
ho messo:
...WHERE OrdineCliente = ' " & Me.IdOC & " ' ;"
E tutto, dal punto di vista sintattico si è sistemato!
Però ora mi sono trovato in un problemino di differente tipo.
La chiave primaria dei record della sottomaschera è il campo IDCommessa...
Io non posso duplicare tale chiave nei record della mia nuova sottomaschera, perchè ovviamente mi da errore di non-univocità.
Devo trovare il modo di generare dei nuovi codici per tale campo...
Allora siccome questo campo è composto dalla stringa IDOC con l'aggiunta di un contatore (cioè se IDOC è "12128", le mie commesse saranno del tipo "12128-001,12128-002, ecc..") io devo trovare il modo di generare questo contatore.
Oppure dovrei poter riprendere gli ultimi 4 caratteri di IDCommessa dei record originari da unire a IDOC.
Nel codice che ho scritto, ho provato a vedere se la logica, fino a questo punto, funzionava...
In effetti va bene!
Se ho un solo record nella sottomaschera la duplicazione è perfetta.
Però, come si può vedere dal mio codice, io con quelle istruzioni vado a riprendere solo il primo record della mia sottomaschera originaria...
L'espressione, appena tenta di generarmi un secondo record, si trova davanti ad una duplicazione di chiave e mi genera l'errore.
Devo inventarmi qualcosa per riprendere gli ultimi 4 caratteri ("-001", "-002", ...) della IDCommessa originaria...oppure per aggiungere una specie di contatore nella stringa SQL.
Aiutooo! ^^