Esportazione dei dati di una Query parametrizzata in un File csv.

di il
9 risposte

Esportazione dei dati di una Query parametrizzata in un File csv.

Buonasera a tutti e scusate il disturbo.

Vi chiedo un aiuto per un problema di sintassi di un codice vba.

Ho una maschera (Maschera_Quietanze_da_filtrare_csv) dove ho inserito tre box di ricerca nominati  " InizioPeriodo " , " FinePeriodo "  e " SceltaCollaboratore ".

La maschera ha origine dati da una query (QueryAvvisiScadenzeRCAnonIncassate) dove ho inserito sul campo " ScadenzaRataQuietanza " il criterio di filtro:

>=[Maschere]![MASCHERA_QUIETANZE_DA_FILTRARE_CSV]![InizioPeriodo] And <=[Maschere]![MASCHERA_QUIETANZE_DA_FILTRARE_CSV]![FinePeriodo]

e sul campo " NominativoCollaboratore "
il criterio di filtro:

[Forms]![MASCHERA_QUIETANZE_DA_FILTRARE_CSV]![SceltaCollaboratore]

Su un pulsante nella maschera (Maschera_Quietanze_da_filtrare_csv) ho inserito il codice:

Private Sub StampaDettagliata_Click()
If IsNull([InizioPeriodo]) Or IsNull([FinePeriodo]) Then
MsgBox "Data di Inizio Ricerca o Data di Fine Ricerca Mancanti."
DoCmd.GoToControl "InizioPeriodo"
Else
If ([InizioPeriodo]) > ([FinePeriodo]) Then
MsgBox "La Data di Fine Ricerca deve essere successiva alla Data di Inizio Ricerca."
DoCmd.GoToControl "InizioPeriodo"
End If

Dim dbs As DAO.Database
Dim rsQuery As DAO.Recordset
Dim Percorso, NomeFile, Sep As String
Dim strSql As String
Dim prova As String

Set dbs = CurrentDb

Percorso = "C:\Users\Saverio\Desktop\"
NomeFile = "Scadenze Quietanze.csv"
Sep = ";"
                
Set rsQuery = dbs.OpenRecordset("QueryAvvisiScadenzeRCAnonIncassate", dbOpenDynaset)

Open Percorso & NomeFile For Output As #1
          
rsQuery.MoveFirst

Do While Not rsQuery.EOF
     riga = rsQuery.Fields("PrefissoCellulare") & Sep & rsQuery.Fields("CellulareCliente") & Sep & rsQuery.Fields("ScadenzaRataQuietanza") & Sep &         
   rsQuery.Fields("MarcaeTipoAutomezzoPolizza") & Sep & rsQuery.Fields("TargaAutomezzoPolizza")
   
   Print #1, riga
   rsQuery.MoveNext
Loop

rsQuery.Close
Set rs1 = Nothing

Close #1

MsgBox "Esportazione completata del File - Scadenze Quietanze.csv -  in DeskTop"

End If

End Sub

Ora se esegno il codice  mi dice: "Errore di Run-Time "3061". Parametri insufficienti. Previsto 3."

Praticamente non riesco a dichiarare i 3 campi di ricerca nel codice sopra.

Qualcuno potrebbe aiutarmi.

Grazie

9 Risposte

  • Re: Esportazione dei dati di una Query parametrizzata in un File csv.

    Di solito quel tipo di errore e' legato ai parametri della query mancanti o formattati male. Dovresti provare a testare la tua query passando un parametro alla volta e vedere quando si blocca. Prova a testarla passando solo l'inizio periodo e vedi se filtra, poi aggiungi il fine periodo, ecc.

  • Re: Esportazione dei dati di una Query parametrizzata in un File csv.

    Buongiorno.

    la ringrzio della risposta.

    Il problema è proprio questo, solo che non riesco a scrivere nel codice il parametro per far riconoscere il filtro.

    Set rsQuery = dbs.OpenRecordset("QueryAvvisiScadenzeRCAnonIncassate", dbOpenDynaset)

    Praticamente non riesco a scrivere la sintassi del comando.

    Grazie

  • Re: Esportazione dei dati di una Query parametrizzata in un File csv.

    15/09/2025 - Saverio Ricca ha scritto:

    If IsNull([InizioPeriodo]) Or IsNull([FinePeriodo]) Then

    15/09/2025 - Saverio Ricca ha scritto:

    If ([InizioPeriodo]) > ([FinePeriodo]) Then

    Direi di dichiarare meglio i campi in Me![InizioPeriodo], Me![FinePeriodo]

    15/09/2025 - Saverio Ricca ha scritto:

    Dim Percorso, NomeFile, Sep As String

    Se vuoi che tutte queste tre variabili siano di tipo String, devi scrivere

    Dim Percorso As String, NomeFile As String, Sep As String

    15/09/2025 - Saverio Ricca ha scritto:

    Ora se eseguo il codice  mi dice: "Errore di Run-Time "3061". Parametri insufficienti. Previsto 3."

    Non sono sicuro della mia risposta. Prova a dichiarare nella query i PARAMETERS esplicitamente. Poi considera questa sequenza di istruzioni

    Aprire un recordset di query parametrica

    
    Dim NomeDatabase As DAO.Database
    Dim qdf As DAO.QueryDef
    Dim rs As DAO.Recordset
    Set NomeDatabase = CurrentDb
    Set qdf = NomeDatabase.QueryDefs("NomeQuery")
    qdf.Parameters("NomeParametro") = <valore>
    Set rs = qdf.OpenRecordset


    <valore> può essere sostituito tranquillamente dal valore corrente visualizzato in un campo di maschera aperta, quindi Forms!NomeMaschera!NomeCampo

  • Re: Esportazione dei dati di una Query parametrizzata in un File csv.

    Ok grazie mille  Osvaldo.

    a buon rendere

    Ciao

  • Re: Esportazione dei dati di una Query parametrizzata in un File csv.

    Faccio un appunto sulla modalità di apertura del Recordset DAO:

    Set rsQuery = dbs.OpenRecordset("QueryAvvisiScadenzeRCAnonIncassate", dbOpenDynaset)

    Quando si apre un RS non destinato ad Edit, si apre in readonly ed in snapshot

    expression.OpenRecordset (Name, Type, Options, LockEdit)

    Type=dbOpenSnapshot
    Options= dbReadOnly

    Detto questo, non ho capito perchè usi quel codice che è lento, hai provato ad usare questo:

    expression.TransferText (TransferType, SpecificationName, TableName, FileName, HasFieldNames, HTMLTableName, CodePage)

    Dove puoi crearti un File SPEC, nel quale definisci il Separatore, se serve, in quanto di DEFAULT dovrebbe essere ";" che usi tu...

    Se devi restringere i campi ti basta creare una Query TEMP che seleziona i campi.

    Esempio se la Query Originale fosse questa e tu volessi esportare solo 2 campi...:

    SELECT f1,f2,f3,f4 FROM T1 WHERE f1=xxx

    basterebbe creare una Query così:

    SELECT f1,f4 FROM QueryAvvisiScadenzeRCAnonIncassate

    Quindi una QueryTMP:

    Set qdfTemp = CurrentDb.CreateQueryDef("zzzTemp")
    Set qdfTemp.SQL = "SELECT f1,f4 FROM QueryAvvisiScadenzeRCAnonIncassate"
    DoCmd.TransferText acExportDelim, SeServeNomeFileSPEC , "zzzTemp", OutputPlace, True
    DoCmd.DeleteObject acQuery, "zzzTemp"
  • Re: Esportazione dei dati di una Query parametrizzata in un File csv.

    Buongiorno a tutti. Grazie della delucidazione Alex.

    Ho provato ad adattare il codice suggerito da Osvaldo ma mi da errore,  praticamente  non trova il valore nella maschera:

    Dim dbs As DAO.Database
    Dim qdf As DAO.QueryDef
    Dim rs As DAO.Recordset
    Dim Percorso As String, NomeFile As String, Sep As String
        
    Set dbs = CurrentDb
    Percorso = "C:\Users\Saverio\Desktop\"
    NomeFile = "Scadenze Quietanze.csv"
    Sep = ";"
    
    Set qdf = dbs.QueryDefs("QueryAvvisiScadenzeRCAnonIncassate")
    qdf.Parameters("DataInizio") = Forms!MASCHERA_QUIETANZE_DA_FILTRARE_CVS!DataInizio
    
    Set rs = qdf.OpenRecordset
        'Set parametro_query = dbs.QueryDefs("QueryAvvisiScadenzeRCAnonIncassate")
        'For Each parametro In parametro_query
        'parametro = Eval("[Forms]![maschera_quietanze_da_filtrare_cvs]![DataInizio]")
        ' Next parametro
        'rsQuery = parametri_della_query
        '[Forms]![maschera_quietanze_da_filtrare_cvs]![SOTTOMASCHERA_QUIETANZE_DA_FILTRARE_CVS].Requery
        'Set rsQuery = dbs.OpenRecordset("QueryAvvisiScadenzeRCAnonIncassate", dbOpenDynaset)
         
    Open Percorso & NomeFile For Output As #1
         'riga = "PrefissoCellulare" & Sep & "CellulareCliente" & Sep & "ScadenzaRataQuietanza" & Sep & "MarcaeTipoAutomezzoPolizza" & Sep &          "TargaAutomezzoPolizza" 'Abilitare per scrittura riga intestazione
         'Print #1, riga 'Abilitare per intestazione prima riga
    rs.MoveFirst
    Do While Not rs.EOF
       riga = rs.Fields("Prefissocellulare") & Sep & rs.Fields("CellulareCliente") & Sep & rs.Fields("ScadenzaRataQuietanza") & Sep & rs.Fields("MarcaeTipoAutomezzoPolizza") & Sep & rs.Fields("TargaAutomezzoPolizza")
       Print #1, riga
       rs.MoveNext
    Loop
    rs.Close
    Set rs1 = Nothing
    Close #1
    
    MsgBox "Esportazione completata del File - Scadenze Quietanze.csv -  in DeskTop"
    [Forms]![MASCHERA_QUIETANZE_DA_FILTRARE_CVS]![SOTTOMASCHERA_QUIETANZE_DA_FILTRARE_CVS].Requery

    Potete risolverlo. grazie

  • Re: Esportazione dei dati di una Query parametrizzata in un File csv.

    Semplicemente quello che ti ha detto Osvaldo è sbagliato, o meglio il suggerimento in se sarebbe relativamente corretto, ma la tua query NON E' PARAMETRICA, quindi non supporta i parametri che nel tuo caso sono fissi.

    Il tuo codice con il ciclo di iterazione sulla collection è veramente inutile oltre che completamente errato..!!!

    For Each parametro In parametro_query
    	parametro = Eval("[Forms]![maschera_quietanze_da_filtrare_cvs]![DataInizio]")
    Next parametro

    Il For...Each cicla, o dovrebbe ciclare, una Collection e [parametro_query] è un'oggetto QueryDef se non accedi alla collection Parameters secondo te cosa dovrebbe fare Access oltre che arrabbiarsi...?

    Oltretutto la tua query per funzionare richiede che la maschera da cui recuperare i valori sia aperta, e sono metodi che non vanno bene.

    Ho detto sopra "relativamente", perchè per gestire bene queste cose serve una visione più completa, se usi una Query Parametrica, non è per associarla ad una maschera, ma per gestirla da codice.

    Se la vuoi usare per associarla ad una maschera, cosa fattibile, ci si muove diversamente si deve aprire la Query da codice valorizzare i PARAMETERS ed estrarre il RS ed assegnarlo alla maschera... questa cosa penso non la faccia nessuno.

    La cosa migliore per sfruttare Access e le Maschere invece è usare una Query standard ed interagire con la proprietà FILTER che rappresenta la WHERECOND, poi se devi esportare i dati in CSV crei una Query TEMP concatenando la WHERECOND ed usi il metodo che ti ho suggerito.

  • Re: Esportazione dei dati di una Query parametrizzata in un File csv.

    Buonasera

    Ok Alex mi dedico al  tuo suggerimento e poi ti faccio saper.

    Grazie

  • Re: Esportazione dei dati di una Query parametrizzata in un File csv.

    Buonsasera a tutti.

    Grazie dello spunto Alex.

    Ho risolto creando una query di creazione tabella e ho applicato il codice per la creazione del file cvs avendo come origine dati la tabella temporanea creata dalla query di creazione tabella.

    Funziona alla perfezione.

    Grazie

Devi accedere o registrarti per scrivere nel forum
9 risposte