Form 40 Artikelbuchblatt aufrufen

31. März 2010 11:10

Hallo!

Ich komme hier nicht weiter.
Ich möchte die Form 40, das Artikelbuchblatt so aufrufen, dass es bereits die korrekten Daten anzeigt. Auch soll der Buchblattname vorausgewählt sein.

Mein Versuch:

Code:
  Buchblattzeile.setrange( "Journal Template Name", 'ITEM');
  Buchblattzeile.setrange( "Journal Batch Name" , 'STANDARD');
  form.run( form::"item journal", buchblattzeile);


Allerdings kommt es zu folgender Fehlermeldung:
Der Filter '(ITEM)&(ITEM)' auf dem Feld Buch.-Balttvorlagenname in der Tabelle Artikel Buch.-Blattzeile sollte einen Bereich angeben.

Ich muss euch sagen, dass ich mit dieser Fehlermeldung überhaupt nichts anfangen kann :-x

Re: Form 40 Artikelbuchblatt aufrufen

31. März 2010 11:35

Du hast nicht angegeben, wo genau du deinen Quelltext eingefügt hast.
Abgesehen davon empfehle ich dir einen anderen Ansatz: Oben in der Form gibt es eine Eingabemöglichkeit des aktuell gewählten Buchblattes. Dies referenziert auf eine globale Variable CurrentJnlBatchName. Diese Variable solltest du im OnOpenForm-Trigger (am Ende) auf 'STANDARD' ändern (ist das nicht per default sowieso der Fall??) - dann macht die Form automatisch das, was du möchtest.

Re: Form 40 Artikelbuchblatt aufrufen

31. März 2010 11:46

Hallo Natalie!
Geht leider nicht ganz so.
Und es muss nicht unbedingt STANDARD sein - es könnte auch ein anderer Name betroffen sein.

Ich habe ein Stückchen Code, welcher das Buchblatt befüllt (mache ich aus Lizenzgründen über einen Report).
Nach dem Befüllen des Buchblatts möchte ich dieses aufrufen.

Code steht in "OnPostReport".
Habs auch testweise in "OnInitReport" geschreiben - ist aber gleichgültig.

Re: Form 40 Artikelbuchblatt aufrufen

31. März 2010 14:02

Ob das deine Fehlermeldung löst, weiß ich nicht, aber nach deinem SETRANGE musst du ein FINDFIRST machen. Sonst filtert er nicht.

Code:
Buchblattzeile.setrange( "Journal Template Name", 'ITEM');
Buchblattzeile.setrange( "Journal Batch Name" , 'STANDARD');
IF Buchblattzeile.FINDFIRST THEN
  form.run( form::"item journal", buchblattzeile);

Re: Form 40 Artikelbuchblatt aufrufen

31. März 2010 14:23

Melanie hat geschrieben:Ob das deine Fehlermeldung löst, weiß ich nicht, aber nach deinem SETRANGE musst du ein FINDFIRST machen. Sonst filtert er nicht.

Code:
Buchblattzeile.setrange( "Journal Template Name", 'ITEM');
Buchblattzeile.setrange( "Journal Batch Name" , 'STANDARD');
IF Buchblattzeile.FINDFIRST THEN
  form.run( form::"item journal", buchblattzeile);


Bist du da ganz sicher?
Normalerweise übergibst du ja die Recordvariable, und das inklusive Filter.
Könnte höchstens in dem Fall so sein das es nötig ist, weil er ja sonst beim öffnen auf keinem Datensatz stehen würde.
Oder kann das jemand bestätigen das Filter nur gesetzt werden wenn man danach einen FIND nutzt? :?:
Bin jetzt etwas unsicher.

Re: Form 40 Artikelbuchblatt aufrufen

31. März 2010 14:32

Danjo hat geschrieben:Oder kann das jemand bestätigen das Filter nur gesetzt werden wenn man danach einen FIND nutzt? :?:

Nein, das geht auch ohne FIND. Macht der Standard auch.

Re: Form 40 Artikelbuchblatt aufrufen

31. März 2010 14:57

Das Record wird im OnOpenForm gesetzt, abhängig von der Variable CurrentJnlBatchName. Man muss also dafür Sorgen, dass im OnOpen da der richtige Buchblattname drin steht und nicht von dem letzten Buchblattnamen, mit dem die Form benutzt wurde, überschrieben wird.

Re: Form 40 Artikelbuchblatt aufrufen

31. März 2010 15:17

McClane hat geschrieben:Das Record wird im OnOpenForm gesetzt, abhängig von der Variable CurrentJnlBatchName. Man muss also dafür Sorgen, dass im OnOpen da der richtige Buchblattname drin steht und nicht von dem letzten Buchblattnamen, mit dem die Form benutzt wurde, überschrieben wird.

Hatte ich vorhin etwas anderes gesagt? :shock:

Natalie hat geschrieben:Oben in der Form gibt es eine Eingabemöglichkeit des aktuell gewählten Buchblattes. Dies referenziert auf eine globale Variable CurrentJnlBatchName. Diese Variable solltest du im OnOpenForm-Trigger (am Ende) auf 'STANDARD' ändern (ist das nicht per default sowieso der Fall??) - dann macht die Form automatisch das, was du möchtest.

Re: Form 40 Artikelbuchblatt aufrufen

1. April 2010 08:57

Tja, hat jemand eine Idee, WAS GENAU die Fehlermeldung bedeutet. Ich werd nicht schlau draus.

Re: Form 40 Artikelbuchblatt aufrufen

1. April 2010 09:14

habreli hat geschrieben:Tja, hat jemand eine Idee, WAS GENAU die Fehlermeldung bedeutet. Ich werd nicht schlau draus.

Durch den Standard-Quelltext in Form 40, OnOpenForm-Trigger wird in der Codeunit 240 die Funktion "OpenJnl" aufgerufen, und dabei der Record übergeben, auf den du aber bereits mit ITEM gefiltert hast:
Code:
CheckTemplateName(ItemJnlLine.GETRANGEMAX("Journal Template Name"),CurrentJnlBatchName);
ItemJnlLine.FILTERGROUP := 2;
ItemJnlLine.SETRANGE("Journal Batch Name",CurrentJnlBatchName);
ItemJnlLine.FILTERGROUP := 0;

Hier liefert das GETRANGEMAX deinen Fehler, weil zum Zeitpunkt der Verwendung das Programm davon ausgeht, dass auf einen von...bis-Bereich gefiltert wird (statt einem festen Wert 'ITEM').

Fazit: nicht die Form gefiltert aufrufen.
Erstelle eine Funktion, die hinten im OnForm-Trigger die globale Variable auf deinen Wunschwert setzt.

Re: Form 40 Artikelbuchblatt aufrufen

6. April 2010 17:35

Versuche doch mal folgenden Code:
Code:
Buchblattzeile.SETFILTER( "Journal Template Name", 'ITEM..ITEM');
Buchblattzeile.setrange( "Journal Batch Name" , 'STANDARD');
form.run( form::"item journal", buchblattzeile);

Damit dürfte der GETRANGEMAX nicht mehr auf einen Fehler fallen, da Du über den Setfilter Item..Item einen Bereich von..bis angibst.

Re: Form 40 Artikelbuchblatt aufrufen

7. April 2010 08:28

Die Idee an sich ist genial.

Leider hat sich dadurch die Fehlermeldung ausgeweitet...
Der Filter '(ITEM..ITEM)&(ITEM)' auf dem Feld Buch.-Balttvorlagenname in der Tabelle Artikel Buch.-Blattzeile sollte einen Bereich angeben.

Re: Form 40 Artikelbuchblatt aufrufen

17. Juni 2010 09:01

Natalie hat geschrieben:
Fazit: nicht die Form gefiltert aufrufen.
Erstelle eine Funktion, die hinten im OnForm-Trigger die globale Variable auf deinen Wunschwert setzt.


Hallo Natalie,

wie kann ich beim aufrufen der Form die globale Variable mit einen Wunschwert füllen?

Re: Form 40 Artikelbuchblatt aufrufen

17. Juni 2010 09:29

Über eine Funktion, die du noch in der Form erweitern müsstest.

Re: Form 40 Artikelbuchblatt aufrufen

7. Dezember 2010 18:26

Und es geht doch einfacher (ich musste gerade für mich nach der Lösung suchen), das Artikelbuchblatt direkt für einen Buchblattnamen aufzurufen:

Vorlage im Standard 2009 SP1:
Form 262 Artikel Buch.-Blattnamen,
Button Buch.-Blatt bearbeiten

Code:
ItemJnlMgt.TemplateSelectionFromBatch(Rec);

Rec = Tabelle "Item Journal Batach"

Es kann so einfach sein, wenn man nur die richtige Stelle (endlich) findet :shock:

Da dies leider ein 2009-Feature ist, hier der Quelltext:

TemplateSelectionFromBatch(ItemJnlBatch)
Code:
OpenFromBatch := TRUE;
ItemJnlTemplate.GET(ItemJnlBatch."Journal Template Name");
ItemJnlTemplate.TESTFIELD("Form ID");
ItemJnlBatch.TESTFIELD(Name);

ItemJnlLine.FILTERGROUP := 2;
ItemJnlLine.SETRANGE("Journal Template Name",ItemJnlTemplate.Name);
ItemJnlLine.FILTERGROUP := 0;

ItemJnlLine."Journal Template Name" := '';
ItemJnlLine."Journal Batch Name" := ItemJnlBatch.Name;
FORM.RUN(ItemJnlTemplate."Form ID",ItemJnlLine);


Der Trick ist, die Tabelle ItemJnlLine zwar auf den Vorlagennamen zu filtern, aber den Feldwert zu leeren, ehe die Form aufgerufen wird.
Dies wird (auch neu) im OnOpenForm-Trigger aufgerufen:

Code:
// >>  NEU
OpenedFromBatch := ("Journal Batch Name" <> '') AND ("Journal Template Name" = '');
IF OpenedFromBatch THEN BEGIN
  CurrentJnlBatchName := "Journal Batch Name";
  ItemJnlMgt.OpenJnl(CurrentJnlBatchName,Rec);
  EXIT;
END;
// << NEU
ItemJnlMgt.TemplateSelection(FORM::"Item Journal",0,FALSE,Rec,JnlSelected);
IF NOT JnlSelected THEN
  ERROR('');
ItemJnlMgt.OpenJnl(CurrentJnlBatchName,Rec);