Newsgroup: it.comp.appl.access
Titolo: Esportazione su file per ogni record

Salve a tutti.
Ho una problematica di questo tipo.
 
Ho due tabelle:
TAB1 --> contiene tutte le testate dei documenti
TAB2 --> contiene tutte le righe dei documenti
Le due tabelle sono ovviamente collegate da un campo univoco (ID) e ad ogni testata della TAB1 corrispondono una o più righe della TAB2.
 
Vorrei crearmi un loop da VBA che per ogni record della TAB1 mi crei un file, opportunamente formattato, che mi contenga i dati sia di TAB1 e relativi record della TAB2.
 
Se la TAB1 contenesse 1 record e la TAB2 x record associati utilizzerei una cosa del genere:
 
Dim te As DAO.Recordset
Set te = CurrentDb.OpenRecordset("SELECT * FROM TAB1", dbOpenDynaset)
Dim ri As DAO.Recordset
Set ri = CurrentDb.OpenRecordset("SELECT * FROM TAB2", dbOpenDynaset) 
 
Open "C:\export\" & te.Fields("[ID]").Value & ".txt" For Output As #1
Print #1, "Numero Documento=" & te.Fields("[numero_documento]").Value
 
If (ri.RecordCount <> 0) Then
   ri.MoveFirst
      Do While ri.EOF = False
     TempExportCount = TempExportCount + 1
Print #1, "Riga documento=" & ri.Fields("[riga_documento]").Value 
     ri.MoveNext
   Loop
 End If
 
In modo che crei un file di testo con questo contenuto:
 
Numero Documento=1
Riga Documento= riga 1
Riga Documento= riga 2
Riga Documento= ...
 
Come posso fare per crearmi x file in base agli x record contenuti nella TAB1 e relativi record associati nella TAB2?
 
 
Grazie per le eventuali risposte.
Andrea 
 
 


solo per porre un altro punto di vista
 
Ho presente una situazione simile:
e utilizzo l'export con docmd.transferText
di una tabella temporanea in file di testo
 
 
In pratica gli ingredienti della ricetta sono:
-il ciclo VBA che scorre la tabella master
e "registra" l'ID (campo di una form ?, tabella con SOLO questo valore ?)
dei record ancora da passare a file di testo
-una query di accodamento che lega i campi necessari
delle tabelle master/detail con criterio di selezione ID registrato
e li riversa nella tabella temporanea (di scopo)
-lancio di docmd.transferText per la tabella temporanea
(occorre registrare la specifica !)
-cancellazione della tabella temporanea
 
PS: non ricordo se docmd.transferText può agire
direttamente anche su una query di selezione ...
 


Avevo pensato anche io di creare/cancellare ogni volta delle tabelle temporanee ma dovendo eseguire la procedura su migliaia di record la trovo poco ottimizzata.
Diciamo che per l'export preferisco utilizzare la modalità citata perchè la trovo facilmente personalizzabile. 
 
Grazie :)

Qualche cosa mi sfugge...
Tab1 e Tab2 sono in qualche modo relazionare 1-M...?
 
Se si credo sarebbe più opportuno un ciclo esterno su tab1 solo per ciclare la PK ed un ciclo interno su una query che prevede il join tab1 Tab2 con where su pk ricavato dal ciclo esterno.
 
Se le tabelle non fossero relazionate fatico a comprendere con che criterio si estraggono i dati coerenti di tab2 in un ciclo relazionato solo su tab1(o viceversa).
 
Per il resto sia una temptable sia questo metodosoni validi, questo sicuramente meno invadente le temptable se si può evitarle è meglio ed in questo caso credo proprio non serva.
 
@Alex


Ovviamente TAB1 e TAB2 sono relazionate. 
Purtroppo quello che non riesco a fare è proprio il ciclo a cui fai riferimento usando VBA :( 
 
Andrea


non vedo il problema
 
Dichiari i due recordset TE testata RI righe
apri solo il primo
Set te = CurrentDb.OpenRecordset("SELECT * FROM TAB1", dbOpenDynaset)
 
while not eof TE
	Print #1, "Numero Documento....
	'apri qui il secondo per le sole righe che coincidono al id della testata
	Set RI= CurrentDb.OpenRecordset("SELECT * FROM TAB2 where id=" & 
TE.fields("IF"), dbOpenDynaset)
	while not eof RI
		print....riga
		RI.movenext
	wend
	te.movenext
Wend
 


Per la serie come perdersi in un bicchiere d'acqua...
Grazie per la risposta, ovviamente funziona :)
Andrea


ottimo
ciao
BFS

 Andrea
 
In alternativa:
================================
Private Sub StampaSalva_PDF_Click()
Dim SQL As String, RS As Recordset
 
SQL = "SELECT PrimaryTable.Venditore FROM PrimaryTable;"
Set RS = CurrentDb.OpenRecordset(SQL, dbOpenDynaset)
 
DoCmd.Echo False
Do Until RS.EOF
    DoCmd.OpenReport "rStampaPDF", acViewPreview, , "Venditore='" & 
RS![Venditore] & "'"
    DoCmd.OutputTo acOutputReport, "", acFormatPDF, "C:\BC\" & 
RS![Venditore] & ".pdf", False
    DoCmd.Close acReport, "rStampaPDF"
    RS.MoveNext
Loop
DoCmd.Echo True
End Sub
==============================
 
- Puoi sostituire PDF in acFormatPDF e ".pdf"
  con TXT  RTF  XLS
- Deve esistere il Report rStampaPDF creato sulla query che riporta
  tutti i Venditori di PrimaryTable unitamente a tutti i Compratori
  di LinkedTable
 
È un po' più complicata della soluzione BFS perché ho previsto
anche formati che non si scrivono riga per riga.
 
Bruno