Neuigkeiten:

Wenn ihr euch für eine gute Antwort bedanken möchtet, im entsprechenden Posting einfach den Knopf "sag Danke" drücken!

Mobiles Hauptmenü

Endlosformular per Loop überprüfen

Begonnen von Samurai2_de, August 22, 2016, 03:09:26

⏪ vorheriges - nächstes ⏩

Samurai2_de

Hallo ihr Wissenden!

Ein neues Projekt steht bei mir an, aufgrund dessen die anderen Datenbanken, die ich noch so "nebenbei" entwickle, hintenan stehen müssen.
Bei diesem Projekt bereitet mir ein Punkt zur Zeit Kopfzerbrechen und ich hoffe, ihr könnt mir bei der Lösung helfen:
In einem Endlosformular werden zuvor per E-Mail gesammelte Daten angezeigt. Dieses Formular gibt (verkürzt gesagt) drei Auswahlmöglichkeiten per Checkbox für den User:
Daten annehmen
Daten nicht annehmen
Korrektur erbitten.
Ich möchte nun, dass beim Klick auf eine Schaltfläche per VBA als erstes eine Überprüfung gestartet wird, ob bei jedem Datensatz zumindest eine dieser Checkboxen aktiviert ist. Befindet sich ein Datensatz in der Tabelle, bei dem nicht mindestens eine der Checkboxen aktiviert ist, soll eine MsgBox ausgegeben werden, die den Benutzer auf den Fehler hinweist.
Durch Tante Google bin ich schon darauf gekommen, dass das mit den MoveFirst bzw. MoveNext-Kommandos in Verbindung mit dem Loop-Befehl gehen muss. Leider bleibt meine Prüfung zur Zeit immer im ersten Datensatz hängen und bewegt sich nicht durch die anderen Datensätze. Eine Fehlermeldung erhalte ich nicht, ich habe aber mal testweise den zweiten Datensatz so in der Tabelle manipuliert, dass keine der Checkboxen aktiviert ist. Es müsste also die MsgBox erscheinen, was leider nicht der Fall ist, es passiert einfach gar nichts.

Mein Code lautet bislang wie folgt:
Dim rsf As Recordset
set rsf = me.RecordsetClone
rsf.movefirst
Do Until rsf.EOF
If Me!Annahme and Me!Rueckweisung and Me!Korrektur = False Then
   MsgBox "Es wurde bei zumindest einem Datensatz noch keine Entscheidung getroffen. Bitte korrigieren Sie!", vbCritical
End If
rsf.movenext
loop


Ich hoffe, ihr könnt mir helfen und wäre euch sehr dankbar für euer Fachwissen!

Mit Grüßen aus der dunklen Nacht

Samurai2_de
"Vegetarier" ist das indianische Wort für "zu doof zum jagen"!

Ein Tag ohne Lachen ist ein verschenkter Tag!

PhilS

Zitat von: Samurai2_de am August 22, 2016, 03:09:26Dim rsf As Recordset
set rsf = me.RecordsetClone
rsf.movefirst
Do Until rsf.EOF
If Me!Annahme and Me!Rueckweisung and Me!Korrektur = False Then
   MsgBox "Es wurde bei zumindest einem Datensatz noch keine Entscheidung getroffen. Bitte korrigieren Sie!", vbCritical
End If
rsf.movenext
loop
Mit Me!... beziehst du dich auf Formularfelder und zwar immer auf die des aktuellen Datensatzes. Du musst dich explizit auf die Felder des Recordset beziehen.
Beispiel:
If rsf.fields("Annahme").Value and ...
Neue Videoserie: Windows API in VBA

Klassische CommandBars visuell bearbeiten: Access DevTools CommandBar Editor

DF6GL

#2
Hallo,



Schreib mal so:

ZitatIf (rsf!Annahme and rsf!Rueckweisung and rsf!Korrektur) = False Then
'oder
If rsf!Annahme and rsf!Rueckweisung and rsf!Korrektur Then
'oder
If rsf!Annahme + rsf!Rueckweisung + rsf!Korrektur = 0 Then
'oder
If Not rsf!Annahme and not rsf!Rueckweisung and not rsf!Korrektur Then
Viele Grüße vom Bodensee
Franz, DF6GL

Hilfestellung:  http://www.access-o-mania.de/forum/index.php?topic=6969.msg118738#msg118738

Links und Tipps:
1.   http://v.hdm-stuttgart.de/~riekert/lehre/db-kelz/
1a. http://www.tinohempel.de/info/info/datenbank/normalisierung.htm
1b. https://support.office.com/de-de/article/Grundlagen-des-Datenbankentwurfs-eb2159cf-1e30-401a-8084-bd4f9c9ca1f5#bmterms
2.   http://www.donkarl.com
3.   https://web.archive.org/web/20201201233522/http://www.dbwiki.net/
4.   http://www.access-tutorial.de/
5.   http://www.tty1.net/smart-questions_de.htm
6.   http://access.joposol.com/accept

Last but not least:   < F1 > für Hilfe
;) Learning by doing not by spoon-feed ;)

Tipp: Find and Replace for Access

MzKlMu

#3
Hallo,
dann will ich auch mal.
Das ganze Vorhaben halte ich in der Form für überflüssig.

Das Datensatzgehoppse kann man sich sparen, in dem man einfach zählt.
If DCount("*","Tabellenname","Me!Annahme = False and Me!Rueckweisung = False and Me!Korrektur = False") > 0 Then
   MsgBox "...
End If

Der Code vor If und nach End If entfällt vollständig.

Aber:
Auch das Datenmodell ist zu überdenken. Die 3 Status schließen sich ja gegenseitig aus. Das heißt, es reicht ein Feld in das man eine Zahl einträgt für die 4 Zustände,
0 = Keine Entscheidung
1 = Annahme
2 = Rueckweisung
3 = Korrektur

Die 0 legt man als Standardwert fest. Die Auswahl macht man über eine Optionsgruppe.
Für die 4 Statuswerte legt man noch ein Tabelle an. Dann kann man sich über eine Abfrage für jeden Datensatz den Status im Klartext anzeigen lassen.

Das Zählen wird dann noch einfacher.
If DCount("*","Tabellenname","Status = 0") = 0 Then
   MsgBox "...
End If

Und nicht zuletzt, man könnte auch das Formular einfach filtern, dann hat man gleich die entsprechenden DS im Formular. Was auch für das bisherige Vorgehen zutrifft.
Gruß Klaus

DF6GL

#4
Hi,

eher:

If DCount("*","Tabellenname","Me!Annahme = False and Me!Rueckweisung = False and Me!Korrektur = False") > 0 Then
   MsgBox "...
End If

;)

wobei hier ein evtl. Filter des Form-Recordsets nicht berücksichtigt ist.

Viele Grüße vom Bodensee
Franz, DF6GL

Hilfestellung:  http://www.access-o-mania.de/forum/index.php?topic=6969.msg118738#msg118738

Links und Tipps:
1.   http://v.hdm-stuttgart.de/~riekert/lehre/db-kelz/
1a. http://www.tinohempel.de/info/info/datenbank/normalisierung.htm
1b. https://support.office.com/de-de/article/Grundlagen-des-Datenbankentwurfs-eb2159cf-1e30-401a-8084-bd4f9c9ca1f5#bmterms
2.   http://www.donkarl.com
3.   https://web.archive.org/web/20201201233522/http://www.dbwiki.net/
4.   http://www.access-tutorial.de/
5.   http://www.tty1.net/smart-questions_de.htm
6.   http://access.joposol.com/accept

Last but not least:   < F1 > für Hilfe
;) Learning by doing not by spoon-feed ;)

Tipp: Find and Replace for Access

Samurai2_de

Uiuiui! So viele tolle Lösungsvorschläge!
Vielen herzlichen Dank an Alle, die sich mit meinem Problemchen befasst haben. Ich werde eure Vorschläge heute Abend testen und berichten, welche Lösung ich genommen habe.

Nochmals einen herzlichen Dank an Alle, die geantwortet oder sich zumindest gedanklich mit dem Problem auseinandergesetzt haben!

Mit Gruß von der Küste

Samurai2_de
"Vegetarier" ist das indianische Wort für "zu doof zum jagen"!

Ein Tag ohne Lachen ist ein verschenkter Tag!

MzKlMu

#6
Hallo,
@Franz
Die Me! sind natürlich Unsinn in dieser Funktion. Das kommt davon, wenn man schreibfaul ist und kopiert. Danke für die Korrektur.
Zitatwobei hier ein evtl. Filter des Form-Recordsets nicht berücksichtigt ist.
Dann müssen die Kriterien das Filters auch noch in die DCount() Funktion.
Gruß Klaus

Samurai2_de

Hallo ihr Wissenden!

Ich habe heute Abend die vorgeschlagene Lösung von DF6GL ausprobiert und sie funktioniert tadellos. Ich musste nur die IF-Bedingung etwas abändern auf
If rsf!Annahme = False And rsf!Rueckweisung = False And rsf!Korrektur = False Then
   MsgBox...

Es funktioniert jetzt tadellos und die Loop-Funktion läuft wunderbar durch.

Vielen Dank daher noch einmal an Alle, die sich mit meinem Problem befasst haben!

Gruß von der Küste

Samurai2_de
"Vegetarier" ist das indianische Wort für "zu doof zum jagen"!

Ein Tag ohne Lachen ist ein verschenkter Tag!

MzKlMu

Hallo,
dass das Datenmodell zu verbessern wäre, bzw. dass Du diese 3 Felder gar nicht brauchst hast Du überlesen ?
Gruß Klaus

Samurai2_de

Moin!

Nein, dass das Datenmodell zu verbessern wäre habe ich nicht überlesen und es mir auch schon auf meine To-Do-Liste geschrieben.
Gestern ging es aber primär darum, eine erste lauffähige Version der Datenbank zusammen zu bekommen, die schon einmal in ihren Grundfunktionen präsentiert werden kann ("Chef will was sehen!"  ::) ). Da erschien mir die beschriebene Lösung die schnellste und bis dahin Beste. Ein Umbau des Datenmodells wird noch in späteren Arbeitsschritten vor dem Rollout der Datenbank erfolgen. Ist dann vielleicht wieder mehr Arbeit, doch nur so konnte ich den heutigen Termin einhalten, da noch mehr an der Datenbank zu arbeiten war und diese Arbeitsschritte höhere Priorität genossen...  ;)
Ich kann mich aber gerne auch noch einmal melden, wenn das Datenmodell umgeschrieben ist.

Gruß von der Küste und aus dem Nachtdienst

Samurai2_de
"Vegetarier" ist das indianische Wort für "zu doof zum jagen"!

Ein Tag ohne Lachen ist ein verschenkter Tag!

Samurai2_de

So, ich habe mich jetzt mal dem Problem mit der Überarbeitung des Datenmodells angenommen.
Ich habe nun eine Optionsgruppe für die drei unterschiedlichen Bearbeitungsstände angelegt und in meiner Tabelle ein neues Feld angelegt, in das die Werte der Entscheidung der Optionsgruppe geschrieben wird. Klappt auch alles ganz wunderbar. Vielen Dank auch noch einmal für diesen freundlichen Hinweis!

Mit Gruß aus dem Nachtdienst

Samurai2_de
"Vegetarier" ist das indianische Wort für "zu doof zum jagen"!

Ein Tag ohne Lachen ist ein verschenkter Tag!

Beaker s.a.

Hallo,
Und wenn's eng wird auf dem Formular ist auch eine ComboBox eine
platzsparende Alternative.
gruss ekkehard
Alles, was geschieht, geschieht. - Alles, was während seines Geschehens etwas anderes geschehen lässt, lässt etwas anderes geschehen. - Alles, was sich selbst im Zuge seines Geschehens erneut geschehen lässt, geschieht erneut. - Allerdings tut es das nicht unbedingt in chronologischer Reihenfolge.
(Douglas Adams, Mostly Harmless)