Ricerca in 2 tabelle collegate

di il
13 risposte

Ricerca in 2 tabelle collegate

Ciao a tutti,
ho due tabelle:
Colli contiene ID(pk), Codice e Descrizione
Articoli contiene Codice, Descrizione, Idcollo ed è collegata tramite idcollo all'ID della tabella Colli (1a molti).
in sostanza la prima contiene i codici dei colli di prodotti e la seconda i codici dei prodotti contenuti.
Esempio:
codice collo 0000
codice art1 0001
codice art2 0002
...
codice collo 1111
codice artx 1112
codice arty 1113
codice arty 1114
codice arty 1115
ecc...
queste due tabelle sono sviluppate in una form singola con relativa subform continua.
nella form principale, vorrei far si che cercando un codice, a prescindere che sia del collo o del suo contenuto, venisse richiamato il codice collo relativo ma non ne sto venendo a capo...
possibili soluzioni?

Grazie mille come al solito!

Nickbi78

13 Risposte

  • Re: Ricerca in 2 tabelle collegate

    Io francamente non ho capito nulla.
  • Re: Ricerca in 2 tabelle collegate

    In effetti non ero proprio sicuro di essere stato chiaro, magari allegando qualche screen posso esplicare meglio.

    in pratica, vorrei far si che cliccando sul tasto "ricerca" sulla form (ancora il controllo non esiste), a prescindere che digito un codice che sia della tabella principale o della secondaria collegata, venga cercato il codice principale relativo, quindi se cerco 1234567000102 (id 34) nella form principale deve essere richiamato il codice 1234567000072 (id 2), idem se cerco direttamente 1234567000072 (id 2).

    spero che la situazione sia più chiara e chiedo venia per il primo post contorto.
    Allegati:
    15015_38c7c958bde208d220ae91a1ab897d06.png
    15015_38c7c958bde208d220ae91a1ab897d06.png

    15015_995d35a5f51e7d7a351bb9930fe43979.png
    15015_995d35a5f51e7d7a351bb9930fe43979.png
  • Re: Ricerca in 2 tabelle collegate

    Se il Campo Relazionale è Codice EAN della Tabella [Colli]... penso che sia UNIVOCO o meglio deve esserlo per come lo hai spiegato, a questo punto perchè hai anche una ID di tipo PK...?

    In questo caso, mi chiedo che senso abbia cercare lato MOLTI...?

    Non so qualche cosa di poco chiaro persiste.
  • Re: Ricerca in 2 tabelle collegate

    @Alex ha scritto:



    In questo caso, mi chiedo che senso abbia cercare lato MOLTI...?

    Non so qualche cosa di poco chiaro persiste.
    l'articolo può essere movimentato sia in colli interi che in singoli pezzi, se ho sottomano un codice interno al collo ma non il codice master, potrebbe tornare utile risalire al codice master direttamente con ricerca sul codice che ho disponibile.
  • Re: Ricerca in 2 tabelle collegate

    Allora dovresti avere una Tabella "Movimenti" e li si che ha senso Cercare...
  • Re: Ricerca in 2 tabelle collegate

    Quella ce l'ho già e in quella ho entrambi i codici e ho possibilità di cercare codice master o secondario
    ho bisogno di effettuare la ricerca nel form di anagrafica articoli che è appunto quella che ho allegato prima
  • Re: Ricerca in 2 tabelle collegate

    Otterrai SOLO 1 Record per volta... non ha senso... non otterrai l'elenco... perchè i dati lato MOLTI sono vincolati dai dati lato 1.
    Per fare una cosa intelligente devi avere una Maschera di Ricerca per i dati Lato M, e visualizzarli ... come vuoi fare tu... è veramente insensato, non so più come spiegartelo... buon lavoro.
  • Re: Ricerca in 2 tabelle collegate

    @Alex ha scritto:


    Otterrai SOLO 1 Record per volta... non ha senso... non otterrai l'elenco... perchè i dati lato MOLTI sono vincolati dai dati lato 1.
    In effetti non voglio un elenco...
    Sulla form anagrafica, da tasto ricerca o casella di ricerca (textbox non associata), se inserisco un codice master o secondario deve essere filtrato il record master che contiene il codice cercato, sia che sia stato inserito il codice master o il secondario...
  • Re: Ricerca in 2 tabelle collegate

    Temo, tu non capisca molto bene cosa stai chiedendo..., anzi temo ti sfugga l'aspetto tecnico Relazionale di come funzionano le Form/SubForm coperte da Relazione Master/Detail.

    Facciamo un esempio, ed è l'ultimo tentativo.

    Se filtri i dati nella SubForm per Codice"XXX" verrà applicato il criterio inserito che è in AND con il Campo Relazionato Master/Secondario ovvero quello di Relazione, inq uanto nella SubForm visualizzi SOLO i Record lato MOLTI aventi come rispetto la PK lato 1.

    Quindi come dire che la SubForm ha 2 Criteri... (CampoSecondario=CampoMasyer=1) AND Codice="XXXX"

    Quando poi dalla Form principale Sposti Record, aggiorni la SubForm con i 2 Criteri Master(Pk)/Codice="XXXX"... e così ad ogni spostamento record.

    Se filtri invece la Form andrai a filtrare i dati della sola Form in cui hai Codice="XXX".

    Vuoi ottenere tutto...? Allora serve un'altra modalità di visualizzazione o meglio di Origine dei Records, fatta con una Query che contempli on OR il criterio sul campo lato 1 e sul campo lato Molti, ma non è così nella modalità Master/Detail che stai usando.
  • Re: Ricerca in 2 tabelle collegate

    Ho raggiunto la meta dopo un pò di tentativi e ragionamenti e qualche capello perso... in pratica:
    1) sulla form principale ho posizionato un controllo non associato di tipo textbox chiamato CERCACODICE
    2) ho creato una query di union "cercacorrispondenze" tra le tue tabelle in questione in modo da ottenere l'elenco dei codici master nel primo campo ed i relativi codici secondari nel secondo campo ed aggiungendo in più il record che contiene per entrambi i campi anche il codice master :
    
    SELECT Articoli.codice as master, Inner.Codice as codice
    FROM Articoli INNER JOIN [Inner] ON Articoli.ID = Inner.Unione
    WHERE inner.codice=[Forms]![Articoli]![cercacodice]
    UNION select articoli.codice as master, articoli.codice as codice
    from articoli
    where codice=[Forms]![Articoli]![cercacodice];
    
    3) sulla form principale, vicino alla textbox CERCACODICE, ho messo un pulsante con il seguente codice sull'evento click (potevo anche metterlo nell'evento dopo aggioramento della textbox):
    
    Dim corrispondenza As Variant
    corrispondenza = DLookup("master", "cercacorrispondenze")
    Me.Codice.SetFocus
    DoCmd.FindRecord corrispondenza, acStart, True, acSearchAll, , acCurrent, True
    
    Il codice funziona bene anche se va perfezionato in quanto al momento non viene gestita la casistica che il codice inserito non esista.
  • Re: Ricerca in 2 tabelle collegate

    Se fai query così ed accedi ad un HOST nel WEB, come hai spiegato nell'altro POST, direi che stai facendo una cosa per nulla funzionale ed ovviamente le prestazioni sono pessime.
    SELECT Articoli.codice as master, Inner.Codice as codice
    FROM Articoli INNER JOIN [Inner] ON Articoli.ID = Inner.Unione
    WHERE inner.codice=[Forms]![Articoli]![cercacodice]
    UNION select articoli.codice as master, articoli.codice as codice
    from articoli
    where codice=[Forms]![Articoli]![cercacodice];
    Se il DB SERVER è come dici, MySQL, ti sei chiesto come fa il Server di MySQL a risolvere la WHERE
    
    WHERE inner.codice=[Forms]![Articoli]![cercacodice]
    La risposta è che non lo risolve... e ti sei chiesto cosa accade quando non viene risolto...?
    Devi approfondire il tema tecnico.
  • Re: Ricerca in 2 tabelle collegate

    @Alex ha scritto:


    ... e ti sei chiesto cosa accade quando non viene risolto...?
    Devi approfondire il tema tecnico.
    ho letto proprio in questi giorni le problematiche relative all'uso di DB remoti come nel mio caso.
    da quello che ho inteso da una lettura veloce, nel caso specifico, il WHERE non viene interpretato, viene elaborato il codice fino al WHERE ed il resto del codice viene poi eseguito comunque da access con conseguente rallentamento del tutto.
    Dovrei utilizzare una query pass-through parametrica per far si che mysql esegua tutta la query e migliorarne le prestazioni, ed essendo la prima volta che lavoro con questa tipologia di dati, sto cercando di recuperare materiale in merito per capirne bene il funzionamento...
    approfitto per chiederti se hai qualche link o altro materiale da suggerirmi.
    grazie
  • Re: Ricerca in 2 tabelle collegate

    Direi che hai letto male... o non hai una visione chiara della cosa.
    Le Query di tipo PassTrought, vengono passate al Server ma sono in ReadOnly, ma se tu passi al Server quella che hai scritto ti fa le pernacchie...!

    L'errore che hai commesso è inserire nel predicato SQL un riferimento ad un'ogegtto del Client che per consentire al motore di risolvere la query deve risolverne il Valore...!
    SELECT Articoli.codice as master, Inner.Codice as codice
    FROM Articoli INNER JOIN [Inner] ON Articoli.ID = Inner.Unione
    WHERE inner.codice=[Forms]![Articoli]![cercacodice]
    UNION select articoli.codice as master, articoli.codice as codice
    from articoli
    where codice=[Forms]![Articoli]![cercacodice];
    Come vedi hai nel predicato ben 2 Riferimenti a 2 Oggetti del Client di Access che non hanno nulla in comune con quanto il motore del DB riesce a capire...!
    Serve in questi casi sfruttare il DRIVER e passare al Server il predicato SQL già risolto.
    Hai 2 Opzioni:
    Query Parametrica, quindi passi il parametro come Valore e non come Oggetto
    
    PARAMETERS pCodice Long;
    SELECT Articoli.codice as master, Inner.Codice as codice
    FROM Articoli INNER JOIN [Inner] ON Articoli.ID = Inner.Unione
    WHERE inner.codice=[pCodice]
    UNION select articoli.codice as master, articoli.codice as codice
    from articoli
    where codice=[pCodice];
    Quindi apri la Query come Recordset valorizzando il parametro la puoi poi assegnare alla Form o LisBox.
    
    Set Me.Recordset=TuoRecordset
    Oppure la costruisci
    
    Dim qdf As DAO.Recordset
    Dim sSQL As String
    sSQL="SELECT * FROM T1 WHERE Codice=" & [Forms]![Articoli]![cercacodice]
    CurrentDb.QueryDefs("Q1").SQL=sSQL
    In questo modo il predicato SQL non contiene l'oggetto ma il suo valore che viene risolto dal VBA ricavando il valore dall'oggetto Client e concatenando la Stringa del predicato SQL.

    Buona lettura.
Devi accedere o registrarti per scrivere nel forum
13 risposte