Solved

MS ACCESS PRINTER REDIRECTION ISSUE

Posted on 2014-09-05
6
491 Views
Last Modified: 2014-09-13
Good Afternoon,

 I am having a very bizarre issue and I was wondering if someone can shed some light on the problem.

 We have an MS access application that our customers use through Terminal Server / Remote Desktop Service (In this case to a Windows 2012 Server but the bug occurs in Windows 2008 and 2003 Server as well).

 When the customer connects the first time to the ms access application they can print to redirected printers normally. They usually stay connected to the server however sometimes they may need to close their rd connection or they may lose rd connection momentarilly to the server until it automatically reconnects.

 The problem we are having is that on reconnection not all the printers are available in the MS Access Application. Very frequently, only a few printres are available. Enumerating Application.Printers only returns some printers but not all. In order to temporarily resolve the issue, our customer needs to restart his MS Access application for the printers to reappear.

Even more weird is that all printers appear in the Devices and Printers section on the server and you can test print without a problem.

 I have done a few test in VBA and realized that when the rd connection is restarted, the Printers Collection Object only enumerates some printers and not all and I think this is where the issue is coming from. However I don't know if there's a way to "reset" or "refresh" the object without exiting the application. Set Application.Printer = Nothing doesn't work.

 The reason why I can't just simply close and open the ms application is because Terminal Server is configured to only open the specified ms access program so once it's closed, the connection is closed as well and it's a huge burden on the customer to restart his Remote Desktop connection every time.

I was reading on the subject and read to keep a list of the printers in a temp table as soon as the application starts so that if the application loses some printers we'll have a list of them saved and can use them. However, I've tried doing that and something like Application.Printer = Application.Printers("name of saved printer") returns an Error 5, Invalid procedure call or argument. I guess if the printer is not in the collection then it can't work.

 If anyone can help or has experienced this please let me know how to resolve this!!

Thanks :)
0
Comment
Question by:TSIsolutions
  • 3
  • 2
6 Comments
 
LVL 84
Comment Utility
I would assume this has a lot more to do with the way TS or Citrix handles the printers than with Access. Simply put, if the printers are not available, then Access can't connect to them. They most likely come available after the Access application starts up.

You could use your temporary table idea, and have a routine that simply cycles through the values until they all become valid. You can just ignore the error (with an empty error handler, basically) and keep going until they all "work", or until it's time to give up.
0
 
LVL 1

Author Comment

by:TSIsolutions
Comment Utility
Hi Scott,

Thanks for the quick reply.
We also thought it was a time issue. So we waited for all the printer to be redirected. We can see them in the Printer Folder, but they are not accessible in the Printer Collection within Ms Access. We think that the Printer Collection feeds of the winspool API somehow and there's a disconnect somewhere.

Thanks again for your help.
0
 
LVL 57

Expert Comment

by:Jim Dettman (Microsoft MVP/ EE MVE)
Comment Utility
<<I would assume this has a lot more to do with the way TS or Citrix handles the printers than with Access. >>

  Yes, it's a very common problem.   This is not limited to Access, other apps have the same issue.   When a session disconnects, the printer and queue are deleted.  

<<Even more weird is that all printers appear in the Devices and Printers section on the server and you can test print without a problem.>>

<< The reason why I can't just simply close and open the ms application is because Terminal Server is configured to only open the specified ms access program so once it's closed,>>

 Tough problem in that I'm not aware of anyway to tell Access to refresh it's printers collection without stopping and re-starting it.

  Note sure if it would get you any further or not, but there is a setting to only map the default client printer.   If you did that, and left the report set for "default printer" rather then naming a specific printer, that might work after a reconnect.

Jim.
0
IT, Stop Being Called Into Every Meeting

Highfive is so simple that setting up every meeting room takes just minutes and every employee will be able to start or join a call from any room with ease. Never be called into a meeting just to get it started again. This is how video conferencing should work!

 
LVL 1

Accepted Solution

by:
TSIsolutions earned 0 total points
Comment Utility
MS ACCESS Printer Redirection Issue [SOLVED]!!!

Hi everyone,

After days of testing, we realized that if we change the default printer in the printer folder, then returned and enumerated via VBA the list of available printers in the Printer collection in Ms Accesss, all the printers would return!
It looks like the Printer Collection refreshes or winspool communicates the changes to the Printer Collection and, after the default printer change, are now available.
All we had to do next is program the workaround using the winspool API to mimic the act of changing the default printer.
In order to make sure that this would work, we created a generic text driver printer (LPT1) on the server and named it "DO NOT REMOVE".
Next , we created the code below which would save the current default printer, change it to "DO NOT REMOVE" and back to the default printer.
Here's the sample code if you're interested:

' Declaration API call to Get Default Printer for fReset Printer
Public Declare Function GetDefaultPrinter Lib "winspool.drv" Alias "GetDefaultPrinterA" (ByVal sPrinterName As String, lPrinterNameBufferSize As Long) As Long
' Declaration API call to Change Default Printer fReset Printer
Private Declare Function SetDefaultPrinter Lib "winspool.drv" Alias "SetDefaultPrinterA" (ByVal pszPrinter As String) As Long
     
Function fResetRDPPrinters()

    Dim sLen As Long
    Dim hResult As Long
    Dim GetDP As String
    Dim sDefPrinter As String
 
    GetDP = Space$(255)
    sLen = 255
    hResult = GetDefaultPrinter(ByVal GetDP, sLen)
 
    If hResult <> 0 Then
        sDefPrinter = Left(GetDP, sLen - 1)
        SetDefaultPrinter ("DO NOT DELETE")
        SetDefaultPrinter (sDefPrinter)
    Else
        sDefPrinter = ""
    End If

End Function

NOTE: It is important to give the server enough time to redirect before running the code. If you don't, then only the printers that successfully redirected will be available. Depending on the number of printers to redirect (and if the drivers are using Easy Print drivers) the process can take from 5-30 seconds.

Thanks to everyone who attempted to answer the questions. We have been having this issues for years now, and we couldn't figure out why. I hope that MS decides to make the necessary changes to their Printer Collection.

Cheers
0
 
LVL 57

Expert Comment

by:Jim Dettman (Microsoft MVP/ EE MVE)
Comment Utility
Very nice!  Make sure you accept your own comment as answer.

Jim.
0
 
LVL 1

Author Closing Comment

by:TSIsolutions
Comment Utility
This was the best and only solution available for this problem.
0

Featured Post

Complete VMware vSphere® ESX(i) & Hyper-V Backup

Capture your entire system, including the host, with patented disk imaging integrated with VMware VADP / Microsoft VSS and RCT. RTOs is as low as 15 seconds with Acronis Active Restore™. You can enjoy unlimited P2V/V2V migrations from any source (even from a different hypervisor)

Join & Write a Comment

Remote Desktop Shadowing often has a lot of benefits. When helping end users determine problems, it is much easier to see what is going on, what is being slecected and what is being clicked on. While the industry has many products to help with this,…
In this article, I'll explain how to setup a Plex Media Server (https://plex.tv/) on a Redhat (Centos) 7 based NAS with screenshots to help those looking for assistance.  What is Plex? If you aren't familiar with Plex, it’s a DLNA media serv…
Familiarize people with the process of utilizing SQL Server stored procedures from within Microsoft Access. Microsoft Access is a very powerful client/server development tool. One of the SQL Server objects that you can interact with from within Micr…
Show developers how to use a criteria form to limit the data that appears on an Access report. It is a common requirement that users can specify the criteria for a report at runtime. The easiest way to accomplish this is using a criteria form that a…

772 members asked questions and received personalized solutions in the past 7 days.

Join the community of 500,000 technology professionals and ask your questions.

Join & Ask a Question

Need Help in Real-Time?

Connect with top rated Experts

11 Experts available now in Live!

Get 1:1 Help Now