collapse

* Benutzer Info

 
 
Willkommen Gast. Bitte einloggen oder registrieren. Haben Sie Ihre Aktivierungs E-Mail übersehen?

* Wer ist Online

  • Punkt Gäste: 59
  • Punkt Versteckte: 0
  • Punkt Mitglieder: 0

Es sind keine Mitglieder online.

* Forenstatistik

  • stats Mitglieder insgesamt: 13972
  • stats Beiträge insgesamt: 66526
  • stats Themen insgesamt: 8970
  • stats Kategorien insgesamt: 5
  • stats Boards insgesamt: 17
  • stats Am meisten online: 415

Autor Thema: Zellenwert im Formularfeld begrenzen  (Gelesen 3222 mal)

Offline PhilS

  • Administrator
  • Access-Profi
  • *****
  • Beiträge: 338
    • Tipps zu Access, VBA, SQL und Co.
Re: Zellenwert im Formularfeld begrenzen
« Antwort #30 am: Januar 10, 2018, 08:30:44 »
@Phil,
wenn Constraints in der von Dir vorgestellten Weise implementiert werden, so wirken diese zwar zuverlässig, erfordern aber bei einer Verletzung der Bedingung den Neustart eines gebundenen Formulars,
Nein, keineswegs. Sobald der Wert, der die Constraint-Verletzung auslöst, in den neuen oder geänderten Datensatz korrigiert ist, kann man diesen sofort speichern.

weil das ADO Error-Objekt sich nach meiner Erfahrung nicht resetten lässt.
?
Das ADO-Error-Objekt hat mit der ganzen Sache eigentlich nichts zu tun. Es muss ADO verwendet werden, um die Check-Constraints zu erstellen, aber danach existieren diese unabhängig von einer bestimmten Zugriffstechnologie.

Davon abgesehen, ich arbeite sehr viel mit ADO (wg. SQL-Server) und dass man nach einer Constraint-Verletzung ein Formular schließen und neu Öffnen müsste, um den Datensatz erneut korrekt einzugeben, ist mir noch nie aufgefallen.

Und ohne die Dinger aufschiebbar (deferrable) machen zu können,[...] ist ihre Verwendung doch sehr stark einschränkend.
Nun, Deferrable Constraints haben zu können ist natürlich ganz allgemein von Vorteil, aber auch ohne diese finde ich sowohl konventionelle Gültigkeitsregeln als auch Check Constraints ein nützliches Werkzeug bei der Datenbankentwicklung.

Auch der hier gewünschte Fall mit Maximalmenge pro Tag lässt sich damit abbilden.
Public Sub addCheckPaletten()

    With CurrentProject.Connection
        .Execute "ALTER TABLE tblkapazität  " & _
                    " ADD CONSTRAINT chkPalettenSumme " & _
                    " CHECK (100 >= (SELECT SUM(Paletten) FROM tblkapazität  k " & _
                    "       WHERE k.KalenderTag = tblkapazität.KalenderTag));"
    End With

End Sub

@Chris777777: Du kannst den obigen Code einmalig in VBA ausführen um diese Regel in deiner DB (vielleicht erstmal in einer Kopie) zu erstellen.
Beachte aber, dass du dafür sicherstellen musst, dass immer nur "ganze Tage", ohne Uhrzeiten in KalenderTag gespeichert werden dürfen.
Siehe auch: Nur-Datum-Werte in einer Tabelle erzwingen
Neues Access 2019 Feature angekündigt: Modern Charts
 

Offline Chris777777

  • Newbie
  • Beiträge: 42
Re: Zellenwert im Formularfeld begrenzen
« Antwort #31 am: Januar 10, 2018, 10:34:15 »
Hi,
ich habe den Code im VBA eingegeben. Eine Begrenzung erfolgt jedoch nicht.
Bzgl. des Datums habe ich in der Tabelle die Gültigkeitsregel 0=Stunde([Kalendertag])+Minute([Kalendertag])+Sekunde([Kalendertag]) Oder IstNull([Kalendertag]) hinterlegt.
Gruß,
Chris
 

Offline Lachtaube

  • Access Guru
  • ****
  • Beiträge: 1245
Re: Zellenwert im Formularfeld begrenzen
« Antwort #32 am: Januar 10, 2018, 11:26:15 »
@Phil,

gerade getestet - und es funktioniert. Ich kann leider die Konstellation, die ich bei meinen schon etwas länger zurückliegenden Experimenten mit Check-Constraints gemacht habe und mich zu meiner Aussage bzgl. des Error-Objekts veranlasst haben, nicht mehr nachstellen. Wasj a auch etwas Gutes für sich hat. :)

@Chris,

Du musst den von Phil gezeigten Code in ein neues allgemeines Modul einfügen und nur ein einziges Mal ausführen. Danach kann der Code wieder gelöscht oder auskommentiert werden.

Die Gültigkeitsregel gehört in die Eigenschaft der Tabelle unter Gültigkeitsregel eingetragen. Ich würde dafür den etwas kürzeren, aber gleichwertigen Ausdruck[Kalendertag]=Fix([Kalendertag])verwenden.
Grüße von der (⌒▽⌒)
 

Offline Chris777777

  • Newbie
  • Beiträge: 42
Re: Zellenwert im Formularfeld begrenzen
« Antwort #33 am: Januar 10, 2018, 12:28:20 »
Ok super es funktioniert :)
Sobald nun eine Kapazität pro Tag von 100 überschritten wird, erscheint ein Laufzeitfehler "Sie können nicht zu dem angegebenen Datensatz springen". Kann man diese Meldung durch eine eigene ersetzen? So wie es von Lachtaube vorgeschlagen wurde (Die erlaubte Menge an Paletten darf xx nicht überschreiten)
Lässt sich in einem neuen Feld die noch verfügbare Kapazität abbilden, sodass der User erkennt, wie viele Paletten er noch eintragen darf? Auch hier ähnlich wie es bereits von Lachtaube probiert wurde?
Gruß,
Chris
 

Offline Beaker s.a.

  • Access Guru
  • ****
  • Beiträge: 1788
OT, VBA-SQL-String Tutorial
« Antwort #34 am: Januar 10, 2018, 13:48:06 »
Hallo Philipp,
Zitat
Neuer Artikel: VBA-SQL-String Tutorial
Sehr schöner Artikel für Anfänger. Was ich vermisse ist ein Hinweis auf
die Möglichkeit des Debug.Print zum Testen.
In dem Zusammenhang hatte ich Mitte letzten Jahres folgende Überlegung
angestellt. Zitat aus Schwesterforum (http://www.ms-office-forum.net/forum/showthread.php?t=344674)
Zitat
Irgendwie habe ich immer wieder das Gefühl, dass Fragesteller anscheinend Probleme mit
dem immer wieder empfohlenen Debug.Print haben. Meine Vermutung geht dahin,
dass sie das Direktfenster nicht kennen, und sich dann wundern, dass nichts passiert.
Daraus ist in Zusammenarbeit mit Josef Poetzl ein AddIn entstanden mit
dem sich eben solche Strings sehr komfortabel testen lassen; - so zu
sagen ein "aufgepimptes" Debug.Print.
Da Josef so freundlich war dieses in seine CodeLib aufzunehmen kannst
du es hier bei Interesse herunterladen
http://access-codelib.net/download/addins/SqlDebugPrint.zip
Vielleicht könnte das auch eine sinnvolle Ergänzung zu deinem Artikel sein.
gruss ekkehard
--
Beaker s.a., der lieber an seinem eigenen Projekt arbeiten würde/sollte, aber irgendwie immer gerne seinen Senf dazu gibt ;-)
S.M.I².L.E.
 
Folgende Mitglieder bedankten sich: PhilS

Offline Lachtaube

  • Access Guru
  • ****
  • Beiträge: 1245
Re: Zellenwert im Formularfeld begrenzen
« Antwort #35 am: Januar 10, 2018, 15:15:47 »
@Chris,

um eine konkretere Anzeige im Fehlerfall zu erhalten, kann im Error-Ereignis des Formulars eine Auswertung stattfinden.Option Explicit

Private Sub Form_Error(DataErr As Integer, Response As Integer)
   Select Case DataErr
      Case 3317:
         Response = acDataErrContinue
         MsgBox "Die Gesamtzahl aller Paletten je Tag darf 100 nicht " & _
                "überschreiten." & vbCr & vbCr & _
                "Datensatz kann nicht gespeichert werden." & vbCr & vbCr & _
                "Drücken Sie die <Esc>-Taste, um die Eingabe rückgängig zu" & _
                " machen oder überschreiben Sie den Paletten-Wert.", _
                vbExclamation
         Me.Paletten.SetFocus
   End Select
End Sub

Private Sub NeuerDatensatz_Click() 'statt Befehl17
   'mögliche Fehlernummern müsste man konkret untersuchen und entsprechend
   'reagieren - im Momoent bin ich zu faul dazu
   On Error Resume Next
   DoCmd.GoToRecord acDataForm, Me.Name, acNewRec
End Sub

Private Sub Form_BeforeUpdate(Cancel As Integer)
   If MsgBox("Datensatz speichern?", vbYesNo) = vbNo Then
      Cancel = True
      If MsgBox("Änderungen verwerfen", vbYesNo) = vbYes Then
         Me.Undo
      End If
   End If
End Sub
Der Kalendertag sollte zum Pflichtfeld gemacht werden und ggf. gegen Zukunftseintragungen abgesichert werden.

Bei einem neuen Datensatz wäre es dann vorteilhaft, zuerst das Datum eingeben zu müssen, damit bei einer Paletten-Eingabe auch eine Prüfung der Palettensumme überhaupt möglich ist.

Die Anzahl der möglichen Paletten kann im Prinzip dann analog meines ersten Beispiels angewendet werden (hier müsste dann zusätzlich bei Datumsänderungen der Wert neu ermittelt werden), wobei die Abfrage nach der Summe von einem Datumsparameter abhängig gemacht wird.

Wenn dann an geeigneten Stellen (Beim Anzeigen und nach Änderung des Kalendertags) die Gültigkeitsregel für Paletten gesetzt wird, kann das Form_Error auch wieder entfallen, weil die Gültigkeitsregel des Formulars greift.
Grüße von der (⌒▽⌒)
 

Offline Chris777777

  • Newbie
  • Beiträge: 42
Re: Zellenwert im Formularfeld begrenzen
« Antwort #36 am: Januar 10, 2018, 16:32:57 »
Im Error-Ereignis habe ich nun den ersten Code eingesetzt. Allerdings soll die Fehlermeldung direkt erscheinen, sobald 100 überschritten wurde. Nun erscheint sie, wenn das Formular verlassen wird.

Zudem erscheint der Laufzeitfehler 2105: Sie können nicht zum angegebenen Datensatz springen. Dies wird wahrscheinlich an dem Ausdruck
DoCmd.GoToRecord acDataForm, "frmkapazität", acNewRec
liegen, welcher beim Speichern hinterlegt wird
Der Fehler taucht nur auf, sobald die Kapazität von 100 überschritten wird. Die Begrenzung auf 100 funktioniert also. Jedoch erscheint dann halt dieser Laufzeitfehler. Liegt die Kapazität unter 100, erscheint der Laufzeitfehler nicht.

Habe die Datei nochmal angehängt.
Gruß,
Chris
     
 

Offline ebs17

  • Access-Meister
  • ***
  • Beiträge: 889
Re: Zellenwert im Formularfeld begrenzen
« Antwort #37 am: Januar 10, 2018, 17:29:15 »
Hinweis: Erste Regel sollte sein, dem Benutzer so zu helfen, dass er keine Fehler macht und somit nicht korrigiert werden muss.

Daher könnte man im Formular bei dem Textfeld zur Anzahleingabe einen Standardwert hinterlegen in der Art 100 - DSum des Tages.
Wenn der Benutzer dann noch weiß und beachtet, dass diese Vorgabe die maximal anwendbare Anzahl ist, wird er kaum noch Fehler machen. Eine sinngemäß gleiche Prüfung kann man in einer AfterUpdate-Ereignisprozedur dieses Textfeldes machen, um die Eingabe des Benutzers zu prüfen.

Der Rest (das oben genannte) ist dann nur die Absicherung.
Mit freundlichem Glück Auf!

Eberhard