Juni 30, 2022, 21:48:10

Neuigkeiten:

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


Suchabfrage zu Mehrfacheinträgen bei einem Datensatz

Begonnen von isis361, März 15, 2022, 19:42:43

⏪ vorheriges - nächstes ⏩

isis361


DF6GL

Hallo,

habe die Db an vielen Stellen auf Vordermann gebracht.  Die Makros zur Formularnavigation sind geblieben. Die sollten aber besser in VBA-Code konvertiert werden.



Änderungen

-am Code , speziell der Filterungen und NULL-Zuweisung an die Suchfelder.
-an Abfrage  , Formular-Verweise entfernt.
-an Beziehungen, PK in tblMitarbeiterDaten geändert, Beziehungen zu tblKennzeichen angepasst.
-Leerzeichen aus Feldnamen entfernt.
-Datentyp für "ErfasstAm" auf Datum/Uhrzeit geändert.
-FK-Schlüsselnamen an entspr. PKs angepasst.
-Suchfunktion (Filter) nur für Werk (Arbeitsplatz) eingebaut. Warum heißt "Werk" auch "Arbeitsplatz" ?
 Die restliche Filter kannst Du selbst versuchen, nach diesem Muster einzubauen.

- tblParkplatzNr fehlt

isis361

Vielen Dank Franz!

Ich werde mir das in den nächsten Tagen in Ruhe anschauen und dann weiter daran arbeiten!

Viele Grüße
Simone

isis361

Hallo Franz,

hatte nun endlich Zeit weiter daran zu arbeiten.

-am Code , speziell der Filterungen und NULL-Zuweisung an die Suchfelder.
Vielen Dank, das hat mir sehr weiter geholfen.

-an Abfrage  , Formular-Verweise entfernt.
Die Abfragen werde ich vermutlich gar nicht benötigen wie ich das derzeit sehe.

-an Beziehungen, PK in tblMitarbeiterDaten geändert, Beziehungen zu tblKennzeichen angepasst.
Langsam werde ich mit den Abkürzungen für die PK warm :-) und bei der Verknüpfung hab ich wohl einen Denkfehler gehabt.

-Leerzeichen aus Feldnamen entfernt.
Stimmt da waren noch 2 drin die ich dann auch gesehen habe.

-Datentyp für "ErfasstAm" auf Datum/Uhrzeit geändert.
Bin ich noch nicht sicher wie das mit der Eingabe letztendlich laufen wird da auch viele Datierungen gar nicht mehr auf ein Datum festgelegt werden können. Darüber muss ich noch nachdenken wenn wir die eingeben und sich herausstellt was Sinn macht.

-FK-Schlüsselnamen an entspr. PKs angepasst.
Vielen Dank!

-Suchfunktion (Filter) nur für Werk (Arbeitsplatz) eingebaut. Warum heißt "Werk" auch "Arbeitsplatz" ?
 Die restliche Filter kannst Du selbst versuchen, nach diesem Muster einzubauen.
Sehr schön, das hat mir sehr weitergeholfen und ich habe die Anderen jetzt auch am Laufen. Gute Frage, hab den Titel jetzt angepasst. Meistens sprechen wir von Werk auch wenn es eigentlich der Arbeitsplatz in dem Werk wäre.

- tblParkplatzNr fehlt
Ich denke nicht das die erforderlich ist. Nur wenige Mitarbeiter haben einen zugewiesenen Parkplatz und einige eine Parkscheibe mit einer Nummer. Das sind dann Mitarbeiter bezogene Daten daher würde ich die eher im Datensatz selbst belassen.

Makros hab ich inzwischen auch in VBA gewandelt, auch wenn ich da noch nicht ganz zufrieden mit bin.

Derzeit hänge ich allerdings an der passenden VBA zum öffnen des Eingabeformulares für die Mitarbeiterdaten.

Kann ich die Frage dazu hier stellen oder sollte ich einen neuen Beitrag in Formulare öffnen?
Problem
Ich möchte, wenn ich auf der Auswahlseite Datensatz erstellen wähle, dass sich das Eingabeformular mit einem neuen Datensatz öffnet.
Sie dürfen in diesem Board keine Dateianhänge sehen.
Programmierung hinter dem Button
Private Sub btnDatensuche_Click()
DoCmd.OpenForm "frmabfMADatenundKennz"
End Sub

Wenn ich aber vom Suchformular über die Auswahl auf den Mitarbeiterdaten gehe möchte ich das genau dieser Datensatz geöffnet wird.
Sie dürfen in diesem Board keine Dateianhänge sehen.
Programmierung
Private Sub Nachname_Click()
DoCmd.OpenForm _
FormName:="frmMitarbeiterdatenEingabe", _
WhereCondition:="PersonalNummer = " & Me!PersonalNummer
End Sub

Sie dürfen in diesem Board keine Dateianhänge sehen.
Bei dem Eingabeformular möchte ich, dass wenn ein neuer Datensatz geöffnet es verschiedene Vorgaben gibt die bereits eingetragen sind. Eine Bearbeitung soll erst möglich sein wenn der Button Datensatz bearbeiten gewählt wird. Es soll bewusst gespeichert werden und nicht einfach in die Tabelle geschrieben werden.

Ich habe da jetzt einiges an VBA, jedoch ist das noch nicht ganz so funktionsfähig wie es sein sollte. Dafür fehlt mir einfach die Erfahrung um das wirklich alles so ans Laufen zu bekommen.
Derzeit sieht die Programmierung so aus:
Option Compare Database
Option Explicit
Private bolsichern As Boolean


Private Sub btnDatensatzbearbeiten_Click()
Me.AllowEdits = True

End Sub

Private Sub btnDatensatzspeichern_Click()
If MsgBox("Wirklich speichern?", vbYesNo) = vbYes Then
bolsichern = True
DoCmd.RunCommand acCmdSaveRecord
End If
End Sub

Private Sub btnErsterDatensatz_Click()
DoCmd.GoToRecord , , acFirst
End Sub



Private Sub btnLetzterDatensatz_Click()
DoCmd.GoToRecord , , acLast

End Sub

Private Sub btnnächsterDatensatz_Click()
DoCmd.GoToRecord , , acNext

End Sub

Private Sub btnNeuerDatensatz_Click()
DoCmd.GoToRecord , , acNewRec
End Sub

Private Sub btnvorherigerDatensatz_Click()
DoCmd.GoToRecord , , acPrevious
If Me.CurrentRecord = 1 Then MsgBox "Erster Datensatz erreicht"
End Sub

Private Sub btnWechselSuchen_Click()
DoCmd.BrowseTo acBrowseToForm, "frmabfMADatenundKennz"
End Sub

Private Sub btnzurückAuswahl_Click()
DoCmd.BrowseTo acBrowseToForm, "frmAuswahlmenü"
End Sub

Private Sub Form_AfterUpdate()
bolsichern = False
End Sub


Private Sub Form_Current()
Me.AllowEdits = False
End Sub


Private Sub Form_Open(Cancel As Integer)
If Me.NewRecord Then
DoCmd.GoToRecord , , acNewRec
Me!IDPM_f = Me!IDPM_f.ItemData(1)
Me!IDFS_f = Me!IDFS_f.ItemData(2)
Me!IDGP_f = Me!IDGP_f.ItemData(9)
Me!IDEP_f = Me!IDEP_f.ItemData(7)
Else
DoCmd.OpenForm _
FormName:="frmMitarbeiterdatenEingabe", _
WhereCondition:="PersonalNummer = " & Me!PersonalNummer
End If
End Sub

Wobei if/else garantiert nicht laufen kann. Da bin ich jetzt echt hängen geblieben.

Mag mir nochmal jemand helfen?

Vielen Dank!

DF6GL

Hallo,

es wäre besser, die aktuelle DB hier hochzuladen (komprimiert/repariert und gezippt) und daran an Hand der genauen Formular- und Steuerelementnamen zu erklären, was wann und wo passieren soll.



isis361

Hallo Franz,

ok, ich hätte sie gestern gleich einstellen sollen. Hatte ich noch überlegt.

Das Absprünge vom Formular Auswahlmenü laufen so wie ich es mir vorstelle.

Suchfunktionen laufen auch alle. Hier wäre es lediglich schön, wenn man die Textfelder und Dropdownfelder bei der Suche aufeinander aufbauen lassen könnte. Bei den Dropdownfeldern funktioniert das, nicht jedoch in Kombi mit den Textfeldern.
Außerdem muss ich noch an dem Format für das PDF arbeiten und es soll auch einen Export der gefilterten Daten in Excel geben. Damit werde ich mich befassen wenn ich den Rest im Griff habe.

Mein Problemkind ist derzeit das Eingabeformular.
Es wird der Musterdatensatz geöffnet.
Die Daten sind nicht zu bearbeiten.
Der Wechsel zur Suchfunktion und zum Auswahlmenü klappt.
Daten löschen und Eingabe abbrechen funktionieren.
Datensatz bearbeiten funktioniert auch.
Die Punkte Neuen Datensatz anlegen, Datensatz bearbeiten und Speichern laufen jedoch noch nicht sauber.
Zwischendurch hat das Speichern jedoch schon perfekt funktioniert, bei einer der Erweiterungen habe ich dann aber irgendwo einen Wurm eingebaut den ich leider selbst nicht finde.
Bei Neuem Datensatz anlegen gibt er zwar die Vorgaben aus, die ich ihm gegeben habe, jedoch kann man im Ufo die Kennzeichen nicht mehr eingeben, das Feld fehlt. Dieses gilt auch wenn man auf Datensatz bearbeiten geht. Da kann man nur die Kennzeichen bearbeiten, die da sind, jedoch keine weiteren eingeben.
In der Tabelle hatte ich diverse leere Datensätze stehen, wann er die gespeichert hab weiß ich nicht. Im Suchformular werden die neuen Datensätze nicht angezeigt.

Die Datensatz Navigation gibt zwar die Meldung aus erster und letzter Datensatz aber wenn man dann versehentlich doch noch einen Datensatz weiter klickt bekommt man den Laufzeitfehler 2105 Sie können nicht zum angegebenen Datensatz springen. Ist aber nicht tragisch und ich überlege eh noch diese Button wieder zu löschen.

Ich bin sicher, jemand der sich da auskennt findet meine Fehler sehr schnell. Mir mangelt es einfach an Erfahrung und Übung. Allerdings ist mein Interesse geweckt und ich werde mich mit diesem Thema sicher noch intensiver befassen.

Viele Grüße und vielen Dank
Simone

DF6GL

Hallo,

Tipp:

Wirf zunächst alle Ereignisprozeduren weg, die mit "speichern" zu tun haben.

Schreibe in JEDEN Modulkopf "Option Explicit" hinzu.

Setze die Eigenschaft "Bearbeitungen zulassen" in allen Formularen auf "Ja".

Vermeide "DoCmd.SetWarnings False" und behandle Fehler-/Hinweismeldungen mit einem Errorhandler-Codeblock.  (On Error Goto MyErr, ...) 

Vermeide grundsätzlich "Bearbeiten" und "Speichern" im Unterformularen.  Einstellung von "AllowEdits" im HFO reicht völlig. Diese Eigenschaft sollte nicht im Form-Current-Ereignis gesetzt werden.

Soll heißen, erstelle die Forms ohne die Ablaufsteuerungen und teste dann, ob die Daten richtig verarbeitet werden (anhand der Logik aus den Beziehungen.) Wenn das der Fall ist, kann man sich an Gimmicks machen. Beachte aber, dass beim Wechsel in das UFO schon der HFO-DS automatisch gespeichert wird.

Vermeide Access-interne Makros. z. B. "DoCmd.RunCommand acCmdUndo"  und benutze stattdessen "Me.Undo", evtl. mehrmals hintereinander; oder z. B Me.Dirty= False"  anstelle der Runcommand-Konstanten zum Speichern.

Wirf Format-Angaben und Standardwerte aus den Tabellen.  Nutze stattdessen die Eigenschaften im Formular. 


Zitatdie Meldung aus erster und letzter Datensatz
brauchst Du nicht löschen, Fang den Zustand (Fehlermeldung, bzw. Hinweis) mit einem Errorhandler ab und reagiere entspr.

Z. B.:

Private Sub btnnächsterDatensatz_Click()

On Error GoTo MyErr

If Me.CurrentRecord < Me.Recordset.RecordCount Then
  DoCmd.GoToRecord , , acNext
End If

Exit_Sub:
Exit Sub

MyErr:

If Err.Number = 2105 Then

'MsgBox Err.Description
 Resume Exit_Sub
End If

End Sub

isis361

Hallo Franz,

ich hab dann mal versucht meine Hausaufgaben zu machen. :-)


Wirf zunächst alle Ereignisprozeduren weg, die mit "speichern" zu tun haben.
Gemacht, alles noch einmal ganz von Vorne angefangen, nicht nur speichern. Festigt den Umgang und ist gut zur Übung und dem Verstehen.


Schreibe in JEDEN Modulkopf "Option Explicit" hinzu.
-Erledigt.

Setze die Eigenschaft "Bearbeitungen zulassen" in allen Formularen auf "Ja".
-Auch gemacht.

Vermeide "DoCmd.SetWarnings False" und behandle Fehler-/Hinweismeldungen mit einem Errorhandler-Codeblock.  (On Error Goto MyErr, ...)
-Hab ich umgeschrieben, etwas anders wie Dein Vorschlag, mit dieser MyErr Variante werde ich noch nicht warm.


Vermeide grundsätzlich "Bearbeiten" und "Speichern" im Unterformularen.  Einstellung von "AllowEdits" im HFO reicht völlig. Diese Eigenschaft sollte nicht im Form-Current-Ereignis gesetzt werden.
-Ich habe die Funktionen im UFO gelöscht und von Current auf Form_Load gesetzt oder sollte es besser unter Form_Open stehen oder wo ist das am sinnvollsten?


Soll heißen, erstelle die Forms ohne die Ablaufsteuerungen und teste dann, ob die Daten richtig verarbeitet werden (anhand der Logik aus den Beziehungen.) Wenn das der Fall ist, kann man sich an Gimmicks machen. Beachte aber, dass beim Wechsel in das UFO schon der HFO-DS automatisch gespeichert wird.
-Genau dieses Speichern beim Wechsel bereitet mir noch Probleme mit dem Me.Undo bei Änderungen nicht speichern. Wobei im Normalfall nach dem Anlegen des Datensatzes entweder das Kennzeichen oder die Mitarbeiterdaten geändert werden. Nur sehr selten mal beides, dann eher alles löschen. Trotzdem sollte er bei Eingabe abbrechen auch im UFO die Angaben zurücksetzten und nicht wie derzeit nur im HF. Da muss ich noch nacharbeiten, ebenso beim Löschen, 3 Fenster zur Popup sind eindeutig zu viel.

Vermeide Access-interne Makros. z. B. "DoCmd.RunCommand acCmdUndo"  und benutze stattdessen "Me.Undo", evtl. mehrmals hintereinander; oder z. B Me.Dirty= False"  anstelle der Runcommand-Konstanten zum Speichern.
-Erledigt, scheint auch so zu laufen.


Wirf Format-Angaben und Standardwerte aus den Tabellen.  Nutze stattdessen die Eigenschaften im Formular.
-Standardwerte sind aus den Tabellen raus, hatte da probiert und vergessen die wieder zu löschen nachdem ich den richtigen Ansatz für die VBA hatte. Meinst Du mit den Format-Angaben die Eingabe des Kennzeichen? Die holt er sich tatsächlich noch aus Daten Eingabeformat der Tabelle. Da muss ich noch schauen wie ich das anders einstelle.

Hatte diese Woche wirklich Zeit mich damit zu beschäftigen. Leider hab ich nächste Wochen schon wesentlich weniger Zeit und danach 5 Wochen fast gar keine. Ich hoffe ich habe dann nicht wieder alles vergessen was ich bisher verstanden habe. Das ist sicherlich für einen Profi alles noch weit entfernt davon gut zu sein, aber für ist das erstmal ok. Hatte ja vor ein paar Wochen noch nicht mal im Ansatz Ahnung von dieser ganzen Materie...

Vielen Dank für Deine Geduld und Hilfe!!!! Wenn der Bodensee nicht so groß wäre würde ich Dir ja glatt in 4 Wochen ne XXL Tafel Schokolade vorbeibringen wenn ich auf Fototour in Schaffhausen bin.

LG
Simone