Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Delphi EXECSQL und Next (https://www.delphipraxis.net/115935-execsql-und-next.html)

Cosamia 20. Jun 2008 09:17

Datenbank: Access • Version: 2003 • Zugriff über: ADO

EXECSQL und Next
 
Hallo zusammen,

ich habe ein Problem im ExecSql und einem folgenden AdoQuery.next.
Fehler Meldung : Operation bei geschlossener Datenmenge nicht möglich.

Bei einem vorgelagerten AdoQuery.open bekäme ich die Fehlermeldung ""Der aktuelle Provider unterstützt nicht die Wiedergabe mehrfacher Recordsets bei einer einzelnen Ausführung"

Ich will nach dem ersten Datensatz in der Query den nächsten verarbeiten, und dies gelingt mir einfach nicht.

Jemand ne Idee?

Danke.

Delphi-Quellcode:
{Query nach Countabfrage neu füllen}
    adoquerydruck.active:=false;
    adoquerydruck.sql.Clear;
    adoquerydruck.sql.text := 'SELECT * FROM qryDruck';
    adoquerydruck.Open;
    adoquerydruck.First;

   
    While Not ADOQuerydruck.Eof do
       begin

    {Typ bestimmen}
    cltype := adoquerydruck.FieldByName('TYP').AsString;
    selectedid := adoquerydruck.FieldByName('Zahl').AsInteger;

    {Felder aus der INI lesen}
    IniFile := TIniFile.create(GetIniFilename);
        try
          clprintfields := IniFile.ReadString ('CLTYPES',cltype,'');
        finally
          inifile.Free;
        end;
    {Printfields zusammensetzen / CL-Felder mit Stammdaten}
    Printfields := 'Name,Kundennummer,Strasse,Ort,PLZ,Fax,Telefon,EMail,Zahl,Kommission,'+clprintfields;

    {Felder aus der INI in ein SELECT bügeln}
    adoquerydruck.Active := true;
    adoquerydruck.sql.Clear;
    adoquerydruck.sql.text := 'insert into tempdruck ('+printfields+') SELECT '+printfields+' FROM qryDruck where zahl ='+inttostr(selectedid);
    adoquerydruck.ExecSQL;
    adoquerydruck.Next; //Da kracht es !!
        end;

soulies 20. Jun 2008 09:27

Re: EXECSQL und Next
 
Zitat:

adoquerydruck.sql.text := 'insert into tempdruck ('+printfields+') SELECT '+printfields+' FROM qryDruck where zahl ='+inttostr(selectedid);
adoquerydruck.ExecSQL;
adoquerydruck.Next; //Da kracht es !!
das INSERT wird doch nur einmal ausgeführt -
wozu das 'next' - das wäre doch nur bei einem SELECT nötig

DeddyH 20. Jun 2008 09:28

Re: EXECSQL und Next
 
Erstelle eine 2. Query für die Datenmanipulation.

Cosamia 20. Jun 2008 09:44

Re: EXECSQL und Next
 
Zitat:

Zitat von soulies
Zitat:

adoquerydruck.sql.text := 'insert into tempdruck ('+printfields+') SELECT '+printfields+' FROM qryDruck where zahl ='+inttostr(selectedid);
adoquerydruck.ExecSQL;
adoquerydruck.Next; //Da kracht es !!
das INSERT wird doch nur einmal ausgeführt -
wozu das 'next' - das wäre doch nur bei einem SELECT nötig

Da ich oben den QueryCount zähle, soll ja eben INSERT nicht nur einmal vollzogen werden.

Cosamia 20. Jun 2008 09:44

Re: EXECSQL und Next
 
Zitat:

Zitat von DeddyH
Erstelle eine 2. Query für die Datenmanipulation.

Danke. Das werde ich gleich mal testen.

Cosamia 20. Jun 2008 10:25

Re: EXECSQL und Next
 
Entweder habe ich etwas falsch gemacht, oder die Problematik bleibt die selbige.

Bei einem AdoQuery.open kommt : "Der aktuelle Provider unterstützt nicht die Wiedergabe mehrfacher Recordsets bei einer einzelnen Ausführung

Bei einem AdoQuery.next : "Operation bei geschlossener Datenmenge nicht ausführbar"

DeddyH 20. Jun 2008 10:35

Re: EXECSQL und Next
 
Wie sieht der Quelltext aus?

Cosamia 20. Jun 2008 10:37

Re: EXECSQL und Next
 
Delphi-Quellcode:
 {Query nach Countabfrage neu füllen}
    adoquerydruck.active:=false;
    adoquerydruck.sql.Clear;
    adoquerydruck.sql.text := 'SELECT * FROM qryDruck';
    adoquerydruck.Open;


    //for I := 0 to quanta - 1 do begin {Die Anzahl der Bestellungen durchlaufen}

    While Not ADOQuerydruck.Eof do
       begin

    {Linsentyp bestimmen}
    cltype := adoquerydruck.FieldByName('TYP').AsString;
    selectedid := adoquerydruck.FieldByName('Zahl').AsInteger;

    {Felder aus der INI lesen}
    IniFile := TIniFile.create(GetIniFilename);
        try
          clprintfields := IniFile.ReadString ('CLTYPES',cltype,'');
        finally
          inifile.Free;
        end;
    {Printfields zusammensetzen / CL-Felder mit Stammdaten}
    Printfields := 'Name,Kundennummer,Strasse,Ort,PLZ,Fax,Telefon,EMail,Zahl,Kommission,'+clprintfields;

    {Felder aus der INI in ein SELECT bügeln / Stammdaten nicht vergessen}
    adoquerytemp.Active := true;
    adoquerytemp.sql.Clear;
    adoquerytemp.sql.text := 'insert into tempdruck ('+printfields+') SELECT '+printfields+' FROM qryDruck where zahl ='+inttostr(selectedid);
    adoquerytemp.ExecSQL;
   adoquerytemp.Next;
        end; {For I}

mquadrat 20. Jun 2008 10:40

Re: EXECSQL und Next
 
Statt

Delphi-Quellcode:
adoquerytemp.Next;
meinst du glaub ich

Delphi-Quellcode:
adoquerydruck.Next;
Schließlich willst du durch deine Suchschleife laufen...

DeddyH 20. Jun 2008 10:44

Re: EXECSQL und Next
 
Außerdem wäre es evtl. sinnvoller, mit SQL_Parametern zu arbeiten.

Cosamia 20. Jun 2008 10:46

Re: EXECSQL und Next
 
Zitat:

Zitat von mquadrat
Statt

Delphi-Quellcode:
adoquerytemp.Next;
meinst du glaub ich

Delphi-Quellcode:
adoquerydruck.Next;
Schließlich willst du durch deine Suchschleife laufen...

Du hattest recht. jetzt funzt es bis zum nächsten durchlauf. Dann fällt er allerdings bei
Delphi-Quellcode:
adoquerytemp.Active := true;
auf die Nase. Fehler : "Der aktuelle Provider unterstützt nicht die Wiedergabe mehrfacher Recordsets bei einer einzelnen Ausführung"

Cosamia 20. Jun 2008 10:47

Re: EXECSQL und Next
 
Zitat:

Zitat von DeddyH
Außerdem wäre es evtl. sinnvoller, mit SQL_Parametern zu arbeiten.

Gib mir bitte ein Tip. Ich lerne geren dazu. :-D

soulies 20. Jun 2008 10:47

Re: EXECSQL und Next
 
Zitat:

Printfields := 'Name,Kundennummer,Strasse,Ort,PLZ,Fax,Telefon,EMa il,Zahl,Kommission,'+clprintfields;

{Felder aus der INI in ein SELECT bügeln / Stammdaten nicht vergessen}
adoquerytemp.Active := true;
adoquerytemp.sql.Clear;
adoquerytemp.sql.text := 'insert into tempdruck ('+printfields+') SELECT '+printfields+' FROM qryDruck where zahl ='+inttostr(selectedid);
ich kenn mich zwar mit sql+access nicht aus aber dein statement lautet ungefähr:

SQL-Code:
insert into tempdruck Name,Kundennummer,Strasse,... SELECT tempdruck Name,Kundennummer,Strasse,... From ...
Ist das so möglich ???


cya

Cosamia 20. Jun 2008 10:48

Re: EXECSQL und Next
 
Zitat:

Zitat von soulies
Zitat:

Printfields := 'Name,Kundennummer,Strasse,Ort,PLZ,Fax,Telefon,EMa il,Zahl,Kommission,'+clprintfields;

{Felder aus der INI in ein SELECT bügeln / Stammdaten nicht vergessen}
adoquerytemp.Active := true;
adoquerytemp.sql.Clear;
adoquerytemp.sql.text := 'insert into tempdruck ('+printfields+') SELECT '+printfields+' FROM qryDruck where zahl ='+inttostr(selectedid);
ich kenn mich zwar mit sql+access nicht aus aber dein statement lautet ungefähr:

SQL-Code:
insert into tempdruck Name,Kundennummer,Strasse,... SELECT tempdruck Name,Kundennummer,Strasse,... From ...
Ist das so möglich ???


cya

Das Statement funzt ohne Probleme. :thumb:

DeddyH 20. Jun 2008 10:50

Re: EXECSQL und Next
 
Hier im Forum suchenSQL-Parameter

Cosamia 20. Jun 2008 10:56

Re: EXECSQL und Next
 
Zitat:

Zitat von DeddyH

Danke. Werde ich mir nachher gleich mal zu Gemüte führen.

Hast du mir noch ein Tipp, weshalb das Teil bei dem zweiten Durchlauf auf Nase fällt?

Wenn ich das AdoQueryTemp.active vorlagere fällt er beim zweiten Durchlauf bei dem Sql Statement hin.

Fehler beim INSERT INTO. Beim ersten Druchlauf nimmt er es ohen Probleme.

Cosamia 20. Jun 2008 11:03

Re: EXECSQL und Next
 
Der erste Datensatz wird geschrieben, beim zweiten knallt es dann.

Muss irgendetwas noch zuürcksetzen?

DeddyH 20. Jun 2008 12:00

Re: EXECSQL und Next
 
Kann ich den aktuellen Source nochmal sehen? IMO ist es doch unnötig, das Einfüge-Query auf Active zu setzen, da Du ja keine Datenmenge abfragst. Hier sollte ExecSQL doch ausreichen.

[edit] Und hier nochmal ein Beispielthread für SQL-Parameter mit ADO: http://www.delphipraxis.net/internal...=840733#840733 [/edit]

Cosamia 20. Jun 2008 12:26

Re: EXECSQL und Next
 
Hat sich erledigt. Hatte ein abschließendes "," zuviel in der Ini.

hoika 21. Jun 2008 10:25

Re: EXECSQL und Next
 
Hallo,

sicher, dass es jetzt klappt ?

Das
Delphi-Quellcode:
adoquerytemp.Active := true;
kannst du komplett weglassen.


Heiko

Cosamia 23. Jun 2008 09:29

Re: EXECSQL und Next
 
Ja, da hast du Recht.


Alle Zeitangaben in WEZ +1. Es ist jetzt 03:16 Uhr.

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz