SQL kald til Acces fra java - problem med datoformat tror vi nok
Forsøger at hive data ud på et bestemt vareId i en bestemt tidsperiode i et Java program: Vores sidste forsøg så således ud :
ResultSet r = stm.executeQuery("SELECT * FROM salgTabel WHERE vareID = " + vareid + " AND salgDato >= "+ datofra + "# AND salgDato <= #" + datoTil + "#");
Hvilket gav følgende fejl :
Fejl ved SQL-exeqution 1: [Microsoft][ODBC Microsoft Access-driver] Der er en syntaksfejl i datoen i forespørgselsudtrykket "vareID = 2 AND salgDato >= #11.01.2002# AND salgDato <= #12.31.2002#".
Har forsøgt uendelige kombinationer med/uden #, med datoformat dd.mm.yyyy, mm.dd.yyyy,dd-mm-yyyy,mm-dd-yyyy uden held!!! :o(
Hvad er problemet? eller hvad er det rigtige kald/den rigtige måde at gøre det på?
Jeg går ud fra at DatoFra og DatoTil begge er indlæst i et gyldigt datoformat. Er dette ikke tilfældet, skal du først bruge DateValue funktionen, så du får et korrekt datoformat.
Altså vi har virkelig forsøgt alle tænkelige kombinationer hvad angår ændring af datoformat, ændring af syntaks. Men vi er måske ikke sikre på at selve sql sætningen kan fungerer med 3 stk . AND.
Vi aner bare overhovedet ikke hvordan den der FORMAT metode skal anvendes, så paster lige hele vores java metode der laver sqlkaldet - selve sql kaldet er jo så blevet ændret 1000 gange så det skal der ikke lægges for meget i, da intet af det har fungeret :o) :
public void dagStatistik(String datofra,String datoTil, String vareid){ try{ ResultSet r = stm.executeQuery("SELECT vareID, salgDato FROM salgTabel WHERE vareID = " + vareid + " AND salgDato > #" + datofra + "# AND salgDato <#" + datoTil+ "#"); while(r.next()) {
} }catch(SQLException e){ System.err.println("Fejl ved SQL-exeqution 1: "+e.getMessage()); } }
Hm det kan sagtens være. Altså selve sql kaldet er jo en string vi strikker sammen af diverse variabler. men måske skal vi bruge format på disse variabler inden? i så fald vil vi stadig meget gerne vide HVORDAN man bruger Format i contexten.
der findes ingen salgData kolonne. vi har 4 kolonner, salgNummer (autonum), salgDato (dato i format dd-mm-aaaa) og så har vi et vareID og vareNavn som er er tekst begge to.
Ehm det med SQL koden i acces har vi ikke forsøgt, tror ikke jeg aner hvordan man gør. Vi har oprettet en forespørgsel i acces som matcher det vi gerne vil gøre og kigget i sql koden til det og det blev til: SELECT salgTabel.vareID, salgTabel.salgDato FROM salgTabel WHERE (((salgTabel.vareID)="2") AND ((salgTabel.salgDato)>#11/11/2002# And (salgTabel.salgDato)<#12/15/2002#)) ORDER BY salgTabel.vareID, salgTabel.salgDato;
Men da vi forsøgte at 'oversætte' det til vores kode, gik det alligevel ikke.
Ikke for at blive ved med at rode rundt i mit manglende kendskab til java, men i SQL afsluttes sætningen normalt med ; I nyere versioner er access vistnok relativt ligeglad, men har du ikke fået ; på den gale side af tekststrengen?
Hm det virker så slet ikke - java accepterer ikke ; midt i en String... den Format metode, stammer den fra SQL? så kunne jeg evt læse mere om den...
Vi kan kontrollere selve datoformatet hvad angår tegn fuldstændig, men ved ikke helt om jeg forstår hvad format gør? ændrer den bare tegnene eller er det noget mere vigtigt?
Som du kan se af din egen kommentar (23:26:02) så afsluttes SQL-sætninger med ; men det skal altså være en del af tekststrengen, der udgør din SQL-sætning.
Format - funktionen er en Access visual basic funktion som blot laver datoen om til en tekststreng efter det angivne format. Dvs. Format's funktion i dette tilfælde er blot at sikre at datoen skrives korrekt i tekststrengen.
Ok - virker stadig ikke men fejlen ændrer sig lidt - her er status : variablerne datoFra og datoTil er String som kommer i format dd/mm/yyyy
kaldet ser nu sådan her ud efter efter superjaps forslag:
ResultSet r = stm.executeQuery("SELECT * FROM salgTabel WHERE vareID = " + vareid + " AND salgDato >= # Format( " + datofra + ";'mm/dd/yyyy') # AND salgDato <= # Format( " + datoTil + ";'mm/dd/yyyy') #;");
og fejlen blíver nu :
Fejl ved SQL-exeqution 1: [Microsoft][ODBC Microsoft Access-driver] Der er en syntaksfejl i datoen i forespørgselsudtrykket "vareID = 2 AND salgDato >= # Format( 01/11/2002;'mm/dd/yyyy') # AND salgDato <= # Format( 31/12/2002;'mm/dd/yyyy') #".
Hehe godt forsøg Arne v - men den vil den heller ikke sluge - Fejl ved SQL-exeqution 1: [Microsoft][ODBC Microsoft Access-driver] Datatyperne stemmer ikke overens i kriterieudtrykket.
Men det er lidt svært at tackle, fordi vi jo udover selve kaldet, heller ikke ved hvordan selve datoTil,datofra variablerne skal se ud...
Det er da pudsigt at der nu i fejlmeddelelsen stå f.eks. 01/11/2002 når der tidligere stod 11.01.2002. Når der står sådan skulle det jo ikke være nødvendigt at bruge Format funktionen.
Det er slet ikke pudsigt, som jeg skriver kan vi ændre den frit der hvor variablen bliver sat i en anden klasse. Så den kan sætte til at være lige det den skal være.
Altså vores dokumentation om SQL og acces siger faktisk at man skal bruge . i datovariablen...men vi tester med alle tre...og intet virker... Ej heller blot at tilføje et ; til sidst i den org sætning.
Det betyder vel at DatoFra og DatoTil egentligt er tekststrenge. Det betyder at Format-funktionen IKKE virker på dem. Så skal vi faktisk tilbage til dit oprindelige forslag med DateValue. Dog kan DateValue ikke forstå alt (jfr. nedenstående), og så skulle det i øvrigt heller ikke være nødevendigt med #'erne.
Fra Access' hjælp Hvis dato er en streng, som kun indeholder tal, der er adskilt af gyldige datoseparatorer, genkender DateValue rækkefølgen for måned, dag og år i overensstemmelse med det korte datoformat, du har angivet i systemet. DateValue genkender også utvetydige datoer, der indeholder månedsnavne i enten lang eller kort form. Udover at genkende 30-12-1991 og 30-12-91, genkender DateValue f.eks. også 30. december 1991 og 30. dec. 1991.
Jeg har lige løst problemet ser det ud til. Tog SQL koden fra Acces-forespørgslen og brugte den lidt mere ordret end første gang hvilket inkluderer en forfærdellig masse ((())) og sådan...men nu er der sq ingen fejl :o) Weeee.... Jeg er ikke ekspert i eksperten.dk men kigger på alt det med point når jeg mødes m min gruppe igen imorgen.
kodekaj Synes du ikke du skulle få gjort noget ved det her spørgsmål - få det kommenteret eller få det lukket?
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.