Robert Gracie
Subscriptions at servicexp.com
Wed Jan 28 20:04:22 CST 2004
Ken, Thank you very much for the help. RE: Yep your correct, you can't reference an "un-compiled" reference in an mde, which does change my approach a bit. The object however remains the same.. I implemented your solution below, and noted a few problems. The report fires, however none of the events (Close) are being hooked. I can run the report once, any attempt to run the report again fails on "RemoteReportClose mrRpt.Name" ERROR Number 2467....... Object or property... either does not exist or is closed...... I tried it in both A2K and AXP Formats, same results Do I need to hook the opening report to the events in the CReportHost class internally of the opening report, such as on the OnOpen event? I'm new to the "DEEP" Programming method so I could be way off base..... What do you think? Do you do any teaching? You are a good teacher..... Thanks For the Help Ken... Robert Gracie -----Original Message----- From: accessd-bounces at databaseadvisors.com [mailto:accessd-bounces at databaseadvisors.com] On Behalf Of Ken Ismert Sent: Wednesday, January 28, 2004 3:58 PM To: 'Access Developers discussion and problem solving' Subject: RE: [AccessD] Interface Callback Class Questions. Robert, To make this work, you need a public object interface or type library that both projects (your Host and Remote) can agree on. You could define an Interface class in the Remote db, set its Instancing property as 2 - PublicNotCreatable, allowing you to use objects that implement this interface in both the host and remote projects. But that is not strictly necessary, as you already have the Access public type library, which defines the Report interface, which both projects obviously understand. So, you could do it this way: 1. Add a Public Report Open function in a Remote module that returns an Access.Report You also need a matching Report Close function. 2. Add a Report class in the Host to sink events from the remote report. 3. Add code in a Host module to open and close the report. As I only have A2K, I can't answer the question as to whether the Report interface is forward compatible between A2K and AXP. I tend to think so. If not, you will be forced to use another approach, likely one involving interfaces. I do have a question for you: I found I couldn't reference a remote mdb from a host mde. I had to make the remote mdb into an mde, and reference it in the host, before I could successfully make the host mde. How did you get around this? -Ken Here is the code that I wrote to test this functionality: 1. Report Open/Close functions in a Remote module: ================================================== Public Sub RemoteReportClose(sReportName As String) On Error GoTo HandleErr DoCmd.Close acReport, sReportName Exit Sub HandleErr: Err.Raise Number:=Err.Number, _ Description:=Err.Description, _ Source:="modMain.RemoteReportClose" & vbCrLf & Err.Source Exit Sub End Sub Public Function RemoteReportOpen(sReportName As String) As Access.Report On Error GoTo HandleErr ' Init Set RemoteReportOpen = Nothing ' Open Report DoCmd.OpenReport sReportName, acViewPreview ' Return Set RemoteReportOpen = Application.Reports(sReportName) Exit Function HandleErr: Err.Raise Number:=Err.Number, _ Description:=Err.Description, _ Source:="modMain.RemoteReportOpen" & vbCrLf & Err.Source Exit Function End Function 2. The CReportHost class in the Host: ======================================= Option Compare Database Option Explicit Private Const pcsEventStub As String = "[Event Procedure]" Private WithEvents mrRpt As Access.Report Property Get IsOpen() As Boolean IsOpen = Not (mrRpt Is Nothing) End Property Property Get Name() As String Name = "" If mrRpt Is Nothing Then Exit Sub Name = mrRpt.Name End Property Public Sub CloseRemoteReport() On Error GoTo HandleErr ' Close Report if Open If mrRpt Is Nothing Then Exit Sub RemoteReportClose mrRpt.Name Exit Sub HandleErr: Err.Raise Number:=Err.Number, _ Description:=Err.Description, _ Source:="CReportHost.CloseRemoteReport" & vbCrLf & Err.Source Exit Sub End Sub Public Sub OpenRemoteReport(ReportName As String) On Error GoTo HandleErr ' Open Report Set mrRpt = RemoteReportOpen(ReportName) ' Hook Close Event mrRpt.OnClose = pcsEventStub Exit Sub HandleErr: Err.Raise Number:=Err.Number, _ Description:=Err.Description, _ Source:="CReportHost.OpenRemoteReport" & vbCrLf & Err.Source Exit Sub End Sub Private Sub Class_Terminate() On Error Resume Next CloseRemoteReport End Sub Private Sub mrRpt_Close() MsgBox "Report " & mrRpt.Name & " closed!" Set mrRpt = Nothing End Sub 3. Module-level Code in Host: ============================= Public grReportHost As CReportHost ' Call this routine to open a remote report Public Sub OpenRemoteReport(sReportName As String) On Error GoTo HandleErr ' Close current Report, if any If Not (grReportHost Is Nothing) Then If grReportHost.IsOpen Then grReportHost.CloseRemoteReport End If End If ' Remake Host Object Set grReportHost = New CReportHost ' Open Report grReportHost.OpenRemoteReport sReportName Exit Sub HandleErr: MsgBox "Error: " & Err.Number & vbCrLf _ & Err.Description & vbCrLf _ & "modMain.OpenRemoteReport" & vbCrLf & Err.Source Exit Sub End Sub -----Original Message----- From: Robert Gracie [mailto:Subscriptions at servicexp.com] Sent: Tuesday, January 27, 2004 6:29 AM To: 'Access Developers discussion and problem solving' Subject: [AccessD] Interface Callback Class Questions. Hello All AK2 mde referencing A2K mdb Objective: To open a report in a (host is an mde referenced to the .mdb) referenced .mdb and have all the events for a given report fire inside the host mde. I can do this for a report located inside the mde, however I can seem to figure out how to get the report inside the .mdb to see the class in the mde, as circular references are not permitted in access. Question: I was thinking that an Interface callback would be an option. So is it possible to use an interface callback across a referenced db to accomplish my objective? Any examples...? Thanks Robert Gracie _______________________________________________ AccessD mailing list AccessD at databaseadvisors.com http://databaseadvisors.com/mailman/listinfo/accessd Website: http://www.databaseadvisors.com