gegevens in memoveld uitlezen

Status
Niet open voor verdere reacties.

patrick1969

Gebruiker
Lid geworden
30 okt 2009
Berichten
7
binnen Access heb ik diverse gegevens geimporteerd vanuit de mail. Dit betreffen gegevens welke ik wil vergelijken met een bij die mail bijgevoegd XML document.
In een veld (memo) worden alle gegevens die in het aangehechte XML-document staan "gedumpt".
Nu zou ik graag de gegevens uit dit memoveld dmv een Query (indien mogelijk) willen ordenen. Vervolgens kan ik die gegevens dat weer vergelijken.
Is het mogelijk op deze gegevens uit een gezamelijk memoveld te ordenen en weg te schrijven naar seperate velden.
Is het in dat geval ook mogelijk om gegevens welke vaker voorkomen automatisch een volgnummer te geven. Hieronder zie je namelijk twee keer het veld "Naam" en ook "straat" voorkomen.

Een reactie zie ik graag tegemoet.

(het los importeren van de XML-documenten is geen oplossing vanwege het grote aantal mails waarop deze vraag betrekking heeft, in dat geval zou ik elke mail moeten doorlopen en de XML moeten importeren namelijk)


<subscriber>
<naam>R Hoop</naam>
<straat>Haag 96</straat>
<postcode>1234 AB</postcode>
<plaats>Borne</plaats>
- <voertuig kenteken>=AABB1
<brandtype>SEAT Ibiza</brandtype>
<kmstand>0</kmstand>
<datum>1900-01-01T00:00:00</datum>
<trailertype>n.v.t.</trailertype>
</voertuig>
</subscriber>
- <eigenaar>
<naam> R Hoop </naam>
<straat> Haag 96</straat>
</eigenaar>
 
Je kunt de mail uiteraard geautomatiseerd inlezen; dat doe je blijkbaar nog niet. Maar daar gaat je vraag niet over. Het ordenen van het memoveld, zoals je het noemt, is nog redelijk lastig, maar misschien nog wel te doen. Ik zou zelf eerst kijken of je (al dan niet geautomatiseerd via VBA) het xml document in Excel kan importeren; ik heb daar zelf verder geen ervaring mee, maar het zou e.e.a. een stuk eenvoudiger maken als het kon. Alternatief is om het memoveld in een array variabele in te lezen, en te splitsen op het teken CRLF. Dan krijg je voor elke regel een eigen variabele in de array. Vervolgens kun je door de variabelen heenlopen en op basis van de ingevoerde tekst bepalen om welk veld het gaat (<naam> is uiteraard een Naamveld etc) en de volgende tekst tot het Einde tag teken is dan de tekst. Zelf zou ik de eerste array gebruiken om een tweedimensionale array te vullen met in de tweede dimensie de veldnaam en de veldwaarde. Op die manier kun je heel makkelijk controleren of een veldnaam (en inhoud) al bestaat, en welk geval je hem kunt overslaan. Op die manier voorkom je dubbele velden. Maar heel makkelijk zal het niet gaan; post eventueel een voorbeeldbestandje waar we mee kunnen prutsen.
 
Hierbij een voorbeeldbestandje. Ben erg benieuwd of de betere knutselaars me hier mee op weg kunnen helpen. Het gaat om de informatie welke onder de kolom "hoofdtekst" is weggeschreven.
Alvast bedankt!
 

Bijlagen

  • db1.zip
    30,6 KB · Weergaven: 26
Laatst bewerkt:
Ik mis de velden waar de gesplitste informatie heen moet.
 
ik zou het liefst een losse tabbel toe willen voegen welke in ieder geval de volgende velden wegschrijft uit de eerste (wekelijks te importeren) tabel.

Velden welke ik in die tabel terug wil zien zijn:
Onder sub Schade -->
Dossier nummer:
Dossier datum: (van belang is de exacte datum en tijd te vermelden)
Dossier type:
onder sub Subscriber(s)
Naam:
Woonplaats:
 
Ik heb als voorwerk vast een procedure gemaakt die het memoveld uitleest en in een matrix variabele zet.

Code:
Private Sub Form_Current()
Dim arr As Variant, arrDB() As Variant, arrDef() As Variant
Dim i As Integer, j As Integer, x As Integer
Dim sV As String

    arr = Split(Me!Hoofdtekst.Value, Chr(13) & Chr(10))

    For i = LBound(arr) To UBound(arr)
        If InStr(1, arr(i), ":") > 0 Then j = j + 1
    Next i

    ReDim Preserve arrDB(j - 1, 1)
    j = 0
    
    For i = LBound(arr) To UBound(arr)
        If InStr(1, arr(i), ":") > 0 Then
            arrDB(j, 0) = Trim(Left(arr(i), InStr(1, arr(i), ":") - 1))
            If InStr(1, sV, arrDB(j, 0)) = 0 Then
                If sV & "" <> "" Then sV = sV & "|"
                sV = sV & arrDB(j, 0)
                x = x + 1
            End If
            arrDB(j, 1) = Trim(Mid(arr(i), InStr(1, arr(i), ":") + 1))
            j = j + 1
        End If
    Next i
    sV = ""
    j = 0
    
    ReDim Preserve arrDef(x - 1, 1)
    For i = LBound(arrDB) To UBound(arrDB)
        If InStr(1, sV, arrDB(i, 0)) = 0 Then
            If sV & "" <> "" Then sV = sV & "|"
            sV = sV & arrDB(i, 0)
            arrDef(j, 0) = arrDB(i, 0)
            arrDef(j, 1) = arrDB(i, 1)
            j = j + 1
        End If
    Next i
End Sub
De procedure werkt als een drietrapsraket, omdat je gegevens nu eenmaal niet gelijk goed zijn te verwerken. In de eerste stap wordt elke regel in een array gezet op basis van een regeleinde. Vervolgens wordt een telling gedaan van het aantal rijen met een dubbele punt en wordt op basis daarvan een tweede matrixvariabele gevuld; ik beschouw dat als de velden met een waarde die je uiteindelijk in je tabel wilt hebben. De derde stap is het evalueren van de tweede matrix, en de unieke waarden uit de tweede matrix in een derde matrix zetten. En dat is dan het eindresultaat. Probeer 'm eens uit, en kijk of je het juiste resultaat er uithaalt.
Als dat klopt, kunnen we er een functie van maken die alle records inleest en vervolgens toevoegt aan je nieuwe tabel.
 
zal zeker gaan werken zoals je zegt. Ben direct aan de slag gegaan met je uitwerking maar ik zie nergens iets veranderen. Ben aan het zoeken geslagen naar de functie Array waarmee ik niet bekend was. Is nog een hele weg te gaan voor mij.
Ik heb uiteindelijk de code aan het formulier gekoppeld, maar zie ook daar helaas niet iets wezenlijks veranderen. Moet er helaas van tussen en kan pas verder na het weekend. Hoop dat je me nog enkele hints kunt geven waarmee ik verder kan. To zover bedankt voor je hulp.
 
De functie doet niet veel meer dan de waarden inlezen in de variabelen bij het inlezen van een record, en bij het bladeren naar een volgend record begint het feest weer opnieuw. Als de procedure klaar is, wordt de variabele weer geleegd. Vandaar dat je niks ziet :) Je moet een Onderbrekingspunt invoegen (bijvoorbeeld bij de derde lus) om te zien hoe en waarmee de variabelen zijn/worden gevuld. Zoals ik al zei: dit is de basisprocedure om het memoveld uit te lezen. Wat er verder mee moet, is nog een open vraag.
 
Status
Niet open voor verdere reacties.
Terug
Bovenaan Onderaan