Hallo zusammen,
ich bin mir nicht sicher, ob die Probleme, die ich momentan mit einer Abfrage habe, vielleicht auf einem falschen Datenmodell beruhen.
Folgende Daten sind vorhanden:
tblCharge (Tabelle für Materialchargen)
- ChargenID (Primärschlüssel - Autowert)
- diverse Felder, die die Charge beschreiben (z.B. MaterialArt, Jahr, lfd.Nr)
tblPack (Tabelle für Packstücke)
-PackID (Primärschlüssel - Autowert)
- P_Charge (Fremdschlüssel – Long – Bezug zurChargenID aus tblCharge – 1 Charge : n Packstücke)
- diverse Felder zum Packstück (z.B. Menge, Verpackung)
tblMessungen (Tabelle für Messdaten)
- MessID (Primärschlüssel - Autowert)
- (hier im Fremdschlüssel liegt mein Problem)
- M_Wert (Messwert - Double)
- M_Datum (Datum der Messung)
Nun gibt es Messungen zu einzelnen Packstücken oder zur Charge oder beides oder keine Messung.
Wenn ich eine Liste aller Packstücke (Endlosformular mit ungebundenen Suchfeldern im Kopf) aufrufe, möchte ich den neuesten Messwert des Packstückes finden. Sollte es keinen geben, dann den Messwert der Charge bzw. keinen Wert, wenn es auch zur Charge (noch) keine Messung gibt.
Mein erster Gedanke war zwei Fremdschlüssel (einen zur Charge und einen zum Packstück) anzulegen. Ein zweiter Gedanke ist ein Feld zur Entscheidung, ob es sich um eine Packstück-Messung oder eine Chargen-Messung handelt und ein long-Feld mit der entsprechenden ID (entweder Charge oder Packstück). Aber mit beiden Versionen komme ich nicht an dem ,,wenn keine Packstück-Messung gefunden, dann Chargen-Messung suchen" Problem vorbei... ???
Hallo,
Dein zweiter Gedanke wäre in diesem Fall umzusetzen.
Zitat,,wenn keine Packstück-Messung gefunden, dann Chargen-Messung suchen" Problem
ist eher kein Vorgang, sondern ein Formularaufbau-Problem.
Du brauchst
im (Einzel-) Formular "frmCharge":
ein UFO-St.El. ("UfoChargenMessungen"), das das (Unter-)Form "frmMessungen" mit entspr. gesetzten Verknüpfungen anzeigt
ein UFO-St.El. ("UfoPackStücke"), das das (Unter-)EndlosForm "frmPackStücke" mit entspr. gesetzten Verknüpfungen anzeigt
im
Formularfuß des Forms "frmPackStücke ein UFO-St-El. ("UfoPSMessungen") das das (Unter-)Form "frmMessungen" mit entspr. gesetzten Verknüpfungen anzeigt
Hallo!
Ich hoffe ich mische mich da nicht ungelegen ein
Eigentlich habe ich ja auch mehr Fragen als antworten
Wenn ich das richtig verstanden habe dann hättest du gerne ein endlos Formular das
In einer Linie nebeneinander anzeigt und wen kein wert vorhanden ist soll das Feld leer sein
Da ich nicht so ein Profi bin habe ich das mal als Bild geladen
Hof du kannst was damit als anregung anfangen
(http://www.fotos-hochladen.net/thumbnail/190120122143ybgxl8nmo_thumb.jpg) (http://www.fotos-hochladen.net/view/190120122143ybgxl8nmo.jpg)
Im Formular würde ich dann ein Kombination Feld das alle Werte die ich suchen kann oder die es gibt beinhaltet
nach den aktualisieren dann ein Requery auf das UFO wenn darin entsprechend steht
[Forms]![frmWareneingang]![CboArtIDUmbuchNavi]
Mit 2 Datums Felder und der Funktion habe ich dann noch das ganze gefiltert
Die ID muss da sein das Datum kann optional sein wenn kein Datum da ist dann werden alle zur ID ausgegeben
Me!FrmUnterform.Form.RecordSource = fcFilterUfo(Me!TxtDatumbeginn, Me!TxtDatumende, Me!LstStaendeAuswahl.Column(0))
Private Function fcFilter(Optional datVon As Variant, _
Optional datBis As Variant, _
Optional ID As Long = 0) As String
Dim sSQL As String
Dim sFilter As String
Const SqlDtFmt = "\#yyyy-mm-dd\#"
sSQL = "SELECT tblBestandsaenderungen.BestandsaenderungID, tblBestandsaenderungen.BestandDatum, tblBestandsaenderungen.BestandAnzahl, tblBestandsaenderungen.BestandArtIDRef" & _
" FROM tblBestandsaenderungen" & _
" INNER JOIN tblWareneingang " & _
" ON tblBestandsaenderungen.BestandsaenderungID = tblWareneingang.BestandsaenderungIDRef" & _
" WHERE $1" & _
" ORDER BY tblBestandsaenderungen.BestandsaenderungID;"
Debug.Print sSQL
If IsDate(datVon) Then
sFilter = "AND BestandDatum >= " & Format(datVon, SqlDtFmt)
End If
If IsDate(datBis) Then
sFilter = sFilter & "AND BestandDatum <= " & Format(datBis, SqlDtFmt)
End If
If ID <> 0 Then
sFilter = sFilter & "AND BestandArtIDRef = " & ID
End If
If Len(sFilter) Then
'-- erstes And abschneiden
sFilter = Mid(sFilter, 5)
Else
sFilter = "1"
End If
fcFilter = Replace(sSQL, "$1", sFilter)
End Function
Grusß frank
Hallo Franz und Frank,
vielen Dank für eure Anregungen...
Ich habe jetzt den Tabellenaufbau so geändert, dass ich ein Ja/Nein-Feld habe, welches mir angibt, ob ich eine Messung zur gesamten Charge habe oder zum einzelnen Packstück. Außerdem dann das Feld mit dem Fremdschlüssel (da nur der Schalter angibt, ob es sich um einen Fremdschlüssel zur Chargentabelle oder zur Packstücktabelle handelt, habe ich keinerlei Beziehungen zu dieser Tabelle angelegt)
Dann habe ich in meiner Abfrage (die als Grundlage für mein Endlosformular dient) ein ungebundenes Feld "Messung" erzeugt, welches folgenden Inhalt hat:
Messung: Format(Wenn(IstNull((Select Top 1 M_Wert from tblMessungen WHERE Mes_Art = 1 AND Mes_Zuordnung = TRUE AND Mes_ChaOrPStk = PackID));(Select Top 1 M_Wert from tblMessungen WHERE Mes_Art = 1 AND Mes_Zuordnung = FALSE AND Mes_ChaOrPStk = MP_Charge);(Select Top 1 M_Wert from tblMessungen WHERE Mes_Art = 1 AND Mes_Zuordnung = TRUE AND Mes_MatOrPStk = PackID));'Standardzahl')
Hi!
Freut mich das ich auch mal was beitragen konnte!
Wenn ich das richtig gesehen habe fehlt das ORDER BY in deiner Abfrage das könnte dir falsche werte geben da das select top 1 den ersten obenstehenden wert nimmt
Das ist mir passiert bei der Ermittlung des Inventur Datums
in der Datenblatt Ansicht muss dein gesuchter wert dann ganz oben stehen
Order By M_Wert DESC
Gruß Frank
Hi Frank,
danke für den Tipp. Habe ich auch schon dran gedacht, aber vorerst wird es nur einen Messwert zu einem Packstück oder einer Charge geben. Wenn sich das ändern sollte, werde ich nach dem Erfassungsdatum sortieren um den aktuellsten Wert zu finden.