Reports: Variablen in DataItems
Hallo Community :)
Wir versuchen aktuell einen Bericht zu erstellen, bei dem der Benutzer aus einer Karte den Druck aufruft. Das Objekt der Karte wird im Report mitgegeben und ist als Filter in der Request Page zu sehen. Geschachtelt im DataItem dieses Objekts ist eine weitere Tabelle, die beispielsweise 1000 Einträge besitzt. Lediglich 100 der Einträge sind jedoch für unser Objekt geeignet (diese Beziehung ist im DataItemLink auch umgesetzt).
Wir möchten nun, dass der Benutzer einen dieser 100 Einträge auswählen kann. Das Dropdown-Feld (welches als RequestFilterField im geschachtelten DataItem umgesetzt ist) zeigt jedoch alle 1000 Einträge, nicht nur die 100, die durch den DataItemLink eigentlich gefiltert sein sollten.
Wie lässt sich so etwas unkompliziert umsetzen, denn Variablen in DataItems lassen sich in den DataItemTableViews nicht einsetzen?
LG
DH
-
Wir haben das Thema in der Zwischenzeit so gelöst, dass der interessante Wert / das interessante Feld des zuvor geschachtelten DataItems (DataItem2) nun eine golbale Variable (GlobalVariable2) ist, die in einer eigenen Column im übergeordneten DataItem (DataItem1) sitzt:
DataItem(DataItem1; DataItem1)
{
[...]
column(DataItem2; GlobalVariable2)
{
}
[...]
}
Im OnAfterGetCurrRecord()-Trigger in der RequestPage wird der angewendete Filter (= der Primärschlüssel des DataItem1, der aus der Record-Variable der Implementierung des Print-Buttons mitkommt) in eine globale Variable (GlobalVariable1) gespeichert:Print-Button:
[...]
trigger OnAction()
var
CurrRec: Record DataItem1;
begin
CurrRec.Reset();
CurrRec.SetRange("No.", Rec."No.");
Report.Run(Report::"My Report", true, true, CurrRec);
end;
[...]RequestPage:
OnAfterGetCurrRecord()
begin
[...]
GlobalVariable1 := CurrReport.DataItem1.GetFilter("No.");
[...]
end;Im OnLookup()-Trigger im RequestPage-Feld wird anschließend die globale Variable verwendet, um zu filtern:[...]
trigger OnLookup(var Text: Text): Boolean
var
DataItem1Rec: Record DataItem1;
DataItem2Rec: Record DataItem2;
begin
DataItem1Rec.Reset();
if DataItem1Rec.Get(GlobalVariable1) then begin
DataItem2Rec.Reset();
DataItem2Rec.SetLoadFields("Relevant Field");
DataItem2Rec.SetRange("GlobalVariable1-Reference-in-DataItem2", GlobalVariable1);
if DataItem2Rec.FindSet() then begin
DataItem2Rec.SetView('Sorting("GlobalVariable1-Reference-in-DataItem2") Order(ascending)');
if Page.RunModal(Page::"DataItem2", DataItem2Rec) = Action::LookupOK then
GlobalVariable2 := DataItem2Rec."GlobalVariable2";
end;
end;
end;
[...]Das ist eine relativ aufwändige Lösung für so ein simples Problem. Ich hoffe, es erleuchtet uns jemand :D
LG
DH0 -
Also ohne Programmierung wird das meiner Meinung nach (auch) leider nichts .. egal welcher Ansatz.
Das System kennt ja bis zur Laufzeit die Filter noch gar nicht alle, daher ist auch die über Eigenschaften gesetzte Filterung (noch) nicht aktiv... (Core by Design Problem)
Meine Frage: Wenn das DataItem geschachtelt ist, kann man dann eventuell den Filter des ersten DataItems fix immer auch schon vorher auf das zweite setzen und somit auch das DropDown mit beeinflussen ..?
Lg Rene
Ich habe mal testweise auch unsere SAINDY befragt.
-------
SaindyGPT (Beta)
SaindyGPT kann Fehler machen. Überprüfen Sie wichtige Informationen. (Limited-Beta-Preview-1.0.80)"In der aktuellen Limited Beta-Version werden die Nutzereingaben anonym protokolliert um das System weiterzuentwickeln.In Business Central, wenn Sie einen Bericht erstellen und ein Dropdown-Feld im Report Request Page einbinden möchten, das nur eine gefilterte Liste von Einträgen anzeigt, müssen Sie einige spezifische Schritte in AL (der Programmiersprache für Business Central) durchführen. Es scheint, als ob Sie bereits einen DataItemLink eingerichtet haben, aber das Dropdown-Feld zeigt immer noch alle Einträge anstatt nur die gefilterten.
Hier ist ein Ansatz, wie Sie dieses Problem lösen können:
-
Verwendung von Temporären Tabellen: Anstatt direkt auf die große Tabelle zuzugreifen, könnten Sie eine temporäre Tabelle erstellen und nur die relevanten Datensätze (die 100 Einträge) in diese temporäre Tabelle laden. Dies kann im OnPreDataItem-Trigger des geschachtelten DataItems erfolgen.
-
Füllen des Dropdowns mit Werten aus der Temporären Tabelle: Im Request Page des Berichts können Sie dann dieses temporäre DataItem als Quelle für das Dropdown-Feld verwenden. Dadurch wird sichergestellt, dass nur die relevanten Datensätze im Dropdown-Menü angezeigt werden.
Stellen Sie sicher, dass Sie die Business Central-Dokumentation und Best Practices für AL-Entwicklung konsultieren, um sicherzustellen, dass Ihr Code den Standards entspricht und effizient arbeitet.
0 -
-
Ich habe im ersten leider keine Referenz auf das zweite und kann daher dort keine Filter setzen, die das zweite beeinflussen würden.
Habe ich dich richtig verstanden?
LG
DH0 -
Hi, ich habe jetzt dein Beispiel vorhin nicht vollständig analysiert. Sorry. Aber jetzt :) Also wenn es so ist, dann nein, aber was ich meinte war, den Report mit gefilterten Record Variablen aufzurufen.
REPORT.RUNMODAL mit oder ohne SETTABLEVIEW
Müsste man jetzt aber ausprobieren und ist natürlich vom Beispiel abhängig
LG Rene
0 -
Ich gebe ihm im Report.Run ja bereits eine gefilterte Variable mit. Im Report.RunModal habe ich diesbezüglich nicht die Möglichkeit einen etwaigen zweiten Record mitzugeben (nur wenn ich den zweiten Record mitgeben könnte, könnte ich einen sinnvollen Filter setzen - im ersten ist dies leider nicht möglich).
SetTableView im Report selbst erlaubt mir leider keine Referenz auf die benötigten Werte.
Dann werden wir die Lösung so belassen, wie wir sie aktuell haben.
Danke für die Rückmeldungen!
LG
DH0 -
Hallo daniel, ich muss gestehen, ich hab es jetzt in AL nicht selbst versucht. In Vorgängerversionen konnten man mit SETABLEVIEW auch untergeordnete DataItems mitgeben hätte ich in Erinnerung. Aber ich lass mich da gerne von dir heute korrigieren :) Daher sorry :) LG Rene
0 -
Ich brauche die Einschränkung im genesteten DataItem (das untere soll ausschließlich Einträge mit Referenz aufs obere anzeigen - im oberen wird im Record beim Aufruf jedoch ein Filter mitgegeben, der zur Laufzeit an der Stelle des genesteten DataItems wahrscheinlich nicht bekannt ist).
Aber wenn du mir ein Pseudo-Code-Snippet postest, kann ichs gerne versuchen :)0
Bitte melden Sie sich an, um einen Kommentar zu hinterlassen.
Kommentare
7 Kommentare