Das Notes Forum
Domino 9 und frühere Versionen => Entwicklung => Thema gestartet von: bienmaja am 03.09.02 - 15:25:14
-
Hallo!
Ich weiß, das hier ist bestimmt nur ein kleines Problem, aber ich komme einfach nicht weiter.
Was ist an folgender Function falsch?
Function testen As Integer
If Kurzbeschreibung = "" Then
testen = 1
Else
testen=0
End If
End Function
Das Feld, was der überprüft, ist ein bearbeitbares Textfeld.
Wenn ich dies ausführe, dann gibt er mir immer eine 1 aus, egal ob das Feld leer ist oder ob was drin steht...
Habe es auch schon per Hotspot versucht, ohne die Function.
Aber da macht er das selbe.
Wo steckt mein Denkfehler??
Hilfe! :'(
-
muss es nicht heissen
function testen ( Kurzbeschreibung as String ) as integer
Kurzbeschreibung ist doch immer leer, da du doch gar nix übergiebst
eknori
-
Kurzbeschreibung ist aber ein Feld in meiner Maske.
Und das möchte ich eben überprüfen, ob der User es gefüllt hat, oder nicht.
Wenn nicht, dann muss es eine Meldung geben...
Kann ich denn ein Feld als Wert übergeben?
Und wenn, wie?
-
Do musst je erst einmal an den Feldinhalt ran kommen.
So wie du das definiert hast, ist das eine Variable; und die ist in deinem Fall immer leer.
Guck dir mal in der designer Hilfe die NotesDocument und die NotesItem Klasse an.
Dim doc As NotesDocument
'...set value of doc...
Dim item As NotesItem
Set item = doc.GetFirstItem( "Kurzbeschreibung" )
If ( item Is Nothing ) Then
testen = "1"
Else
testen = "0"
End If
eknori
-
Willst Du prüfen, ob das Item vorhanden ist oder ob das Item einen Wert (der auch Leer sein kann) hat ?
Meff
-
Oh Hilfe!
Hört sich das kompliziert an...
@Meff
ich habe eine Maske und will vorm Spiechern überprüfen, ob das Feld gefüllt ist, oder nicht.
Und wenn nicht, dann soll er sich melden und nicht speichern...
Habe da aber jetzt was anderes gefunden... @return...
Nochmals vielen Dank!
-
Hi Marion!
Du bist warscheinlich von der Formel gewohnt, dass du Felder einfach nur mit dem Namen ansprichst, also zB "Kurzbeschreibung". Beim Script funktioniert das aber anders. Hier brauchst du eine Funktion, um den beliebigen Feldwert auzulesen. In deinem Fall:
Function testen As Integer
Dim ws As New NotesUIWorkspace
Dim uidoc As NotesUIDocument
Set uidoc = ws.CurrentDocument
If uidoc.FieldGetText("Kurzbeschreibung") = "" Then
testen = 1
Else
testen=0
End If
End Function
In den ersten drei Zeilen wird also zuerst ein Objekt erzeugt (uidoc), dies repräsentiert dein gerade geöffnetes (Frontend-)dokument. Mit der Funktion FieldGetText wird anschließend der Wert von Kurzbeschreibung abgefragt.
Alles klar?
lg
Manuel
-
für Validierungen gibt es 2 Wege:
1. Über die Feld-"Validierung"
Formel ins Feld bei Validierung:
@if(Feld="";@failure("HALT, IST SICH LEER");@success)
Bricht beim Speicherversuch mit dieser Meldung ab aber (und das ist der Nachteil) bei jedem Rekalkulieren des Dokumentes. Wenn Du also die Maske auf "autom. berechnen" hast und 100 Felder mit 100 Validierungsformeln hast, dann...*rofl* Deine User werden gemeinsam in Dein Büro stürmen....*malt sich das Horrorszenario bildlich aus*
2. Weg: ins QuerySave Event der Maske diese "Formel":
Dim workspace As New NotesUIWorkspace
Dim uidoc As NotesUIDocument
Dim Feld As String
Dim Feld2 as String
Set uidoc = workspace.CurrentDocument
Feld = uidoc.FieldGetText( "Name_Des_Feldes" )
if Feld = "" Then
msgbox "HAALT, FELD IST LEER"
continue = false
exit sub
end if
Feld2 = uidoc.FieldGetText( "Name_Des_Nächsten_Feldes" )
if Feld2 = "" Then
msgbox "HAALT, FELD2 IST LEER"
continue = false
exit sub
end if
etc...
das continue=false unterbindet den Speichervorgang und per msgbox bringt man dem User eine Fehlermeldung. Durch das Exit Sub wird, auch wenn weitere Fehler entdeckt würden, der User häppchenweise mit der Nase auf seine Fehler gestoßen.
Nervt gut und erzieht gut :D
-
Wenn es wirklich nur darum geht, ob ein Feld beim Abspeichern leer ist oder nicht, dann ist eine @Formula hier einfacher, besser, schneller:
In der Eingabevalidierung des Feldes einfach folgende Formel eingeben:
@if( Kurzbeschreibung="";@failure("Sie haben keine Kurzbeschreibung angegeben");@Success)
Das wäre alles, und es setzt auch noch den Cursor in das Feld, um den Fehler direkt zu berichtigen.
Wenn da natürlich irgendwelche verqueren Zusatzbedingungen dranhängen (ich hatte mal einen Fall, da musste mit Script gearbeitet werden, um die Liste in einem Feld Item für Item abzuklappern, es ging einfach nicht mit @Formula), dann wird das ganze bitterböse kompliziert.
-
Hallo bienmaja,
Schreibe Doch einfach bei der Eingabevaledierung des Feldes die Formel hinein:
@If(Feldname != ""; @Success; @Failure("Bitte geben Sie einen Wert ein"))
Gruss
Bubble ;)
-
@all
Danke für eure Vorschläg! :D :-*
Mittlerweile habe ich es sogar hinbekommen, wie eben schon geschrieben, mit dem @return...
Das sieht dann bei mir folgendermaßen aus:
@If(Kurzbeschreibung =""; @Return(@Prompt([OK]; "Achtung!"; "Bitte eine Kurzbeschreibung eingeben!"));NULL);
Mittlerweile steht die Formel oben bei mir am Anfang der Aktion Speichern und es klappt!
Aber ich muss schon sagen, das mit dem Script muss ich mir wohl noch mal genauer anschauen... Genauso wie viele andere Sachen, die mit Domino und Notes zusammen hängen... Steh halt noch am Anfang!
@Rob_Green,@Treczoks,@bubble
Das mit der Eingabevalidierung hatte ich schon, nur dass das mehrere Felder sind, die ich zu überprüfen habe. Und wenn ich dann mal nicht in der Reihenfolge der Felder vorgegangen bin, dann hat er sofort gemeckert... war etwas nervig... Daher habe ich einen anderen Weg gesucht...
-
jetzt bin ich mal ein fieser User und drücke nicht auf - muss wohl einer sein - diesen Speicherbutton, sondern ESC und sage in der Nachfragebox, daß ich Speichern will. Was dann?
-
@Rob_Green
Tja, dann wirst du auch freundlich drauf hingewiesen, dass du doch bitte die Felder ausfüllst... :-)
Aber Danke für den Hinweis. Da hätte ich jetzt erstmal nicht dran gedacht, dass auch noch in den Querysave aufzunehmen...
Gibt's sonst noch irgendwelche Tips?
-
Hätte da noch eine Frage:
Habe eine Aktion, und die soll nicht angezeigt werden, wenn es ein neues Dokument ist, oder wenn man nicht die Rolle des DVAdmin hat.
Das mit dem neuen Dokument ist ansich kein Problem, nehme da @isnewdoc. Das klappt auch.
Nur wenn ich die DVAdmin-Rolle überprüfen will mit >> !@Unique("[DVAdmin]")<< , dann wird die Aktion nie angezeigt...
Was mache ich hier schon wieder falsch?
-
ach ja, und die Rolle ist mein! :-)
Sprich, ich habe in der ACL diese Rolle zugeordnet...
-
Probiere es folgendermaßen. Die Aktion wird versteckt, wenn der User die Rolle DVAdmin NICHT besitzt (deswegen das Ausrufezeichen am Anfang, mit dem der Wert ins Gegenteil umgekehrt wird).
!@IsMember("[DVAdmin]"; @UserRoles)
@UserRoles gibt eine Liste der Rollen eines Users zurück. Mit @IsMember kann man prüfen, ob ein String ein Element der Liste ist.
-
Wie ich gerade draufgekommen bin, kann man es auch mit der Funktion @IsNotMember machen. Hier braucht man dann natürlich das Ausrufezeichen am Anfang nicht mehr, weil sowieso abgefragt wird, ob der Wert nicht enthalten ist.
@IsNotMember("[DVAdmin]"; @UserRoles)
-
Wunderbar! Das funktioniert jetzt auch!
Heißesten Danke! :-) :-*