Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Delphi Fastreport Objekt in abhängikeit von DB Feld (https://www.delphipraxis.net/133704-fastreport-objekt-abhaengikeit-von-db-feld.html)

manfred_h 7. Mai 2009 08:23

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:
procedure PLACEMENTOnBeforePrint(Sender: TfrxComponent);
begin
  if <default.FieldByName('PLACEMENT')> is not NULL then
  begin
    PLACEMENT.Visible
  end              
end;
Es erschein immer die Fehlermeldung:
Could not convert variant of type (Null) into type (Integer
Unknown variable or Datafield: default.FieldByName('PLACEMENT')

Habt Ihr einen Tipp?

Manfred

mkinzler 7. Mai 2009 08:29

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.

manfred_h 7. Mai 2009 08:36

Re: Fastreport Objekt in abhängikeit von DB Feld
 
Hallo mkinzler

Danke für Deine schnelle Antwort.

Shalom
Manfred

Hansa 7. Mai 2009 08:59

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.

mkinzler 7. Mai 2009 09:05

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

hanspeter 7. Mai 2009 09:40

Re: Fastreport Objekt in abhängikeit von DB Feld
 
Zitat:

Zitat von manfred_h
Es erschein immer die Fehlermeldung:
Could not convert variant of type (Null) into type (Integer
Unknown variable or Datafield: default.FieldByName('PLACEMENT')

Habt Ihr einen Tipp?

Manfred


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

manfred_h 7. Mai 2009 10:53

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:
SELECT
    ID,ACCEPTANCE,STATUS,NOTE,NC,CS,OPT,
    L_UPDATE,STAT_UPDATE,STAT_DEL,'' SCHOOLJ,'' PERSONS
FROM HOTEL
aber die Variante mit Dataset.FieldExist währe das angemehmste. Habe es aber noch nicht hinbekommen.

@Peter: Danke für Deine Hinweise.

Shalom
Manfred

manfred_h 8. Mai 2009 16:17

Re: Fastreport Objekt in abhängikeit von DB Feld
 
Hallo nochmals

habe noch einen Tipp aus der Fastreport Newsgroup bekommen.
Delphi-Quellcode:
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;
Was mir nicht ganz klar ist, wie kann ich hier das Objekt 'PERSONS' ein/ausschalten.
Der Punkt
Delphi-Quellcode:
>> somevar := ds.Value[list[i]]; // get field value by its name
ist das was mir nicht klar ist. Ich muss ja noch definieren welches Feld er suchen soll. :coder2:

Ein kleiner Tipp?
Manfred

mkinzler 8. Mai 2009 17:21

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

manfred_h 11. Mai 2009 16:09

Re: Fastreport Objekt in abhängikeit von DB Feld
 
Hallo nochmals

bin ein wenig weiter..

Delphi-Quellcode:
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;
if ['db_list'] ist in Klamern da dies anscheinend Notwenig ist.
Zitat:

Make sure when passing the variable a value if it is a string variable to
use extra apostrophe's ['myvariable'] = ''''+string+''''
or it will be an expression and trigger the ogv event.
Erhalte aber immer noch eine Fehlermeldung:
Invalid Variant Operation

PS: Bei dem Wert PERSONS geht es nicht um den Inhalt der Spalte sondern um den Splatennamen.

mkinzler 11. Mai 2009 17:32

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

manfred_h 11. Mai 2009 17:45

Re: Fastreport Objekt in abhängikeit von DB Feld
 
Das wars!! Danke mkinzler :thumb:

Delphi-Quellcode:
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;
Shalom
Manfred

mkinzler 11. Mai 2009 17:49

Re: Fastreport Objekt in abhängikeit von DB Feld
 
Die For-Schleife ist aber auch noch unnötig

rbi 11. Mai 2009 17:58

Re: Fastreport Objekt in abhängikeit von DB Feld
 
Hallo

versuche einmal den Code wie folgt zu erweitern:

Delphi-Quellcode:
  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;
[edit=mkinzler]Delphi-Tag eingefügt Mfg, mkinzler[/edit]

mkinzler 11. Mai 2009 18:00

Re: Fastreport Objekt in abhängikeit von DB Feld
 
@rbi: Du scheinst weder die Frage noch den Verlauf richtig gelesen zu haben

manfred_h 11. Mai 2009 18:06

Re: Fastreport Objekt in abhängikeit von DB Feld
 
Danke nochmals. :dp:

hier nochmals ohne for Schlaufe:

Delphi-Quellcode:
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;
Danke :cheer:
Manfred

mkinzler 11. Mai 2009 18:31

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;
...

manfred_h 12. Mai 2009 09:12

Re: Fastreport Objekt in abhängikeit von DB Feld
 
Besteht ein Vorteile bei einer Variante?

Manfred

mkinzler 12. Mai 2009 09:14

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

manfred_h 12. Mai 2009 09:36

Re: Fastreport Objekt in abhängikeit von DB Feld
 
Danke für den Hiinweis :wink:

Delphi-Quellcode:
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;
Shalom
Manfred

manfred_h 8. Jun 2009 09:45

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:
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;
versucht habe ich es so:
Delphi-Quellcode:
    if list[i]='PERSONS' then
    begin
      var_dist_persons.Visible := true; //Feld vorhanden
      dist_persons.Visible := true;
    end
    else var_dist_persons.Visible := false;
    //
Dies natürlich bei jedem if list[i]= leider ohne Erfolg.
Die Datenbankabfrage ist garantiert ok.

Bin für einen Tipp dankbar.
Manfred

squetk 8. Jun 2009 22:09

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...

manfred_h 9. Jun 2009 12:51

Re: Fastreport Objekt in abhängikeit von DB Feld
 
Hallo squetk

Zitat:

Auch wenn das Problem an sich schon gelöst ist: Es gibt im FastReport-Script durchaus eine Möglichkeit, die Existenz eines Datenfeldes abzufragen:
leider ist es noch nicht ganz gelöst ( siehe ein Post weiter oben ).
Danke für Deinen Vorschlag werde das Testen.

Manfred

manfred_h 10. Jun 2009 13:57

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:
   
if list[i]='CAT' then
    begin
      var_dist_cat.Visible := true;
      dist_cat.Visible := true;
    end;
  // ds.Next;
  end;
  ds.Next;    
end;
@squetk
Wenn ich Deinen Idee Teste erhalte ich immer die Fehlermeldung:
> Undeclared identifier:'default'

Delphi-Quellcode:
  if default.DataSet.HasField('PERSONS') then
    begin
     var_dist_persons.Visible := true; //Feld vorhanden
     dist_persons.Visible := true;
    end;
Manfred

manfred_h 11. Jun 2009 14:42

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:
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;
Shalom
Manfred

squetk 11. Jun 2009 21:53

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;

manfred_h 12. Jun 2009 13:35

Re: Fastreport Objekt in abhängikeit von DB Feld
 
Danke für den Tipp squetk.

Manfred


Alle Zeitangaben in WEZ +1. Es ist jetzt 16:49 Uhr.

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