[Access 2002]Meervoudige selectie als query

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

  • KingCrash
  • Registratie: Februari 2002
  • Laatst online: 18:31

KingCrash

Angry Rabbit

Topicstarter
Ik heb in Access 2002 een listbox gemaakt waarin ik meerdere waarden kan selecteren (meervoudige selectie is enabled dus)


Doel
De waarden die ik selecteer staan voor de records die ik wil kopieren naar een (nieuw aan te maken) lege tabel.

De waarden die ik selecteer zijn de sleutelwaarden uit een tabel, ik wil graag de hele rij uit de tabel naar de nieuwe tabel kopieren.

Zelf geprobeert
Via de help van Access kwam ik er niet uit. Via Google kwam ik enkele scripts tegen, oa op Microsoft knowledge base, waaronder onderstaand script welke mij het best van toepassing leek.
Met dit script krijg ik de values die ik selecteer in een textveld als een comma gescheiden string.
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
Private Sub testmultiselect_Click()
    Dim oItem As Variant
    Dim sTemp As String
    Dim iCount As Integer

    iCount = 0     'teller

    If Me!nameslist.ItemsSelected.Count <> 0 Then   'listbox
        For Each oItem In Me!nameslist.ItemsSelected
            If iCount = 0 Then
                sTemp = sTemp & Me!nameslist.ItemData(oItem)
                iCount = iCount + 1
            Else
                sTemp = sTemp & "," & Me!nameslist.ItemData(oItem)
                iCount = iCount + 1
            End If
        Next oItem
    Else
        MsgBox "Niet geselecteerd", vbInformation
        Exit Sub                                                    'niet geselecteerd
    End If

    Me!myselections.Value = sTemp 'textveld op form
End Sub

Nu zou ik deze string dmv de left en mid functie kunnen opdelen in losse waarden maar volgens mij wordt mijn uiteindelijke doel dan erg lastig.(elke waarde als variabele in een query stoppen lijkt mij niet de meest eenvoudige manier)

Vraag
Hoe kan ik de meervoudige selectie gebruiken om de geselecteerde waarden/records in zijn geheel naar een tabel te schrijven?

[ Voor 4% gewijzigd door KingCrash op 21-02-2006 11:00 ]

Angry Rabbit


  • KingRichard
  • Registratie: September 2002
  • Laatst online: 17-08 19:31

KingRichard

former Duke of Gloucester

Je bent met dit script aardig op weg. Je kunt met VBA redelijk eenvoudig records aan een tabel toevoegen.
In het begin van je script zul je twee recordsets moeten openen:
Visual Basic:
1
2
3
Dim rsOpzoekTabel As DAO.RecordSet, rsDoelTabel as DAO.Recordset
Set rsOpzoekTabel = CurrentDb.OpenRecordset("NaamVanOpzoekTabel", dbOpenDynaset)
Set rsDoelTabel = CurrentDb.OpenRecordset("NaamVanDoelTabel", dbOpenDynaset)
Vervolgens zul je voor elk gevonden (geselecteerd) item in je listbox het ID moeten opzoeken in de OpzoekTabel d.m.v.
Visual Basic:
1
rsOpzoekTabel.FindFirst "id=" & Me!nameslist.ItemData(oItem)
Daarna kopiëren:
Visual Basic:
1
2
3
4
5
rsDoelTabel.AddNew
For Each f In rsFields.Fields
    rsDoelTabel.Fields(f.Name) = rsOpzoekTabel.Fields(f.Name)
Next f
rsDoelTabel.Update
Deze code gaat er vanuit dat Me!nameslist.ItemData(oItem) de sleutelwaarde geeft en dat diezelfde waarde 'id' heet in de OpzoekTabel.
edit:
En dat de DoelTabel precies dezelfde veldnamen heeft als de OpzoekTabel.
Disclaimer: dit is géén kant-en-klare oplossing! :)

[ Voor 11% gewijzigd door KingRichard op 21-02-2006 14:05 ]

a horse! a horse! my kingdom for a horse! (exeunt)
[got.profile] | [t.net.profile] | [specs]


  • Lustucru
  • Registratie: Januari 2004
  • Niet online

Lustucru

26 03 2016

Ik weet niet of je vandaag de dag nog naar DAO recordsets moet grijpen voor dit soort dingen of dat je het mbv SQL oplost. Ook met een query kun je het relatief simpel oplossen op twee manieren:
of in de lus zelf met
code:
1
dbs.execute "INSERT INTO doel SELECT * from Bron where id=" &  Me!nameslist.ItemData(oItem)

of als je eerst de lijst opbouwt in de lus kun je daarna volstaan met één query:
code:
1
dbs.execute "INSERT INTO doel SELECT * from Bron where id IN (" & strTemp & ");"

De oever waar we niet zijn noemen wij de overkant / Die wordt dan deze kant zodra we daar zijn aangeland


  • KingCrash
  • Registratie: Februari 2002
  • Laatst online: 18:31

KingCrash

Angry Rabbit

Topicstarter
Het is gelukt. _/-\o_
Ik had net de code van KingRichard ingevoegd tot een werkende functie, toen Niesje zijn code poste.
Deze leek wat eenvoudiger en beter onderhoudbaar, dus heb ik deze gebruikt.
Ik heb alleen inplaats van dbs.execute,docmd.runsql gebruikt. Dit omdat ik dbs.execute niet werkend kreeg :X

Allebei bedankt!

Voor de volledigheid nog even de code die ik heb gebruikt:
Visual Basic:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
Private Sub testmultiselect_Click()
    Dim oItem As Variant
    Dim sTemp As String
    Dim iCount As Integer
    

    iCount = 0

    If Me!nameslist.ItemsSelected.Count <> 0 Then
        For Each oItem In Me!nameslist.ItemsSelected
            If iCount = 0 Then
                sTemp = sTemp & Me!nameslist.ItemData(oItem)
                iCount = iCount + 1
                  Else
                sTemp = sTemp & "," & Me!nameslist.ItemData(oItem)
                iCount = iCount + 1
            End If
       
         DoCmd.RunSQL "INSERT INTO [output2] SELECT * from [output] where testregel_id=" & Me!nameslist.ItemData(oItem)
           Next oItem
    Else
        MsgBox "Er is niet geselecteerd", vbInformation
        Exit Sub  'Niets selected
    End If


    Me!myselections.Value = sTemp 'tekstvak,controleren op waarden
  
End Sub

[ Voor 8% gewijzigd door KingCrash op 21-02-2006 15:32 ]

Angry Rabbit