Neuigkeiten:

Ist euer Problem gelöst, dann bitte den Knopf "Thema gelöst" drücken!

Mobiles Hauptmenü

Kombinationsfeld in Tabelle per Recordset(VBA) füllen

Begonnen von JanJB99, Oktober 09, 2022, 11:55:46

⏪ vorheriges - nächstes ⏩

JanJB99

Hi zusammen,
ich habe eine Tabelle in der ich eine Spalte über die Nachschlagen-Funktion als Kombinationsfeld definiert habe.
Jetzt versuche ich über einen Code diese Spalte über ein Recordset mit Daten zu befüllen.
Meine Hoffnung war, dass ich einfach den String in das Feld schreiben kann (z.B. "1; 4; 6"), er das dann übernimmt und in der Tabellenansicht dann natürlich entsprechend nachschlägt.
Das funktioniert leider nicht.

Jetzt die Frage: Weiß jemand von Euch ob und wie man ein solches Feld befüllen kann, bzw. als was für ein Feldtyp dieses Feld in VBA gezählt wird?

Schonmal vielen Dank im vorraus!

LG Jan

Hier noch mein Code:

Private Sub btn_apply_Click()

    Dim rs As DAO.Recordset
    Dim apotheke As String
    Dim schicht As String
    Dim startdatum As Date
    Dim enddatuma As Date
    Dim strMitarbeiter As String
   
    If Nz(Me.txt_von, "") = "" Or Nz(Me.txt_bis, "") = "" Or Nz(Me.comb_apotheke, "") = "" Or Nz(Me.comb_schicht, "") = "" Or Nz(Me.list_ma.Selected(1), "") = "" Then
        MsgBox "Bitte fülle zuerst alle erforderlichen Felder aus!"
        Exit Sub
    End If
   
    result = MsgBox("Dadurch wird der Schichtplan geändert! Dieser Vorgang kann nicht Rückgängig gemacht werden! Fortfahren?", vbYesNo, "Warnung!")
    If result = vbNo Then Exit Sub
   
    apotheke = Me.comb_apotheke
    schicht = Me.comb_schicht
    startdatum = Me.txt_von
    enddatum = Me.txt_bis
   
    For Each ma In Me.list_ma.ItemsSelected
        If strMitarbeiter = "" Then
            strMitarbeiter = ma
        Else
            strMitarbeiter = strMitarbeiter & "; " & ma
        End If
    Next

    Set rs = CurrentDb.OpenRecordset("select * from TBL_Schichtplan where [Standort] ='" & apotheke & "' and [Schicht] ='" & schicht & "' and [Abgerechnet] = FALSE order by [Datum] ASC")

    Do Until rs![Datum] = startdatum
        rs.MoveNext
    Loop
   
    Do Until rs![Datum] > enddatum
        rs.Edit
        rs![Mitarbeiter] = Me.list_ma.ItemsSelected
        rs.Update
        rs.MoveNext
    Loop

    MsgBox "Done!"

End Sub

Und ein Screenshot von der Tabelle:

Sie dürfen in diesem Board keine Dateianhänge sehen.

MzKlMu

#1
Hallo,
vergiss das Nachschlagefeld. Nachschlagefelder in Tabellen sind nicht zu empfehlen. Mit Mehrfachauswahl schon mal gar nicht. Dein Vorhaben ist auch relativ kompliziert. Da aber niemand diese mehrwertfelder/Nachschlagefelder will, wirst Du wahrscheinlich kein Lösung bekommen. Prinzipiell werden in solchen Feldern auch keine Klartexte gespeichert, sondern immer nur die Schlüsselzahl.
Hier liegt eine n:m Beziehung vor mit 3 Tabellen.
- Schichtplan
- Mitarbeiter
- SchichtplanMitarbeiter

In der 3 Tabelle wird jeweils der Fremdschlaüssel zu MA und SP in je einem Datensatz gespeichert. Und diese Tabelle kannst Du dann per Recordset (besser: Anfügeabfrage) befüllen.
Hier musst Du noch mal von vorn beginnen.
Gruß Klaus

JanJB99

Hi Klaus,
erstmal Danke für Deine Antwort!

Habe schon befürchtet das Nachschlagefeldern zu den "von den Usern verdammten" Funktionen gehört, als ich dazu kaum was gefunden habe.
Allerdings finde ich diese Funktion für meinen Use-Case extrem Vorteilhaft.

Deine Erklärung mit den Tabellen verstehe ich nicht ganz.
So wie ich das sehe, habe ich n:M Beziehung zwischen TBL_Stammdaten und TBL_Schichtplan.
Aus TBL_Stammdaten können Mitarbeiter über das Nachschlagefeld in eine Schicht in der TBL_Schichtplan eingetragen werden.

Ich habe allerdings weder eine TBL "Mitarbeiter" noch eine "SchichtplanMitarbeiter".
Meinst Du damit Tabellen, die durch die Nachschlagefunktion automatisch versteckt erstellt werden?

Das mit dem Fremdschlüssel ist mir bewusst. Wenn ich in VBA das Nachschlagefeld auslese bekomme ich einen String mit "[ID]; [ID]; usw." jeweils mit der ID des ausgewählten Mitarbeiters aus der TBL_Stammdaten.
Wie bereits gesagt, kann ich aber keinen String zurück in das Nachschlagefeld schreiben.

Gibt es denn eine vergleichbar schöne Variante, um den Schichtplan per Dropdown mit Mitarbeitern zu befüllen?
Oder muss ich da ein komplett neues Konzept entwickeln?

Danke!

LG Jan

MzKlMu

Hallo,
Zitat von: undefinedIch habe allerdings weder eine TBL "Mitarbeiter" noch eine "SchichtplanMitarbeiter".
Ich kenne ja nicht Deine Struktur, daher muss ich etwas annehmen. Ich meinte auch keine versteckten Tabellen.
Zitat von: undefinedWie bereits gesagt, kann ich aber keinen String zurück in das Nachschlagefeld schreiben.
Das Feld kann auch niemals KurzerText sein.

n:m geht dann so:
- Stammdaten
- Schicht
- Schichtplan

Die 3. Tabelle beinhaltet dann die FS zum Mitarbeiter und zur Schicht. Zuordnung per Kombifeld.

Zeige mal ein Bild des beziehungsfensters so wie Du das jetzt hast.
Gruß Klaus

DF6GL

Hallo,


es stimmt, dass Nachschlagefelder in Tabellen(!)  nicht sehr transparent sind und meistenteils nur Verständnisprobleme erzeugen, was sie zu diesen ungeliebten Möglichkeiten von Access degradieren.


Trotzdem funktionieren diese Tabellen-Nachschlagefelder in Access..


Zitat von: undefinedSo wie ich das sehe, habe ich n:M Beziehung zwischen TBL_Stammdaten und TBL_Schichtplan.

Wirklich? Ich glaube eher, es handelt sich hier um eine 1:n-Beziehung.

Zitat von: undefinedWenn ich in VBA das Nachschlagefeld auslese bekomme ich einen String mit "[ID]; [ID]; usw." jeweils mit der ID des ausgewählten Mitarbeiters aus der TBL_Stammdaten.

Was ist daran falsch?


Zitat von: undefinedWie bereits gesagt, kann ich aber keinen String zurück in das Nachschlagefeld schreiben.

Wozu? Ich verstehe das nicht..  Und was soll der Code denn bewirken? Das Nachschlagefeld erhält seine Daten ("Nachname" und "Vorname") über die Abfrage in dessen Eigenschaft "Datensatzherkunft". 


Was fehlt, ist die Angabe der Spaltenbreiten. Daran könnte es liegen, das dass der Nachname nicht in das Tabellefeld "Mitarbeiter" übernommen wird (falls ich Dein Problem richtig verstanden habe).


Erkläre nochmal genauer, was Du überhaupt erreichen willst.

Allerdings gibt es noch Einiges zum Tabellenaufbau zu sagen:

Bennenne das Primärschlüsselfeld DB-weit eindeutig und nicht nur "ID" und das noch in allen Tabellen... (--> "SchichtPlanID", bzw. in Tabelle tbl_Stammdaten "StammdatenID"). "tbl_Stammdaten" ist auch nicht wirklich aussagekräftig. Stammdaten kann es ja viele verschiedene geben... Nenn die Tabelle, die Mitarbeiterdaten enthält, auch sinnvollerweise so: "tbl_Mitarbeiter".. "..Daten" kannst Du auch weglassen... dass es sich um "Daten" handelt, ist in einer "Daten"bank offensichtlich.. ;)

"Datum" als Feldname ist auch zu vermeiden, weil wie gerade eben gesagt, es nicht sehr transparent ist  (besser: "SchichtplanDatum" (darf auch abgekürzt werden--->  "SpDatum" und wichtiger noch, "Datum" ist zwar kein reserviertes Wort in eigentlichen Sinn, es kann aber schnell zu Komplikationen mit der Datum()-Funktion kommen.



"Wochentag" ist als Tabellenfeld überflüssig.  Der Wochentag kann (jederzeit und überall) aus dem Datum  berechnet werden, und berechnete Werte werden nur in Ausnahmefällen in Tabellenfelder abgelegt.

"Feiertag?" enthält ein Sonderzeichen, auf das man genauso wie auf Leerzeichen verzichten sollte.

"Schicht" ist, bzw. könnte ein Kandidat für die Auslagerung in eine zusätzliche (Stammdaten-)Tabelle sein, in die auch das Feld "Schichtlänge" eingebaut werden müsste. "Schicht"  wird dabei umbenannt in "SchichtID_f" (Datentyp: Long)  als Fremdschlüssel auf den Primärschlüs



"Mitarbeiter" ist auch in "MitarbeiterID_f" (Datentyp Long) umzubenennen. Es enthält den Primärschlüsselwert aus Tabelle "tbl_Stammdaten", bzw. "tbl_Mitarbeiter".  Anzupassen ist dabei die Datensatzherkunft des Nachschlagefeldes:
Select ID, Nachname, Vorname from tbl_Stammdaten
mit
Spaltenanzahl: 3
Spaltzenbreiten: 0cm;4cm;4cm



Alles in allem, vergiss Code für dieses Problem und vergiss auch die Tabellen-Nachschlagefelder (wie Klaus es ja schon sagte).

Nutze Formulare für die Bedienung der DB und für die Datenpflege. In Formular sind die Kombifelder bestens zu verwenden.

MzKlMu

Hallo,
der Schichtplan ist die n:m Beziehungstabelle mit zwei 1:n Beziehungen 1x zur Schicht und 1x zu den Stammdaten/Mitarbeiter.
Gruß Klaus

JanJB99

#6
Hey,
nochmal Danke für den Input!
Den einen oder anderen Tipp werde ich mir sicher behalten - allerdings aus Faulheit hier nicht mehr unbedingt ändern :P

Zitat von: DF6GL am Oktober 09, 2022, 13:24:14
Zitat von: undefinedWenn ich in VBA das Nachschlagefeld auslese bekomme ich einen String mit "[ID]; [ID]; usw." jeweils mit der ID des ausgewählten Mitarbeiters aus der TBL_Stammdaten.

Was ist daran falsch?

Daran ist gar nichts falsch. War lediglich eine Feststellung.

Zitat von: DF6GL am Oktober 09, 2022, 13:24:14
Zitat von: undefinedWie bereits gesagt, kann ich aber keinen String zurück in das Nachschlagefeld schreiben.


Wozu? Ich verstehe das nicht..  Und was soll der Code denn bewirken? Das Nachschlagefeld erhält seine Daten ("Nachname" und "Vorname") über die Abfrage in dessen Eigenschaft "Datensatzherkunft". 

Ich habe aktuell ein Formular was wie auf dem Screenshot unten aussieht.
In das UF kann man je nach Datum, Standort und Schicht die Mitarbeiter eintragen.
Für den Mitarbeiterteil nutze ich das Nachschlagefeld.
Das funktioniert soweit super und deshalb möchte ich das auch nicht mehr groß ändern.

Jetzt habe ich geplant (rechts neben dem UF) eine Eintragehilfe zu erstellen.
Es kommt ja häufiger vor, dass ein MA eine Woche jeden morgen Frühschicht am gleichen Standort hat.
Das soll über das Menü mit einem klick gemacht werden und nicht mühsam für jeden Tag eingetragen werden.
Dafür habe ich das Menü erstellt in dem man Zeitraum, Standort(Apotheke) und Schicht auswählt und dann einen oder mehrere betreffende MA.

Und jetzt kommt mein Problem:
Ich weiß nicht, wie ich die in der Liste ausgewählten MA über einen Klick auf den Button für die entsprechenden Zeilen in den Schichtplan schreiben kann.

Bis jetzt hab ich den o.g. Code dazu.

Der funktioniert auch gut - Bis auf den Teil wo ich versuche den/die MA in das Recordset einzutragen.


LG Jan

MzKlMu

Hallo,
Du musst für jeden MA dessen ID bestimmen und die wird dann (getrennt mit Komma) in das Feld eingetragen.
Mehr kann ich dazu nicht sagen. Da ich das ganze für falsch halte werden ich mir dazu auch keine Lösung überlegen.
Wenn Du das nicht änderst (in eine n:m Beziehung) wirst Du auf Dauer immer wieder Probleme bekommen.

Und zeige bitte mal ein Bild des Bezienungsfensters. Beziehungen sind ja hoffentlich angelegt.
Gruß Klaus

JanJB99

Hallo Klaus,

Zitat von: MzKlMu am Oktober 09, 2022, 14:35:50Du musst für jeden MA dessen ID bestimmen und die wird dann (getrennt mit Komma) in das Feld eingetragen.

Das war ja genau mein Ansatz (zwar mit Semikolon getrennt, aber dennoch).
Leider funktioniert eben das nicht (Weder mit Komma noch mit Semikolon).
Fehler ist in der Codezeile:
rs![Mitarbeiter] = strMitarbeiter
"Laufzeitfehler 64224: Die Methode 'Collect' für das Objekt 'Recordset2' ist fehlgeschlagen.

strMitarbeiter setzte ich vorher aus der Liste zusammen. Sieht Beispielhaft so aus: "4; 5; 9"

Leider finde ich zu dem Fehler nichts sinnvolles im Netz.

Zitat von: MzKlMu am Oktober 09, 2022, 14:35:50Und zeige bitte mal ein Bild des Bezienungsfensters. Beziehungen sind ja hoffentlich angelegt.

Jetzt Oute ich mich wahrscheinlich als Noob, aber ich habe noch nie mit dem Beziehungsfenster gearbeitet und wusste bis gerade auch nicht, dass es überhaupt existiert.

LG Jan

MzKlMu

Hallo,
Zitat von: undefinedjetzt Oute ich mich wahrscheinlich als Noob, aber ich habe noch nie mit dem Beziehungsfenster gearbeitet
Dann wird es aber Zeit. Beziehungen sind das A+O einer Datenbank und der 1.Schritt nach dem Anlegen der Tabellen. Man kann keine gut und sicher funktionierende Datenbank ohne Beziehungen machen. Beziehungen sind unerlässlich und nur diese stellen die Datenitegrität unter allen Umständen sicher.
Du solltest Dich dringend mit den Grundlagen für relationale Datenbanken beschäftigen. Access muss man lernen, da geht nix intuitiv wie bei Excel oder Word.

Theorie:
https://www.hdm-stuttgart.de/~riekert/lehre/db-kelz/
Praxis:
https://www.access-tutorial.de/
Gruß Klaus

ebs17

Zitataber ich habe noch nie mit dem Beziehungsfenster gearbeitet
Dir ist aber bewusst, dass ein Nachschlagefeld in einer Tabelle die Umsetzung einer versteckten Beziehung ist? Das ist auch der Hauptgrund für Kritik. Sehen wäre der erste Schritt für Verstehen, womit man es zu tun hat.

Zum Verständnis für andere, vor allem aber für sich, sollte man mit eigenen, also geplanten und selbstangelegten Beziehungen arbeiten. "Funktionieren" und Beherrschen liegen dann enger beieinander.
Mit freundlichem Glück Auf!

Eberhard

JanJB99

Tut mir leid, wenn ich das jetzt so hart sage:
Aber ich bin für Hilfe bei einem Problem hier her gekommen.
Nicht für Kritik an meiner Arbeit.
Ich weiß, dass ich noch viel lernen kann und muss.
Jedoch habe ich mir alles was ich kann selbst beigebracht und damit bis jetzt schon viele gute Lösungen entwickeln können -> Ja auch mit Nachschlagefeldern.

Ich werde die Frage jetzt nochmal in einem anderen Forum posten.
Vielleicht wird da größerer Wert auf die Lösung und weniger auf Kritik am User gelegt.

Einen schönen Abend!

MzKlMu

#12
Hallo,
Zitat von: undefinedIch werde die Frage jetzt nochmal in einem anderen Forum posten.
Du kannst davo ausgehen, dass es dort die gleichen Antworten gibt.
Wahrscheinlich triffst Du dort auch die gleichen Leute.
Und wer sein Problem in einem öffentlichen Forum postet muss auch mit Kritik an der Struktur rechnen.
Das ist auch kein Kritik am User, sondern Kritik an der Tabellenstruktur.
Gruß Klaus

JanJB99

Zitat von: JanJB99 am Oktober 09, 2022, 12:35:43Gibt es denn eine vergleichbar schöne Variante, um den Schichtplan per Dropdown mit Mitarbeitern zu befüllen?
Oder muss ich da ein komplett neues Konzept entwickeln?

Die Frage nach einer alternativen Methode für das gleiche Ziel bleibt nach wie vor offen.

DF6GL

Hallo,

ZitatDie Frage nach einer alternativen Methode für das gleiche Ziel bleibt nach wie vor offen.


die habe ich doch beschrieben...??

Und hast Du die Eigenschaften des Tabellen-Nachschlagefeldes richtig eingestellt oder hast Du die Hinweise nicht gelesen?

Auch wenn Du es nicht hören willst, Deine Methode ist fehlerhaft und ist nicht zielführend, wie Du selber gemerkt hast.