![]() |
if anweisung
hi hab ein problem mit der if anweisung
Delphi-Quellcode:
auch wenn die werte = '' sind geht er mit in den satz mit lblscheibenverschleiß hinein und sagt mir eine Fehler meldung dass '' kein gültiger float wert ist
begin
with DataModule1 do begin Query.SQL.Clear; Query.SQL.Text:= selectsql('Anfangsgewicht_Belag_vorne_oben, Anfangsgewicht_Belag_vorne_unten, Anfangsgewicht_Belag_hinten_oben, Anfangsgewicht_Belag_hinten_unten, Endgewicht_Belag_vorne_oben, Endgewicht_Belag_vorne_unten, Endgewicht_Belag_hinten_oben, Endgewicht_Belag_hinten_unten','Friktionstest','Testnummer=' + frmtestauswahl.cbotestnummer.Text,'', ''); Query.Open; while not Query.Eof do begin agewvo:=(Query.Fields[0].AsString); agewvu:=(Query.Fields[1].AsString); agewho:=(Query.Fields[2].AsString); agewhu:=(Query.Fields[3].AsString); egewvo:=(Query.Fields[4].AsString); egewvu:=(Query.Fields[5].AsString); egewho:=(Query.Fields[6].AsString); egewhu:=(Query.Fields[7].AsString); Query.SQL.Clear; Query.SQL.Text:= selectsql('Anfangsgewicht_Scheibe,Endgewicht_Scheibe','Friktionstest','Testnummer='+frmtestauswahl.cbotestnummer.Text,'',''); Query.Open; agewscheibe:=(Query.Fields[0].AsString); egewscheibe:=(Query.Fields[1].AsString); if (agewvo ='') Or (agewvu ='') Or (agewho ='') Or (agewhu ='') Or (egewvo ='') Or (egewvu ='') Or (egewho ='') Or (egewhu ='') Or (agewscheibe='') Or (egewscheibe='') then begin Showmessage('Es gibt keine Werte für diese Testnummer'); //ShowMessage(Query.SQL.Text); close; end else lblbelagverschleiss.Caption :=FloatToStr((StrToFloat(agewvo) + StrToFloat(agewvu) + StrToFloat(agewho) + StrToFloat(agewhu)) - (StrToFloat(egewvo) + StrToFloat(egewvu) + StrToFloat(egewho) + StrToFloat(egewhu))); lblscheibeverschleiss.Caption:=FloatToStr(StrToFloat(agewscheibe)+StrToFloat(egewscheibe)); Query.Next; Query.Close; end; end; plz help |
Re: if anweisung
Sind auch wirklich alle Werte leer ?!?!?!
Da du nämlich or verwendest, geht er schon in den Else-Zweig wenn nur ein Wert nicht leer ist! Daher müsste es eigentlich "And" heißen, dann ist gewährleistet, dass kein Wert leer ist... Ehrlich gesagt ist deine Konstruktion nicht sehr vorteilhaft... ;-) Vor allem nicht, wenn du (wie zu sehen ist) die Werte in Float konvertieren willst... |
Re: if anweisung
hab mir gedacht wenn ich AND sage, dann müssen alle werte leer sein
ja ich weiß dass ned wirklich vorteilhaft oder gut programmiert ist, aber ich kanns ned besser :mrgreen: |
Re: if anweisung
Keine Angst...das kommt mir bekannt vor...ich hab nämlich auch so angefangen... ;-) Learning by doing...
Wenn du im Else-Zweig deine Werte in Float umwandelst, dann müssen auch alle String-Variablen eine Zahl enthalten, ansonsten kommt dieser Konvertierungfehler! Eine Notlösung wäre den String-Variablen den Wert '0' zuzuweisen, bevor du ihnen einen anderen Wert gibst... Oder du nimmst Variablen vom Typ Float und machst Query.Fields[0].AsFloat -> is günstiger Somit steht zumindest immer eine 0 drin... |
Re: if anweisung
Hallo,
wenn man OR schreibt, muss nur eine Bedingung erfüllt - sprich leer - sein, damit die "IF-Anweisung" ausgeführt wird. Sind alle nicht leer, so wird ELSE aufgerufen. |
Re: if anweisung
ja genau deshalb mach ich ja eine if anweisung die soll mir die leeren felder abfangen und eine fehlermeldung ausgeben
nur bei and springt er mir schon bei der zeile lblbelagverschleiß hinein und bei or erst bei lblscheibeverschleiß kann das sein dass ich mit meiner 2 sql abfrage die daten überspeichere ?? weil ich sage ja dann wieder Query.Fields[0].AsString |
Re: if anweisung
@ Bart 82 genau das will ich wenn 1 leer ist soll die fehlermeldung kommen---kommt aber nicht---
|
Re: if anweisung
Wieso öffnest du in der while-Schleife die Query denn neu?
|
Re: if anweisung
weil ich einen 2 sql befehl habe
|
Re: if anweisung
2 SQL Abfragen mit einer Schleife wird in deinem Fall nix gutes... Es wäre besser, wenn du die Sache nochmal kurz überdenkst... Und nimm Float-Variablen! -> agewvo:float; -> agewvo := query.Fields[?].asfloat :-)
Gibt es als Ergebnis deiner Abfrage eigentlich nur einen Datensatz? Dann brauchst du nämlich garkeine Schleife, ansonsten würden dich ja ka wieviele Messageboxen nerven, wenn immer alle Werte leer sind... |
Re: if anweisung
Zitat:
Außerdem: Du selektierst mit den beiden Queries aus derselben Tabelle mit denselben Kriterien! Pack das in eine Abfrage! ...und wenn du schon zwei Queries brauchst, dann nimm wenigstens zwei unterschiedliche TQuery-Objekte dafür. |
Re: if anweisung
hmm wie soll ich das sonst machen ??
aufgebenstellung ist so: ich habe einige werte agewvo, agewvu,.... und mit denen soll ich rechnen aber wenn keine werte vorhanden sind in der datenbank dann kann ich nichts rechnen , also soll er mir einen fehlermeldung geben ?? hat jemand einen besseren lösungsvorschlag als den da ??? |
Re: if anweisung
@flocke wenn ich das in eines packe dann ist eine überschreitung da weil ich nur 255 zeichen hab
|
Re: if anweisung
Wieso nur 255 Zeichen?
In einen String passen schon ein paar mehr Zeichen rein. Es sein denn, du hast das in deiner Funktion als String[255] oder ShortString deklariert. Kann es sein, dass da auch mal ein Leerzeichen enthalten ist? Falls ja, solltest du noch ein "Trim" auf die Werte machen. |
Re: if anweisung
hmmm wenn ich die beiden SQL befehle zusammenfüge kommt eine zeichenüberschreitung :(
ein leerzeichen kann nicht vorkommen aber ich verstehe nicht warum die if anweisung nicht funktioniert .. meines erachtens ist das "logisch" was ich geschrieben habe :mrgreen: |
Re: if anweisung
Eine eher "gewagte" Lösung wäre z.B.: (müsste funktionieren, da ja dieselbe Anzahl Datensätze als Ergebnis kommen müssten -> gleiche Tabelle -> gleiche Bedingung)
Delphi-Quellcode:
var
agewvo, agewvu, agewho, agewhu, egewvo, egewvu, egewho, egewhu, agewscheibe, egewscheibe: Float; begin with DataModule1 do begin Query1.SQL.Clear; Query1.SQL.Text := selectsql('Anfangsgewicht_Belag_vorne_oben, Anfangsgewicht_Belag_vorne_unten, Anfangsgewicht_Belag_hinten_oben, Anfangsgewicht_Belag_hinten_unten, Endgewicht_Belag_vorne_oben, Endgewicht_Belag_vorne_unten, Endgewicht_Belag_hinten_oben, Endgewicht_Belag_hinten_unten', 'Friktionstest', 'Testnummer=' + frmtestauswahl.cbotestnummer.Text, '', ''); Query1.Open; query2.SQL.Clear; Query2.SQL.Text := selectsql('Anfangsgewicht_Scheibe,Endgewicht_Scheibe', 'Friktionstest', 'Testnummer=' + frmtestauswahl.cbotestnummer.Text, '', ''); Query2.Open; while not Query1.Eof do begin agewvo := (Query1.FieldsByName['Anfangsgewicht_Belag_vorne_oben'].AsFloat); agewvu := (Query1.FieldsByName['Anfangsgewicht_Belag_vorne_unten'].AsFloat); agewho := (Query1.FieldsByName['Anfangsgewicht_Belag_hinten_oben'].AsFloat); agewhu := (Query1.FieldsByName['Anfangsgewicht_Belag_hinten_unten'].AsFloat); egewvo := (Query1.FieldsByName['Endgewicht_Belag_vorne_oben'].AsFloat); egewvu := (Query1.FieldsByName['Endgewicht_Belag_vorne_unten'].AsFloat); egewho := (Query1.FieldsByName['Endgewicht_Belag_hinten_oben'].AsFloat); egewhu := (Query1.FieldsByName['Endgewicht_Belag_hinten_unten'].AsFloat); agewscheibe := (Query2.FieldsByName['Anfangsgewicht_Scheibe'].AsFloat); egewscheibe := (Query2.FieldsByName['Endgewicht_Scheibe'].AsFloat); if ((agewvo = 0.00) and (agewvu = 0.00) and (agewho = 0.00) and (agewhu = 0.00) and (egewvo = 0.00) and (egewvu = 0.00) and (egewho = 0.00) and (egewhu = 0.00) and (agewscheibe = 0.00) and (egewscheibe = 0.00)) then begin Showmessage('Es gibt keine Werte für diese Testnummer'); //ShowMessage(Query.SQL.Text); end else begin lblbelagverschleiss.Caption := FloatToStr((agewvo + agewvu + agewho + agewhu) - (egewvo + egewvu + egewho + egewhu)); lblscheibeverschleiss.Caption := FloatToStr(agewscheibe + egewscheibe); end; Query1.Next; query2.Next; end; Query1.Close; Query2.Close; end; Aber besser wäre alles in einem... (das mit den 255 Zeichen versteh ich auch net...hab auch SQL-Abfragen mit mehr Zeichen :-D )
Delphi-Quellcode:
var
agewvo, agewvu, agewho, agewhu, egewvo, egewvu, egewho, egewhu, agewscheibe, egewscheibe: Float; begin with DataModule1 do begin Query.SQL.Clear; Query.SQL.Text := selectsql('Anfangsgewicht_Belag_vorne_oben, Anfangsgewicht_Belag_vorne_unten, Anfangsgewicht_Belag_hinten_oben, Anfangsgewicht_Belag_hinten_unten, Endgewicht_Belag_vorne_oben, Endgewicht_Belag_vorne_unten,' + ' Endgewicht_Belag_hinten_oben, Endgewicht_Belag_hinten_unten,Anfangsgewicht_Scheibe,Endgewicht_Scheibe', 'Friktionstest', 'Testnummer=' + frmtestauswahl.cbotestnummer.Text, '', ''); Query.Open; while not Query.Eof do begin agewvo := (Query.FieldsByName['Anfangsgewicht_Belag_vorne_oben'].AsFloat); agewvu := (Query.FieldsByName['Anfangsgewicht_Belag_vorne_unten'].AsFloat); agewho := (Query.FieldsByName['Anfangsgewicht_Belag_hinten_oben'].AsFloat); agewhu := (Query.FieldsByName['Anfangsgewicht_Belag_hinten_unten'].AsFloat); egewvo := (Query.FieldsByName['Endgewicht_Belag_vorne_oben'].AsFloat); egewvu := (Query.FieldsByName['Endgewicht_Belag_vorne_unten'].AsFloat); egewho := (Query.FieldsByName['Endgewicht_Belag_hinten_oben'].AsFloat); egewhu := (Query.FieldsByName['Endgewicht_Belag_hinten_unten'].AsFloat); agewscheibe := (Query.FieldsByName['Anfangsgewicht_Scheibe'].AsFloat); egewscheibe := (Query.FieldsByName['Endgewicht_Scheibe'].AsFloat); if ((agewvo = 0.00) and (agewvu = 0.00) and (agewho = 0.00) and (agewhu = 0.00) and (egewvo = 0.00) and (egewvu = 0.00) and (egewho = 0.00) and (egewhu = 0.00) and (agewscheibe = 0.00) and (egewscheibe = 0.00)) then begin Showmessage('Es gibt keine Werte für diese Testnummer'); //ShowMessage(Query.SQL.Text); end else begin lblbelagverschleiss.Caption := FloatToStr((agewvo + agewvu + agewho + agewhu) - (egewvo + egewvu + egewho + egewhu)); lblscheibeverschleiss.Caption := FloatToStr(agewscheibe + egewscheibe); end; Query.Next; end; Query.Close; end; |
Re: if anweisung
Ich würde das mit 'ner StringListe machen !
Etwa so !
Delphi-Quellcode:
var StringList : TStringList;
i : Integer; begin StringList := TStringList.Create; with DataModule1 do begin Query.SQL.Clear; Query.SQL.Text:= selectsql('Anfangsgewicht_Belag_vorne_oben, Anfangsgewicht_Belag_vorne_unten, Anfangsgewicht_Belag_hinten_oben, Anfangsgewicht_Belag_hinten_unten, Endgewicht_Belag_vorne_oben, Endgewicht_Belag_vorne_unten, Endgewicht_Belag_hinten_oben, Endgewicht_Belag_hinten_unten','Friktionstest','Testnummer=' + frmtestauswahl.cbotestnummer.Text,'', ''); Query.Open; while not Query.Eof do begin for i := 0 to 7 do StringList.Add(Query.Fields[i].AsString); Query.SQL.Clear; Query.SQL.Text:=selectsql ('Anfangsgewicht_Scheibe,Endgewicht_Scheibe','Friktionstest', 'Testnummer='+frmtestauswahl.cbotestnummer.Text,'',''); Query.Open; StringList.Add(Query.Fields[0].AsString); StringList.Add(Query.Fields[1].AsString); if StringList.Text = '' then begin Showmessage('Es gibt keine Werte für diese Testnummer'); //ShowMessage(Query.SQL.Text); close; end else lblbelagverschleiss.Caption :=FloatToStr((StrToFloat(StringList[0]) + StrToFloat(StringList[1]) + StrToFloat(StringList[2]) + StrToFloat (StringList[3])) - (StrToFloat(StringList[4]) + StrToFloat(StringList[5]) + StrToFloat(StringList[6]) + StrToFloat(StringList[7]))); lblscheibeverschleiss.Caption:=FloatToStr(StrToFloat(StringList[8]) +StrToFloat(StringList[9])); Query.Next; Query.Close; end; StringList.Free; end; |
Re: if anweisung
Zitat:
Delphi-Quellcode:
var
s : string; begin s := 'Text mit mehr als 255 Zeichen'; // -> Fehler. s := 'Text mit bis zu 255 Zeichen' + 'wieder 255 Zeichen' + 'und noch einmal 255 Zeichen'; //-> Kein Fehler end; |
Re: if anweisung
Zitat:
|
Re: if anweisung
Wenn der If-Fall nicht eintritt, dann ist die Bedingung nicht erfüllt. Da kannst du nicht dran rütteln.
Debuggen und jede Variable einzeln prüfen. Ändere doch mal die Bedingung und überprüfe die Länge der Strings (falls du überhaupt noch die String-Variante verwendest). Wenn sie leer sind, ist Length(variable) = 0. |
Re: if anweisung
Zitat:
Dann sind meine Programme wohl zu klein :mrgreen: Ernsthaft: Ich bin noch nie auf die Idee gekommen, so lange Strings in der IDE zu verwenden. Wäre mir zu unübersichtlich (nur mal so als Tipp an cell). |
Re: if anweisung
Hallo :hi:,
lass dir doch die Werte mal ausgeben, vielleicht findest du dann den Fehler. :) MfG freak |
Re: if anweisung
Hallo,
255 Zeichen lange Strings zu lesen ist einfach sehr unübersichtlich. Aber vielleicht lässt sich ja der SQL-Text so gestaltem
SQL-Code:
und dann auf die einzelnen Felder so zugreifen:
Select * from tabelle
Delphi-Quellcode:
mfg
while not Query1.Eof do
begin agewvo := (Query1.FieldbyName('Anfangsgewicht_Belag_vorne_oben').AsFloat); agewvu := (Query1.FieldbyName('('Anfangsgewicht_Belag_vorne_unten').AsFloat); ..... wo |
Re: if anweisung
Also wenn ich auf Arbeit nen
Delphi-Quellcode:
mache, bekomm ich immer fast die Finger abgehauen... :mrgreen:
Select * from table
Und zwar aus Performancegründen, wenn die Daten übers Netzwerk gehen und die Tabelle mehr Spalten hat müssen dann ja immer alle Daten "geholt" werden und das lastet aus... (Aber das nur am Rande) Die Variante mit dem FieldbyName ist natürlich dahingehend sicherer, weil du man dann immer genau weis, dass die Daten wirklich aus dieser Spalte kommen...und es ist einfacher zu lesen/erkennen. |
Re: if anweisung
Hallo,
Zitat:
Hier hatte ich nur den Eindruck das er eh alle Felder haben will und mit mehr als 255 Zeichen ein Problem hat. Wenn er erst mal da Ruhe hat, kann er sich auf sein if-Problem konzentrieren. mfg wo |
Re: if anweisung
Versuchs doch mit einem try .. except Block Marke:
Delphi-Quellcode:
try
Wert:=FtrToFloar(Var1)+......; except ShowMessageFmt('Keine Werte für Datensatz %i.',[Query.ActiveIndex]); end; |
Re: if anweisung
nein es sind nicht alle werte die ich ausgeben will, aber ich hab das problem schon gelöst , dafür hab ich ein neues =D
aber ich mach ein n eues thema auf :mrgreen: |
Re: if anweisung
Hallo :hi:,
verrätst du uns auch, wie? :mrgreen: MfG freak |
Re: if anweisung
jop klar =D hier ist der quelltext
Delphi-Quellcode:
hf
procedure Tfrmmdichild.FormActivate(Sender: TObject);
//------------------------------------------------------------------------------ // firstRun: nur beim ersten Aufruf muß Leerfeld kontrolliert werden!!! //------------------------------------------------------------------------------ var boolResult: boolean; agewvo: string; agewvu: string; agewho: string; agewhu: string; egewvo: string; egewvu: string; egewho: string; egewhu: string; agewscheibe: string; egewscheibe: string; begin with DataModule1 do begin Query.SQL.Clear; Query.SQL.Text:= selectsql('Anfangsgewicht_Belag_vorne_oben, Anfangsgewicht_Belag_vorne_unten, Anfangsgewicht_Belag_hinten_oben, Anfangsgewicht_Belag_hinten_unten, Endgewicht_Belag_vorne_oben, Endgewicht_Belag_vorne_unten, Endgewicht_Belag_hinten_oben, Endgewicht_Belag_hinten_unten','Friktionstest','Testnummer=' + frmtestauswahl.cbotestnummer.Text,'', ''); Query.Open; while not Query.Eof do begin agewvo:=(Query.Fields[0].AsString); agewvu:=(Query.Fields[1].AsString); agewho:=(Query.Fields[2].AsString); agewhu:=(Query.Fields[3].AsString); egewvo:=(Query.Fields[4].AsString); egewvu:=(Query.Fields[5].AsString); egewho:=(Query.Fields[6].AsString); egewhu:=(Query.Fields[7].AsString); boolResult:=((agewvo ='') Or (agewvu ='') Or (agewho ='') Or (agewhu ='') Or (egewvo ='') Or (egewvu ='') Or (egewho ='') Or (egewhu ='')) And firstRun; if boolResult then begin Showmessage('Der Verschleiß vom Belag konnte nicht berechnet werden'); end else lblbelagverschleiss.Caption :=FloatToStr((StrToFloat(agewvo) + StrToFloat(agewvu) + StrToFloat(agewho) + StrToFloat(agewhu)) - (StrToFloat(egewvo) + StrToFloat(egewvu) + StrToFloat(egewho) + StrToFloat(egewhu))); firstRun:=false; Query.Next; Query.Close; end;//while end;//with |
Alle Zeitangaben in WEZ +1. Es ist jetzt 02:32 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