Newsgroup: it.comp.lang.visual-basic
Titolo: [?] query incrociata

Ciao, scusate se ogni tanto salto fuori con le mie belle query ma.....;-)
ho 2 tabelle:
in una ci sono una serie di record che rappresentano il dettaglio di alcuni
articoli presenti in un magazzino, nell'altra un elenco di quantità di ogni
articolo necessarie per una determinata lavorazione.
Nella seconda tabella c'è 1 record per ogni articolo che ha un campo per
specificare la quantità.
Per esempio potrei avere 3 record dell'articolo '1' nella prima tabella e 1
record dello stesso articolo con quantità=3 nella seconda.
Ora dovrei creare una procedura di controllo batch dove, dato un id di
lavorazione (che è un campo della prima tabella, utile per raggruppare un
insieme di record), controllare se ci sono esattamente gli articoli
neccessari per quella lavorazione (seconda tabella), e visualizzare un
rapporto che indichi se ci sono più o meno articoli rispetto a quelli
necessari.
Quindi dovrei in qualche modo estrapolare i record in modo da evidenziare le
incongruenze (articoli che ci sono nella prima tabella ma non nella seconda,
articoli che ci sono nella seconda ma non nella prima e articoli che ci sono
in entrambe le tabelle ma non rispettano le quantità)...
Non credo sia possibile con una sola query, ma con 2 ci si dovrebbe
riuscire. Vorrei evitare di annidare cicli sui recordset se possibile.
sono sicuro che non avete capito un gran che.....
quindi chiedete pure :)
ciao e grazie

 quindi chiedete pure :)
non ho capito, riguardo alla tabella "magazzino", se hai già le quantità
presenti per ogni articolo.
--
Salutoni
Sergio
per rispondere... togli il group dall'indirizzo

 quantità presenti per ogni articolo.
in quella tabella ogni record corrisponde a 1 pezzo, mentre nell'altra è
specificata la quantità necessaria.
Esempio:
tab. "magazzino"
cod.A.    descrizione        Peso
1            FESA                50,3
1            FESA                43,6
1            FESA                51,7
2            GERETTO        23
2            GERETTO        26,3
tab. "ricette"
Cod.A    descrizione        Qta necessaria
1            FESA                4
2            FERA                2
in questo caso dovrei segnalare che manca 1 FESA in magazzino
ciaociao

 2            FERA                2
ops.. qui naturalmente era:
   2            GERETTO        2

 nell'altra è specificata la quantità necessaria.
ok, allora tramite un raggruppamento per descrizione e un count sull'id
dovresti ottenere la quantità presente a magazzino.
poi metti in join questa query con la tabella degli "ingredienti" richiesti,
con un left, e un iif che in caso di null metta un bello 0 nella colonna
delle quantità, poi metti anche la differenza.
non sono stato chiarissimo, ma qualcosa dovresti ottenere :-)


 non sono stato chiarissimo, ma qualcosa dovresti ottenere :-)
non sei stato chiarissimo, ma ho capito lo stesso....ora provo e ti dico se
mi/ci è sfuggito qualcosa ;-)
ciaociao

 ciaociao

 sono articoli mancanti in magazzino, no?
no, penso che con una risolvi il tutto.
ho fatto una query che si chiama magazzino raggruppato con questo sql:
SELECT magazzino.descrizione, Count(
magazzino.id
) AS ConteggioDiid
FROM magazzino
GROUP BY magazzino.descrizione;
poi ho fatto quest'altra query:
SELECT ricetta.descrizione, ricetta.quantità,
IIf(IsNull([ConteggioDiid]),0,[conteggiodiid]) AS presente,
[presente]-[quantità] AS Differenza
FROM [magazzino raggruppato] RIGHT JOIN ricetta ON [magazzino
raggruppato].descrizione = ricetta.descrizione;
l'idea, a parte che la tabella "ricetta" contiene una sola ricetta, dovrebbe
essere quella


[*Marg* = 
ke...@inwind.it
 in
news:br6m6n$29fhhb$
1...@ID-193795.news.uni-berlin.de
] ha scritto:
Mi pare che funzioni per la presenza di coda in entrambe le tabelle e per la
presenza nella tabella magazzino, ma l'assenza nella tabella ricette. Per
verificare anche la presenza nella tabella ricette, ma non nella tabella
magazzino credo che serva un'altra query, praticamente cambiando (e
adeguando il resto specularmente) il From marg_mag in From marg_ric.
I vari IsNull sono messi per, appunto, considerare 0 le assenze, tranne che
per qta per la quale ho posto un convenzionale -1 a indicare che l'articolo
coda è presente in tabella magazzino ma non in tabella ricette.
Select
 marg_mag.coda,
 marg_mag.des,
 count(*) as nrec,
 iif(isnull((select qta from marg_ric where
marg_ric.coda=marg_mag.coda)),-1,(select qta from marg_ric where
marg_ric.coda=marg_mag.coda)) as qta,
iif(
isnull((select qta from marg_ric where
marg_ric.coda=marg_mag.coda)-count(*)),count(*), (select qta from marg_ric
where marg_ric.coda=marg_mag.coda)-count(*)) as assente
 from
 marg_mag
 group by marg_mag.coda, marg_mag.des
 order by marg_mag.coda

 raggruppato].descrizione = ricetta.descrizione;
ahh, tu fisicamente salvi la vista nel db! Poi la utilizzi nella seconda
query, giusto?
Io intendevo in un'unica sql...
ciaociao

  order by marg_mag.coda
mmm...cosě a occhio sembra buona...ora provo ad adattarla e ti dico.
nel frattempo sto anche utilizzando un altro metodo che mi č comodo anche
per altre cose, a fra poco per il verdeto finale! ;-)
ciao Lupo e grazie

 Io intendevo in un'unica sql...
forse è possibile, ma travalica le mie competenze


 mmm...cosě a occhio sembra buona...ora provo ad adattarla e ti dico.
a parte il fatto che in SQL server la iif non esiste....
mi sono scritto tutta la query prima di ricordarmelo! .....che pirla :(
ora riscrivo...a dopo
ciaociao

 forse è possibile, ma travalica le mie competenze
infatti dovrebbe funzionare quella di Lupo, anche se adesso devo adattarla
con i CASE WHEN di SQL.
ciaociao

 ora riscrivo...a dopo
MITICO LUPO!
ecco la query riadattata per SQL e perfettamente funzionante:
Select plu,descrizione,count(plu) as nrec,
 (case when (select n_pezzi from ricette where
ricette.cod_a=dettaglio_lotti.plu) is null
 then -1
       when not (select n_pezzi from ricette where
ricette.cod_a=dettaglio_lotti.plu) is null
 then (select n_pezzi from ricette where ricette.cod_a=dettaglio_lotti.plu)
END) as qta,
 (case when ((select n_pezzi from ricette where
ricette.cod_a=dettaglio_lotti.plu)-count(*)) is null
 then count(*)
       when not ((select n_pezzi from ricette where
ricette.cod_a=dettaglio_lotti.plu)-count(*)) is null
 then ((select n_pezzi from ricette where
ricette.cod_a=dettaglio_lotti.plu)-count(*))END) as assente
from dettaglio_lotti
where dettaglio_lotti.cartone=450008 and dettaglio_lotti.anno=2003
group by dettaglio_lotti.plu, dettaglio_lotti.descrizione
order by dettaglio_lotti.plu
con i case when è un po' meno leggibile ma va alla grande!
grazie ancora
ciaociao

 con i case when è un po' meno leggibile ma va alla grande!
ora la faccio al contrario per ricavare quelli che ci sono in magazzino ma
non nella ricetta......
anche se avevo fatto una funzioncina che non mi dispiaceva....
ciaociao