Access-o-Mania

Access-Forum (Deutsch/German) => Formular => Thema gestartet von: Kubus0815 am Dezember 10, 2020, 10:41:15

Titel: Formular Gruppenmaßnahme
Beitrag von: Kubus0815 am Dezember 10, 2020, 10:41:15
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?
Titel: Re: Formular Gruppenmaßnahme
Beitrag von: DF6GL am Dezember 10, 2020, 11:10:28
Hallo,


na klar doch...

Zeige aber erst mal den Screenshot des Beziehungsfensters mit allen Tabellen und mit allen erkennbaren Tabellenfeldern
Titel: Re: Formular Gruppenmaßnahme
Beitrag von: Kubus0815 am Dezember 10, 2020, 13:02:02
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
Titel: Re: Formular Gruppenmaßnahme
Beitrag von: DF6GL am Dezember 10, 2020, 17:54:54
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.
Titel: Re: Formular Gruppenmaßnahme
Beitrag von: Beaker s.a. am Dezember 11, 2020, 16:36:35
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
Titel: Re: Formular Gruppenmaßnahme
Beitrag von: DF6GL am Dezember 11, 2020, 17:01:58
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)   :)  :)
Titel: Re: Formular Gruppenmaßnahme
Beitrag von: Beaker s.a. am Dezember 11, 2020, 17:36:23
Hallo Franz,
Ja, das ist natürlich einen Schritt weitergedacht.
Es war von mir aber auch als Frage formuliert.

gruss ekkehard
Titel: Re: Formular Gruppenmaßnahme
Beitrag von: ebs17 am Dezember 12, 2020, 09:32:41
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.
Titel: Re: Formular Gruppenmaßnahme
Beitrag von: Kubus0815 am Dezember 15, 2020, 21:43:47
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
Titel: Re: Formular Gruppenmaßnahme
Beitrag von: Kubus0815 am Januar 14, 2021, 20:47:55
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?

Titel: Re: Formular Gruppenmaßnahme
Beitrag von: DF6GL am Januar 15, 2021, 08:33:48
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
Titel: Re: Formular Gruppenmaßnahme
Beitrag von: Kubus0815 am Januar 17, 2021, 20:26:27
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?

Titel: Re: Formular Gruppenmaßnahme
Beitrag von: MzKlMu am Januar 18, 2021, 00:51:21
Hallo,
natürlich können aus einem Formular Daten ausgelesen werden. Zeige bzw erkläre deine Versuche.
Titel: Re: Formular Gruppenmaßnahme
Beitrag von: Kubus0815 am Januar 18, 2021, 08:56:22
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
Titel: Re: Formular Gruppenmaßnahme
Beitrag von: MzKlMu am Januar 18, 2021, 09:34:53
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.
Titel: Re: Formular Gruppenmaßnahme
Beitrag von: Kubus0815 am Januar 18, 2021, 13:30:56
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?

Titel: Re: Formular Gruppenmaßnahme
Beitrag von: MzKlMu am Januar 18, 2021, 14:22:31
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.
Titel: Re: Formular Gruppenmaßnahme
Beitrag von: Kubus0815 am Januar 18, 2021, 15:35:17
Hallo Klaus

hier sind die screenshots.

Gruß Thomas
Titel: Re: Formular Gruppenmaßnahme
Beitrag von: crystal am Januar 18, 2021, 18:19:36
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!
Titel: Re: Formular Gruppenmaßnahme
Beitrag von: crystal am Januar 18, 2021, 18:35:21
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.
Titel: Re: Formular Gruppenmaßnahme
Beitrag von: Kubus0815 am Januar 19, 2021, 09:41:56
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?
Titel: Re: Formular Gruppenmaßnahme
Beitrag von: crystal am Januar 19, 2021, 20:45:14
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