Avatar billede sirlundgaard Nybegynder
09. oktober 2008 - 16:56 Der er 7 kommentarer og
1 løsning

Hvorfor virker følgende SQL ikke? (ang val, mid og inner join)

jeg har konstrueret nedestående SQL, og denne vil ikke joine. "tblklager.sælgernr" er et nummer på 5 cifre, og de første 3 skal joines med "TblBureau.Sælgernr"

UPDATE TblBureau
INNER JOIN tblklager
ON TblBureau.Sælgernr=VAL(MID(tblklager.sælgernr,1,3))
SET tblklager.[E-mail] = tblbureau.[e-mail]
WHERE (((tblklager.[E-mail]) Is Null)
AND ((tblklager.Behandlet)=0));

Kan I finde fejlen? :D
Avatar billede sirlundgaard Nybegynder
09. oktober 2008 - 17:24 #1
Den siger at "datatyperne stemmer ikke over ens i kriterieudtrykket"
Avatar billede fdata Forsker
09. oktober 2008 - 18:59 #2
Det er <ON TblBureau.Sælgernr=VAL(MID(tblklager.sælgernr,1,3))> den er gal med. Når du joiner skal det ske mellem to "rene" felter.

Du kan let løse problemet ved at skyde en forespørgsel ind imellem, hvor du konverterer sælgernummeret:
- Opret en udvælgelsesforespørgsel baseret på tblklager (vi kalder den Q_Klager)
- Medtag alle relevante felter og tilføj et nyt:
    Sælger: VAL(MID(tblklager.sælgernr,1,3))

Så kan du joine således:
  UPDATE TblBureau
  INNER JOIN Q_Klager
  ON TblBureau.Sælgernr=Q_Klager.Sælger
  osv ...
Avatar billede sirlundgaard Nybegynder
09. oktober 2008 - 19:54 #3
Hvis jeg skal kalde en samlet SQL-string, uden at ændre på database-arkitekturen, hvordan skal det så se ud. Det der med at oprette midlertidige instanser af tabeller og felter er jeg ikke så bekendt med. Har søgt noget inden og er stødt på nogle af de andre svar du har givet, du er great man!, bare ikke noget der helt ramte mit problem on the money... :-)
Avatar billede fdata Forsker
09. oktober 2008 - 22:45 #4
Oprettelse af en forespørgsel ændrer ikke på database-arkitekturen. Det er bare en slags ekstra lag ovenpå.

Men ok, gør følgende:
- Start med at oprette en udvælgelsesforespørgsel (Forespørgsler/Ny)
- Vælg Designvisning og OK
- Klik på tblklager, klik Tilføj og Luk
- Træk stjernen i tabellen tblklager ned i forespørgselsgitteret
- I feltet til højre for stjernen skriver du:
    Sælger: VAL(MID(tblklager.sælgernr,1,3))
- Gem forespørgslen som Q_Klager

Nu har du en forespørgsel, som er fuldstændig magen til din tblklager tabel - men udvidet med et ekstra numerisk felt (Sælger). Du kan fremover bruge Q_Klager i stedet for tblklager. Du kan rette, indsætte og slette - og du kan bruge den i SQL udtryk.

I din kode retter du derfor de første linier fra
  UPDATE TblBureau
  INNER JOIN tblklager
  ON TblBureau.Sælgernr=VAL(MID(tblklager.sælgernr,1,3))
til
  UPDATE TblBureau
  INNER JOIN Q_Klager
  ON TblBureau.Sælgernr=Q_Klager.Sælger

altså: du joiner nu med den nye forespørgsel via det nye (numeriske) felt.

OK?
Avatar billede sirlundgaard Nybegynder
09. oktober 2008 - 23:21 #5
Ja tusinde tak, og selvfølgelig, meget velfortjent accept af svaret!
Avatar billede fdata Forsker
10. oktober 2008 - 16:36 #6
Selv tak - både for de pæne ord og for point  ;o)
Avatar billede sirlundgaard Nybegynder
16. oktober 2008 - 08:33 #7
F-data? Nu er jeg endelig kommet op på arbejde, og SQL'en fejler stadig? Siger stadig "datatyperne stemmer ikke over ens i kriterieudtrykket"
Avatar billede sirlundgaard Nybegynder
16. oktober 2008 - 09:08 #8
Fandt selv ud af det, da der åbenbart ikke var mange gode ting at sige om funktionen val(). Derimod kom MID(tblklager.sælgernr,1,3) ind i et en NZ() og derefter ind i en CINT(). NZ bruges da der kan forekommer NULL. Egentlig kan man også bruge VAL(), men blev bare rådet fra det, måske en eller anden forbipasserende kan fortælle mig hvorfor (eller om det er "sikkert" ;D) Det NZ gør (til andre der er interesseret) er at returnere værdi1, hvis denne ikke er NULL, ellers værdi2, efter syntaxen (NZ(værdi1, værdi2). CINT() ændre blot værdien til en integer. Som sagt, i stedet for CINT() kan man også bruge VAL(), men blev dog ikke tilrådet dette.
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