Duplicazione record Maschera e Sottomaschera

di il
4 risposte

Duplicazione record Maschera e Sottomaschera

Ciao ciao ho bisogno di un aiuto.
Ho una maschera "OrdineCliente" con una sottomaschera "Commessa", avrei la necessità di poter duplicare tramite pulsante di comando, un record ed i relativi record correlati presenti nella sottomaschera.

Le maschere corrispondono alle relative tabelle, ovvero ho una tabella OrdineCliente ed una tabella Commessa.
Sono in relazione uno-a-molti rispettivamente tramite il campo IdOC (la tabella Ordine Cliente) ed OrdineCliente (la tabella Commessa).

Cercando su internet ho trovato un codice ed ho cercato di applicarlo modificandolo sulla base della mia situazione.
Tuttavia mi da errore nella riga sql.

Ve lo posto così magari mi date qualche consiglio.
Premetto che "Figlio298" è l'etichetta della sottomaschera e che l'ID dell'ordine cliente è in formato 12xxx dove 12 è l'anno e xxx è un contatore che si incrementa progressivamente.
Ho già testato la prima parte e va bene, il problema ce l'ho con la duplicazione dei record correlati, quelli relativi alle commesse.
Private Sub Comando334_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 = Right(Year(Now()), 2) & Right((DMax("IdOc", "OrdineCliente") + 1), 3)
                !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 , IDCommessa, Cantiere, 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
Mi da l'errore:

Errore di run-time "3464"
Tipo di dati non corrispondenti nell'espressione criterio.

Vi ringrazio in anticipo.
Mauri.

4 Risposte

  • Re: Duplicazione record Maschera e Sottomaschera

    Prova ad eseguire col debugger la procedura e soprattutto

    la query di accodamento funziona?
    prova a copiarla (dalla finestra immediata) e incollarla in una query (visualizzazione sql)

    probabilmente e' la stringa che non funziona correttamente

    fammi sapere

    PFMarro
  • Re: Duplicazione record Maschera e Sottomaschera

    Ciao! scusa mi è andato in dimenticatoio il post!

    Mi sono dedicato ad altri aspetti del gestionale, ma sono dovuto tornare comunque al linguaggio SQL ed alle query tramite VBA.

    Sto cercando di studiarmele adesso!

    I prossimi giorni torno sul discorso "duplicazione" e riprenderò in mano la faccenda.

    Per m'è c'è qualcosa che non va nella query! anzi..sicuramente.
    E la cosa che non và credo sia il fatto che io abbia fatto riferimento alle "maschere" mentre la query fa riferimento alle tabelle.
    Avevo applicato il codice senza cercare di capirlo.
    Adesso che ho approfondito un pochino proverò a sistemarlo!

    Appena fatto riporterò qui i miei errori, così magari chi capiterà nel 3d potrà trovarsi qualche dritta!
    Se non ce la faccio o se trovo altri inghippi lo scrivo così mi date una mano!

    Grazie mille!
  • Re: Duplicazione record Maschera e Sottomaschera

    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! ^^
  • Re: Duplicazione record Maschera e Sottomaschera

    Mi autorispondo!

    Ho risolto così:
    
    strSql = "INSERT INTO [Commessa] ( OrdineCliente, IDCommessa, Cantiere, AnnoCommessa, Cliente, LavorazioneCommessa, NumeroProgetto, QuantitàDaProdurre, Importo, ScontoCommessa, CertificatiRichiesti ) " & _
                    "SELECT '" & lngID & "' As OrdineCliente , Right(IdCommessa, 4), 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
                    
                    DoCmd.GoToRecord , , acLast
                    
                    CurrentDb.Execute "UPDATE Commessa SET Commessa.IdCommessa = [ordinecliente] & [idcommessa] WHERE (((Commessa.OrdineCliente)='" & Me.IdOC & "'));"
    Cioè ho ovviato con una seconda query che mi aggiorna il campo IDcommessa opportunamente modificato nella prima query (cioè mi sono tenuto solamente l'ultima parte: "-001","-002", ecc..).

    Fiuu che fatica! Però pian piano inizio a capire come funziona!
    Grazie!
Devi accedere o registrarti per scrivere nel forum
4 risposte