Access VBA - veldwaarde van een tabel vervangen door veldwaarde uit andere tabel

Status
Niet open voor verdere reacties.

fde

Gebruiker
Lid geworden
31 aug 2017
Berichten
110
Opzet: de bedrijfID van een contactpersoon wijzigen en/of toevoegen in de tabel tbl_contact uit de tbl_bedrijf.

de tabel tbl_bedrijf heeft als primaire sleutel ID_BEDRIJF
de tabel tbl_contact heeft als primaire sleutel ID_CONTACT maar ook een kolom ID_BEDRIJF.

Ik heb hier een eenvoudig form voor gemaakt zijnde frm_bedrijf_contact_toevoegen dat opgeroepen wordt uit de form frm_bedrijf. Broncode = tbl_bedrijf.
Knipsel.JPG
Je selecteert de desbetreffende contactpersoon die gewijzigd dient te worden via de keuzelijst.
Knipsel2.JPG.
Via de knop wijzigen/toevoegen verander je de bedrijfID van de contactpersoon.
Code:
Me.txtIdBedrijfContact.Value = Me.txtIdBedrijf.Value
Dit veld is niet-afhankelijk.
Knipsel3.JPG

Nu is de bedoeling dat de aangepaste id ID_BEDRIJF effectief wordt aangepast in de tabel tbl_contact.

Maar hier laat m'n vba kennis me in de steek. Iemand die me op weg kan helpen aub?
 
Als ik zou snappen wat je aan het doen bent, geen probleem. Maar dat doe ik niet :). Misschien dat een voorbeeldje helpt. Mij lijkt je aanpak nodeloos ingewikkeld. Ik zie twee verschillende ID’s (132 en 888) maar in je formulier hetzelfde bedrijf. Dus dan ben ik al weg. CP’s beheren kan simpel vanuit subformulieren, dus waarom je daar een los formulier voor gebruikt, is mij een raadseltje. Waarom je een VBA code nodig hebt, ook. Zelfs op jouw formulier lijkt mij dat overbodig. Wat zou die code dan moeten doen, dat de query niet kan?
 
Ik dacht dat ik alle informatie heb doorgegeven.
Opzet: de bedrijfID van een contactpersoon wijzigen en/of toevoegen in de tabel tbl_contact uit de tbl_bedrijf.
Nu is de bedoeling dat de aangepaste id ID_BEDRIJF effectief wordt aangepast in de tabel tbl_contact.

Als ik de tabel tbl_bedrijf join met de tabel tbl_contact (in de broncode van de form frm_bedrijf_contact_toevoegen) krijg ik volgende foutmelding tijdens het openen vanuit de form frm_bedrijf.
foutmelding.JPG -
Code:
Private Sub btnContactToevoegenWijzigen_Click()
DoCmd.OpenForm "frm_bedrijf_contact_toevoegen", acNormal, , "ID_BEDRIJF = " & ID_BEDRIJF
End Sub

Kan deze code verder uitgebreid worden zodat deze de ID_BEDRIJF selecteert uit de juiste tabel tbl_bedrijf?
 
Laatst bewerkt:
Nogmaals: ik kan hier weinig aan zien. De foutmelding kan niet veel duidelijker gesteld worden; als je twee tabellen hebt met identieke veldnamen (ID_Bedrijf) dan moet je, als je beide velden in je query hebt staan, daar een andere naam voor gebruiken. En die aanroepen. Wat ik vaak doe, is de namen uniek maken door bijv. in de tabel Bedrijven het veld IDBedrijf te noemen, in in de koppeltabel ID_Bedrijf. Dan zijn de namen afwijkend, en heb je geen probleem. Al mis je vervolgens wel een stukje slimmigheid voor (luie programmeurs dan ;) )
 
Ik tracht mijn vraag anders te formuleren.

Als een contactperoon bedrijf X verlaat en elders (bedrijf Y) gaat werken is het de bedoeling, dat van de desbetreffend contact zijn ID van bedrijf X wordt aangepast naar de ID van bedrijf Y.
 
Laatst bewerkt:
Ik snap je vraag, dat is het probleem niet. Ik snap je inrichting niet. Er zijn, wat mij betreft, twee manieren om met contactpersonen om te gaan.
1. Tabel Bedrijven + BedrijfID + CP_ID; tabel Contactpersonen + CP_ID + Bedrijf_ID
Eigenlijk twee varianten, want als je een CP_ID opneemt in Bedrijven, met een één-op-veel relatie dan kun je voor één CP meerdere bedrijven koppelen (dat kan, je kunt vast bij meerdere bedrijven werken). En andersom: als je in de tabel Contactpersonen een Bedrijf_ID opneemt, kan één bedrijf meerdere CP's hebben met de omgekeerde één-op-veel relatie.
Je hebt dus ofwel Bedrijf --> Contactpersonen of Contactpersoon --> Bedrijven
Niet heel flexibel, want je hebt alleen een actuele status, geen historie. Die raak je kwijt als je een andere CP gebruikt.

2. Koppeltabel tussen Bedrijven en Contactpersonen. Hierin leg je elke combi vast met een CP_ID en een Bedrijf_ID. En eventueel aanvullende gegevens zoals ingangsdatum en einddatum. De constructie is dan:
Bedrijven --> Koppeltabel <-- Contactpersonen. Een veel-op-veel relatie dus.

Hoe dan ook: op het formulier frmBedrijven heb je een subformulier met Contactpersonen waarin je dus meerdere CP's kan vastleggen, en op frmContactpersoon heb je een subformulier met de bedrijven waar die CP de contactpersoon is. Ook die kun je muteren in het subformulier.
In het geval van de koppeltabel baseer je het formulier daar op, en heb je dus twee subformulieren gekoppeld aan die tabel. Al kun je ook met VBA combinaties heen en weer schieten. Daar heb ik ook wel weer leuke voorbeelden voor.

Maar als ik jouw probleem zo lees, dan heb je voldoende aan de eenvoudige oplossing, en doe je dus in mijn ogen veel te moeilijk :)
 
Ik had absoluut niet gedacht aan de oplossing "koppeltabel". Dit geeft inderdaad meer mogelijkheden in beide richtingen.
Ik zal dit proberen uit te werken (lees uitzoeken) en kom er zeker op terug.
 
Ik had absoluut niet gedacht aan de oplossing "koppeltabel". Dit geeft inderdaad meer mogelijkheden in beide richtingen.
Als je databases gaat ontwerpen, dan begin je altijd met het vastleggen van de eisen. Wat moet er kunnen met de database? Met de huidige werkmethodieken (agile, scrum etc) wordt vaak uitgegaan van Userstories en Usecases (ja, modern werken gebeurt gewoon in het Nederlands ;) ). Op basis van die userstories ga je dan een ontwerp maken waarmee je een systeem kan bouwen dat die userstories ondersteunt.

Eén van die userstories had kunnen zijn:
“Ik wil mijn contactpersonen flexibel kunnen onderhouden. Een contactpersoon moet aan een bedrijf kunnen worden gekoppeld, en ik wil overzichten en mailings kunnen maken van en voor die contactpersonen. Als een contactpersoon bij een bedrijf vertrekt, wil ik de contactpersoon kunnen deactiveren. Een contactpersoon mag bij meerdere bedrijven werken, en ik wil de historie van die werkzaamheden kunnen tracen.”

Als je op die manier de vraagstukken definieert, dan leidt dat vanzelf tot een bepaalde tabellenstructuur waarin je de gegevens zodanig kunt opslaan dat de gevraagde output leverbaar is. Jouw manier van werken is dus eigenlijk precies andersom, eerst bouwen en dan kijken of je er wat mee kunt :).

Dat geeft natuurlijk niks, zo is denk ik iedereen wel begonnen. Maar ik raad je aan, voordat je überhaupt Access opstart om een nieuwe database te maken, eerst alles goed uit te denken en door te spreken. Dan heb je achteraf veel minder werk om alles weer om te gooien. Access houdt daar sowieso niet van; ik heb al regelmatig corrupte databases gezien waarin net iets teveel is omgegooid.
 
Beste Michel,

Voor deze koppeltabel heb ik een stukje vba code nodig om input van dubbele records te vermijden.
De koppeltabel (tbl_bedrijf_contact) heeft volgende velden: ID_BEDRIJF_CONTACT - ID_BEDRIJF - DATUM_BEGIN - DATUM_EIND - ID_CONTACT - ID_OPZOEKEN - ID_OPZOEKEN_OMSCHRIJVING.

Met andere woorden: als ID_BEDRIJF en ID_CONTACT in een zelfde record reeds gebruikt zijn mag deze niet opnieuw toegevoegd worden.
Ik gebruik momenteel de volgende code om een contact aan een bedrijf toe te voegen.
Code:
Private Sub btnBedrijfContactToevoegen_Click()
    Dim qsSql As String
    Dim rsRecord As DAO.Recordset
            qsSql = "SELECT* FROM tbl_bedrijf_contact"
            Set rsRecord = CurrentDb.OpenRecordset(qsSql)
                With rsRecord
                    .AddNew
                        !ID_BEDRIJF = Me.txtIdBedrijfNieuw
                        !BEGIN_DATUM = Date
                        !ID_CONTACT = Me.txtIdContact
                        !ID_OPZOEKEN = 15
                        !ID_OPZOEKEN_OMSCHRIJVING = 376
                    .Update
                End With
End Sub

Kan je mij hiermee helpen aub?
 
Laatst bewerkt:
Je gaat er daarbij dus vanuit dat je met een schone lei begint en niemand in het verleden bij een bepaald bedrijf heeft gewerkt en daar later bijvoorbeeld weer is teruggekeerd? Want in dat soort gevallen zou je die persoon wel degelijk twee keer in de tabel mogen hebben. Bovendien: als je nu nog een constructie hebt waarbij je van een CP maar één bedrijf hebt, kan dat sowieso niet voorkomen. Dus wat is dan je probleem?
En waarom gebruik je hier VBA voor? In de tijd die je nodig hebt gehad om die code te schrijven, had je het hele proces van importeren al af kunnen hebben :). Kwestie van je brongegevens uniek maken in een toevoegquery (SELECT DISTINCT). Dan pak je sowieso al unieke Bedrijf_ID + ID_CONTACT records, daar hoef je niks voor te programmeren.
 
Deze koppeltabel heb ik van 't weekend opgevuld. Dus alleszins niet meer leeg.
Momenteel heb ik daar 3005 records aan toegevoegd. 3000 contacten verdeeld over 882 bedrijven.

En als een contactpersoon opnieuw werkzaam zou worden voor een firma waar hij/zij reeds gewerkt had zie ik dat direct in mijn bewegingstabel die ook gekoppeld staat aan mijn contactpersonen.
Dan is het enkel een kwestie het desbetreffende record in de tbl_bedrijf_contact aan te passen. Dus geen dubbele records zoals eerder geschreven.
Me dunkt te zeggen dat iemand terug gaat werken voor een eerdere firma eerder een uitzondering is als regel. Althans ik heb het hier in BE de laatste +- 15 jaar nog niet meegemaakt.

Als je over uitvoerders spreekt dan wordt het verhaal totaal anders.
Lui die via detachering of via interim werken die wisselen geregeld van firma en kunnen inderdaad meerdere keren dezelfde firma hebben. Dit gedeelte is in mijn database ok.
 
Ik wel :). En meerdere malen zelfs! Het is ook niet zozeer de vraag of het bij jullie nu voorkomt, maar meer de vraag: Moet het in de toekomst mogelijk zijn?. Als je die vraag met Ja beantwoord, dan moet je het systeem daarop inrichten. Als je er vanuit gaat dat het nu en in de toekomst niet voor gaat komen (en dat kan natuurlijk best) dan hoef je de db daar niet op in te richten. Anders is het simpel een kwestie van de index aanpassen: een index op [Bedrijf_ID]+[Contact_ID] is nu dus niet genoeg, maar een index op [Bedrijf_ID]+[Contact_ID]+[Startdatum] is dat dus wél. Niemand begint immers twee keer bij hetzelfde bedrijf op dezelfde dag.

Sowieso is het instellen van een index al voldoende om te voorkomen dat je dubbele records toevoegt; als je al 3005 records hebt (en dus evenzovele unieke combinaties) dan zal het toevoegen van een bestaande combinatie niet lukken vanwege die index. Dus als je met een toevoegquery dan nog eens 2012 records wilt toevoegen, en er zijn 18 dubbele bij, dan zal Access melden dat 1994 records zijn toegevoegd en 18 niet. Wil je zelfs dát niet zien, dan haal je in de toevoegquery die dubbele waarden er uit. Ik combineer dan de indexvelden in één veld ([Bedrijf_ID] & "|"& [Contact_ID]) en gebruik een subquery (Not In(SELECT etc. waarbij je dus het veld ([Bedrijf_ID] & "|"& [Contact_ID] gebruikt) om de dubbelen uit de selectie te halen. Werkt ook perfect. Ik zie dus nog steeds geen noodzaak voor een VBA oplossing :).
 
Dag Michel,

Eigenlijk had je in het verleden voor een gelijkaardige situatie de oplossing geboden; ik heb deze naar mijn situatie aangepast.
https://www.helpmij.nl/forum/showthread.php/467561-dubbele-waarden-voorkomen-over-verschillende-velden


Code:
Private Sub btnBedrijfContactToevoegen_Click()
    Dim qsSql As String
    Dim rsRecord As DAO.Recordset
    Dim strSQL As String
strSQL = "SELECT ID_BEDRIJF,ID_CONTACT FROM tbl_bedrijf_contact "
strSQL = strSQL & "WHERE ID_BEDRIJF = " & Me.txtIdBedrijfNieuw
strSQL = strSQL & "AND ID_CONTACT = " & Me.txtIdContact
    With CurrentDb.OpenRecordset(strSQL)
        If .RecordCount > 0 Then
            MsgBox " " & txtContactVoornaam & " " & txtContactNaam & " bestaat reeds voor de klant " & txtBedrijfNaam & " ", , "Bestaand contact"
        Else
            qsSql = "SELECT* FROM tbl_bedrijf_contact"
            Set rsRecord = CurrentDb.OpenRecordset(qsSql)
                With rsRecord
                    .AddNew
                        !ID_BEDRIJF = Me.txtIdBedrijfNieuw
                        !DATUM_BEGIN = Date
                        !ID_CONTACT = Me.txtIdContact
                        !ID_OPZOEKEN = 15
                        !ID_OPZOEKEN_OMSCHRIJVING = 376
                    .Update
                End With
        End If
    End With
End Sub
 
Laatst bewerkt:
Da’s een hele oude draad; zo doe ik het in ieder geval al jaren niet meer :).
 
Status
Niet open voor verdere reacties.
Steun Ons

Nieuwste berichten

Terug
Bovenaan Onderaan