Zitat:
Exit, ohne vorher das Result zu initialisieren ... selbst Schuld, wenn es hier mal ein Problem gibt.
(dein Pech, dass die entsprechende Compilerwarnung für gemagte Typen leider nicht kommt)
Beispiel: rufe deine Funktion zwei Mal hintereinander auf, oder in einer Schleife ... dann wirst du viel Spaß haben.
Vorher abfragen, ob es das Feld gibt
Delphi-Quellcode:
if myDb.Connected and (aID <> 0) then
begin
MyQuery := TFDQuery.Create(nil);
try
myQuery.Connection := myDb;
myQuery.SQL.Text := 'select * from &aTabelle limit 0';
myQuery.MacroByName('aTabelle').Value := aTabelle;
myQuery.Open;
if myQuery.FindField('GELOESCHT') <> nil then
myQuery.SQL.Text := 'select :aFeld from &aTabelle where ID = :aID '
+ ' and GELOESCHT = 0 '
else
myQuery.SQL.Text := 'select :aFeld from &aTabelle where ID = :aID ';
myQuery.Close;
myQuery.ParamByName('aFeld').AsString := aFeld;
myQuery.MacroByName('aTabelle').Value := aTabelle;
myQuery.ParamByName('aId').AsInteger := aId;
myQuery.Open;
Result := myQuery.FieldByName(aFeld).Value;
finally
myQuery.Free;
end;
end
else
Exit(Null);
oder nachher dessen Wert prüfen, wenn es das Feld gibt
Delphi-Quellcode:
Result := Null;
if myDb.Connected and (aID <> 0) then
begin
MyQuery := TFDQuery.Create(nil);
try
myQuery.Connection := myDb;
myQuery.SQL.Text := 'select * from &aTabelle where ID = :aID ';
myQuery.ParamByName('aFeld').AsString := aFeld;
myQuery.MacroByName('aTabelle').Value := aTabelle;
myQuery.ParamByName('aId').AsInteger := aId;
myQuery.Open;
if (myQuery.FindField('GELOESCHT') <> nil) and (myQuery.FieldByName('GELOESCHT').AsInteger = 0) then
Result := myQuery.FieldByName(aFeld).Value;
finally
myQuery.Free;
end;
end;
oder falls es Gelöscht und Nicht-Gelöscht gleichzeitig geben kann
Delphi-Quellcode:
myQuery.Open;
if (myQuery.FindField('GELOESCHT') = nil) or myQuery.Locate('GELOESCHT', 0, []) then
Result := myQuery.FieldByName(aFeld).Value;
finally