Pflichtfelder in Navisionmaske

22. November 2005 17:58

Hallo zusammen,

ich habe die ehrenvolle aufgabe bekommen mich ein wenig in navision einzuarbeiten.
wir möchten nämlich gerne das bestimmte felder wie die telefonnummer eines Kunden als pflichtfeld
erscheint das einen wert enthalten muss bevor der kunde abgespeichert wird.

kann mir jemand von euch bitte sagen wie man das realisieren kann? ich hab schon gedacht das die eigenschaft des feldes "notBlank" da hilft. aber das scheint es nicht gewesen zu sein. da ich erst in das feld hinein muss um damit navision merkt das es leer ist.

anderes problem ist auch ein feld wo ich eine neue auswahlliste erscheinen lasse. da wird der wert auch nicht berücksichtigt.

danke im für eure kreativen ideen!

22. November 2005 18:57

Hi,

da gibt es einige Möglichkeiten, hängt auch von deiner Lizenz ab.
ich finde folgendes am coolsten ;-)
Im Trigger
OnQueryCloseForm() : Boolean
dieser Code:
EXIT(CONFIRM('Schliessen',TRUE));

Anstelle des CONFIRM könnte dann dort auch ein Funktionsaufruf stehen, der TRUE/FALSE zurückgibt nach Prüfung der relevanten Felder und mit Ausgabe einer Message!

Dieser Vorschlag steht zur Diskussion, aber mal sehen, was die anderen Freaks hier noch so aus der Trickkiste kramen ;-)

Gruss, Otschko

22. November 2005 20:57

Normalerweise ist es die Philosophie von Navision, auch unvollständige Daten anzulegen. Geprüft wird immer erst bei der Verwendung (z. B. in einem Angebot, Auftrag, ...).

Wird dennoch auf die "Pflichtfeld"-Thematik gepocht, so stehen mehrere Vorgehensweisen zur Verfügung:
  1. Debitor ist beim Anlegen "Gesperrt" und kann nur entsperrt werden, wenn alle Pflichtfelder gefüllt sind.
    Gesperrte Debitoren (Option Gesperrt::Alle) können nirgendwo in Navision verwendet werden.
    Diese Lösung funktioniert mit allen Daten, welche schon im Standard ein "Gesperrt"-Feld (Option bzw. Boolean) haben, da es überall abgeprüft wird.
    Vorgehensweise: In der jeweiligen Tabelle InitValue des Feldes Gesperrt auf "Alle" (bei Option) bzw. "1" (bei Boolean) setzen und im OnValidate die Bedingungen prüfen.
    Um es dem Anwender einfacher zu machen, hat es sich bewehrt, die "Pflichtfelder" mit einem gelben Hintergrund zu versehen (erinnert an einen "Textmarker") und / oder den Text des dazugehörige Label rot zu färben.
  2. Da ein Datensatz nach Eingabe aller Primärschlüssel-Felder bereits eingefügt wird, bleibt die Frage offen, wie vorzugehen ist, wenn der Benutzer einen unvollständigen Datensatz verlassen will.
    • Wird die Lösung 1. verwendet, braucht man normalerweise keine weiteren Vorkehrungen treffen, da dieser Datensatz nicht weiter verwendet werden kann.

      Ist die Lösung 1. nicht akzeptabel, wird es schon deutlich schwieriger:
    • Benutzer nicht aus der Form lassen (OnQueryCloseForm mit EXIT(FALSE) quittieren und OnNextRecord ausprogrammieren).
      Nicht empfehlenswert, da es unter Umständen Stunden oder Tage dauern könnte, bis die fehlenden Informationen verfügbar sind (weil sie z. B. von einer anderen Abteilung angelegt werden müssen).
    • Wie zuvor, jedoch erweitert um folgendes:
      Benutzer beim Verlassen des Datensatzes (Blättern oder Schließen) fragen, ob er den unvollständigen Datensatz löschen möchte.
      Diese Variante erlaubt es dem Benutzer den Datensatz zu verlassen, muss dann aber alle Daten nochmal erfassen. Des Weiteren treten dann bei automatischen Nummernserien Lücken auf, da (z. B. die Debitoren-)Nr. bereits verwendet (und wieder gelöscht) wurde.

Ich empfehle die Lösung 1., da dies die anwenderfreundlichste Variante ist und die Datenintegrität dennoch gesichert ist.

23. November 2005 08:36

Hallo,
mein Vorschlag wäreTESTFIELD(Record), auf dem OnQueryCloseForm Trigger.
So erscheint eine relativ aussagekräftige Fehlermeldung und der Anwender wird gezwungen eine Eingabe zu machen, allerdings kann der User die Form ohne Eingabe nicht schliessen, was zu berücksichtigen ist!

SilenceBlue schrieb:
anderes problem ist auch ein feld wo ich eine neue auswahlliste erscheinen lasse. da wird der wert auch nicht berücksichtigt.


Könnetst du Dein zweites Problem etwas genauer beschreiben, meinst du ein lookup(Bei einem klick im Feld auf den Pfeil nach oben, öffnet sich ein neues Fenster), oder meinst du ein DrillDown (Bei einem klick im Feld auf den Pfeil nach unten, öffnet sich eine Auswahlliste)
*
*
*
Otschko schrieb:
Hi,

da gibt es einige Möglichkeiten, hängt auch von deiner Lizenz ab.


Wie meinst du dass, ich dachte bisher, ich darf auf der Form Programmieren oder nicht! Oder meinst du damit, das der Admin zwar eine Form erstellen darf, aber nicht Programmieren?


Timo Lässler schrieb:
Normalerweise ist es die Philosophie von Navision, auch unvollständige Daten anzulegen. Geprüft wird immer erst bei der Verwendung (z. B. in einem Angebot, Auftrag, ...).


Stimmt schon, aber je nach Tabelle sollte der OnValidate Trigger ausgeführt werden, der u.a. Feldprüfungen ausführt!
Die OnModifiy und OnInsert Trigger können auch mit Datenprüfungen mit Prüfungen hinterlegt sein!
Gruß Mikka

23. November 2005 09:42

hallo das klingt ja schonmal nach einer menge guter vorschläge.. jetzt hab ich nur noch eine frage... wo muss ich diese Trigger setzen?

im c/cal menü? wenn ja weis einer warum ich da nicht reinkomme, weil das feld grau unterlegt ist? hab ich dann nicht die nötigen rechte dafür? oder wie rufe ich das ganze auf?

23. November 2005 12:21

Hallo,
ich hoffe Ihr habt die entsprechende Lizenz!
Über den MenüpunktExtras-->Objekt Designer" kommst du in die C/SIDE Entwicklungsumgebung, sollte dieser Punkt grau hinterlegt sein, muss, sofern Ihr eine entsprechende Lizenz habt Euer Administrator dir die entsprechende Rolle vergeben, im Regelfall SUPER, damit kannst du alles Editieren (Sofern eine Lizenz vorhanden ist).

Falls du keine Kenntnisse über die Navision Programmierung hast (Kenntnisse in einer anderen Sprache Vorausgesetzt), empfehle ich dir die Dokumentation auf der Navision CD zu Lesen z.B. den "w1w1adg.pdf" --> Application Designers Guide, das ist die Bibel der Navision Programmierer.
Part 1 sind nur 25 Seiten und geben dir einen Einstieg in die Entwicklungsumgebung.

Wichtig
Solltest du die entsprechenden Rechte besitzten und in Navision Programmieren, kann ich nur dir dringstens Empfehlen, auf einer "lokalen" Kopie der Datenbank zu Entwickeln und Evaluieren.

23. November 2005 17:45

Eine weitere Möglichkeit, welche zwar ein wenig von den Ursprungsanforderungen entfernt ist aber zum Beispiel bei mangelnder Lizenz eine gute Wahl darstell ist folgendes:

Man erstellt einen Report welcher (zum Beispiel pro Verkäufer) prozentual oder als Liste angibt bei wieviel Kontakten die gewünschten Informationen nicht hinterlegt sind und haut ihnen im Anschluss ggf. einen auf den Deckel, funktioniert bei uns wunderbar :twisted: .

Von Prüfungen beim Verlassen der Maske würde ich persönlich abraten da man dann (wenn die Telefonnummer zum Beispiel wirklich nicht bekannt ist) irgendwelchen Quark drin steht hat. Von das Akzeptanz unter den Usern mal ganz abgesehen (wenn ich mir das bloß vorstelle, das ganze Geschrei :-)).

23. November 2005 20:41

Hi,

mikka hat geschrieben:Otschko schrieb:
Hi,

da gibt es einige Möglichkeiten, hängt auch von deiner Lizenz ab.


Wie meinst du dass, ich dachte bisher, ich darf auf der Form Programmieren oder nicht! Oder meinst du damit, das der Admin zwar eine Form erstellen darf, aber nicht Programmieren?


Genau das meinte ich mit der Lizernz, offensichtlich kann SilenceBlue nicht auf den C/AL Code der (Standard)Forms.
Da bleiben dann leider nicht viel Möglichkeiten mehr, evtl. könnte man die Pflichtfelder noch farblich hervorheben, aber wenn die Lizenz keinen C/AL Code zulässt wird der Spielraum für solche Anpassungen schon recvht eng :-(

23. November 2005 21:03

Wenn in der Lizenz kein Zugriff auf den C/AL-Code gewährt wird (ist erst ab "Application Builder" enthalten), empfehle ich meine "Lösung 1", welche dann allerdings von eurem Navision-Partner durchgeführt werden müsste.
Dies dürfte die günstigste Lösung sein.

Wenn ihr wenigstens den "Form-Designer" in der Lizenz habt, dann könnt ihr ja schonmal alle Pflichtfelder farblich kennzeichnen.
Habt ihr zusätzlich den "Table-Designer", dann könnt ihr den InitValue des Feldes Gesperrt auf "Alle" bzw. "Ja" setzen.

Nun braucht euer Navision-Partner nur noch im OnValidate-Trigger des Feldes "Gesperrt" die (bereits farblich hervorgehobenen) Felder abprüfen.
Schnellste Möglichkeit:
Code:
Blocked - OnValidate()
TESTFIELD("Name des 1. Pflichtfeldes");
TESTFIELD("Name des 2. Pflichtfeldes");
TESTFIELD("Name des 3. Pflichtfeldes");
TESTFIELD("Name des n. Pflichtfeldes");

25. November 2005 10:44

hallo ja das klingt gut was du beschreibst aber ich hab noch eine frage,

ich hab nun die lizenz für die designer.. aber wo würde ich den punkt finden die tabllen zu designen um das onmodify einzutragen?

im designer fenster unter den c/cals finde ich nur immer form und die felder scripte.

:oops:

25. November 2005 11:04

Moin,

SilenceBlue hat geschrieben:ich hab nun die lizenz für die designer.. aber wo würde ich den punkt finden die tabllen zu designen um das onmodify einzutragen?

im designer fenster unter den c/cals finde ich nur immer form und die felder scripte.


Hujujuj...
Wenn du noch nicht weiss, wo du die Trigger bzw. den Code dazu findest, solltest du aber mit der Programmierung auch bissel vorsichtig sein
:shock:

Also, Object Designer, Tabellen, <Tabelle auswählen>, Design (dann solltest du die Tabellenfelder samt Datentyp sehen), Ansicht -> C/AL Code bzw. einfach F9.

Viel Spass!

Gruss, Otschko

29. November 2005 17:08

hallo

gehen wir mal davon aus das ich meine adresse als pflichtfeld deklarieren möchte..

also geh ich in tabelle 167 suche den trigger blocked und trage da ein
unter Blocked - OnValidate()

TESTFIELD("address");

wie du beschrieben hast aber ich kann immer noch "leere" Datensätze mit dem feld als leer anlegen... hab ich noch was zu ändern?

29. November 2005 17:27

juppy endlich gehts .. zumindest fragt er ab.. nur schliesst sich immer die eingabemaske direkt.. kann man das abstellen oder entgegen wirken?

ich hab jetzt in der form

Form - OnBeforePutRecord()
IF (Address = '') THEN
ERROR('Es wurden nicht alle Pflichtfelder gefüllt.');

zum testen eingetragen

kann man das feld nicht irgendwie mit dem fokus belegen?

29. November 2005 18:08

Hallo,

ich Empfehle dir in der C/Side Hilfe (Mit F1) die einzelnen Befehle nachzulesen.

Der ERROR (Dialog) z.B.
Use this function to display an error message and end the execution of C/AL code.

Die Verarbeitung wird abgebrochen, daher ist diese Variante nicht unbedingt Sinnvoll.
Ich würde zB. auf dem OnQueryCloseForm Trigger eine Feldprüfung hinterlegen, wenn nicht alle Felder gegfüllt sind, dann gibt halt eine MESSAGE() und EXIT(FALSE).

Code:
IF Address = '' THEN BEGIN
 MESSAGE('Sie haben nicht alle Pflichtfelder gefüllt!');
 EXIT(FALSE);
END;


Auf dem Form - OnNextRecord(Steps : Integer) : Integer
Muss auch eine Prüfung hinterlegt werden!

Bestimmt gibt es noch Elegantere Lösungen :!:

Gruß [schild=11 fontcolor=000000 shadowcolor=C0C0C0 shieldshadow=1]Mikka[/schild]

30. November 2005 09:44

ja das mit der message hab ich kurz nach meinem post auch gefunden.. danke schön aber...

mein wesentliches problem ist aber das er zwar die meldung gibt aber dann trotzdem einen neuen datensatz anlegt oder man einfach schliessen kann wenn man die meldung bestätigt.

30. November 2005 12:05

Moin SilenceBlue,
bei mir klappt das mit dem Abfangen der leeren Felder!
Hast du den Code auf dem richtigen Trigger? OnQueryCloseForm

Ich habe nur das Problem, dass der User zwar die Form nicht schliessen kann, wenn das Feld nicht gefüllt ist, aber der User kann den rec wechseln ohne Message!
Vieleicht: OnNextRecord :?: :?: :?:

Ich konnte hierzu keine Akzeptable Lösung finden, wer weiß mehr?
Gruß Mikka

30. November 2005 22:42

Timo Lässer hat geschrieben:[...]
Benutzer nicht aus der Form lassen (OnQueryCloseForm mit EXIT(FALSE) quittieren und OnNextRecord ausprogrammieren).
Nicht empfehlenswert, da es unter Umständen Stunden oder Tage dauern könnte, bis die fehlenden Informationen verfügbar sind (weil sie z. B. von einer anderen Abteilung angelegt werden müssen).

Wie zuvor, jedoch erweitert um folgendes:
Benutzer beim Verlassen des Datensatzes (Blättern oder Schließen) fragen, ob er den unvollständigen Datensatz löschen möchte.
Diese Variante erlaubt es dem Benutzer den Datensatz zu verlassen, muss dann aber alle Daten nochmal erfassen. Des Weiteren treten dann bei automatischen Nummernserien Lücken auf, da (z. B. die Debitoren-)Nr. bereits verwendet (und wieder gelöscht) wurde.
[...]

Dies wäre die komplizierteste Form der "Pflichtfeld-Thematik" und selbst diese hat (bei mir) immer noch eine Lücke:
Ich kann zwar erfolgreich das Weiterblättern (OnNextRecord) sowie das Schließen der Form (OnQueryCloseForm) verhindern, jedoch habe ich noch keine Lösung gefunden, wie ich den Benutzer daran hindern kann per F5 in die Übersicht zu gehen und einen gültigen (vollständig ausgefüllten) Datensatz auszuwählen.

Wo ich das hier gerade so schreibe geht mir ein :idea: auf.
Anstatt in dem MenuItem für die Übersicht (F5) LookUpTable als PushAction festzulegen, müsste diese Funktion voll ausprogrammiert werden.
D. h. Abprüfung der Pflichtfelder und wenn bestanden, mit
Code:
Rec2 := Rec;
IF FORM.RUNMODAL(0,Rec2) = ACTION::LookupOK THEN
  Rec := Rec2;
die Standard-Form für die Übersicht öffnen.

Da die Pflichtfelder somit an drei verschiedenen Stellen auf der Form abgeprüft werden müssen, empfiehlt es sich, diese Prüfung in eine Funktion zu legen, welche mit einem Boolean zurückgibt, ob alle Felder gefüllt sind.

Zusammenfassung:
- Neue Funktion PrüfePflichtfelder() : Boolean
- OnQueryCloseForm : Boolean ausprogrammieren
- OnNextRecord(Steps : Integer) : Integer ausprogrammieren (Kann in der Form "Navigate" abgeguckt werden)
- MenuItem "Übersicht" (F5): PushAction::LookupTable entfernen und den OnPush() wie oben vorgeschlagen ausprogrammieren.

1. Dezember 2005 11:10

Ich denke mal, im OnNextRecord Trigger muss als letztes dann Rec:=XRec gesetzt werden um wieder auf den alten Datensatz zu kommen.
Probiert habe ich das noch nicht, aber ich werde mich auch mit der Erstellung von Pflichtfeldern beschäftigen müssen, in Kombination mit einer Taste, die die Stammdatenmaske, die normal schreibgeschützt geöffnet werden soll, in den Editiermodus setzt, und dieser sich nur aufheben läßt, wenn alle Felder richtig ausgefüllt sind, sowie der Datensatz nicht gewechselt oder verlassen werden kann, solange der Modus noch aktiv ist.
Das Problem bei mir wird sein, dass der Kunde in einer anderen Tabelle festlegen kann, welche Felder Pflichtfelder sein sollen, damit man diese Änderung auch für alle unsere Kunden verwenden kann, was Kosten senkt.
Au Mann, schon wieder ein Roman geworden, wo ich doch soviel Arbeit habe..... :wink:

PS: ICh hab zu spät gesehen, dass noch eine zweite Seite mit Postings kam, diese Antwort bezieht sich auf das letzte Posting der ersten Seite, bei Standard-Darstellung, was die Anzahl der Postings auf einer Seite angeht :oops:

1. Dezember 2005 19:21

Der Ansatz mit OnNextRecord ist nicht zu gebrauchen.
Was passiert, wenn ein Anwender die Debitorenkarte durchblättert (PgUp / PgDn) und dann auf einen Datensatz trifft, der nicht vollständig ist?
Er kann den Datensatz nicht mehr verlassen, obwohl der Record vielleicht gar nie von ihm angelegt worden ist.

Das ist doch sicher nicht im Sinne des Erfinders.
Das mit dem Schreibschutz auf der Maske ist einfach.


Debitorenkarte
Button Debitor, neues Item Schreibschutz ShortCutKey F2
<Control165> - OnPush()
ControlsEditable(TRUE);

Form - OnOpenForm()
CurrForm.EDITABLE(FALSE);

Form - OnAfterGetCurrRecord()
ControlsEditable(FALSE);

Function ControlsEditable(_bPara)
IF CurrForm.EDITABLE THEN BEGIN
IF (Nummer <> xRec.Nummer) AND
(CurrForm.ACTIVE)
THEN
CurrForm.EDITABLE(FALSE);
END ELSE BEGIN
CurrForm.EDITABLE(_bPara);
END;


So kann der Anwender mittels F2 den Schreibschutz ein- / ausschalten.

1. Dezember 2005 20:30

Hallo Martin, warum ist da (Nummer <> xRec.Nummer) in der Funktion drin? und Currform.active heisst doch dass die Form den Focus hat, oder nicht?
der Anwender soll aber gar nicht erst den Datensatz wechseln können solange er nicht auf "Speichern" (Name der Taste "Ändern" nach deren Aktivierung) geklickt hat, weil ich genau dann die Pflichtfelder prüfen will.

1. Dezember 2005 20:42

martinst hat geschrieben:Der Ansatz mit OnNextRecord ist nicht zu gebrauchen.
Was passiert, wenn ein Anwender die Debitorenkarte durchblättert (PgUp / PgDn) und dann auf einen Datensatz trifft, der nicht vollständig ist?
Er kann den Datensatz nicht mehr verlassen, obwohl der Record vielleicht gar nie von ihm angelegt worden ist.

Das ist doch sicher nicht im Sinne des Erfinders.
[...]

Da hast du vollkommen recht, daher habe ich in meiner Lösung eine Boolean-Variable "RecModified", welche ich im OnModify-Trigger auf TRUE setze und beim (tatsächlichen) Wechsel des Datensatzes wieder zurücksetze.
Bevor nun die Pflichtfeldprüfung stattfindet, prüfe ich zuerst, ob der Benutzer den Datensatz geändert hat, dabei ist es unerheblich, ob er ein Pflichtfeld oder ein anderes Feld geändert hat.

2. Dezember 2005 09:31

Ich finde grundsätzlich die Lösung nicht OK.
Grund: Es entspricht überhaupt nicht den Navision-Standards.

2. Dezember 2005 10:42

Hallo Martininst,

Ich finde grundsätzlich die Lösung nicht OK.
Grund: Es entspricht überhaupt nicht den Navision-Standards.


Prinzipiell Stimme ich dir zu, es sollte am Navision Standart Programiert werden sprich Style Guide Konform. So habe ich es auch gelernt.

Nur wenn, eine Firma es Ausdrücklich wünscht vom NSC, oder so wie bei mir, ich Arbeite als "Nicht Solution-Center" Mitarbeiter in einer Firma. Ich habe hier auch auf die Navision Konforme Programmierung hingewiesen, ist nicht gewünscht :!:

Ich denke das dieses bei SilenceBlue ähnlich ist :!:

Wie gesagt, ich Stimme dir sonst zu. (Geschweige eine Software soll Zertifiziert werden, dann ist der StyleGuide Pflicht)
Gruß Mikka

PS: Ich habe die zweite Seite auch nicht Bemerkt, bin ich Blind, oder sollte das Layout Optimiert werden :?:

2. Dezember 2005 10:45

@Michael

>>Hallo Martin, warum ist da (Nummer <> xRec.Nummer) in der >>Funktion drin?
Wegen Ctrl+F (Suchen)

2. Dezember 2005 12:52

martinst hat geschrieben:@Michael

>>Hallo Martin, warum ist da (Nummer <> xRec.Nummer) in der >>Funktion drin?
Wegen Ctrl+F (Suchen)


Verstehe ich das richtig, dass durch Suchen der "Änderungsmodus" automatisch beendet wird?
Wenn ja, dann ist das klar. ich muss das dann verhindern, dass man suchen kann, solange der Änderungsmodus aktiv ist damit die Prüfung auf Pflichtfelder erfolgen kann.....