Das Notes Forum
Domino 9 und frühere Versionen => ND7: Entwicklung => Thema gestartet von: Demian am 02.03.12 - 11:44:06
-
Moin,moin zusammen,
bei Datumsfeldern wird seitens Notes beim Verlassen des Feldes ja geprüft, ob es sich um eine gültige Datumeingabe handelt. Wird ein ungültiges Datum eingegeben, erscheint beim Verlassen des Feldes der Hinweis "Uhrzeit oder Datum kann nicht interpretiert werden."
Gibt es eine Möglichkeit diese Meldung manuell auszulösen? Ich hatte jetzt das Problem, dass jemand als Datum den 29.02.13 eingegeben, aber direkt speichern gedrückt hat ohne das Feld zu verlassen, natürlich hats geknallt, weil ich in meiner Routine auch nur prüfe ob überhaupt was eingegegen war :o
Ansonsten würde ich halt noch ein IsDate einbauen, wobei es mir besser gefallen würde, wenn hier die "Noteseigene" Prüfung ziehen würde.
Gruß
Demian
-
Wenn das ein Datumsfeld ist, dann kannst Du doch gar nicht speichern, wenn dort "29.2.2013" eingetragen ist ...
Was hast Du da genau gedreht?
Bernhard
-
Interessant, hab jetzt mal ein einer leeren DB ne Maske mit Datumsfeld erstellt. Wenn ich hier den 29.2.13 eingebe und speichern drücke kommt die Meldung auch direkt.
In der betroffenen DB habe ich für die entsprechende Maske jedoch eine Lib für die Maske die die verschiedenen Maskenereignisse ausführt. Hier wird das Querysave ausgeführt, bevor die Meldung mit "Uhrzeit oder Datum kann nicht interpretiert werden." kommt.
Also muss ich dann doch in meinem Querysave mit IsDate arbeiten und ne eigene Meldung einbauen.
-
Kann es sein, dass Du in der Lib das Dokument im Backend speicherst?
-
Nein, gespeichert wird das Dokument nicht separat. Hier mal mein Querysave aus der Lib:
Function Car_Querysave(source As NotesUIDocument) As Boolean
'*********************************************************************************************************************************
'save the field values of the current document again to compare them in the _Postsave with values which were saved in
'the _Postopen of this library
'*********************************************************************************************************************************
'Parameters: source = current Car
'*********************************************************************************************************************************
On Error Goto ErrHandle
'*********************************************************************************************************************************
Const EventName = "Car_Querysave" 'for reports
'*********************************************************************************************************************************
'Declarations
'*********************************************************************************************************************************
'verify user input
If Car_VerifyInput(source) = False Then
Call ReportWriteWarning (EventName & " - Felder nicht korrekt ausgefüllt")
'RETURN
Car_QuerySave = False
Exit Function
End If 'Car_VerifyInput(source) = False
Call ReportWrite (EventName & " - Felder korrekt ausgefüllt")
If boolNewSTDoc = False Then
'save new field values for comparing with old field values in the postsave
strCA_ManufacturerNEW = Cstr(source.Document.CarManufacturer(0))
strCA_TypeNEW = Cstr(source.Document.CarType(0))
strCA_VehicleRegistrationNEW = Cstr(source.Document.CarVehicleRegistration(0))
strCA_FineDustBadgeNEW = Cstr(source.Document.CarFineDustBadge(0))
strCA_EmissionInspectionNEW = Cstr(source.Document.CarNextGeneralEmissionInspection(0))
strCA_BGInspectionNEW = Cstr(source.Document.CarNextBGInspection(0))
strCA_PurchaseCharacterNEW = Cstr(source.Document.CarPurchaseCharacter(0))
strCA_ConstructionYearNEW = Cstr(source.Document.CarConstructionYear(0))
strCA_PurchasePriceNEW = Cstr(source.Document.CarPurchasePrice(0))
strCA_LeasingCompanyNEW = Cstr(source.Document.CarLeasingCompany(0))
strCA_ServiceNetNEW = Cstr(source.Document.CarServiceNet(0))
strCA_LeasingNetNEW = Cstr(source.Document.CarLeasingNet(0))
strCA_LeasingThirdNEW = Cstr(source.Document.CarLeasingThird(0))
strCA_TotalGrossNEW = Cstr(source.Document.CarTotalGross(0))
strCA_LeasingEndNEW = Cstr(source.Document.CarLeasingEnd(0))
strCA_DepartmentNEW = Cstr(source.Document.CarDepartment(0))
strCA_CostCenterNEW = Cstr(source.Document.CarCostCenter(0))
strCA_AdvertisingNEW = Cstr(source.Document.CarAdvertising(0))
strCA_LocationNEW = Cstr(source.Document.CarLocation(0))
strCA_RadioNEW = Cstr(source.Document.CarRadio(0))
strCA_ReservationAbleNEW = Cstr(source.Document.CarReservationAble(0))
strCA_FixedEmployeeNEW = Cstr(source.Document.CarFixedEmployee(0))
strCA_MailInfoNEW = Cstr(source.Document.CarMailInfo(0))
Call ReportWrite (EventName & " - Vergleichswerte wurden ausgelesen")
Else
Call ReportWrite (EventName & " - neues Dokument, speichern der Vergleichswerte nicht erforderlich")
End If 'boolNewSTDoc = True
'RETURN
Car_Querysave = True
Leave:
Exit Function
ErrHandle:
Call ReportWriteError(EventName & " - Error" & Str(Err) & ": " & Error$ & " in Zeile " & Erl)
Msgbox "Error" & Str(Err) & ": " & Error$ & " in Zeile " & Erl
'RETURN
Car_Querysave = False
Resume Leave
End Function
In Car_VerifyInput werden nur die relevanten Felder insofern geprüft, ob überhaupt etwas eingetragen ist:
If Trim ( source.FieldGetText ( "CarNextBGInspection" ) ) = "" Then
Msgbox "Der Termin für die nächste Bg Prüfung wurde nicht angegeben!",,"DORNHÖFER GmbH"
Call ReportWriteWarning (EventName & " - CarNextBGInspection nicht ausgefüllt")
'RETURN
Car_VerifyInput = False
Exit Function
End If 'Trim(source.FieldGetText("CarNextBGInspection")) = ""
Die Abfrage läfut er normal durch. Laut Debugger enthält die Eigenschaft Text zu dem Zeitpunkt den Wert "ERROR:". Knallen tuts dann im Querysave in der Zeile:
strCA_BGInspectionNEW = Cstr(source.Document.CarNextBGInspection(0))
Was ja auch klar ist da value nichts enthält.
Nur warum wird die Meldung unterdrückt? Zum Zeitpunkt der Funktion Car_VerifyInput hats Notes ja schon festgestellt, dass es ein ungültiges Datum ist (Text = "ERROR:").
-
Ich denke, hiermit hebelst Du es aus:
If Trim ( source.FieldGetText ( "CarNextBGInspection" ) ) = "" Then
Du holst Dir aus dem uidoc den Text des falsch gefüllten Datum-Feldes, und da könnte zu dem Zeitpunkt problemlos "otto" drin stehen.
Das läuft im Querysave vermutlich vor der noteseigenen Überprüfung (reine Vermutung, müsste getestet werden).
Was passiert, wenn Du vorher F9 drückst? Falls dann eine Fehlermeldung erscheint, könntest Du vor der Routine ein uidoc.Refresh einbauen.
Was wird als Feldinhalt geliefert, wenn Du es aus dem Backend liest?
If Cstr (source.Document.CarNextBGInspection (0)) <> "" Then
Wenn im Debugger schon ERROR steht, sind die Chancen nicht schlecht, es darüber abzufangen.
Ansonsten ist eine Prüfung mit IsDate auch nicht verkehrt. Das Verhalten erscheint mir aber wegen des source.FieldGetText logisch korrekt zu sein.
-
Wie gesagt, diese Abfrage dient ja nur dazu festzustellen, ob überhaupt etwas eingetragen ist. Ausgehebelt wird das meines Erachtens aber nur bedingt, denn Notes hat ja schon den Text in ERROR: umgewandelt zum Zeitpunkt der Abfrage. Also hat Notes ja schon gemerkt, dass etwas nicht stimmt, es wird nur die Meldung nicht angezeigt.
Bei einem F9 vor dem Speichern erscheint ordnungsgemäß die Meldung. Ein Source.Refresh vor Car_VerifyInput führt in der Tat zu der entsprechenden Meldung. Allerding läuft er dann in meine Error-Routine im Querysave.
Im Backend knallt es ja entsprechend mit der Meldung "Variant enthält keinen Container" bei strCA_BGInspectionNEW = Cstr(source.Document.CarNextBGInspection(0)). So kam das Ganze erst hoch.
Also werd ich das Ganze bei Datumsfeldern jetzt um IsDate ergänzen:
If Trim ( source.FieldGetText ( "CarNextBGInspection" ) ) = "" Then
Msgbox "Der Termin für die nächste Bg Prüfung wurde nicht angegeben!",,"DORNHÖFER GmbH"
Call ReportWriteWarning (EventName & " - CarNextBGInspection nicht ausgefüllt")
'RETURN
Car_VerifyInput = False
Exit Function
Else
If Not (Isdate(source.FieldGetText ( "CarNextBGInspection" ))) Then
Msgbox "Die Datumsangabe ist ungültig!",,"DORNHÖFER GmbH"
Call ReportWriteWarning (EventName & " - CarNextBGInspection enthält ungültiges Datum")
'RETURN
Car_VerifyInput = False
Exit Function
End If 'Not (Isdate(source.FieldGetText ( "CarNextBGInspection" )))
End If 'Trim(source.FieldGetText("CarNextBGInspection")) = ""
Da hab ich mir nie Gedanken zu gemacht, weil ich halt immer dachte Notes macht das schon :-) Was es ja auch tut, wenn der Benutzer das Feld verlässt vor dem Speichern ;D
-
Du könntest im Querysave auch in ein anderes Feld springen (uidoc.EditGotoField oder so ähnlich), wenn das aktuelle Feld ein Datumsfeld oder ein anderes, besonders zu berücksichtigendes ist.
Damit würdest Du Dir die doppelte Überprüfung sparen.
-
Du könntest im Querysave auch in ein anderes Feld springen (uidoc.EditGotoField oder so ähnlich), wenn das aktuelle Feld ein Datumsfeld oder ein anderes, besonders zu berücksichtigendes ist.
Das "Blöde" ist nur, dass ich das dann komplett im Querysave abhandeln muss, wenn es eben eine ungültige Angabe ist. Ein Source.Refresh führte ja auch direkt zum ErrHandle. Dann müsste ich den so entstehenden Fehler (4412 glaub ich) separat abfangen. Dann belass ich es lieber bei IsDate in VerifyInput, das ist für mich übersichtlicher, von der Logik her.
-
Wenn Du im Kampf Backend versus Frontend solche Checks machen musst: Prüfe fragliche (Frontend-)Felder zuallererst mit Isarray ab. Dann erst Isdate oder auch Isnumeric - wenn das Frontend schon streikt, hast Du im Backend kein gültiges Item.
HTH,
Bernhard
-
Das mit dem Kampf haste schön formuliert ;D
Mit IsArray ist natürlich auch ein guter Ansatz, den ich dann noch umsetzen werde. Überlege schon länger wie ich die Feldprüfungen in eine einzige Sub auslagere, das Problem sind nur die Hinweistexte, in denen die "sichtbare Feldbezeichnung" angegeben ist.
Lösen ließe sich das nur, wenn man eine extra Maske mit der echten Feldbezeichnung der jeweiligen auszugebenden Bezeichnung erstellt und hier die jeweiligen Felder einpflegt. Ich finde das nur recht aufwendig, für so eine "Kleinigkeit". Mal weiter sinnieren ;)