10. März 2010 15:35
Hallo allerseits,
Ich habe eine EK-Bestellung mit 1 * Purchase Header und n * Purchase Line.
Folgender Code soll in einen Button der Form EK-Bestellung damit ein Report aufgerufen wird, der mir pro EK-Bestellzeile die reservierte Menge (Reservation Entry) samt Seriennr. ausdruckt.
<Control 4711 - OnPush () >
PurchaseHeader.SETRANGE("No.","No.");
PurchaseLine.SETRANGE("Document Type","Document Type"::Order);
PurchaseLine.SETRANGE("Document No.","No.");
PurchaseLine.SETFILTER("Document No. Allocated",'<>%1','');
PurchaseLine.SETRANGE("Line No.",10000);
IF PurchaseLine.FINDFIRST THEN
REPORT.RUNMODAL (REPORT::DruckeSNr, TRUE, FALSE, PurchaseLine);
Frage: wie kann ich per C/AL Code abfragen auf welcher Zeile sich gerade der Maus-Cursor befindet, wenn ich die Form EK-Bestellung öffne? Momentan habe ich Zeilennr. = 10000 hard-kodiert, das ist aber nicht mein Ziel, sondern die Zeilennr. soll als Parameter mit übergeben werden, weil ich beim Reportaufruf diese dazu nutze, um bei Reservation Entry ein:
ReservationEntry.SETRANGE("Source Ref. No.",LineNo);
einzufügen.
Denn momentan druckt mir der Report alle Source Ref. No. Zeilen und Seriennr. aus, obwohl diese z.B. nicht zur Zeile 10000 der EK-Bestellzeile und nicht zum Artikel 4711 gehören.
Mein Report hat als als DataItem Struktur das hier:
Purchase Line <Purchase Line>
-> eingerückt: Reservation Entry <Reservation Entry>
Ich habe im OnAfterGetRecord von Purchase Line eingefügt:
ReservationEntry.SETRANGE("Source ID",OrderNo);
ReservationEntry.SETRANGE("Item No.",ItemNo);
ReservationEntry.SETFILTER("Serial No.",'<>%1','');
ReservationEntry.SETRANGE("Source Ref. No.",LineNo);
aber das wirkt sich nicht aus auf das untergeordnete Item Reservation Entry.
Wenn ich den Code in Reservation Entry - OnPreDataItem() einfüge, tut er auch nicht.
Ich will letztendlich pro EK-Bestellzeile in die Tabelle Reservierungsposten rein und dort alle Seriennr. auslesen, die zu der "Reservierte Menge" in der aktuellen EK-Bestellzeile gehören, auf der sich der Maus-Cursor befindet.
Vielen Dank im Voraus, falls mir jmd. hilft !!
10. März 2010 15:58
Lord_British hat geschrieben:Frage: wie kann ich per C/AL Code abfragen auf welcher Zeile sich gerade der Maus-Cursor befindet, wenn ich die Form EK-Bestellung öffne?
Du kannst die Funktion in der Subform definieren und aus der Mainform aufrufen (als Beispiel dafür kannst du dir das Einfügen der Textbausteine ansehen, das geht auch diesen Weg), oder aus der Mainform:
- Code:
CurrForm.PurchLines.Form.GetRecord(PurchLine_l);
, wobei dann in PurchLine_l die fokussierte Zeile steht.
Im Report musst du sicherstellen, nicht auf eine Variable ReservationEntry zu filtern, die vom Subtype "Reservation Entry" ist, sondern auf das DataItem selbst. Im OnPreDataItem ginge das direkt mit "SETRANGE("Source ID",OrderNo);".
Nur bietet einen Teil davon eigentlich schon der Standard (Zeile->Reservierungsposten), oder passt das bei dir nicht?
10. März 2010 16:32
McClane hat geschrieben:Lord_British hat geschrieben:Frage: wie kann ich per C/AL Code abfragen auf welcher Zeile sich gerade der Maus-Cursor befindet, wenn ich die Form EK-Bestellung öffne?
Du kannst die Funktion in der Subform definieren und aus der Mainform aufrufen (als Beispiel dafür kannst du dir das Einfügen der Textbausteine ansehen, das geht auch diesen Weg), oder aus der Mainform:
- Code:
CurrForm.PurchLines.Form.GetRecord(PurchLine_l);
, wobei dann in PurchLine_l die fokussierte Zeile steht.
Im Report musst du sicherstellen, nicht auf eine Variable ReservationEntry zu filtern, die vom Subtype "Reservation Entry" ist, sondern auf das DataItem selbst. Im OnPreDataItem ginge das direkt mit "SETRANGE("Source ID",OrderNo);".
Nur bietet einen Teil davon eigentlich schon der Standard (Zeile->Reservierungsposten), oder passt das bei dir nicht?
Hallo McLaine,
Danke für deine schnelle Antwort!
Allerdings steh ich etwas auf dem Schlauch.
Habe nun in der Subform der EK-Bestellung folgende Funktion implementiert:
GetRecord(VAR ZeilenNr : Integer)
IF ZeilenNr > 0 THEN
NrZeilen := ZeilenNr;
Wenn ich aber nun den Button drücke, dann hab ich das Problem, daß er ja zur MainForm der EK-Bestellung gehört und somit
<Controll 4711 - OnPush ( )>
SubForm.GetRecord(Rec."Line No."); nicht funktioniert.
SubForm.GetRecord(PurchaseLine."Line No.") liefert ja auch nix, selbst wenn ich mit SETRANGE von dem Header auf die Lines filtere.
10. März 2010 16:44
Das GetRecord ist eine Systemfunktion, die brauchst du nicht zu erweitern :)
10. März 2010 17:05
McClane hat geschrieben:Das GetRecord ist eine Systemfunktion, die brauchst du nicht zu erweitern :)
Hmm, wie soll ich das verstehen, ich kann mit dem Begriff "Systemfunktion" leider nicht soviel anfangen ???
Sorry, bin noch neu beim C/AL-Programmieren.
Hab aber das Ganze so gelöst:
<Control 4711 - OnPush ( )>
CurrForm.PurchLines.FORM.GetRecord //bedeutet soviel wie gegenwärtigeForm.Alias_von_der_SubForm.FORM.Funktionsaufruf.
In der SubForm @ PurchLines:
GetRecord ( )
LineNo := "Line No.";
//MESSAGE(FORMAT(LineNo));
Damit hab ich LineNo gegriffen und kann mit dem Report weitermachen, danke!
10. März 2010 17:08
Systemfunktion heißt, dass es die Funktion schon von Haus aus gibt. In Nav mitgeliefert quasi. Ich weiß grad nicht, wie ich das besser ausdrücken soll
10. März 2010 17:20
McClane hat geschrieben:Systemfunktion heißt, dass es die Funktion schon von Haus aus gibt. In Nav mitgeliefert quasi. Ich weiß grad nicht, wie ich das besser ausdrücken soll
Ah okay, jetzt versteh ich dich.
Das heißt, daß meine GetRecord ( ) Funktion in der SubForm nutzlos ist, weil wahrscheinlich die gleichlautende System Funktion von NAV mit Vorrang vor meiner eigenen aufgerufen wird?
10. März 2010 17:33
Andersrum. Deine Funktion übersteuert die.