Avatar billede ds-zim Nybegynder
20. september 2000 - 14:32 Der er 32 kommentarer og
3 løsninger

HASTER ! VB/SQL problem i Access

Jeg har med en del hovedbrud prøvet at få VB6.0 core\'n til at udføre flg. SQL sætning;

SELECT TOP 1 KontraktID FROM Kontrakter ORDER BY KontraktID DESC

Det jeg egentlig søger er en metode til at hente sidste forekomst af KontraktID fra tabellen.
Denne værdi skal kunne returneres til en variabel og jeg er lidt i tvivl om at jeg kan bruge DoCmd.RunSQL og DoCmd.OpenQuery til det.
Ifølge hjælpfilen er DoCmd.RunSQL begrænset til visse typer af forespørgsler. Hvordan vil ovenstående blive kategoriseret ?
Action- eller DataDefinitionQuery ?
Point vil blive tildelt den som kan levere en tilfredsstillende, funktionel løsning!
Avatar billede ds-zim Nybegynder
20. september 2000 - 14:33 #1
Avatar billede martinlind Nybegynder
20. september 2000 - 14:54 #2
RunSQL er til at køre SQL kode som ikke \"kommer\" tilbage med et resultat ( x antal rækker, UPDATE, INSERT INTO osv.  ) hvor imod OpenQuery er til hvis der kommer et antal rækker tilbage ( SELECT )

Du kan evt. bruge \"SELECT max(kontraktID)\", det vil gi\' det højeste KontraktID der er, jeg formoder det var det der var idé\'en

/Martin
Avatar billede privaten Nybegynder
20. september 2000 - 14:55 #3
Kunne du ikke selv skrive en function der afleverer KontraktID?
Avatar billede privaten Nybegynder
20. september 2000 - 14:58 #4
Følgende sammensat i Access:

Function getKontraktID() As Integer
    Dim db As database
    Dim rs As Recordset
    Set db = CurrentDb()
    Set rs = db.OpenRecordset(\"SELECT KontraktID FROM Kontrakter ORDER BY KontraktID\")
    rs.MoveLast
    getKontraktID = rs(\"KontraktID\")
    rs.Close
    db.Close
End Function
Avatar billede martinlind Nybegynder
20. september 2000 - 15:01 #5
så er \"SELECT max(KontraktID)\" væsentlig hurtigere
en og ligge og fetvhe alle record, det andet foregår på SQL serveren og kører MEGET hurtigere, skal man bruge SQL, kan man jo lige så godt lave noget der er ordenligt og hurtig. *S*
Avatar billede privaten Nybegynder
20. september 2000 - 15:04 #6
Så Rigtigt, Så Rigtigt...
Avatar billede ds-zim Nybegynder
20. september 2000 - 15:11 #7
PIV !
Jeg bliver ved med at få fejlen \'Expected Function or Variable\' }(

Her er testkoden;

Private Sub Kommandoknap2_Click()

  TESTY = DoCmd.OpenQuery(\"KontraktKald\", acViewNormal, acReadOnly)
 
End Sub

Hvor \'Kontraktkald\' = SELECT Max([Kontrakter].[KontraktID]) AS MaxID FROM Kontrakter;

Der må mangler et eller andet plugin, måske en DLL eller ?

Jeg har før rodet med en \"Component Manager\" (ikke sikker på navnet), men kan ikke huske hvor i menu\'n jeg finder den.

*Sighs*
Avatar billede martinlind Nybegynder
20. september 2000 - 15:18 #8
Prøv med :
\'Kontraktkald\' = SELECT Max(KontraktID) AS MaxID FROM Kontrakter;

Avatar billede ds-zim Nybegynder
20. september 2000 - 15:25 #9
Dim Bleh As Long
Bleh = \"SELECT Max(KontraktID) AS MaxID FROM Kontrakter\"

Hmm, ovenstående giver mig en type mismatch!
Avatar billede privaten Nybegynder
20. september 2000 - 15:30 #10
Kan man anvende DoCmd til det?, jeg mener:

Afleverer DoCmd resultat?, mig bekendt sker det ikke!

Forslag sammensat af MartinLind\'s forslag og mit ovenstående:

Function getKontraktID() As Integer
    Dim db As database
    Dim rs As Recordset
    Set db = CurrentDb()
    Set rs = db.OpenRecordset(\"SELECT MAX(KontraktID) FROM Kontrakter\")
    rs.MoveFirst
    getKontraktID = rs(0)
    rs.Close
    db.Close
End Function
Avatar billede privaten Nybegynder
20. september 2000 - 15:30 #11
Dim Bleh As Long
Bleh = getKontraktID
Avatar billede martinlind Nybegynder
20. september 2000 - 15:32 #12
Hvilken type er KontraktID ??
Avatar billede privaten Nybegynder
20. september 2000 - 15:34 #13
Uanset hvilken type KontraktID er kan da ikke skrive:

Dim Bleh As Long
Bleh = \"SELECT Max(KontraktID) AS MaxID FROM Kontrakter\"

og slippe godt fra det...

Bleh defineres som \"Long\" og i den forsøger man at hælde en streng ind

Avatar billede ds-zim Nybegynder
20. september 2000 - 15:42 #14
I det pågældende eksempel er KontraktID et autonum. felt.
jeg var under indtryk af at man skulle dim\'e en variabel til Long for at kunne returnere en sådanne værdi.

->Privaten

Med et simpelt knaptryk, crashede jeg min client TOTALT, da den udførte dit ovenstående funktionforslag.
Jeg tvivler på (indtastnings-)fejl fra min side af, da jeg \"bare\" lavede cut\'n\'paste !

I har ingen idé om kravene til evt. req. plugins ?
Avatar billede privaten Nybegynder
20. september 2000 - 15:48 #15
Du kan ikke paste mit forslag ind, det er som beskrevet hullet ind i Access. Du er nødt til at ændre db & rs variable jf. VB6.0, ellers virker det ikke!

Jeg tror ikke det er et spørgsmål om plugins, det SKAL kunne lade sig gøre ;-)
Avatar billede martinlind Nybegynder
20. september 2000 - 15:49 #16
Hvis vi snakker ANSI92 SQL så SKAL \"SELECT Max(KontraktID) AS MaxID FROM Kontrakter\", hvis feltet KontrakID er i tabelen Kontrakter, hvis det ikke virker kører VB6 ikke efter en std. ANSI SQL ( så svaret skal findes i hjælpen )

/Martin
Avatar billede ds-zim Nybegynder
20. september 2000 - 15:59 #17
Oho ! Det forklarer jo en del :)
Jeg har ikke arbejdet med db og rs før så jeg er helt ude i hampen her :(
Skal db sættes = path\'n til DB\'n ?

    rs.MoveFirst
    getKontraktID = rs(0)

Ovenstående sætter \"bare\" getKontraktID = første forekomst i rs right ?

PS : Jeg kiggede på DataSource Property & Connection Object, i hjælpfilen.
Nogen andre ting jeg skal kigge på ?
Avatar billede ds-zim Nybegynder
20. september 2000 - 16:03 #18
-> Martinlind

Har du noget link til mere info på ANSI92 SQL ? (Udover www.ansi.org :) har ikke lige 235$ til den slags)

Jeg har ingen problemer med SQLsætningen! Balladen starter når jeg prøver at kalde den fra VB !
Avatar billede privaten Nybegynder
20. september 2000 - 16:05 #19
et lille eksempel, der måske hjælper dig på vej:

Sub TestADO()
  Dim db as ADODB.Conection
  Dim rs as New ADODB.Recordset

  \'Set the provider name
  db.Provider = \"Microsoft.Jet.OLEDB.4.0\"

  \'Open a connection to the data
  db.Open \"C:\\ds-zim.mdb\"

  \'Open a recordset with a keyset cursor
  rs.Open \"SELECT Max(KontraktID) AS MaxID FROM Kontrakter\", c,adOpenKeyset

  rs.MoveFirst
  dim Antal as Integer
  Antal = rs(0)

  \'Clean up
  rs.close
  db.close

End Sub
Avatar billede martinlind Nybegynder
20. september 2000 - 16:11 #20
dz-zim > Hvis du har styr på SQL sætningen, så kan jeg nok ikke være med mere, jeg kender ikke VB, men kan da anbefale Delphi *S*

SQL-Sætningen SKAL virke, så du må kæmpe med VB syntaksen indtil det virker.
Avatar billede ds-zim Nybegynder
20. september 2000 - 16:15 #21
-> MartinLind

Jeg takker 4 den hurtige indsats !
Jeg var ikke bekendt med Max(Felt), så jeg vil C om jeg kan få sat nogen point af til dig :)
Avatar billede ds-zim Nybegynder
20. september 2000 - 16:18 #22
Skal det her i piben eller i skraldespanden ? *S*

Function getKontraktID() As Integer
   
\'    Dim db As Database
    Dim db As ADODB.Conection
\'    Dim rs As Recordset
    Dim rs As New ADODB.Recordset
   
    db.Provider = \"Microsoft.Jet.OLEDB.4.0\"
   
    db.Open \"E:\\Database\\Work\\Altass#100.mdb\"
   
\'    Set db = CurrentDb()
\'    Set rs = db.OpenRecordset(\"SELECT MAX(KontraktID) FROM Kontrakter\")
   
    rs.Open \"SELECT Max(KontraktID) AS MaxID FROM Kontrakter\", c, adOpenKeyset
   
    rs.MoveFirst
    Dim Antal As Integer
    Antal = rs(0)
   
    rs.Close
    db.Close

End Function
Avatar billede ds-zim Nybegynder
20. september 2000 - 16:20 #23
Beklager, men jeg bliver nødt til at stoppe 4 idag }(
Skal i skole/på kursus kl. 17:00 og skal også have klemt en fråder ind i tidsplanen ..
Tak for indsatsen ! ( og tålmodigheden *Nudge Privaten* :)
Avatar billede privaten Nybegynder
20. september 2000 - 17:10 #24
Ser fornuftigt ud, omend du ikke behøver \"AS MaxID\" (fordi du ikke anvender felt-navnet til at hive data ud med)
Avatar billede ds-zim Nybegynder
21. september 2000 - 10:10 #25
Dim db As ADODB.Conection
Dim rs As New ADODB.Recordset

Disse giver mig \'Userdefined Type not defined\'.

db.Provider = \"Microsoft.Jet.OLEDB.4.0\"
db.Open \"E:\\Database\\Work\\Altass#100.mdb\"

resulterer i \'Method or Data Member not found\'.

}(
Avatar billede ds-zim Nybegynder
21. september 2000 - 11:17 #26
-> MartinLind

Vil det være muligt med en forespørgsel/Ren SQL at kopieret værdien \'Maks([Kontrakter].KontraktID])\' til en anden tabel ?
Jeg er ikke stiv nok i SQL til at oprette en sådanne forespørgsel :(
Men idéen er at efter at have udført Maks([Kontrakter].KontraktID]), skal den værdi gemmes i en anden tabel ([System].PågældendeKontraktID).
Så kan jeg bruge noget så simpelt som DLookUp til at hente værdien :)

*Håbe Håbe*
Avatar billede privaten Nybegynder
21. september 2000 - 12:25 #27
Så skal du op i references og sætte et hak i \"ActiveX Data Objects\"
Avatar billede privaten Nybegynder
21. september 2000 - 12:27 #28
(Under project)
Avatar billede ds-zim Nybegynder
21. september 2000 - 13:39 #29
Jeg har flere valgmuligheder og har krydset flg. af;

MS ActiveX Data Objects (Multi-dimensional) 1.0
MS ActiveX Data Objects 2.1
MS ActiveX Data Objects Recordset 2.1

Jeg arbejder som sagt i Office2K og har valgt den fulde installation.
Med lidt held vil en større brugergruppe få glæde af mit produkt og jeg vil gerne vide om den indstilling jeg ændrer vil være permanent!
Altså, at de, som vil benytte produktet, ikke skal ind og indstille \'References\'.
Avatar billede ds-zim Nybegynder
21. september 2000 - 13:48 #30
Function getKontraktID() As Integer
   
\'    Dim db As Database
    Dim db As ADODB.Connection
\'    Dim rs As Recordset
    Dim rs As New ADODB.Recordset

    db.Provider = \"Microsoft.Jet.OLEDB.4.0\"
   
    db.Open \"E:\\Database\\Work\\Altass#100.mdb\"
   
    Set db = CurrentDb()
    Set rs = db.OpenRecordset(\"SELECT MAX(KontraktID) FROM Kontrakter\")
   
    rs.Open \"SELECT Max(KontraktID) FROM Kontrakter\", c, adOpenKeyset
   
    rs.MoveFirst
    Public Antal As Integer
    Antal = rs(0)
   
    rs.Close
    db.Close

End Function

Jeg får fejlen \'Compile Error : Variable not defined\' i linien
    rs.Open \"SELECT Max(KontraktID) FROM Kontrakter\", c, adOpenKeyset

hvor , c, er markeret blåt. Er det ikke et argument til rs.Open ?
Avatar billede ds-zim Nybegynder
21. september 2000 - 13:52 #31
!*! Jeg har fattet at man ikke kan have public variables i en sub/function !*!
Såøh, C bort fra det i denne omgang (erstattede Public med Dim)

Jeg har prøvet og udelade \', c,\' og får nu fejlen \'Object variable or With block variable not set\'
Avatar billede privaten Nybegynder
21. september 2000 - 14:47 #32
Udskift \'c\' med db
Avatar billede privaten Nybegynder
21. september 2000 - 14:50 #33
Det var min fejl, jeg editerede i den gamle funktion, og var ikke opmærksom på det lille \'c\'
Avatar billede ds-zim Nybegynder
25. september 2000 - 10:05 #34
Nu får jeg fejlen \'Object Variable or With block variable not set\' !

Jeg har løst mit problem ved at benytte handlingsforespørgsler istedet (DoCmd.RunSQL).
Smid lige et svar \'Privaten\', så du kan få point for indsatsen.

Cheers, Zim
Avatar billede privaten Nybegynder
25. september 2000 - 10:32 #35
Hermed 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
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

Seneste spørgsmål Seneste aktivitet
I går 21:00 Libre Office Impress Af Frank i Andre styresystemer
I går 11:47 VB script Af Jenshentze i Word
I går 11:21 Popup ved opstart Af mort1 i Windows
04/0918:50 Slet lokal konto Af ErikHg i Windows
04/0916:05 Ændre tal i en celle Af xvid i Excel