Access errore query basata su query raggruppamento con campi calcolati.

Anonimo
2022-12-15T03:59:51+00:00

Buongiorno a tutti.

Premesso che in Access sono autodidatta da un paio di anni, con scarse conoscenze di VBA, e anche un po' lento a capire (sarà per letà - ma questa è unaltra storia..), di seguito cercherò di esporvi il mio problema nel modo più chiaro che posso e ovviamente cercando di rispettare 'Netiquette' e quant'altro.

Mi scuso in anticipo per eventuali miei errori/mancanze.

Scenario: Negozio di vino, nello specifico sto cercando di implementare in Access il calcolo/gestione dei vari costi legati all`acquisto dei vini.

Il problema attuale è una query in cui la somma di tre campi (di altre query) da errore quando manca anche uno solo dei tre addendi.

Nellimmagine seguente spero di far capire comé impostata la query:

La query Prodotti.... è una query semplice che elenca Tutti i vari vini con alcuni dati fondamentali (basata su tre tabelle- non ha campi calcolati).

Le altre tre query (CMparz1/2/3....) sono query di raggruppamento, ognuna basata su una tabella, che calcolano il totale di alcuni costi (hanno anche campi calcolati).

Queste tre query hanno meno record della query Prodotti... perchè non tutti i prodotti hanno le stesse voci di costo.

Nella query in questione vorrei quindi sommare i tre parziali (CMparz1/2/3....) per avere il costo totale magazzino (CM_Tot).

Il problema è che la query restituisce errore per quei record dove manca anche uno solo dei tre addendi:

Ho provato a risolvere il problema con NZ ma l`errore rimane.

Ho provato anche gestire lerrore con Iff (IsError(....., IsNull e altri ma niente, lerrore persiste.

Ho provate anche a non utilizzare le tre tabelle dei parziali e fare il conto con DSum ma il problema, per quei record dove manca anche un solo addendo, resta.

La soluzione forse potrebbe essere nel modificare le tre query dei parziali, facendo in modo che restituiscano tutti i vini. compreso quei vini dove non ci sono i costi parziali (restituendo quindi zero), ma non mi sembra la soluzione logica (col tempo ci sarebbero centinaia di record con campi vuoti).

Penso che mi sfugga qualche concetto base! :(

Qualche suggerimento?

Grazie in anticipo per la pazienza.

Buona giornata.

Enrico.

Microsoft 365 e Office | Access | Per la casa | Windows

Domanda bloccata. Questa domanda è stata eseguita dalla community del supporto tecnico Microsoft. È possibile votare se è utile, ma non è possibile aggiungere commenti o risposte o seguire la domanda.

0 commenti Nessun commento

4 risposte

Ordina per: Più utili
  1. Anonimo
    2022-12-16T08:57:12+00:00

    Grazie per la disponibilità carletto1 ma per ora non credo sia necessario postare il DB, ho risolto nel modo seguente:

    In pratica prima di recuperare il dato che mi serve verifico, su entrambe le query interessate, che il campo che le mette in relazione non sia nullo (e quindi il record esiste).

    Verifica1: IsNull([CMprz1_RmbCarico_Prodotti_qyRagg]![Id_Prodotto]) 'NB per questo parametro verifico solo su una query perchè sull'altra query (Prodotti...) certamente cé lID prodotto (chiave primaria).

    Verifica2: IsNull([Prodotti_Acq_Elenco_qy]![PK_Ordine_aFornitore])+IsNull([Prodotti_Acq_Elenco_qy]![PK_Ordine_aFornitore])

    Verifica3: IsNull([Prodotti_Acq_Elenco_qy]![EK_Rifornimento])+IsNull([CMprz3_RmbCarico_Rifornim_qyRagg]![ID_Rifornimento])

    in questo modo ho verificato che i tre controlli funzionassero e quindi li ho poi combinati con IIf in una sola formula per trovare e sommare i tre parziali:

    CM: IIf(IsNull([CMprz1_RmbCarico_Prodotti_qyRagg]![Id_Prodotto]);0;[CMprz1_RmbCarico_Prodotti_qyRagg]![CMparz1_RmbUnitProdotto])+IIf(IsNull([Prodotti_Acq_Elenco_qy]![PK_Ordine_aFornitore])+IsNull([Prodotti_Acq_Elenco_qy]![PK_Ordine_aFornitore])<>0;0;[CMprz2_RmbCarico_OrdFornit_qyRagg]![CMparz2_RmbUnitOrdine])+IIf(IsNull([Prodotti_Acq_Elenco_qy]![EK_Rifornimento])+IsNull([CMprz3_RmbCarico_Rifornim_qyRagg]![ID_Rifornimento])<>0;0;[CMprz3_RmbCarico_Rifornim_qyRagg]![CMparz3_RmbUnitRifornim])

    (NB: ho colorato diversamente le tre verifiche sperando di rendere la formula più leggibile)

    Questo il risultato:

    In questo modo il mio costo a magazzino (CM) non va mai in errore e posso proseguire col mio lavoro (le tre colonne di verifica posso anche cancellarle).

    Certo mi piacerebbe anche capire perché nelle formule precedenti IsError e Nz non hanno funzionato....

    Grazie ancora per la disponibilità carletto1 e ovviamente sono sempre ben accetti altri suggerimenti/indicazioni.

    Buona giornata.

    Enrico.

    La risposta è stata utile?

    0 commenti Nessun commento
  2. Anonimo
    2022-12-16T07:28:04+00:00

    La cosa più rapida e sicura per risolvere il problema è avere una copia del database, con un minimo di dati sostituendo quelli aventualmente sensibili.

    La risposta è stata utile?

    0 commenti Nessun commento
  3. Anonimo
    2022-12-16T02:51:29+00:00

    Buongiorno Carletto1

    Intanto grazie per la risposta e i suggerimenti.

    Ho provato vari modi ma non funzionano.

    Alcuni esempi:

    CMparz1: Nz([CMparz1_RmbUnitProdotto];0)

    CMparz2: Nz([CMparz2_RmbUnitOrdine];0)

    CMparz3: Nz([CMparz3_RmbUnitRifornim];0)

    CM1: Nz([CMparz1];0)+Nz([CMparz2];0)+Nz([CMparz3];0)

    CM2: IIf(IsError([CMparz1]+[CMparz2]+[CMparz3]);0;[CMparz1]+[CMparz2]+[CMparz3])

    CM3: IIf(IsNull([CMparz1]);0;[CMparz1])+IIf(IsNull([CMparz2]);0;[CMparz2])+IIf(IsNull([CMparz3]);0;[CMparz3])

    Questo il risultato:

    Non capisco molte cose tra cui:

    1. Perchè CM1 non funziona neanche laddove ci sono tutti e tre gli addendi (record in verde).
    2. CM2 funziona dove ci sono i tutti i tre addendi, ma perchè poi restituisce errore e non 0 (zero)?
    3. Perchè CMparz1/2/3 non restituiscono 0 (zero) laddove non esiste il record (NZ non funziona???).
    4. Stesso dubbio per CM3, IsNull non funziona?

    Il filtro che suggerisci non serve perché in realtà cé sulla query Prodotti_Acq_Elenco, questa quey filtra solo i prodotti acquistati, quindi almeno uno dei tre addendi cè.

    Altre indicazioni?

    Grazie e buona giornata.

    Enrico.

    La risposta è stata utile?

    0 commenti Nessun commento
  4. Anonimo
    2022-12-15T08:41:32+00:00

    Purtropo non si leggono tutte le colonne della query per cui sono costretto a scrivere parzialmente, puoi provare effettuando le seguenti modifiche nella query CMb_qy sono :

    • CMparz1:Nz(CMparz1_R...,0)
    • CMparz2:Nz(CMparz2_R...,0)
    • CMparz3:Nz(CMparz3_R...,0)
    • CM_Tot:CMparz1+CMparz2+CMparz3

    inoltre, secondo me dovresti inserire un filtro che non ti faccia vedere i movimenti dove non ci sono parziali per nussuna delle tre query :

    WHERE IsNull(CMparz1_R...) AND IsNull(CMparz2_R...) AND IsNull(CMparz3_R...)

    La risposta è stata utile?

    0 commenti Nessun commento