März 03, 2021, 06:44:28

Neuigkeiten:

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


Formular Gruppenmaßnahme

Begonnen von Kubus0815, Dezember 10, 2020, 10:41:15

⏪ vorheriges - nächstes ⏩

Kubus0815

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?


MzKlMu

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.
Gruß
Klaus

Kubus0815

Januar 18, 2021, 15:35:17 #17 Letzte Bearbeitung: Januar 19, 2021, 09:57:47 von Kubus0815 Grund: Upload entdeckt;-)
Hallo Klaus

hier sind die screenshots.

Gruß Thomas

crystal

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!
Wer Fehler in meinen Antworten findet, darf sie behalten, muss sie aber kommentieren. ;-)
Dies ist keineswegs arrogant gemeint, sondern soll nur unterstreichen, dass meine Antworten - natürlich - nicht immer fehlerfrei sind und sein können.
Devise: bitte immer erst selbst probieren!

Aus gesundheitlichen Gründen nur noch selten dabei...

crystal

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.
Wer Fehler in meinen Antworten findet, darf sie behalten, muss sie aber kommentieren. ;-)
Dies ist keineswegs arrogant gemeint, sondern soll nur unterstreichen, dass meine Antworten - natürlich - nicht immer fehlerfrei sind und sein können.
Devise: bitte immer erst selbst probieren!

Aus gesundheitlichen Gründen nur noch selten dabei...

Kubus0815

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?

crystal

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.
Sie dürfen in diesem Board keine Dateianhänge sehen.

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
Wer Fehler in meinen Antworten findet, darf sie behalten, muss sie aber kommentieren. ;-)
Dies ist keineswegs arrogant gemeint, sondern soll nur unterstreichen, dass meine Antworten - natürlich - nicht immer fehlerfrei sind und sein können.
Devise: bitte immer erst selbst probieren!

Aus gesundheitlichen Gründen nur noch selten dabei...