PDA

Visualizza la versione completa : [DELPHI] Query da BDE a dbExpress


peste1
16-10-2005, 14:31
Ciao a tutti...
ho una query piuttosto complessa:



SELECT Aree.CODICE, Aree.DESCRIZIONE, Sezioni.CODICE, Sezioni.DESCRIZIONE, Argomenti.CODICE, Argomenti.DESCRIZIONE, Punticontrollo.CODICE, Punticontrollo.DESCRIZIONE, Aree.ID_AREA, Sezioni.ID_SEZ, Argomenti.ID_ARG, Punticontrollo.ID_PUNTI, Aree.PESO, Aree.VALOREDIRIFERIM, Sezioni.PESO, Sezioni.VALOREDIRIFERIM, Argomenti.PESO, Argomenti.VALOREDIRIFERIM, Punticontrollo.PESO, Punticontrollo.VALOREDIRIFERIM
FROM AREE Aree
INNER JOIN SEZIONI Sezioni
ON (Aree.ID_AREA = Sezioni.ID_AREA)
INNER JOIN ARGOMENTI Argomenti
ON (Argomenti.ID_SEZ = Sezioni.ID_SEZ)
INNER JOIN PUNTICONTROLLO Punticontrollo
ON (Punticontrollo.ID_ARG = Argomenti.ID_ARG)
ORDER BY Aree.CODICE, Sezioni.CODICE, Argomenti.CODICE, Punticontrollo.CODICE


Sto convertendo un'applicazione con database GDB - Interbase con BDE in un'applicazione con i componenti dbExpress.

Il problema arriva all'esecuzione di questa query... possibile che dbExpress mi restituisca solo 14 record (contro le 2600 e passa di BDE)?

peste1
16-10-2005, 14:58
Nello specifico vi spiego qual il problema...




private
ID_BASE, i, maxLungh, tipoGlobale: integer;
totString, totValRif, totPesi: array of String;

[...]

procedure TfReportQuestionarioCompleto.Stampa();
var
s: integer;
tempStringArea, tempStringSezione, tempStringArgomento, tempStringPunto: string;
begin
qTotDatabase.Close;
qTotDatabase.Open;
SetLength(totString, qTotDatabase.RecordCount * 2);
SetLength(totValRif, qTotDatabase.RecordCount * 2);
SetLength(totPesi, qTotDatabase.RecordCount * 2);
s := 0;
tempStringArea := '';
tempStringSezione := '';
tempStringArgomento := '';
tempStringPunto := '';
while not qTotDatabase.EOF do
begin
if (qTotDatabase['CODICE'] <> tempStringArea) then
begin
totString[s] := 'A'+ qTotDatabase['codice'] +' '+ UpperCase(qTotDatabase['descrizione']);
totValRif[s] := IntToStr(qTotDatabase['valorediriferim']);
totPesi[s] := IntToStr(qTotDatabase['peso']);
tempStringArea := qTotDatabase['codice'];
end else
if (qTotDatabase['CODICE_1'] <> tempStringSezione) then
begin
totString[s] := 'S '+ qTotDatabase['CODICE_1'] +' '+ qTotDatabase['DESCRIZIONE_1'];
totValRif[s] := String(qTotDatabase['VALOREDIRIFERIM_1']);
totPesi[s] := String(qTotDatabase['PESO_1']);
tempStringSezione := qTotDatabase['CODICE_1'];
end else
if (qTotDatabase.FieldByName('CODICE_2').AsString<>tempStringArgomento) then
begin
totString[s] := 'R '+qTotDatabase.fieldByName('codice_2').AsString+' '+qTotDatabase.fieldByName('DESCRIZIONE_2').AsStri ng;
totValRif[s] := qTotDatabase.FieldByName('VALOREDIRIFERIM_2').AsSt ring;
totPesi[s] := qTotDatabase.FieldByName('PESO_2').AsString;
tempStringArgomento := qTotDatabase.fieldByName('CODICE_2').AsString;
end else
if (qTotDatabase.FieldByName('CODICE_3').AsString <> tempStringPunto) then
begin
totString[s] := 'P '+qTotDatabase.FieldByName('CODICE_3').AsString+' '+qTotDatabase.fieldByName('DESCRIZIONE_3').AsStri ng;
totValRif[s] := qTotDatabase.FieldByName('VALOREDIRIFERIM_3').AsSt ring;
totPesi[s] := qTotDatabase.FieldByName('PESO_3').AsString;
tempStringPunto := qTotDatabase.FieldByName('CODICE_3').AsString;
qTotDatabase.Next;
end else qTotDatabase.Next;
Inc(s);
end;
maxLungh := s;
mainString.Caption := 'CIAO';
Preview;
end;


Questo codice inserito in un Quick Report e funzionava alla perfezione con BDE... i record restituiti erano corretti. Ora invece ho un sacco di problemi e spesso mi viene restituito un Invalid pointer operation.

Avete qualche idea? :master:

peste1
16-10-2005, 20:40
Giovini programmatori, prestate aiuto ad un giovine programmatore :stordita:

alka
16-10-2005, 20:51
Gli errori che riporti sono troppo vaghi e il problema andrebbe affrontato un po' alla volta. Non sempre il porting pu essere portato a termine con tale disinvoltura senza sapere tutti i dettagli della tecnologia utilizzata.

Su quali righe vengono riportati gli errori?
Affrontane uno alla volta, isolando il codice relativo e verificando la configurazione dei componenti e la query eseguita: non posso prendere tutto il codice che hai postato e analizzarlo riga per riga alla ricerca di un'eventuale errore, no? :)

peste1
16-10-2005, 20:57
Yes :D
Se ti va partiamo dalla query.
Eseguendo semplicemente la Query, con BDE e i relativi componenti il risultato di pi di 2600 record, mentre con dbExpress di soli 14 record.

Secondo te da che cosa potrebbe essere motivato?

alka
17-10-2005, 10:30
Originariamente inviato da peste1
Eseguendo semplicemente la Query, con BDE e i relativi componenti il risultato di pi di 2600 record, mentre con dbExpress di soli 14 record.
Secondo te da che cosa potrebbe essere motivato?
Quale componente usi per l'esecuzione della query?
La query viene definita tramite codice?
Qual il codice?

Dettagli, dettagli, dettagli... :zizi:

Ciao! :ciauz:

peste1
17-10-2005, 15:05
Il componente la TSQLQuery di dbExpress.
La Query impostata direttamente nel controllo anche se ho provato direttamente dal codice (il risultato lo stesso).

peste1
20-10-2005, 20:47
Alkino mio :cry: aiutami :stordita:

Loading