[VBA/Access] Toevoegen indien niet bestaat, anders updaten *

Pagina: 1
Acties:
  • 337 views sinds 30-01-2008
  • Reageer

  • Tremmie
  • Registratie: Maart 2004
  • Laatst online: 14-05 18:59
Ik heb een formulier in access met daarop een listbox, ook wel keuzelijst met invoervak genoemd. Vanuit deze listbox wil ik een persoon selecteren en heb daarom als rijbron opgegeven:
SQL:
1
2
3
4
5
6
7
8
9
10
SELECT 
    Persoon.Persoon_id, 
    Persoon.Achternaam, 
    Persoon.Voornaam, 
    Persoon.Tussenvoegsel 
FROM 
    Persoon 
ORDER BY 
    [Achternaam], 
    [Voornaam]; 

Dit werkt prima. Nu wil ik dat een aantal tekstvelden gevuld worden, op het moment dat een persoon in de listbox gekozen wordt. Het gaat hier om velden als Voornaam, achternaam etc. Dit doe ik met een vb scriptje die ik neerzet bij 'Na bijwerken' in de listbox. Deze ziet er zo uit:
code:
1
2
3
Private Sub Keuzelijst_met_invoervak_AfterUpdate()
    Me.Voornaam = DLookup("Voornaam", "Persoon", "Persoon_id=" & [Keuzelijst met invoervak])
    Me.Achternaam = DLookup("Achternaam", "Persoon", "Persoon_id=" & [Keuzelijst met invoervak])


En ja, de velden worden netjes gevuld. Nu wil ik deze gegevens ook nog opslaan in de tabel Persoonsgegevens (dezelfde tabel als waar de gegevens vandaan komen, maar dan aangepast). Bij het saven maakt deze echter een nieuwe Persoon_id aan, met als gevolg dat deze persoon er twee keer in staat. Dit wil ik niet. Normaal gesproken zou je dan gewoon een update query kunnen bakken, maar nu weet ik het niet. Het is namelijk niet altijd een bestaande persoon, je moet ook een nieuwe persoon kunnen toevoegen. Hierbij wordt er dus niks geupdate. Verder staan er nog meer velden op het formulier, die gebruik maken van meerdere tabellen en toch grotendeels afhankelijk zijn van elkaar. Het is de bedoeling dat het hele formulier in één keer opgeslagen wordt.

Toen bedacht ik me dat ik ook best een tekstveld erbij kon zetten, waarin het persoonsid komt te staan, nadat een persoon in de listbox is geselecteerd. Als ik dit tekstveld dan invisible maak, ziet niemand het en kan ik toch de gegevens hier uit halen, zodat ik hiermee kan saven. Het is niet netjes natuurlijk en werkt ook nog is voor geen meter, tenzij ik het besturingselement van het tekstveld weghaal(Persoon_Persoons_id), maar dan saved (update) ie weer niet goed. Hij kan dus niet een waarde geven aan een tekstveld dat als besturingselement een primary key heeft met auto nummering. Kortom: Ik ben een access noob. Help mij.

[ Voor 5% gewijzigd door gorgi_19 op 26-08-2004 14:01 ]


  • gorgi_19
  • Registratie: Mei 2002
  • Laatst online: 06:53

gorgi_19

Kruimeltjes zijn weer op :9

topictitle opgepoest, MS Access vraagje zegt zo weinig over de inhoud.

Verder code-tags in je post gezet. Wil je een betere titel, dan hoor ik dit graag van je.
Geef dan ook gelijk een andere titel.

Digitaal onderwijsmateriaal, leermateriaal voor hbo


  • yrew
  • Registratie: Augustus 2001
  • Laatst online: 22-05 17:18
Ben ook een access noob.

Als hij tekens een nieuwe aanmaakt, dan kun je toch ook gewoon de oude verwijderen. Het ID had je namelijk al zei je.

Groetjes


  • Tremmie
  • Registratie: Maart 2004
  • Laatst online: 14-05 18:59
Verwijderen kan niet, omdat de Persoon_ids gebruikt worden in andere tabellen. Dan loopt alles in de soep.

  • yrew
  • Registratie: Augustus 2001
  • Laatst online: 22-05 17:18
Kunnen er ook nieuwe personen aangemaakt worden op dat formulier? Zo ja, hou je zelf bij dat er een nieuwe aangemaakt wordt? Als dit het geval is dan kun je toch zelf bepalen of je een update of een insert doet in de database?

Groetjes


  • Bud_s
  • Registratie: Maart 2002
  • Laatst online: 23-05 13:46
in je afterupdate iets als :

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
Dim dbs As Database
Dim rs As Recordset
Set dbs = CurrentDb()
Set rs = dbs.OpenRecordset("Persoon_ID")

rs.Index = "PrimaryKey"
rs.Seek "=", (Me![Achternaam), (Me![Voornaam])    ' Zoek Achternaam,Voornaam 

If rs.NoMatch Then                                '  Bestaat niet ? , dan toevoegen
    rs.Addnew
    rs.Fields("Achternaam").Value = Me![Achternaam]
    '  en overige velden .....
    rs.Update
Else                                              ' Bestaat wel ? dan benodigde velden aanpassen
    rs.Edit
    rs.Fields("Achternaam").Value = Me![Achternaam]
    '  en overige velden .....
    rs.Update
End If



Ik ga er hier wel even vanuit dat de primarykey bestaat uit achternaam,voornaam !!!

  • BestTested!
  • Registratie: Oktober 2003
  • Laatst online: 20:37
Is er niet een manier om het aantal verandere velden terug te vragen van een query. (Ik programmeer niet in VBA maar in VB en daar kan dat namelijk wel.) Je zou dan de update query kunnen uitvoeren, zijn er geen records ge-update dan een insert uitvoeren op je andere tabel.

  • Bud_s
  • Registratie: Maart 2002
  • Laatst online: 23-05 13:46
Bedoel je met de Property .OldValue ?? is ook nog mogelijk natuurlijk :)

btw: VBA is zo slecht nog niet :)
Pagina: 1