Query di aggiornamento...

di il
16 risposte

Query di aggiornamento...

Principiante...sorry...
Ho due tabelle A (ID_FK, LOTTO) e B (ID_FK, Prodotto, LOTTO, ID_SK) relazionate uno a molti..
Nella tabella A il LOTTO dovrà essere sempre aggiornato al valore del LOTTO della tabella B (quando variato)...
Il mio problema è che nella tabella B ho due 'Prodotto' che seguono progressivamente lo stesso LOTTO aumentato di un unità...mi spiego meglio...
Esempio: oggi nella tabella B digito il 'Prodotto' X e mi segna LOTTO=35 (il 35 l'ho creato in automatico con funzione Dlookup +1 dalla tabella A)
ma se domani invece digito il prodotto Y....come faccio a dirgli di mettermi in automatico 36???
Allora io ho provato a fare diverse query con funzione Max ...quella che mi sembrava più logica era questa qui sotto ma sempre il solito errore...della funzione di aggregazione...se qualcuno mi dice da dove ripartire...grazie

UPDATE TABELLA_A INNER JOIN TABELLA_B ON TABELLA_A.ID = TABELLA_B.SK SET TABELLA_B.LOTTO = Max([TABELLA_B].[LOTTO])
WHERE (([TABELLA_B].[SK]=[TABELLA_A].[ID]));

16 Risposte

  • Re: Query di aggiornamento...

    Gian63 ha scritto:


    Ho due tabelle A (ID_FK, LOTTO) e B (ID_FK, Prodotto, LOTTO, ID_SK) relazionate uno a molti..
    1. Piuttosto che chiamare le tabelle A e B, meglio chiamarle esplicitamente al plurale (credo) Lotti e Prodotti.
    2. La relazione sarebbe ID_FK uno-a-molti ID_SK? Infelici denominazioni dei campi chiave: se il primo e l'ultimo sono rispettivamente ChiavePrimaria=PK e ChiaveEsterna=FK andrebbero denominati IDLotto entrambi, oppure PkLotto e FkLotto.
    3. Nel momento in cui hai già il campo chiave che provvede ad aggiornare i valori "a monte" della tabella MADRE Lotti, non ti serve il campo Prodotti.Lotto (ossia B.Lotto).
  • Re: Query di aggiornamento...

    Porti pazienza...speravo che la premessa di dire che sono un principiante bastasse a lenire le sue giuste sgridate al sottoscritto...comunque sia...
    Tabella_A='Prodotti'
    Tabella_B='Lotti'
    Si! La relazione ID_FK o ID_PK è relazionata con ID_SK (chiave esterna)
    Cercherò di spiegarmi ancora (quanto mi è difficile...)...farò finta di partire da zero.
    Nella tabella Prodotti i Lotti di X e Y saranno a 0
    Nella tabella Lotti quando vado ad inserire uno dei prodotti X o Y nel campo Lotto della stessa tabella Lotti automaticamente tramite la funzione (Dlookup...+1) andrà ad aggiornarsi a 1
    Da quel momento dovrei ad andare ad aggiornare nella tabella Prodotti nel campo Lotto per entrambi il valore 1 in modo tale che al successivo inserimento di qualsiasi dei prodotti X o Y nella tabella Lotti automaticamente il Lotto diventa 2
    Spero fortemente di essermi fatto capire...Grazie comunque della pazienza
  • Re: Query di aggiornamento...

    Credo di no.
    In ogni caso, nel momento in cui hai già il campo di relazione TabellaMadre uno-a-molti TabellaFiglia, non ti serve fare DLookup, query di aggiornamento e quant'altro.
  • Re: Query di aggiornamento...

    Mi rendo conto che la cosa piu' difficile per un principiante e' quello di spiegarsi...quindi cercando di essere il piu' sintetico possibile la premessa e' che la mia esigenza e' quella di aggiornare due campi (numerici) al valore massimo di uno dei due nella stessa tabella...
    Se mi da un indizio sulla partenza le sarei grato...perche' ho provato con la funzione Max ma evidententemente non riesco a dare i criteri giusti...me ne aggiorna sempre solo uno...sigh...
  • Re: Query di aggiornamento...

    Lo sai che ti sei imbattutto nell'utente più duro di comprendonio di tutto il forum? Allora, ho bisogno di una narrazione "a tutto campo".
    1. Ridescrivi in maniera coerente, con denominazioni campi più comprensibili (prima ti ho dato alcuni spunti), nomi propri di tutti i campi delle tabelle Prodotti e Lotti.
    2. Dimmi di nuovo tra quali campi c'è la relazione uno-a-molti.
    3. Rispiega tutto con i NUOVI nomi propri con almeno un esempio concreto con valori anche inventati che rendano l'idea anche a un non addetto ai tuoi lavori (per esempio io).
  • Re: Query di aggiornamento...

    Contentissimo di essermi imbattuto nell'utente piu' "duro" del forum...allora...
    1) Tabella 'Prodotti" relazionata con Tabella 'Lotti' con 1 a molti
    Tabella 'Prodotti' ha come PK= ID_Prodotto mentre Tabella 'Lotti' ha come SK=IDS_Prodotto
    Nella tabella 'Prodotti' ho due prodotti che nel campo 'Lotto_Progressivo' (numerico) dovranno sempre avere lo stesso valore....supponiamo che allo stato iniziale abbiano entrambi valore=0
    2) Nella tabella 'Lotti' ho un campo 'Ultimo_Lotto'
    Quando in questa tabella 'Lotti' vado a scegliere uno dei due Prodotti tramite la Sk=IDS_Prodotto attraverso una casella combinata ho creato un evento 'dopo aggiornamento' sulla stessa che mi va ad aggornare il campo 'Ultimo_Lotto' aumentato di 1 rispetto al relativo valore nella tabella 'Prodotti' nel campo 'Lotto_Progressivo"...
    Siamo al dunque sempre se ho risposto 'degnamente' alle tue sacrosante richieste...perdonami un po' di autoironia...
    Ora devo aggiornare anche l'altro prodotto nella tabella 'Prodotti' che non ho scelto nella tabella 'Lotti' allo stesso valore.
    Il problema e' dovuto al fatto che i 2 prodotti seguono 2 logistiche differenti ma devono seguire un lotto progressivo...esempio:
    Oggi mando via il Prodotto1 alla sua logistica e quindi il Lotto sara' =1
    Domani mando via sempre il Proditto1 alla sua logistica e quindi il lotto sara' =2
    Dopodomani invece mando via il prodotto2 all'altra logistica e quindi ecco che il Prodotto2 dovra' avere il Lotto =3
    A precindere dei due prodotti che mando via il lotto dovra' sempre seguire un numero progressivo aumentato di 1...
    Chissa' se stavolto saro' riuscito a spiegarmi...sob
  • Re: Query di aggiornamento...

    Non mi hai RI-ELENCATO tutti i campi di entrambe le tabelle: IMPORTANTISSIMO.
    Perché Prodotti ha solo 2 record-prodotti?
    Da dove spunta il campo Lotto_Progressivo che in precedenza non lo avevi mai nominato?
    Cosa devi gestire VERAMENTE? Ti avevo chiesto di fare un esempio con valori concreti: esempio Prodotto=Matita...poi non capisco cosa deve succedere…
  • Re: Query di aggiornamento...

    Devo riconoscere che hai una pazienza infinita...Grazie a prescindere di quello che sarà il risultato...allora...
    Tabella 'Prodotti'
    Campi: PK=ID_Prodotto (contatore), Descrizione_Prodotto (Testo breve), Codice_Prodotto (Testo breve), Lotto_Progressivo (Numerico)
    Tabella 'Lotti'
    Campi: SK=IDS_Prodotto (Numerico), ID_Lotto=PK (Contatore), Ultimo_Lotto (Numerico), Quantita (Numerico), Lotto_Ordinario (Testo breve)
    Nella tabella prodotti ho circa 350 prodotti di cui solo 2 devono seguire il lotto progressivo infatti il campo Lotto_Progressivo nella tabella prodotti viene utilizzato solo per quei 2 prodotti ...gli altri utilizzano un Lotto che sarà inserito di volta in volta nel campo Lotto_ordinario della tabella Lotti e che non necessitano di un Lotto Progressivo
    Come già spiegato appena seleziono uno dei 2 prodotti (che necessitano di un Lotto Progressivo) attraverso la SK=IDS_Prodotto con casella combinata, ho creato un evento che tramite funzione Dlookup mi va a vedere il Lotto_Progressivo nella tabella Prodotti di quei 2 prodotti e nel campo Ultimo_Lotto della tabella Lotti me lo aumenta di una unità come descritto qui sotto:
    Me.Testo31 = DLookup("Lotto_Progressivo", "Prodotti", "ID_Prodotto=" & IDS_Prodotto) + 1
    Il tutto da maschera Lotti...ovvio..!
    Il tutto funzionerebbe bene se poi riuscissi ad aggiornare nella tabella Prodotti con lo stesso Lotto il Prodotto non scelto in modo tale che qualsiasi dei due prodotti scelti in futuro potranno seguire un Lotto progressivo sempre aumentato di una unità...
    Esempio:Nella Tabella Prodotti ho Vaso 250g di Giardiniera. Vaso 350g di peperoni sott'Olio, Vaso 750g di Pomodori Secchi
    Premessa: Vaso 250g di Giardiniera e Vaso 350g di peperoni sott'Olio devono seguire un Lotto Progressivo mentre Vaso 750g di Pomodori Secchi e tutti gli altri NO...
    Quindi al primo uso del database imposto il Lotto_Progressivo dei Vaso 250g di Giardiniera e Vaso 350g di peperoni sott'Olio a 0
    Nel'esmpio qui sotto quando dico "Vendo" intendo che vado a popolare la tabella (con sua maschera) Lotti
    - Oggi vendo 6 Vaso 250g di Giardiniera...quindi nella tabella Lotti automaticamente (tramite la funzione Dlookup) il campo 'Ultimo_Lotto si aggiorna a 1
    - Dopo tre ore ancora Vendo 6 Vaso 250g di Giardiniera e quindi il campo 'Ultimo_Lotto si aggiornerà 2
    - Dopo cinque ore invece Vendo 12 Vaso 350g di peperoni sott'Olio e quindi il campo 'Ultimo_Lotto' dovrà aggiornarsi a 3
    Quindi è implicito che qualsiasi dei 2 prodotti che seguono il lotto progressivo devono essere costantemente aggiornati allo stesso numero di Lotto nel campo Lotto_Progressivo della Tabella Prodotti proprio perchè qualsiasi dei due prodotti verranno scelti alla vendita successiva, nel campo 'Ultimo_Lotto' sarà sempre aumentato di uno...
    Io riesco ad aggiornare solo quello scelto...e non entrambi...
    Tutto questo mi serve per stampare le etichette (con un lotto progressivo) che andranno sul cartone di spedizione che è poi una richiesta specifica del cliente...
    Spero di esser stato maggiormente esaudiente...Grazie
  • Re: Query di aggiornamento...

    Le tabelle devono tracciare dati "univoci" e "omogenei". In Prodotti non deve apparire più volte il "Vaso 250g di Giardiniera". Il campo LottoProgressivo non deve stare lì. Ti mancano altre tabelle. Sicuramente hai bisogno di una tabella Movimenti dove tracci se il tale Prodotto viene Acquistato (o Entrata) o Venduto (o Uscita). Tutte le altre considerazioni cambiano di prospettiva, quindi anche il resto del discorso che, impostato come dici, non ha senso.
  • Re: Query di aggiornamento...

    Vorrei sapere dove avrei scritto che Vaso Giardiniera 250g l'avrei scritto 2 volte in tabella Prodotti...ho riletto ma non ho trovato traccia di cio' che affermi...la Tabella Lotti ha di per se una funzione Movimenti...che se non fosse per quei due Prodotti funziona benissimo...mi sa che non riesco a spiegarmi bene...pazienza...mi chiedo pero' come non sia possibile aggiornare due campi (invece che uno solo) con magari una funzione Max...anche perche' pur usando una Tabella di comodo (molti a molti) credo che il problema me lo ritroverei comunque...
  • Re: Query di aggiornamento...

    A riprova di quello che affermo il campo Descrizione_Prodotto in Tabella Prodotti lho indicizzato con Valori duplicati non ammessi...
  • Re: Query di aggiornamento...

    Gian63 ha scritto:


    Come già spiegato appena seleziono uno dei 2 prodotti (che necessitano di un Lotto Progressivo) attraverso la SK=IDS_Prodotto con casella combinata, ho creato un evento che tramite funzione Dlookup mi va a vedere il Lotto_Progressivo nella tabella Prodotti di quei 2 prodotti e nel campo Ultimo_Lotto della tabella Lotti me lo aumenta di una unità come descritto qui sotto:
    Me.Testo31 = DLookup("Lotto_Progressivo", "Prodotti", "ID_Prodotto=" & IDS_Prodotto) + 1

    Gian63 ha scritto:


    Quindi al primo uso del database imposto il Lotto_Progressivo dei Vaso 250g di Giardiniera e Vaso 350g di peperoni sott'Olio a 0
    Per me è errato pensare questa cosa così.

    Gian63 ha scritto:


    Vorrei sapere dove avrei scritto che Vaso Giardiniera 250g l'avrei scritto 2 volte in tabella Prodotti...ho riletto ma non ho trovato traccia di cio' che affermi

    Gian63 ha scritto:


    il campo Descrizione_Prodotto in Tabella Prodotti lho indicizzato con Valori duplicati non ammessi...
    D'accordo, ma...

    Gian63 ha scritto:


    la Tabella Lotti ha di per se una funzione Movimenti.
    Non ti serve una funzione Movimenti, ma una TABELLA Movimenti. Qui tu DEVI TRACCIARLI.
    Il campo UltimoLotto ha il sapore di un RISULTATO e non di un DATO "primordiale". Queste cose si gestiscono con le query e non si tracciano dentro le tabelle.

    Ho capito che il tuo scopo finale è quello delle ETICHETTE...ma mi sembra strano che non voglia tenere traccia di tutto lo STORICO Movimenti. In assenza di questa tabella, per me risulta troppo complicato o impossibile gestire il tutto.
  • Re: Query di aggiornamento...

    [Gian63], risulta evidente che non hai le idee chiare di come si gestiscono i Dati, le Relazioni tra le Tabelle e di conseguenza l'estrapolazione dei dati, lo dimostra l'uso assolutamente inopportuno, di conseguenza ERRATO, del Dlookup utilizzato.
    Ovviamente può funzionare, ma significa che non hai capito come funzionano le Queries....

    Quindi, a prescindere dal probabile miglioramento necessario nella struttura, devi eliminare quel DlookUp, e sfruttare l'AutoLookup che consentono le Queries attraverso i JOIN.

    Quì trovi una descrizione di come sfruttare l'AutoLookup:
    https://www.techrepublic.com/article/create-an-autolookup-query-in-microsoft-access/
  • Re: Query di aggiornamento...

    Che sia un principiante l'ho premesso all'inizio dell'argomento...tuttavia il database (di etichettatura prodotti) che fino ad ora ho progettato funziona benissimo per le esigenze aziendali. Un database che contiene 32 Tabelle, 25 queries, 16 maschere, 6 report e 7 macro...ora son sicuro che ognuno di voi l'avrebbe fatto sicuramente meglio e più leggero...ma io mi son "difeso" con le mie conoscenze...
    Speravo in un input su come gestire un Lotto progressivo su due prodotti...o per farla breve come aggiornare due campi in una tabella con un dato da un'altra...ma prima o poi senza dover stravolgere le relazioni tra tabelle ci riuscirò...Grazie comunque
Devi accedere o registrarti per scrivere nel forum
16 risposte