Avatar billede tma_oksboel Nybegynder
10. oktober 2002 - 10:08 Der er 17 kommentarer og
1 løsning

Kobling af 'Stored procedures' til forms og reports

Hej

Jeg er ved at lære noget om 'Stored procedures'. Jeg har fundet ud af, at oprette en procedure som udvælger nogle data. Heraf kommer jo så et recordset. Nu mangler jeg blot at kunne benytte dette recordset i forbindelse med formularer og rapporter. Hvordan kan jeg lave denne kobling?

win xp, office xp.

Torben
PS. Selve koden ser således ud, selvom den måske ikke er nødvendig:
Sub OpretProcedure()
    Dim Forbindelse As New ADODB.Connection
    Set Forbindelse = ÅbnForbindelse
    Dim Kommando As New ADODB.Command
    Dim Katalog As New ADOX.Catalog
    Set Kommando.ActiveConnection = Forbindelse
    Kommando.CommandText = "PARAMETERS [ETPLADESELSKAB] Text;" & _
        "SELECT FORNAVN & ' ' & EFTERNAVN AS KUNSTNER, TITEL, FORMAT, PLADESELSKAB FROM " & _
        "MUSIK WHERE PLADESELSKAB = [ETPLADESELSKAB]"
    Set Katalog.ActiveConnection = Forbindelse
    Call Katalog.Procedures.Append("Kunstner efter pladeselskab", Kommando)
    Set Kommando = Nothing
    Set Katalog = Nothing
    Set Forbindelse = Nothing
       
End Sub
Sub KørProcedure()
    Dim Forbindelse As ADODB.Connection
    Set Forbindelse = ÅbnForbindelse
    Dim Katalog As New ADOX.Catalog
    Set Katalog.ActiveConnection = Forbindelse
    Dim Kommando As ADODB.Command
    Set Kommando = Katalog.Procedures("Kunstner efter pladeselskab").Command
    Dim Pladeselskaber As ADODB.Recordset
    Set Pladeselskaber = Kommando.Execute(, Array("Virgin"))
    Pladeselskaber.MoveFirst
    Do While Pladeselskaber.EOF = False
        Debug.Print Pladeselskaber("Kunstner")
        Pladeselskaber.MoveNext
    Loop
    Pladeselskaber.Close
    Set Pladeselskaber = Nothing
    Set Kommando = Nothing
    Set Katalog = Nothing
    Forbindelse.Close
    Set Forbindelse = Nothing
End Sub
Avatar billede terry Ekspert
10. oktober 2002 - 10:14 #1
In Access 2000 + XP

form.recordset = YourRecordset
Avatar billede tma_oksboel Nybegynder
10. oktober 2002 - 10:21 #2
Hi again, Terry
I have tried this on the Form_Open event:
    Dim Forbindelse As ADODB.Connection
    Set Forbindelse = ÅbnForbindelse
    Dim Katalog As New ADOX.Catalog
    Set Katalog.ActiveConnection = Forbindelse
    Dim Kommando As ADODB.Command
    Set Kommando = Katalog.Procedures("Kunstner efter pladeselskab").Command
    Dim Pladeselskaber As ADODB.Recordset
    Set Pladeselskaber = Kommando.Execute(, Array("Virgin"))
   
    Set Me.Recordset = Pladeselskaber.Clone
       
    Set Kommando = Nothing
    Set Katalog = Nothing
    Forbindelse.Close
    Set Forbindelse = Nothing

Instead of Set Me.Recordset = Pladeselskaber.Clone I also tried:

Set Me.Recordset = Pladeselskaber

With no success...
Avatar billede hugopedersen Nybegynder
10. oktober 2002 - 11:22 #3
Normalt er det vel bare at sætte recordsource på formen/rapporten = navnet på din Stored procedure !  Det virker da i hvert fald ganske udmærket for mig nå jeg gør det.

Jeg plejer dog ikke at lave Stored procedures på helt den samme måde. Jeg plejer gerne at bruge 'Input parameters' Jeg har også brugt det at oprette 'dynamiske' views på SQL serveren. Dermed forståes et view som jeg opretter når formen loades og som formen så er sat op til at bruge som recordsource.
Avatar billede tma_oksboel Nybegynder
10. oktober 2002 - 11:35 #4
Det lyder lækkert hvis det er så nemt, men den stored procedure ligger ikke i den database hvor jeg skal trække data. Med andre ord, jeg har en front-/backend opdeling. Navnet er derfor ikke kendt i databasen.

Torben
Avatar billede hugopedersen Nybegynder
10. oktober 2002 - 11:57 #5
OK - ligger dine data ikke på en SQL server ? ( hvorfor ellers Stored procedures )  Hvis du så bruger en .ADP application, så kan du da se dem umiddelbart.
Avatar billede tma_oksboel Nybegynder
10. oktober 2002 - 12:13 #6
Jeg bruger en ren Access 2000 database, delt i 2. Årsagen til, at jeg vil bruge stored procedure er, at efter hvad jeg har læst skulle de køre mere effektivt end traditionelle forespørgsler i og med, at de ligger i selve kernen. Endvidere kan jeg godt lide den afskærmethed der ligger i, at der ikke er alle mulige forespørgsler i databasevinduet.

ADP, er det kun op mod SQL-server?

Torben
Avatar billede terry Ekspert
10. oktober 2002 - 12:25 #7
ADP! You can use MSDE which is actually a "cut down" version of SQL Server optimized to 5 users! No licenses needed for SQL Server!
Avatar billede terry Ekspert
10. oktober 2002 - 12:35 #8
Here is an example as to how you can set the forms recordset to a recordset you create in ADO. In the example I do not use a stored procedure but the idea is the same.

Private Sub Form_Load()
    Dim rstobj As New ADODB.Recordset
    Dim RstSource As String
   
   
    RstSource = "Select * from t_test where str_type = 'M'"
    'Open Recordset
    With rstobj
        .ActiveConnection = CurrentProject.Connection
        .CursorLocation = adUseClient
        .CursorType = adOpenStatic
        .LockType = adLockOptimistic
   
        .Source = RstSource
        .Open
    End With

    'Assign to Form recordset
    Set Forms("frmTest").Recordset = rstobj

End Sub
Avatar billede hugopedersen Nybegynder
10. oktober 2002 - 12:35 #9
Nu må jeg lige have noget på det rene her - vil du 'påstå' at du har en 'Stored procedure' i en ren Access db ?
Hvordan i pokker laver du det ?  Mig bekendt så kan man kun bruge den slags på SQL server ( eller MSDE som Terry siger )
I et rent Access miljø vil det være en ganske almindelig query ( efter min bedste overbevisning )
I fald det er tilfældet vil du lige så godt kunne gøre det at du opbygger din SQL statement i en variabel når du loader din formular/rapport og så sætter recordsource på formularen/rapporten til at være lig med den variabel.
Avatar billede tma_oksboel Nybegynder
10. oktober 2002 - 12:50 #10
Terry, MSDE??

Hugo, I mit øverste indlæg er koden jeg har anvendt til at oprette 'Stored procedure' Jeg har blot oprettet det i et modul som jeg så har kørt. Herefter kan den anvendes til forms som du selv skrev, blot det er i samme database. Har jeg ret i, at de vil køre hurtigere/bedre end traditionelle querys?

Torben
Avatar billede terry Ekspert
10. oktober 2002 - 12:54 #11
Avatar billede tma_oksboel Nybegynder
10. oktober 2002 - 13:00 #12
Hmm, jeg har nu prøvet med:

Set Forms("formular2").Recordset = Pladeselskaber

Pladeselskaber er jo et adodc.recordset, men jeg får fejlen:
Det angivne objekt er ikke en gyldig egenskab af typen postsæt

Hvem ved, måske det slet ikke kan lade sig gøre...

Torben
Avatar billede terry Ekspert
10. oktober 2002 - 13:05 #13
Try doing something with your recordset (Pladeselskaber) to make sure that it is valid!
Avatar billede tma_oksboel Nybegynder
10. oktober 2002 - 13:18 #14
Jeg har nu prøvet at reducere min form_load til denne linie:

  Set Forms("formular2").Recordset = HentData
 
Min HentData ser så således ud:

Function HentData() As ADODB.Recordset
Dim Forbindelse As ADODB.Connection
    Set Forbindelse = ÅbnForbindelse
    Dim Katalog As New ADOX.Catalog
    Set Katalog.ActiveConnection = Forbindelse
    Dim Kommando As ADODB.Command
    Set Kommando = Katalog.Procedures("Kunstner efter pladeselskab").Command
    Dim Pladeselskaber As ADODB.Recordset
    Set Pladeselskaber = Kommando.Execute(, Array("Virgin"))
    Pladeselskaber.MoveFirst
    Set HentData = Pladeselskaber
'    Do While Pladeselskaber.EOF = False
'        Debug.Print Pladeselskaber("Kunstner")
'        Pladeselskaber.MoveNext
'    Loop
    Pladeselskaber.Close
    Set Pladeselskaber = Nothing
    Set Kommando = Nothing
    Set Katalog = Nothing
    Forbindelse.Close
    Set Forbindelse = Nothing
End Function

Når min Do-while får lov at køre, henter den data korrekt nok.
Jeg får stadig fejlen som sidst angivet.
Torben
Avatar billede terry Ekspert
10. oktober 2002 - 13:22 #15
If you replace
Set Forms("formular2").Recordset = Pladeselskaber

with

Set me.recordset = Pladeselskaber

Can you see that there IS a recordset property? This should appear in the list when you write me.
Avatar billede tma_oksboel Nybegynder
10. oktober 2002 - 13:49 #16
It does appear in the list, but it dosnt make any difference. I give up for now, with the problem.
Når jeg i access vælger at starte på et nyt project (adp) SKAL jeg vælge en sqlserver. Skal der installere MSDE først? Jeg kan ikke finde noget downloadsted til dette...

Torben
Avatar billede terry Ekspert
10. oktober 2002 - 13:59 #17
MSDE is included with Office and DOES NOT need downloading. It has to be installed to make use of it.
I would think you can get help on this in Access help.
Avatar billede tma_oksboel Nybegynder
10. oktober 2002 - 14:06 #18
Yes I found it, thanks.

Torben
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