Costruire una stringa SQL poi esportare su TXT

di il
14 risposte

Costruire una stringa SQL poi esportare su TXT

Non riesco a salvare su file TXT la query
mySQL2 = "SELECT "
mySQL2 = mySQL2 & "Anagrafe.NOME, Anagrafe.CORSO, Anagrafe.SEX, Anagrafe.ESTENSIONE, Anagrafe.DATA_ISCRIZIONE, Anagrafe.DATA_USCITA, Anagrafe.F_ROSA_START, Anagrafe.F_ROSA_END "
mySQL2 = mySQL2 & "FROM Anagrafe "
mySQL2 = mySQL2 & "WHERE ("
mySQL2 = mySQL2 & "(Anagrafe.DATA_ISCRIZIONE <= " & myData & ")"
mySQL2 = mySQL2 & " And (Anagrafe.DATA_USCITA > " & myData & " OR IsNull(Anagrafe.DATA_USCITA))"
mySQL2 = mySQL2 & " And (not IsNull(Anagrafe.F_ROSA_START) And not IsNull(Anagrafe.F_ROSA_END))"
mySQL2 = mySQL2 & " And (Anagrafe.F_ROSA_START <= " & myData & " And Anagrafe.F_ROSA_END > " & myData & ")"
mySQL2 = mySQL2 & ")"
mySQL2 = mySQL2 & " ORDER BY Anagrafe.CORSO, Anagrafe.NOME; "
Open "C:\TEMP3\guidaincorsoSQL2.txt" For Output As #1
Print #1, mySQL2
Close #1
DoCmd.OutputTo acOutputTable, mySQL2, acFormatTXT, "C:\TEMP3\guidaincorsolista.txt"
salvo su testo la stringa mySQL2 per verificarla e applicarla
SELECT Anagrafe.NOME, Anagrafe.CORSO, Anagrafe.SEX, Anagrafe.ESTENSIONE, Anagrafe.DATA_ISCRIZIONE, Anagrafe.DATA_USCITA, Anagrafe.F_ROSA_START, Anagrafe.F_ROSA_END FROM Anagrafe WHERE ((Anagrafe.DATA_ISCRIZIONE <= #07/16/2022#) And (Anagrafe.DATA_USCITA > #07/16/2022# OR IsNull(Anagrafe.DATA_USCITA)) And (not IsNull(Anagrafe.F_ROSA_START) And not IsNull(Anagrafe.F_ROSA_END)) And (Anagrafe.F_ROSA_START <= #07/16/2022# And Anagrafe.F_ROSA_END > #07/16/2022#)) ORDER BY Anagrafe.CORSO, Anagrafe.NOME; 
ma da crea struttura query visualizzazione SQL tutto e' ok
ma da codice mi esce in errore 3125 (verificare che non includa caratteri o punteggiatura non validi e che non sia troppo lungo)
Dove sto sbagliando?

14 Risposte

  • Re: Costruire una stringa SQL poi esportare su TXT

    Ciao.
    Fammi capire.

    Se usi la query nel compositore automatico funziona?

    L'errore da VBA lo ricevi nel momento che elabora la query, oppure nel momento del salvataggio in file testo ?

    Ad occhio, mi sembra molto lunga. Effettivamente potresti superare il limite di caratteri consentito in una stringa VBA.

    Poi ad occhio tutte quelle parentesi chiuse in modo tardivo, potrebbero crearti problemi e sopratutto mi sembra di aver letto 7 parentesi aperte ed 8 parentesi chiuse.

    il compositore automatico a volte ha il brutto vizio di correggere alcuni errori di digitazione, soprattutto quelli inerenti alla notazione dei campi da richiamare. Cosa che non fa invece il VBA
  • Re: Costruire una stringa SQL poi esportare su TXT

    Faccio copia incolla della stringa e da interfaccia access lavora correttamente ed escono i risultati voluti
    mentre da DoCmd per mandare in uscita a un file TXT esce in errore
  • Re: Costruire una stringa SQL poi esportare su TXT

    Io vedo che la tua query nella WHERE utilizza la variabile myData. Sei certo che sia valorizzata correttamente quando scrivi la query sul file?
  • Re: Costruire una stringa SQL poi esportare su TXT

    Mi arrovello ma non trovo soluzioni
    Forse il problema e' proprio la lunghezza della stringa
    O forse DoCmd non lavora i predicati... boh
  • Re: Costruire una stringa SQL poi esportare su TXT

    Walter61 ha scritto:


    Mi arrovello ma non trovo soluzioni
    Forse il problema e' proprio la lunghezza della stringa
    O forse DoCmd non lavora i predicati... boh
    Se pensi che dipenda dalla lunghezza della query, prova a scriverne una di test più corta per vedere cosa succede.
  • Re: Costruire una stringa SQL poi esportare su TXT

    Il VBA di acxess espone membri definiti NASCOSTI.

    Tra questi c'è ul metodo SaveAsText che trovi nella guida una volta abilitata la visualizzazione dei membri nascosti da VBEDITOR.
    
    Application.SaveAsText acQuery, QueryName, "C:\\" & QueeyName & ".txt"
    
  • Re: Costruire una stringa SQL poi esportare su TXT

    Tra questi c'è ul metodo SaveAsText
    Non ho capito Alex

    Ho bisogno di costruire un predicato SQL
    e ottenere un output su file di testo
    l'unica variabile e' la data
    il predicato e' questo (variera' la data di volta in volta)
    SELECT Anagrafe.NOME, Anagrafe.CORSO, Anagrafe.SEX, Anagrafe.ESTENSIONE, Anagrafe.DATA_ISCRIZIONE, Anagrafe.DATA_USCITA, Anagrafe.F_ROSA_START, Anagrafe.F_ROSA_END FROM Anagrafe WHERE ((Anagrafe.DATA_ISCRIZIONE <= #07/16/2022#) And (Anagrafe.DATA_USCITA > #07/16/2022# OR IsNull(Anagrafe.DATA_USCITA)) And (not IsNull(Anagrafe.F_ROSA_START) And not IsNull(Anagrafe.F_ROSA_END)) And (Anagrafe.F_ROSA_START <= #07/16/2022# And Anagrafe.F_ROSA_END > #07/16/2022#)) ORDER BY Anagrafe.CORSO, Anagrafe.NOME;
    mi sto continuando ad arrovellare senza partorire nuove soluzioni
  • Re: Costruire una stringa SQL poi esportare su TXT

    Walter61 ha scritto:


    Tra questi c'è ul metodo SaveAsText

    mi sto continuando ad arrovellare senza partorire nuove soluzioni
    Una curiosità, ma in fase di debug, la stringa della query che cosa riporta?
    Oppure semplicemente, visualizzandola in una banale finestra di messaggio prima che avvenga l'errore, ci sono tutti i dati, oppure magari rimangono i nomi dei campi o simboli strani?
  • Re: Costruire una stringa SQL poi esportare su TXT

    Walter61 ha scritto:


    DoCmd.OutputTo acOutputTable, mySQL2, acFormatTXT, "C:\TEMP3\guidaincorsolista.txt"
    ...ma da codice mi esce in errore 3125 (verificare che non includa caratteri o punteggiatura non validi e che non sia troppo lungo)
    Nello sviluppo del thread poi la cosa è comparsa ma sono l'unico a cui sono sorti due dubbi?
    1) si vuole esportare una query (con beneficio del dubbio, punto 2) e si usa acOutputTable
    2) anche con l'uso di acOutputQuery la guida non fa mai riferimento ad un predicato SQL ma sempre al nome di un oggetto query.
  • Re: Costruire una stringa SQL poi esportare su TXT

    la guida non fa mai riferimento ad un predicato SQL ma sempre al nome di un oggetto query.
    Quando costruisco una stringa predicato SQL e qualcosa non funziona a dovere solitamente salvo la stringa in un file di testo per scovare l'errore. In questo caso la stringa salvata e data in pasto all'interprete funziona correttamente
    ma se voglio lavorarla in vba non riseco a ottenerne un output su file txt
  • Re: Costruire una stringa SQL poi esportare su TXT

    Walter61 ha scritto:


    ...
    ma se voglio lavorarla in vba non riseco a ottenerne un output su file txt
    Che vuol dire questo?
    Se vuoi la stringa/predicato SQL in un file di testo stai già facendo la cosa giusta, con l'Open e Print.
    Docmd.OutputTo tratta gli oggetti del programma: tabelle, query, report, maschere ecc (guardare la guida, non li so a memoria), non il "materiale vba". Ho capito giusto?
  • Re: Costruire una stringa SQL poi esportare su TXT

    Premesso che non vedo cosa contiene [myData] e questo potrebbe essere il problema, perchè le date spesso hanno dei problemi con la formattazione.

    Le query si costruiscono accedendo alla proprietà SQL del'oggetto QueryDefs(NomeQuery).
    
    Dim strSQL As String
    strSQL="SELECT * FROM T1 WHERE Id=2"
    DbEngine(0)(0).QueryDefs("nometuaQuery").SQL=strSQL
    Application.SaveAsText acQuery, nometuaQuery, "C:\\" & nometuaQuery& ".txt"
  • Re: Costruire una stringa SQL poi esportare su TXT

    Non ho trovato altro modo che fare una sub per elaborare il predicato e mandare in output su file di testo
    ho risolto cosi':
    Call EsportaAttiviEXP(mySQL2, "C:\TEMP\guidaincorsolista.txt", "GUIDA IN CORSO AL " & Me.txtAllaData, "NOME                 PAT S E ISCRIZIONE F.ROSA                EXIT")
    
    Private Sub EsportaAttiviEXP(mySQL, myNomeFile, myFase, myTitolo)
    
    Dim rs As DAO.Recordset
    Dim fld As DAO.Field
    Dim myCount, myRecTot
    Dim myRecord() As Variant
    Dim myCampo, myValore
    Dim myStringa
    
    Open myNomeFile For Output As #1
    Print #1, myFase
    Print #1, myTitolo
    
    Set rs = DBEngine(0)(0).OpenRecordset(mySQL)
    myCount = rs.Fields.Count
    ReDim myRecord(myCount, 2)
    myRecTot = 0
    Do While Not rs.EOF
        myRecTot = myRecTot + 1
        myStringa = ""
        For Each fld In rs.Fields
            myCampo = fld.Name 'Campo
            myValore = fld.Value 'Valore
            If myCampo = "NOME" Then
                If Len(myValore) > 20 Then
                    myValore = Left(myValore, 20)
                Else
                    myValore = myValore & Space(20 - Len(myValore))
                End If
            ElseIf myCampo = "CORSO" Then
                If Len(myValore) > 3 Then
                    myValore = Left(myValore, 3)
                Else
                    myValore = myValore & Space(3 - Len(myValore))
                End If
            ElseIf myCampo = "ESTENSIONE" Then
                If myValore = "Vero" Then
                    myValore = "E"
                Else
                    myValore = Space(1)
                End If
            End If
            myValore = myValore & Space(1)
            myStringa = myStringa & myValore
        Next
        Print #1, myStringa
        rs.MoveNext
    Loop
    Print #1, "Totali " & myRecTot
    Close #1
    rs.Close
    Set rs = Nothing
    End Sub
  • Re: Costruire una stringa SQL poi esportare su TXT

    Walter61 ha scritto:


    ...
    Private Sub EsportaAttiviEXP(mySQL, myNomeFile, myFase, myTitolo)
    ..
    Dim myCount, myRecTot
    Dim myRecord() As Variant
    Dim myCampo, myValore
    Dim myStringa
    ...
    
    Mancano tutti i tipi di dato e di conseguenza tutti Variant, anche nei parametri passati alla sub. Scelta intenzionale? Meglio esplicitarlo comunque. Se invece il tipo deve essere più specifico, come myStringa che mi aspetto essere appunto String, dichiarare anche il tipo delle variabili.
    Anche i parametri della sub è bene indicare se sono ByRef o ByVal, anche se di suo vba sa già come fare. Esplicitare non fa male.
    A cosa servono myCount e myRecord?
    Comunque sì, se non ti appoggi ad una query salvata come tale in Access, non c'era altro modo per fare un'esportazione se non passare campo per campo, record per record, con le regole che fanno al caso tuo.
Devi accedere o registrarti per scrivere nel forum
14 risposte