23. februar 2006 - 23:38Der er
10 kommentarer og 1 løsning
Sammenligene datoer
Grundtabel: ’ som indeholder alle et NR på alle dyr NR Linie
Data: ’ Som indeholder næsten alle NR, som er gentaget på forskellige datoer NR Linie Dato Vægt
Jeg vil sammenligne vægten på 2 forskellige datoer, på samme NR. Men det er ikke sikkert at dyret er vejet hverken på den første dato eller den sidste, jeg vil alligevel se numret Eks. På hvordan jeg ønsker udtrækket
I lang tid har samarbejdsbranchen fokuseret på at forbedre enhedsfunktioner – bedre kameraer, klarere lyd og smartere software. Men den virkelige forvandling handler ikke om funktioner.
SELECT g.Nr, g.linie, d1.Dato, d1.[Vægt], d2.Dato, d2.[Vægt] FROM (Grundtabel g LEFT JOIN Data d1 ON g.Nr=D1.Nr AND g.linie=d1.linie) LEFT JOIN Data d2 ON g.Nr=d2.Nr AND g.linie=d2.linie WHERE d1.dato IS NULL OR d2.dato IS NULL OR d1.dato = Date([Angiv dato 1]) OR d2.dato = Date[[Angiv dato 2])
det er faktisk den jeg har prøvet, den virker ikke, du får lige de rigtige felter
Du behøver ikke at lave JOIN på linie
SELECT g.NR AS Udtryk1, g.Linie AS Udtryk2, d1.Dato AS Udtryk3, d1.Gram AS Udtryk4, d2.Dato AS Udtryk5, d2.Gram AS Udtryk6 FROM (GrundDataF65244 AS g LEFT JOIN F65244 AS d1 ON g.NR = d1.Nr) LEFT JOIN F65244 AS d2 ON g.NR = d2.Nr WHERE (((d1.Dato)=#9/19/2005#) AND ((d2.Dato)=#11/19/2005#));
den giver kun værdier, hvis der er data i både d1 og d2
SELECT g.NR, g.Linie, d1.Dato, d1.Gram, d2.Dato, d2.Gram FROM (GrundDataF65244 AS g LEFT JOIN F65244 AS d1 ON g.NR = d1.Nr) LEFT JOIN F65244 AS d2 ON g.NR = d2.Nr WHERE (((d1.Dato)=#9/19/2005#) AND ((d2.Dato)=#11/19/2005#));
Nej, den første var ikke rigtig, det er nok snarere sådan...
SELECT g.Nr, g.linie, d1.Dato, d1.[Vægt], d2.Dato, d2.[Vægt] FROM (Grundtabel AS g LEFT JOIN [SELECT * FROM Data WHERE Dato = #1/1/6#]. AS d1 ON (g.linie=d1.linie) AND (g.Nr=D1.Nr)) LEFT JOIN [SELECT * FROM Data WHERE Dato = #1/20/6#]. AS d2 ON (g.linie=d2.linie) AND (g.Nr=d2.Nr);
SELECT g.Nr, g.linie, d1.Dato, d1.Gram, d2.Dato, d2.Gram FROM (GrundDataF65244 AS g LEFT JOIN [SELECT * FROM F65244 WHERE Dato = #1/1/6#]. AS d1 ON (g.linie=d1.linie) AND (g.Nr=D1.Nr)) LEFT JOIN [SELECT * FROM F65244 WHERE Dato = #1/20/6#]. AS d2 ON (g.linie=d2.linie) AND (g.Nr=d2.Nr);
Nu ser det godt ud, men du skal ikke JOIN på linie, dyret kan skifte linie undervejs, kun NR er unik
Sådan kom den til at se ud, men datoerne skal fanges fra en formular, kan det klares
SELECT g.NR, g.Linie, d1.Linie, d1.Hal, d1.Bur, d1.Køn, d1.Dato, d1.Gram, d1.Bem, d2.Linie, d2.Hal, d2.Bur, d2.Køn, d2.Dato, d2.Gram, d2.Bem FROM (GrundDataF65244 AS g LEFT JOIN [SELECT * FROM F65244 WHERE Dato = #11/19/2005#]. AS d1 ON g.NR = d1.Nr) LEFT JOIN [SELECT * FROM F65244 WHERE Dato = #19/09/2005#]. AS d2 ON g.NR = d2.Nr;
Ja, det kan jo laves på flere måder, men jeg kan nu egentlig godt lide denne metode:
På din form har du to indtastningsfelter (txtDato1 og txtDato2), samt en kommandoknap (cmdEnterDato). På kommandoknappen har du en Click event:
Private Sub cmdEnterDato_Click() Dim strSQL As String Dim Dato1 As Date Dim Dato2 As Date Dato1 = CDate(Replace(txtDato1, ".", "-")) Dato2 = CDate(Replace(txtDato2, ".", "-")) strSQL = _ "SELECT g.Nr, g.linie, d1.Dato, d1.[Vægt], d2.Dato, d2.[Vægt]" & vbCrLf & _ "FROM (Grundtabel AS g" & vbCrLf & _ "LEFT JOIN [SELECT * FROM Data WHERE Dato = #" & Format(Dato1, "m\/d\/y") & "#]. AS d1" & vbCrLf & _ " ON (g.Nr=D1.Nr))" & vbCrLf & _ "LEFT JOIN [SELECT * FROM Data WHERE Dato = #" & Format(Dato2, "m\/d\/y") & "#]. AS d2" & vbCrLf & _ " ON (g.Nr=d2.Nr)" CurrentDb.QueryDefs("Vægt3").SQL = strSQL End Sub
Rutinen ændrer i forespørgslen "Vægt3", så den er klar til at udføres. Du kan jo evt. lade den efterfølge af en Me.Requery instruktion, hvis du f.eks. har datofelterne og kommandotasten placeret i formens headersektion, mens resultatet af forespørgslen skal vises i detailsektionen på samme form.
Fordelen ved denne metode er, at man bagefter kan køre forespørgslen, selv efter at formen er lukket igen.
Beklager, at det viste ikke bruger dine tabel- og feltnavne. Det må du selv rette til... :-)
Hmm... Ved nærmere eftersyn, var der et lille issue med datoen (formatteringen), her er en opdatering:
Private Sub cmdEnterDato_Click() Dim strSQL As String Dim Dato1 As Date Dim Dato2 As Date Dato1 = CDate(Replace(txtDato1, ".", "-")) Dato2 = CDate(Replace(txtDato2, ".", "-")) strSQL = _ "SELECT g.NR, g.Linie, d1.Linie, d1.Hal, d1.Bur, d1.Køn, d1.Dato, d1.Gram, d1.Bem," & _ "d2.Linie, d2.Hal, d2.Bur, d2.Køn, d2.Dato, d2.Gram, d2.Bem" & vbCrLf & _ "FROM (GrundDataF65244 AS g" & vbCrLf & _ "LEFT JOIN [SELECT * FROM F65244 WHERE Dato = #" & Format(Dato1, "m\/d\/yyyy") & "#]. AS d1" & vbCrLf & _ " ON (g.Nr=D1.Nr))" & vbCrLf & _ "LEFT JOIN [SELECT * FROM F65244 WHERE Dato = #" & Format(Dato2, "m\/d\/yyyy") & "#]. AS d2" & vbCrLf & _ " ON (g.Nr=d2.Nr)" CurrentDb.QueryDefs("Vægt3").SQL = strSQL End Sub
Som du kan se, har jeg benyttet lejligheden til at ændre fil- og feltnavnene til dem du angav i dit sidste bidrag...
Synes godt om
Ny brugerNybegynder
Din løsning...
Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.