Funktion LayoutHelper.LayoutOpener.OpenLayout([layoutCode],[ paramList])
Michael Mayer
Hallo Zusammen,ich habe folgendes Problem:
Ich gehe vom Template Produktionsauftrag aus.
Dort würde ich gerne in das AdvancedDataBand, welches die Artikel enthält, in das Feld GetDataScript ein Skript schreiben, das mir einen UserQuery namens ArtikelInformationsblatt aufruft.
Das Artikelinformationsblatt enthält detaillierte Informationen zum Artikel und es soll zu jedem Artikel im Produktionsauftrag beim Drucken auch ein solches Informationsblatt gedruckt werden. Wir verwenden bereits ein Skript mit einer anderen Variante der OpenLayout Funktion.
Daraus habe ich mir folgenses Skript abgeleitet:
If Engine.IsDoublePass = True
If GetData("LD.Par.PrintMode")="N" And GetData("LD.Par.Preview")="N" Then
LayoutHelper.LayoutOpener.OpenLayout([layoutCode],[ paramList])
End If
End If
Mir ist nur nicht bewusst, was der Parameter "layoutCode" ist. Ich habe schon den Layoutnamen versucht, aber dieser ist offensichtlich nicht gemeint.
Die paramList sollte eigentlich mit dem ItemCode als Parameter auskommen. -> DocumentRow("ItemCode").ToString()
Leider funktioniert das Skript im Moment nicht, es kommt auch keine Fehlermeldung, die mir das Problem aufzeigt.
Vielen Dank für eure Unterstützung.
Manuel Marhold
Hi Michael,der ist der Code aus der UDF (alphanumerisch, 8-stellig)
Diesen findest du in der Tabelle @SWA_LD_Layout oder aber, wenn du in einer printdef bist, die Systeminformationen einblenden lassen und bei dem Layout-Dropdown-Menü das Layout auswählen und mit der Maus über das Feld, dann steht unten links der Code (T.......(coresuite-Standard-Layouts) oder U........(benutzerdefinierte))
Aber kannst du dafür nicht besser das Layout in der Printdef hinterlegen??
Gruß
Manuel
Philipp Knecht
Hallo zusammenWie schon von Manuel angedeutet. Best Practise ist eigentlich die:
LayoutHelper.LayoutOpener.ExecutePrintDef (...) - Methode.
Die braucht dann denn einfach eine vorhandene Printdef die kann aber auch auf inaktiv gesetzt sein.
hth
Daniel Ertl
Danke für die schnellen Antworten.Ich habe das nicht einfach über eine Prindef gelöst, da im zweiten Schritt im Produktionsauftrag auf Zeilenebene eine Spalte vom Typ Boolean angelegt werden soll mit der man für einzelne Artikel des Auftrages das Artikelinformationsblatt ausdrucken können soll.
Philipp Knecht
Hallo zusammenNochmals zur Präzisierung.
Falls man Dokumente via Script drucken, mailen, faxen ... möchte ist es am besten wenn man sich eine zusätzliche PrintDefinition anlegt, dieser dann halt genau nur dieses Layout hinterlegt und dann die LayoutHelper.LayoutOpener.ExecutePrintDef(...) Methode verwendet um das ganze zu starten.
Dies hat den Vorteil dass auch noch zusätzliche Angaben auf der Printdef gemacht werden können.
Diese neue Printdefinition kann dann aber auch auf inaktiv gesetzt werden damit sie im "normalbetrieb" nicht stört.
@Daniel:
Auch in deinem Fall würde ich eine Printdef anlegen und darüber printen.
hth
hth
Manuel Marhold
Hi.Wäre es nicht besser hier en 2. layout in der printdef zu hinterlegen?
Und dort dann als query die Artikelinfos auslesen, sofern in der Ziele der boolean-Wert auf true steht??
gruß
Manuel
Philipp Knecht
Hi ManuelJa für den täglichen Gebrauch schon (normales Drucken des Layouts beispielsweise vom Auftragsform oder so...). Was ich aber sagen möchte ist dass für autom. Drucken via ExecutePrintDef(..) es mesistens Sinn macht sich genau für diesen Fall eine eigene Printdef zu machen.
hth
Daniel Ertl
Hallo Zusammen,Ich bin mir nicht sicher, ob wir von denselben Anforderungen ausgehen...
Eine Printdef, die mein Artikel-Informationsblatt-Layout enthält kann doch keine Parameter aus der ersten Printdef (zB. Kommissionsliste) übergeben bekommen, oder?
Ausserdem würde eine zweite Printdef bedeuten, dass der User die eine oder die andere auswählen kann. Es soll aber so sein, dass in einem Schritt beides passiert.
Damit wir sicher von demselben Problem sprechen hier nochmal mein Anwedungsfall:
Der Benutzer legt eine Kommissionsliste an.
Diese Kommissionsliste enthält diverse Artikel.
Nun wählt der benutzer auf Zeilenebene in einer udf-spalte, einzelne artikel aus, für die ein Informationsblatt gedruckt werden soll.
Wenn er nun Vorschau und Druck macht sollen die Informationsblätter der gewählten artikel zusätzlich zur Kommissionsliste angezeigt bzw. gedruckt werden.
Hierzu ist es doch nötig, dass das Informationsblatt-Layout während der erstellung der Kommissionsliste angesteuert wird, da nur hier die relevanten Artikel-Nummern und die gesetzen Flags bekannt sind.
Ich habe das bis jetzt über einen user query gelöst, welcher den Itemcode als Parameter erwartet. Angesteuert wird dieser query aus der Kommissionsliste mit einem GetDataSkript-Skript in der AdvancedDataband, wo über die einzelnen Artikel iteriert wird.
Das Skript lautet wie folgt:
Dim params(1) As String
If Engine.IsDoublePass = True
If dataBand("U_INFO") = 1 Then
GetData("LD.Par.Preview")="N"
params(0)= dataBand("ItemCode").toString()
LayoutHelper.LayoutOpener.OpenLayout("U0000035", params)
End If
End If
Leider wird der Wert in params offensichtlich nicht richtig übergeben, da die UserQuery beim starten nach einem Parameter fragt. diesen sollte er aber doch über die OpenLayout-Funktion bekommen, oder?
Habe ich einen Denkfehler gemacht?
Danke für eure Hilfe.
Grüsse,
Daniel
Philipp Knecht
Hallo Daniel>eine Printdef, die mein Artikel-Informationsblatt-Layout enthält kann doch keine Parameter aus der ersten Printdef (zB. Kommissionsliste) übergeben bekommen, oder?
Doch das geht ohne weiteres. Die PArameter werden ja explizitz von der Funktion übergeben.
>Ausserdem würde eine zweite Printdef bedeuten, dass der User die eine oder die andere auswählen kann. Es soll aber so sein, dass in einem Schritt beides passiert.
Das ist kein Problem weil du die zweite PrintDef hja auf inaktiv setzen kannst. Diese wird nur als Träger benötigt weil die Funktion:
>LayoutHelper.LayoutOpener.OpenLayout("U0000035", params)
nur ein Layout in der Preview öffnet mehr nicht.
Soll aber was gedruckt werden ist der Weg über die Printdefinition zu beschreiten (Preview geht dann auch...)
>Leider wird der Wert in params offensichtlich nicht richtig übergeben
Es wird immer ein Key , Value Paar benötigt. Du füllst aber nur den Value.
Mach einfach folgende Funktion ins GetDataScript vom DocumentRow rein nachdem du eine weitere PRintDef angelegt hast:
Dim mode As LayoutOpener.OpenLayoutModes = LayoutOpener.OpenLayoutModes.Print
Select Case GetData("LD.Par.PrintMode")
Case "N":
If GetData("LD.Par.Preview") ="Y" Then
mode = LayoutOpener.OpenLayoutModes.Preview
End If
Case "P":
mode = LayoutOpener.OpenLayoutModes.PDF
End Select
LayoutOpener.ExecutePrintDef("XXXXXX",mode,"DocEntry", DocumentRow("DocEntry"))
(XXXX mit deinem PrintDef Code ersetzen...)
oder du machst im Artikellayout ein DataBand rein und setzt die Source auf Row (In der Layoutdef evenfalls Datensource Document verwenden) und hängst dieses Layout einfach der bestehenden Printdef noch an.
hth
Daniel Ertl
Hallo Philipp,irgendwie bin ich zu dumm eure Software zu benutzen... :roll:
Ich hab alles wie beschrieben umgesetzt.
Ich habe mein Layopiutdesign (mit UserQuery Parameter ItemCode) an den Produktionsauftrag als eigene Printdefinition angehängt.
Dann habe ich im Produktionsauftrags-Layout dein Skript in das Datarow-Advanced Band eingehängt. Ich habe den Printdef-Code angepasst und zur Kontrolle noch ein Textfeld mit den Werten aus dem Skript befüllt.
Ausserdem habe ich deinen Entrag DocEntry jeweils auf ItemCode verändert, da ich ja ItemCode als Parameter übergeben will.
Leider wird das Artikerlinformationsblatt nicht geöffnet.
was mir aufgefallen ist, dass die Funktion LayoutOpener.ExecutePrintdef die Parameter (String, LayoutOpener+LayoutModes, String[]) erwartet.
Ihr Skript enthält doch aber die Parameter (String, LayoutOpener+LayoutModes, String, String)
Könnte das der Aulöser sein?
Zur Sicherheit habe ich diverse Screenshots von meiner Situation angefertigt.
Ich hoffe ihr habt noch Geduld mit mir... :oops:
Grüsse,
Daniel
Attachment
[url=http://www.coresystems.ch/wp-content/../wp-content/forum-file-uploads/daniel-ertl/Screenshots.zip]Screenshots.zip[/url]
Manuel Marhold
Hi Daniel,ich kann dir leider keine Lsung anbieten, aber Der letzte Parameter ist ein paramlist-Objekt. Hier kann man einfach beliebig viele übergabe werte übergeben und diese werden in der Funktion zusammen bereitsgestellt. Also ist ""DocEntry", DocumentRow("DocEntry")" ein Teil von paramlist.
Das zu deiner Frage warum Philipp mehr übergabewerte hat als von der Funktion augenscheinlich erwartet werden.
Gruß
Manuel
Daniel Ertl
Hallo Zusammen,das Problem hat sich erledigt.
Die Layoutdefinition Artikelinformationsblatt muss natürlich vom Typ Dokument sein und nicht UserQuery. :bang:
Danke für eure Unterstützung.
Grosses Lob an euch und macht weiter so!
Aus meiner Sicht kann dieser Thread geschlossen werden.
Grüsse,
Daniel
0
Please sign in to leave a comment.
Comments
0 comments