Record vullen op basis van andere tabel (met herhaling)

Status
Niet open voor verdere reacties.

Rob A

Gebruiker
Lid geworden
28 aug 2007
Berichten
9
Hoi,

Ik hoop dat jullie me kunnen helpen!

Ik heb 2 tabellen. de eerste bevat 2 velden "naam" en "aantal"
dus

Rob 2
Piet 4

De 2e tabel bevat allerlei gegevens maar met één leeg veld. wat ik nu probeer te bereiken is dat door één druk op de knop in het lege veld de naam uit tabel 1 komt te staan. op zich is dit niet zo'n probleem ware het niet dat die actie meerder keren herhaald moet worden met de opeenvolgende record. afhankelijk van de waarde in tabel 1. het resultaat moet er ongeveer als volgt uit zien;

Tabel2
record 1 Rob
record 2 Rob
record 3 Piet
record 4 Piet
record 5 Piet
record 6 Piet

Iemand enig idee hoe ik dit voor elkaar kan krijgen???

Alvast bedankt voor het meedenken!

groeten Rob
 
Het is niet helemaal duidelijk wat je nu precies wilt.
Het is vrij simpel om met behulp van SQL-queries records in een tabel toe te voegen of te wijzigen.

Kun je wat duidelijker zijn wat er nu precies moet gebeuren.
Geef daarbij de layout van je tabellen en geef precies aan welke velden wanneer welke inhoud moeten krijgen.
 
Ik zal proberen eea wat te verduidelijken

Tabel1 heeft twee velden "naam" en "aantal"

Tabel2 heeft een veld "toegewezen naam"

Wat ik wil is dat als tabel1 bv onderstaande gegevens bevat

Naam Aantal
Rob 3
Piet 1
Henk 2

Dat het veld "Toegewezen naam" wordt gevult met de waarde uit tabel 2 deze handeling moet dan x keer herhaals worden

Er worden in bovenstaand voorbeeld dan 3 records aangevuld met de waarde "Rob",1record met de waarde "Piet" en 2 records met de waarde "Henk" in het veld "toegewezen naam"

Waar het op neer komt is dat ik de records in tabel2 wil toewijzen aan collega's en dit proces moet automatisch kunnen lijkt mij.

Hopenlijk heb ik het zo wat kunnen verduidelijken.
 
Je bent nog steeds niet duidelijk genoeg.
Wat je uiteindelijk wilt is dit:

record 1 Rob
record 2 Rob
record 3 Piet
record 4 Piet
record 5 Piet
record 6 Piet

Dat is duidelijk.
Maar om het automatisch te kunnen doen moet je ook aangeven wanneer het Rob moet zijn of wanneer het Piet moet zijn.
Oftewel: wat zijn de voorwaarden die bepalen welke naam er gebruikt moet worden. Pas als dat duidelijk is kun je het automatisch gaan doen.

Wat voor jou misschien wel handig is is wat kennis op te doen over het ontwerpen en normaliseren van databases.
Kijk hiervoor bijvoorbeeld eens hier: http://www.tekstenuitleg.net/artikelen/cursus_database_ontwerpen/1

Vervolgens moet je je ontwerp gaan implementeren (bouwen dus) in access.

In jouw geval krijg je bijvoorbeeld een tabel Persoon met de velden ID (autonummer), naam en aantal.
De tweede tabel wordt dan ID (autonummer), IDPersoon etc.

De voorbeelddatabase Noordenwind die bij Access geeft vele voorbeelden hoe je de relatie tussen dit soort tabellen kunt leggen en onderhouden.
 
Beste Bartuls,

Op dit moment heb ik geen voorwaarden voor het invullen, zolang het maar gebeurt :-)

Tabel 1 wordt dagelijks (handmatig) gevult aan de hand van het aantal beschikbare collega's en de te verdelen orders. deze gegevens komen in de velden "naam" en "aantal"
In tabel 2 moeten deze namen dus een aantal keren worden ingevuld in het veld "toegewezen naam" het aantal keer is afhankelijk van het aantal welke in tabel1 staat vermeld. Hieraan zijn geen voorwaarden verbonden (nog niet) er kan van bovenaf worden begonnen in tabel 1 en ook Tabel 2 mag van bovenaf worden aangevuld.

Bedankt trouwens voor je tips, die zal ik zeker eens doornemen.
 
Dim db As Database
Dim rs1 As Recordset
Dim Teller As Integer
Dim strSQL As String

Set db = CurrentDb()
Set rs1 = db.OpenRecordset("Tabel1", dbOpenSnapshot)
rs1.MoveFirst
Do While Not rs1.EOF
Teller = Nz(rs1![Aantal])
Do While Teller > 0
strSQL = "INSERT INTO Tabel2 (Naam) VALUES("
strSQL = strSQL & "'" & rs1![Naam] & "');"
DoCmd.SetWarnings False
db.Execute strSQL, dbFailOnError
DoCmd.SetWarnings True
Teller = Teller - 1
Loop
rs1.MoveNext
Loop
Set db = Nothing
 
Beste Bartuls,

GEWELDIG!! :thumb: hier kan ik zeker verder mee al loop ik nog wel tegen wat probleempjes aan.

Jouw variant werkt als een trein met als enig probleem dat er records worden toegevoegd aan tabel2
strSQL = "INSERT INTO tabel2 ( Verdeeld )VALUES("
'strSQL = strSQL & "'" & rs1![Naam] & "');"


Ik ben zelf wat experimenteren geweest en dacht dat iets als onderstaande zou werken maar nee dus.

strSQL = "UPDATE tabel2 SET tabel2.Verdeeld VALUES("
strSQL = strSQL & "'" & rs1![Naam] & "');"


Weet jij wat ik moet veranderen om bestaande velden in tabel2 bij te werken (met de namen) ipv nieuwe record toe te voegen?

En kan ik ipv tabel2 ook een query gebruiken, die heb ik nl om bepaalde records uit tabel2te filteren. 'k heb al wel wat geprobeert maar kom niet echt verder.

Ik hoop dat je nog een goed advies voor me hebt.
Groeten Rob
 
Post je mdb even. Dat maakt het allemaal wat eenvoudiger.
ZIP je mdb wel met winzip, niet met rar!
 
Hoi,

Ik heb een voorbeeld bestandje gemaakt om aan te geven wat de bedoeling is.
Tabel2 (voorbeeld.........) heb ik handmatig aangepast om je te laten zien hoe ik de output zou willen zien.

Groeten Rob
 

Bijlagen

Is ook niet zo moeilijk:
Onderstaande oplossing gaat er wel van uit dat Tabel2 voldoende records bevat en dat geen van deze records nog een naam in Verdeeld bevat.
Kijk ook eens in de help van OpenRecordset.....


Dim db As Database
Dim rs1 As Recordset
Dim rs2 As Recordset
Dim Teller As Integer
Dim strSQL As String

Set db = CurrentDb()
Set rs1 = db.OpenRecordset("Tabel1", dbOpenSnapshot)
Set rs2 = db.OpenRecordset("Tabel2", dbOpenDynaset)
rs1.MoveFirst
rs2.MoveFirst
Do While Not rs1.EOF
Teller = Nz(rs1![Aantal])
Do While Teller > 0
rs2.Edit
rs2![Verdeeld] = rs1![Naam]
rs2.Update
rs2.MoveNext
Teller = Teller - 1
Loop
rs1.MoveNext
Loop
Set rs2 = Nothing
Set rs1 = Nothing
Set db = Nothing
 
Bartuls,

Geweldig bedankt voor je hulp ik ga heir mee aan de slag!

:)
 
Beste Bartuls,

Ik loop toch nog tegen een puntje aan nl dat ik de namen graag om en om toegevoegd wil zien, is dat ook mogelijk?

oude situatie:

record 1 Rob
record 2 Rob
record 3 Piet
record 4 Piet
record 5 Piet
record 6 Piet

gewenste situatie

record 1 Rob
record 2 Piet
record 3 Rob
record 4 Piet
record 5 Rob
record 6 Piet
 
Dat is toch niet zo moeilijk?
Nu loop je door de personen en daarbinnen loop je door de records
Draai de loopjes om (loop door de records en daarbinnen door de personen) en je krijgt wat je wilt.
Het principe is natuurlijk hetzelfde, alleen de volgorde is anders.
 
Helaas Bartuls, het zal wel aan mij liggen maar het is wel moeilijk. het lukt me niet om het gewenste resultaat te verkrijgen. als ik met de loops aan de gang dan loopt de code of vast of de namen worden er één keer in gezet. ik krijg het niet voorelkaar om verschillende namen met verschillende aantallen te verwerken, snap je m'n probleem?

bv

Naam: Aantal:
Rob 2
Piet 3
Henk 1

gewenst resultaat is dan


Rob
Piet
Henk
Rob
Piet
Piet
 
Iets meer code:



Sub VoerVerwerkingUit()
Dim db As Database
Dim rs1 As Recordset
Dim rs2 As Recordset
Dim Teller As Integer
Dim strSQL As String
Dim varResult As Variant

Set db = CurrentDb()
'Tijdelijke tabel aanmaken
varResult = CopyStruct(db, db, "Tabel1", "TempTabel1", True)
varResult = CopyData(db, db, "Tabel1", "TempTabel1")

Do While DCount("id", "TempTabel1", "Aantal > 0")
Set rs1 = db.OpenRecordset("SELECT * FROM TempTabel1 WHERE Aantal > 0", dbOpenDynaset)
Set rs2 = db.OpenRecordset("SELECT * FROM Tabel2 WHERE Verdeeld IS NULL", dbOpenDynaset)
rs1.MoveFirst
rs2.MoveFirst
Do While Not rs1.EOF
rs2.Edit
rs2![Verdeeld] = rs1![Naam]
rs2.Update
rs1.Edit
rs1![Aantal] = rs1![Aantal] - 1
rs1.Update
rs2.MoveNext
rs1.MoveNext
Loop
Set rs2 = Nothing
Set rs1 = Nothing
Loop

'Tijdelijke tabel weer weggooien
db.TableDefs.Delete "TempTabel1"
Set db = Nothing
MsgBox "Verwerking gereed"
End Sub

Function CopyStruct(from_db As Database, to_db As Database, from_nm As String, to_nm As String, create_ind As Integer) As Integer

On Error GoTo CSErr

Dim i As Integer
Dim tbl As New TableDef 'table object
Dim fld As Field 'field object
Dim ind As Index 'index object

'Search to see if the table exists:
namesearch:
For i = 0 To to_db.TableDefs.Count - 1
If UCase(to_db.TableDefs(i).Name) = UCase(to_nm) Then
If MsgBox(to_nm + " already exists, delete it?", 4) = vbYes Then
to_db.TableDefs.Delete to_nm
Else
to_nm = InputBox("Enter New Table Name:")
If to_nm = "" Then
Exit Function
Else
GoTo namesearch
End If
End If
Exit For
End If
Next

'Strip off owner if necessary:
If InStr(to_nm, ".") <> 0 Then
to_nm = Mid(to_nm, InStr(to_nm, ".") + 1, Len(to_nm))
End If
tbl.Name = to_nm

'Create the fields:
For i = 0 To from_db.TableDefs(from_nm).Fields.Count - 1
Set fld = New Field
fld.Name = from_db.TableDefs(from_nm).Fields(i).Name
fld.Type = from_db.TableDefs(from_nm).Fields(i).Type
fld.Size = from_db.TableDefs(from_nm).Fields(i).Size
fld.Attributes = from_db.TableDefs(from_nm).Fields(i).Attributes
tbl.Fields.Append fld
Next

'Create the indexes:
If create_ind <> False Then
For i = 0 To from_db.TableDefs(from_nm).Indexes.Count - 1
Set ind = New Index
ind.Name = from_db.TableDefs(from_nm).Indexes(i).Name
ind.Fields = from_db.TableDefs(from_nm).Indexes(i).Fields
ind.Unique = from_db.TableDefs(from_nm).Indexes(i).Unique
If gstDataType <> "ODBC" Then
ind.Primary = from_db.TableDefs(from_nm).Indexes(i).Primary
End If
tbl.Indexes.Append ind
Next
End If

'Append the new table:
to_db.TableDefs.Append tbl

CopyStruct = True
GoTo CSEnd

CSErr:
CopyStruct = False
Resume CSEnd

CSEnd:
End Function

Function CopyData(from_db As Database, to_db As Database, from_nm As String, to_nm As String) As Integer

On Error GoTo CopyErr
Dim ds1 As Recordset, ds2 As Recordset
Dim i As Integer
Set ds1 = from_db.OpenRecordset(from_nm, dbOpenDynaset)
Set ds2 = to_db.OpenRecordset(to_nm, dbOpenDynaset)
While ds1.EOF = False
ds2.AddNew
For i = 0 To ds1.Fields.Count - 1
ds2(i) = ds1(i)
Next
ds2.Update
ds1.MoveNext
Wend
CopyData = True
GoTo CopyEnd
CopyErr:
CopyData = False
Resume CopyEnd
CopyEnd:
End Function
 
Het werkt als een trein :D
En eerlijk is eerlijk dit had ik ooit kunnen bedenken !

Bedankt!!
 
Status
Niet open voor verdere reacties.

Nieuwste berichten

Terug
Bovenaan Onderaan