Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Fehlersuche bei Kopierroutine (https://www.delphipraxis.net/167266-fehlersuche-bei-kopierroutine.html)

khh 20. Mär 2012 16:41

Datenbank: firebird • Version: 2.1 • Zugriff über: Zeos

Fehlersuche bei Kopierroutine
 
hallo zusammen.
ich kopiere in meinem Programm in einer Schleife ca 100 Datensätze einer Query.
Code:
Fvkaufpos.EINZELBRUTTOPREIS    := aufpos2Zquery.FieldByName('EINZELBRUTTOPREIS').AsCurrency;

   

procedure Tvkaufpos.DSneu;
FQuery1.post;
in der procedure DSneu wird per Query.post jeweils der neue Satz angelegt.
das funktioniert auch täglich fehlerfrei bis auf bisher 2mal im vergangenen Jahr
Aus mir unerklärlichen Gründen steht bei diesen 2 Kopiervorgängen in mehreren EINZELBRUTTOPREIS
des Kopiervorgang der gleiche, falsche Preis von 3,30 :-(

Hat jemand von euch eine Idee zur Fehlersuche ?

danke Gruss KHH

Bummi 20. Mär 2012 16:45

AW: Fehlersuche bei Kopierroutine
 
Ich fürche aus dem Codeschnipsel lässt sich kaum eine Analyse erstellen :wink:

khh 20. Mär 2012 16:57

AW: Fehlersuche bei Kopierroutine
 
hast ja recht :-(

hier etwas mehr code
Code:
    aufpos2Zquery.SQL.add('select ');
    aufpos2Zquery.SQL.add('*');
    aufpos2Zquery.SQL.add('from vkaufpos where ');
    aufpos2Zquery.SQL.add('VKAUFKOPF_ID = :VKAUFKOPF_ID ');
    aufpos2Zquery.ParamByName('VKAUFKOPF_ID').AsInteger := alteaufkopf_id;
    aufpos2Zquery.open;
    aufpos2Zquery.First;
    while not aufpos2Zquery.EOF do
    begin
     // auftragspositionen anlegen
     Fvkaufpos.VKAUFPOS_ID:= 0; // trigger
     Fvkaufpos.VKAUFKOPF_ID:= Fvkaufkopf.VKAUFKOPF_ID;
     Fvkaufpos.ART_ID    := aufpos2Zquery.FieldByName('ART_ID').AsInteger;
     Fvkaufpos.BESTMENGE    := aufpos2Zquery.FieldByName('BESTMENGE').AsCurrency;
   
     Fvkaufpos.EINZELPREISNETTO    := aufpos2Zquery.FieldByName('EINZELPREISNETTO').AsCurrency;
     Fvkaufpos.GESAMTPREISNETTO    := aufpos2Zquery.FieldByName('GESAMTPREISNETTO').AsCurrency;
     Fvkaufpos.MWST    := aufpos2Zquery.FieldByName('MWST').AsCurrency;
     Fvkaufpos.MWSTSATZ    := aufpos2Zquery.FieldByName('MWSTSATZ').AsCurrency;
     usw
    usw
     Fvkaufpos.DSneu;
     // Bezeichnung anzeigen im Infosplash
     FInfoSplashForm.info1 := Fvkaufpos.BEZEICHNUNG;
     FInfosplashForm.ShowOnTop;
     FInfoSplashForm.Update(self);
     Application.ProcessMessages;
     aufpos2Zquery.Next;  


die proc DSneu

 FQuery1.SQL.clear;
     FQuery1.SQL.add('select ');
     FQuery1.SQL.add('*');
     FQuery1.SQL.add('from vkaufpos where ');
     FQuery1.SQL.add('VKAUFPOS_ID = :VKAUFPOS_ID');
     FQuery1.ParamByName('VKAUFPOS_ID').AsInteger := FVKAUFPOS_ID;
     FQuery1.open;
     FQuery1.append; // neuen Datensatz anhängen
 
   
     FQuery1['EINZELPREISNETTO']:= FEINZELPREISNETTO ;
     FQuery1['GESAMTPREISNETTO']:= FGESAMTPREISNETTO ;
     FQuery1['MWST']:= FMWST ;
     FQuery1['MWSTSATZ']:= FMWSTSATZ ;
     usw
    usw
    
     FQuery1.post;

p80286 21. Mär 2012 10:18

AW: Fehlersuche bei Kopierroutine
 
Ich seh es aber ich verstehe es nicht!
Delphi-Quellcode:
   
     FQuery.SQL.add('select ');
     FQuery1.SQL.add('*');
     FQuery1.SQL.add('from vkaufpos where ');
     FQuery1.SQL.add('VKAUFPOS_ID = :VKAUFPOS_ID');
     FQuery1.ParamByName('VKAUFPOS_ID').AsInteger := FVKAUFPOS_ID;
     FQuery1.open;
     FQuery1.append; // neuen Datensatz anhängen
 
   
     FQuery1['EINZELPREISNETTO']:= FEINZELPREISNETTO ;
     FQuery1['GESAMTPREISNETTO']:= FGESAMTPREISNETTO ;
Erwartet hätte ich etwa dies:
Delphi-Quellcode:
FqueryNeuDS.SQL.Text:='Update VkaufPos set EinzelPreisNetto=:einzelpreisnetto where VKaufPos_ID=:vkaufpos_id ';
FQuery1.ParamByName('VKAUFPOS_ID').AsInteger := FVKAUFPOS_ID;
FQuery1.ExecSQL;
Jedesmal (für jeden zu übernemenden Datensatz) ein 'select * ...' ist ja nun nicht so das Gelbe vom Ei.

Gruß
K-H

DeddyH 21. Mär 2012 10:31

AW: Fehlersuche bei Kopierroutine
 
Wäre das mit einer Stored Procedure nicht viel einfacher und performanter zu lösen?

khh 21. Mär 2012 11:35

AW: Fehlersuche bei Kopierroutine
 
Zitat:

Zitat von p80286 (Beitrag 1157709)
Ich seh es aber ich verstehe es nicht!
Delphi-Quellcode:
   
     FQuery.SQL.add('select ');
     FQuery1.SQL.add('*');
     FQuery1.SQL.add('from vkaufpos where ');
     FQuery1.SQL.add('VKAUFPOS_ID = :VKAUFPOS_ID');
     FQuery1.ParamByName('VKAUFPOS_ID').AsInteger := FVKAUFPOS_ID;
     FQuery1.open;
     FQuery1.append; // neuen Datensatz anhängen
 
   
     FQuery1['EINZELPREISNETTO']:= FEINZELPREISNETTO ;
     FQuery1['GESAMTPREISNETTO']:= FGESAMTPREISNETTO ;
Erwartet hätte ich etwa dies:
Delphi-Quellcode:
FqueryNeuDS.SQL.Text:='Update VkaufPos set EinzelPreisNetto=:einzelpreisnetto where VKaufPos_ID=:vkaufpos_id ';
FQuery1.ParamByName('VKAUFPOS_ID').AsInteger := FVKAUFPOS_ID;
FQuery1.ExecSQL;
Jedesmal (für jeden zu übernemenden Datensatz) ein 'select * ...' ist ja nun nicht so das Gelbe vom Ei.

Gruß
K-H

wieso update? allenfalls noch insert ...
es sollen doch neue ds geschrieben werden.

Funktioniert ja auch, nur eben in 2 von 300 Fällen geht es schief und ich kann nicht finden warum :-(
@deddyH
wäre sicher datenbankintern auch möglich, hab mich aber mit stored proceduren noch nicht näher auseinandergesetzt.

mkinzler 21. Mär 2012 11:40

AW: Fehlersuche bei Kopierroutine
 
Warum nicht in einem Statement?
SQL-Code:
insert into vkaufpos ( <Liste ohne PK> ) select <Liste ohne PK> from vkaufpos where id = :vorhandene_id;

khh 21. Mär 2012 11:44

AW: Fehlersuche bei Kopierroutine
 
Zitat:

Zitat von mkinzler (Beitrag 1157726)
Warum nicht in einem Statement?
SQL-Code:
insert into vkaufpos ( <Liste ohne PK> ) select <Liste ohne PK> from vkaufpos where id = :vorhandene_id;

das ist natürlich auch ne Möglichkeit, und wahrscheinlich auch performanter.
Sicher ist beides die Überlegung wert (insert und stored proc)
Aber was kann die Ursache des Fehlers sein, irgend ein Speicherproblem oder was sonst?

p80286 21. Mär 2012 12:00

AW: Fehlersuche bei Kopierroutine
 
Nachdem nach einer ID gefragt wurde nahm ich fälschlicher Weise an es ginge um schon vorhandene Datensätze..........geschenkt.
"Speicherprobleme" sind so selten, daß man sie eigentlich ausschließen kann.
Die meisten Speicherprobleme sitzen vor der Tastatur, und haben ein Problem mit der Bereichsprüfung etc.

Abgesehen davon, daß "3,30" falsch ist, was wäre denn richtig gewesen?
Könnte es sein, daß auf dem weg von der Datenbank in Dein Programm und von dort wieder in die Datenbank ein Rundungsfehler aufgetreten ist?

Das soll schon ofter vorgekommen sein.

Gruß
K-H

khh 21. Mär 2012 12:04

AW: Fehlersuche bei Kopierroutine
 
Zitat:

Zitat von p80286 (Beitrag 1157731)
"Speicherprobleme" sind so selten, daß man sie eigentlich ausschließen kann.
Die meisten Speicherprobleme sitzen vor der Tastatur, und haben ein Problem mit der Bereichsprüfung etc.

Abgesehen davon, daß "3,30" falsch ist, was wäre denn richtig gewesen?
Könnte es sein, daß auf dem weg von der Datenbank in Dein Programm und von dort wieder in die Datenbank ein Rundungsfehler aufgetreten ist?

Das soll schon ofter vorgekommen sein.

Gruß
K-H

leider nein, die 3,30 stehen in mehreren der 100 ds die "normalerweise" völlig andere Werte enthalten.
(von z.B. 0,90 € bis 20,95 €)
also keinerlei erkennbaren Zusammenhang zwischen den Werten.

Ich dachte zuerst an einen Initialisierungsfehler , aber bei der Zuweisung:
Fvkaufpos.EINZELPREISNETTO := aufpos2Zquery.FieldByName('EINZELPREISNETTO').AsCu rrency;
sollte das eigentlich sowieso irrelevant sein


Alle Zeitangaben in WEZ +1. Es ist jetzt 11:31 Uhr.
Seite 1 von 2  1 2      

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