[powershell] Database omzetten naar html bestand

Pagina: 1
Acties:

  • Quadesh
  • Registratie: Augustus 2005
  • Laatst online: 13:27
Ik heb een gevulde MS Access database en nu wil ik hier graag uit 1 tabel meerdere kolommen uitlezen en deze omzetten naar een html bestand. En het liefst wil ik dit zo eenvoudig mogelijk doen zonder zelf gebruik te hoeven maken van html tekst. Met bijvoorbeeld de cmdlet ConvertTo-HTML.

Is dit mogelijk of wordt het toch met behulp van een foreach lus om per item de gegevens op te halen en deze om te zetten naar html?

  • elevator
  • Registratie: December 2001
  • Niet online

elevator

Officieel moto fan :)

Waarom niet via Access een rapport maken en dat opslaan als HTML ?

iig, ik gok dat je wat je wil wel kan doen alleen moet je zorgen dat de row die je terugkrijgt in een object formaat is, of deze zelf converteren? Laat anders eens in zo weinig mogelijk regels irrelevante code zien wat je nu doet om die database te queryen en waar het mis gaat om er HTML van te maken.

  • Quadesh
  • Registratie: Augustus 2005
  • Laatst online: 13:27
Ik wil niet alleen data van 1 tabel op die html pagina staan maar meerdere data uit verschillende tabellen in verschillende tabellen op die html pagina. En ook nog met headers en dergelijke, volgens mij werkt dat niet in MS Access.

Ik heb meerdere manieren gevonden om data uit de database te halen, de eerste is per cel. En de andere is per rij.

Per cel krijg je een gewoon een string waarde terug, wanneer je het per rij doet krijg je een twee dimensionale array terug.

En ik gebruik de per cel methode om een html pagina te maken (met veel loops):
$objRecordsetGet.open(Select * FROM table, $objConnection, 3, 3)
$objRecordsetGet.movelast()
foreach($i in $objRecordsetGet){
$gedeelteHTML +=<TR>
$gedeelteHTML +=<TD> $objRecordsetGet.Fields.item("cel1").value </TD>
$gedeelteHTML +=<TD> $objRecordsetGet.Fields.item("cel2").value </TD>
$gedeelteHTML +=</TR>


En wat ik zou willen is zoiets:

$objRecordsetGet.open(Select * FROM table, $objConnection, 3, 3)
$gedeelteHTML += $objRecordsetGet.selectAll (bestaat niet i know) | select-object cel1 cel2 | ConvertTo-HTML

En dit bovenste gedeelte krijg ik dus niet voor elkaar, misschien is er een manier om met die 2 dimensionale array te werken die wordt gemaakt met getRow()
Of om deze om te zetten naar een ander object.

  • elevator
  • Registratie: December 2001
  • Niet online

elevator

Officieel moto fan :)

Je zal die row die vermoedelijk in een associative array terugkomt moeten omzetten naar een object, ik heb hier: elevator in "[PowerShell] Screenoutput naar file" een voorbeeldje gepost hoe je zo'n array naar een object kan omzetten.

  • Quadesh
  • Registratie: Augustus 2005
  • Laatst online: 13:27
Jammer genoeg is het geen associative array.
Het is een two dimensional array.
Dus kan niet selecteren op de kolom namen. Kan alleen op deze manier data eruit halen:

$cel = $tmpArray[1,5]

Dus misschien nog andere tips hoe ik dit kan aanpakken?

  • elevator
  • Registratie: December 2001
  • Niet online

elevator

Officieel moto fan :)

dan zal je een 'Row2Object' functie moeten maken die naar bovenstaand voorbeeld er een object van maakt, je geeft overigens maar de helft van de code en ook nog eens verkeerd (dat 1e statement kan al nooit werken), dus misschien is er gewoon een mogelijkheid om ze wel in een hashmap terug te geven?

  • Quadesh
  • Registratie: Augustus 2005
  • Laatst online: 13:27
Met deze code maak ik een array aan met de data voor 1 regel

$HTML_FileName = "test.html"
New-Item $HTML_FileName -type file -Force
$objRecordsetGet.Open("Select * FROM Tabel", $objConnection, $adOpenStatic, $adLockOptimistic)
$tmpArray = $objRecordsetGet.GetRows(5,0,("Cel1", "Cel2", "Cel3"))

Dit komt in een twee dimensionale array te staan. Dus als jij me kunt zeggen hoe ik dit in een associate array kan krijgen ben ik erg benieuwd.

  • elevator
  • Registratie: December 2001
  • Niet online

elevator

Officieel moto fan :)

Als ik zo snel kijk kan je van een ADO RecordSet idd geen hashmap terug krijgen, je zal dus zelf de rows om moeten zetten in een record.

Je gaat dan iets krijgen als:

C#:
1
2
3
4
5
6
7
function Rs2Obj($hm) {
    # Create our own version of the user object
    $TmpObj = New-Object PSObject
    $TmpObj | Add-Member -MemberType NoteProperty -Name "Cel1" -value $hm[0][0]

    return $tmpObj
} # func. Rs2Obj 


of iets dergelijks, waarna je de array met objecten weer aan ConvertToHtml kan voeren :)

  • Quadesh
  • Registratie: Augustus 2005
  • Laatst online: 13:27
Geweldig, heel erg bedankt. Ik heb dit ervan gemaakt:

Input: De kolomnamen in een string en de regels in een tweedimensionale array zoals die wordt terug gegeven door de functie getRows().

C#:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
function CreateObj($ColumnsArg, $rowsArg){
    $table = @()
    for($k=0; $k -le $rowsArg.getupperbound(1);$k+=1){
        $TmpObj = New-Object PSObject
        for($i=0; $i -lt $columnsArg.count; $i+=1){
            $Name = $ColumnsArg[$i]
            $Value = $rowsArg[$i,$k]
            if($Value -match "\|\|\|"){
                $Value = $Value -replace "\|\|\|", "<BR>"
            }
            $TmpObj | Add-member -MemberType NoteProperty -Name $name -Value $Value
            
        }
        $table += $TmpObj
    }
    return $table
}



Maar heb nu nog wel probleem. Wanneer ik dit omzet naar html, wordt de "<BR>" in het html bestand geschreven als "&l t;BR&g t;".
Ook een tip hoe ik dit kan oplossen??

Heb ook een stukje code waarin dit wel goed werkt...
C#:
1
$Body += "<EM>Overzicht</EM><BR>"

  • elevator
  • Registratie: December 2001
  • Niet online

elevator

Officieel moto fan :)

Je moet het replacen van je enters pas doen nadat PowerShell er HTML van gemaakt heeft, dus je doet zoiets:

C#:
1
$ar | ConvertTo-HTML | Out-String -replace "|||", "<br/>"

ofzoiets.
Pagina: 1