Jag har den senaste tiden försökt att ta fram maxvärdet för en kolumn i en databas. Men när jag sedan vill ha fram positionen för detta värde blir det krångel. Här är koden: <b>Är det sql uttrycket för str2 som behöver ändras, eller nåt helt annat?</b> Ok. Är inte så hemma på det här med sql. Tanken var att jag ville leverera ett värde med hjälp av frågan. Och när det kommer en dbnull tolkade jag det som att ingenting skickades. Så hur ska jag få den att leverera värdet från textboxen i fråga? Jag löste felet jag hade men fick ett annat direkt. Det var fel på den här raden: Skriv ut mer av din kod och vad du vill uppnå egentligen så blir det lättare att ge förslag på vad det kan vara, tex vad är rsDb? Den är inte deklarerad i funktionen... Ok, jag ska försöka ge en tydligare bild av det hela. Så här ser koden ut nu: Löste problemet själv. Variabeln i var ju en integer, och det var decimala tal jag utvärderade. Därför stod det att posten saknades. Ändrade den till en decimal istället, och då funkade det utmärkt. Varför inte DAO: värde och position i databas
Public Sub Max()
str1 = "SELECT max(Bin1Amptd) FROM RasterScan WHERE ((Rinc BETWEEN " & (Val(frmMax.txtLowRinc.Text) + 20) / 0.1 & " AND " & (Val(frmMax.txtHighRinc.Text) + 20) / 0.1 & ") AND Scan = " & frmMax.cmbSnitt.SelectedIndex & ") ;"
Db = DAODBEngine.OpenDatabase(frmMax.txtPath.Text)
rsDb = Db.OpenRecordset(str1)
frmMax.txtMax.Text = rsDb.Fields(0).Value
rsDb.Close()
str2 = "SELECT max(Record) FROM RasterScan WHERE (Bin2Amptd BETWEEN " & Val(frmMax.txtMax.Text) & " AND " & Val(frmMax.txtMax.Text) & "); "
rsDb = Db.OpenRecordset(str2)
frmMax.txtPos.Text = rsDb.Fields(0).Value
rsDb.Close()
End Sub
Det är när den tredje raden nedifrån i kodsnutten ovan körs, som följande meddelande kommer upp: Conversion from type 'DBNull' to type 'String' is not valid.
Är det sql uttrycket för str2 som behöver ändras, eller nåt helt annat?
mvh Robin LövgrenSv: DAO: värde och position i databas
Antagligen eftersom det returnerar Null istället för en giltig sträng. Är det så att du skall returnera null från din fråga måste du ta hand om det innan du tilldelar din textbox(antar att txtpos är det). Sv:DAO: värde och position i databas
Sv: DAO: värde och position i databas
str2 = "SELECT max(Record) FROM RasterScan WHERE (Bin2Amptd BETWEEN " & Val(frmMax.txtMax.Text) & " AND " & Val(frmMax.txtMax.Text) & "); "
Det ska ju inte stå max(Record) eftersom Record är positionen för värdet, utan bara Record.
Men nu när det är fixat får jag fel på samma rad som tidigare men detta felmeddelandet istället:
Aktuell post saknas.
Men jag förstår inte hur den kan saknas. Eftersom maxvärdet från posten redan är framtaget så
existerar den ju uppenbarligen! Någon som vet vad detta beror på?
/RobinSv:DAO: värde och position i databas
Ta dessutom en nogranare titt på den sqlsats du får, kör debuggern och lägg ut SQL'en du får här.
Ta en titt på detta som du har
<code>
BETWEEN " & Val(frmMax.txtMax.Text) & " AND " & Val(frmMax.txtMax.Text) & "); "
</code>
om texten i txtMax är "1" så kommer din sql att bli
<code>
BETWEEN 1 AND 1
</code>
Dvs, det enda du kommer att få som svar är det som är exakt 1.
Kan det vara det som gör att du får null som svar, att du fösöker titta på värdena mellan 1 och 1 och eftersom det inte finns någon post med värdet 1 så får du null?Sv: DAO: värde och position i databas
Dim DAODBEngine As New DAO.DBEngine
Dim Db As DAO.Database
Dim rsDb As DAO.Recordset
Dim str1 As String //För lagring av sql uttryck
Dim str2 As String //För lagring av sql uttryck
Dim i As Integer
Public Sub Max()
str1 = "SELECT max(Bin3Amptd) FROM RasterScan WHERE ((Rinc BETWEEN " & (Val(frmMax.txtLowRinc.Text) + 20) / 0.1 & " and " & (Val(frmMax.txtHighRinc.Text) + 20) / 0.1 & ") AND Scan = " & frmMax.cmbSnitt.SelectedIndex & ") ;"
Db = DAODBEngine.OpenDatabase(frmMax.txtPath.Text)
//Maxvärde tas fram:
rsDb = Db.OpenRecordset(str1)
frmMax.txtMax.Text = rsDb.Fields(0).Value
i = rsDb.Fields(0).Value
rsDb.Close()
//Positionen för maxvärdet tas fram
str2 = "SELECT Record FROM RasterScan WHERE Bin3Amptd=" & i & "; "
rsDb = Db.OpenRecordset(str2)
frmMax.txtPos.Text = rsDb.Fields(0).Value //HÄR BLIR DET FEL: "Aktuell post saknas"
rsDb.Close()
End Sub
Att jag fick null berodde på att jag hade "max(Record)" istället för "Record" på 5:e raden nedifrån, som orsakade fel i 3:e raden nedifrån.
Record innehåller ju positionen för värdet som tas fram(Radnumret), så där ska det absolut inte finnas något max involverat i uttrycket. Ändrade även på BETWEEN och satte dit ett = tecken istället, även om det inte var det här som null meddelandet berodde på.
Efter att jag löst detta problem kom det direkt ett nytt fel på 3:e raden nedifrån:
"Aktuell post saknas"
Detta har jag ännu inte lyckats lösa. Jag tycker ju att posten borde finnas eftersom maxvärdet för just den posten tas fram utan problem några rader högre upp i koden. Så varför kommer då detta meddelande upp när jag försöker ta fram Record (positionen) för denna post?
Hoppas det var lite tydligare =)
/RobinSv:DAO: värde och position i databas
Sv:DAO: värde och position i databas
SELECT Record, Bin3Amptd
FROM RasterScan
WHERE Bin3Amptd = (SELECT Max(Bin3Amptd) FROM RasterScan WHERE Rinc BETWEEN ...)