Tein ohjelmanpätkän ja access tietokannan. Teen vain muutamia kyselyjä sinne ohjelmakoodilla, jotka ovat buttoneiden takana. Sain toimimaan muuten paitsi max arvoa. Eli SELECT MAX(nro) FROM... Ilman MAX ehtoa toimii kyllä. Pitääköhän tässä tietää jotain erityistä? Onko kenelläkään kokemuksia?
Hmmm... tarvitsisi ehkä vähän pidemmän pätkän koodia, että näkisi missä on vika...
Sorry, toi tekstin asettelu on vähän heikkoa. Tässä on melkein koko koodi siitä. Otin selkeyden vuoksi pois muutaman if- lauseen jotka liittyy vähän eri juttuun. Sen unohdin vielä sanoa, että kyllähän se hakee isoimman era_nro:n, vaikka tota MAX() arvoa ei laita. Ei taida olla oikein hyvä luottaa siihen, koska sitä ei ole määritelty mitenkään.
Kiitos etukäteen vaivannäöstäsi.
Try Dim dbConn As OleDbConnection Dim dbCommand As New OleDbCommand Dim strPath As String Dim era_nro As Integer txtasiakas.Text = cmbasiakas.Text strPath = txtPath.Text dbConn = New OleDbConnection Provider=Microsoft.Jet.OLEDB.4.0;" _ & "DATA SOURCE=" _ & strPath) dbCommand.CommandText = "SELECT (MAX)era_nro FROM rekisteri where asiakas=" & cmbasiakas.Text dbCommand.Connection = dbConn dbConn.Open() Dim dbDR As OleDb.OleDbDataReader = dbCommand.ExecuteReader While dbDR.Read era_nro = dbDR("era_nro".ToString) End While dbConn.Close() Catch err As System.Exception MsgBox(err.Message) End Try End Sub
En tiedä onko tuo virhe sitten syntynyt kopioinnin yhteydessä (tai SQL on muuttunut siirryttäessä VB6:sta .Net:n), mutta voisi näin aluksi laittaa nuo sulut tuon MAX:n ympäriltä sen jälkeen olevan era_nro:n ympärille.
Jeps, toi oli oma virhe. Kyllä se on ollut MAX(era_nro).
Miten era_nro on määritelty tietokantaan? Number, AutoNumber vai mikä? MAX:han käsittelee vain numeerisia arvoja. Palauttaako tuo hakusi jotain vai aiheuttaako se ohjelman suorituksen pysäyttävän virheen?
Voisit kokeilla muotoilla lausetta seuraavasti:
dbCommand.CommandText = "SELECT ISNULL(MAX(era_nro), 0) as maxnbr FROM rekisteri WHERE asiakas='" & cmbasiakas.Text & "'"
Näin saat aina arvoksi vähintään 0 riippumatta hakuehdon toteutumisesta ja ainakaan Access ei ihmettele puuttuvaa sarakenimeä, joka on nyt maxnbr.
Huom.Testattu vain SQLServer 2000:sella, mutta pitäisi toimia myös Accessissa.
Era_nro on luku tyyppiä. Haku ei anna mitään tulosta, eikä myöskään pysäytä ohjelmaa. Antaa ainoastaan virkeilmoituksen msgboxissa jossa teksti "era_nro".
Kiitos vihjeestä Antti. Ei vaan halunnut toimia.Funktin argumenttien määrä on virheellinen kyselylausekkeessa "ISNULL(MAX(era_nro), 0)" Tällainen virhe tuli. Aika kumma kun ei saa toimimaan mitenkään, tai oikeastaan tämä ohjelma toimii. Se antaa aina kyselyssä suurimman era_nro:n ilman hakuehtoa max. Siihen ei voi ehkä luottaa tulevaisuudessa.
Katselin netistä tuota IsNull:ia ja löytyi tälläinen:
SQLTeam kirjoitti:
SQL Server has a handy little function called ISNULL. It checks if a value is NULL (hence the clever name) and allows you to return a different value if it is. You might use it just like this:
SQLTeam kirjoitti:
Note: Looking back over this (after I wrote my answer of course), it seems you might be using Access. I don't know the comparable function for ISNULL in Access. It shouldn't be to hard to find though.
Eli Accessilla oikea käyttömuoto on IsNull(MAX(era_nro)) joka palauttaa TRUE/FALSE. Eli hieman soveltamalla...
dbCommand.CommandText = "SELECT IIF(ISNULL(MAX(era_nro)),0,MAX(era_nro)) as maxnbr FROM rekisteri WHERE asiakas='" & cmbasiakas.Text & "'"
Nyt tulee jo vaikeaa koodia mulle. Tota pitää jo sulatella että ymmärtäisi sen. Ongelma pysyy edelleen. MsgBox(err.Message) antaa virhetekstiksi "era_nro"
IIF on ehto-rakenne SQL-kyselyille ja on rakenteeltaan
IIF(ehto, palautusarvo jos ehto on True, palautusarvo jos ehto on False)
Tunteeko .Net err.Descriptionia tai mitään vastaavaa? Saisi tarkemman tiedon mikä tuo virhe on.
MsgBox(Err.Description) =An unhandled exception of type 'System.IndexOutOfRangeException' occurred in system.data.dll
Additional information: era_nro
Kohta tipahtaa kokonaan.
.Netissä toimii sekä vanha kunnon error-objekti, että siihen on lisätty vanha kunnon Try, Catch:
Try ...koodia Catch ex as Exception msbbox(ex.Message) End Try
Olisiko mahdollista, että Access ei osaa käsitellä Null-tilannetta tuolla Max-operaattorilla?
Ei sen pitäis olla mahdollista, koska joka sarakkeessa on tietoa.
Jos kyse on tuosta minkä Antti otti esille
Antti kirjoitti:
Olisiko mahdollista, että Access ei osaa käsitellä Null-tilannetta tuolla Max-operaattorilla?
niin voisi kokeilla tiputtaa sen MAX-valinnan pois IsNull-tarkistuksesta tyyliin
dbCommand.CommandText = "SELECT IIF(ISNULL(era_nro),0,MAX(era_nro)) as maxnbr FROM rekisteri WHERE asiakas='" & cmbasiakas.Text & "'"
Yritit suorittaa kyselyn, jossa määritetty lauseke "IIF(ISNULL(era_nro),0,MAX(era_nro))" ei ole funktion osa. En ihan saanut tosta lauseesta kiinni, niin eipä siihen osaa itse tehdä muutoksiakaan.
En minä kauan enää piinaa...
Jos sulla on käytössä Access, (kuten varmaan on), niin kokeile kopioida tuo lauseke
SELECT IIF(ISNULL(era_nro),0,MAX(era_nro)) as maxnbr FROM rekisteri WHERE asiakas='[lisää tähän jokin tunnus joka kannasta löytyy]'
ja tehdä Accessissa kysely (query) käyttämääsi tietokantaan, että palauttaako tuo mitään sitä kautta. Eli onko virhe kyselyssä vai vb:n puolella...
Sama virhe tuli accessissa eli, yritit suorittaa kyselyn, jossa määritetty lauseke "IIF(ISNULL(era_nro),0,MAX(era_nro))" ei ole koostefunktion osa.
Hmmm... mitäköhän yhteyttä tietokantaan mahdat käyttää? MS Jet tukee tuota IIF-lausetta, mutta muista en mene takuuseen...
("Provider=Microsoft.Jet.OLEDB.4.0;")
kayttaja-2845 kirjoitti:
Sama virhe tuli accessissa
Eli virhe on kyselyssä...
Mikä versio Accessista? Lähinnä ajureiden versiot kiinnostaa... Ainakin meikäläisen 97 hyväksyi IIF()-rakenteen nikottelematta...
Access on ver. 2000 ja driver do microsoft access[*.mdb] 4.00.6019.00, pvm. 16.09.2002
Aihe on jo aika vanha, joten et voi enää vastata siihen.