Avatar billede kodekaj Nybegynder
14. december 2002 - 19:59 Der er 49 kommentarer

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å?

På forhånd tak!!
Avatar billede sjap Praktikant
14. december 2002 - 20:55 #1
Prøv at formatere "DatoFra"  og "DatoTil" med funktionen Format:

Format(DatoFra;"dd-mm-yyyy")
Avatar billede sjap Praktikant
14. december 2002 - 20:56 #2
Problemet kan i øvrigt være at rækkefælgen skal være "amerikansk":

Format(DatoFra;"mm-dd-yyyy")
Avatar billede sjap Praktikant
14. december 2002 - 21:00 #3
Jeg har ikke prøvet det, men det kan være at formatet skal stå med skråstreger:

Format(DatoFra;"mm/dd/yyyy")

og så skal der være en # på hver side.
Avatar billede sjap Praktikant
14. december 2002 - 21:03 #4
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.
Avatar billede articfruit Nybegynder
14. december 2002 - 21:26 #5
I første omgang kan I prøve at skifte * ud med % ellers virker det ikke fra jave.
Avatar billede arne_v Ekspert
14. december 2002 - 22:06 #6
salgDato >= #15/01/2002#

eller:

salgDato >= #01/15/2002#

bør virke (afhænger af opsætning af PC).
Avatar billede kodekaj Nybegynder
14. december 2002 - 22:27 #7
Hvor skal Format koden kaldes i koden? Er det en Java eller en SQL kommando?
#01/15/2002# formatet. virker heller ikke.

PS * bruges i java/sql når det er en access base. og den virker fint i al vores anden kode.
Avatar billede kodekaj Nybegynder
14. december 2002 - 22:29 #8
Og desuden har vi forsøgt alle de forskellige datoformater, som vi også skrev i spørgsmålet :o)
Avatar billede arne_v Ekspert
14. december 2002 - 22:29 #9
Selvfølgelig virker * i jeres SELECT.

arcticfruit må tænke på LIKE - som I altså slet ikke bruger.
Avatar billede kodekaj Nybegynder
14. december 2002 - 22:42 #10
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());
    }
}
Avatar billede arne_v Ekspert
14. december 2002 - 22:46 #11
Der er ikke noget problem med 3 AND - heller ikke med 30 AND !

Og I har prøvet at kalde med både "#dd/MM/yyyy#" og "#MM/dd/yyyy#" ?

Og I begge tilfælde får i:
  Der er en syntaksfejl i datoen
?
Avatar billede kodekaj Nybegynder
14. december 2002 - 22:53 #12
Har lige prøvet at teste dem begge - og i begge tilfælde får vi fejlen:

Fejl ved SQL-exeqution 1: [Microsoft][ODBC Microsoft Access-driver] Datatyperne stemmer ikke overens i kriterieudtrykket.
Avatar billede arne_v Ekspert
14. december 2002 - 22:56 #13
Hvad data type har salgData i tabellen ?
Avatar billede arne_v Ekspert
14. december 2002 - 22:57 #14
Meget relevant, fordi det er jo en anden fejl en den i det
oprindelige spørgsmål.

Jeg tror, at den nu har accepteret argumentet, men at
salgDato måske ikke er en Date/Time.
Avatar billede kodekaj Nybegynder
14. december 2002 - 23:11 #15
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.
Avatar billede arne_v Ekspert
14. december 2002 - 23:12 #16
ALtså java metoden bliver kaldt med en string.

Men nede i access databasen i tabel salgTabel - hvilken
data type har feltet salgDato ?
Avatar billede kodekaj Nybegynder
14. december 2002 - 23:13 #17
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.
Avatar billede arne_v Ekspert
14. december 2002 - 23:15 #18
Hvis I prøver i Access at oprette en query med jeres
SQL sætning - virker den ?
Avatar billede kodekaj Nybegynder
14. december 2002 - 23:16 #19
For lige at pensle det ud så er salgDato "Dato og klokkeslæt"  :o) Vi har så sat den til "Kort datoformat" under "Format"
Avatar billede kodekaj Nybegynder
14. december 2002 - 23:26 #20
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.
Avatar billede sjap Praktikant
14. december 2002 - 23:31 #21
Det kan godt tænkes det ikke virker i java (men det gør det i VBA), men mit forslag var egentligt følgende:

ResultSet r = stm.executeQuery("SELECT * FROM salgTabel WHERE vareID = " + vareid + " AND salgDato >= #"+ Format(DatoFra;"mm/dd/yyyy") + "# AND salgDato <= #" + Format(DatoTil;"mm/dd/yyyy") + "#");

Der manglede iøvrigt en # i dit oprindelige spørgsmål.
Avatar billede kodekaj Nybegynder
14. december 2002 - 23:32 #22
Det prøver jeg lige med det samme superjap :o)
Avatar billede sjap Praktikant
14. december 2002 - 23:37 #23
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?
Avatar billede sjap Praktikant
14. december 2002 - 23:38 #24
Prøv evt. at sætte et semikolon umiddelbart efter den sidste #.
Avatar billede kodekaj Nybegynder
14. december 2002 - 23:38 #25
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?
Avatar billede kodekaj Nybegynder
14. december 2002 - 23:41 #26
Hehe i java afsluttes alle kodelinjer med en ; - derfor er den der :o)
Avatar billede kodekaj Nybegynder
14. december 2002 - 23:44 #27
Ok, roder lidt rundt, så kan vist godt skrive ; i min string alligevel. tester straks igen.
Avatar billede sjap Praktikant
14. december 2002 - 23:44 #28
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.
Avatar billede arne_v Ekspert
14. december 2002 - 23:46 #29
Helt vildt gæt:

ResultSet r = stm.executeQuery("SELECT vareID, salgDato FROM salgTabel WHERE vareID = " + vareid + " AND salgDato > '#" + datofra + "#' AND salgDato < '#" + datoTil+ "#'");

(jeg har sat 4 single-plinger ind)
Avatar billede kodekaj Nybegynder
14. december 2002 - 23:47 #30
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') #".


????
Avatar billede sjap Praktikant
14. december 2002 - 23:49 #31
arne v

vil det ikke blot få datoerne til at stå som tekststrenge i SQL-sætningen - dvs. SalgDato sammelignes med tekststrenge?
Avatar billede arne_v Ekspert
14. december 2002 - 23:50 #32
Jo. Men måske sker der noget underligt på den lange
vej Java->JDBC->ODBC->Access !
Avatar billede kodekaj Nybegynder
14. december 2002 - 23:50 #33
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...
Avatar billede sjap Praktikant
14. december 2002 - 23:55 #34
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.
Avatar billede kodekaj Nybegynder
14. december 2002 - 23:55 #35
Altså vi har 5-6 andre SQL kald som virker fint m variabler og lign, men så snart vi skulle bruge datoer gik det galt :o)
Avatar billede sjap Praktikant
14. december 2002 - 23:57 #36
Har du iøvrigt prøvet den oprindelige sætning med et semikolon til sidst?


ResultSet r = stm.executeQuery("SELECT * FROM salgTabel WHERE vareID = " + vareid + " AND salgDato >= #" + datofra + "# AND salgDato <= #" + datoTil + "#;");
Avatar billede kodekaj Nybegynder
14. december 2002 - 23:59 #37
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.
Avatar billede kodekaj Nybegynder
15. december 2002 - 00:03 #38
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.
Avatar billede sjap Praktikant
15. december 2002 - 00:07 #39
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.
Avatar billede sjap Praktikant
15. december 2002 - 00:12 #40
Prøv evt. at se nedenstående

http://www.eksperten.dk/spm/210883
Avatar billede sjap Praktikant
15. december 2002 - 00:14 #41
Du kan eventuelt også lige checke

http://www.eksperten.dk/spm/288716

de skriver en hel masse som jeg ikke forstår, men måske gør du. :-)

Jeg er desværre nødt til at se dyner nu - håber du finder en løsning.
Avatar billede arne_v Ekspert
15. december 2002 - 00:16 #42
Det er en lidt anden problem-stilling, nemlig Date ind og ud.
Her er det Date i WHERE.
Avatar billede kodekaj Nybegynder
15. december 2002 - 00:19 #43
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.
Avatar billede kodekaj Nybegynder
15. december 2002 - 00:28 #44
Bare for info's skyld er her kaldet, som ikke foreløbig giver nogen fejl :o)

    ResultSet r = stm.executeQuery("SELECT vareID, vareNavn, salgDato FROM salgTabel WHERE (((vareID)=' " + vareid + "') AND ((salgDato)>#" + datofra + "# And (salgDato)<#" + datoTil + "#));");
Avatar billede terry Ekspert
15. december 2002 - 10:06 #45
just a note on dates. They should always be in the US fromat MM/DD/YY or yyyy/mm/dd
Avatar billede arne_v Ekspert
15. december 2002 - 14:49 #46
Meget mystisk.

Comparison operators bør have højere precedens end AND og
så bør de parenteser være optional.

Nå men skidt pyt - det vigtigste er vel at det virker.
Avatar billede terry Ekspert
15. december 2002 - 14:56 #47
They arent needed here, or at least not all of them
Avatar billede sjap Praktikant
15. december 2002 - 15:25 #48
I første omgang er det vigtigst, at det virker. Så kan kodekaj begynde at fjerne parenteserne bagefter - hvis han vil gøre koden mere overskuelig.
Avatar billede sjap Praktikant
28. april 2003 - 14:31 #49
kodekaj
Synes du ikke du skulle få gjort noget ved det her spørgsmål - få det kommenteret eller få det lukket?
Avatar billede Ny bruger Nybegynder

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.

Loading billede Opret Preview
Kategori
Dyk ned i databasernes verden på et af vores praksisnære Access-kurser

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester