Newsgroup: it.comp.lang.delphi
Titolo: Query funzionanti sotto Access ma non con Delphi?!?

Ciao a tutti,
Sto lavorando su un progettino per fare apprendistato sull'utilizzo di
Delphi come Client per un DB Access. Per testare le query in genere le
sviluppo sotto Access e poi quando mi soddisfano copio il codice SQL
dentro al mio ADOQUERY e spesso funziona. Ogni tanto però le cose si
intoppano.
In questo caso la query portata in Delphi è :
SELECT SW.Prodotto, SW.Produttore, SW.Descrizione, Categorie.Cat,
SW.Costo
FROM Categorie INNER JOIN (SW INNER JOIN [JoinSW-PC] ON SW.IDSW =
[JoinSW-PC].IDSW) ON Categorie.IDCat = SW.Categoria
WHERE ((([JoinSW-PC].IDPC)='+IntToStr(TPC['IDPC'])+'))
ORDER BY Categorie.Cat
L'errore segnalato: QSW: Field 'IDSW' not Found
Tanto per intenderci, QSW è il mio ADOQuery ed il campo IDSW è quello
sul quale viene fatto il join fra le tabelle SW (software) e JoinSW-PC
(tabella che dovrebbe riportare gli ID del SW e dei vari PC per
memorizzare le applicazioni installate in ogni PC in azienda).
Cosa non va?
Grazie
-------------------------
    Luca Leoncavallo
lleonc...@racine.ra.it
-------------------------

hai provato ad aggiungere il campo alla select?
Bye
A.

Cosa non va?
Non lo so, ma se metti un breakpoint e logghi l'sql prima di eseguire la
query, poi lo riporti in access, dovresi vedere meglio dov'e l'errore.
Io faccio sempre cosi' per gli errori di questo tipo: loggo la query e la
riproduco a mano in access, il piu' delle volte risultano errori di parentesi
in difetto, apici, ecc....
-- 
Morde. 
morde[at]programmer[.]net

hai provato ad aggiungere il campo alla select?
Grazie mille (anche a Morde) perchè così si risolve. Ho aggiunto alla
SELECT IDSW e successivamente un altro campo che dava errore analogo,
ma vorrei avere, se possibile, una giustificazione dell'errore!?!?!
:-)
Perchè Delphi vuole che la select abbia quei campi in più mentre
Access no?
Sistemato quel poblema ne salta fuori un altro. Riporto lo spezzone:
  TPC.First;
  QSW.Close;
  QSW.SQL.Clear;
  QSW.SQL.Add('SELECT SW.Categoria, SW.IDSW, SW.Prodotto,
SW.Produttore, SW.Descrizione, Categorie.Cat, SW.Costo '+
    'FROM Categorie INNER JOIN (SW INNER JOIN [JoinSW-PC] ON SW.IDSW =
[JoinSW-PC].IDSW) ON '+
    'Categorie.IDCat = SW.Categoria WHERE
((([JoinSW-PC].IDPC)='+IntToStr(TPC['IDPC'])+')) ORDER BY
Categorie.Cat');
  QSW.Open;
  For I:=1 to QSW.RecordCount do
   Begin
    SGSW.Cells[0,I]:=Stringa(QSW['Prodotto']);
    SGSW.Cells[1,I]:=Stringa(QSW['Produttore']);
    SGSW.Cells[2,I]:=Stringa(QSW['Descrizione']);
//    SGSW.Cells[3,I]:=Stringa(QSW['Cat']);
    SGSW.Cells[4,I]:=Stringa(QSW['Costo']);
    QSW.Next;
   End;
Questo è il mio modo di operare solitamente con le ADOQuery. La linea
commentata è quella che mi da problemi. Nonostante il campo
Categorie.Cat pur essendo parte della select non mi risulta
"indirizzabile" allo stesso modo degli altri. Ma perchè?????
PS Stringa è una funzione che restituisce il valore del campo o la
stringa vuota per gestire i Null Value.
Spero in voi :-))
Grazie.


   For I:=1 to QSW.RecordCount do
nel tuo caso non è influente, ma ricorda che RecordCount non è in genere
assegnata al valore giustro quando apri la query.
Per calcolarlo l'oggetto deve fare un fetchall e se i records sono tanti
buonanotte.
Sarebbe + corretto un while not query.eof do che al suo interno di
incrementa il contatore I preventivamente inizializzato a zero.
Inoltre, se la operazione è unidirezionale e la tua TAdoquery non è
associata a controlli dbaware, credo sarebbe + corretto usare un
TAdoDataset.
Infine, se lo statement sql è sempre lo stesso e cambia solo il parametro
IDPC si potrebbe pensare ad una query parametrica, se ado, come credo,
prevede questa possibilità
Bye
A.