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:
Unbenannt.PNG
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.
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
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.
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.
Hallo,
der Schichtplan ist die n:m Beziehungstabelle mit zwei 1:n Beziehungen 1x zur Schicht und 1x zu den Stammdaten/Mitarbeiter.
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:14Zitat 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:14Zitat 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
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.
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
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/
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.
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!
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.
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.
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.
Lieber Franz,
ich habe Deine Hinweise gelesen.
Leider ist alles was Du zu meinem Problem sagst:
ZitatWozu? 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".
und
ZitatAlles 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.
Dazu kommt noch einiges an Kritik an Dingen, die ich zwar nachvollziehen kann, mich jedoch grade kein Stück nach vorn bringt.
Ich danke Euch wirklich für Eure Mühe in diesem Forum. Viele Fragen wurden mir hier beantwortet, ohne dass ich sie selbst stellen musste.
Dennoch bin ich bei meinem Problem seit 8h kein Stück weiter - Was sicherlich zum Großteil an meinem Know-How liegt.
Hallo,
auch das:
Zitat von: undefined...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 Tabellenfeld "Mitarbeiter" übernommen wird....
habe ich gesagt, womit Du sicher darauf schliessen könntest, dass in Deinem Beispiel in der Eigenschaft "Spaltenbreiten" des Nachschlagefeldes (Kombifeld) z. B.
4cm;4cm
stehen sollte.
Hast Du das umgesetzt? Und nochmal: VBA-Code ist völlig überflüssig/unangebracht/falsch an dieser Stelle.
An anderer Stelle berufst Du Dich auf ein Formular-Listenfeld, das die Mitarbeiter anzeigt und den ausgewählten MA (den Nachnamen) in das entspr. Tabellenfeld (Mitarbeiter) übertragen soll. Das gelingt ganz einfach damit, das Listenfeld an das Tabellenfeld "Mitarbeiter" zu binden (Steuerelementinhalt:
Mitarbeiter)
Trotzdem ist hier die "Kritik" angebracht, dass kein Primärschlüssel ("MitarbeiterID") für diesen Vorgang benutzt wird. Wenn es keinen PK in der Stammdaten-Tabelle gibt, dann füge einen hinzu und verwende diesen im Steuerelement-Inhalt des Listenfeldes. Dass die Abfrage und die Eingenschaften des Listenfeldes angepasst werden müssen, wäre eigentlich überflüssig zu erwähnen. Das konkrete Umsetzen überlasse ich jetzt Dir..
ZitatDennoch bin ich bei meinem Problem seit 8h kein Stück weiter - Was sicherlich zum Großteil an meinem Know-How liegt.
Warum investierst Du diese Stunden nicht in das Durcharbeiten eines Tutorials (auch in das Anschauen der Links in meiner Signatur)?
Das wäre effizienter und nachhaltiger.
Lieber Franz,
ich habe das Gefühl, Du hast überhaupt nicht verstanden wo mein Problem liegt.
Das Kombifeld funktioniert einwandfrei. Und ich weiß wie die Spaltenbreiten funktionieren.
Um genau zu sein steht da in meinem Fall 0cm;3cm;3cm, damit die erste Spalte, die die MitarbeiterID enthält, nicht angezeigt wird,die Datensätze aber trotzdem als ID und nicht als Name gespeichert werden.
Mein Problem liegt einzig und allein darin, Mitarbeiter per VBA code in das Nachschlagefeld hinzuzufügen.
Der Punkt den Du für:
ZitatCode ist völlig überflüssig/unangebracht/falsch an dieser Stelle
empfindest.
Ich verstehe noch nicht wieso es überflüssig sein sollte dem User eine Menge Klicks durch einen zu ersetzen indem man einen Teil des Plans automatisch befüllt, aber jedem seine Meinung.
Ich habe jetzt die Info, dass man ein Nachschlagefeld wohl mit einem 2. Recordset befüllen kann. Das werde ich heute probieren und wenn es funktioniert die Lösung hier teilen.
LG Jan
Hallo,
Zitatich habe das Gefühl, Du hast überhaupt nicht verstanden wo mein Problem liegt.
das glaube ich auch... 8)
Erklär es mir nochmal genau und ausführlich: Wo (Tabelle, Tabellenfeld, Formular, Steuerelement (-Namen) ) willst Du was und wie hinzufügen und/oder abspeichern?
ZitatUm genau zu sein steht da in meinem Fall 0cm;3cm;3cm, damit die erste Spalte, die die MitarbeiterID enthält, nicht angezeigt wird,die Datensätze aber trotzdem als ID und nicht als Name gespeichert werden.
WO steht das? Jedenfalls nicht im Screenshot der Eigenschaften des Tabellen-Nachschlagefeldes.
Dass die ID in das entspr. Tabellenfeld (heißt das "Mitarbeiter"?) abgespeichert wird, ist doch so RICHTIG! Genau das ist zu erwarten. Allerdings hat "Mitarbeiter" vermutlich den Datentyp TEXT, was mit dem Datentyp des ID-Feldes, der vermutlich LONG ist, nich korreliert.
ZitatMein Problem liegt einzig und allein darin, Mitarbeiter per VBA code in das Nachschlagefeld hinzuzufügen.
Das wiederum versteh ich nicht.... Ist das Tabellen-Nachschlagefeld damit gemeint? Und was heißt "hinzufügen"? Einen neuen MA hinzufügen oder den im Formularlistenfeld ausgewählten MA darstellen, und zwar in der
Tabellen-Ansicht?
Das hört sich einfach verquert an. Wirf das Nachschlagefeld endlich aus der Tabelle heraus und alles wird gut.... und das ganz ohne Code... Vorausetzung sind die korrekten Datentypen-Deklarationen und passend gesetzte Beziehungen im Beziehungsfenster. (Das wurde ja auch schon angesprochen und solltest Du dringend umsetzen, wenn noch nicht geschehen.)
ZitatIch verstehe noch nicht wieso es überflüssig sein sollte dem User eine Menge Klicks durch einen zu ersetzen indem man einen Teil des Plans automatisch befüllt, aber jedem seine Meinung.
Das habe ich nicht gesagt. Mach es so wie beschrieben, und das Ganze funktioniert mit einem einzigen Klick.
Insofern versteh ich, wo Dein Problem liegt.
Du könntest ja mal die DB (datenreduziert, komprimiert/repariert und gezippt) hier hochladen....