Newsgroup: it.comp.java
Titolo: Estrazione da più tabelle. Come fare?

Ciao a tutti,
non sto qui a spiegarvi che mi sono avvicinato da poco a java... e a tal
proposito vorrei chiedervi un consiglio su quale sia il metodo migliore per
interrogare due tabelle per estrarre un qualcosa (non so.. un recordset
oppure un array ditemi voi) contenente il risultato della mia estrazione in
modo da poterlo mettere in un file di testo, oppure un file excel, oppure
una tabella.
Vi stň chiedendo questa dritta in quanto ho realizzato una mega classe main
che apre un recordset di riferimento che scorro fino alla fine e su ogni
record filtro i recordset correlati e scrivo una riga in un file di testo.
Il risultato di questo modus operandi č un file di testo che riesco ad
importare in excel... ma mi sembra un modo alquanto inadeguato per una
programmazione ad oggetti... ma non sono stato in grado di trovare
informazioni in grado di indirizzarmi su una programmazione piů adeguata.
Sono graditi anche eventuali link a risorse che pensate possano essermi
utili.
Un grazie anticipato. :-)
Stefano
--------------------------------
Inviato via 
http://arianna.libero.it/usenet/

 
Mi sembra quasi di sentire il Maccasoft che affila la tastiera...occhio 
che ora ti fulmina...
-- 
  -- + Setaceous Pig + --
http://megadix.users.mcs2.netarray.com/
http://www.jroller.com/page/megadix/

Ciao, Stefano!
Il giorno 21/07/2004 alle ore 14:54 hai scritto:
 SG> ma mi sembra un modo alquanto inadeguato per una programmazione ad
 SG> oggetti... ma non sono stato in grado di trovare informazioni in grado
 SG> di indirizzarmi su una programmazione piů adeguata.
A parte la mega-classe main, a me sembra di capire che si tratta piu' che
altro di come fare le query in modo che tirino fuori i dati che ti servono
senza fare continue interogazioni per ogni record. Io consulterei un buon
tutorial sull'SQL.
Bye
-- 
There is no emotion; There is peace.
http://www.maccasoft.com

 Un grazie anticipato. :-)
Quale db usi?
In ogni caso, potresti andare in join sulle due tabelle e poi scrivere nel
file.
Se però hai esigenza di avere dei fogli excel, potresti usare le classi java
per
generare direttamente dei file excel.

 una tabella.
Che db usi?
In ogni caso: puoi andare in join sulle due tabelle, ed utilizzare i dati
estratti da mettere
nel tuo file excel. Altrimenti puoi usare le classi java per generare
direttamente il file excel.

Ciao, Dimitri!
Il giorno 21/07/2004 alle ore 15:13 hai scritto:
 DDF> Mi sembra quasi di sentire il Maccasoft che affila la
 DDF> tastiera...occhio che ora ti fulmina...
Beh dai, ha fatto solo una mega classe, non ha fatto una classe per ogni
record... :-)
Bye
-- 
There is no passion; There is serenity.
http://www.maccasoft.com


 


 generare direttamente dei file excel.
Questo mi è un pò più oscuro... non mi ci sono mai messo d'impegno confesso,
ma non ho trovato per ora mai niente che mi permettesse di generare un file
excel direttamente da un oggetto recordset... ma forse non ho cercato bene
:-P Esiste qualcosa?



Scusa, ma la domanda che facevi era: estrazione da piů tabelle, cosě ti ho
riposto di andare in join perchč
mi sembrava estraessi i record da una, poi da quell'altra ed alla fine
facessi qualche accrocchio in Java... tutto lě.
Quindi non mi č chiaro (se ti č chiaro come fare le query) quel'č il senso
del tuo post, visto che una volta che hai un
ResultSet in java puoi fare di quei dati tutto ciň che vuoi...
Per quanto riguarda le classi Excel: non c'č un metodo che dal ResultSet ti
estrae il foglio excel, ma ci sono delle classi
per la gestione di tali file, che una volta implementate correttamente nel
tuo applicativo, ti permettono di infilare quello che
estrai ed hai ottenuto in un resultset in un foglio excel.
Cerca un po' con google.

 tutorial sull'SQL.
Probabilmente l'esemplificazione semplice che ho proposto ti suggerisce
correttamente che mi dovrei imparare un pò di SQL :-P (ti confermo che già
lo conosco... )
beh allora vado un pò più nello specifico...
Io attualmente faccio qualosa del genere
Recordset primario
"SELECT CODICE FROM TABARTICOLI"
PreparedStatement Secondario
"SELECT CODICE, SUM(VALORE) AS IMPORTO FROM TABORDINI
WHERE CODICE = ?"
Quindi nella main class...
while (rsPrimario.next() {
    String codice = rsPrimario.getString("CODICE");
    psSecondario.setString(1, "CODICE");
    rsSecondario = psSecondario.executeQuery();
    rsSecondario.next();
    double valore = rsSecondario.getDouble("VALORE");
    System.out.println( codice +"\t" + valore);
    rsSecondario.close();
}
A sensazione una cosa più adeguata mi sembrerebbe una cosa del genere
while (rsPrimario.next() {
    String codice = rsPrimario.getString("CODICE");
    double valore = OggettoStranoExtesoDelRsSecondarioNonSo.getValore("CODICE");
    System.out.println( codice + "\t\ + valore);
}
Non so se sono fuori strada... ma è possibile fare quell'
OggettoStranoExtesoDelRsSecondarioNonSo ?


Ciao, Stefano!
Il giorno 21/07/2004 alle ore 17:54 hai scritto:
 SG> Probabilmente l'esemplificazione semplice che ho proposto ti suggerisce
 SG> correttamente che mi dovrei imparare un pò di SQL :-P (ti confermo che
 SG> già lo conosco... )
Eh gia'... anch'io pensavo che SELECT * FROM TABELLA fosse tutto quello che
serve per conoscere l'SQL...
 SG> Recordset primario
 SG> "SELECT CODICE FROM TABARTICOLI"
 SG>
 SG> PreparedStatement Secondario
 SG> "SELECT CODICE, SUM(VALORE) AS IMPORTO FROM TABORDINI
 SG> WHERE CODICE = ?"
[...]
 SG> A sensazione una cosa più adeguata mi sembrerebbe una cosa del genere
Insomma... io sono sempre piu' convinto che si tratti di un problema di SQL.
Vado a memoria quindi suscettibile di errori (non so se e' pienamente
compatibile con tutti i DBMS, con MySQL dovrebbe funzionare):
SELECT CODICE,SUM(VALORE) AS IMPORTO FROM TABORDINI GROUP BY CODICE
e ti dovrebbe restituire la somma di tutti i record con lo stesso codice,
una riga per ogni codice. Se vuoi leggere anche il record da TABARTICOLI:
SELECT CODICE,SUM(VALORE),TABARTICOLI.* AS IMPORTO FROM TABORDINI LEFT JOIN
TABARTICOLI ON (TABORDINI.CODICE=TABARTICOLI.CODICE) GROUP BY
TABORDINI.CODICE
Una sola query e nessuna classe "strana" per gestirla.
Bye
-- 
There is no death; There is the Force.
http://www.maccasoft.com

 TABORDINI.CODICE
Niente lasciamo perdere l'esempio.... che altrimenti mi porti sempre sulla
strada dell'sql... e prima che ti faccio spazientire ti cambio domanta :-P
Ti è mai capitato di dover andare a prendere da n tabelle (mettiamo 10 o 15
e non solo 2) per una estrazione?
Bene io mi sono stancato tutte le volte di scrivere una mega istruzione sql
(join li, join la, subselect, group... etc..) ma avere qualcosa di
modulare... tipo mi scrivo la select primaria e poi aggiungo i vari campi
che mi servono dalle altre select/recordset che vorrei rappresentare come
classi. Alla classe dei recordset secondari gli passo i campi di selezione e
mi faccio restituire il valore...o più in generale un dato (potrebbe essere
una stringa)...
Ma visto le risposte che mi stai dando, e le poche risorse che ho trovato in
rete.... forse mi sto facendo solo un pò di seghe mentali ;-)


Ciao, Stefano!
Il giorno 22/07/2004 alle ore 09:31 hai scritto:
 SG> Ti č mai capitato di dover andare a prendere da n tabelle (mettiamo 10
 SG> o 15 e non solo 2) per una estrazione?
10 o 15 no, ma 5 o 6 si.
 SG> Bene io mi sono stancato tutte le volte di scrivere una mega istruzione
 SG> sql (join li, join la, subselect, group... etc..) ma avere qualcosa di
 SG> modulare... tipo mi scrivo la select primaria e poi aggiungo i vari
 SG> campi che mi servono dalle altre select/recordset che vorrei
 SG> rappresentare come classi. Alla classe dei recordset secondari gli
 SG> passo i campi di selezione e mi faccio restituire il valore...o piů in
 SG> generale un dato (potrebbe essere una stringa)...
A questo punto forse ho capito. Tu intendi delegare a un set di classi cio'
che farebbe la query SQL (complessa). Giusto ?
Da un punto di vista pratico potrebbe essere una soluzione, ma non lo e'
affatto dal punto di vista dell'efficenza e della velocita' di esecuzione.
In pratica generi tante query verso il database quanti sono i record da
estrarre. Finche' si tratta di pochi record potrebbe andare bene, ma quando
hai a che fare con centinaia o migliaia di record, vedi che la tua pagina ci
impiega dei minuti a caricarsi...
Potresti unire le due cose. Cioe' fare un set di classi in grado di
generarti una query SQL unica in grado di estrarre tutti i dati che
desideri. Probabilmente sara' piu' complesso da realizzare, ma alla fine
avrai un sistema rapido per generare le query e il massimo dell'efficenza.
Ho cercato con Google 'java sql builder' e il primo link che e' saltato
fuori e' questo:
http://joe.truemesh.com/squiggle/
Forse puo' esserti utile (e probabilmente anche a me... :-) ).



Capisci che se con una stored procedure estraggo tutto quanto mi serve dalle
10 o 15 tabelle...
Scrivo la stored procedure piuttosto che gestire il tutto da codice. Poi
lancerň la stored procedure
che mi da i dati.
Cosě facendo forse la cosa č un po' piů veloce e soprattutto č un buon modo
per farlo.

Il progetto POI consente di generare fogli Excel. Non so se ti e'
d'aiuto, comunques questo e' il link. nota che si basa su oggetti OLE,
per cui puoi usarlo solo su macchina Windows.
http://jakarta.apache.org/poi/index.html
Ciao.
Nic

 Forse puo' esserti utile (e probabilmente anche a me... :-) ).
Ancora non gli ho dato un occhio ma ti ringrazio per la segnalazione :-)



Effettivamente... peccato che non ho tanta dimistichezza con le stored
procedure... ma mi sa che č giunto il momento di metterci le mani :-P
Grazie


 grado di indirizzarmi su una programmazione piů adeguata. 
Il metodo secondo me e' corretto, l'errore e' utilizzare una sola 
classe per tutto (personalmente odio il solo pensare di scrivere una 
classe di 1000 righe[1], figuriamoci il far fare tutto ad una sola 
classe)
Henryx
[1] cosa che purtroppo, nonostante la specializzazione delle classi 
che ho adoperato, mi e' capitata :/