RIFERIMENTO CIRCOLARE NEL DLOOKUP

di
Anonimizzato15390
il
7 risposte

RIFERIMENTO CIRCOLARE NEL DLOOKUP

Salve a tutti. Sono nuova in questo forum e inesperta in access. Ho un database dove la colonna id rappresenta l'id associato a una produzione, ref rappresenta l'id da cui viene generato il remake (da notare che se la colonna p/r è uguale a p non avrò un ref), la colonna p/r mi indica se l'id è una prima produzione o un remake, la data è la data in cui effettuo la registrazione. Il mio problema è: se la colonna p/r è uguale a r ho bisogno che una funzione mi restituisca in una nuova colonna (ad esempio data(p)) la data associata alla prima produzione: ad esempio, nel caso dell'id 6, che è un remake, ho che il suo ref è 4 ma che 4 a sua volta è un remake e viene da id 1 (che è un p) e quindi vorrei che in data(p) associata all'id 6 (e all'id 4) ci fosse la data dell'id 1, cioè 01/01/2013. Se invece p/r è uguale a p deve restituirmi la data di registrazione associata all'id.

Ho allegato l'immagine del DB.

Ho creato una struttura query fatta in questo modo:
SELECT DB.ref, DB.id, DB.[p/r], DB.data, IIf([p/R]="P",[data],dlookup([data(p)],"Query1")) AS data(p)
FROM DB;

ma così facendo ho un errore di riferimento circolare.
Potete aiutarmi a risolvere questo problema?
Grazie a tutti quelli che risponderanno.

MaCla
Allegati:
15390_50a551a081e0754f53b72e2b64528b1e.jpg
15390_50a551a081e0754f53b72e2b64528b1e.jpg

7 Risposte

  • Re: RIFERIMENTO CIRCOLARE NEL DLOOKUP

    Ciao,
    il campo ref come viene compilato? manualmente?
    in pratica se ho capito bene, una strada percorribile potrebbe essere quella risalire a ritroso per il remake fino a che si trova un null nel ref....e da li leggere il contenuto della data.

    Avendo a disposizione non solo le produzioni ma anche un identificativo ulteriore ( l'item oggetto del remake) sarebbe più semplice.

    dimmi intanto se la prima parte del ragionamento fila.
    buona domenica.
  • Re: RIFERIMENTO CIRCOLARE NEL DLOOKUP

    Ciao e innanzitutto grazie per la risposta..

    Tutti i campi oggetto del DB sono stati importati su access da un file excel pertanto sul DB in esame i campi non vengono compilati manualmente.

    Il ragionamento che segui:
    "risalire a ritroso per il remake fino a che si trova un null nel ref....e da li leggere il contenuto della data"
    credo sia corretto.

    Cerco di essere più chiara in merito ai campi "ref" e "id".
    Il campo "id" rappresenta la matricola che il sistema gestionale che utilizziamo assegna alla produzione.
    Il campo "ref" viene alimentato nel momento in cui si tratta di un remake. Ogniqualvolta occorre eseguire un remake su un id, il sistema genera in automatico un nuovo id (del remake) che risulta però associato all'id padre (di cui si effettua il remake); in tal caso il campo "ref" verrà alimentato dal sistema con la matricola a cui si riferisce (l'id di partenza).

    Faccio ulteriori esempi per essere più chiara in merito al risultato atteso:

    Se il campo p/r = p (prima produzione) --> data(p) = data
    Se il campo p/r = r (remake) cerca "ref" in "id" (fino a che ref = null) e restituisci la data dell'id che ha ref = null.

    Nel caso di id = 6 (campo p/r= r) cerca "ref" (in questo caso "ref=4") nella colonna "id";
    Se lo trovi e il campo p/r = p --> restituisci la data dell'id che hai trovato;
    Se lo trovi e il campo p/r = r --> continua il "ciclo" fino a che in corrispondenza dell'id trovato ref = null e p/r = p --> restituisci la data relativa a quest'ultimo id.

    Spero di essere stata chiara.
    Allego un ulteriore immagine dove ho inserito il risultato atteso.
    Grazie mille
    Macla
    Allegati:
    15390_3c279be68a49e3138b4f04aff04fd823.jpg
    15390_3c279be68a49e3138b4f04aff04fd823.jpg
  • Re: RIFERIMENTO CIRCOLARE NEL DLOOKUP

    Ciao,
    ancora una domanda....
    essendo il remake associato al ID padre per quale ragione l'id 6 è collegato in primo luogo ref4 e poi al id 1? non dovrebbe essere collegato direttamente all'id1?
    un saluto
  • Re: RIFERIMENTO CIRCOLARE NEL DLOOKUP

    Ciao!

    è proprio questo il mio problema. Sull'id 1 sono stati effettuati 2 remake (ai quali il sistema ha associato automaticamente l'id 4 e l'id 6). Il file excel che estraggo dal sistema gestionale (e che in un secondo momento importo su access) riporta nel campo "ref" l'id precedente (quindi nel caso dell'id 6 riporta id 4 e nel caso di id 4 riporta id 1).
    Il mio problema è proprio come risalire dall'id 6 all'id 1 e riportare la data relativa all'id 1, in corrispondenza dell'id 4 e dell'id 6 nella nuova colonna data(p).
    Grazie ancora.
    Macla
  • Re: RIFERIMENTO CIRCOLARE NEL DLOOKUP

    Ciao MaCla,
    ho individuato una soluzione che in verità non mi piace moltissimo...provo a mostrartela, fai qualche test e facci sapere...
    Supposto i dati che hai mostrato organizzati in una tabella che chiamo tabella1 e l'estrazione con la data che vuoi ottenere(---> estratta su datanew2), tramite questa query :
    
    
    SELECT ID, ref, [p/r], dataIn,
     IIf([p/R]="p",[datain],selectid([ref])) AS datanew2
    FROM Tabella1;
    
    
    copia incolla questo codice su un modulo :
    
    
    Public Function selectID(intRef As Integer) As Date
    
    Dim rst As DAO.Recordset
    Dim refTobeFound As Variant
    Dim dateFound As Date
    
    Set rst = DBEngine(0)(0).OpenRecordset("tabella1", dbOpenDynaset)
    
    With rst
        .FindFirst "id = " & intRef
        refTobeFound = !ref
        dateFound = !datain
        If Not IsNull(refTobeFound) Then
            Do While Not .BOF
                If refTobeFound = !id Then dateFound = !datain
                .MovePrevious
            Loop
        End If
    selectID = dateFound
    End With
    
    Set rst = Nothing
    
    End Function
    
    un saluto.
  • Re: RIFERIMENTO CIRCOLARE NEL DLOOKUP

    Ciao e innanzitutto grazie per aver prestato attenzione al mio problema!
    Ho provato la soluzione che mi hai proposto e funziona a dovere!!
    Grazie mille!!
    Anche io ho trovato una soluzione che mi fa piacere condividere:

    SELECT Foglio1.ID1, Foglio1.ref, Foglio1.id, Foglio1.[p/r], Foglio1.data, CDate(IIf([p/r]="p",[Data],DLookUp("[Data(p)]","Query1","[id]=" & [ref]))) AS [Data(p)]
    FROM Foglio1;

    Grazie ancora!!

    Macla
  • Re: RIFERIMENTO CIRCOLARE NEL DLOOKUP

    Ciao, mi/ci mostreresti lo statement sql della query1?
    un saluto.
Devi accedere o registrarti per scrivere nel forum
7 risposte