ene tabel vullen met gegevens vanuit de andere tabel

Status
Niet open voor verdere reacties.

AtroX

Gebruiker
Lid geworden
29 jul 2009
Berichten
29
Hoi,

ik ben terug bezig met een opdracht voor een vriendin en ik weet het zelf even niet. De database is eenvoudig opgebouwd maar het gaat me over een macro die ik wil maken.

tbl1: tblArtsen (id, naam, voornaam, adres, actief, ...)
tbl2: tblMeeting (id, meeting, locatie, datum, ...)
tbl3: tblRBSPS (id, meeting_id, arts_id, ingeschreven, betaald, aanwezig, ...)

De database gaat om het bijhouden van informatie bij het organiseren van medische meetings waarbij de artsen uit de tabel tblArtsen uitgenodigd worden.

Nu heb ik een formulier waarbij ik een nieuwe meeting kan invoegen in de tblMeeting maar ik wil daar een extra knop bij die het volgende doet:

de id van alle actieve artsen uit de tblArtsen moeten automatisch ingevoegd worden in tblRBSPS samen met de id van de meeting.

Het zal dus zo zijn dat de id van een arts meerdere keren in tblRBSPS voorkomt maar telkens voor een andere meeting (misschien niet ideaal maar ik zag geen andere mogelijkheid).

een stappenplan (volgens mij toch):
- SELECT meeting_id in tblMeeting (dat is de meeting_id van het record dat op dat moment actief is in je formulier wanneer je op de knop drukt)
- SELECT alle arts_id waar active = true in tblArtsen
- ALS er nog geen record bestaat waar de meeting_id en arts_id samen voorkomt
INSERT meeting_id en arts_id (meeting_id heb je in het formulier waar de knop staat) in tblRBSPS
ANDERS overslaan en volgende controleren/invoegen

Die controle is nodig wanneer je later nog artsen toevoegt hebt aan tblArtsen en die ook naar de meeting komen. Dan mogen enkel de nieuwe nog toegevoegd worden.

Iemand die het licht ziet? :)
 
Ik begrijp nog niet helemaal wat de bedoeling is van de knop die je wilt maken:

de id van alle actieve artsen uit de tblArtsen moeten automatisch ingevoegd worden in tblRBSPS samen met de id van de meeting

Wil je alle artsen die de status Actief hebben toevoegen aan de tabel tblRBSPS met een MeetingID die je haalt uit de tabel tblMeeting? Dat kun je simpel oplossen met een toevoegquery, waarvoor je dan een simpele macroknop kunt maken.
Je hebt in de tabel tblRBSPS een ID veld opgenomen. Ik weet niet of dat ook je sleutelveld is, maar ik zou een sleutel definiëren op basis van meeting_id, arts_id om te voorkomen dat je artsen dubbel toevoegt aan een meeting, wat mij niet de bedoeling lijkt. Uiteraard kun je een arts wel toevoegen met een andere meeting, maar de combinatie arts-meeting lijkt mij een unieke combinatie, en dus je feitelijke sleutel. Door een apart ID veld als sleutel toe te voegen raak je de db controle op die combinatie kwijt.

De toevoegquery die je nodig hebt, kun je een filtering meegeven waarbij je alleen artsen selecteert die nog niet met een bepaalde meetingID zijn gematched, in wezen een standaardquery dus!
Mocht je hulp nodig hebben bij het maken, dan wil ik je wel een voorzetje doen!

Michel
 
Hoi Michel,

je hebt gelijk wat betreft de ID van tblRBSPS: eigenlijk kan elke combinatie van meeting_id en arts_id slechts eenmaal voorkomen en is dat eigenlijk de sleutel. De ID van elke toevoeging aan tblRBSPS is dan eigenlijk overbodig. Er moet toch nooit geselecteerd worden op die ID, enkel op de combinatie van meeting_id en arts_id.

Het is ook deze combinatie die moet gecontroleerd worden voordat nieuwe waarden toegevoegd worden.

Ik ben qua access geen groot licht als het op query's en macro's aankomt. Ik ben (zoals gewoonlijk) weer te optimistisch begonnen aan die opdracht :eek:

Ik ga morgen even de database op orde zetten en bijvoegen!

Dan zie je misschien beter wat ik bedoel!

Bart
 
Laatst bewerkt:
Hoi,

eindelijk heb ik de tijd gevonden om dit hier te plaatsen :eek:

Dus als ik vanuit het formulier frmMeeting op de knop Make Meetinglist moet de ganse lijst van firma id's in de tabel tblRBSPS opgenomen worden samen met de id van de meeting waarop het formulier stond.

Er mogen geen dubbele waarden voorkomen dus er moet telkens gecontroleerd worden of de combinatie meeting_id en firma_id nog niet bestaat.

greetingz
 

Bijlagen

  • firma's.rar
    51,5 KB · Weergaven: 51
Ik denk wel dat ik 'm voor je heb...
De knop gebruikt een MeetingID, die ik heb toegevoegd aan je formulier, en een SQL string om een Insert Into query te maken, waarbij een check zit op firma's die nog niet in de tabel tblRBSPS opgenomen zijn. Ik heb aan de tabel ook een veld [Datum_Toegevoegd] toegevoegd, zodat je een referentie hebt wanneer bedrijven zijn toegevoegd. Altijd handig...

Ik heb er geen check bij gedaan op aantal; dat zou het wel afmaken, als je op de knop drukt en er zit niks in om toe te voegen zou je dan bijvoorbeeld een boodschap op het scherm kunnen zetten. Is echter niet noodzakelijk.
Ik heb de essentie van de knop ook nog in een query gezet; kun je wat makkelijker zien hoe hij werkt.

Michel
 

Bijlagen

  • Meetings.rar
    67,4 KB · Weergaven: 53
WOW dat is snel! :thumb: Ik zal het eens bestuderen. Ik heb een gelijkaardige tweede database maar dan niet met bedrijven maar met artsen. Dit stukje script moet daar ook in.

Nu kan ik met jouw "handleiding" eens zelf aan de slag. Zo leert een mens al wat bij. :D
 
Je had het in eerste instantie ook nog over 'Actieve' artsen. Zo'n soort veld zat niet in je voorbeeld, maar waarschijnlijk kun je dat nu er zelf wel bij frutselen. Zo niet, dan hoor ik het wel weer!

Michel
 
Je had het in eerste instantie ook nog over 'Actieve' artsen. Zo'n soort veld zat niet in je voorbeeld, maar waarschijnlijk kun je dat nu er zelf wel bij frutselen. Zo niet, dan hoor ik het wel weer!

Inderdaad, gewoon een WHERE-voorwaarde bijlappen denk ik.

Ik had wel nog een paar vraagjes:

SELECT tblFirm.Firma_Id, 2 AS Expr1
--> hier haal je de firma_id op, maar wat betekent 2 AS Expr1?

WHERE (((tblFirm.Firma_Id) Not In (select Firma_id from [tblRBSPS Sponsors] where Meeting_id=2)));
--> hier geef je nu een vaste waarde voor de meeting_id op. Maar wat als de meeting id nu 3 of 4 is?
 
Was ik nog vergeten aan te passen... In de code van het formulier zie je dat ik de MeetingID van het formulier afhaal en in een variabele zet. De quey hoef je dan ook verder niet te gebruiken, de 2 is gebruikt als voorbeeld.
Je zou, als je de query variabel wilt houden, daar nog een parameter van kunnen maken.
Krijg je zoiets:

Meeting_id=[Typ de MeetingID:]

Michel
 
Hey OctaFish,

ik heb jouw code gebruikt voor een gelijkaardige db maar ik krijg steeds de melding dat er een fout in zit.

Heb jij nog iets anders veranderd buiten het plaatsen van die programmacode en het aanpassen van de veldnamen?

Private Sub btnMakeMeetingList_Click()
Dim strSQL As String, iMeeting As Integer

iMeeting = Me.txtid
DoCmd.SetWarnings False
strSQL = "INSERT INTO [tblRBSPS Plastic Surgeons] ( Surgeon_Id, Meeting_Id ) " & vbCrLf
strSQL = strSQL & "SELECT tblPlastic Surgeons.Surgeon_Id, " & iMeeting & " AS Expr1 " & vbCrLf
strSQL = strSQL & "FROM tblPlastic Surgeons " & vbCrLf
strSQL = strSQL & "WHERE (Surgeon_Id Not In (select Surgeon_Id from [tblRBSPS Plastic Surgeons] where Meeting_Id=" & iMeeting & "));"

DoCmd.RunSQL strSQL
DoCmd.SetWarnings True

End Sub

Hij zegt dat er een operator ontbreekt in query-expressie tblPlastic Surgeons.Surgeon_Id

Vanwaar komt die 'Me' in Me.txtid ?

(het is toch niet hoofdlettergevoelig he?)

grtz
 
Eerst maar het laatste deel van de vraag: Me. is een manier om te verwijzen naar opbjecten in Access. Als je een variabele wilt vullen vanuit een formulier, moet je verwijzen naar de naam van het object. Je kunt dus een variabele iMeeting vullen met iMeeting=txtId. Geen probleem!
Door de verwijzing te beginnen met 'Me. ' toont Access een lijst met alle bekende opbjecten. Als je 'Me.txt' typt, zie je alle objecten die met txt beginnen. Vervolgens hoef je alleen maar de juiste te selecteren. Door Me. te gebruiken verklein je dus de kans op typfouten. Me is verder niet hoofdlettergevoelig, het maak niet uit of je het met een hoofdletter of kleine letter typt.

Hij zegt dat er een operator ontbreekt in query-expressie tblPlastic Surgeons.Surgeon_Id
Dit houdt meestal in dat er gezocht wordt naar een veld, dat er niet is. Dat kan een veld zijn in de brontabel, een veld in de doeltabel of ook wel een gegeven op het formulier. In dit geval lijkt het er op, dat er een verkeerde tabelverwijzing is.
Je kunt de query opvragen in een tekstbox, en na de foutmelding een nieuwe query maken, waar je de tekst in plakt. Pas eerst de code als volgt aan:

Dim tmp as String
strSQL = "INSERT INTO [tblRBSPS Plastic Surgeons] ( Surgeon_Id, Meeting_Id ) " & vbCrLf
strSQL = strSQL & "SELECT tblPlastic Surgeons.Surgeon_Id, " & iMeeting & " AS Expr1 " & vbCrLf
strSQL = strSQL & "FROM tblPlastic Surgeons " & vbCrLf
strSQL = strSQL & "WHERE (Surgeon_Id Not In (select Surgeon_Id from [tblRBSPS Plastic Surgeons] where Meeting_Id=" & iMeeting & "));"
tmp=Inputbox("","",strSQL)
DoCmd.RunSQL strSQL

Als je de code nu uitvoert, krijg je een tekstbox te zien, met de SQL die wordt uitgevoerd. Kopieer deze code, en plak hem bijvoorbeeld in Kladblok als backup.
Klik vervolgens op OK, en klik de foutmelding weg.
Maak nu een nieuwe query, selecteer geen tabel en sluit dus het venster <Tabel weergeven> gelijk. Nu heb je in het ontwerpvenster een knop <SQL>. Daar klik je op, en plak je de code die je net hebt gekopieerd.
Probeer nu de Weergaveknop, of de Ontwerpweergave, en kijk waar Access een fout aangeeft. Als je in de ontwerpweergave komt, wat niet altijd zal lukken bij een foutiefve query, controleer dan de velden die in de query zitten.
Als je de fout nu kunt vinden, kun je die aanpassen, en de SQL code uit de knop op basis hiervan verbeteren.

Michel
 
Laatst bewerkt:
In bijlage zit een schema van mijn relaties. De verwijzingen lijken me te kloppen ofwel moet ik dringend een bril aanschaffen :p

Ik heb ook alle veldnamen waar de id in staat veranderd zoals jij deed. Veel praktischer.

Bart
 

Bijlagen

  • relaties.jpg
    relaties.jpg
    65,1 KB · Weergaven: 82
Hoi,

heb net je stappen gevolgd en kwam op het volgende uit:

- foutmelding blijft hetzelfde, hij duidt het volgende aan:

INSERT INTO [tblRBSPS Plastic Surgeons] ( Surgeon_Id, Meeting_Id )
SELECT tblPlastic Surgeons.Surgeon_Id, 0 AS Expr1
FROM tblPlastic Surgeons
WHERE (Surgeon_Id Not In (select Surgeon_Id from [tblRBSPS Plastic Surgeons] where Meeting_Id=0));

Wat ik ook raar vind is dat de meeting_id 0 is want er is geen meeting_id = 0 !!

Dus blijkbaar worden er geen gegevens opgehaald zoals het hoort.
 
Wat opvalt bij de relaties, is dat er geen controle is over de Referentiële Integriteit. Bij een relatie hoort die optie aangevinkt te zijn, anders heeft de relatie niet zoveel zin. Je kunt de relaties aanpassen door op de lijnen te dubbelklikken, en de optie dus aan te vinken.
Als Access een foutmelding geeft, houdt dat in dat ofwel de gegevens in de twee gekoppelde tabellen niet overeenkomen, ofwel dat de gegevenstypen van de gekoppelde velden niet hetzelfde zijn. In beide gevallen is de gelegde relatie dus zinloos.
In het eerste geval moet je controleren of in de gerelateerde tabel geen waarden zitten die niet in de hoofdtabel zitten. Als dat wel zo is, moeten die gegevens uit de tabel worden verwijderd.
In het tweede geval moet je controleren of het veldtype van het gekoppelde veld wel gelijk is. Een sleutelveld met Autonummering is vaak van het type Lange Integer; als het gekoppelde veld bijvoorbeeld van het type Integer is, zal je ze niet kunnen koppelen.
Probeer dus eerst of je Referentiële integriteit kunt afdwingen.

Michel
 
Da's op zich goed nieuws, want dan kloppen je tabellen.
Als hij aangeeft dat iMeeting 0 is, dan haalt hij de Meeting_ID niet goed op. Die moet van het formulier afkomen, als ik mij niet vergis.
Code:
iMeeting = Me.txtId
Dit is tenminste de code in mijn voorbeeld. Je kunt met een msgbox checken of die waarde goed wordt opgehaald:
Code:
iMeeting = Me.txtId
MsgBox iMeeting

Michel
 
Nu geeft ie wel netjes de waarde weer in de msgbox terwijl ervoor:

Code:
INSERT INTO [tblRBSPS Plastic Surgeons] ( Surgeon_Id, Meeting_Id ) 
SELECT tblPlastic Surgeons.Surgeon_Id, 0 AS Expr1 
FROM tblPlastic Surgeons 
WHERE (Surgeon_Id Not In (select Surgeon_Id from [tblRBSPS Plastic Surgeons] where Meeting_Id=0));
 
Begrijp ik dat je de waarde iMeeting wel kunt uitlezen in een Msgbox, maar dat hij in de query weer 0 geeft?

Heb je de sql gecheckt met

Code:
tmp = InputBox("", "", strSQL)

Als hier een normale waarde in staat, moet je de query normaal uit kunnen voeren.
Je kunt nog kijken of je de waadestring uit de tmp box rechtstreeks in een SQL venster van het query ontwerp kunt plakken.
 
Hoi,

ik had iets teveel code vervangen door jouw code. Nu geeft ie wel de waarde weer maar de foutmelding blijft.

Code:
Private Sub btnMakeMeetingList_Click()
Dim strSQL As String, iMeeting As Integer,

iMeeting = Me.txtid
DoCmd.SetWarnings False
Dim tmp As String
strSQL = "INSERT INTO [tblRBSPS Plastic Surgeons] ( Surgeon_Id, Meeting_Id ) " & vbCrLf
strSQL = strSQL & "SELECT tblPlastic Surgeons.Surgeon_Id, " & iMeeting & " AS Expr1 " & vbCrLf
strSQL = strSQL & "FROM tblPlastic Surgeons " & vbCrLf
strSQL = strSQL & "WHERE (Surgeon_Id Not In (select Surgeon_Id from [tblRBSPS Plastic Surgeons] where Meeting_Id=" & iMeeting & "));"
tmp = InputBox("", "", strSQL)
DoCmd.RunSQL strSQL
DoCmd.SetWarnings True

End Sub

Er moet iets zijn met die tblPlastic Surgeons.Surgeon_Id maar ik kan niets bedenken dat de fout veroorzaakt. Kan het door de spatie komen tussen Plastic en Surgeons??
 
Laatst bewerkt:
Status
Niet open voor verdere reacties.
Steun Ons

Nieuwste berichten

Terug
Bovenaan Onderaan