Avatar billede larsgrau Forsker
04. februar 2014 - 20:14 Der er 1 kommentar og
1 løsning

Skrive data på en bestemt måde

Hej

Jeg har en tabel som se sådan her ud:
Felt1 = Fornavn
Felt2 = Efternavn
Felt3 = Adresse

Jeg vil gerne have den skriver til en fil som ser sådan her ud:
<statics>
<contact>
<Fornavn></Fornavn>
<Efternavn></Efternavn>
<Adresse></Adrsse>
</contact>
</statics>

osv

kan det lade sig gøre via vba?
Avatar billede larsgrau Forsker
04. februar 2014 - 21:46 #1
Dim rst As DAO.Recordset
Open "C:\names.xml" For Output As #1
Set rst = CurrentDb.OpenRecordset("SELECT * FROM tabel1", dbOpenSnapshot)
Print #1, "<statics>"

rst.MoveFirst


Do While Not rst.EOF

Print #1, "<Contact>"
Print #1, "<fornavn>" & rst!fornavn & "</fornavn>"
Print #1, "<efternavn>" & rst!efternavn & "</efternavn>"
Print #1, "<adresse>" & rst!adresse & "</adresse>"
Print #1, "</Contact>"
  rst.MoveNext
Loop
Print #1, "</statics>"
rst.Close
Set rst = Nothing
Close #1
Avatar billede bvirk Guru
05. februar 2014 - 21:57 #2
Lige min kommentar - ovenstående er er kun første skridt i en mere generel og skalerbar løsning.

Tabelindholdets xml form skal ikke laves med feltnavne i koden - men skrives generelt så en hvilket som helst tabel får xml elementnavne bestemt af tabellens feltnavne.
eksempel

for i=0 to rs.fields.count-1
    print#1,"<" & rs.fields(i).name & ">" & rs.fields(i) & "</" & rs.fields(i).name & ">"
next

Den dannede xml er blot et mellemstadie - men så kan den også bruges til hvilken som helst opgave.
Næste skridt er at lave udskrivning til fil på en helt anden måde. Faktisk skal mellemstadiet slet ikke udskrives til fil, men for at få lidt forståelse for hvad der sker kan man prøve det.
VIGTIGT: sæt referencer til microsoft xml, ver3

Sub testTable2xmlfile(tableN,pathName)
    Dim xml As DOMDocument30
    Set xml = domtreeOnsorted(tableN)
    xml.Save pathName
End Sub

Function domtreeUnsorted(tablN) As DOMDocument30
    Dim root As IXMLDOMElement, rec As IXMLDOMElement, fldNE As IXMLDOMElement, tblAtt As IXMLDOMAttribute
    Dim fldNArr, fld
    fldNArr = fieldNames(tablN)
    Set domtreeUnsorted = New DOMDocument30
    domtreeUnsorted.async = False
   
    domtreeUnsorted.appendChild domtreeUnsorted.createProcessingInstruction("xml", "version=""1.0"" encoding=""ISO-8859-1""")
    Set root = domtreeUnsorted.appendChild(domtreeUnsorted.createElement("table"))
    Set tblAtt = domtreeUnsorted.createAttribute("name")
    tblAtt.value = tablN
    root.Attributes.setNamedItem tblAtt
    With rsi(tablN)
        While Not .eof
            Set rec = root.appendChild(domtreeUnsorted.createElement("rec"))
            For Each fld In fldNArr
                Set fldNE = rec.appendChild(domtreeUnsorted.createElement(fld))
                fldNE.text = .Fields(fld) & ""
                'Debug.Print "<" & fld & ">" & .Fields(fld) & "</" & fld & ">"
            Next: Wend: End With
End Function

Sub add2list(V, i)
    On Error Resume Next
    ReDim Preserve V(UBound(V) + 1)
    If err.Number = 13 Then ReDim V(0)
    If IsObject(i) Then Set V(UBound(V)) = i Else V(UBound(V)) = i
End Sub

Function fieldNames(tablN)
    Dim fldN
    With CurrentDb.OpenRecordset(tablN)
        For Each fldN In .Fields: add2list fieldNames, fldN.name: Next: End With
End Function

------------------------------------------------------------


Så kommer vi til formateringsdelen - her hvor det bestemmes hvordan slut xml'en skal se ud til den konkrete opgave. xslt transformtion er faktisk gammelt stof, men er noget kryptisk i dens overdekorede syntaks.
Kort fortalt dannes slut xml filen ved transformation af tabeldata xmlfilen vha et xslt script. Xslt scriptet er også en xml fil (extension: .xsl)

-------start på file: stylesheetFileN ------------
<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:output method="xml" version="1.0"  encoding="Windows-1252" indent="yes"/>
    <xsl:variable name="tableN">table-<xsl:value-of select="/table/@name"/></xsl:variable>
   
    <xsl:template match="/">
    <xsl:element name="{$tableN}" >
        <xsl:apply-templates select="table/rec" />
    </xsl:element>
    </xsl:template>
    <xsl:template match="rec">
        <contact>
        <xsl:apply-templates />
        </contact>
    </xsl:template>
    <xsl:template match="*">
        <xsl:copy-of select="." />
    </xsl:template>
</xsl:stylesheet>
-------slut på file: stylesheetFileN ------------

Rodelementet er ikke 'statics', men tabel-tabelnavn for at vise lidt om attribute til element transformering.

Og her den endelige subrutine:

Sub Table2xmlfile(tableN, stylesheetFileN, xmlOutput)
    Dim xml As DOMDocument30, xslt As DOMDocument30, domOut As DOMDocument30
    Set xml = domtreeUnsorted(tableN)
    Set xslt = New DOMDocument30
    Set domOut = New DOMDocument30
    xslt.Load stylesheetFileN
    xml.transformNodeToObject xslt, domOut
    domOut.Save xmlOutput
    Set xml = Nothing
    Set xslt = Nothing
    Set domOut = Nothing
End Sub
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Dyk ned i databasernes verden på et af vores praksisnære Access-kurser

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester