Avatar billede rasta123 Nybegynder
05. marts 2007 - 14:45 Der er 13 kommentarer

Fra recordset til SQL

Hej.. Jeg har et lille problem..

Jeg har lavet en funtion i excel, som vha. 3 parametre henter en værdi i en database.

Her er det vigtigste fra koden:

xSti = "c:\\Database\"
    Set db = OpenDatabase(xSti + "Database.mdb")
    Set datatabel1 = db.openrecordset("Data_Yearly1")
    With datatabel1
   
    .MoveLast
   
    For i = 1 To .RecordCount
      If .Fields(2) = firma Then
          Hent = .Fields(tablelocation1(Number) + tid)
                   
          Exit For
      End If
     
    .MovePrevious
    Next i


Databasen er en access database og tablelocation1(number)+ tid returnerer kolonnenummeret i databasen. Den består af ca. 180 kolonner.

Mit problem er, at jeg ville at ovenstående kode starter forneden i tabellen og arbejder sig opad, da den så støder på den nyest gemte, hvor firma = firma. Men det gør den ikke. Jeg kunne selvfølgelig prøve med een eller anden sorteringsfunktion, men jeg skal alligevel snart have konverteret basen fra  ACCESS til SQL..

Er der nogen der har en ide, hvordan jeg kan gøre ovenstående med sql queries istedet? Dvs. sortere tabellen efter dato eller højeste ID og så starte fra nyeste observation og bevæge sig opad indtil man støder på det firmanavn man søger. Derefter skal hent funtion være lige med kolonnen, hvor det data er, man har brug for..

Mange tak for hjælpen!
Avatar billede rasta123 Nybegynder
05. marts 2007 - 22:41 #1
Har nu forhøjet til 200 point!.. Please. Hjælp!
Avatar billede kabbak Professor
05. marts 2007 - 22:55 #2
et eksempel i sql

SELECT top 1  Kørsel.Bil, Last(Kørsel.Dato) AS SidsteOfDato, Kørsel.Påfyldt_liter
FROM Kørsel
GROUP BY Kørsel.Bil, Kørsel.Påfyldt_liter
HAVING (((Kørsel.Bil)="Toyota"))
ORDER BY Last(Kørsel.Dato) DESC;
Avatar billede kabbak Professor
05. marts 2007 - 23:01 #3
lidt kortere

SELECT TOP 1 Kørsel.Bil, Kørsel.Dato, Kørsel.Påfyldt_liter
FROM Kørsel
WHERE (((Kørsel.Bil)="Toyota"))
ORDER BY Kørsel.Dato DESC;
Avatar billede rasta123 Nybegynder
07. marts 2007 - 09:04 #4
Hej.. Sql koderne er ikke problemet.. Der er mere hvordan det bliver implementeret i vba, når man vil bruge sql kommandoer til at tilgå en access database..
Avatar billede kabbak Professor
07. marts 2007 - 19:16 #5
Et eksempel, du skal have reference til Microsoft DAO Object libaray


Public Sub HentData()
Dim rec As Recordset, Bil As String
  Dim DB As Database
Bil = InputBox("Tast bilmærke")
  Set DB = Workspaces(0).OpenDatabase("C:\data\db13.mdb")
  Set rec = DB.OpenRecordset _
    ("SELECT TOP 1 Kørsel.Bil, Kørsel.Dato, Kørsel.Påfyldt_liter " & _
    "FROM Kørsel " & _
    "WHERE (((Kørsel.Bil) = '" & Bil & "')) " & _
    "ORDER BY Kørsel.Dato DESC;" _
    , dbOpenSnapshot)

  'Række1, Række2,... og Tabel er navne angivet i din database

  Dim i As Integer 'i indeholder rækkenummeret på den celle der skrives til
  Do While Not rec.EOF
    i = i + 1
    ActiveSheet.Cells(i, 1) = rec!Bil
    ActiveSheet.Cells(i, 2) = rec!Dato
      ActiveSheet.Cells(i, 3) = rec!Påfyldt_liter
    rec.MoveNext
  Loop

rec.Close
Set DB = Nothing

End Sub
Avatar billede kabbak Professor
12. marts 2007 - 23:24 #6
hvordan går det ??
Avatar billede rasta123 Nybegynder
02. april 2007 - 13:11 #7
Hej Kabbak.. Jeg har lige været på ferie i et stykke tid.. Jeg skal nok lige få kigget på det igen snarest!
Avatar billede rasta123 Nybegynder
30. april 2007 - 16:31 #8
Hej Kabbak..

Som sagt har jeg været på ferie og har lige haft nogle andre projekter kørende, som jeg var nødt til at skulle have færdigt.. Men nu er jeg tilbage på sporet.. :)

Jeg har ændret min kode til følgende:


    Set DB = OpenDatabase(xSti + "DataCORE.mdb")
  Set datatabel1 = DB.OpenRecordset _
  ("SELECT * FROM Data_Yearly1" & _
    "ORDER BY Data_Yearly1.Tidspunkt DESC;" _
    , dbOpenSnapshot)
   
   
    With datatabel1
   
    .MoveLast
   
    For i = 1 To .RecordCount
      If .Fields(2) = firma Then
          Hent = .Fields(tablelocation1(Number) + tid)

Dette er den gamle kode:

Set DB = OpenDatabase(xSti + "DataCORE.mdb")
    Set datatabel1 = DB.OpenRecordset("Data_Yearly1")
   
    With datatabel1
    .MoveLast
   
    For i = 1 To .RecordCount
      If .Fields(2) = firma Then
          Hent = .Fields(tablelocation1(Number) + tid)


Den øverste kode virker desværre ikke og den nederste gør.. Kan ikke helt se, hvad jeg gør forkert. Den er også lidt svær at trevle op, da det jo er en worksheet function.

Iøvrigt, hvad gør dbOpenSnapshot??

Håber du har tid til at hjælpe..

Mvh Thomas
Avatar billede rasta123 Nybegynder
02. maj 2007 - 08:49 #9
når jeg debugger siger den: Fejl i FROM delsætningen!
Avatar billede rasta123 Nybegynder
09. maj 2007 - 16:36 #10
Jeg opdagede selv fejlen.. Der skal selvfølgelig være et mellemrum efter Data_Yearly  ... Smid et svar!
Avatar billede kabbak Professor
09. maj 2007 - 18:54 #11
tag point selv, jeg løste jo ikke spørgsmålet
Avatar billede rasta123 Nybegynder
14. maj 2007 - 15:45 #12
Jo du gjorde.. Du svarede på spørgsmålet.. Det er ikke din fejl, at jeg glemmer et mellemrum!
Avatar billede kabbak Professor
14. maj 2007 - 16:57 #13
et svar ;-))
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
Vi har et stort udvalg af Excel kurser. Find lige det kursus der passer dig lige her.

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