01. januar 2010 - 23:20 Der er 10 kommentarer og
1 løsning

Query til at loade fremmednoegler i Access 2007

Jeg arbejder (som frivillig) for en velgoerende organisation (i Belgien, derfor er nogle af de nedenstaaende navne paa hollandsk) og er i gang med at omlaegge deres Access 2007 database der registrerer frivillige og sympatisanter.  Der er jeg loebet ind i et problem.  Jeg skal foerst give noget baggrund og derefter specificere problemet.

Databasen bestaar af en enkel tabel, VrijwilligersSympathisanten, der ikke er normaliseret.  Jeg har lavet (blandt andet) to nye tabeller (1) Persoon for navn, foedselsdag, o.s.v. og (2) Adres med gade, postnummer, by o.s.v. (tit er mand og kone begge registreret som frivillige.) Persoon indeholder en fremmednoegle til Adres. 

Det er lykkedes mig ved hjaelp af queries med sql statements (og en masse "trial and error") at kopiere data til Persoon og Adres.  Nu skal jeg have fremmednoeglen i Persoon til at vise til de rette primaernoegler i Adres.  Persoon har (blandt andet) disse felter: voornaam, achternaam, adresid (som er fremmednoeglen.)  Adres har id (primaernoeglen), adres, postcode, plaats.  VrijwilligersSympathisanten har Voornaam, Achternaam, Adres, Postcode, Plaats. 

Som oevelse satte jeg tilsvarende tabeller op i phpMySql.  Med det foelgende statement (og blod, sved, og taarer) fik jeg de rette vaerdier in Persoon.adresid:

UPDATE persoon p
SET adresid =
(SELECT id
FROM adres a
JOIN VrijwilligersSympathisanten v ON CONCAT(a.adres, a.postcode) = CONCAT(v.adres, v.postcode)
WHERE CONCAT(p.vornaam, p.achtnaam) = CONCAT(v.Vornaam, v.Achtnaam))

Tilsyneladende forstaar Access ikke CONCAT og vil ikke acceptere JOIN, saa jeg skrev det om til dette:

UPDATE Persoon AS p SET adresId = (SELECT a.id
FROM Adres a
INNER JOIN VrijwilligersSympathisanten v ON a.adres & a.postcode = v.Adres & v.Postcode
WHERE p.voornaam & p.achternaam = v.Voornaam& v.Achternaam);

Jeg lavede samme slags query som jeg brugte til at flytte de andre data og fyldte ovenstaaende statement ind og bevarede og lukkede queriet.  Naar jeg saa dobbelklikker paa querien og efter at have besvaret advarslen om at jeg er i gang med at aendre paa data bliver jeg stoppet med denne tekst: 

"The operation should be performed on a query that can be updated."

Jeg vil selvsagt vaere taknemmelig for al hjaelp der bidrager til at jeg kan loade fremmednoeglerne og komme videre med projektet.
Avatar billede kgkg Nybegynder
01. januar 2010 - 23:59 #1
Normalt får man fejlen: "The operation should be performed on a query that can be updated."

Når der ikke er skriveadgang til mappen hvor databasen ligger.

Hvordan tilgår du databasen? I Ms Access eller via WEB?
Avatar billede Slettet bruger
02. januar 2010 - 01:13 #2
måske virker opdatering på et navneløst view

update [
(vri as v inner join persoon on v.forn=v.fornavn and  v.eftn=p.eftn) inner join Adres as a on v.adres=a.adres and v.postnr=a.postnr)
] set p.id=a.id
02. januar 2010 - 06:53 #3
kgkg,databasen sidder paa en lokal mappe som jeg tilgaar i MS Access.  Jeg kan ikke tro at der kan vaere noget galt med skriveadgangen fordi jeg har kunnet udfoere adskillige queries paa Persoon, blot ikke denne.

ellebe, navnloest view, ikke proevet foer, det lyder interessant.  Dit kodeforslag er hjaelp til selvhjaelp (tak) - jeg har masseret det ved at rette navnene til og eksperimenteret med paranteserne - paranteserne i dit forslag har strukturen [())], jeg har proevet med [()] og [()()], [], og (), men uanset hvordan jeg proever faar jeg beskedden at paranteserne rond om navnet .... er ugyldige, og hvis jeg slettere alle paranteser faar jeg syntaxfejl.  Her er et eksempel paa min tilrettede kode.  Var det noget i den henretning du mente?

UPDATE Person
[(VrijwilligersSympathisanten AS v
  INNER JOIN Persoon AS p ON v.Voornaam=p.voornaam AND v.Achternaam=p.achternaam)
  (INNER JOIN Adres AS a ON v.Adres=a.adres AND v.Postcode=a.postcode)]
SET p.id=a.id

Kan det passe at Access ikke aksepterer subselects?  Et eksperiment jeg gjorde paa et kopi af Persoon var foerst at sige "UPDATE Persoon1 SET adresid = 5" (bare for at se om jeg overhovedet kan update, indtil nu har jeg kun inserted) og det virkede fint.  Men naar jeg proever: "UPDATE Persoon1 AS p SET adresid = (SELECT v.ID FROM VrijwilligersSympathisanten WHERE v.ID=5)" saa faar jeg igen beskedden "The operation should be performed on a query that can be updated.
Avatar billede Slettet bruger
02. januar 2010 - 12:19 #4
sorry -  der mangler et 'select * from' - altså lav en almindelig udvælgelsesforespørgsel:
select * from (VrijwilligersSympathisanten AS v
  INNER JOIN Persoon AS p ON v.Voornaam=p.voornaam AND v.Achternaam=p.achternaam)
  (INNER JOIN Adres AS a ON v.Adres=a.adres AND v.Postcode=a.postcode)

check ved datasheet view at den får det hele med - alle personer.

Omklammer derefter: 'update [ .... ] SET p.id=a.id. og gem.

I access 2000 som jeg anvender sker der en lille ejendommelighed med udrykket (hvilket dog ikke betyder noget for brugen af det) - hvis forespørgsel genåbnes for redigering har access lavet det om til noget som access ikke godkender som den rette syntaks hvis man prøver at gemme igen! -  så redigering er lidt besværlig.

Håber det lykkedes.
Avatar billede Slettet bruger
02. januar 2010 - 12:30 #5
skal være:

select * from (VrijwilligersSympathisanten AS v
  INNER JOIN Persoon AS p ON v.Voornaam=p.voornaam AND v.Achternaam=p.achternaam)
  INNER JOIN Adres AS a ON v.Adres=a.adres AND v.Postcode=a.postcode


og derefter

update (select * from (VrijwilligersSympathisanten AS v
  INNER JOIN Persoon AS p ON v.Voornaam=p.voornaam AND v.Achternaam=p.achternaam)
  INNER JOIN Adres AS a ON v.Adres=a.adres AND v.Postcode=a.postcode) SET p.id=a.id
02. januar 2010 - 14:23 #6
Ellebe, haabet er lysegroent, men humoeret er lidt sort.  (Saa kan du vel gaette hvordan det er gaaet.) 

Din sidste kode var jeg ogsaa kommet frem til ved at proeve mig frem med hvad det tog at faa fejlbeskedderne til at forsvinde.  Saa nu kan jeg gemme querien.  Naar jeg saa dobbelklikker faar jeg beskedden at jeg er i faerd med at aendre 262 records og jeg glaeder mig allerede, men saa faar jeg denne besked (min oversaettelse fra hollandsk)

Microsoft Office Access var ikke i stand til at bearbejde det foelgende: 0 felter paa grund af en fejl ved type omsaetning, 262 records som foelge af noeglekonflikt, 0 records som foelge af laas-konflikt, 0 records som foelge af strid med valideringsregler.

Noeglekonflikt - jeg dobbeltcheckede alle felt-typer og -laengder og noegler men fandt intet der skulle kunne konflikte.  Saa startede jeg forfra med en ny minimal database med tre tabeller Vri, Person, og Addressetabel med lidt data i og proevede forfra, men med samme resultat.  Denne database sidder her:  http://christianjorgensen.be/Database1.mdb  Jeg haaber du har tid til at kikke paa den og at du saa kan aabne den i Access2000.

(Vi er vist allerede ved at overstige vaerdien af de 60 punkter, men det finder vi ud af.)
Avatar billede Slettet bruger
02. januar 2010 - 15:40 #7
Jeg kan desværre ikke læse databasen - har du mulighed for at gemme den som en ældre version.
Avatar billede Slettet bruger
02. januar 2010 - 15:43 #8
Person må ikke have id som primærnøgle og id må ikke have krav til at være unique
02. januar 2010 - 16:24 #9
ellebe, det foerste man bliver blind paa det er oejnene.  Det felt i Persoon der skal updates som fremmednoegle til Adres.id hedder Persoon.adresId, ikke Persoon.id som er primaernoeglen i Persoon og er autoincrement.  Det var naturligvis det der gav noeglekonflikten.  Det lysnede pludselig da jeg baksede med dit sidste indlaeg.  Med den rettelse er det lykkedes, og Persoon.adresId sidder nu fuld med vaerdier. 

Laver du et svar for points?

Altsaa, din oprindelige tanke, at klare det med et navnloes view var var korrekt og virkede da vi fik syntaksen rettet til og min navnefejl korrigeret.  Nu maa jeg igang med at soege efter kilder til at laere om navnloese views.

Laegger du et svar for de 60 points?  Fordi jeg trak saa meget paa dig (5 indlaeg) vil jeg derefter gerne oprette endnu et spoergsmaal med "Points til ellebe."
Avatar billede Slettet bruger
02. januar 2010 - 17:43 #10
Her er så et svar, og jeg vil ikke have flere point. Jeg skriver for at belyse et emne og ikke for pointene.

vedr. termen 'unnamed queries' er det noget jeg kaldte det fordi der ikke optræder et tabel navn for 'sql update' at operere på. Ligesom unnamed variable i en 'with løkke' i vba. Andre end mig har givetvis brugt det, men det er ikke en fast term - i ms-access sammenhænge kan det lige så godt betyder alle de navne som uden at optræde i databasevinduet->faneblad queries alligevel listes af:
Sub showQueryNames()
    Dim q As QueryDef
    For Each q In CurrentDb.QueryDefs
        Debug.Print q.Name: Next
End Sub

Det er de queries som er datakilder i formularer, raporter, liste- og comdo bokse.
02. januar 2010 - 18:45 #11
Mange tak for hjaelpen.

Jeg forudser at der kommer flere spoergsmaal fra mig om Access de naeste par uger.  Jeg proever foerst selv (og proever haardt,) men naar det ikke lykkes er det godt at have et forum at kunne henvende sig til.
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