Newsgroup: it.comp.appl.access
Titolo: esportare record concatenati in file txt su unica riga senza ritorno a capo

Salve a tutti, avrei un problema (almeno per me) da sottoporvi, che nonostante la buona volontà e le varie ricerche fatte nei forum di programmazione vba per access, non riesco a venirne a capo, spero di essere conciso e chiaro nella spiegazione: Ho necessità, per lavoro, di trasferire i records contenuti nella tabella che chiamerò TblTurnazione, in un file .Dat, tutti questi record che contengono il codice azienda, la matricola del dipendente, la data ed il codice turno (formato da due lettere) sono così formattati ; Codice azienda 6 caratteri (000101 es.), Matricola dipendente 7 caratteri (0000202 es.), la data in formato gg/mm/aaaa (29/08/2016 es.) il codice di turnazione 2 caratteri (BX es.) quindi il record alla fine dovrebbe essere qualcosa del genere :000101000020229/08/2016BX , consideriamo che di questa stringa se ne contano da un minimo di 28 ad un massimo di 31 (durata in giorni del mese) e moltiplicata per da un minimo di 10 ad un massimo di 50 dipendenti, il Software che elabora le presenze accetta solo file che chiama TURNI.Dat e vuole tutte queste sequenze di caratteri solo su un'unica riga senza ritorni a capo o spazi , altrimenti si blocca e non elabora, fino ad oggi i colleghi incaricati dell'immissione dei codici orari lo fanno manualmente pur avendo la possibilità di importare un file.dat, ma purtroppo nessuno era in grado di implementare un db che riuscisse a fare questo, io sono riuscito a concatenare i records attraverso una query ed ad esportarlo in un file .dat ma nonostante ciò non riesco a far si che venga esportato tutto in un'unica riga, ad un certo punto va sempre a capo, credo che, se non mi sbaglio, una riga può contenere 93500 caratteri , qui non si arriva neanche alla metà o quasi, 25 (caratteri) x 31 (giorni del mese) x 50 (massimo dei dipendenti) = 38750 caratteri, qualcuno può darmi un'aiuto su come poter risolvere?
 
posto il codice che ho usato :
grazie anticipatamente a tutti quelli che vorranno darmi una mano
 
 
 
    Dim Miodb As Database
    Dim TabRighe As Recordset
    Dim strSQL As String
    Dim strRitorno As String
    Set Miodb = CurrentDb
    strSQL = "SELECT TblTurnazione.CodAz & TblTurnazione.Matricola &   TblTurnazione.Data & TblTurnazione.Turno AS Riepilogo FROM TblTurnazione WHERE ((Format(TblTurnazione.Data,""m"")= " & Chr(34) & Me.testomes & Chr(34) & ")) ORDER BY TblTurnazione.Matricola"
 
    Set TabRighe = Miodb.OpenRecordset(strSQL, dbOpenDynaset)
 
    strRitorno = ""
    If Not TabRighe.EOF Then
        TabRighe.MoveFirst
        strRitorno = Nz(TabRighe.Fields("Riepilogo")) 'Nz() evita errori quando si cerca di concatenare campi con valori Null
        TabRighe.MoveNext
        Do Until TabRighe.EOF
        strRitorno = strRitorno & Nz(TabRighe.Fields("Riepilogo"), "")
        TabRighe.MoveNext
        Loop
 
    End If
    ConcatenaRighe = strRitorno
    Open "H:\Tutto\DB orario dip\Prova\" & "TURNI " & Format(Date, "dd_mm_yyyy") & ".dat " For Output As #1
    Print #1, ConcatenaRighe
    Close #1
    TabRighe.Close
    Miodb.Close
    Set TabRighe = Nothing
    Set Miodb = Nothing


1. perché copi la stringa strRitorno nella variabile ConcatenaRighe che tra l'altro non è dichiarata e quindi sarà un variant? Puoi fare il print #1 di strRitorno. Ti consiglio di abilitare nell'editor VBA l'opzione "Dichiarazione variabili obbligatoria", evita noiosi problemi in caso scrivessi male un nome di variabile. Nel tuo modulo basta andare all'inizio e aggiungere una riga "Option Explicit"
 
2. Perchè concateni tutti i dati in una variabile? Puoi mettere il print dentro al ciclo e scrivere direttamente sul file. Unica accortezza metti alla fine un punto e virgola così non va a capo:
 
<loop>
print #1, Nz(TabRighe!Riepilogo, "");
.movenext
<end loop>
 
Ciao.
-Marco-
 

Ciao Marco e grazie per il tuo intervento,io ho modificato la routine in base al tuo suggerimento, e sai che mi va in stallo si riavvia e mi crea una copia di backup?
ti posto il codice:
 
Function ConcatenaRighe()
    Dim Miodb As Database
    Dim TabRighe As Recordset
    Dim strSQL As String
    Set Miodb = CurrentDb
    strSQL = "SELECT TblTurnazione.CodAz & TblTurnazione.Matricola & TblTurnazione.Data & TblTurnazione.Turno AS Riepilogo "
    FROM TblTurnazione WHERE ((Format(TblTurnazione.Data,""m"")= " & Chr(34) & Me.testomes & Chr(34) & ")) ORDER BY TblTurnazione.Matricola"
    Set TabRighe = Miodb.OpenRecordset(strSQL, dbOpenDynaset)
        Open "F:\Tutto\DB orario dip\Prova\" & "TURNI " & Format(Date, "dd_mm_yyyy") & ".dat " For Output As #1
    If Not TabRighe.EOF Then
        TabRighe.MoveFirst
        Do Until TabRighe.EOF
         Loop
         Print #1, Nz(TabRighe!Riepilogo, "");
        TabRighe.MoveNext
      Close #1
      TabRighe.Close
      Miodb.Close
      Set TabRighe = Nothing
      Set Miodb = Nothing
    End If
End Function


Il LOOP va DOPO al MoveNext!
 
Altrimenti lo scrivi così:
 
   With TabRighe
     If not .EOF then .MoveFirst
     While Not .EOF
         Print #1, Nz(!Riepilogo, "");
         .MoveNext
     Wend
   End With
 
Ciao.
-Marco-

Ti ringrazio molto
 
ciao
Diego