Hoe regels samenvoegen tot records en verwijzen naar vorige records in query

Status
Niet open voor verdere reacties.

DirkManet

Gebruiker
Lid geworden
14 aug 2014
Berichten
40
Een groot txt bestand (400 K regels) bevat hoofditems met subitems die in een hierarchische structuur zijn opgeslagen. Per hoofditem worden er feiten als subitem opgeslagen. Deze subitems (met verschillende structuren) zijn onderverdeeld in velden. Alles wordt in aparte regels opgeslagen.. Indien veld geen waarde heeft, wordt het niet in de txt opgenomen. Ik heb de txt al in Access ingelezen in een bestand en een beetje structuur ingebracht.
2 extra kolommen.JPG



Wat ik graag zou willen bereiken, is dat in de Access 2 kolommen extra komen:
eentje per feit met de persoon waar het bij hoort en eentje per veld bij welk feit het hoort. Dit zijn de 2 rode kolommen hierboven
Hiervoor heb je volgens mij alleen de kolommen ID en level nodig.
Idealerwijze komt er een kruistabel uit met in de rijen de personen en feiten en in de kolommen de velden en in de cellen de waarden.
Kruistabel.JPG


Mocht het niet in Access kunnen, in VB is ook een optie.
Ik heb een deel van het Access bestand in bijlage toegevoegd.
 

Bijlagen

  • GEDCOM.zip
    113,1 KB · Weergaven: 28
Hallo,

je kan als het volgt werken:
stap 1: maak een tabel (bv tblPersonen) met alle velden die je moet opvullen (let op liefst geen leestekens of spaties in de veldnamen)
stap 2: voeg een nieuw veld PersonID type short text toe aan de tabel GEDCOM
stap 4: maak een module aan en copiëer de volgende functie naar deze module:
Code:
Public Function FillPersonID() As Long
On Error GoTo Err_FillPersonID

    Dim rst As New ADODB.Recordset
    Dim strPerson As String
    Dim lngCounter As Long
    
    rst.Open "select [level], [Waarde], PersonID from gedcom order by ID", CurrentProject.Connection, adOpenKeyset, adLockPessimistic
 
    With rst
        If .BOF And .EOF Then
            Err.Raise 64000, , "Geen records gevonden in tabel GEDCOM"
        End If
        .MoveFirst
        While Not .EOF
            If !level = 0 Then
                strPerson = !Waarde
                lngCounter = lngCounter + 1
            End If
            !PersonID = strPerson
            .MoveNext
        Wend
        .Close
    End With
    FillPersonID = lngCounter
            
        

Exit_FillPersonID:
    Exit Function
    
Err_FillPersonID:
    FillPersonID = -1
    Debug.Print Err.Number & ": " & Err.Description
    Resume Exit_FillPersonID
End Function

stap 5: laat de functie lopen in de immediate pane (venster direct) : ? FillPersonID
De functie geeft het aantal personen terug die gevonden zijn (444) in het voorbeeldbestand en vult de persoonscode in het veld personID in
stap 6: maak een append query die voor elk record level 0 een nieuw record aanmaakt in uw nieuwe tabel tblPersonen
stap 7: met een reeks update queries kan je nu alle andere veldwaarden in het juiste record invullen gebruik makend van het veld PersonID

succes
 
Beste Noella, het lukt me toch nog niet. Bij het laten lopen van de functie krijg ik onderstaande fout
Fout.JPG
 
Heb je de ADO bibliotheek wel aangezet? Overigens is dat alleen niet genoeg, want dan doet de code het nog steeds niet heb ik gemerkt. Ik ben met een andere variant bezig, via een query. En ik heb dus een aangepaste functie, die wel werkt.
Maar ik heb dan weer problemen met de door jou gewenste output, want daar snap ik de ballen van :).
 
Hallo,

in het VBA venster klik je Tools -> References en klik je de Microsoft ActiveX Data Objects 69.x Library aan.
References.JPG
Ik heb de code op 3 verschillende PC's uitgetest en daar werkte die steeds.

vrGroeten
 
Verduidelijkend voorbeeld (voor Octafish)

Eigenlijk is de basisvraag simpel:
alle regels hebben een id en een level. De regels met level 1 horen bij de vorige level 0. De regels met level 2 horen ook vorige level level 0, maar horen ook bij het vorige level 1.
ID level
1 0
2 1
3 1
4 2
5 1
6 0
7 1
ID 2 tem 5 horen bij ID 1 (level 0). ID 4 (van level 2) hoort ook nog bij het ID 3
Zo zou ik graag 2 kolommen bij hebben:
ID level IDhoortbij0 IDhoortbij1
1 0
2 1 1
3 1 1
4 2 1 3
5 1 1
6 0
7 6

Hopelijk is dat duidelijker
 
Laatst bewerkt:
Moeilijk te debuggen aangezien ik de fout niet kan repliceren en alles bij mij goed loopt. Enig idee op welke regel hij die foutt geeft?
 
Nee, jammer genoeg niet.
 
Laatst bewerkt door een moderator:
OK, je kan eens proberen om de database te openen, de module openen en dan Debug -> compile te starten. Als er een compileerfout is dan blijft deze meestal hangen op de lijn waar het fout gaat.
Hierbij ingesloten vind je trouwens jou bestand met de code die op mijn computers wel werkt. Check wel even de references als je die naar jou PC gekopieerd hebt.
 

Bijlagen

  • GEDCOM.zip
    727,1 KB · Weergaven: 25
Als ik jouw versie bij mij draai is de output zoals gewenst (had zelfs simpeler gemogen door gewoon naar ID te verwijzen, maar krijg ik dezelfde fout in immediate pane/venster direct. Het compileren gaat ook niet goed, want na het erop kikken blijft het menu-item compileren grijs.Voorbeeld.JPGCompileren.JPG
 
Laatst bewerkt:
Probeer deze code eens:
Code:
Public Function FillPersonID()
Dim rs As DAO.Recordset
Dim strPerson As String
    
    Set rs = CurrentDb.OpenRecordset("SELECT [ID], [Level], Waarde, PersonID FROM gedcom")
    With rs
        Do While Not .EOF
            .Edit
            If .Fields("level") = 0 Then
                strPerson = !Waarde
            End If
            !PersonID = strPerson
            .Update
            .MoveNext
        Loop
        .Close
    End With
End Function
 
Ook hier krijg ik een compileerfout. Ik vermoed dat er ergens nog een instelling verkeerd staat...
Compileerfout.JPG
 
Laatst bewerkt:
Doe ons een lol en stop met nodeloos op de quote knop te drukken. Nog beter: maak ons blij en haal die quotes weg :D.
Ik vermoed dat je het veld PersonID niet in je tabel hebt aangemaakt.
 
Op welke regel stopt de code als je in de Stapmodus door de code loopt? DAO zit standaard in Access, dus hoef je niet eens te declareren via de bibliotheken.
 
Fouto[psporing / Stap (F8) begint bij eerste regel (Public Function), slaat de dims over, en blijft dan in de loop zitten, na Loop weer Do While Not .EOF (dus stopt eigenlijk niet).STap.JPG
 
Laatst bewerkt:
Kijk even wat mijn versie bij jou doet.
 

Bijlagen

  • GEDCOM.zip
    150 KB · Weergaven: 30
Status
Niet open voor verdere reacties.
Steun Ons

Nieuwste berichten

Terug
Bovenaan Onderaan