Erforderliche Felder abfragen und melden (Pflichtfelder)

Fragen und Antworten rund um das Thema JavaScript im LiveCycleDesigner
KKD
Beiträge: 36
Registriert: 24.02.2012, 11:49

Erforderliche Felder abfragen und melden (Pflichtfelder)

Beitrag von KKD » 03.03.2014, 17:36

Hallo zusammen

ich habe ein Problem. Bei einem Formular sollen gewisse Felder erst beim Drucken als Pflichtfelder definiert und gemeldet werden, wenn sie nicht ausgefüllt wurden (mit dem Grund, dass die Felder nicht schon beim öffnen des Formulars rot markiert sein dürfen).

Für Textfelder funktioniert das perfekt mit folgendem Skript:

Code: Alles auswählen

var oField = Page1.Firmenname
if (oField.rawValue == ""  || oField.rawValue == null){
oField.validate.nullTest = "error";
} else {
oField.validate.nullTest = "disabled"}

var oField = Page1.StrasseNr
if (oField.rawValue == ""  || oField.rawValue == null){
oField.validate.nullTest = "error";
}else {
oField.validate.nullTest = "disabled"}

var oField = Page1.PLZ_Ort
if (oField.rawValue == ""  || oField.rawValue == null){
oField.validate.nullTest = "error";
}else {
oField.validate.nullTest = "disabled"}

/// usw.....


// die oben als erforderlich festgelegten Felder melden, wenn keine, dann drucken od. senden (senden ist nicht aktiviert)
var Valid = true;
var Sammelmeldung = "";
for(var i = 0; i < xfa.host.numPages; i++) {
	var oFields = xfa.layout.pageContent(i, "field");
	var nodesLength = oFields.length;
	for(var j = 0; j < nodesLength; j++){
		var oItem = oFields.item(j);
		if(oItem.validate.nullTest == "error" && oItem.rawValue == null || oItem.rawValue == ""){
			Valid = false;
			Sammelmeldung = Sammelmeldung + oItem.name + "\n";
		}
	}
}
if(Valid){
xfa.host.print(1, "0", (xfa.host.numPages -1).toString(), 0, 0, 0, 0, 0);
} else {
	app.alert("Folgende Text-Felder wurden nicht ausgefüllt.\n\n" + Sammelmeldung + "\nZum Drucken der Formulare müssen alle farbig markierten Pflichtfelder ausgefüllt oder angekreuzt sein.",1) ;
	app.runtimeHighlight = true ;
	xfa.event.cancelAction = 1
}
Aber ich müsste auch Optionsfelder überprüfen und melden können. Das überprüfen klappt auch, wenn ich im oberen Teil des Skripts einfach den rawValue der Optionsfeldgruppe abfrage. Aber ich bekomme es nicht in die Sammelmeldung, vermutlich weil da nach "field" gesucht wird. Kann jemand von euch das Meldeskript so anpassen, dass auch erforderliche Optionsfelder gemeldet werden?

Ich kann aus Datenschutzgründen dieses Formular nicht hochladen, aber vielleicht kann mir so schon jemand was sagen? Ich könnte auch ein leeres Formular machen und nur die relevanten Felder hineinkopieren.

Vielen lieben Dank.
Kenneth

Benutzeravatar
radzmar
Beiträge: 961
Registriert: 26.10.2011, 10:18

Erforderliche Felder abfragen und melden

Beitrag von radzmar » 03.03.2014, 21:13

Hi,

hier mal ein etwas etwas anderer Ansatz, der ein wesentlich kürzeres Skript benötigt, aber dasselbe Ergebnis liefert.

Code: Alles auswählen

var checkObjects = [Formular1.Page1.Textfeld1, Formular1.Page1.Textfeld2, Formular1.Page1.Optionsfeldliste],
    failedObjects = [];

checkObjects.forEach(function(oObject) {
	if (oObject.isNull) {
		oObject.validate.nullTest = "error";
		failedObjects.push(oObject.name);
	} else {
		oObject.validate.nullTest = "disabled";
	}
});

if (failedObjects.length > 0) {
	if (xfa.host.messageBox("Folgende Text-Felder wurden nicht ausgefüllt.\n\n" + failedObjects.join("\n") + "\n\nZum Drucken der Formulare müssen alle farbig markierten Pflichtfelder ausgefüllt oder angekreuzt sein.", "Pflichtfelder sind nicht gefüllt", 1, 0) === 1) {
        app.runtimeHighlight = true;
        xfa.event.cancelAction = 1;
    }
} else {
	xfa.host.print(1, "0", (xfa.host.numPages - 1).toString(), 0, 0, 0, 0, 0);
}
Die Variable checkObjects ist einfach nur ein Array mit den Feldnamen, die geprüft werden sollen.
Hier brauchst Du nur deine Feldnamen eintragen, schon geht's los.

KKD
Beiträge: 36
Registriert: 24.02.2012, 11:49

Erforderliche Felder abfragen und melden

Beitrag von KKD » 04.03.2014, 11:07

Ok vielen Dank. Probiere ich gleich aus...

KKD
Beiträge: 36
Registriert: 24.02.2012, 11:49

Erforderliche Felder abfragen und melden

Beitrag von KKD » 04.03.2014, 11:21

Funktioniert einwandfrei! Absolut sensationell!

Ich habe zusätzlich noch einige Felder, die ausgeblendet sind, und nur in gewissen Fällen durch Auswahl eines Optionsfelds eingeblendet werden.

Gibt es eine Möglichkeit, diese ebenfalls auf Pflichtfeld zu stellen, aber nur wenn sie sichtbar und leer sind? Falls sie wieder ausgeblendet werden vom Benutzer, dürfen sie dann natürlich nicht mehr gemeldet werden.

Ich habe das versucht, indem ich (noch im alten Skript) die presence überprüft habe, hat aber nie geklappt.

Code: Alles auswählen

if (oField.rawValue == null && oField.presence ="visible"){
oField.validate.nullTest = "error";
} else {
oField.validate.nullTest = "disabled"}
Kann man nicht Wert + Sichtbarkeit prüfen?

Ergänzung: Könnte man anstatt des Feldnames auch den entsprechenden Tooltip auflisten?

Benutzeravatar
radzmar
Beiträge: 961
Registriert: 26.10.2011, 10:18

Erforderliche Felder abfragen und melden

Beitrag von radzmar » 04.03.2014, 11:35

Das würde dann so aussehen.

Code: Alles auswählen

var checkObjects = [Teilformular1.Textfeld1, Teilformular1.Textfeld2],
failedObjects = [];

checkObjects.forEach(function(oObject) {
    if (oObject.isNull && oObject.presence == "visible" && oObject.parent.presence == "visible") {
        oObject.validate.nullTest = "error";
        failedObjects.push(oObject.name);
    } else {
        oObject.validate.nullTest = "disabled";
    }
});

if (failedObjects.length > 0) {
    if (xfa.host.messageBox("Folgende Text-Felder wurden nicht ausgefüllt.\n\n" + failedObjects.join("\n") + "\n\nZum Drucken der Formulare müssen alle farbig markierten Pflichtfelder ausgefüllt oder angekreuzt sein.", "Pflichtfelder sind nicht gefüllt", 1, 0) === 1) {
        app.runtimeHighlight = true;
        xfa.event.cancelAction = 1;
    }
} else {
    xfa.host.print(1, "0", (xfa.host.numPages - 1).toString(), 0, 0, 0, 0, 0);
}
Noch ein Hinweis: Beim Vergleichen mit null, true, false nimmt man === oder !== anstelle von == bzw. !=.
Zudem ist die Methode Object.isNull besser als die zwei kombinierten Bedinungen Object.rawValue === null || Object.rawValue === "".

KKD
Beiträge: 36
Registriert: 24.02.2012, 11:49

Erforderliche Felder abfragen und melden

Beitrag von KKD » 04.03.2014, 11:43

Nochmals vielen Dank!!! Ich werde es gleich testen.

mit == und === habe ich oft ein Problem. Was genau ist da der Unterschied?

Und noch die allerletzte Frage:
Es werden ja die Feldnamen ausgegeben, könnte man auch den Tool-Tip ausgeben?

(Zum Teil sehen die Feldnamen nicht so toll aus, wenn es zum Beispiel heisst "Anzahl Mitarbeiter" muss ich das zusammen oder mit _ schreiben...)

lg

Benutzeravatar
nele_sonntag
Beiträge: 2742
Registriert: 04.05.2009, 15:12
Wohnort: Frankfurt
Kontaktdaten:

Erforderliche Felder abfragen und melden

Beitrag von nele_sonntag » 04.03.2014, 14:05

Also, ich würde mal sagen, wenn Du sehr sauber programmierst, so kannst Du === benutzen, als Nicht-Programmierer würde ich == empfehlen...

=== Hier wird keine Typkonvertierung durchgeführt.
Wenn Du also auf einen boolean abfragst, muss Du auch einen boolean liefern, sonst
springt Dein Skript nicht in die Abfrage rein.

Wenn Du eine Zahl abprüfst, muss Du auch eine Zahl liefern, sonst springt Dein Skript auch nicht in die Abfrage rein.

Benutzt du aber == bspw. passiert folgendes:

Code: Alles auswählen

if(this.rawValue == 1){
    Anweisungsblock
}
Hier prüfst Du auf eine Zahl 1 ab liefert Dein Feld aber bspw. einen String "1", so erkennt das Programm, dass Du etwas lieferst, was es verwenden kann, bei === funktioniert das nicht, ebenso, wenn Du auf true abprüfen möchtest und es kommt eine Zahl 1, dann wird auch etwas geliefert, was das Programm entsprechend interpretieren kann..

LG Mandy

Benutzeravatar
nele_sonntag
Beiträge: 2742
Registriert: 04.05.2009, 15:12
Wohnort: Frankfurt
Kontaktdaten:

Erforderliche Felder abfragen und melden

Beitrag von nele_sonntag » 04.03.2014, 14:09

Nachtrag:
Wenn Du Dir nicht sicher bist, was Dein abgefragtes Feld liefert, so ist es sinnvoll, mit typeof zu schauen, was es denn liefert.

Einfach einen alert bspw. in das Change-Event Deiner Optionskästchen platziert:

Code: Alles auswählen

app.alert(typeof(this.rawValue));
Interessant hierzu, wenn Du das Skript mal in einer Checkbox platzierst und zunächst die vom System vergebenen Bindungswerte betrachtest. Danach vergebe mal statt 1 und 0, bspw. true und false und lasse dir den Type ausgeben und danach noch einmal wieder die Bindungswerte auf 1 und 0 setzen. :)

Du wirst verwundert sein!! Vor allem auch bei true und false, wo man vielleicht erwarten könnte, dass er einen boolean zurückgibt. ;-)

LG und viel Spaß beim Ausprobieren!!
Mandy

KKD
Beiträge: 36
Registriert: 24.02.2012, 11:49

Erforderliche Felder abfragen und melden

Beitrag von KKD » 04.03.2014, 14:17

Vielen Dank für die Infos. Werde ich ausprobieren... :-)

Benutzeravatar
nele_sonntag
Beiträge: 2742
Registriert: 04.05.2009, 15:12
Wohnort: Frankfurt
Kontaktdaten:

Erforderliche Felder abfragen und melden

Beitrag von nele_sonntag » 04.03.2014, 14:19

Ach so Tooltipp. Da du ihn mit

Code: Alles auswählen

this.assist.toolTip.value = "test";
per Script setzten kannst, kannst du ihn auch so auslesen. ;-)

Antworten