![]() |
Problem mit if-Bedingung
Hallo,
entweder habe ich einen Denkfehler, oder die gesamte Bedingung taugt nichts:
Delphi-Quellcode:
Die vorletzte Bedingung wird nicht geprüft. Was läuft hier schief?
procedure TRechnung.Button3Click(Sender: TObject);
begin Table1.Next; DateTimePicker2.Date:=StrToDateTime(DBText4.Caption); DateTimePicker3.Date:=StrToDateTime(DBText5.Caption); DateTimePicker4.Date:=StrToDateTime(DBEdit22.Text); DateTimePicker5.Date:=StrToDateTime(DBEdit23.Text); DateTimePicker6.Date:=StrToDateTime(DBEdit24.Text); Rechnung.Label21.Caption:=FormatDateTime('dd.mm.yyyy',date+StrToInt(Rechnung.DBText6.Caption)); spSkinButton1.Enabled := True; spSkinButton2.Enabled := True; if DateTimePicker1.Date <= DateTimePicker3.Date then begin Table1.Edit; DBEdit17.Text:='offen'; DBText5.Font.Color:=clYellow; Button1Click(nil); end else begin Table1.Edit; Button1Click(nil); end; if DateTimePicker1.Date >= DateTimePicker3.Date then begin Table1.Edit; DBEdit17.Text:='1. Mahnstufe'; DBText5.Font.Color:=clRed; Button1Click(nil); end else begin Table1.Edit; Button1Click(nil); end; if DateTimePicker1.Date >= DateTimePicker4.Date then begin Table1.Edit; DBEdit17.Text:='2. Mahnstufe'; DBText5.Font.Color:=clRed; Button1Click(nil); end else begin Table1.Edit; Button1Click(nil); end; if DateTimePicker1.Date >= DateTimePicker5.Date then begin Table1.Edit; DBEdit17.Text:='3. Mahnstufe'; DBText5.Font.Color:=clRed; Button1Click(nil); end else begin Table1.Edit; Button1Click(nil); end; if DateTimePicker1.Date >= DateTimePicker6.Date then begin Table1.Edit; DBEdit17.Text:='Klage'; DBText5.Font.Color:=clRed; Button1Click(nil); end else begin Table1.Edit; Button1Click(nil); end; if vergleicheStringsN(Label27.Caption, DBEdit21.Text, 50)=True then begin Table1.Edit; DBEdit17.Text:='Bezahlt'; DBText5.Font.Color:=clYellow; Button1Click(nil); end else begin Table1.Edit; Button1Click(nil); end; if Table1.EOF then begin spSkinButton4Click(Self); spSkinButton17.Enabled:=True; Timer1.Enabled:=False; end; end; |
Re: Problem mit if-Bedingung
So, habe das ganze mal etwas eingerückt und wenn Du jetzt noch sagst
was die procedure machen soll und mit welchen Werten sie aussteigt dann kann man vielleicht auch besser helfen. Grüße Klaus
Delphi-Quellcode:
procedure TRechnung.Button3Click(Sender: TObject);
begin Table1.Next; DateTimePicker2.Date:=StrToDateTime(DBText4.Caption); DateTimePicker3.Date:=StrToDateTime(DBText5.Caption); DateTimePicker4.Date:=StrToDateTime(DBEdit22.Text); DateTimePicker5.Date:=StrToDateTime(DBEdit23.Text); DateTimePicker6.Date:=StrToDateTime(DBEdit24.Text); Rechnung.Label21.Caption:=FormatDateTime('dd.mm.yyyy',date+StrToInt(Rechnung.DBText6.Caption)); spSkinButton1.Enabled := True; spSkinButton2.Enabled := True; if DateTimePicker1.Date <= DateTimePicker3.Date then begin Table1.Edit; DBEdit17.Text:='offen'; DBText5.Font.Color:=clYellow; Button1Click(nil); end else begin Table1.Edit; Button1Click(nil); end; if DateTimePicker1.Date >= DateTimePicker3.Date then begin Table1.Edit; DBEdit17.Text:='1. Mahnstufe'; DBText5.Font.Color:=clRed; Button1Click(nil); end else begin Table1.Edit; Button1Click(nil); end; if DateTimePicker1.Date >= DateTimePicker4.Date then begin Table1.Edit; DBEdit17.Text:='2. Mahnstufe'; DBText5.Font.Color:=clRed; Button1Click(nil); end else begin Table1.Edit; Button1Click(nil); end; if DateTimePicker1.Date >= DateTimePicker5.Date then begin Table1.Edit; DBEdit17.Text:='3. Mahnstufe'; DBText5.Font.Color:=clRed; Button1Click(nil); end else begin Table1.Edit; Button1Click(nil); end; if DateTimePicker1.Date >= DateTimePicker6.Date then begin Table1.Edit; DBEdit17.Text:='Klage'; DBText5.Font.Color:=clRed; Button1Click(nil); end else begin Table1.Edit; Button1Click(nil); end; if vergleicheStringsN(Label27.Caption, DBEdit21.Text, 50)=True then begin Table1.Edit; DBEdit17.Text:='Bezahlt'; DBText5.Font.Color:=clYellow; Button1Click(nil); end else begin Table1.Edit; Button1Click(nil); end; if Table1.EOF then begin spSkinButton4Click(Self); spSkinButton17.Enabled:=True; Timer1.Enabled:=False; end; end; |
Re: Problem mit if-Bedingung
Erst mal danke für's einrücken. Die Bedingungen 1 bis 5 überprüfen anhand des heutigem Tagesdatum (DateTimePicker1) mit einem festgelegtem Datum (DateTimePicker2 - 6) ob das jeweilige festgelegte Datum überschritten worden sind und setzen den jeweiligen Status. Die Bedingung 6, die mein Problem darstellt, überprüft den jeweiligen Datensatz. Ich habe ein weiteres Label auf der Form zu liegen, dessen Caption "Bezahlt" hat. Steht in der Tabelle "Bezahlt" ist das Ergebnis True. Es müßte eigentlich nun vielmehr der Status des Datensatzes in der Tabelle auf Bezahlt gesetzt werden. Macht es aber nicht.
Ich hoffe ich habe mich halbwegs verständlich ausgedrückt. |
Re: Problem mit if-Bedingung
Hallo Mario,
Delphi-Quellcode:
hast Du mal einen Haltepunkt auf die if Anweisung gesetzt und bist mit F7
if vergleicheStringsN(Label27.Caption, DBEdit21.Text, 50){=True} then
begin Table1.Edit; DBEdit17.Text:='Bezahlt'; DBText5.Font.Color:=clYellow; Button1Click(nil); end else begin Table1.Edit; Button1Click(nil); end; weitergegangen. Gehst Du da in den then Zweig oder in den else Zweig. Sind die Strings label27.caption und DBEdit21.text auch gleich? Was macht vergleicheStringsN genau? Grüße Klaus |
Re: Problem mit if-Bedingung
Die Strings label27.caption und DBEdit21.text sind, wenn die jeweilige Rechnung als bezahlt markiert wurde, gleich und sollte then ausführen. Bei Rechnungen die als nicht bezahlt markiert sind, sollte der else-Zweig ausgeführt werden. Zum vergleichen der beiden Strings verwende ich folgende Funktion:
Delphi-Quellcode:
Button1 hat folgende Prozedur:
function vergleicheStringsN(s1, s2:string; n:Word): Boolean;
var i: Word; function delLZ(s: string): string; var ss: string; i, j: Word; begin j:=0; ss:=''; for i:=1 to Length(s) do begin if (s[i] <> ' ') and (s[i] <> '-') then begin Inc(j); ss:= ss + s[i] end; if j=n then Break end; Result := UpperCase(ss) end; begin if delLZ(s1)=delLZ(s2) then Result:=True else Result:=False; end; var flag:word;
Delphi-Quellcode:
Timer1:
procedure TRechnung.Button1Click(Sender: TObject);
begin Table1.Post; Table1.Refresh; Timer1.Enabled:=True; end;
Delphi-Quellcode:
procedure TRechnung.Timer1Timer(Sender: TObject);
begin Timer1.Enabled:=False; if Table1.EOF then begin spSkinButton17.Enabled:=True; end else begin Button3Click(nil); //wieder zurück end; end; |
Re: Problem mit if-Bedingung
Delphi-Quellcode:
;
function vergleicheStringsN(s1, s2:string; n:Word): Boolean;
var i: Word; function delLZ(s: string): string; var ss: string; i, j: Word; begin // hier auch einen Haltepunkt setzen j:=0; ss:=''; for i:=1 to Length(s) do begin if (s[i] <> ' ') and (s[i] <> '-') then begin Inc(j); ss:= ss + s[i] end; if j=n then Break end; Result := UpperCase(ss) end; begin // hier Haltepunkt setzen und s1 und s2 abfragen if delLZ(s1)=delLZ(s2) then Result:=True else Result:=False; end; var flag:word
Delphi-Quellcode:
Kannst Du bitte mal in Deiner Funktion einen Haltepunkt an der obigen Stelle setzen
function vergleicheStringsN(s1, s2:string; n:Word): Boolean;
function delLZ(s: string): string; begin s:=trim(s); // entfernt führende und folgende Leerzeichen while pos('-',s) <> 0 DO // entfernt - aus dem String delete(s,pos('-',s),1); while pos(' ',s) <> 0 DO delete(s,pos(' ',s),1) // entfernt Leerzeichen aus dem String; if length(s) >= n then result:='' else result:=uppercase(s); end; begin if (s1 = '') and (s2 = '') then // abfangen wenn s1 und s2 leer sind result:=false else result:=(delLZ(s1)=delLZ(s2)); end; und schauen wie s1 und s2 aussehen. Wie schauen s1 und s2 nach der Bearbeitung durch delLZ aus? s1 und s2 kannst Du mit Ctrl-F5 anschauen, vorher die Variable markieren. Grüße Klaus |
Re: Problem mit if-Bedingung
by us in school the were telling us we should use
if not (pos(' ',s)=0) then inspite of if pos(' ',s) <> 0 then cause it should be faster and better... that was just btw:) |
Re: Problem mit if-Bedingung
Hallo Mario,
ich würde den gesamten Code nochmal überdenken. Du verschachtelst Ereignisse der Benutzerschnittstelle - Button1Click wird in Button3Click aufgerufen - und speicherst abgeleitete Informationen, die man normalerweise in calculated fields ablegt. Freundliche Grüße vom marabu |
Re: Problem mit if-Bedingung
Hallo marabu, ist bereits geschehen. Mir selbst hat der Code auch nicht so richtig "gefallen". :lol:
So, ich mache jetzt Feierabend. Mir platzt sonst der Schädel. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 11:36 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-2025 by Thomas Breitkreuz