Avatar billede Gamper Nybegynder
30. juni 2011 - 10:09 Der er 22 kommentarer og
1 løsning

Flere opslag i streng

Hej,
Jeg har en kode hvor jeg ønsker at summe værdierne for en række kontonumre på en given dato ved at slå i en Access Database.
Koden fungerer fint, hvis jeg blot summer for dato og ét kontonummer, men hvis jeg ønsker at summe for flere værdier på en given dato fungere koden ikke.
Hvordan separeres numrene i min streng?

Koden er som følger:

Function HentLikv(ByVal Enhed As String, ByVal dato As Date)

    'Funktionen henter saldo for en given dato i tabellen
   
    Dim ws As DAO.Workspace
    Dim DB As DAO.Database
    Dim rs As DAO.Recordset
    Dim strSQL As String
    Dim strEnhed As String
   
    'Omformatterer dato
    dato = Format(dato, "mm-dd-yyyy")

    'Vælger mellem x og y
    If Enhed = "x" Then
        strEnhed = " AND Nummer =3001859 and 3100222 and 3100222 and 3100222"
          Else
    If Enhed = "y" Then
        strEnhed = " AND Nummer =3001055"
    Else
        strEnhed = ""
    End If
    End If
   
    'Forbinder til databasen
    Set ws = DBEngine.Workspaces(0)
    Set DB = ws.OpenDatabase("S:\....mdb")

    'Henter data
    Let strSQL = "SELECT sum(BogfoertSaldoDKK) as test FROM TABEL WHERE Dato =#" & dato & "#" & strEnhed
    Set rs = DB.OpenRecordset(strSQL)
   
    HentLikv = rs!test

End Function

Håber nogen kan hjælpe..
/Gamper
Avatar billede erikjacobsen Ekspert
30. juni 2011 - 10:52 #1
I stedet for

    strEnhed = " AND Nummer =3001859 and 3100222 and 3100222 and 3100222"

skal du enten

    strEnhed = " AND (Nummer =3001859 or  Nummer =3100222  Nummer =3100222 or Nummer =3100222)"

eller, måske lidt simplere

    strEnhed = " AND Nummer IN (3001859,3100222,3100222,3100222)"
Avatar billede erikjacobsen Ekspert
30. juni 2011 - 10:53 #2
Ok, den midterste manglede en "or"

    strEnhed = " AND (Nummer =3001859 or  Nummer =3100222  or Nummer =3100222 or Nummer =3100222)"
Avatar billede Gamper Nybegynder
30. juni 2011 - 11:29 #3
Hej,
Tak for input.
Når jeg anvender dit forslag, så summer den blot for én af kontonumrene.
Er der noget andet galt nede i min linje hvor jeg forsøger at summe data fra Access databasen?

Databsen består af mange kontonumrene som indlæses dagligt. Det kan være 50 kontonumre på en given dato, hvor jeg så vil have en sum udvalgte kontonumre.
Avatar billede erikjacobsen Ekspert
30. juni 2011 - 11:35 #4
Du mener at du kan se fra resultatet, at den kun summer tal fra eet af kontonumrene, selv om du anvender eet af de 2 forslag jeg kom med?

Det kan jeg ikke få til at passe (men jeg ved så heller ikke mere end du har angivet i spørgsmålet).

Hvordan ser koden så ud nu?
Avatar billede Gamper Nybegynder
30. juni 2011 - 11:35 #5
Det virker hvor jeg bruger Nummer = ... or Nummer = ...
Tak. :-)

(men ikke på den simple måde du skriver det med komma - der summer den ikke for alle kontonumre)

Er der en simplere måde at skrive det på end Nummer=... or?
Har måske i et tilfælde 25 kontonumre..
Avatar billede erikjacobsen Ekspert
30. juni 2011 - 11:43 #6
Hmm, ok, det er Access der er nedenunder - det er en lettere forkrøblet SQL, og jeg kan ikke huske alle steder de går egne veje. Det kan godt være den IN-konstruktion er een af dem.

Du kan som alternativ have en ny tabel med de kontonumre du bruger, og så JOINe dig til resultatet.
Avatar billede Gamper Nybegynder
30. juni 2011 - 11:54 #7
Okai, jeg forstår idéen ;-)
Men, jeg ved ikke hvordan det skal skrives i koden..

Jeg vil så have to tabeller i Access, hvor den ene er min nuværende med daglig data og den anden tabel er hvor kontonumrene er defineret hvor de hører til.
Er det korrekt forstået?

Hvordan skrives det så i koden?
Avatar billede erikjacobsen Ekspert
30. juni 2011 - 11:59 #8
Ja, skitsemæssigt, så laver du en tabel "xx" med felt "yy":

Tabel xx
yy
3001859
3100222
3100222
3100222

Og så laver du din SQL sætning sådan ca.:

    Let strSQL = "SELECT sum(BogfoertSaldoDKK) as test FROM TABEL JOIN xx ON xx.yy=TABEL.Nummer WHERE Dato =#" & dato & "#"
Avatar billede Gamper Nybegynder
30. juni 2011 - 13:01 #9
hmm..
Hvordan så med if sætningen?
Avatar billede erikjacobsen Ekspert
30. juni 2011 - 13:21 #10
Det nemmeste er vel at skrive de 3 varianter af SQL-sætningen i de 3 tilfælde du finder med dine if-er.
Avatar billede Gamper Nybegynder
30. juni 2011 - 13:25 #11
Ok. Jeg kan dog ikke få SQL-sætningen til at fungere..
Er den korrekt?

Let strSQL = "SELECT sum(BogfoertSaldoDKK) as test FROM TABEL JOIN TABELMEDKONTONR ON TABELMEDKONTONR.YY=TABEL.Nummer WHERE Dato =#" & dato & "#"
Avatar billede erikjacobsen Ekspert
30. juni 2011 - 13:31 #12
Den ser rigtig nok ud. Hvad er det, der ikke fungerer?
Avatar billede Gamper Nybegynder
30. juni 2011 - 13:36 #13
Fra funktionen får jeg blot #VÆRDI i Excel.. (?)
Avatar billede Gamper Nybegynder
30. juni 2011 - 13:39 #14
Function HentLikv(ByVal Enhed As String, ByVal dato As Date)

    'Funktionen henter saldo for en given dato i tabellen     
    Dim ws As DAO.Workspace
    Dim DB As DAO.Database
    Dim rs As DAO.Recordset
    Dim strSQL As String
    Dim strEnhed As String
   
    'Omformatterer dato
    dato = Format(dato, "mm-dd-yyyy")
   
    'Forbinder til databasen
    Set ws = DBEngine.Workspaces(0)
    Set DB = ws.OpenDatabase("S:\....mdb")
   
    'Henter data
    If Enhed = "X" Then
        Let strSQL = "SELECT sum(BogfoertSaldoDKK) as test FROM TABEL JOIN TABELMEDKONTONR ON TABELMEDKONTONR.YY=TABEL.Nummer WHERE Dato =#" & dato & "#"
        Set rs = DB.OpenRecordset(strSQL)
    Else
    If Enhed = "Y" Then
        Let strSQL = "SELECT sum(BogfoertSaldoDKK) as test FROM TABEL JOIN TABELMEDKONTONR2 ON TABELMEDKONTONR2.ZZ=TABEL.Nummer WHERE Dato =#" & dato & "#"
        Set rs = DB.OpenRecordset(strSQL)
    Else
        Let strSQL = ""
    End If
    End If
   
    HentLikv = rs!test

End Function
Avatar billede erikjacobsen Ekspert
30. juni 2011 - 14:08 #15
Hvis du ikke kalder med "x" eller med "y", så får du ikke udført en nogen SQL-sætning. Jeg ved ikke lige om det er derfor...?
Avatar billede Gamper Nybegynder
30. juni 2011 - 14:10 #16
Den originale kode er:

Function HentLikv(ByVal Enhed As String, ByVal dato As Date)

    'Funktionen henter saldo for en given dato i tabellen LikviditetLPI
   
    Dim ws As DAO.Workspace
    Dim DB As DAO.Database
    Dim rs As DAO.Recordset
    Dim strSQL As String
    Dim strEnhed As String
   
    'Omformatterer dato
    dato = Format(dato, "mm-dd-yyyy")
   
    'Forbinder til databasen
    Set ws = DBEngine.Workspaces(0)
    Set DB = ws.OpenDatabase("S:\RF\Database\RFData.mdb")
   
    'Henter data
    If Enhed = "LPK" Then
        Let strSQL = "SELECT sum(BogfoertSaldoDKK) as test FROM LikviditetLPK JOIN LPKkontonumre ON LPKkontonumre.LPK=LikviditetLPK.Nummer WHERE Dato =#" & dato & "#"
        Set rs = DB.OpenRecordset(strSQL)
    Else
  ' If Enhed = "LPB" Then
        Let strSQL = "SELECT sum(BogfoertSaldoDKK) as test FROM LikviditetLPK JOIN LPBkontonumre ON LPBkontonumre.LPB=LikviditetLPK.Nummer WHERE Dato =#" & dato & "#"
        Set rs = DB.OpenRecordset(strSQL)
    'Else
    '  Let strSQL = ""
    'End If
    End If
   
    HentLikv = rs!test

End Function
Avatar billede erikjacobsen Ekspert
30. juni 2011 - 14:17 #17
Jo, men du giver ikke rs en værdi, hvis du ikke har enhed lig med "LPK" eller "LPB" - men jeg ved ikke hvordan du kalder din funtion.
Avatar billede Gamper Nybegynder
30. juni 2011 - 14:26 #18
Jeg skriver enten =HentLikv("LPK";dato) eller =HentLikv("LPB";dato)

Tak for din vedvarende hjælp ;-)
Avatar billede erikjacobsen Ekspert
30. juni 2011 - 14:34 #19
I den sidste kode du viser, udfører du to sql-sætninger, sådan som du har udkommenteret noget af if-sætningen. Det er selvfølgelig ikke rigtigt, men jeg kan ikke se om det har nogen indflydelse på fejlen.
Avatar billede Gamper Nybegynder
30. juni 2011 - 15:43 #20
Jeg giver op! ;-( Jeg er rimelig ny i VBA og er for mongol til at løse problemet desværre. Venter på en  kommer hjem fra ferie der har lidt mere teknisk snilde.

Du skal have tusind tak for hjælpen! :-)
Avatar billede erikjacobsen Ekspert
30. juni 2011 - 15:45 #21
Ok. Jeg kender heller ikke noget til VBA.
Avatar billede Gamper Nybegynder
29. juli 2011 - 08:59 #22
slut
Avatar billede Gamper Nybegynder
29. juli 2011 - 09:00 #23
sådan => slut
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
Kurser inden for grundlæggende programmering

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