Creare Specifico txt

di il
17 risposte

Creare Specifico txt

Buongiorno e anticipatamente ringrazio

Problema: dovrei creare uno specifico file con estensione txt purtoppo il formato di uscita predefinito di access non va bene.

Tenendo conto che i record presenti possono essere molti dovrei far si di creare uno o più file txt che contengano solamente 101 righe. Pertanto dal 101, così via dicendo per le successive centinaia (201... 301... etc) ne dovrei creare uno o più successivo che abbia lo stesso formato ma con un numero progressivo incrementale.
faccio un esempio (forse riesco a spigarmi meglio... forse però... ):

record da 1 a 100 nomefile: tbl1_20220223_01.txt
record da 101 a 200 nomefile: tbl1_20220223_02.txt
record da 201 a 300 nomefile: tbl1_20220223_03.txt
cosi via dicendo.
Dove il nome del file deve essere composto:
dal nome della tabella di origine;
data con formato AAAAMMDD;
il numero finale rappresenta l'incremento del file.

la struttura interna del file deve essere così:

'tbl1' ---> nome tabella origine
'pippo' ---> record 1
'pluto'---> record 2
'paperino'---> record 3
etc
senza interruzioni o salti di riga come invece esporta access.

scusate se non sono stato chiaro...
potete indicarmi la strada da seguire per arrivare alla soluzione?

thanks 1000 sempre

17 Risposte

  • Re: Creare Specifico txt

    Per la struttura sono riuscito...
    devo capire come dividere ogni 100 record ed il nome del file
  • Re: Creare Specifico txt

    Falco6911 ha scritto:


    ...devo capire come dividere ogni 100 record ed il nome del file
    Puoi usare un ciclo sui record e le funzioni di scrittura su file native VBA Open, Print, Close.
  • Re: Creare Specifico txt

    Devi generare quella che si chiama Paginazione.
    La si può realizzare in diversi modi, il meno efficiente è quello di ciclare i records...
    Se lo trovo avevo creato un demo... in SQL per definire il range di paginazione dei dati.
    A quel punto basta creare la query SQL ed isare trasferttext per generare il file.

    Trovato questo mio vecchio intervento.
    Esempio di paginazione dei records:
    
    SELECT TOP 10 *
    FROM Tabella
    WHERE campochiave
    NOT IN (SELECT TOP 10 campochiave
    FROM Tabella
    ORDER BY Campordinamento)
    ORDER BY Campordinamento
    -----------------
    
    in questo modo selezioni le righe da 11 a 20, campo chiave deve essere
    univoco e può essere ad esempio un contatore.
    Per selezionare dalla riga 21 alla 30 metterai nella
    NOT IN (SELECT TOP 20 ecc. ecc

    Nel tuo caso userai lo step che ti serve di 100 in 100...

    Puoi approfondire questo link che chiarisce meglio il concetto:
    https://stackoverflow.com/questions/1900635/how-do-i-implement-pagination-in-sql-for-ms-access
  • Re: Creare Specifico txt

    Philcattivocarattere ha scritto:


    Falco6911 ha scritto:


    ...devo capire come dividere ogni 100 record ed il nome del file
    Puoi usare un ciclo sui record e le funzioni di scrittura su file native VBA Open, Print, Close.
    Grazie mille sempre
    Domani faccio delle prove e ti faccio sapere.
  • Re: Creare Specifico txt

    @Alex ha scritto:


    Devi generare quella che si chiama Paginazione.
    La si può realizzare in diversi modi, il meno efficiente è quello di ciclare i records...
    Se lo trovo avevo creato un demo... in SQL per definire il range di paginazione dei dati.
    A quel punto basta creare la query SQL ed isare trasferttext per generare il file.

    Trovato questo mio vecchio intervento.
    Esempio di paginazione dei records:
    
    SELECT TOP 10 *
    FROM Tabella
    WHERE campochiave
    NOT IN (SELECT TOP 10 campochiave
    FROM Tabella
    ORDER BY Campordinamento)
    ORDER BY Campordinamento
    -----------------
    
    in questo modo selezioni le righe da 11 a 20, campo chiave deve essere
    univoco e può essere ad esempio un contatore.
    Per selezionare dalla riga 21 alla 30 metterai nella
    NOT IN (SELECT TOP 20 ecc. ecc

    Nel tuo caso userai lo step che ti serve di 100 in 100...

    Puoi approfondire questo link che chiarisce meglio il concetto:
    https://stackoverflow.com/questions/1900635/how-do-i-implement-pagination-in-sql-for-ms-access
    Grazie mille sempre @alex
    Non usavo un ID univoco in quanto i record non possono essere duplicati già di suo. Ma poco ci vuole per inserire un ID

    Un numeratore progressivo generato da qry può avere lo stesso effetto.? Credo di sì se ho capito il suggerimento.

    Lo chiedo perché i dati che carico nella tbl poi li cancello e li ricarico da altri file... Non mi servono più una volta utilizzati... Però domani provo con l'indicazione data... Mi studio anche il link dato...
    Grazie sempre per la disponibilità.. Ti faccio sapere.
  • Re: Creare Specifico txt

    @Alex ha scritto:


    Scusa se non ho più scritto.
    Ho risolto una parte...
    
    Private Sub Comando139_Click()
    Dim strSQL As String
    Dim rst As Recordset
    Dim DBS As Database
    
    Set DBS = CurrentDb
        strSQL = "SELECT TOP 100 NR FROM T_MOB WHERE (((T_MOB.NR) Not In (SELECT TOP 100 T_MOB.NR FROM T_MOB)));"
        Set rst = DBS.OpenRecordset(strSQL)
        CurrentDb.CreateQueryDef "Q_Temp", strSQL
    
    End Sub
    
    così creo una query temporanea. Adesso non riesco a capire come poter variare dinamicamente il 100

    ho provato a sostiture il "100" con una varibile "nRecord" che prenda il valore da un campo txt in form.
    Ricercando consigliavano di dichiarare come
    
    Public nRecords As Integer
    nRecords = me.txt_nRecords
    
    pertanto ho provato ma nisba... dove sbaglio?...

    Ps: come posso far si che il campo "NR" nella Q_Temp assuma un altro nome? sempre che sia possibile.
  • Re: Creare Specifico txt

    Pubblica TUTTO il codice della Query, non solo la dichiarazione della Variabile che peraltro non serve nemmeno...
  • Re: Creare Specifico txt

    @Alex ha scritto:


    Pubblica TUTTO il codice della Query, non solo la dichiarazione della Variabile che peraltro non serve nemmeno...
    Scusa ops!!!
    
    Private Sub Comando139_Click()
    Dim strSQL As String
    Dim rst As Recordset
    Dim DBS As Database
    Dim nRecordsDa As String
    Dim nRecordsA As String
    
    nRecordsDa = Me.txtDa_M.Value
    nRecordsA = Me.txtA_M.Value
    Set DBS = CurrentDb
    
    DoCmd.DeleteObject acQuery, "Q_Temp"
        strSQL = "SELECT TOP " & nRecordsA & " NR FROM T_MOB WHERE (((T_MOB.NR) Not In (SELECT TOP " & nRecordsDa & " T_MOB.NR FROM T_Mobili)));"
        Set rst = DBS.OpenRecordset(strSQL)
        CurrentDb.CreateQueryDef "Q_Temp", strSQL
    End Sub
    
    forse ho risolto in parte ...
    mi perdo nell'intervallo "DA" a "A"... un attimo di confusione

    sbaglio quando devo indicargli la partenza dal nRecordDa.. ma non capisco dove.
  • Re: Creare Specifico txt

    Tu hai usato solo 1 variabile probabilmente non capendo che nella prima TOP definisci lo STEP mentre nella SubSelect definisci il Da...
    Quindi se li svincoli e giochi con i numeri capisci meglio come funziona e come modificarlo.
  • Re: Creare Specifico txt

    @Alex ha scritto:


    Tu hai usato solo 1 variabile probabilmente non capendo che nella prima TOP definisci lo STEP mentre nella SubSelect definisci il Da...
    Quindi se li svincoli e giochi con i numeri capisci meglio come funziona e come modificarlo.
    cosi funziona... o meglio raggiunge lo scopo ma non n'è sono molto soddifatto.
    
    Dim strSQLda As String
    Dim strSQLa As String
    Dim rst As Recordset
    Dim DBS As Database
    Dim nRecordsDa As String
    
    'variabile
    nRecordsDa = Me.txtDa_M.Value
    
    'comandi comuni
    Set DBS = CurrentDb
        
        If Me.txtDa_M = 0 Then
            strSQLa = "SELECT TOP 100 NR FROM T_Mobili"
            Set rst = DBS.OpenRecordset(strSQLa)
            CurrentDb.CreateQueryDef "Q_TempA", strSQLa
        Else
            'prima query
            strSQLda = "SELECT T_Mobili.NR FROM T_Mobili " & _
                        "WHERE (T_Mobili.Nr Not In(SELECT TOP " & nRecordsDa & " T_Mobili.NR " & _
                        "FROM T_Mobili));"
            Set rst = DBS.OpenRecordset(strSQLda)
            CurrentDb.CreateQueryDef "Q_TempDa", strSQLda
            'seconda query
            strSQLa = "SELECT TOP 100 NR FROM Q_TempDa"
            Set rst = DBS.OpenRecordset(strSQLa)
            CurrentDb.CreateQueryDef "Q_TempA", strSQLa
        End If
        
         'avvia procedura crea txt
           
           'comandi comuni da abilitare alla fine della procedura per eliminare le qry temporanee
            DoCmd.DeleteObject acQuery, "Q_TempDa"
            'DoCmd.DeleteObject acQuery, "Q_TempA"
    
    
    non mi cazziare....
  • Re: Creare Specifico txt

    Risolto tutto in un unico comando thanks mille.
    Grazie Alex per i consigli. ho risolto dall'acquisizione del file txt alla separazione del dati al tipo di file che mi serviva con le cento righe nonchè la progressione e nomenclatura dei file di uscita
    due in realta uno per inziare acquisizione e l'altro per la procedura successiva
  • Re: Creare Specifico txt

    Falco6911 ha scritto:


    Risolto tutto ...
    Lo rispieghi, per favore? Non ho capito un solo passaggio di quello che hai fatto per risolvere.
  • Re: Creare Specifico txt

    Philcattivocarattere ha scritto:


    Falco6911 ha scritto:


    Risolto tutto ...
    Lo rispieghi, per favore? Non ho capito un solo passaggio di quello che hai fatto per risolvere.
    ciao Philcattivocarattere e grazie anche a te.

    Ti posto il codice forse riesco a spiegarmi meglio
    Sicuramente imperfetto e migliorabile senza alcun dubbio ma per le mie piccole conoscenze è tanto. Tra l'altro ho raggiunto lo scopo, poi in funzione vedrò i risultati.


    PS: non mi cazziare pure tu che già mi attende quella di @Alex ...
    
    'Controllo esistenza qry temporanee e relativa cancellazione
    Dim qDef As DAO.QueryDef
    Dim Ex_Qry_0 As Boolean
    Dim Ex_Qry_1 As Boolean
    
    Ex_Qry_0 = False
    For Each qDef In CurrentDb.QueryDefs
        If "Q_Tmp_M_0" = qDef.Name Then
            Ex_Qry_0 = True
        Exit For
        End If
    Next
        If Ex_Qry_0 = True Then
            DoCmd.DeleteObject acQuery, "Q_Tmp_M_0"
        Else: End If
        
    Ex_Qry_1 = False
    For Each qDef In CurrentDb.QueryDefs
        If "Q_Tmp_M_1" = qDef.Name Then
            Ex_Qry_1 = True
        Exit For
        End If
    Next
        If Ex_Qry_1 = True Then
            DoCmd.DeleteObject acQuery, "Q_Tmp_M_1"
        Else: End If
    
    'avvio procedura crea qry temporanee
    Dim strSQLda As String
    Dim strSQLa As String
    Dim rst As Recordset
    Dim DBS As Database
    Dim nRecordsDa As String
    
    'variabile numerica
    nRecordsDa = Me.txtDa_M.Value
    
    'Avvio procedura
    Set DBS = CurrentDb
        
        If Me.txtDa_M = 0 Then
            strSQLa = "SELECT TOP 100 NR FROM T_Mobili "
            Set rst = DBS.OpenRecordset(strSQLa)
            CurrentDb.CreateQueryDef "Q_Tmp_M_1", strSQLa
        Else
            'crea prima query
            strSQLda = "SELECT T_Mobili.NR FROM T_Mobili " & _
                        "WHERE (T_Mobili.Nr Not In(SELECT TOP " & nRecordsDa & " T_Mobili.NR " & _
                        "FROM T_Mobili));"
            Set rst = DBS.OpenRecordset(strSQLda)
            CurrentDb.CreateQueryDef "Q_Tmp_M_0", strSQLda
            'crea seconda query
            strSQLa = "SELECT TOP 100 NR FROM Q_Tmp_M_0"
            Set rst = DBS.OpenRecordset(strSQLa)
            CurrentDb.CreateQueryDef "Q_Tmp_M_1", strSQLa
        End If
        
    'Conteggio file txt contenuti nella cartella di destinazione da svuotare alla fine della procedura
            Const myFolder As String = "C:\Users\Desktop\Export\"
            Dim sFileName As String
            Dim ICont As Long
                
                sFileName = Dir(myFolder & "*.txt")
            ICont = 0
            Do While (Len(sFileName) > 0)
            
            On Error Resume Next
                ICont = ICont + 1
                sFileName = Dir
            Loop
        
    'Avvia procedura crea txt personalizzato
                 DoCmd.RunSavedImportExport "Exp_M"
    
    'Avvia procedura rinomina file txt creato da "Exp_M" con numerazione progressiva
    Dim myDate As String
    Dim nFileOld As String
    Dim nFileNew As String
    Dim Nr As String
    Dim txtFile As String
    Dim nPercorso As String
    
    myDate = Format(Date, "yyyymmdd")
    Nr = Format((ICont + 1), "00")
    'Nr = Format((Me.txtnFilenr + 1), "00")
    
    'Rinomina nel richiesto "QRY_20200822_02_M"
    txtFile = "QRY_" & myDate & "_" & Nr & "_M.txt"
    
    'Percorso
    nPercorso = "C:\Users\Desktop\Export\"
    
    nFileOld = "C:\Users\Desktop\Export\Q_Exp_M.txt"
    nFileNew = nPercorso + txtFile
    Name nFileOld As nFileNew
    
  • Re: Creare Specifico txt

    Philcattivocarattere ha scritto:


    Falco6911 ha scritto:


    Risolto tutto ...
    Lo rispieghi, per favore? Non ho capito un solo passaggio di quello che hai fatto per risolvere.
    Scusa la domanda fuori contesto
    se volessi creare un comando che crei una cartella nel pc in uso, qualunque esso sia?
    cosi la creo sui Mio Desktop. ma si può fare un comando che la crei a prescindere dall'user?
    
    'Crea Cartella
    Dim xDate As String
    Dim xPath As String
    
    xDate = Format(Date, "ddmmyyyy")
    xPath = "C:\Users\Desktop\Exp_" & xDate
    MkDir xPath
    
Devi accedere o registrarti per scrivere nel forum
17 risposte