Calcolo progressivo in query di accodamento

di il
3 risposte

Calcolo progressivo in query di accodamento

Ho trovato diversi 3d sui progressivi, ma non sono riuscito (apparentemente) a trovare qualcosa che possa aiutarmi.
Spero di sbagliarmi e, nel caso, mi scuso già da subito.

Vengo al dunque; come da vecchio post sulla conversione di un file txt, nell'organizzare la query di accodamento dei vari record, mi ritrovo a dover impostare una chiave di archiviazione fatta in questo modo:
Lunghezza 37 chr$

AAAAMMMCCCCCCCCCCCCCCCCGVVVPPPCCCProg, dove "Prog" è un numero progressivo da convertire un una stringa di tipo "0000"

Ora, il problema si pone in quanto nei record da trasportare, non ho nessun riferimento preciso da dove partire, per cui mi devo inventare qualcosa per costituire un numero progressivo in base all'unico valore certo che è il Codice Fiscale.
Chiaramente il progressivo dovrà poi riazzerarsi e "ricominciare" da 1 al momento che il codice fiscale è diverso.

In pratica se AAAAAA ha 4 record e BBBBBB ne ha 2, devo calcolarmi i progressivi da 1 a 4 per AAAAAAA e da 1 a 2 per BBBBBBB

Sto studiando diverse soluzioni, tra cui quella forse più illogica ma che (forse) funzionerebbe, e cioé:
Mi carico la tabella dove la chiave di archiviazione non è una chiave primaria; me la trasporto in un recordset e record dopo record mi calcolo il progressivo. (E' una caxxata, lo so).

Qualche indicazione utile?

3 Risposte

  • Re: Calcolo progressivo in query di accodamento

    Vabbè alla fine ho optato per un doppio Recordset.

    Ho dapprima aperto un recordset dove attivo una query di selezione.
    A questo punto prendo il primo Codice fiscale, lo memorizzo, do un [Code]Prog=1 e attivo il secondo recordset con altra query sulla base del codice fiscale ricavato e così mi analizzo record per record e, ad ogni loop, faccio un [Code]Prog=Prog + 1 e vado avanti fino ad EOF del secondo Recordset.

    A questo punto torno sul primo recordset aperto e vado avanti con il contraente successivo, vado di nuovo con Prog=1 e riparto con il secondo recordset e così via fino ad EOF.

    Un pò arzigogolato, ma funziona ...
  • Re: Calcolo progressivo in query di accodamento

    carlo pots ha scritto:


    ...mi ritrovo a dover impostare una chiave di archiviazione
    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.
  • Re: Calcolo progressivo in query di accodamento

    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
Devi accedere o registrarti per scrivere nel forum
3 risposte