Hallo zusammen.
Ich arbeite an einer Rinderdatenbank.
In dieser befinden sich zur Zeit 45 Rinder eindeutig erkennbar durch Ihre Ohrmarkennummer.
Nun würde ich gern 10 Rinder von Stall A nach Stall B umziehen.
Die Standorte sollen nachvollziehbar bleiben, d.h. wo die Tiere in der Vergangenheit wie lang waren.
Deshalb würde ich pro Tier/Umzug eine Zeile in tblStall schreiben.
Ich möchte nun beim Umzug die 10 Tiere per Kontrollkästchen markieren und für alle markierte Tiere in der tblStall einen Eintrag mit dem neuen Standort samt Datum und Ohrmarkennummer schreiben lassen.
Gibts da eine Möglichkeit?
Hallo,
na klar doch...
Zeige aber erst mal den Screenshot des Beziehungsfensters mit allen Tabellen und mit allen erkennbaren Tabellenfeldern
Servus Franz.
Da wohnen wir ja gar nicht soweit auseinander, ich bin 30min von Füssen entfernt.
Hier der Screenshot ich hoffe es ist alles drauf:
(https://sn3301files.storage.live.com/y4maRoVQoGm9cbu4OHJQeESnhNp2PGeEYGKuOyEzoqRHqNWJU8RfTevcAM7Zf4tbWWX3MWrIuoh9z2QJv62_FyTk9oN_yBczN8ba0vM7MJh9HJOyyT67XRbzqd3uqK6AxW0XSqvy9Klo1U08mlNwbSuDnm_U5thm_ulCKMU1WYXjL7ieWLxfYDWDpdiogKuRQqG?width=1905&height=1002&cropmode=none)
Die tblStall heißt jetzt tblStandortAktuell
Viele Grüße
Thomas
Hallo,
naja, ich bin am Nordwestende des BS zuhause....
-- Vermeide Sonder- und Leerzeichen in Namen!
-- Benenne tblBestand in tblTiere um.
-- Benenne tblStandOrtAktuell in tblTierStandOrte um.
-- Nutze Autowert-Felder als Primärschlüssel. "Ohrmarke" ist technisch ungünstig, weil Datentyp TEXT. Vergibt aber für "Ohrmarke" zusätzlich einen eindeutigen Index.
-- Benenne die Primärschlüsselfelder eindeutig über die gesamten Tabellen gesehen (tblTiere--> "TierID")
-- "DatZugang" in tblTiere entfällt. Ein "Zugang" wird mit dem ersten Datensatz in tblTierStandOrte definiert.
Wenn ein Tier den Standort wechselt, bedeutet das lediglich einen neuen DS in tblTierStandorte mit dem aktuellen Datum. ("Datum" auch umbenennen in z. B. mit Prefix aus Tabellennamen-Abkürzung: "TSO_Datum")
Weitere Normalisierung ist denkbar: tblMedikamente.Art, tblTiere.Rasse
tblStandorte ist ebenfalls zu erweitern.
ZitatIch möchte nun beim Umzug die 10 Tiere per Kontrollkästchen markieren und für alle markierte Tiere in der tblStall einen Eintrag mit dem neuen Standort samt Datum und Ohrmarkennummer schreiben lassen.
Dazu ist zunächst ein "Markierungsfeld (Ja/Nein) in tblTiere erforderlich.
Im Formular "frmTiere" (jede Tabelle erhält ein individuelles Form) kann dieses Kontrollkästchen dann zur Markierung der einzelnen Tiere herangezogen werden.
In einem ungebundenen Kombifeld mit Datensatzherkunft zu Tabelle tblStandorte wird der Standort ausgewählt, zu dem umgezogen werden soll.
Mittels Button und einer Anfügeanfrage werden die markierten Tiere als neue DS an tblTierStandorte angehängt.
Hallo Franz,
Ich schon wieder.
ZitatDazu ist zunächst ein "Markierungsfeld (Ja/Nein) in tblTiere erforderlich.
Muss das sein? Ein Listfeld mit Mehrfachauswahl sollte doch reichen.
gruss ekkehard
Hallo Eckehard,
ich auch ;)
Ich bezog mich auf die Frage des TS:
Zitat...die 10 Tiere per Kontrollkästchen markieren ...
was ich (je nachdem, wie der ganze Umzugsablauf im Detail aussieht) sowieso bevorzuge.
Die Markierungen im Kombifeld sind temporär, sprich vergänglich, die gespeicherten Markierungen dagegen nicht.
Es kann ja sein, das der Umzug über längere Zeit (in einem Formular) geplant werden soll/muss und erst danach die Durchführung des Umzugs stattfindet. Zwischendurch wurde die DB (mehrmals) geschlossen und somit sind die Kombifeld-Markierungen verloren.
So, jetzt Du wieder.... 8) :) :)
Hallo Franz,
Ja, das ist natürlich einen Schritt weitergedacht.
Es war von mir aber auch als Frage formuliert.
gruss ekkehard
Zitateinen Schritt weitergedacht
Wenn es dann mehrere Auswahlvorgänge geben könnte, die sich zeitlich überschneiden würden - von der erstmals fixierten Idee bis zu einer Umsetzung könnte es ja länger dauern - müsste man die Ja/Nein-Felder in der Tiere-Tabelle in eine m:n-Beziehung Tiere-Auswahlvariante ersetzen.
Hallo Franz,
die Normailisierungstipps setze ich gerade um.
Dabei ist die habe ich überlegt ob das DatZugang nicht bleiben sollte und sogar durch DatAbgang ergänzt werden sollte, um einfach die Mastdauer berechnen zu können? Ausserdem würde ich DatAbgang dazu verwenden um in Formularen nur aktive Tiere anzeigen zu lassen wenn das Abgangsdatum leer ist.
ZitatWeitere Normalisierung ist denkbar: tblMedikamente.Art, tblTiere.Rasse
Die Medikamentenart habe ich bereits zur Auswahl in einem Kombinationsfeld eingestellt
ZitatEs kann ja sein, das der Umzug über längere Zeit (in einem Formular) geplant werden soll/muss und erst danach die Durchführung des Umzugs stattfindet.
Nein das ist nicht notwendig, der Umzug in der Datenbank wird sofort vollzogen.
ZitatEs kann ja sein, das der Umzug über längere Zeit (in einem Formular) geplant werden soll/muss und erst danach die Durchführung des Umzugs stattfindet.
Gibt´s dafür noch weiterführende Tipps/Beispiele.
Viele Grüße Thomas
Hallo nochmal.
Ich komme hier einfach nicht weiter.
Nochmal zum Verständnis:
Ich erstelle ein Formular mit Listenfeld Ohrmarke und Mehrfachauswahl, ein Textfeld Datum und ein Kombifeld Standort.
Ich erstelle einen Button mit Ereignisprozedur bei Click.
Den Code hätte ich mir irgendwie so vorgestellt.
Sub btnKopieren_Click()
Private Sub Befehl1_Click()
Me.Dirty = False
CurrentDb.Execute "Insert into tblTierStandorte (TierStandortDat,Ohrmarke,StandortID) select TierStandortDat,StandortEingOhrm,StandortID from frmStandortEingabe where ID = " & Me!ID, dbFailOnError
End Sub
ab "where" weiß ich nicht was gemeint ist.
Hätte jemand einen Tipp für mich?
Hallo,
Zitatab "where" weiß ich nicht was gemeint ist.
Zitatwhere ID = " & Me!ID, dbFailOnError
Damit ist gemeint, dass der DS herangezogen wird, der den ID-Wert des Form-Textfeldes "ID" besitzt. Das geht aber nur, wenn das Form gebunden ist, was bei Dir scheinbar nicht der Fall ist ("Ich erstelle ein Formular.. ").
dbFailOnError sorgt dafür, dass eine Fehlermeldung im Fehlerfall (auf SQL-Ebene) erzeugt wird.
Notfalls lad die Db hier hoch, komprimiert/repariert und gezippt
Ich habe jetzt nochmal versucht eine Anfügeabfrage aus einem gebundenen Formular heraus zu erstellen, was mir leider nicht gelungen ist.
Ich habe es mit einem button mit Ereignisprozedur versucht.
Dabei wollte ich die Parameter aus dem gebundenen Formular auslesen und in der Tabelle anfügen lassen.
Scheinbar können aus einem form aber keine Werte ausgelesen werden?
Wie ist denn hier die richtige Vorgehensweise?
Hallo,
natürlich können aus einem Formular Daten ausgelesen werden. Zeige bzw erkläre deine Versuche.
Hallo Klaus,
hier der Code meines Buttons:
Private Sub Befehl59_Click()
CurrentDb.Execute "INSERT INTO tblTierStandorte ( TierStandorteID, Ohrmarke, TierStandortDat, StandortID )SELECT frmTSG.TierStandorteID, frmTSG.Ohrmarke, frmTSG.TierStandortDat, frmTSG.StandortID FROM frmTSG"
End Sub
Gruß Thomas
Hallo,
versuche es so (ungetestet):
CurrentDb.Execute "INSERT INTO tblTierStandorte ( TierStandorteID, Ohrmarke, TierStandortDat, StandortID )VALUES(" _
& Me.TierStandorteID & ",'" & Me.Ohrmarke & "'," & "Int(Me.TierStandortDat) &", " & Me.StandortID"Texte sind in Hochkomma einzuschließen und das Datum habe ich in eine Ganzzahl gewandelt wegen der SQL konformen Übergabe von Datumswerten.
Ich bekomme Datentyp Konvertierungsfehler
So jetzt versuche ich mal die Formel zu verstehen:
CurrentDb.Execute "INSERT INTO tblTierStandorte ( TierStandorteID, Ohrmarke, TierStandortDat, StandortID )VALUES(" _Der erste Teil ist gleich meiner Formel, der Unterstrich dient nur zum "Verkürzen" der Zeile.
VALUES(" _
& Me.TierStandorteID & ",'" & Me.Ohrmarke & "'," & "Int(Me.TierStandortDat) &", " & Me.StandortID"Wann brauche ich ein "&"
"Me." stellt den Bezug zum Form her.
"TierStandortID" habe ich wahrscheinlich falsch angegeben die kommt im Form nicht vor und wird ja automatisch bei einem neuen Datensatz vergeben?
Am Schluss soll das ganze ja mit Mehrfachauswahl aus dem Listenfeld funktionieren, geht das so überhaupt?
Der Datentyp des Datums sollte wohl besser nicht geändert werden wenn in der Tabelle ein Datum erwartet wird?
Hallo,
wenn TierStandortID ein Autowertfeld ist, bleibt diese komplett außen vor.
ZitatDer Datentyp des Datums sollte wohl besser nicht geändert werden
Mit Int wird der Datentyp in der Tabelle nicht geändert.
Aus dem Datum wird eine Ganzzahl gemacht, die ohne weiteres übertragen werden kann. Damit umgeht man die etwas umständlichere Formatierung des Datums nach US Format (MM/TT/JJJJ) oder ISO (JJJJ/MM/TT).
Das mit dem Listenfeld habe ich jetzt nicht verstanden, hast Du jetzt ein Listenfeld zur Auswahl oder ein Formular. Angegeben hast Du Formularfelder.
Zeige bitte mal ein aktuelles beziehungsbild.
Hallo Klaus
hier sind die screenshots.
Gruß Thomas
Hallo.
Wenn ich in einem Listenfeld - egal ob gebunden oder nicht - einen oder mehrere Einträge selektiere, passiert dies: NICHTS - nur die Optik ändert sich. Es wird NICHTS in die Datenbank zurückgeschrieben.
Wenn du also (mehrere) Einträge im Listenfeld selektierst, musst du per VBA diese Markierungen abfragen und dein entsprechendes Insert Into... zusammenbasteln.
Da durch die Selektionen im Listenfeld NICHTS in die Datenbank geschrieben wird, kann es auch kein WHERE-Konstrukt geben! Alles geschieht nur visuell an der Oberfläche!
Weiter:
Ich denke, was du willst und brauchst ist nur ein ungebundenes Formular mit folgenden Feldern (vereinfacht):
Aktueller Stall
Listenfeld mit den Rindern des aktuellen Stalls (Mehrfach-Auswahl, Datenquelle anhand des Wertes "aktueller Stall" zusammenbauen)
Neuer Stall
Button "Umzug jetzt"
Beim Klicken auf diesen Button loopst du durch das Listenfeld nach selektierten Einträgen, holst die passenden Daten aus dem Listenfeld (z. B. aus Spalten der Breite 0) und baust daraus mit dem Ziel-Stall die entsprechenden Insert-Into-Statements zusammen.
Im Loop kannst du auch in den jeweils alten Datensatz ein Datumsfeld "Umzug am" und weitere Informationen speichern.
Hallo crystal.
Ja genau so in etwa stelle ich mir das vor.
Also es würde reichen wenn ich die betreffenden Ohrmarken aus tblTiere in einem Listenfeld markieren kann.
Dann soll pro markierter Ohrmarke eine Zeile in tblTierStandorte geschrieben werden.
Also die Liste des aktuellen Stall/Wiese ist gar nicht notwendig
ZitatBeim Klicken auf diesen Button loopst du durch das Listenfeld nach selektierten Einträgen, holst die passenden Daten aus dem Listenfeld (z. B. aus Spalten der Breite 0) und baust daraus mit dem Ziel-Stall die entsprechenden Insert-Into-Statements zusammen.
Im Loop kannst du auch in den jeweils alten Datensatz ein Datumsfeld "Umzug am" und weitere Informationen speichern.
Ich denke das Vorgehen passt trotzdem.
Kannst du mir evtl. ein Beispiel zeigen, dass ich mir das besser vorstellen kann?
Hier ein Beispiel.
In einer Movie-Datenbank möchte ich zu einem Film verschiedene Tags speichern. Dazu gibt es eine Tag-Tabelle und zu den Filmen eine Tabelle mit den Tags. Im Movie-Form habe ich einen Button, der ein modales Formular aufruft, in dem ein Listenfeld mit den Tags dargestellt wird. Eine "vorgeschaltete" Kombobox macht es möglich, aus der Tag-Tabelle bestimmte Tag-Typen vorzuselektieren.
2021-01-19 20_18_44-Window.jpg
Der Code dahinter:
Option Compare Database
Option Explicit
Dim blnAdded As Boolean
Private Sub btnApply_Click()
CheckList
End Sub
Private Sub btnCancel_Click()
DoCmd.Close acForm, Me.Form.Name, acSaveNo
End Sub
Private Sub btnOK_Click()
CheckList
DoCmd.Close acForm, Me.Form.Name, acSaveNo
End Sub
Private Sub cboTagType_AfterUpdate()
If cboTagType.Column(0) <> 1 Then
lstTag.RowSource = "SELECT [TagId], [TagText] FROM Tags WHERE [TagTypeRef] = " & cboTagType.Column(0) & _
" AND [TagText] NOT LIKE " & Chr(34) & "*------*" & Chr(34) & _
" ORDER BY [TagText];"
Else
lstTag.RowSource = "SELECT [TagId], [TagText] FROM Tags " & _
" ORDER BY [TagText];"
End If
End Sub
Private Sub CheckList()
Dim strSQL As String
Dim lngMovieId As Long
Dim lngTagId As Long
Dim i As Long
lngMovieId = Forms("Movies").Controls("MovieId")
blnAdded = False
For i = 0 To lstTag.ListCount - 1
If lstTag.Selected(i) Then
lstTag.Selected(i) = False
If InStr(lstTag.Column(1, i), "------") = 0 Then
blnAdded = True
lngTagId = lstTag.Column(0, i)
strSQL = "INSERT INTO [MovieTags] ([MovieTagMovieRef], [MovieTagTagRef]) " & _
"VALUES (" & _
lngMovieId & ", " & _
lngTagId & _
");"
'Debug.Print strSQL
CurrentDb.Execute strSQL, 128
End If
End If
Next
If blnAdded Then Forms("Movies").Controls("subMovieTags").Requery
End Sub
Anmerkungen: in den Tags sind "Überschriften" gespeichert. Sie beginnen mit einer Anzahl "-" und werden für das Listenfeld ggf ausgefiltert.
Das Listenfeld hat zwei Spalten: Id und Text, Breiten 0 und 4cm.
Die Ids der selektierten Tags (Spalte 0) werden in die n:m-Tabelle MovieTags geschrieben und danach wird die Quelle des entsprechenden UFOs im Movie-Form aktualisiert.
Was hier fehlt, ist vor dem Speichern zu prüfen, ob das Tag schon gespeichert ist.
Hoffe, das hilft.
Gruß
crystal