Zum Hauptinhalt gehen

Reports: Variablen in DataItems

Kommentare

7 Kommentare

  • D Hint

    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
    DH

    0
  • Rene (i-Human)

    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:

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

    2. 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
  • D Hint

    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
    DH

    0
  • Rene (i-Human)

    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
  • D Hint

    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
    DH

    0
  • Rene (i-Human)

    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
  • D Hint

    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.