Avatar billede region Nybegynder
22. november 2000 - 15:02 Der er 24 kommentarer og
1 løsning

\"vende\" tabeller...!!! haster

Jeg har 2 tabeller table 1 og table 2.

Table 1 :

Måned | nøgletal |firmna 1 | firma 2 |
jan    omsætning  100        200
jan    løn        10        30
feb    omsætning  150        280
feb    løn        15        35

denne ønskes overført til table 2 så denne ser ud som flg :

mdr | selskab | omsætning | løn |
jan  firma 1    100        10 
feb  firma 1    150        15
jan  firma 2    200        30
feb  firma 2    280        35

Jeg har tidligre forsøgt med referencer via excel http://www.eksperten.dk/spm/28781
Dog uden held da dette er ustabilt.

Point gives for den korrekte brugbare løsning. ( evt. del-point. )
Avatar billede region Nybegynder
22. november 2000 - 15:06 #1
Der er da vist sket et skred i formateringen i table 1...!!!! det er fuldstændig ligemeget hvad rækkeflg table 2 står i, bare opbygningen er den samme.

med rækkefølge mener jeg :

jan
feb
jan
feb

må gerne stå som
jan
jan
feb
feb

eller hvad man nu kunne finde på.


mdr i table 2 skulle have heddet måned
Avatar billede privaten Nybegynder
22. november 2000 - 15:08 #2
Send db + evt. beskrivelse til privaten@ofir.dk
Avatar billede janbangm Nybegynder
22. november 2000 - 15:15 #3
Har du prøvet de guide det hedder krydstabuleringforspørgsel når du vælger forespørgelser - Ny forespøggsel.

D
Avatar billede region Nybegynder
22. november 2000 - 15:17 #4
det vil jeg vælge ikke at gøre fordi den indeholder fortrolige firmaoplysninger.

Du kan bare lave et lille eksempel i en DB og sende til nt@solar.dk

så kan jeg forhåbentlig selv overføre denne til min egen dB.

Min db indeholder ca 20 forskellige nøgletal ( omsætn., løn ect. ) og 15 forskellige selskaber.

Avatar billede region Nybegynder
22. november 2000 - 15:19 #5
har ikke arbejdet med krydstabulering...send et evt. et eks.

kan ikke give point for dette svar...sorry.
Avatar billede mkelle1 Nybegynder
22. november 2000 - 15:25 #6
Hej Region
Jeg har stort set skrevet nogle sql sætninger der kan gøre det, men jeg bliver nødt til at benytte et scriptsprog. Da jeg normalt arbejder i PHP, vil jeg lige spørge om det er ok i PHP. (ellers er der ingen mening i at fortsætte)

Hilsen

Mads
Avatar billede privaten Nybegynder
22. november 2000 - 15:25 #7
Det kunne bare være 2 rækker med dummy-data
Avatar billede region Nybegynder
22. november 2000 - 15:30 #8
privaten <<

ja det kunne. bare opbygningen er den samme som skitseret, og forberedt for udbyggelse af felter.

mkelle1 <<

kender ikke PHP, så VB ville være at foretrække da jeg her forsøger at dygtiggøre mig og forstå hvad VB indeholder. ( ved pt. stort set intet om VBA )
Avatar billede privaten Nybegynder
22. november 2000 - 15:35 #9
Jeg mente nu om du kunne sende en db indeholdende det rigtige layout med 2 rækker dummydata
Avatar billede region Nybegynder
22. november 2000 - 15:48 #10
lige en kort rettelse...

Det er table 2 der skal opdatere table 1 og ikke omvendt som nævnt i spørgsmålet....

Avatar billede region Nybegynder
22. november 2000 - 15:49 #11
privaten <<

er sendt...
Avatar billede lkp Nybegynder
22. november 2000 - 15:49 #12
Hej Region

Dvs du har tabel 2, og ønsker tabel 1?

Med venlig hilsen

LKP
Avatar billede region Nybegynder
22. november 2000 - 15:51 #13
si senor...

jeg taster i table 2 og ønsker herefter dataene kopieret til table 1...

Avatar billede privaten Nybegynder
22. november 2000 - 16:42 #14
fremsendt
Avatar billede lkp Nybegynder
22. november 2000 - 16:42 #15
Hej Region

Nedenstående kode udfører den funktion du ønsker.

Den er dog meget statisk, dvs. den går ud fra, at firmaerne hedder firma1, firma2 osv.

Hvis det er få firmaer du arbejder med, er dette OK, men hvis der er flere og antallet kan variere skal koden gøres mere dynamisk.

Det samme gør sig gældende for nøgletallene.

Hvis det ikke er nødvendigt, at dataene smides i en specifik tabel (Tabel1), men derimod gerne må smides i en tabel, der oprettes til formålet ved hver kørsel, og dermed kan oprettes med de felter der er nødvendige (firmanavn1, firmanavn2 osv.), må du meget gerne lade mig det vide, så jeg kan ændre dette.

Desuden går jeg ud fra, at du bruger Access 2K, og dermed har en reference til ADO.

--- Kode start ---

Public Sub TurnTable()

    Dim lngFirma1 As Long
    Dim lngFirma2 As Long
   
    Dim rstTable1 As ADODB.Recordset
    Dim rstMonth As ADODB.Recordset
   
    Set rstTable1 = New ADODB.Recordset
    Set rstMonth = New ADODB.Recordset
   
    DoCmd.SetWarnings False
    DoCmd.RunSQL \"DELETE * FROM table1\"
    DoCmd.SetWarnings True
   
    rstTable1.Open \"table1\", CurrentProject.Connection, adOpenDynamic, adLockOptimistic
   
    rstMonth.Open \"SELECT DISTINCT Måned FROM table2\", CurrentProject.Connection, adOpenDynamic, adLockReadOnly
   
    Do While Not rstMonth.EOF
        lngFirma1 = DLookup(\"Omsætning\", \"table2\", \"Måned = \'\" & rstMonth(0) & \"\' AND Selskab = \'Firma1\'\")
        lngFirma2 = DLookup(\"Omsætning\", \"table2\", \"Måned = \'\" & rstMonth(0) & \"\' AND Selskab = \'Firma2\'\")
        rstTable1.AddNew
        rstTable1(\"Måned\") = rstMonth(0)
        rstTable1(\"Nøgletal\") = \"Omsætning\"
        rstTable1(\"Firma1\") = lngFirma1
        rstTable1(\"Firma2\") = lngFirma2
        rstTable1.Update
        lngFirma1 = DLookup(\"Løn\", \"table2\", \"Måned = \'\" & rstMonth(0) & \"\' AND Selskab = \'Firma1\'\")
        lngFirma2 = DLookup(\"Løn\", \"table2\", \"Måned = \'\" & rstMonth(0) & \"\' AND Selskab = \'Firma2\'\")
        rstTable1.AddNew
        rstTable1(\"Måned\") = rstMonth(0)
        rstTable1(\"Nøgletal\") = \"Løn\"
        rstTable1(\"Firma1\") = lngFirma1
        rstTable1(\"Firma2\") = lngFirma2
        rstTable1.Update
        rstMonth.MoveNext
    Loop

End Sub

--- Kode slut ---

Med venlig hilsen

LKP
Avatar billede moses Praktikant
22. november 2000 - 16:49 #16
ÆV - samme løsning herfra.
Bare fordi man skal hjem med bus, så misser man 1000 point - til lykke lkp
Avatar billede moses Praktikant
23. november 2000 - 08:55 #17
Skulle lkp\'s nu være forkert alligevel (eller meget langsommere pga. LOOKUPS), så er her min løsning:

Public Sub VendTabel()
   
    Dim MyDB As Database
    Dim MyRecordset As Recordset
    Dim MyRecordset2 As Recordset
   
    Set MyDB = CurrentDb
   
    Set MyRecordset1 = MyDB.OpenRecordset(\"Tabel 1\")
    Set MyRecordset2 = MyDB.OpenRecordset(\"Tabel 2\")
   
    MyRecordset1.MoveFirst
    Do
        With MyRecordset2
            .AddNew
            ![Maaned] = MyRecordset1![Maaned]
            ![Selskab] = \"Firma1\"
            ![Værdi] = MyRecordset1![Nøgletal]
            ![Tal] = MyRecordset1![Firma1]
            .Update
            .AddNew
            ![Maaned] = MyRecordset1![Maaned]
            ![Selskab] = \"Firma2\"
            ![Værdi] = MyRecordset1![Nøgletal]
            ![Tal] = MyRecordset1![Firma2]
            .Update
        End With
        MyRecordset1.MoveNext
    Loop Until MyRecordset1.EOF
   
    MyRecordset2.Close
    MyRecordset1.Close
    DoCmd.OpenQuery \"Tabel 2 Query\"
   
End Sub


Den omtalte Query \"Tabel 2 Query\" ser sådan her ud:

TRANSFORM First([Tabel 2].Tal) AS FirstOfTal
SELECT [Tabel 2].Maaned, [Tabel 2].Selskab
FROM [Tabel 2]
GROUP BY [Tabel 2].Maaned, [Tabel 2].Selskab
PIVOT [Tabel 2].Værdi;
Avatar billede moses Praktikant
23. november 2000 - 08:56 #18
Fordelen ved min løsning er også, at du får dine data på normalform i Tabel 2.
Avatar billede region Nybegynder
23. november 2000 - 10:09 #19
Jeg har det princip at først til mølle....

så drfor står privaten til at modtage pointene...der er sendt en db til mig hvor problemet er løst, han er dog ved at rette et par skønhedsfejl.

Jeg håber ikke at nogen af eksperterne her synes det er unfair med først til mølle princippet..
Avatar billede region Nybegynder
23. november 2000 - 11:41 #20
Jeg vil gerne hermed tildele privaten de meget meget velfortjente 1000 point. Dette gøres ikke mindst for den ubeskrivelige service han har leveret ved endda pr telefon at dalagtigøre sin viden om scriptet til mig.

Endnu engang tusinde tak for din hjælp. Folk som dig kunne der godt være flere af i denne verden.
Avatar billede lkp Nybegynder
23. november 2000 - 11:48 #21
Hej Region

Kan du ikke sende en kopi af din løsning til mig på: lars@monitor-lk.dk

Med venlig hilsen

LKP
Avatar billede privaten Nybegynder
23. november 2000 - 12:01 #22
Takker, ikke mindst for de pæne ord.

Til LKP, løsningen minder meget om din egen.

Gennemløb af input-tabellen med opsamling af data sålænge der stadig er nogle tilbage og skrivning af nye records i table1.

Avatar billede lkp Nybegynder
23. november 2000 - 12:19 #23
Hej Privaten

Ovenstående kommentar skulle selvfølgelig være til dig.

Okay (du har altså ikke løst det på en eller anden super genial måde ;-) )

Ha en god dag, og tillykke med de mange point.

Med venlig hilsen

LKP
Avatar billede region Nybegynder
23. november 2000 - 14:05 #24
for mig genial.... men hva jeg er jo heller ikke VB kyndig...

her er koden:

Function transfer() As Boolean
    Dim db As Database
    Dim rs1 As Recordset
    Dim rs2 As Recordset
    Set db = CurrentDb
    Set rs1 = db.OpenRecordset(\"Table2\")
    Dim firma1, firma2, maaned, oms1, oms2, loen1, loen2 As String
   
    If Not rs1.EOF Then
        rs1.MoveFirst
    End If
   
    db.Execute (\"Delete * from Table1\")
   
    Set rs2 = db.OpenRecordset(\"Table1\")
    While Not rs1.EOF
        maaned = rs1(\"måned\")
       
        firma1 = rs1(\"selskab\")
        oms1 = rs1(\"omsætning\")
        loen1 = rs1(\"løn\")
       
        rs1.MoveNext
        firma2 = rs1(\"selskab\")
        oms2 = rs1(\"omsætning\")
        loen2 = rs1(\"løn\")
       
        If maaned <> rs1(\"måned\") Then
            MsgBox \"Der er uorden i input data\"
        End If
               
        rs2.AddNew
        rs2(\"måned\") = maaned
        rs2(\"nøgletal\") = \"omsætning\"
        rs2(\"solar AS\") = oms1
        rs2(\"solar AB\") = oms2
        rs2.Update
       
        rs2.AddNew
        rs2(\"måned\") = maaned
        rs2(\"nøgletal\") = \"løn\"
        rs2(\"solar AS\") = loen1
        rs2(\"solar AB\") = loen2
        rs2.Update
       
        rs1.MoveNext
    Wend
    rs1.Close
    rs2.Close
    transfer = True
End Function
Avatar billede moses Praktikant
28. november 2000 - 13:35 #25
Næh ingen problem med mig. \"Først til mølle\" er ok.
Det var også derfor at jeg skrev: I tilfælde af at det andet var forkert......
Havde du brugt lkp\'s løsning og suppleret op med et par dele fra min, så havde det såmænd også været ok.
Det er trods alt sjovest at vinde, når det går ærligt for sig.
OG DET ER PISSEHÅRDT AT TABE UDEN AT TUDBRØLE  ;-)
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