[gelöst] leere Auftragsmaske beim Öffnen der Form 42

26. Oktober 2006 11:54

Hallo,

wie könnte man es am besten realisieren, wenn man beim Öffnen der Verkaufsauftragsform eine leere Maske angezeigt bekommen möchte?

Danke für eure Antworten.
Zuletzt geändert von fragglet am 17. November 2006 10:14, insgesamt 1-mal geändert.

26. Oktober 2006 12:39

vorher einen Filter auf einen garantiert nicht vorkommenden Wert setzen und diesen beim Öffnen der Form im OnAfterGetRecord-Trigger wieder entfernen.

27. Oktober 2006 10:04

Hm - wo meinst du soll ich den Filter vorher setzen?

27. Oktober 2006 10:48

z.B. Feld 114 Tax Area Code. Dieses Feld wird eigentlich nur bei US Sales Tax verwendet und sollte bei MWST immer leer sein.

27. Oktober 2006 13:23

Die Maske ist dann leer. Aber ich kann dann nicht über die Pfeiltasten zum vorherigen oder zum allerersten Auftrag springen.
Ich finde irgendwie die Stelle nicht an der ich den Filter wieder aufheben muß.

27. Oktober 2006 14:03

Hallo fragglet,

wenn ich dich richtig Verstehe, geht es dir nicht darum die Vorhandenen Aufträge auszublenden.
Sondern du möchtes, sobald ein User die Auftragsmaske öffnet, dass ein neuer Auftrag erzeugt wird, ist das richtig?

Wenn das der Fall ist, musst du einen neuen Verkaufskopf erzeugen auf dem OnOpenForm Trigger mit einem INIT und die Felder "Document Type" und "No." mit einem Wert füllen.
Nach dem INSERT öffnet sich dann die Form mit einem neuen leeren Auftrag.
Gruß Mikka

27. Oktober 2006 14:06

Hallo Fragglet,

am besten, indem man den Anwenden nach dem Öffnen der Maske F3 drücken lässt?

Warum eigentlich eine leere Auftragsmaske?
Was ist der Zweck/Vorteil?
Warum nicht in der Maske den zuletzt angezeigten Auftrag anzeigen?

MfG
Josef Metz

27. Oktober 2006 14:19

Hallo jm,

ich bin in diesem Falle nur ausführendes Organ. Habe nicht selber mit dem Kunden gesprochen. Kann dir also nicht sagen was die Gründe für diesen Wunsch sind. Find eigentlich auch das so ein Druck auf die F3 Taste nicht zu schwer sein sollte.

@Mikka:
Danke für den Tip. Es soll aber nicht mal eine Auftragsnummer zu sehen sein :roll:. Also im Prinzip soll die F3-Tastenfunktion nachgebildet werden.

27. Oktober 2006 15:22

Mikka hat geschrieben:enn das der Fall ist, musst du einen neuen Verkaufskopf erzeugen auf dem OnOpenForm Trigger mit einem INIT und die Felder "Document Type" und "No." mit einem Wert füllen.
Nach dem INSERT öffnet sich dann die Form mit einem neuen leeren Auftrag.


Dann nur ein INIT ausführen und nur den "Document Type" festlegen. Nach dem INSERT würde eine leere Maske erscheinen.
Allerdigs sollte vorher abgefangen werden, ob ein "leerer" Auftrag existiert und diesen löschen (oder zu diesem springen und kein INIT), ansonsten "Knallt" es, da der Auftrag bereits vorhanden ist.

Alternativ wie währe es hier mit:



dann könnte das weiter helfen:
Variablen:
Code:
Name   DataType   Subtype   Length
WSH   Automation   'Windows Script Host Object Model'.WshShell


    CLEAR(WSH);
    CREATE(WSH);                                 // Erzeuge Object
    WSH.SendKeys('{ENTER}');                     // Sende Enter


In diesem Beispiel wird ein ENTER an Navision gesendet.
Das einige was ich leider nicht weis, was die Taste F3 für ein Wert ist.
Gruß Mikka

27. Oktober 2006 20:16

Eine (getestete) Vorgehensweise wäre wie folgt:

Code:
OnInit();
// > TL4.02:01 >>>
SETFILTER("No.",'%1','');  // Auf eine leere Auftragsnr. filtern
// < TL4.02:01 <<<

OnOpenForm();
// > TL4.02:01 >>>
SETRANGE("No.");  // Filter wieder lösen
// < TL4.02:01 <<<

Form - OnFindRecord(Which : Text[1024]) : Boolean
// > TL4.02:01 >>>
// IF FIND(Which) THEN
//   EXIT(TRUE)
// ELSE BEGIN
//   SETRANGE("No.");
//   EXIT(FIND(Which));
// END;
// < TL4.02:01 <<<


Damit diese Lösung greift, muss allerdings der Programmcode im OnFindRecord()-Trigger auskommentiert werden (siehe obigen Code).

28. Oktober 2006 01:27

Ich meinte das eigentlich folgendermassen:
Statt des Aufrufs der Form wird eine Codeunit im Menu aufgerufen, die setzt einen Filter auf die Tabelle Salesheader, wie z.B. auf das von Kowa erwähnte Feld 114, dann wird die Form gestartet und darin im OnAfterGetRecord der Filter wieder gelöst.

Codeunit XY (OnRun-Trigger):
Code:
//Variable SalesHeader, Typ Record Subtype "Sales Header"
SalesHeader.SETFILTER("Tax Area Code",'<>%1','');
FORM.RUN(42,SalesHeader);


Form 42 (Sales Order) OnAfterGetRecord-Trigger:
Code:
SETRANGE("Tax Area Code");
// ab hier dann der bereits vorhandene Code
SETRANGE("Document Type");
//usw.


Diese Methode hat aber den Nachteil, dass jedesmal wenn man im Menu darauf klickt, eine neue Form aufgeht.

7. November 2006 20:19

Hallo,

danke für die Antowrten. Habe trotzdem noch keine Lösung gefunden.

@Timo: ich bekomme zwar eine leere Maske, aber kann keine Auftragsnummer eingeben. Was mache ich noch falsch?

7. November 2006 20:40

mit welcher Meldung wird die Eingabe der Auftragsnummer denn abgelehnt?
oder "verschwindet" die Eingabe nach verlassen des Feldes einfach wieder? Wenn ja, dann ist noch der Filter auf die Auftragsnummer aktiv.

8. November 2006 09:45

Guten Morgen,

also die Auftragsnummer kann ich nicht mal in das Feld eingeben. Er nimmt kein Zeichen an.

8. November 2006 10:18

Auch nach Druck auf F3?

8. November 2006 10:37

Ist deine Form Schreibgeschützt? oder steht der Parameter InsertAllowed in den Properties auf NO ?

8. November 2006 10:49

@Natalie: Habe ich auch schon probiert aber es läßt sich nichts eingeben.

@Michael: Die Form ist nicht schreibgeschützt. Alle Felder sind weiß und das Property "Insert allowed" steht auf Yes :roll:

Ich habe mal den Code von der Form angehängt.

Code:


Form - OnInit()
SETFILTER("No.",'%1',''); 


Form - OnOpenForm()
SETRANGE("No.");  // Filter wieder lösen


IF UserMgt.GetSalesFilter() <> '' THEN BEGIN
  FILTERGROUP(2);
  SETRANGE("Responsibility Center",UserMgt.GetSalesFilter());
  FILTERGROUP(0);
END;

SETRANGE("Date Filter",0D,WORKDATE - 1);

Form - OnCloseForm()

Form - OnQueryCloseForm() : Boolean

Form - OnActivateForm()

Form - OnDeactivateForm()

Form - OnFindRecord(Which : Text[1024]) : Boolean
{
IF FIND(Which) THEN
  EXIT(TRUE)
ELSE BEGIN
  SETRANGE("No.");
  EXIT(FIND(Which));
END;
}

Form - OnNextRecord(Steps : Integer) : Integer

Form - OnAfterGetRecord()
SETRANGE("Document Type");

Form - OnAfterGetCurrRecord()
SETRANGE("Date Filter",0D,WORKDATE - 1);

UpdateInfoPanel;

Form - OnBeforePutRecord()

Form - OnNewRecord(BelowxRec : Boolean)
"Responsibility Center" := UserMgt.GetSalesFilter();


PS:Ich sehe gerade das er beim F3-drücken jedesmal einen neuen Auftrag anlegt. Den sieht man allerdings nur wenn die Auftragsübersicht über den Objektdesigner geöffnet wird.

8. November 2006 12:11

Geht es vielleicht, wenn du den Teil hier auskommentiert?

Code:
Form - OnAfterGetCurrRecord()
SETRANGE("Date Filter",0D,WORKDATE - 1);

8. November 2006 12:58

Das auskommentieren hat leider auch nicht geholfen.
Irgendwo muß wohl noch ein Filter sitzen, der die Anzeige des neu erstellten Auftrags verhindert.
:shock:

8. November 2006 13:23

Dann bliebe nur noch der Teil hier, sofern dein Quelltextauszug vollständig ist:

Code:
IF UserMgt.GetSalesFilter() <> '' THEN BEGIN
  FILTERGROUP(2);
  SETRANGE("Responsibility Center",UserMgt.GetSalesFilter());
  FILTERGROUP(0);
END;


Was ist eigentlich mit der Form-Property SourceTableView?
Wenn da noch und nur auf "Order" gefiltert wird, dann legst du keine neuen Aufträge, sondern Angebote an (überprüfe das doch mal, was in den neu angelegten Aufträgen wirklich drin steht). In so einem Fall muss innerhalb des Quelltextes der Filter auf Order unbedingt drin bleiben.

8. November 2006 20:44

Ich vermute, dass es an dem Filter im OnInit Trigger liegt, denn es scheint, als ob der Filter auf Nr='' immer noch aktiv ist.
Aber da Timo das getestet hat, stimmt wahrscheinlich Natalies Vermutung mit dem Filter auf den Order-Typ

8. November 2006 22:15

Asche auf mein Haupt!
Die von mir vorgeschlagene Lösung funktionierte in einer älteren Navision-Version wunderbar, und ich hatte vermutet, sie würde unter 4.0 immer noch funktionieren, daher hatte ich nur getestet, ob die Form auf einem leeren Datensatz öffnet (und ging davon aus, dass der Rest dann immer noch funktionieren würde).
Leider bekam auch ich - trotz verschiedenster Varianten - es nicht hin, dass ich anschließend auch noch Aufträge anlegen konnte.

Sorry!

(Notiz an mich selbst: Nicht alles, was früher mal funktionierte, läuft auch noch unter 4.0, daher immer bis zum Ende durchtesten!)

10. November 2006 11:53

Hallo zusammen,

habe mich doch noch mal mit dem Thema beschäftigt.
Es scheint jetzt soweit zu funktionieren

@Mikka: Danke! (und natürlich allen anderen die mir geantwortet haben)

Falls es jemanden interessiert:

Code:
//Auftragsnummer Code 20
Form - OnOpenForm()
//////////////////////
SalesHeader.RESET;
Auftragsnummer := '';
IF SalesHeader.GET(SalesHeader."Document Type"::Order,Auftragsnummer) THEN
  SalesHeader.DELETE;
INIT;
"Document Type" := "Document Type"::Order;
"No." := '';
IF NOT INSERT THEN;
CurrForm."No.".ACTIVATE;
//////////////////////

IF UserMgt.GetSalesFilter() <> '' THEN BEGIN
  FILTERGROUP(2);
  SETRANGE("Responsibility Center",UserMgt.GetSalesFilter());
  FILTERGROUP(0);
END;

SETRANGE("Date Filter",0D,WORKDATE - 1);



Der User muß für eine neue Auftragsnummer jetzt zwar noch F3 drücken und mit Enter bestätigen aber habe jetzt keine Zeit mehr um mich weiter drum zu kümmern.

Schönes Wochenende!

10. November 2006 12:33

Danke für deinen Lösungsvorschlag.
Ist zwar nicht der eleganteste Weg, aber ein möglicher (und somit deutlich besser als meiner, der ja nur zur Hälfte funktionierte).

10. November 2006 12:48

Hallo Timo,

könntest du mir eventuell wenn du mal Zeit hast eine elegantere Möglichkeit erklären? Bin für jeden Tip zur Codeoptimierung dankbar.

PS: Habe noch ein WSH.SendKeys('{F3}'); eingeschoben. Jetzt funktioniert es auch mit der automatischen Auftragsnummernvergabe nach dem Betätigen von "Enter".