Errore funzione campo numerazione progressiva

di il
15 risposte

Errore funzione campo numerazione progressiva

Buongiorno a tutti.
Nel mio database ho una maschera continua che si basa su una select query operante su più tabelle in relazione uno a molti.
Ho bisogno di avere un campo identificante univoco per ogni record e non potendo utilizzare uno degli ID delle tabelle (che non sono univoci nel risultato della query) ho creato un campo nella maschera con origine
=GetRecNum()
che va a creare una numerazione progressiva dei record nella maschera, facendo riferimento a questa funzione:
Public Function GetRecNum() As Long
    On Error GoTo erh

    With CodeContextObject.RecordsetClone
        If Not (.BOF And .EOF) Then
            .Bookmark = CodeContextObject.Bookmark
            GetRecNum = .AbsolutePosition + 1
        End If
    End With
 
ext:
    Exit Function
 
erh:
    GetRecNum = 0
End Function
La cosa funziona bene ma mi si presenta un problema.
Se aggiungo un record al recordset della maschera e poi faccio un requery della maschera stessa, il campo contatore di tutti i record assume valore 0.
Non riesco bene a capire l'origine del problema.

Magari esiste un modo più diretto per identificare univocamente il record senza avvalersi della funzione?

15 Risposte

  • Re: Errore funzione campo numerazione progressiva

    Non sono sicuro di aver capito correttamente, provo a dirlo a parole mie.
    1. Tu hai una query su più tabelle correlate
    2. Al recordset di questa query vorresti vedere un campo numerico progressivo (diciamo) a sinistra

    Se quello che ho scritto è corretto, potresti pensare una "tabella di appoggio" avente gli stessi nomi campi della query più un ID numerazione automatica. Su questa tabella di appoggio applichi una query di accodamento da TuaQuery a TabellaAppoggio.
  • Re: Errore funzione campo numerazione progressiva

    Mi pare di conoscere quella funzione...!

    Fai attenzione, quel metodo andrebbe usato solo per una gestione GRAFICA ONE-SHOT... ma se devi fissare il valroe progressivo come fosse una PK, allora assolutamente non va bene, in quanto l'assegnazione del Valore è Dipendente dal RS stesso ogni volta, quindi se cancelli/Aggiungi o anche se Ordini per un campo diverso, ti si sballa tutta la numerazione.

    Quindi prima cosa è sempre CAPIRE l'esigenza e se il codice che troviamo in rete è stato pensato per assolvere a questo o meno...

    Spiega meglio quindi la VERA e chiara necessità che hai, perchè probabilmente quel metodo NON va bene nel tuo caso.
  • Re: Errore funzione campo numerazione progressiva

    Si, Alex, è una funzione che avevi consigliato tu tempo fa.

    Spiegando meglio la situazione:
    Mi serve identificare in modo univoco il record del recordset per poterlo evidenziare attraverso formattazione condizionale. Ho un campo txtID nell'intestazione della maschera che sul current della maschera assume il valore del campo univoco. Un campo nel corpo nella maschera invece assume colorazione diversa (evidenziando il record) quando CampoUnivoco = txtID. È il procedimento standard per evidenziare il record selezionato in una maschera continua.

    Tutto questo necessita di identificare in modo univoco il record, perciò ho pensato alla funziona sopra esposta.

    Proverò comunque il procedimento consigliato da Osavldo, che mi sembra promettente.
  • Re: Errore funzione campo numerazione progressiva

    Perchè non hai messo un campo Counter invece di inventarti cose strane...?
    Il Campo Counter non è OBBLIGO sia una PK...
  • Re: Errore funzione campo numerazione progressiva

    Cosa intendi esattamente per campo counter?
    A livello di query o di maschera?
  • Re: Errore funzione campo numerazione progressiva

    Un campo a livello di Tabella, che identifica in modo UNIVOCO il Record, come normalmente si fa in questi casi.
  • Re: Errore funzione campo numerazione progressiva

    La query che popola la maschera si basa su più tabelle relazionate (relazioni uno a molti).
    Ogni tabella ha un suo campo PK univoco.
    Invece i record originati dalla query non hanno nessun campo di nessuna tabella che identifica in modo univoco il record. È la combinazione di due campi PK di due tabelle ad indentificare in modo univoco il record.

    La PK della prima tabella compare più volte nei record della query.
    La PK della seconda tabella compare più volte nei record della query.

    La combinazione di PK prima tabella - PK seconda tabella è univoca e genera il singolo record.
    Quindi non ho nessun campo a livello di tabelle che identifichi in modo univoco il record. Aggiungere un contatore a livello di una delle due tabelle non risolverebbe comunque il problema.
  • Re: Errore funzione campo numerazione progressiva

    Ho risolto, creando un nuovo campo nella query che appunto combina le due PK delle tabelle, unendo i due valori uno dopo l'altro e generando dunque un valore univoco.
    Talmente semplice che non ci avevo pensato.
  • Re: Errore funzione campo numerazione progressiva

    Quello che dici è nella sostanza esiste solo in 1 caso, ovvero la Query è Raggruppata, altrimenti una Query Basata su Tabelle, DEVE avere una stretta corrispondenza, perchè non può NE moltiplicare i dati, sempre non sia sbagliata nei JOIN, nè ridurli... salvo appunto raggruppamenti.
  • Re: Errore funzione campo numerazione progressiva

    Sì, la query è raggruppata
  • Re: Errore funzione campo numerazione progressiva

    RaoulDuke ha scritto:


    Sì, la query è raggruppata
    Ma pensa...

    Allora ti tocca verificare perchè non funziona, facendo debug del codice... passo passo all'esecuzione del Requery... o quando viene forzato il sistema ad eseguirlo, come quando fai un FilterOn=True/False oppure quando applichi un OrderBy...

    Quindi concateni 2 Campi PK senza includerli nell'elenco Campi e Raggruppi su questo nuovo Campo Calcolato...?
  • Re: Errore funzione campo numerazione progressiva

    Alex grazie, ma come dicevo prima ho risolto.
    Funziona: i due PK (che compaiono entrambi nei campi della query) servono a generare un nuovo campo calcolato
    Identificativo:[tab1].[PK] & " " &[tab2].[PK]
    In questo modo ottengo una stringa che mi identifica in modo univoco il record. Questo mi permette di fare la formattazione condizionale senza avere il problema in seguito al requery della maschera.
  • Re: Errore funzione campo numerazione progressiva

    Certo, avevo capito che hai risolto, trovavo utile chiarire per chi legge, i 3D servono a tutti.
  • Re: Errore funzione campo numerazione progressiva

    Sì certo, ma hai scritto di verificare perchè non funziona e non capivo.

    Se si tratta di capire perchè utilizzando la funzione GetRecNum ottengo un errore al requery, posso dirti che ho fatto il debug passo a passo e la funzione raggiunta la riga
    If Not (.BOF And .EOF) Then
    passa ad errore e imposta GetRecNum = 0
Devi accedere o registrarti per scrivere nel forum
15 risposte