Newsgroup: it.comp.lang.visual-basic
Titolo: [forse OT] Query ricerca dati in determinati campi

Salve a tutti.
E' una domanda che ho posto su it.comp.appl.access ma magari qui tra di voi
potrò avere più risposte.
Ho una tabella strutturata con i seguenti campi:
ID
Data
Lavoro1
Quantità1
Lavoro2
Quantità2
Lavoro3
Quantità3
Lavoro4
Quantità4
...
fino ad arrivare a Lavoro20 e Quantità20
La query che vorrei fare ma dove trovo difficoltà è la seguente:
vorrei, attraverso l'immisione di un parametro per il campo Lavoro, trovare
la data e la quantità. La query dovrebbe restituire la quantità1 se il
parametro è stato trovato nel campo Lavoro1 oppure dovrebbe restituire la
quantità2 se il parametro è stato trovato nel campo Lavoro2 e così via fino
al campo Lavoro20. E' possibile effettuare una ricerca del genere?
Ringrazio tutti per l'attenzione.
--
Mattia un pò meno stacanovista...


La struttura che utilizzi ha un senso solamente se ciò che inserisci in
'Lavoro1' non può essere inserito in 'Lavoro2'.
Se, invece, i valori che assume Lavoro1 e Lavoro2 possono essere uguali, ti
sei incastrato in un disastro logico.
Supponiamo ad esempio che in 'Lavoro1' tu inserisca il codice dell'operatore
che effettua tale lavoro.
Ma lo stesso codice può essere inserito anche in Lavoro2, perchè
teoricamente l'operatore può essere lo stesso.
Poi tu vuoi estrarre i lavori eseguiti dall'operatore x.
E qui siamo incastrati definitivamente.
Una struttura molto più 'utile', in questo caso, sarebbe stata:
TB_Lavori: Id_Lavoro, Descrizione
TB_Operatori: Id_Operatore, Descrizione
TB_Prodotti: Id_Prodotto, Descrizione
TB_Elementi: ID_Elemento, Data, ID_Prodotto, Id_Operatore, Id_Lavoro,
Quantità
Ecco che per estrarre tutto ciò che concerne un operatore, o una certa
lavorazione, bastava una query semplice semplice su una singola tabella.
Se per Lavoro1, Lavoro2, Lavoro20, intendi invece una 'sequenza' delle
operazioni, addirittura la cosa si semplifica, perchè basta mettere un campo
'Posizione_in_Sequenza' nella tabella degli elementi, e puoi omettere la
TB_Lavori e relativo Id nella tabella degli elementi.
Il massimo della inadeguatezza della tua struttura, inoltre, l'avresti nel
caso che qualche elemento non subisca tutte le 20 lavorazioni, perchè in tal
caso oltre alla complessità della struttura, avresti anche uno spreco di
spazio (e quindi di performance...) assolutamente inutile.
ciao
Alberto

"Mattia" <br...@NOSPAM.it> ha scritto nel messaggio
news:c07m6b$d85$1...@newsread.albacom.net...

Attraverso codice dovrebbe essere fattibile.
La butto al volo
1-
Apro due recorset, uno per il lavoro e l'altro per la Quantità.
Sono uguali come campi e record
Scorro Lavoro
se è presente la stringa, rilevo colonna e record,
poi leggo nell'altro recordset la quantità
2-
Apro un recordset per tutti i campi,
scorro con step di 2 (penso sia fattibile,
ad oggi ho uitilizzato solo step di 1,
tipo
dim i= recordset.campi.count to 0 step -1
con  step -2 ?),
leggo la stringa,
se esiste sposta al campo adiacente e leggo la quantità.
Ave
giuseppeD
Ave
giuseppeD
Scorro

 se esiste sposta al campo adiacente e leggo la quantità.
Mi sembra tutto molto iper-complicato.
Volendo proprio sfruttare la scansione del recordset (cosa che in un caso
come questo ritengo folle, ma diciamo di voler far così...), butto lì un po'
di codice, omettendo tutti i controlli di apertura, case, trim, recordset
vuoto, campi null, ecc...
RS.Movefirst
do while not rs.Eof
    for n=1 to 20
        if rs.fields.item("Lavoro" & cstr(n)).Value=Parametro_Lavoro then
            text1.text=text1.text & rs.fields.item("ID").Value & ": " &
cstr(rs.fields.item("Data").Value) & rs.fields.item("Lavoro" &
cstr(n)).Value & ": " & cstr(rs.fields.item("Quantita" & cstr(n)).Value) &
vbnewline
        endif
    next n
    Rs.Movenext
loop
Ciao
Alberto

 loop
Questa mi sembra ottima
Ave
giuseppeD

 data,ID e vado a rs2(x,y) a leggere la quantità, che immagazinerò.
Da un punto di vista logico immaginavo questo, e sicuramente funziona.
Ma se lo immagini realizzato, visualizzando mentalmente il codice, ti
renderai conto che avere due recordset non ti toglie complessità al
procedimento, ma ne aggiunge, dovendo gestire un Move assoluto sul secondo
recordset.
Considerando inoltre che i due recordset non puoi aprirli nello stesso
identico momento (in realtà un modo c'è, ma non credo sia così diffuso...),
e soprattutto che non esiste un campi autoincrementante nella tabella, non
puoi garantire che l'ordine dei record sia lo stesso nei due recordset. E
qui crollerebbe tutto.
Ciao
Alberto

 Alberto
Ciao,
Mattia
--
Mattia un pň meno stacanovista...

 seguenti.
Con la struttura che hai utilizzato non si può, se non sommando tutti i
campi quantità con una batteria di IIF (ma è una cosa che mi fa venire i
brividi).
Ribadisco, comunque, che con modifiche quasi banali alla struttura del db
puoi ricondurti ad una situazione migliore.
Ciao
Alberto

 trovare la data e la quantità.
SELECT DATA,
IIF(LAVORO1=PARAMETRO,QUANTITA1,0)+
IIF(LAVORO2=PARAMETRO,QUANTITA2,0) +
IIF(LAVORO3=PARAMETRO,QUANTITA3,0) +
...
IIF(LAVORO20=PARAMETRO,QUANTITA20,0) +
FROM TABELLA
In bocca al lupo per le prestazioni e togli la 'a' accentata dal nome dei un
campi perchè presto o tardi ti creerà problemi.
termoPilucco

 Alberto
Ciao,
Mattia
--
Mattia un pò meno stacanovista...

 differente). Oltretutto è già in uso da mesi.
E allora vai con gli IIF.
Ciao
Alberto

 Alberto
Ciao,
Mattia
--
Mattia un pň meno stacanovista...

 Grazie dell'attenzione.
Prego.
Ciao!
-- 
Lorenzo Benaglia
Microsoft MVP - SQL Server
http://mvp.support.microsoft.com
http://italy.mvps.org

 termoPilucco
Ciao,
Mattia


 Lavoro, Quantita) al posto di vedere le zero dove non vi è il dato.
'Lavoro' non è il valore di un campo, ma il nome. Quindi non lo puoi
estrarre con una query (a meno che tu non voglia inserirlo come stringa
costante).
Nella query che ti ho scritto, forse non hai notato i segni '+' (o meglio li
hai intesi come una virgola), infatti pensavo che i lavori fossero
mutuamente esclusivi.
Riassumendo, sostituisci i segni "+" con una virgola se i lavori non sono
esclusivi;
se il tipo di output risulta troppo "orizzontale" il motivo è da cercarsi
nella progettazione della tabella (che viola le prime regole di
normalizzazione).
termoPilucco

 termoPilucco
Grazie di tutto,


 fino ad arrivare a Lavoro20 e Quantità20
SELECT ID, Data, Lavoro1 as Lav, Quantità1 as Qta
   FROM TABELLA WHERE Lavoro1 = "CAZZATE";
UNION SELECT ID, Data, Lavoro2 as Lav, Quantità2 as Qta
   FROM TABELLA WHERE Lavoro2 = "CAZZATE";
...
UNION SELECT ID, Data, Lavoro20 as Lav, Quantità20 as Qta
   FROM TABELLA where Lavoro20 = "CAZZATE" ORDER BY ID;
"Ovviamente" la stringa con tutta la SQL di cui sopra la
puoi costruire con un semplicissimo ciclo For...Next
Pregasi notare l'assenza di ";" nell'ultima riga prima di ORDER
Ciao.
Mauro

 Mauro
Ciao,
Mattia
