10. oktober 2002 - 10:08Der 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
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:
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.
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.
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.
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.
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
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.
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?
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
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...
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.
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.