[gelöst]Report, der auf 2 Tabellen zugreift

25. März 2010 12:14

Hallo zusammen,
ja, ich weiß das Thema gabs schon, aber das hilft mir irgendwie nicht weiter. Ich schildere mal um was es geht:

Ich möchte einen Report erstellen, der Daten zweier Tabellen ausgibt. Das heißt, wenn auf einen Datensatz eine best. Bedingung zutrifft, soll aus Tab2 der dazugehörige Wert gesucht werden.
Ich habe also Tab2 als DateItem angelegt und eingerückt, da es immer pro Datensatz durchlaufen werden muss. Dann habe ich das Feld DataItemLink befüllt, in dem ich die Felder, die in beiden Tabellen vorkommen, einander zugeordnet habe. Nun fehlen meinem empfinden nach Nav noch einige Infos, damit es mir die richtigen Daten in dem Report ausgeben kann:
1. Nav sollte wissen, dass es 2 Bedingungen gibt, wann es nur die 2 Tabelle durchsuchen muss. (Sowas wie wenn der Kontakt Typ A oder Typ B ist, dann durchlaufe die Tabelle2. Mache das aber nicht, wenn der Kontakt Typ C oder Typ D ist.) Ich glaube, dass diese Info dann im Code zur Tab1 stehen müsste.
2. In den Properties von Tab2 steht ja schon aufgrund welchen Feldes der entsprechende Kontakt in der Tab2 gefunden werden kann. Dann müsste im Code der Tab 2 vermutlich nurnoch stehen, welches Feld dann im Report ausgegeben soll. Muss ich das über eine Variable machen, oder kann ich in den Sections dann einfach Tab2.Field als Quelle angeben?

Ich hoffe, das war verständlich...ich arbeite noch nicht so lange mit Nav und bin noch nicht so ganz fit in all dem.

Es wäre klasse, hätte da jemand einen Tipp für mich.

Viele Grüße!

Miriam
Zuletzt geändert von MSchifferdecker am 28. April 2010 10:37, insgesamt 1-mal geändert.

Re: Report, der auf 2 Tabellen zugreift

25. März 2010 12:28

Hallo Miriam,

sowas wie Bedingungen für DataItemLinks gibt es nicht. Verlinkt ist verlinkt.

Zu 1.: Du könntest statt dem Dataitem selbst eine Record-Variable definieren und die (wenn die Bedingungen zutreffen) deinen Datensatz suchen.
Zu 2.: Ja, als Source kann man auch Record.Field angeben. Du musst jedoch beachten, dass der Wert angedruckt wird, welchen das Feld zu dem Zeitpunkt der Section hat.

Grüße,
Sebastian

Re: Report, der auf 2 Tabellen zugreift

25. März 2010 13:03

Hallo Sabastian,
vielen Dank für deine schnelle Antwort.
Ich habe mir bereits überlegt Tab2 als Recordvariable einzufügen, doch kam ich dann mit dem Code nicht klar...mein Problem ist auch, dass der Wert aus Tab 1 in der Tab 2 an 2 verschiedenen Stellen stehen kann.
Hast Du vielleicht einen Muster-code für mich, aus dem ich es mir ableiten kann?
Das wäre super!
Viele Grüße
Miriam

Re: Report, der auf 2 Tabellen zugreift

25. März 2010 13:08

MSchifferdecker hat geschrieben:1. Nav sollte wissen, dass es 2 Bedingungen gibt, wann es nur die 2 Tabelle durchsuchen muss. (Sowas wie wenn der Kontakt Typ A oder Typ B ist, dann durchlaufe die Tabelle2. Mache das aber nicht, wenn der Kontakt Typ C oder Typ D ist.) Ich glaube, dass diese Info dann im Code zur Tab1 stehen müsste.
2. In den Properties von Tab2 steht ja schon aufgrund welchen Feldes der entsprechende Kontakt in der Tab2 gefunden werden kann. Dann müsste im Code der Tab 2 vermutlich nurnoch stehen, welches Feld dann im Report ausgegeben soll. Muss ich das über eine Variable machen, oder kann ich in den Sections dann einfach Tab2.Field als Quelle angeben?


Vielleicht hilft dir das für den Code weiter:
Code:
CLEAR(Tabelle2); // sicher gehen das nicht angedruckt wird, falls Typ nicht stimmt
IF (Tabelle1.Typ = Tabelle1.Typ::A) OR (Tabelle1.Typ = Tabelle1.Typ::B) THEN BEGIN
  // Durchlaufe Tabelle 2
  Tabelle2.RESET;
  Tabelle2.SETRANGE(...);
  IF Tabelle2.FINDFIRST THEN BEGIN
    // tue etwas mit Tabelle2
  END;
END;

Re: Report, der auf 2 Tabellen zugreift

25. März 2010 13:55

Zum Code hat Danjo schon etwas geschrieben. Zum Thema mit den verschiedenen Orten: leider gibts dafür keine schöne Lösung. Was möglich ist: mehrere Felder definieren und deine Logik bestimmt dann, in welchem Feld der Wert erscheinen soll.

[code]IF [...] THEN BEGIN
MOEGLICHERORT1 := WERTMEINERVARIABLEN;
MOEGLICHERORT2 := '';
END ELSE BEGIN
MOEGLICHERORT1 := '';
MOEGLICHERORT2 := WERTMEINERVARIABLEN;
END;

Gruß,
Sebastian

Re: Report, der auf 2 Tabellen zugreift

25. März 2010 14:19

MSchifferdecker hat geschrieben:1. Nav sollte wissen, dass es 2 Bedingungen gibt, wann es nur die 2 Tabelle durchsuchen muss. (Sowas wie wenn der Kontakt Typ A oder Typ B ist, dann durchlaufe die Tabelle2. Mache das aber nicht, wenn der Kontakt Typ C oder Typ D ist.) Ich glaube, dass diese Info dann im Code zur Tab1 stehen müsste.
2. In den Properties von Tab2 steht ja schon aufgrund welchen Feldes der entsprechende Kontakt in der Tab2 gefunden werden kann. Dann müsste im Code der Tab 2 vermutlich nurnoch stehen, welches Feld dann im Report ausgegeben soll. Muss ich das über eine Variable machen, oder kann ich in den Sections dann einfach Tab2.Field als Quelle angeben?

Macht ihr es euch nicht etwas kompliziert? Ein
Code:
if Tab1.ContactTyp in[Tab1.ContactTyp::C,Tab1.ContactTyp::D]then
  CurrReport.break;

im OnPreDataItem von Tab2 sollte doch ausreichen.

Re: Report, der auf 2 Tabellen zugreift

25. März 2010 14:20

So wie ich das verstanden habe, kannst du durchaus den Report so lassen, d.h. mit den zwei DataItems. Im DataItem vom Tab2 dann einfach unter OnPreDataItem() deine Abfragen einfügen:
Code:
IF Tab1.Typ IN ['C','D'] THEN
  CurrReport.BREAK;


Die Sache mit Tabelle.Feld funktioniert technisch natürlich einwandfrei, aber mit der logischen Reihenfolge wird es ein Problem geben, wenn es so ist, wie ich dich jetzt verstanden habe. Wenn die Sections von Tab1 sind, dann wird Tab2.Feld nie den richtigen Wert anzeigen! In Sections vom Typ Header ist noch kein Datensatz von Tab2 gefunden, weil das Programm einfach noch nicht so weit ist. In Sections vom Typ Body würde immer der letzte Datensatz angezeigt werden, der zum vorherigen Datensatz aus Tab1 paßt. Und im Footer würde immer der letzte Datensatz angezeigt werden, der zum letzten Datensatz aus Tab1 paßt. Das ist also nicht das, was du eigentlich sehen möchtest.

Re: Report, der auf 2 Tabellen zugreift

25. März 2010 17:50

Hallo zusammen, vielen Dank für Eure Tipps!

Also ich habe nun mal versucht Danjos und Sebastians Code einzusetzen...leider ohne Erfolg. Es gibt zwar keine Fehlermeldung, aber es tut einfach nicht. In dem Code welcher Tabelle hätte ich das eingeben sollen?
Dann bin ich zu McClanes und HattrickHorst Vorschlag übergegangen. Auch das war nicht wirklich von Erfolg gekrönt. Und ich sollte das nur im Code der Tab 2 angeben?
Mal davon abgesehen von dem Problem, dass es die Daten nicht zieht, könnte noch eine weitere Schwierigkeit in dem Bestehen, was HattrickHorst geschrieben hat, oder? Wäre dieses Problem dadurch zu lösen, dass ich diese Felderder Tab2 auch im Tab2 Body angebe?

Wenn der Weg über DataItem nicht klappt, würde ich auf die Alternative Recordvariable ausweichen. Habt ihr dazu Ideen?

Vielen Dank nochmal für Euche Hilfe!

Re: Report, der auf 2 Tabellen zugreift

26. März 2010 08:41

Guten Morgen,

mein und Sebastians Vorschlag bezogen sich schon auf Recordvariablen.
Tabelle2 ist hierbei die Recordvariable und der Code sollte in den OnAfterRecord-Trigger deines DataItems rein.
Die Felder aus Tabelle2 kommen dann in die Sections deines einzigen DataItems und referenzieren auf die Recordvariable bzw. die WerteVariablen.

Re: Report, der auf 2 Tabellen zugreift

29. März 2010 15:52

Hi!
Nach einigem rumprobieren klappt es jetzt (fast) mit der Recordvariablen.
Code:
  IF (Typ=Typ::A) THEN BEGIN
      Tab2.SETRANGE(NrA,"No.");
      Tab2.SETRANGE(Aktiv,True);
  END ELSE IF (Typ=Typ::B) THEN BEGIN
      Tab2.SETRANGE(NrB,"No.");
      Tab2.SETRANGE(Aktiv,True);
  END ELSE IF NOT Tandem.Findfirst THEN
      CurrReport.Skip;


Das Ganze steht nun im On PreDataItem.
Einziges Problem: Es wird bei allen Datensätzen genau das eingefügt, was für den ersten gefunden wurde.
Ich habe das mit diesem Clear(Tab2) an allen möglichen Stellen versucht, doch das funktioniert nicht.
Ich bin ganz nah dran, gebt Ihr mir noch einen kleinen Tipp?
Viele Grüße
Miriam

Re: Report, der auf 2 Tabellen zugreift

29. März 2010 16:31

Vorschlag:

So ist es nach Styleguide schon einmal leichter lesbar:
Code:
IF Typ=Typ::A THEN BEGIN
  Tab2.SETRANGE(NrA,"No.");
  Tab2.SETRANGE(Aktiv,True);
END ELSE
  IF Typ=Typ::B THEN BEGIN
    Tab2.SETRANGE(NrB,"No.");
    Tab2.SETRANGE(Aktiv,True);
  END ELSE
    IF NOT Tandem.Findfirst THEN
      CurrReport.Skip;


Abgesehen davon bietet sich hier das CASE-Statement an:
Code:
CASE Typ OF
  Typ::A :
    BEGIN
      Tab2.SETRANGE(NrA,"No.");
      Tab2.SETRANGE(Aktiv,True);
    END;
  Typ::B :
    BEGIN
      Tab2.SETRANGE(NrB,"No.");
      Tab2.SETRANGE(Aktiv,True);
    END;
  ELSE
    IF NOT Tandem.Findfirst THEN
      CurrReport.Skip;
END;


Alles nur eine Frage der Lesbarkeit - nur als Tipp.

Re: Report, der auf 2 Tabellen zugreift

29. März 2010 17:07

MSchifferdecker hat geschrieben:Das Ganze steht nun im On PreDataItem.

Das ist Dein Problem. In diesem Trigger hat das System noch gar keinen Datensatz "geladen". D.h. alles, was jetzt fast richtig aussieht, beruht auf dem Zufall oder der ganz besonderen Datenkonstellation, die bei Deinen Tests vorherrscht.

Re: Report, der auf 2 Tabellen zugreift

29. März 2010 17:22

Aber im OnAfterGetRecord findet er gar nichts...auch nicht mit dem Case-Ausdruck.
(Auf die Lesbarkeit werde ich künftig achten, danke für den Tipp ;))

Re: Report, der auf 2 Tabellen zugreift

29. März 2010 18:04

Tja, ich fürchte, da ist wahrscheinlich einiges durcheinander. :wink: Das ist per Textform auch immer etwas schwierig zu erklären, aber ich versuche es mal...

Angenommen Dein Report sieht in etwa so aus:
Code:
Contact
  Tandem

Dann würde ich in OnPreDataItem von Tandem etwa folgendes schreiben:
Code:
IF Contact.Typ IN [Contact.Typ::C,Contact.Typ::D] THEN
  CurrReport.BREAK;
und/oder eben alle anderen Bedingungen, bei denen Du die Informationen aus Tandem nicht darstellen möchtest. OnPreDataItem funktioniert hier nur für die Informationen aus Contact, weil das DataItem eingerückt oder untergeordnet ist. Durch das BREAK werden alle Tandem-Informationen zu diesem speziellen Contact nicht mehr ausgegeben. Voraussetzung ist nur, daß die Filter und Links in dem DataItem Tandem ordentlich angegeben sind und die Sections nicht irgendwie durcheinandergewürfelt wurden. Guck Dir mal Report 3 Fibujournal an, da kannst Du Dir den grundsätzlichen Aufbau abschauen. Hier kannst Du in einer CRONUS AG mal gucken, wie der Ausdruck in der Seitenansicht aussehen würde, und wenn Du dann in OnPreDataItem von "G/L Entry" einfach mal hineinschreibst:
Code:
IF "G/L Register"."No." IN [2,4] THEN
  CurrReport.BREAK;
dann siehst Du auch, wie sich die Seitenansicht verändern würde.