Avatar billede jensen363 Forsker
26. oktober 2007 - 19:19 Der er 6 kommentarer og
1 løsning

Denormalisering af data

Jeg har behov for nogeh hjælp til følgende :

Jeg skal have de-normaliseret følgende struktur, og lagt data i en ny struktur i Access.

Eksempel : 

ID  INV01  INV02  INV03  INV04 .... INV120
A    0      2      0      5          0
B    1      1      0      0          1
C    0      1      1      2          1

Ønsket resultat

ID  Type    Antal
A    INV02  2
A    INV04  5
B    INV01  1
B    INV120  1
C    INV01  1
C    INV02  1
OSV .....

Løsningen jeg stræber efter skal være automatiseret, og tage højde for, at der kan komme flere INV-værdier fra kildedata ...

Kildedate består p.t. af 126 kolonner, heraf er de første 2 nøglefelter som identificerer rækkeindholdet ... resten er altså forskellige INVxx typer ( inventar ) og her kan det være både alfa og numeriske værdier ... men hvis feltindholdet er 0 eller null, skal der ikke oprettes en række.

Er det sort snak ?
Avatar billede mugs Novice
26. oktober 2007 - 19:24 #1
For mig at se, skal du ud i en krydstabulering, idet du vil have data både vandret og lodret. På makeITeasy.dk ligger der et eksempel på en dynamisk rapport, der tager højde for et antal variable kolonner.
Avatar billede Slettet bruger
29. oktober 2007 - 12:46 #2
Er du ikke nød til at lave et loop, som åbner recordsættet og kører igennem. Så for hver id gennemgår du INVxx fra 01 til 126 og laver en insert i et nyt recordsæt, hvis not isnull!~)
Avatar billede jensen363 Forsker
30. oktober 2007 - 09:21 #3
mugs / spg > jeg er åben overfor alle forslag :-)

Lige nu kan jeg kun se at UNION JOIN kan give mig et tilfredsstillende resultat, men det er ikke dynamisk ( fremadrettet ved nye tabeller/kolonner )
Avatar billede jensen363 Forsker
30. oktober 2007 - 11:32 #4
Denne virker nogenlunde efter hensigten ( blot kun på første række )

Public Sub TransposeII()
DoCmd.SetWarnings False
  Set dbs = CurrentDb
    Set rst = dbs.OpenRecordset("qrytest")
  I = 1
    For Each fld In rst.Fields
Værdi = rst.Fields(I)
strsql = "Insert into tbltest Values (" & I & ",'" & Værdi & "');"

  DoCmd.RunSQL strsql
I = I + 1
    Next

rst.Close
Set rst = Nothing
DoCmd.SetWarnings True
End Sub

Hvordan får jeg indsat kolonnenavnet istedet for en talværdi i denne ;

strsql = "Insert into tbltest Values (" & I & ",'" & Værdi & "');"
Avatar billede terry Ekspert
30. oktober 2007 - 20:48 #5
If you can send me an example of the table and query then I'll see what I can put together
ekspertenATsanthell.dk
AT = @
Avatar billede jensen363 Forsker
01. november 2007 - 13:21 #6
The final result  :

Public Sub Transpose()
Dim Counter As Integer

    DoCmd.SetWarnings False

    On Error Resume Next
 
    Set dbs = CurrentDb
    Set rst = dbs.OpenRecordset("qrytest")
    Counter = 1

    Do Until rst.EOF
       
        DoCmd.Echo True, "Behandler nu record nr : " & Counter
               
        I = 1
        For Each fld In rst.Fields
       
            HSHUSN = rst.Fields(2)
            HSSÆSO = rst.Fields(3)
       
            HSValueA = fld.Name
            HSValueB = rst.Fields(I)
            strSQL = "Insert into tbltest Values ('" & HSHUSN & "','" & HSSÆSO & "', " & I & ",'" & HSValueA & "','" & HSValueB & "');"
   
            DoCmd.RunSQL strSQL
            I = I + 1
        Next
       
        rst.MoveNext
        Counter = Counter + 1
   
    Loop
   

    rst.Close
    Set rst = Nothing
    DoCmd.SetWarnings True
   
    MsgBox ("Data genereret.")

End Sub

Terry > place an answer please
Avatar billede terry Ekspert
01. november 2007 - 15:13 #7
:o)
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