Acronaut Diskussions Forum Home

Freies User Forum für

ADOBE® ACROBAT®

Acronaut Diskussions Forum > Adobe Livecycle Designer > JavaScript im LCD > Erforderliche Felder abfragen und melden
Navigation
Nicht angemeldet

Login | Registrieren 

  

Suche

Erweiterte Suche

Newsletter

Mitgliederliste

Kalender

Moderatoren/Partner

Hilfe

Banner

Kontakt/Impressum
Erforderliche Felder abfragen und melden
 Moderiert von: WebZopp, Gentleman, FileAffairs, acronaut Produkt: Adobe LiveCycle Designer VX  

Neue Diskussion

Antworten

Drucken
VerfasserBericht
KKD
Member
 

Eintragen seit: 23 Feb 2012
Herkunft: Zürich, Schweiz
Berichte: 36
Status:  Offline
 Geschrieben: 3 Mar 2014 16:36

Text übernehmen

Antworten
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:

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

radzmar
Member


Eintragen seit: 25 Okt 2011
Herkunft: Schwerin, Deutschland
Berichte: 931
Status:  Offline
 Geschrieben: 3 Mar 2014 20:13

Text übernehmen

Antworten
Hi,

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

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
Member
 

Eintragen seit: 23 Feb 2012
Herkunft: Zürich, Schweiz
Berichte: 36
Status:  Offline
 Geschrieben: 4 Mar 2014 10:07

Text übernehmen

Antworten
Ok vielen Dank. Probiere ich gleich aus...

KKD
Member
 

Eintragen seit: 23 Feb 2012
Herkunft: Zürich, Schweiz
Berichte: 36
Status:  Offline
 Geschrieben: 4 Mar 2014 10:21

Text übernehmen

Antworten
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.


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?

Letzte Änderung am 4 Mar 2014 10:29 von KKD

radzmar
Member


Eintragen seit: 25 Okt 2011
Herkunft: Schwerin, Deutschland
Berichte: 931
Status:  Offline
 Geschrieben: 4 Mar 2014 10:35

Text übernehmen

Antworten
Das würde dann so aussehen.

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
Member
 

Eintragen seit: 23 Feb 2012
Herkunft: Zürich, Schweiz
Berichte: 36
Status:  Offline
 Geschrieben: 4 Mar 2014 10:43

Text übernehmen

Antworten
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

nele_sonntag
Administrator


Eintragen seit: 3 Mai 2009
Herkunft: Frankfurt, Deutschland
Berichte: 2600
Status:  Offline
 Geschrieben: 4 Mar 2014 13:05

Text übernehmen

Antworten
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:
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

nele_sonntag
Administrator


Eintragen seit: 3 Mai 2009
Herkunft: Frankfurt, Deutschland
Berichte: 2600
Status:  Offline
 Geschrieben: 4 Mar 2014 13:09

Text übernehmen

Antworten
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:
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
Member
 

Eintragen seit: 23 Feb 2012
Herkunft: Zürich, Schweiz
Berichte: 36
Status:  Offline
 Geschrieben: 4 Mar 2014 13:17

Text übernehmen

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

nele_sonntag
Administrator


Eintragen seit: 3 Mai 2009
Herkunft: Frankfurt, Deutschland
Berichte: 2600
Status:  Offline
 Geschrieben: 4 Mar 2014 13:19

Text übernehmen

Antworten
Ach so Tooltipp. Da du ihn mit
this.assist.toolTip.value = "test";

per Script setzten kannst, kannst du ihn auch so auslesen. ;-)

nele_sonntag
Administrator


Eintragen seit: 3 Mai 2009
Herkunft: Frankfurt, Deutschland
Berichte: 2600
Status:  Offline
 Geschrieben: 4 Mar 2014 13:20

Text übernehmen

Antworten
Würde aber stattdessen vielleicht eher die Caption empfehlen!
this.caption.value.text.value = "hallo";

nele_sonntag
Administrator


Eintragen seit: 3 Mai 2009
Herkunft: Frankfurt, Deutschland
Berichte: 2600
Status:  Offline
 Geschrieben: 4 Mar 2014 13:37

Text übernehmen

Antworten
Vielleicht um noch einmal die Typkonvertierung von Javascript zu verdeutlichen, folgendes Beispiel:
this.rawValue = 3 + true;


Was glaubst Du, was hier das Ergebnis ist?

Du möchtest die Zahl 3 mit etwas addieren (in diesem Fall einem boolean), Javascript erwartet an dieser Stelle aber eine Zahl und interpretiert true als 1 und das Ergebnis ist 4!!

LG Mandy

KKD
Member
 

Eintragen seit: 23 Feb 2012
Herkunft: Zürich, Schweiz
Berichte: 36
Status:  Offline
 Geschrieben: 4 Mar 2014 14:36

Text übernehmen

Antworten
nele_sonntag schrieb:
Ach so Tooltipp. Da du ihn mit
this.assist.toolTip.value = "test";

per Script setzten kannst, kannst du ihn auch so auslesen. ;-)


Wo würde ich dass den in das Skript von razmar reinpacken, um den Tolltipp abzufragen?

Was ist die Caption, die Feldbeschriftung? Viele meiner Felder haben keine solche....

radzmar
Member


Eintragen seit: 25 Okt 2011
Herkunft: Schwerin, Deutschland
Berichte: 931
Status:  Offline
 Geschrieben: 4 Mar 2014 17:46

Text übernehmen

Antworten
Also den Tooltip würde ich nicht nehmen, der kann ja leer sein, oder ewig lang oder mehrzeilig.
Wenn Du die Objektnamen mit "_" schreibst, dann kannst Du das in der Ausgabe einfach per replace()-Methode durch ein Leerzeichen ersetzen lassen.

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

KKD
Member
 

Eintragen seit: 23 Feb 2012
Herkunft: Zürich, Schweiz
Berichte: 36
Status:  Offline
 Geschrieben: 4 Mar 2014 18:06

Text übernehmen

Antworten
Das ist super, so gehts natürlich auch!


 Uhrzeit 03:34
Seite:    1  2  Nächste Seite Letzte Seite  





Powered by WowBB 1.7 - Copyright © 2003-2006 Aycan Gulez
Seite erstellt in 0.1155 Sekunden (29% DB + 71% PHP). 19 verarbeitete Abfragen.