Autor Thema: Datumsfeld auf gültige Eingabe prüfen  (Gelesen 5912 mal)

Offline Demian

  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 569
  • Geschlecht: Männlich
Datumsfeld auf gültige Eingabe prüfen
« 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
Gruß
Demian

Offline koehlerbv

  • Moderator
  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 20.460
  • Geschlecht: Männlich
Re: Datumsfeld auf gültige Eingabe prüfen
« Antwort #1 am: 02.03.12 - 14:26:36 »
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

Offline Demian

  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 569
  • Geschlecht: Männlich
Re: Datumsfeld auf gültige Eingabe prüfen
« Antwort #2 am: 05.03.12 - 08:31:38 »
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. 
Gruß
Demian

Offline Peter Klett

  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 2.713
  • Geschlecht: Männlich
Re: Datumsfeld auf gültige Eingabe prüfen
« Antwort #3 am: 05.03.12 - 09:14:12 »
Kann es sein, dass Du in der Lib das Dokument im Backend speicherst?

Offline Demian

  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 569
  • Geschlecht: Männlich
Re: Datumsfeld auf gültige Eingabe prüfen
« Antwort #4 am: 05.03.12 - 11:14:18 »
Nein, gespeichert wird das Dokument nicht separat. Hier mal mein Querysave aus der Lib:

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

Zitat
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:").
Gruß
Demian

Offline Peter Klett

  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 2.713
  • Geschlecht: Männlich
Re: Datumsfeld auf gültige Eingabe prüfen
« Antwort #5 am: 05.03.12 - 11:29:12 »
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.

Offline Demian

  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 569
  • Geschlecht: Männlich
Re: Datumsfeld auf gültige Eingabe prüfen
« Antwort #6 am: 05.03.12 - 12:04:09 »
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:

Zitat
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

Gruß
Demian

Offline Peter Klett

  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 2.713
  • Geschlecht: Männlich
Re: Datumsfeld auf gültige Eingabe prüfen
« Antwort #7 am: 05.03.12 - 12:11:47 »
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.

Offline Demian

  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 569
  • Geschlecht: Männlich
Re: Datumsfeld auf gültige Eingabe prüfen
« Antwort #8 am: 05.03.12 - 13:15:53 »
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.
Gruß
Demian

Offline koehlerbv

  • Moderator
  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 20.460
  • Geschlecht: Männlich
Re: Datumsfeld auf gültige Eingabe prüfen
« Antwort #9 am: 05.03.12 - 23:32:09 »
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

Offline Demian

  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 569
  • Geschlecht: Männlich
Re: Datumsfeld auf gültige Eingabe prüfen
« Antwort #10 am: 06.03.12 - 10:37:12 »
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  ;)


Gruß
Demian

 

Impressum Atnotes.de  -  Powered by Syslords Solutions  -  Datenschutz