Veld splitsen in variabel aantal velden

  • Onderwerp starter Onderwerp starter jhdw
  • Startdatum Startdatum
Status
Niet open voor verdere reacties.

jhdw

Gebruiker
Lid geworden
15 dec 2012
Berichten
166
Goedemiddag,

Hierbij doe ik weer eens een beroep op dit fantastische forum.
Waar ik nu een probleem mee heb, is het volgende. In mijn testdB heb ik 2 tabellen. De eerste tabel “tbl_machine_aanlevering” is de tabel met gegevens die we aangeleverd krijgen. De tweede tabel “tbl_machine” is de tabel waar ik uiteindelijk mee wil gaan werken. In de eerste tabel zit een veld “componenten” waarin de artikelnummers van de componenten staan, die op een machine kunnen voorkomen. De artikelen zijn altijd gescheiden door het + teken. Als er bijv. 2x voor een artikelnummer staat, dan zijn er 2 nodig, anders is het aantal altijd 1.
De vraag is: hoe krijg ik het voor elkaar dat het resultaat er uit ziet zoals ik het in de tabel “tbl_ machine” handmatig heb ingevoerd?
Alvast bedankt voor het meedenken.

Gr.
Jan
 

Bijlagen

ik denk dat het het meest makkelijk is om de tabel even in xl te zetten en dan 'tekst naar kolommen' te gebruiken. het lastige is dat je in sommige meer dan 1 component hebt wat je wilt scheiden. Dit zullen dus meerdere rijen moeten worden.

Of je zou query kunnen maken met de funtie Left() kunnen gebruiken en dan meerdere keren toepassen totdat iedere rij maar een component bevat.
 
Goedemiddag,

Bedankt voor je reactie.

Omdat het regelmatig voorkomt zou ik het liever zonder Excel doen omdat daar elke keer weer heel veel handwerk in zit met kans op fouten. Ik zat zelf te denken aan de kolom "componenten" te splitsen maar ik weet helaas niet hoe ik dit moet aanpakken. Het aantal artikelnummers is verschillend en bij sommige artikelnummers staat ook nog bijv. 2x of 3x voor.
Als iemand mij daar mee zou kunnen helpen, zou dat geweldig zijn want ik zit echt op een dood spoor.:(

Alvast bedankt.

Gr. Jan
 
Ik heb je db nog niet bekeken (vakantie) maar op basis van je vraag lijkt het mij niet nodig om Excel te gebruiken om de gegevens te splitsen, en kun je dus alles in Access maken. Maar daar kan ik pas morgenavond meer over zeggen.
 
Hallo Michel,

Ik hoop toch niet dat je de vakantie af(onder)breekt om naar mijn dB te kijken:thumb:.
In ieder geval alvast bedankt voor het meedenken. Ik zie met belangstelling uit naar je reactie.

Gr. Jan
 
Het is een heel verhaal geworden, ik hoop dat je er uit komt :). Ik maak eerst een aparte tabel aan voor het eindresultaat (functie MaakTabel). Daarna lees je de brontabel uit, en splits je de betreffende gegevens. Die worden vervolgens allemaal in de tabel gezet.

Code:
Function VulTabel()
Dim conn As ADODB.Connection
Dim rs1 As ADODB.Recordset, rs2 As ADODB.Recordset
Dim i As Integer, iTel As Integer
Dim iAantal As Integer, sCode As String, sArtikel As String
Dim tmp As Variant, tmp2 As Variant

    'Maak eerst de tabel aan voor de nieuwe waarden
    MaakTabel
        
    Set conn = CurrentProject.Connection
    Set rs1 = New ADODB.Recordset
    Set rs2 = New ADODB.Recordset
    
    'Open de tabel met de brongegevens
    rs1.Open "[tbl_machine_aanlevering]", conn, adOpenStatic, adLockPessimistic
    With rs1
        Do While Not .EOF
            sCode = .Fields("Code")
            'Splits het veld met artikelnamen
            tmp = Split(.Fields("Componenten"), "+")
            If UBound(tmp) > LBound(tmp) Then
                For i = LBound(tmp) To UBound(tmp)
                    'Splits het artikelnaam als er een aantal in zit
                    If InStr(1, tmp(i), "x") > 0 Then
                        tmp2 = Split(tmp(i), "x")
                        iAantal = tmp2(LBound(tmp2))
                        tmp(i) = tmp2(UBound(tmp2))
                        GoSub RecordToevoegen
                    Else
                        iAantal = 1
                        GoSub RecordToevoegen
                    End If
                Next i
            Else
                i = LBound(tmp)
                If InStr(1, tmp(i), "x") > 0 Then
                    tmp2 = Split(tmp(i), "x")
                    iAantal = tmp2(LBound(tmp2))
                    tmp(i) = tmp2(UBound(tmp2))
                    GoSub RecordToevoegen
                Else
                    iAantal = 1
                    GoSub RecordToevoegen
                End If
            End If
            .MoveNext
        Loop
    End With
    Exit Function
    
RecordToevoegen:
    'Open de doeltabel
    With rs2
        .Open "tComp_Machines", conn, adOpenDynamic, adLockPessimistic
        .AddNew
        .Fields("Code") = sCode
        .Fields("Artikelnummer") = tmp(i)
        .Fields("Aantal") = iAantal
        .Update
        .Close
    End With
    Return

End Function

En de functie MaakTabel ziet er zo uit:
Code:
Function MaakTabel()
Dim conn As ADODB.Connection
Dim cmd As New ADODB.Command
Dim strSQL As String
    
    cmd.ActiveConnection = CurrentProject.AccessConnection
    strSQL = "CREATE TABLE tComp_Machines " _
        & "(ID_Machine COUNTER CONSTRAINT PrimaryKey PRIMARY KEY, " _
        & "Artikelnummer TEXT(255) WITH COMP NOT NULL, " _
        & "Code TEXT(20) WITH COMP, " _
        & "Aantal LONG, " _
        & "Purchase_Price CURRENCY DEFAULT 0, " _
        & "Notes MEMO, " _
        & "CONSTRAINT FullName UNIQUE (Artikelnummer, Code));"
    cmd.CommandText = strSQL
    cmd.Execute

End Function
 
Hallo Michel,

Hartstikke bedankt voor de hulp. Dit had ik zelf zo nooit kunnen bedenken!
Ik heb de codes zojuist in mijn productie dB geplakt en het werkt perfect. Niet gelijk maar naar even puzzelen met de bibliotheken is het toch gelukt.
"Microsoft ActiveX Data Objects 6.1 Library" was niet aangevinkt.
Daarna kreeg ik nog een foutmelding nadat ik het programma nog een keer uitvoerde. De melding was dat de tabel al bestond, toen in de code een regel toegevoegd om de tabel eerst te wissen en daarna was het goed.:thumb:
Ik kan voorlopig weer vooruit.

Nogmaals bedankt en wie weet tot de volgende vraag.

Gr. Jan
 
Als de tabel al bestaat kun je de regel die de functie <Maaktabel> aanroept ook verwijderen, dan wordt hij niet uitgevoerd. Je db blijft netter als je niet continue tabellen blijft aanmaken en verwijderen. Voor de volgende keer :).
 
Status
Niet open voor verdere reacties.
Terug
Bovenaan Onderaan