Newsgroup: it.comp.appl.access
Titolo: Consuntivo materiali usati con una sola query

Secondo me non se po fa, però, sia mai che qualcuno più scafato sul SQL
trova una soluzione.
Ho una tabella in cui salvo le transazioni eseguite su un magazzino di
ricambi; ho previsto un numero di campi minimo per salvare i dati di
qualunque transazione nella stessa tabella. Tra di esse ci sono le uscite e
i resi. Entrambe queste transazioni usano un campo per salvare il numero di
Ordine di Lavoro (OdL): infatti, a fronte di un certo OdL, viene prelevato
del materiale per eseguire il lavoro, ma una parte potrebbe essere
restituita.
Devo cercare la quantità di materiale usata veramente per un certo OdL.
La soluzione che ho trovato è quella di due tabelle d'appoggio intermedie.
In essa prima di tutto sbatto il codice materiale e la quantità uscita, per
i record con tipologia USCITA e OdL desiderato, della tabella transazioni.
Nel far questo raggruppo per codice materiale e sommo le quantità uscite,
visto che ci potrebbero essere più transazioni con tipologia USCITA per quel
materiale e per quel OdL.
Poi creo un'altra tabella intermedia, in maniera analoga alla precedente, ma
per le transazioni con tipologia RESO. Anche in questo caso quindi raggruppo
per codice materiale e sommo le quantità rese.
Successivamente lego le due tab intermedie con una left join sul campo
codice materiale e creo un campo calcolato nella query facendo la
sottrazione tra la quantità uscita e l'
nz(quantità_resa;0) in modo da avere il consuntivo del materiale usato.
C'è un modo per fare tutto questo con un'unica query, magari usando la
clausola IN o query innestate? A me non viene...
Antonio


Ciao Antonio,
ti premetto che non ho letto in maniera approfondita il tuo posto.
Da quello che ho capito tu hai questa tabella che ti registra i movimenti.
Ogni movimento ha una causale.
Prima osservazione: č possibile trascodificare questa causale con un segno +
o -?
Consumo o reso, qualcosa del genere?
Se sě allora
(nomi inventati)
select
  OdL
 ,Materiale
 ,iif(COD_CAUSALE = "RESO";-1;1) as Segno
 ,Sum (Segno * Quantita)
from ...
where ...
GROUP BY
  OdL
 ,Materiale
Per il segno, l'ideale sarebbe una tabella che trascodifichi il codice con
il segno.
HTH
Michele Amato

(.....)

Ti rispondo di getto, senza averci pensato più di tanto, quindi ....
Io trasformerei la prima query in una query di selezione record; poi
trasformerei anche la seconda query in una query di selezione record,
modificandola in modo che la quantità sia restituita come valore
negativo.
A questo punto prenderei le due istruzioni SQL e le legheri tra loro
in una nuova query utilizzando la clausola UNION (di cui ti suggerisco
di consultare l'help). Questa query dovrebbe restituire raggruppati
per materiale sia le uscite sia i resi (con quantità <0) per un certo
odl.
Se non ricordo male (vedi comunque l'help) credo che si possa
raggruppare, ordinare e totalizzare le quantità anche all'interno di
una query di unione.
Se però non fosse possibile, questa query può diventare origine record
di un'altra query che raggruppa per materiale totalizzando le
quantità.
In conclusione, nella peggiore delle ipotesi, avresti due query
(quella con la UNION e quella di totalizzazione) invece di tre e
soprattutto non avresti più le tabelle temporanee.
Se funziona, fammi sapere, sono curioso !
Vincenzo Turturro
---------------------------------------------------------
Se no diventiamo tutti **** dai portatili o peggio ancora 
provetti poeti fiorentini come vturturro.
(Così disse Ivan Lelli Ven 25 Aug 2000 09:34:52 +0200)
---------------------------------------------
il sito comune di it.comp.appl.access:
http://www.sitocomune.com/
---------------------------------------------
... e quello di it.comp.as400:
http://www.faq400.com/
---------------------------------------------


--
Roberto
---------------------------------------------
il Sito Comune di it.comp.appl.access:
http://www.sitocomune.com
---------------------------------------------


Unifico la risposto per entrambi, premettendo che entrambe le soluzioni
funzionano.
Soluzione di Michele:
select OdL ,Materiale ,iif(COD_CAUSALE = "RESO";-1;1) as Segno ,Sum (Segno *
Quantita) from ... where ... GROUP BY OdL ,Materiale
Ho dovuto solo modificarla un pochino. Infatti segno non mi consente di
esprimerlo come espressione, ma mi costringe a metterlo come funzione di
raggruppamento. A quel punto i record di entrata e di uscita sono distinti e
non me li sottrae. Inoltre il valore della quantità uscita o rientrata non è
salvato nello stesso campo, ma in due distinti. Così invece va:
SELECT MATERIALE, ODL, Sum(IIf([causale]="reso",-[qta_resa],[QTA_USCITA]))
AS tot_usc FROM A_Transazioni WHERE ((CAUSALE)="reso" Or (CAUSALE)="uscita")
GROUP BY MATERIALE, ODL;
Soluzione di VT:
Io trasformerei la prima query in una query di selezione record; poi
trasformerei anche la seconda query in una query di selezione record,
modificandola in modo che la quantità sia restituita come valore
negativo.
E questo si fa facile.
VT: A questo punto prenderei le due istruzioni SQL e le legheri tra loro
in una nuova query utilizzando la clausola UNION (di cui ti suggerisco
di consultare l'help).
Questo non dovevi dirmelo... sigh... :-P
VT: Questa query dovrebbe restituire raggruppati per materiale sia le uscite
sia i resi (con quantità <0) per un certo odl.
Infatti è così.
VT: Se non ricordo male (vedi comunque l'help) credo che si possa
raggruppare, ordinare e totalizzare le quantità anche all'interno di
una query di unione.
L'help mi dice che si può fare, ma non da esempi e non ci sono riuscito.
VT:Se però non fosse possibile, questa query può diventare origine record
di un'altra query che raggruppa per materiale totalizzando le
quantità.
Questo infatti ha funzionato bene e la soluzione finale è stata:
Query di unione chiamata Q_unione:
SELECT MATERIALE, Sum(QTA_USCITA) AS tot, ODL FROM A_Transazioni
WHERE ((ODL="00000") AND (CAUSALE)="USCITA"))
GROUP BY MATERIALE, ODL UNION SELECT MATERIALE, Sum(-[QTA_ACCETTATA]) AS
tot, ODL FROM A_Transazioni
WHERE ((ODL="00000") AND (CAUSALE)="RESO"))
GROUP BY MATERIALE, ODL;
Query finale:
SELECT q_UNIONE.MATERIALE, Sum(q_UNIONE.tot) AS totalone, q_UNIONE.ODL
FROM q_UNIONE GROUP BY q_UNIONE.MATERIALE, q_UNIONE.ODL;
VT: In conclusione, nella peggiore delle ipotesi, avresti due query
(quella con la UNION e quella di totalizzazione) invece di tre e
soprattutto non avresti più le tabelle temporanee.
Infatti è proprio così. La soluzione di Michele però, usa solo una query ed
è un po' meno complicata e più intuitiva.
Grazie a tutti e due!
Antonio

 GROUP BY Transazioni.OdL, Transazioni.IDArticolo;
Sì, infatti alla fine è andata proprio così a parte il fatto che nella iif
prendo due campi diversi.
Antonio

 wrote in message
dILJ6.690$B87....@news.infostrada.it...


 wrote in message
dILJ6.690$B87....@news.infostrada.it...

Forse stò andando fuori tema ma io imposterei un'unica tabella che chiamerei
MOVIMENTI, ogni record conterrà una CAUSALE movimento (RES per reso, PRO per
produzione). In questo modo facendo sulla query terrai presente di sottrarre
i res e i pro
CIAO CIAO
SDAMY

 i res e i pro
Apprezzo il tuo interessamento...
ma la struttura del mio database è proprio quella, e l'avevo descritto....
Antonio

 ha scritto nel messaggio
news:YXSJ6.2945$B87.1...@news.infostrada.it...

Scusami, ma io stavo parlando con Antonio Biso e non con il suo clone.



Scusami !
Sai com'č .... l'abitudine .... melius abundare quam deficere ....
Vincenzo Turturro
---------------------------------------------------------
Se no diventiamo tutti **** dai portatili o peggio ancora 
provetti poeti fiorentini come vturturro.
(Cosě disse Ivan Lelli Ven 25 Aug 2000 09:34:52 +0200)
