Philcattivocarattere ha scritto:
Quindi perfetta per essere indicizzata senza duplicati ammessi, o no?
Non so come hai fatto la query di accodamento nel suo complesso, però mi sembra inevitabile passare da una funzione ad hoc per creare quella chiave di archiviazione. Si inserisce il tutto in una transazione, in caso di errore di inserimento per violazione di quell'indice univoco, rollback, e si prova ad incrementare di 1 il progressivo. Roba del genere. Ti interessa? A me sì (me la suono e me la canto)
Scrivi un po' di quello che hai realizzato e vediamo come "migliorarlo" se necessario.
Dunque, parto dal fatto che le tabelle che ho creato per "smistare" i tipi di record sono tutte senza chiave primaria, quindi diciamo completamente "free".
Andando nel dettaglio, io ho 2 tabelle delle quali:
- una (che si chiama T_REC_2) contiene i dati riepilogativi per il singolo soggetto, dove ci sono dei valori tra i quali alcuni che si riferiscono a sommatorie già calcolate dal fornitore del file .txt (che io preferisco sempre di evitare di farci affidamento: le sommatorie preferisco farle io).
- un'altra, invece, (di nome T_REC_3) contiene il dettaglio dei vari prodotti che hanno, come punto di "congiunzione" del record riepilogativo, il codice fiscale del contraente.
Entrambe le tabelle si riferiscono ad un solo codice di contrattazione, e non c'è pericolo che possiamo prendere dati inerenti altri contratti: un file txt per un codice di contrattazione.
Detto questo, ho dichiarato due variabili Object:
Dim RS(1 to 2) as Object
Dim StrSql(1 to 2), CodF, Q_sql, Part(1 to ....), KeyID as String
Dim Linea as Integer
A questo punto ho "caricato" la query nel Recordset
StrSQL="SELECT T_REC_2.CodFiscale, T_REC_2.TotaleKg, T_REC_2.Prezzo, .... FROM T_REC_2"
Set Rs(1) = CurrentDb.OpenRecordset(StrSQL(1))
Rs(1).MoveFirst"
Do While Not Rs(1).EOF
CodF=Rs(1).Fields("CodFiscale")
Nlinea = 1
StrSQL = "SELECT T_REC_3.CodFiscale, T_REC_3.Foglio, T_REC_3.Particella, ... FROM T_REC_3 WHERE (T_REC_3.CodFiscale)='" & CodF & "'"
Set Rs(2) = CurrentDb.OpenRecordset(StrSQL(2))
Rs(2).MoveFirst
Do While Not Rs(2).EOF
Partic(1) = Rs(2).Fields("CFColt")
Partic(2) = Rs(2).Fields("Foglio")
Partic(3) = Rs(2).Fields("Particella")
Partic(4) = format(Linea,"0000") '----> E' il progressivo della linea
[...]
Arrivati a questo punto creo la chiave indicizzata e senza duplicati, così da essere una e una sola:
KeyID = Partic(1) & Partic(2) & Partic(3) & Partic(4)
Quindi procedo a crearmi la query di accodamento in tabella:
Q_sql= "INSERT INTO TblAcquisizione "
Q_sql= Q_sql& " ( IDAcquisiz, CodFiscale, Foglio, Particella, ... )"
Q_sql= Q_sql& " SELECT '" & KeyID & "' as IDAcquisiz, "
Q_sql= Q_sql& Partic(1) & "' as CodFiscale, '
Q_sql= Q_sql& Partic(2) & "' as Foglio, '"
Q_sql= Q_sql& Partic(3) & "' as Particella, '"
[...]
CurrentDb.Execute Q_sql
Rs(2).MoveNext
Linea = Linea + 1
Loop
Rs(1).MoveNext
Loop
Exit sub
Ovviamente, dove ho messo i puntini, elenco i vari campi della query.
Un pò arcaica, ma funziona