Avatar billede Slettet bruger
13. september 2005 - 21:53 Der er 11 kommentarer og
1 løsning

if exist update else insert

Hey!

Jeg har lavet følgende sql uden noget som helst kendskab til access' if/else.. Jeg tror ikke, det er nødvendigt at forklare, hvad denne query skal gøre, men spørg da endelig løs hvis i er i tvivl om noget.

IF (SELECT count(referid) FROM Time_spent where datediff('d',[Time_spent].[date],#2005-09-13#) = 0 AND referid = 5677) = 1  UPDATE Time_spent SET hours = 1 where datediff('d',[Time_spent].[date],#2005-09-13#) = 0 AND referid = 5677 ELSE INSERT INTO Time_spent (hours,date,referid) values(1,#2005-09-13#,5677) END IF

Vh Mathias.
Avatar billede terry Ekspert
14. september 2005 - 08:39 #1
you cant do this direct in SQL you will need to make some code which checks to see if the record exists.
Avatar billede Slettet bruger
14. september 2005 - 10:42 #2
hmm.. fesent.
Men tak for dit svar - så bliver jeg nødt til at gøre det med 2 dbkald :(..

Smid et svar.

vh Mathias.
Avatar billede terry Ekspert
14. september 2005 - 12:11 #3
.
You could use Dcount in code to see if a record exists alreday and from that use either an update or Insert SQL
Avatar billede Slettet bruger
14. september 2005 - 19:21 #4
Men det er stadig ikke muligt at gøre det med en forespørgsel?
Avatar billede terry Ekspert
14. september 2005 - 19:59 #5
You can not update AND Insert in the same SQL, you need two SQL


You can use DoCmd.RunSQL in code

Example:
Docmd.RunSQL "INSERT INTO Time_spent (hours,date,referid) values(1,#2005-09-13#,5677)"
Avatar billede Slettet bruger
16. september 2005 - 08:26 #6
Jeg vil heller ikke gøre begge dele.. jeg vil det ene eller det andet --> if record exists{UPDATE} ELSE {INSERT}
Avatar billede terry Ekspert
16. september 2005 - 08:47 #7
If Dcount(..... ) > 0 Then 'record exists


Else

End if

another idea is to make sure that yu have a primary key (unique) and then just INSERT. Then if you get an error do an UPDATE
Avatar billede Slettet bruger
16. september 2005 - 18:41 #8
jeg går ud fra at dit eksempel er visual basic i en accessdatabase? Jeg kører visual basic fra excel.. Det jeg leder efter er måde hvorpå jeg med 1 databaseforspørgsel kan indsætte/opdatere alt efter om den pågældende record eksisterer..
Avatar billede terry Ekspert
16. september 2005 - 20:18 #9
14/09-2005 08:39:08

But as I said in my last comment, if you have a primary key then you can just INSERT and if you get an error then UPDATE.
Avatar billede Slettet bruger
17. september 2005 - 09:44 #10
Men så skal jeg have en form for combined primary key da der skal være en record for hver [date]/[referid]-kombination..

Min løsning har været først at selecte dernæst køre en IF-sætning på EOF i visual basic..

Tak for dine svar, jeg accepterer dit svar med, at det ikke er muligt.

Vh Mathias.
Avatar billede terry Ekspert
17. september 2005 - 13:55 #11
you can make a combined primary key in Access. In Table design mode choose View Indexes from the menu and then choose the fields which make up your primary key

tak og god weekend
Avatar billede kjulius Novice
18. september 2005 - 04:46 #12
Du behøver ikke at ændre din primære key. Som default bliver en tabel jo oprettet med Id (autonummerering) som det primære keyfelt. Og det er jo ganske udmærket. Det er der ingen grund til at ændre på.
Heldigvis er det stadig muligt at oprette andre unikke indexer - også kombinationer af felter. Det er nok nemmest at gøre det med en SQL sætning:

CurrentDb.Execute("CREATE UNIQUE INDEX Indexnavn ON Time_spent ([date], [referid])")

Herefter vil du ikke kunne oprette rows, hvis der allerede er en row med de samme værdier i de angivne felter. Det er absolut den bedste måde at sikre sig mod dubletter, især i flerbrugersystemer.

Du kan slette et sådant index igen med en DROP INDEX sql:

CurrentDb.Execute("DROP INDEX Indexnavn ON Time_spent")

Hvis du udfører din INSERT INTO med en CurrentDb.Execute ser det ikke ud til, at der fremkommer en fejl, derfor burde du kunne udføre begge dine sætninger umiddelbart efter hinanden, hvis du bare på din INSERT INTO sætning angiver timeantallet til 0

CurrentDb.Execute("INSERT INTO Time_spent (hours,date,referid) values(0, #2005-09-13#, 5677)")
CurrentDb.Execute("UPDATE Time_spent SET hours = hours + 1 where [date] = #2005-09-13# AND referid = 5677")
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