22. Juli 2010 14:27
- Code:
// Lese die Vergebene Seriennnummer aus den Artikelposten (TS-26.05.10).
Artikelposten.SETFILTER("Document Type", '%1', Artikelposten."Document Type"::"Sales Shipment");
Artikelposten.SETFILTER("Document No.", '%1', "Sales Shipment Line"."Document No.");
Artikelposten.SETFILTER("Document Line No.", '%1', "Sales Shipment Line"."Line No.");
IF Artikelposten.FIND('-') THEN BEGIN
Seriennummer:= Artikelposten."Serial No.";
END
Hier druckt er:
SN1
SN2
SN3
etc..
- Code:
// Lese die Bemerkungszeile
Bemerkungszeile.SETRANGE("Document Type", "Sales Header"."Document Type"::Order);
Bemerkungszeile.SETRANGE("No.", "Sales Header"."No.");
Bemerkungszeile.SETRANGE("Document Line No.", 0);
IF Bemerkungszeile.FIND('-') THEN BEGIN
BemText:= Bemerkungszeile.Comment;
END
Obwohl ich beide Data Items genau gleich aufgebaut habe, fangt er hier jedesmal von vorne an:
Textzeile1
Textzeile1
Textzeile1
...
Mir erschließt sich der Fall nicht, beide Codes stehen im jeweiligen OnAfterGetRecord() des DataItems, dass genau gleich mit dem jeweiligen Header indiziert ist und im Body des DataItems ausgegeben werden soll.
Beim ersten Beleg klappt es, beim zweiten ließt er immer wieder die erste Zeile.
Zuletzt geändert von tortelinski am 22. Juli 2010 19:25, insgesamt 1-mal geändert.
22. Juli 2010 14:37
Es kann für einen VK-Kopf beliebig viele Bemerkungszeilen geben. Daher ist der Weg, über eine Variable zu gehen, falsch.
Arbeite doch mit einem neuen DataItem "Comment Line".
Außerdem fehlt bei dir der ELSE-Fall. Wird keine Bemerkungszeile gefunden, so behält die Variable den Wert aus dem vorherigen Beleg. Darum wiederholt sich bei dir immer die gleiche Zeile: Der erste Beleg hatte (mind.) eine Bemerkung, die nachfolgenden nicht.
22. Juli 2010 14:44
Hallo, wurde nicht verstanden.
Ich hab in beiden Fällen das DataItem:
Im ersten Fall das DataItem: Item Ledger Entry
Im zweiten Fall das DataItem: Comment Line
Wie gesagt, ich habe echt beide DataItems identisch aufgebaut meines Erachtens.
In beiden Fällen spuckt er so viele Zeilen aus, wie Datensätze existieren. Im zweiten Fall erwischt er immer den ersten, und geht nicht weiter.
Die Variablen Seriennummer // BemText sind eigentlich in beiden Fällen ohne jeden Nutzen, ich könnte auch in der Section direkt "Bemerkungszeile.Comment" eingeben.
Ich definiere oft gerne so nutzlose Variablen um besser an die Lösung zu kommen.
Und zu den Belegen: Es gibt nur einen Beleg im Testmandanten, mehr hab ich nicht. Dann tu ich die Nutzlosvariablen halt noch zurücksetzen. Das wird es nicht sein.
22. Juli 2010 14:51
tortelinski hat geschrieben:Hallo, wurde nicht verstanden.
Ich hab in beiden Fällen das DataItem:
Im ersten Fall das DataItem: Item Ledger Entry
Im zweiten Fall das DataItem: Comment Line
Meinst Du nicht statt Comment Line -> Sales Comment Line?
mfg,
winfy
22. Juli 2010 14:56
Ja sorry, ich meinte und hab "Sales Comment Line"
Mit FIND findet er immer den ersten Datensatz.
Es muss also im obigen ersten Fall (Item Ledger Entry) in meiner Belegvorlage irgendeine Property oder Methode vorhanden sein, die sagt, beim nächsten Auslesen nimmst du bitte den nächsten.
Das das DataItem auch im Fall "Sales Comment Line" an sich richtig sitzt ist ja dadurch begründet das die Anzahl der ausgegebenen Zeilen der Anzahl der gewünschten Datensätze immer entspricht.
22. Juli 2010 15:01
Ja, aber wenn er zu dem Auftrag keine Bemerkung findet wird dein Bemerkungstext auch nicht geändert.
einfach noch ein
- Code:
ELSE BemText:='';
mfg winfy
22. Juli 2010 15:03
Stimmt, das mach ich noch, also ich hab die Anzahl der Datensätze variiert.
Er kennt immer die richtige Anzahl die gefiltert wird, aber schnappt sich permanent den ersten.
Die Lösung scheint wohl doch schwieriger als erhofft. Wieso es im ersten Fall klappt ist wohl eher die Frage, weil da nicht kausal drinsteht, dass er beim nächsten mal jeweils zum nächsten gehen soll.
22. Juli 2010 15:45
Der Filter
- Code:
Bemerkungszeile.SETRANGE("No.", "Sales Header"."No.");
macht natürlich nur Sinn wenn sich "Sales Header"."No." auch innerhalb des OnAfterGetRecord() ändert.
Sonst filterst Du ja nur auf die selbe Auftragsnummer.
Falls du die Bemerkungskommentare in Abhängigkeit zu den Verkaufsaufträgen haben möchtest wäre das DataItem "Sales Header" mit dem Record Bemerkungszeile vom Typ "Sales Comment Line" vielleicht der bessere Ansatz.
mfg,
winfy
22. Juli 2010 16:05
Mein Tip: im ersten DataItem, den Artikelposten, ist die Verlinkung in den Properties des Reports korrekt und ausgegeben wird "Item Ledger Entry"."Serial No.". Deswegen klappt das auch.
Im zweiten Fall druckst du tatsächlich den Inhalt der Variable "BemText", und der ist wegen des Codes immer derselbe.
22. Juli 2010 19:24
Also ne falsche Verlinkung in den DataItems, gut möglich, es steht auch auf Ebene 3 um ehrlich zu sein, aber ich kann doch auch von Ebene 3 direkt auf das erste DataItem verlinken.
Wie auch immer, durchgestiegen bin ich nicht, so sieht die Lösung aus (Man kann auch auf Umwegen zum Ziel kommen und ich kann nur das programmieren, was mir logisch erscheint):
- Code:
//OnPreDataITem()
// Setze den Filter auf Bemerkungszeile
Bemerkungszeile.SETRANGE("Document Type", "Sales Header"."Document Type"::Order);
Bemerkungszeile.SETRANGE("No.", "Sales Header"."No.");
Bemerkungszeile.SETRANGE("Document Line No.", 0);
// OnAfterGetRecord()
// Lese die Bemerkungszeile
IF Bemerkungszeile.FIND('-') THEN BEGIN
FOR J:=1 TO BemStep DO
Bemerkungszeile.NEXT(+1);
BemStep:= BemStep+1;
END
ELSE
BemStep:= 0;
Ausgegeben wir dann: Bemerkungszeile.Comment()
22. Juli 2010 19:36
Wow, du bist einen ganz schönen Umweg gegangen ...
Hier ein Gegenvorschlag für DataItem "Sales Comment Line":
- Code:
//OnPreDataITem()
// Setze den Filter für DataItem "Sales Comment Line"
SETRANGE("Document Type", "Sales Header"."Document Type");
SETRANGE("No.", "Sales Header"."No.");
SETRANGE("Document Line No.", 0);
// OnAfterGetRecord()
// Lese die Bemerkungszeile
- leer! -
Ausgegeben wird dann nur: Comment
in Section "Sales Comment Line" - Body
Das DataItem kümmert sich doch ganz von alleine um den Durchlauf durch die Tabelle, da brauchst du keine zweite Recordvariable (DataItem "Sales Commen Line" ist in Wirklichkeit die erste).
23. Juli 2010 09:45
Hallo!
Das funktioniert. Das ist die Lösung. Oh Leute, das war ja die Frage.
Die Antwort lautet demnach, dass sich die Daten und Filter auf dem Data Item offenbar von dem unterscheiden was man auf Basis des Records findet.
Durch das Weglassen von von "Bemerkungszeile." nur in der Source Expression des Feldes in der Section
mutiert
Text1
Text1
Text1
...
dann zu
Text1
Text2
Text3
...
Fazit: Am Besten Record-Variable weglassen.
23. Juli 2010 09:51
tortelinski hat geschrieben:Fazit: Am Besten Record-Variable weglassen.
Hab da gestern Abend etwas - auch für dich - geschrieben:
Report-TriggerVielleicht hilfts fürs Gesamtverständnis.
23. Juli 2010 10:00
tortelinski hat geschrieben:Fazit: Am Besten Record-Variable weglassen.
So lange du mit den DataItems und deren Properties alles lösen kannst: uneingeschränkt ja. Das erhöht das Verständnis des Reports ungemein. Vor Allem, wenn du später noch einmal etwas korrigieren musst, kannst du dir das Wieder-Einlesen in den Code sparen.
23. Juli 2010 10:42
Zusatzfrage: Wie und wo setze ich einen Record zurück, der NICHT als Data Item existiert:
- Code:
IF "Sales Header"."Exit Point" <>'' THEN
Unterschrift.GET("Sales Header"."Exit Point")
ELSE
;
Ich hab die Hafentabelle zu einer Unterschriftentabelle umgewandelt.
Neu kann ich nix machen mangels Designer-Lizenz, andererseits bist Du mit allen Standad-Tabellen natürlich sehr gut portierbar.
[Zu Portierbarkeit bei Anlage neuer Tabellen und Codeunits darf man sich hier gerne auch äußern]
Wie auch immer: Der Code ist im ersten Beleg referenziert aber er spuckt auf allen Belegen diese Unterschrift aus.
- Code:
ELSE
Unterschrift.RESET;
hat es nicht getan! - Unterschrift.DELETE killt mir den ganzen Eintrag.
23. Juli 2010 10:44
RESET löst nur Filter, keine Feldinhalte.
Nimm mal dies hier:
- Code:
ELSE
CLEAR(Unterschrift)
23. Juli 2010 10:44
Wobei es ist Sales Header, der hat auf dem ersten Data Item wohl immer noch den Code wert vom letzen Beleg, das versteh einer.
Zusatz: Das Clear hat es getan! Danke - dieser Thread wird von mir geschlossen.
Man muss sagen, dass der C/Side Referenz-Guide nicht schlecht ist, aber in den meisten Fällen nicht mal ein rudimentäres Code-Beispiel hat. Warum man auf sinnvolle Beispiele verzichtet hat im ganz großen Stil verstehe ich nicht.
Auch vom Aufbau hadere ich mit der Struktur, es ist weder eine gute Hilfe noch eine gescheite Klassenbibliothek.
23. Juli 2010 10:50
tortelinski hat geschrieben:Wobei es ist Sales Header, der hat auf dem ersten Data Item wohl immer noch den Code wert vom letzen Beleg, das versteh einer.
Lies noch mal meinen Hilfetext.
DataItem "Sales Header" ist eigentlich eine globale Variable.
Einmal mit etwas gefüllt, behält diese Variable so lange ihren alten Inhalt, bis du ihn durch neuen Inhalt ersetzt.
Dies geschieht z.b. automatisch beim Durchlauf von "Sales Header" - OnAfterGetRecord. Davor noch nicht, da sind noch die alten Werte enthalten.
Wenn du eigenmächtig Felder leeren möchtest, nutz CLEAR oder INIT.
Powered by phpBB © phpBB Group.
phpBB Mobile / SEO by Artodia.