![]() |
Datenbank: Firebird • Version: 2.1 • Zugriff über: Fibplus 6.50
Fastreport Objekt in abhängikeit von DB Feld
Hallo zusammen
in einer Anwendung verwede ich einen Report für mehrere Ausdruckvarianten mit wechselnden Feldern in den Datasets. Dies geht auch einwandfrei. Nun sind aber in einigen Datasets Felder die in anderen nicht vorhanden sind. Bis jetzt habe ich das versucht ( und ähnliches ): ( Fastreport Script )
Delphi-Quellcode:
Es erschein immer die Fehlermeldung:
procedure PLACEMENTOnBeforePrint(Sender: TfrxComponent);
begin if <default.FieldByName('PLACEMENT')> is not NULL then begin PLACEMENT.Visible end end; Could not convert variant of type (Null) into type (Integer Unknown variable or Datafield: default.FieldByName('PLACEMENT') Habt Ihr einen Tipp? Manfred |
Re: Fastreport Objekt in abhängikeit von DB Feld
Sorge einfach dafür, dass in allen Datasets die selben Felder sind. Ich weiss nicht, ob man in FastScript auf die Existenz von Feldern prüfen kann; deine Abfrage fragt ja nur ab, ob der wert des Feldes NULL ist, existiert das Feld nicht kommt die gennate Fehlermeldung.
|
Re: Fastreport Objekt in abhängikeit von DB Feld
Hallo mkinzler
Danke für Deine schnelle Antwort. Shalom Manfred |
Re: Fastreport Objekt in abhängikeit von DB Feld
Nun ja, per Holzhammer dafür sorgen, dass überflüssige Felder in der DB sind das geht wohl auch. :zwinker: Ich würde allerdings eher Dataset.FieldExist auswerten.
|
Re: Fastreport Objekt in abhängikeit von DB Feld
Es handelt sich hier aber nicht um Delphi, sondern die Pascalvariante von Fastcript. Wenn dort diese Methode existiert, dann sollte man diese natürlich verwenden
|
Re: Fastreport Objekt in abhängikeit von DB Feld
Zitat:
Das Problem tritt an einigen Stellen auf. Zum Beispiel auch, wenn in einem Vergleich eine leere Zeichenkette vorhanden ist. Ich habe den Eindruck, das es sich hier um einen Bug im Fastreport handelt. Der Scriptinterpreter versucht für den Vergleich in einen Integer Wert zu wandeln. Ist das nicht möglich, dann kommt dieser Fehler. Die Exception tritt in Fastsript auch auf wenn ich z.B. eine Spalte summiere und es hier eine Leerzeile gibt. Ich habe mir damals geholfen, indem ich im Quellcode des Scriptinterpreters die Konvertierung gepatcht habe. ( if isNull or length(Val)=0 then result := 0; Gruß Peter |
Re: Fastreport Objekt in abhängikeit von DB Feld
@Hansa: Danke für Deinen Hinweis. Die DB muss ja nicht unbeding gefüllt werden es reicht ja wenn man es so löst:
SQL-Code:
aber die Variante mit Dataset.FieldExist währe das angemehmste. Habe es aber noch nicht hinbekommen.
SELECT
ID,ACCEPTANCE,STATUS,NOTE,NC,CS,OPT, L_UPDATE,STAT_UPDATE,STAT_DEL,'' SCHOOLJ,'' PERSONS FROM HOTEL @Peter: Danke für Deine Hinweise. Shalom Manfred |
Re: Fastreport Objekt in abhängikeit von DB Feld
Hallo nochmals
habe noch einen Tipp aus der Fastreport Newsgroup bekommen.
Delphi-Quellcode:
Was mir nicht ganz klar ist, wie kann ich hier das Objekt 'PERSONS' ein/ausschalten.
procedure DefaultPERSONSOnBeforePrint(Sender: TfrxComponent);
var i: Integer; ds: TfrxDataSet; list: TStringList; begin ds := Report.GetDataset('default');// username of ds list := TStringList.Create; ds.GetFieldList(list); for i := 0 to list.Count - 1 do somevar := ds.Value[list[i]]; // get field value by its name end; Der Punkt
Delphi-Quellcode:
ist das was mir nicht klar ist. Ich muss ja noch definieren welches Feld er suchen soll. :coder2:
>> somevar := ds.Value[list[i]]; // get field value by its name
Ein kleiner Tipp? Manfred |
Re: Fastreport Objekt in abhängikeit von DB Feld
Es wird dir eine Liste mit allen Felder geliefert. Jetzt musst du überprüfen, ob dein Feld dabei ist
|
Re: Fastreport Objekt in abhängikeit von DB Feld
Hallo nochmals
bin ein wenig weiter..
Delphi-Quellcode:
if ['db_list'] ist in Klamern da dies anscheinend Notwenig ist.
procedure DefaultPERSONSOnBeforePrint(Sender: TfrxComponent);
var i: Integer; ds: TfrxDataSet; list: TStringList; db_list: String; begin ds := Report.GetDataset('default');// username of ds list := TStringList.Create; ds.GetFieldList(list); for i := 0 to list.Count - 1 do begin db_list := ds.Value[list[i]]; // get field value by its name if ['db_list'] = 'PERSONS' then DefaultPERSONS.Visible := true; ds.Next; end; end; Zitat:
Invalid Variant Operation PS: Bei dem Wert PERSONS geht es nicht um den Inhalt der Spalte sondern um den Splatennamen. |
Re: Fastreport Objekt in abhängikeit von DB Feld
So sollte es überprüfbar sein
Delphi-Quellcode:
if list.IndexOf('Persons') > -1 then //Feld vorhanden
|
Re: Fastreport Objekt in abhängikeit von DB Feld
Das wars!! Danke mkinzler :thumb:
Delphi-Quellcode:
Shalom
procedure DefaultPERSONSOnBeforePrint(Sender: TfrxComponent);
var i: Integer; ds: TfrxDataSet; list: TStringList; db_list: String; begin ds := Report.GetDataset('default');// username of ds list := TStringList.Create; ds.GetFieldList(list); for i := 0 to list.Count - 1 do begin if list.IndexOf('Persons') > -1 then //Feld vorhanden DefaultPERSONS.Visible := true; ds.Next; end; end; Manfred |
Re: Fastreport Objekt in abhängikeit von DB Feld
Die For-Schleife ist aber auch noch unnötig
|
Re: Fastreport Objekt in abhängikeit von DB Feld
Hallo
versuche einmal den Code wie folgt zu erweitern:
Delphi-Quellcode:
[edit=mkinzler]Delphi-Tag eingefügt Mfg, mkinzler[/edit]
for i := 0 to list.Count - 1 do
begin if ds.Value[list[i]]<>NULL then begin db_list := ds.Value[list[i]]; // get field value by its name if db_list = 'PERSONS' then DefaultPERSONS.Visible := true; end; ds.Next; end; |
Re: Fastreport Objekt in abhängikeit von DB Feld
@rbi: Du scheinst weder die Frage noch den Verlauf richtig gelesen zu haben
|
Re: Fastreport Objekt in abhängikeit von DB Feld
Danke nochmals. :dp:
hier nochmals ohne for Schlaufe:
Delphi-Quellcode:
Danke :cheer:
procedure DetailData1OnBeforePrint(Sender: TfrxComponent);
var i: Integer; ds: TfrxDataSet; list: TStringList; db_list: String; begin ds := Report.GetDataset('default');// username of ds list := TStringList.Create; ds.GetFieldList(list); begin if list.IndexOf('PERSONS') > -1 then //Feld vorhanden DefaultPERSONS.Visible := true; if list.IndexOf('WORKER') > -1 then //Feld vorhanden DefaultWORKER.Visible := true; if list.IndexOf('PLACEMENT') > -1 then //Feld vorhanden DefaultPLACEMENT.Visible := true; if list.IndexOf('BEDS') > -1 then //Feld vorhanden DefaultBEDS.Visible := true; if list.IndexOf('Q_GIDEONS') > -1 then //Feld vorhanden DefaultQ_GIDEONS.Visible := true; if list.IndexOf('CAT') > -1 then //Feld vorhanden DefaultCAT.Visible := true; ds.Next; end; end; Manfred |
Re: Fastreport Objekt in abhängikeit von DB Feld
Dah <TStringList>.IndexOf() intern eine Schleife verwendet könnte man evaluieren, das Ganze iinerhalb einer Schleife zu machen:
Delphi-Quellcode:
PersonsVorhanden := False;
... for i := 0 to list.Count -1 do begin if list[i] = 'PERSONS' then PersonsVorhanden := True;//Feld vorhanden ... end; DefaultPERSONS.Visible := PersonsVorhanden; ... |
Re: Fastreport Objekt in abhängikeit von DB Feld
Besteht ein Vorteile bei einer Variante?
Manfred |
Re: Fastreport Objekt in abhängikeit von DB Feld
Bei vielen Feldern könnte die erste etwas langsam sein, da bei jedem .IndexOf() eine intern eine Schleife durchlaufen wird
|
Re: Fastreport Objekt in abhängikeit von DB Feld
Danke für den Hiinweis :wink:
Delphi-Quellcode:
Shalom
procedure DetailData1OnBeforePrint(Sender: TfrxComponent);
var i: Integer; ds: TfrxDataSet; list: TStringList; db_list: String; begin ds := Report.GetDataset('default');// username of ds list := TStringList.Create; ds.GetFieldList(list); for i := 0 to list.Count -1 do begin if list[i]='PERSONS' then DefaultPERSONS.Visible := true; //Feld vorhanden if list[i]='WORKER' then dist_worker.Visible := true; if list[i]='PLACEMENT' then DefaultPLACEMENT.Visible := true; if list[i]='BEDS' then DefaultBEDS.Visible := true; if list[i]='Q_GIDEONS' then DefaultQ_GIDEONS.Visible := true; if list[i]='CAT' then DefaultCAT.Visible := true; ds.Next; end; end; Manfred |
Re: Fastreport Objekt in abhängikeit von DB Feld
Hallo nochmals
leider hat sich da ein Fehler eingeschlichen. Habe das bis jetzt nicht bemerkt. Es werden nicht mehr alle Datensätzte dargestellt. Dies versuchte ich bis jetzt wie folgt zu lösen: "bestehender" Code:
Delphi-Quellcode:
versucht habe ich es so:
procedure DetailData1OnBeforePrint(Sender: TfrxComponent);
var i: Integer; ds: TfrxDataSet; list: TStringList; db_list: String; begin ds := Report.GetDataset('default');// username of ds list := TStringList.Create; ds.GetFieldList(list); for i := 0 to list.Count -1 do begin if list[i]='PERSONS' then begin var_dist_persons.Visible := true; //Feld vorhanden dist_persons.Visible := true; end; // if list[i]='WORKER' then begin var_dist_worker.Visible := true; dist_worker.Visible := true; end; // if list[i]='PLACEMENT' then begin var_dist_placement.Visible := true; dist_placement.Visible := true; end; // if list[i]='BEDS' then begin var_dist_beds.Visible := true; dist_beds.Visible := true; end; // if list[i]='Q_GIDEONS' then begin var_dist_q_gideons.Visible := true; dist_q_gideons.Visible := true; end; // if list[i]='CAT' then begin var_dist_cat.Visible := true; dist_cat.Visible := true; end; // ds.Next; end; end;
Delphi-Quellcode:
Dies natürlich bei jedem if list[i]= leider ohne Erfolg.
if list[i]='PERSONS' then
begin var_dist_persons.Visible := true; //Feld vorhanden dist_persons.Visible := true; end else var_dist_persons.Visible := false; // Die Datenbankabfrage ist garantiert ok. Bin für einen Tipp dankbar. Manfred |
Re: Fastreport Objekt in abhängikeit von DB Feld
Auch wenn das Problem an sich schon gelöst ist: Es gibt im FastReport-Script durchaus eine Möglichkeit, die Existenz eines Datenfeldes abzufragen:
Delphi-Quellcode:
if MasterDataXYZ.DataSet.HasField('FIELDNAME') then...
|
Re: Fastreport Objekt in abhängikeit von DB Feld
Hallo squetk
Zitat:
Danke für Deinen Vorschlag werde das Testen. Manfred |
Re: Fastreport Objekt in abhängikeit von DB Feld
habe bemerkt das ich ds.Next; zwei Zeilen zu weit oben hatte.
Es wird nun die hälfte der Daten dargestellt.
Delphi-Quellcode:
@squetkif list[i]='CAT' then begin var_dist_cat.Visible := true; dist_cat.Visible := true; end; // ds.Next; end; ds.Next; end; Wenn ich Deinen Idee Teste erhalte ich immer die Fehlermeldung: > Undeclared identifier:'default'
Delphi-Quellcode:
Manfred
if default.DataSet.HasField('PERSONS') then
begin var_dist_persons.Visible := true; //Feld vorhanden dist_persons.Visible := true; end; |
Re: Fastreport Objekt in abhängikeit von DB Feld
Das Problem ist gelöst.
Es darf kein ds.Next; verwendet werden. hier die funktionierende Version:
Delphi-Quellcode:
Shalom
procedure DetailData1OnBeforePrint(Sender: TfrxComponent);
var i: Integer; ds: TfrxDataSet; list: TStringList; db_list: String; begin ds := Report.GetDataset('default');// username of ds list := TStringList.Create; ds.GetFieldList(list); for i := 0 to list.Count -1 do begin if list[i]='PERSONS' then begin var_dist_persons.Visible := true; dist_persons.Visible := true; end; // if list[i]='WORKER' then begin var_dist_worker.Visible := true; dist_worker.Visible := true; end; // if list[i]='PLACEMENT' then begin var_dist_placement.Visible := true; dist_placement.Visible := true; end; // if list[i]='BEDS' then begin var_dist_beds.Visible := true; dist_beds.Visible := true; end; // if list[i]='Q_GIDEONS' then begin var_dist_q_gideons.Visible := true; dist_q_gideons.Visible := true; end; // if list[i]='CAT' then begin var_dist_cat.Visible := true; dist_cat.Visible := true; end; end; end; Manfred |
Re: Fastreport Objekt in abhängikeit von DB Feld
Es müsste so funktionieren:
Delphi-Quellcode:
var
ds: TfrxDataSet; begin ds := Report.GetDataset('default');// username of ds if ds.HasField('PERSONS') then begin var_dist_persons.Visible := true; //Feld vorhanden dist_persons.Visible := true; end; |
Re: Fastreport Objekt in abhängikeit von DB Feld
Danke für den Tipp squetk.
Manfred |
Alle Zeitangaben in WEZ +1. Es ist jetzt 22:05 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