Query insert into

di il
15 risposte

Query insert into

Ciao a tutti, mi collego a questo link https://www.iprogrammatori.it/forum-programmazione/access/query-accodamento-t42678.html di un mio post di aprile

Ho una maschera "frmcomproprietari" che tramite un elenco a scelta multipla dovrebbe eseguire un query insert into

Premesso che la query funziona, ma non correttamente:

il codice del pulsante che dovrebbe eseguire la query è il seguente:
Private Sub Comando29_Click()
Dim strsql, a As String
Dim varItm As Variant

For Each varItm In Me.E_comproprietari.ItemsSelected
   If E_comproprietari.Selected(varItm) = True Then
     strsql = strsql & ", " & Me.E_comproprietari.ItemData(varItm)
   End If
Next varItm
  
strsql = Right(strsql, Len(strsql) - 2)

        a = "INSERT INTO tblComproprietari " _
        & "(IDDOCUMENTO, IDANAGRAFICA) " _
        & "SELECT '" & Forms!frminseriscidocumento!subfrmInserisciDocumento!IDDOCUMENTO & "' as IDDOCUMENTO, " _
        & Me.E_comproprietari.ItemData(varItm) & " AS IDANAGRAFICA " _
        & "FROM Q_comproprietari WHERE IDFA in (" & (strsql) & ")"
        Debug.Print a
        
        DoCmd.RunSQL a

Forms!frminseriscidocumento!subfrmInserisciDocumento.Form.subfrmComproprietari.Requery
End Sub
il debug mi riporta questo:
INSERT INTO tblComproprietari (IDDOCUMENTO, IDANAGRAFICA) SELECT '156' as IDDOCUMENTO, 909 AS IDANAGRAFICA FROM Q_comproprietari WHERE IDFA in (923, 529)
l'IDDOCUMENTO è corretto, ma l'idanagrafica no. Io vorrei che si creassero (in questo caso) due record nella tblComproprietari. Entrambi con lo stesso IDDOCUMENTO, ma con i rispettivi IDANAGRAFICA

Ho provato di tutto, ma non riesco a capire come posso risolvere la questione

15 Risposte

  • Re: Query insert into

    Marcdreamer ha scritto:


    Premesso che ... funziona, ma non correttamente:
    Non sei il primo che scrive in questo modo. Capirò anch'io, presto o tardi, come fa una cosa a funzionare ma non correttamente. Per me "funziona correttamente" è pleonastico. Se funziona è evidente che è corretta. "Funzionare ma non correttamente" è "funzionicchia". Battute a parte

    Marcdreamer ha scritto:


    INSERT INTO tblComproprietari (IDDOCUMENTO, IDANAGRAFICA) 
    SELECT ...
    Quella sintassi significa: accoda a tblComproprietari il risultato della SELECT
    Prova a fare la sola select e guarda cosa risulta. Se non ti dà il risultato che vuoi significa che c'è qualcosa che non va.
  • Re: Query insert into

    Philcattivocarattere ha scritto:


    Marcdreamer ha scritto:


    Premesso che ... funziona, ma non correttamente:
    Non sei il primo che scrive in questo modo. Capirò anch'io, presto o tardi, come fa una cosa a funzionare ma non correttamente. Per me "funziona correttamente" è pleonastico. Se funziona è evidente che è corretta. "Funzionare ma non correttamente" è "funzionicchia". Battute a parte

    Marcdreamer ha scritto:


    INSERT INTO tblComproprietari (IDDOCUMENTO, IDANAGRAFICA) 
    SELECT ...
    Quella sintassi significa: accoda a tblComproprietari il risultato della SELECT
    Prova a fare la sola select e guarda cosa risulta. Se non ti dà il risultato che vuoi significa che c'è qualcosa che non va.
    Ciao Phil

    scusa il ritardo nella risposta ... ho provato a fare la sola select ed effettivamente mi riporta solo un ID.

    In pratica mi riporta sempre il primo ID che trova nell'elenco.

    Ho confrontato questo codice con il codice del vecchio post (che funziona) e non mi pare di aver trovato differenze.

    Non so più dove sbattere la testa
  • Re: Query insert into

    Direi che sia più corretto in questo modo:
    Private Sub Comando29_Click()
    Dim strsql, a As String
    Dim varItm As Variant
    
       For Each varItm In Me.E_comproprietari.ItemsSelected
             strsql = "INSERT INTO tblComproprietari " _
             & "(IDDOCUMENTO, IDANAGRAFICA) " _
             & "VALUES (" & Forms!frminseriscidocumento!subfrmInserisciDocumento!IDDOCUMENTO & " as IDDOCUMENTO, " _
             & Me.E_comproprietari.ItemData(varItm) & " AS IDANAGRAFICA)"
           
             DoCmd.RunSQL a
       Next
    
       Forms!frminseriscidocumento!subfrmInserisciDocumento.Form.subfrmComproprietari.Requery
    End Sub
  • Re: Query insert into

    Stifone ha scritto:


    Direi che sia più corretto in questo modo:
    Private Sub Comando29_Click()
    Dim strsql, a As String
    Dim varItm As Variant
    
       For Each varItm In Me.E_comproprietari.ItemsSelected
             strsql = "INSERT INTO tblComproprietari " _
             & "(IDDOCUMENTO, IDANAGRAFICA) " _
             & "VALUES (" & Forms!frminseriscidocumento!subfrmInserisciDocumento!IDDOCUMENTO & " as IDDOCUMENTO, " _
             & Me.E_comproprietari.ItemData(varItm) & " AS IDANAGRAFICA)"
           
             DoCmd.RunSQL a
       Next
    
       Forms!frminseriscidocumento!subfrmInserisciDocumento.Form.subfrmComproprietari.Requery
    End Sub
    Ciao Stifone

    anzitutto grazie

    Ho provato il codice come scritto da te, ma mi da sempre errore.

    Non riesco a capire perché utilizzando la stessa sintassi del codice qui sotto:
    Private Sub AggSel_Click()
    Dim strSQL As String
    Dim a As String
    Dim varItm  As Variant
    
    If Me.E_acc.ItemsSelected.Count < 2 Then
        MsgBox "Selezionare almeno due aziende da aggiornare", vbCritical
        Exit Sub
    End If
    
    
         For Each varItm In E_acc.ItemsSelected
                strSQL = strSQL & "," & E_acc.ItemData(varItm)
                Next varItm
                
                strSQL = Right(strSQL, Len(strSQL) - 1)
                Testo7 = strSQL
            a = "INSERT into tblAssGasolio " _
            & "(ID_FASCICOLO_AZIENDALE, CAMPAGNA, OPERATORE, ID_DOMANDA, CUAA) " _
            & "SELECT " & E_acc.ItemData(varItm) & " AS ID_FASCICOLO_AZIENDALE, '" _
            & CVDate(Date) & "' AS CAMPAGNA, '" & Forms("frmSchedaAziendale")!utente & "' as OPERATORE, (" & 2 & ")" _
            & " AS ID_DOMANDA, CUAA " & "FROM Q_Saldidafare WHERE ID in (" & (strSQL) & ")"
            
    con seguente debug.print
    INSERT into tblAssGasolio (ID_FASCICOLO_AZIENDALE, CAMPAGNA, OPERATORE, ID_DOMANDA, CUAA) 
    SELECT [b]IDFA [/b]AS ID_FASCICOLO_AZIENDALE, '10/09/2020' AS CAMPAGNA, 'CREMASCHINI MARCO' as OPERATORE, (2) AS ID_DOMANDA, CUAA 
    FROM Q_Saldidafare 
    WHERE ID in (769,771)
    

    mi riporta un debug.print diverso (al posto di IDFA viene riportato direttamente il primo ID dell'elenco e non quelli che seleziono)

  • Re: Query insert into

    Forse se alleghi un file di esempio potrebbe essere più semplice darti una mano, in quanto il codice allegato precedentemente teoricamente dovrebbe funzionare.
  • Re: Query insert into

    2 considerazioni:
    1) Hai scelto di usare CVDate(Date)...? Date è già una Data e non serve la conversione, oltretutto se hai scelto CVDate al posto di CDate sappi che non verrà generato errore in caso di NULL ma la query non funzionerà...
    2) Hai fatto un DEBUG di cosa contiene [varItm] e di cosa restituisce [acc.ItemData(varItm)]...? prima di fare la query...?
  • Re: Query insert into

    @Alex ha scritto:


    2 considerazioni:
    1) Hai scelto di usare CVDate(Date)...? Date è già una Data e non serve la conversione, oltretutto se hai scelto CVDate al posto di CDate sappi che non verrà generato errore in caso di NULL ma la query non funzionerà...
    2) Hai fatto un DEBUG di cosa contiene [varItm] e di cosa restituisce [acc.ItemData(varItm)]...? prima di fare la query...?
    Ciao Alex ... il secondo codice che ho postato riguardava un vecchio codice funzionante.

    Per il nuovo codice, ho fatto il debug.print e itemdata(varitm) mi riporta sempre il primo ID presente nell'elenco (anche quando non è selezionato) e il varitm risulta nullo

    Appena riesco, metto in condivisione il file
  • Re: Query insert into

    Ciao

    questo è il link https://drive.google.com/file/d/1ixQn1p8e0BVkA_TnnecgtdIXTK0_xIf7/view?usp=sharing

    Si apre direttamente nella maschera "frminseriscidocumento" --> tramite il pulsante "seleziona comproprietari" si apre una seconda maschera in popup --> si selezionano i nominativi e si preme il pulsante "associa"

    Grazie in anticipo
  • Re: Query insert into

    Il codice corretto è il seguente:
    
    Private Sub Comando29_Click()
    Dim strsql, a As String
    Dim varItm As Variant
    
       For Each varItm In Me.E_comproprietari.ItemsSelected
             strsql = "INSERT INTO tblComproprietari " _
             & "(IDDOCUMENTO, IDANAGRAFICA) " _
             & "VALUES (" & Forms!frminseriscidocumento!subfrmInserisciDocumento!IDDOCUMENTO & ", " _
             & Me.E_comproprietari.ItemData(varItm) & ")"
           
             DoCmd.RunSQL strsql
       Next
    
       Forms!frminseriscidocumento!subfrmInserisciDocumento.Form.subfrmComproprietari.Requery
    End Sub
    
    Spero che questo sia un file di esempio creato al volo altrimenti dovresti rivedere un bel pò di cose a partire da:
    • struttura tabelle, ovvero assegnazione corretta dei valori delle proprietà (eventuale Dimensione, Richiesto, Consenti lunghezza zero, Indicizzato)
    • minima normalizzazione dati
    • gestione delle maschere
    • ecc...
  • Re: Query insert into

    Stifone ha scritto:


    Il codice corretto è il seguente:
    
    Private Sub Comando29_Click()
    Dim strsql, a As String
    Dim varItm As Variant
    
       For Each varItm In Me.E_comproprietari.ItemsSelected
             strsql = "INSERT INTO tblComproprietari " _
             & "(IDDOCUMENTO, IDANAGRAFICA) " _
             & "VALUES (" & Forms!frminseriscidocumento!subfrmInserisciDocumento!IDDOCUMENTO & ", " _
             & Me.E_comproprietari.ItemData(varItm) & ")"
           
             DoCmd.RunSQL strsql
       Next
    
       Forms!frminseriscidocumento!subfrmInserisciDocumento.Form.subfrmComproprietari.Requery
    End Sub
    
    Spero che questo sia un file di esempio creato al volo altrimenti dovresti rivedere un bel pò di cose a partire da:
    • struttura tabelle, ovvero assegnazione corretta dei valori delle proprietà (eventuale Dimensione, Richiesto, Consenti lunghezza zero, Indicizzato)
    • minima normalizzazione dati
    • gestione delle maschere
    • ecc...
    Ciao Stifone

    il codice scritto così funziona perfettamente (non pensavo di dover mettere gli apici anche alla virgola ... era per questo che non funzionava prima)

    Comunque sì, è un file di esempio creato ad hoc. Il db è correttamente normalizzato, ma ha tante maschere ed ho pensato che sarebbe stato inutile linkarlo.

    Grazie mille
  • Re: Query insert into

    Non esce un avviso per ogni volta che fai l'insert...?
  • Re: Query insert into

    No ... dovrebbe?
  • Re: Query insert into

    Marcdreamer ha scritto:


    No ... dovrebbe?
    Si il metodo RunSQL di solito non si usa, a vantaggio di Execute membro dell'oggetto Database, proprio perchè altrimenti richiede l'impostazione dei Warnings False/True prima e dopo.

    Credo che se non ti esce un Warning ad ogni iterazione, tu abbia disabilitato questa opzione a livello di Database e di solito non si fa.
  • Re: Query insert into

    @Alex ha scritto:


    Marcdreamer ha scritto:


    No ... dovrebbe?
    Si il metodo RunSQL di solito non si usa, a vantaggio di Execute membro dell'oggetto Database, proprio perchè altrimenti richiede l'impostazione dei Warnings False/True prima e dopo.

    Credo che se non ti esce un Warning ad ogni iterazione, tu abbia disabilitato questa opzione a livello di Database e di solito non si fa.
    ho controllato ed effettivamente avevo disabilitato i messaggi delle query di comando, perché preferivo (e preferisco) che vengano fuori dei MsgBox da me impostati.
Devi accedere o registrarti per scrivere nel forum
15 risposte