Newsgroup: it.comp.appl.access
Titolo: Come sapere su un report è stato stampato o no

Salve a tutti,
ho necessità di lanciare una routine di aggiornamento soltanto dopo la
stampa di un report, per questo, prima di postare il quesito in
oggetto ho fatto numerosissime ricerche, ed ho trovato questo codice:
Private Declare Function GetWindowText _
     Lib "user32" Alias "GetWindowTextA" _
    (ByVal hWnd&, ByVal lpstrTitleBuff$, _
     ByVal intCharstoCopy%) as Long
Private Declare Function GetClassName _
    Lib "user32" Alias "GetClassNameA" _
    (ByVal hWnd As Long, ByVal lpClassName As String, _
     ByVal nMaxCount As Long) As Long
Private Declare Function GetWindow _
     Lib "user32" (ByVal hWnd As Long, _
     ByVal wFlag As Long) As Long
Private Declare Function FindWindowEx _
     Lib "user32" Alias "FindWindowExA" _
    (ByVal hwndParent As Long, ByVal hWndChid As Long, _
     ByVal lpClassName As String, _
     ByVal lpWindowName As String) As Long
Private Declare Function IsWindowVisible Lib _
     "user32" (ByVal hWndTarget As Long) As Long
Public Function ChkPreview(RptName As String) As Boolean
'-------------------------------------------------------
'Purpose: To see if an Access report is open in preview
'or not (i.e. its opened to print)
'Accepts: Report Name up to 100 characters
'Return: True if in preview, false if not
'Copyright © 1997-98 ATTAC Consulting Group, Ann Arbor, MI USA
'All rights reserved.
'---------------------------------------------------------
On Error GoTo Err_MWC
    Dim Winhwnd&, hWndMIDI&, hWndTarget&
    Dim ClsNameBuff$
    Dim ClsBuffsz%
    Dim TitleBuff As String * 100
    Dim titlestr$
    Dim dwReturn&
    Const TARGET_WINDOW_MIDI = "MDIClient"
    Const TARGET_WINDOW_DB = "OReport"
    Const GW_HWNDNEXT = 2
    Const GW_CHILD = 5
    ClsBuffsz = 30
    ClsNameBuff = Space(ClsBuffsz)
    ChkPreview = False
    Winhwnd = Application.hWndAccessApp
    hWndMIDI = FindWindowEx(Winhwnd, 0&, TARGET_WINDOW_MIDI,
vbNullString)
    If hWndMIDI = 0 Then
        'If its not found exit gracefully
        Exit Function
    End If
    'Found the MIDI Client Class, Now find the OReport Class window
    'by looking through children for a report with the like name.
    hWndTarget = GetWindow(hWndMIDI, GW_CHILD)
     While hWndTarget > 0
        dwReturn = GetClassName(hWndTarget, ClsNameBuff, ClsBuffsz)
        If InStr(ClsNameBuff, TARGET_WINDOW_DB) > 0 Then
            dwReturn = GetWindowText(hWndTarget, TitleBuff, 100)
            titlestr = Trim(TitleBuff)
            If InStr(titlestr, RptName) > 0 Then
                dwReturn = IsWindowVisible(hWndTarget)
                If dwReturn = 1 Then ChkPreview = True
                Exit Function
            End If
        End If
        hWndTarget = GetWindow(hWndTarget, GW_HWNDNEXT)
    Wend
Exit_MWC:
    Exit Function
Err_MWC:
    Resume Exit_MWC
End Function
ll problema è che non riesco ad applicarlo, o meglio, ricevo sempre
come valore "true", sia che stampo il report, sia che lo visualizzo in
anteprima.
HELP!!!!
Grazie a tutti.

ll problema è che non riesco ad applicarlo, o meglio, ricevo sempre
come valore "true", sia che stampo il report, sia che lo visualizzo in
anteprima.
HELP!!!!
Grazie a tutti.
Non sò bene cosa dire di quel codice che servirebbe solo per capire se viene
aperta la Finestra del Report...
Credo che con una semplice chiamata a:
     currentproject.AllReports("Nome").IsLoaded
In ogni caso è una questione di gusti...!
Detto questo, sostengo che entrambe non servono a nulla se vuoi determinare
se la STAMPA è andata a buon fine...!
In questo caso la cosa è estremamente complessa, ma posso darti qualce
riferimento per fare delle prove.
Tu di cosa hai bisogno...?
Se ti basta definire STAMPATO un report inviato allora lo consideri stampato
su Print mentre sul Preview devi realizzarti una
funzione che lo manda in Stampa(dico funzione perchè la stampa Nativa non la
controlli... e se devi memorizzare l'azione avvenutoa serve
pilotarla)
Il concetto è che se devi salvare l'avvenuta stampa serve un Campo in una
Tabella in cui memorizzarlo...!
-- 
@Alex (Alessandro Baraldi)
---------------------------------------------------------------------------
http://www.sitocomune.com/
http://www.alessandrobaraldi.it
---------------------------------------------------------------------------

Ti ringrazio della precisa e puntuale risposta Alessandro,
a questo punto è richiesta una mia ulteriore precisazione e a questo
provvedo subito:
io ho un campo "stampato" (flag) nella mia tabella, la mia necessità è
che devo, oltre a verificare l'avvenuta stampa per aggiornare il flag,
dopo la stessa lanciare una routine che esegue delle operazioni,
quindi se l'utente apre il report, lo visualizza ma non lo stampa, non
deve succedere nulla, e qui nasce il problema, pochè non riesco ad
individuare il punto dove devo intercettare la stampa o meno.
Cerco dunque una soluzione "elegante", senza inibire il pulsante
nativo di access, o senza lanciare msgbox di conferma, semplicemente
individuare l'invio effettivo dell'output in stampa o meno, questo,
semplicemente vorrei realizzare, se qualcuno più esperto di me, che ha
già cercato soluzioni per lo stesso tipo di problema ed è sicuro che
non ve ne siano e me lo comunica, bene, mi metto l'anima in pace, al
contrario continuerò a cercare.
Per quanto riguarda i tuoi aiuti, devo essere sincero non li ho
afferrati del tutto, se puoi essere più preciso, a seguito anche di
queste mie ulteriori specificazioni, te ne sarei grato.
In ogni caso, grazie ancora Alessandro e a tutti voi.
Un caro saluto.

 ha scritto nel messaggio
news:5143424a-1968-4bc1...@d21g2000prf.googlegroups.com...

Ciao Alessandro,
la prima soluzione sicuramente è la più interessante (ed elegante), e
mi cimenterò con questa, (beh... per il fatto che non sia un
giochetto...vorrà dire che mi diverterò un pò di più....)
se non dovessi riuscirci passerò alla seconda eventualità,
ad ogni modo posterò qui la soluzione che adotterò a beneficio di
tutti, perchè davvero non si trova molto in giro al riguardo, forse
perchè il problema è appunto complesso e molti risolvono bypassando il
nocciolo della questione adottando misure poco eleganti (senza offesa
per nessuno, forse alla fine dovrò arrendermi anch'io...)
In ogni caso sei stato molto utile e ti ringrazio ancora.
Ciao a tutti.

Un salutone a tutti,
come promesso, avendo risolto il problema, posto la mia soluzione a
beneficio di tutti, poichè la ritengo abbastanza "elegante", pur con i
suoi limiti  ed ancora ovviamente migliorabile, ringrazio ancora
Alessandro Baraldi, che con le sue utili indicazioni mi ha instradato
sulla via giusta.
Innanzitutto il codice originario che ho adattato l'ho tratto da
questo articolo:
http://support.microsoft.com/kb/202480/it
per capire il funzionamento semplicemente agire così:
==> si crea un database nuovo, da una base dati (tabella o query)
qualunque si crea un report qualunque, in un modulo nuovo si incolla
questo codice:
Option Explicit
    Public PrinterStatus As String
    Public JobStatus As String
    Public ErrorInfo As String
    Public JI2 As JOB_INFO_2
Public Declare Function lstrcpy Lib "kernel32" _
   Alias "lstrcpyA" _
   (ByVal lpString1 As String, _
   ByVal lpString2 As String) _
   As Long
Public Declare Function OpenPrinter Lib "winspool.drv" _
   Alias "OpenPrinterA" _
   (ByVal pPrinterName As String, _
   phPrinter As Long, _
   pDefault As PRINTER_DEFAULTS) _
   As Long
Public Declare Function GetPrinter Lib "winspool.drv" Alias
"GetPrinterA" _
   (ByVal hPrinter As Long, _
   ByVal Level As Long, _
   pPrinter As Byte, _
   ByVal cbBuf As Long, _
   pcbNeeded As Long) _
   As Long
Public Declare Function ClosePrinter Lib "winspool.drv" _
   (ByVal hPrinter As Long) _
   As Long
Public Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" _
   (Destination As Any, _
   Source As Any, _
   ByVal Length As Long)
Public Declare Function EnumJobs Lib "winspool.drv" Alias "EnumJobsA"
_
   (ByVal hPrinter As Long, _
   ByVal FirstJob As Long, _
   ByVal NoJobs As Long, _
   ByVal Level As Long, _
   pJob As Byte, _
   ByVal cdBuf As Long, _
   pcbNeeded As Long, _
   pcReturned As Long) _
   As Long
' constants for PRINTER_DEFAULTS structure
Public Const PRINTER_ACCESS_USE = &H8
Public Const PRINTER_ACCESS_ADMINISTER = &H4
' constants for DEVMODE structure
Public Const CCHDEVICENAME = 32
Public Const CCHFORMNAME = 32
Public Type PRINTER_DEFAULTS
   pDatatype As String
   pDevMode As Long
   DesiredAccess As Long
End Type
Public Type DEVMODE
   dmDeviceName As String * CCHDEVICENAME
   dmSpecVersion As Integer
   dmDriverVersion As Integer
   dmSize As Integer
   dmDriverExtra As Integer
   dmFields As Long
   dmOrientation As Integer
   dmPaperSize As Integer
   dmPaperLength As Integer
   dmPaperWidth As Integer
   dmScale As Integer
   dmCopies As Integer
   dmDefaultSource As Integer
   dmPrintQuality As Integer
   dmColor As Integer
   dmDuplex As Integer
   dmYResolution As Integer
   dmTTOption As Integer
   dmCollate As Integer
   dmFormName As String * CCHFORMNAME
   dmLogPixels As Integer
   dmBitsPerPel As Long
   dmPelsWidth As Long
   dmPelsHeight As Long
   dmDisplayFlags As Long
   dmDisplayFrequency As Long
End Type
Type SYSTEMTIME
   wYear As Integer
   wMonth As Integer
   wDayOfWeek As Integer
   wDay As Integer
   wHour As Integer
   wMinute As Integer
   wSecond As Integer
   wMilliseconds As Integer
End Type
Type JOB_INFO_2
   JobId As Long
   pPrinterName As Long
   pMachineName As Long
   pUserName As Long
   pDocument As Long
   pNotifyName As Long
   pDatatype As Long
   pPrintProcessor As Long
   pParameters As Long
   pDriverName As Long
   pDevMode As Long
   pStatus As Long
   pSecurityDescriptor As Long
   Status As Long
   Priority As Long
   Position As Long
   StartTime As Long
   UntilTime As Long
   TotalPages As Long
   Size As Long
   Submitted As SYSTEMTIME
   time As Long
   PagesPrinted As Long
End Type
Type PRINTER_INFO_2
   pServerName As Long
   pPrinterName As Long
   pShareName As Long
   pPortName As Long
   pDriverName As Long
   pComment As Long
   pLocation As Long
   pDevMode As Long
   pSepFile As Long
   pPrintProcessor As Long
   pDatatype As Long
   pParameters As Long
   pSecurityDescriptor As Long
   Attributes As Long
   Priority As Long
   DefaultPriority As Long
   StartTime As Long
   UntilTime As Long
   Status As Long
   cJobs As Long
   AveragePPM As Long
End Type
Public Const ERROR_INSUFFICIENT_BUFFER = 122
Public Const PRINTER_STATUS_BUSY = &H200
Public Const PRINTER_STATUS_DOOR_OPEN = &H400000
Public Const PRINTER_STATUS_ERROR = &H2
Public Const PRINTER_STATUS_INITIALIZING = &H8000
Public Const PRINTER_STATUS_IO_ACTIVE = &H100
Public Const PRINTER_STATUS_MANUAL_FEED = &H20
Public Const PRINTER_STATUS_NO_TONER = &H40000
Public Const PRINTER_STATUS_NOT_AVAILABLE = &H1000
Public Const PRINTER_STATUS_OFFLINE = &H80
Public Const PRINTER_STATUS_OUT_OF_MEMORY = &H200000
Public Const PRINTER_STATUS_OUTPUT_BIN_FULL = &H800
Public Const PRINTER_STATUS_PAGE_PUNT = &H80000
Public Const PRINTER_STATUS_PAPER_JAM = &H8
Public Const PRINTER_STATUS_PAPER_OUT = &H10
Public Const PRINTER_STATUS_PAPER_PROBLEM = &H40
Public Const PRINTER_STATUS_PAUSED = &H1
Public Const PRINTER_STATUS_PENDING_DELETION = &H4
Public Const PRINTER_STATUS_PRINTING = &H400
Public Const PRINTER_STATUS_PROCESSING = &H4000
Public Const PRINTER_STATUS_TONER_LOW = &H20000
Public Const PRINTER_STATUS_USER_INTERVENTION = &H100000
Public Const PRINTER_STATUS_WAITING = &H2000
Public Const PRINTER_STATUS_WARMING_UP = &H10000
Public Const JOB_STATUS_PAUSED = &H1
Public Const JOB_STATUS_ERROR = &H2
Public Const JOB_STATUS_DELETING = &H4
Public Const JOB_STATUS_SPOOLING = &H8
Public Const JOB_STATUS_PRINTING = &H10
Public Const JOB_STATUS_OFFLINE = &H20
Public Const JOB_STATUS_PAPEROUT = &H40
Public Const JOB_STATUS_PRINTED = &H80
Public Const JOB_STATUS_DELETED = &H100
Public Const JOB_STATUS_BLOCKED_DEVQ = &H200
Public Const JOB_STATUS_USER_INTERVENTION = &H400
Public Const JOB_STATUS_RESTART = &H800
Public Function GetString(ByVal PtrStr As Long) As String
   Dim StrBuff As String * 256
   'Check for zero address
   If PtrStr = 0 Then
      GetString = " "
      Exit Function
   End If
   'Copy data from PtrStr to buffer.
   CopyMemory ByVal StrBuff, ByVal PtrStr, 256
   'Strip any trailing nulls from string.
   GetString = StripNulls(StrBuff)
End Function
Public Function StripNulls(OriginalStr As String) As String
   'Strip any trailing nulls from input string.
   If (InStr(OriginalStr, Chr(0)) > 0) Then
      OriginalStr = Left(OriginalStr, InStr(OriginalStr, Chr(0)) - 1)
   End If
   'Return modified string.
   StripNulls = OriginalStr
End Function
Public Function PtrCtoVbString(Add As Long) As String
    Dim sTemp As String * 512
    Dim x As Long
    x = lstrcpy(sTemp, Add)
    If (InStr(1, sTemp, Chr(0)) = 0) Then
         PtrCtoVbString = ""
    Else
         PtrCtoVbString = Left(sTemp, InStr(1, sTemp, Chr(0)) - 1)
    End If
End Function
Public Function CheckPrinterStatus(PI2Status As Long) As String
   Dim tempStr As String
   If PI2Status = 0 Then   ' Return "Ready"
      CheckPrinterStatus = "Printer Status = Ready" & vbCrLf
   Else
      tempStr = ""   ' Clear
      If (PI2Status And PRINTER_STATUS_BUSY) Then
         tempStr = tempStr & "Busy  "
      End If
      If (PI2Status And PRINTER_STATUS_DOOR_OPEN) Then
         tempStr = tempStr & "Printer Door Open  "
      End If
      If (PI2Status And PRINTER_STATUS_ERROR) Then
         tempStr = tempStr & "Printer Error  "
      End If
      If (PI2Status And PRINTER_STATUS_INITIALIZING) Then
         tempStr = tempStr & "Initializing  "
      End If
      If (PI2Status And PRINTER_STATUS_IO_ACTIVE) Then
         tempStr = tempStr & "I/O Active  "
      End If
      If (PI2Status And PRINTER_STATUS_MANUAL_FEED) Then
         tempStr = tempStr & "Manual Feed  "
      End If
      If (PI2Status And PRINTER_STATUS_NO_TONER) Then
         tempStr = tempStr & "No Toner  "
      End If
      If (PI2Status And PRINTER_STATUS_NOT_AVAILABLE) Then
         tempStr = tempStr & "Not Available  "
      End If
      If (PI2Status And PRINTER_STATUS_OFFLINE) Then
         tempStr = tempStr & "Off Line  "
      End If
      If (PI2Status And PRINTER_STATUS_OUT_OF_MEMORY) Then
         tempStr = tempStr & "Out of Memory  "
      End If
      If (PI2Status And PRINTER_STATUS_OUTPUT_BIN_FULL) Then
         tempStr = tempStr & "Output Bin Full  "
      End If
      If (PI2Status And PRINTER_STATUS_PAGE_PUNT) Then
         tempStr = tempStr & "Page Punt  "
      End If
      If (PI2Status And PRINTER_STATUS_PAPER_JAM) Then
         tempStr = tempStr & "Paper Jam  "
      End If
      If (PI2Status And PRINTER_STATUS_PAPER_OUT) Then
         tempStr = tempStr & "Paper Out  "
      End If
      If (PI2Status And PRINTER_STATUS_OUTPUT_BIN_FULL) Then
         tempStr = tempStr & "Output Bin Full  "
      End If
      If (PI2Status And PRINTER_STATUS_PAPER_PROBLEM) Then
         tempStr = tempStr & "Page Problem  "
      End If
      If (PI2Status And PRINTER_STATUS_PAUSED) Then
         tempStr = tempStr & "Paused  "
      End If
      If (PI2Status And PRINTER_STATUS_PENDING_DELETION) Then
         tempStr = tempStr & "Pending Deletion  "
      End If
      If (PI2Status And PRINTER_STATUS_PRINTING) Then
         tempStr = tempStr & "Printing  "
      End If
      If (PI2Status And PRINTER_STATUS_PROCESSING) Then
         tempStr = tempStr & "Processing  "
      End If
      If (PI2Status And PRINTER_STATUS_TONER_LOW) Then
         tempStr = tempStr & "Toner Low  "
      End If
      If (PI2Status And PRINTER_STATUS_USER_INTERVENTION) Then
         tempStr = tempStr & "User Intervention  "
      End If
      If (PI2Status And PRINTER_STATUS_WAITING) Then
         tempStr = tempStr & "Waiting  "
      End If
      If (PI2Status And PRINTER_STATUS_WARMING_UP) Then
         tempStr = tempStr & "Warming Up  "
      End If
      'Did you find a known status?
      If Len(tempStr) = 0 Then
         tempStr = "Unknown Status of " & PI2Status
      End If
      'Return the Status
      CheckPrinterStatus = "Printer Status = " & tempStr & vbCrLf
   End If
End Function
Public Function CheckPrinter(PrinterStr As String, JobStr As String)
As String
   Dim hPrinter As Long
   Dim ByteBuf As Long
   Dim BytesNeeded As Long
   Dim PI2 As PRINTER_INFO_2
   Dim PrinterInfo() As Byte
   Dim JobInfo() As Byte
   Dim result As Long
   Dim LastError As Long
   Dim PrinterName As String
   Dim tempStr As String
   Dim NumJI2 As Long
   Dim pDefaults As PRINTER_DEFAULTS
   Dim I As Integer
   'Set a default return value if no errors occur.
   CheckPrinter = "Printer info retrieved"
   'NOTE: You can pick a printer from the Printers Collection
   'or use the EnumPrinters() API to select a printer name.
   'Use the default printer of Printers collection.
   'This is typically, but not always, the system default printer.
   PrinterName = Printer.DeviceName
   'Set desired access security setting.
   pDefaults.DesiredAccess = PRINTER_ACCESS_USE
   'Call API to get a handle to the printer.
   result = OpenPrinter(PrinterName, hPrinter, pDefaults)
   If result = 0 Then
      'If an error occurred, display an error and exit sub.
      CheckPrinter = "Cannot open printer " & PrinterName & _
         ", Error: " & Err.LastDllError
      Exit Function
   End If
   'Init BytesNeeded
   BytesNeeded = 0
   'Clear the error object of any errors.
   Err.Clear
   'Determine the buffer size that is needed to get printer info.
   result = GetPrinter(hPrinter, 2, 0&, 0&, BytesNeeded)
   'Check for error calling GetPrinter.
   If Err.LastDllError <> ERROR_INSUFFICIENT_BUFFER Then
      'Display an error message, close printer, and exit sub.
      CheckPrinter = " > GetPrinter Failed on initial call! <"
      ClosePrinter hPrinter
      Exit Function
   End If
   'Note that in Charles Petzold's book "Programming Windows 95," he
   'states that because of a problem with GetPrinter on Windows 95
only, you
   'must allocate a buffer as much as three times larger than the
value
   'returned by the initial call to GetPrinter. This is not done here.
   ReDim PrinterInfo(1 To BytesNeeded)
   ByteBuf = BytesNeeded
   'Call GetPrinter to get the status.
   result = GetPrinter(hPrinter, 2, PrinterInfo(1), ByteBuf, _
     BytesNeeded)
   'Check for errors.
   If result = 0 Then
      'Determine the error that occurred.
      LastError = Err.LastDllError()
      'Display error message, close printer, and exit sub.
      CheckPrinter = "Couldn't get Printer Status!  Error = " _
         & LastError
      ClosePrinter hPrinter
      Exit Function
   End If
   'Copy contents of printer status byte array into a
   'PRINTER_INFO_2 structure to separate the individual elements.
   CopyMemory PI2, PrinterInfo(1), Len(PI2)
   'Check if printer is in ready state.
   PrinterStr = CheckPrinterStatus(PI2.Status)
   'Add printer name, driver, and port to list.
   PrinterStr = PrinterStr & "Printer Name = " & _
     GetString(PI2.pPrinterName) & vbCrLf
   PrinterStr = PrinterStr & "Printer Driver Name = " & _
     GetString(PI2.pDriverName) & vbCrLf
   PrinterStr = PrinterStr & "Printer Port Name = " & _
     GetString(PI2.pPortName) & vbCrLf
   'Call API to get size of buffer that is needed.
   result = EnumJobs(hPrinter, 0&, &HFFFFFFFF, 2, ByVal 0&, 0&, _
      BytesNeeded, NumJI2)
   'Check if there are no current jobs, and then display appropriate
message.
   If BytesNeeded = 0 Then
      JobStr = "No Print Jobs!"
   Else
      'Redim byte array to hold info about print job.
      ReDim JobInfo(0 To BytesNeeded)
      'Call API to get print job info.
      result = EnumJobs(hPrinter, 0&, &HFFFFFFFF, 2, JobInfo(0), _
        BytesNeeded, ByteBuf, NumJI2)
      'Check for errors.
      If result = 0 Then
         'Get and display error, close printer, and exit sub.
         LastError = Err.LastDllError
         CheckPrinter = " > EnumJobs Failed on second call! <  Error =
" _
            & LastError
         ClosePrinter hPrinter
         Exit Function
      End If
      'Copy contents of print job info byte array into a
      'JOB_INFO_2 structure to separate the individual elements.
      For I = 0 To NumJI2 - 1   ' Loop through jobs and walk the
buffer
          CopyMemory JI2, JobInfo(I * Len(JI2)), Len(JI2)
          ' List info available on Jobs.
          Debug.Print "Job ID" & vbTab & JI2.JobId
          Debug.Print "Name Of Printer" & vbTab & _
            GetString(JI2.pPrinterName)
          Debug.Print "Name Of Machine That Created Job" & vbTab & _
            GetString(JI2.pMachineName)
          Debug.Print "Print Job Owner's Name" & vbTab & _
            GetString(JI2.pUserName)
          Debug.Print "Name Of Document" & vbTab &
GetString(JI2.pDocument)
          Forms!Stampe!docname = GetString(JI2.pDocument)
          Debug.Print "Name Of User To Notify" & vbTab & _
            GetString(JI2.pNotifyName)
          Debug.Print "Type Of Data" & vbTab &
GetString(JI2.pDatatype)
          Debug.Print "Print Processor" & vbTab & _
            GetString(JI2.pPrintProcessor)
          Debug.Print "Print Processor Parameters" & vbTab & _
            GetString(JI2.pParameters)
          Debug.Print "Print Driver Name" & vbTab & _
            GetString(JI2.pDriverName)
          Debug.Print "Print Job 'P' Status" & vbTab & _
            GetString(JI2.pStatus)
          Debug.Print "Print Job Status" & vbTab & JI2.Status
          Debug.Print "Print Job Priority" & vbTab & JI2.Priority
          Debug.Print "Position in Queue" & vbTab & JI2.Position
          Debug.Print "Earliest Time Job Can Be Printed" & vbTab & _
            JI2.StartTime
          Debug.Print "Latest Time Job Will Be Printed" & vbTab & _
            JI2.UntilTime
          Debug.Print "Total Pages For Entire Job" & vbTab &
JI2.TotalPages
          Debug.Print "Size of Job In Bytes" & vbTab & JI2.Size
          'Because of a bug in Windows NT 3.51, the time member is not
set correctly.
          'Therefore, do not use the time member on Windows NT 3.51.
          Debug.Print "Elapsed Print Time" & vbTab & JI2.time
          Debug.Print "Pages Printed So Far" & vbTab &
JI2.PagesPrinted
          'Display basic job status info.
          JobStr = JobStr & "Job ID = " & JI2.JobId & _
             vbCrLf & "Total Pages = " & JI2.TotalPages & vbCrLf
          Forms!Stampe!numprintedpages = JI2.PagesPrinted
          tempStr = ""   'Clear
          'Check for a ready state.
          If JI2.pStatus = 0& Then   ' If pStatus is Null, check
Status.
            If JI2.Status = 0 Then
               tempStr = tempStr & "Ready!  " & vbCrLf
            Else  'Check for the various print job states.
               If (JI2.Status And JOB_STATUS_SPOOLING) Then
                  tempStr = tempStr & "Spooling  "
               End If
               If (JI2.Status And JOB_STATUS_OFFLINE) Then
                  tempStr = tempStr & "Off line  "
               End If
               If (JI2.Status And JOB_STATUS_PAUSED) Then
                  tempStr = tempStr & "Paused  "
               End If
               If (JI2.Status And JOB_STATUS_ERROR) Then
                  tempStr = tempStr & "Error  "
               End If
               If (JI2.Status And JOB_STATUS_PAPEROUT) Then
                  tempStr = tempStr & "Paper Out  "
               End If
               If (JI2.Status And JOB_STATUS_PRINTING) Then
                  tempStr = tempStr & "Printing  "
               End If
               If (JI2.Status And JOB_STATUS_USER_INTERVENTION) Then
                  tempStr = tempStr & "User Intervention Needed  "
               End If
               If Len(tempStr) = 0 Then
                  tempStr = "Unknown Status of " & JI2.Status
               End If
            End If
        Else
            ' Dereference pStatus.
            tempStr = PtrCtoVbString(JI2.pStatus)
        End If
          'Report the Job status.
          JobStr = JobStr & tempStr & vbCrLf
          Debug.Print JobStr & tempStr
          Forms!Stampe!statprint = tempStr
      Next I
   End If
   'Close the printer handle.
   ClosePrinter hPrinter
End Function
==> in una maschera che chiameremo "Stampe" si creano 5 caselle di
testo che chiamerò Text1 Text2 Text3 docname statprint e
numprintedpages
==> nella stessa maschera si creerà un pulsante di stampa anteprima
del report interessato ed un pulsante "Clear" che si occuperà di
svuotare le caselle di testo
==> nell'evento "su chiusura" del report interessato incollare questo
codice:
    Forms!Stampe!Text1 = CheckPrinter(PrinterStatus, JobStatus)
    Forms!Stampe!Text2 = PrinterStatus
    Forms!Stampe!Text3 = JobStatus
    If GetString(JI2.pDocument) = Me.Name And (Not IsNull(Forms!Stampe!
numprintedpages) Or Forms!Stampe!numprintedpages = "") Then
        MsgBox ("Il report è stato stampato!")
    Else
        MsgBox ("Il report non è stato stampato!")
    End If
Con questo sistema riesco ad intercettare l'effettivo invio in stampa
del report visualizzato.
Si potrebbero intercettare eventuali errori dopo l'invio in stampa
poichè il codice lo provede, però questo per me rappresentava un plus
non al momento necessario.
Sperando di essere stato utile ringrazio e saluto tutti.

Bravo, complimenti per la tenacia.
Se vuoi realizzare un MiniDemo semplice per questo argomento
inserendo i riferimenti del codice trovato lo pubblico a tuo nome volentieri
nel mio sito.


Grazie,
il minidemo l'ho già creato, c'è un piccolo problema però...
e cioè è testato e funziona se la stampante è in locale, ma se è in
rete non funziona, forse mi manca qualcosa...
ad ogni modo ti posso inviare il db, dimmi come e dove ciao
Saluti.

On 11 Feb, 11:19, "
massimilian...@yahoo.com
"

mmmm strano... a meno che la stampante non sia quella di un PC in
rete...!
in ogni caso mandalo quì(faccio qualche prova):
i k 2 z o k @ l i b e r o . i t
(Togli tutti gli Space)
@Alex

Si infatti la stampante è in un server, il computer è collegato al
server e la stampa avviene tramite la stampante di rete,
però ho fatto ulteriori prove e sono riuscito a risolvere anche questo
problema almeno credo..
comunque ti ho appena inviato due mini db demo con le spiegazioni alla
casella di posta che mi hai indicato.
A presto.
Ciao a tutti.

On 11 Feb, 12:23, "
massimilian...@yahoo.com
"

La FAQ che ti ho suggerito io all'inizio si basa un un concetto
leggermente differente, usa in pratica un CallBack(che forse potrebbe
essere più comodo).
Quello che hai fatto tu invece si basa sulla verifica RealTime che
come evidenzia anche la FAQ(KB di MS) richiede il check su Timer, come
hai giustamente fatto.
Tempo permettendo voglio vedere di far funzionare quanto deriva dal
mio Link, poi vediamo la differenza di funzionamento.
[Ricevuto tutto]
Ciao
@Alex

Si in effetti hai ragione, ma poi facendo altre ricerche mi sono
imbattuto nel codice che poi ho postato, pensando ad un utilizzo più
semplice, cosa che in realtà non si è rivelata tale, (ho una notevole
predisposizione per complicarmi le cose, ma è che sennò non mi
deverto...eh eh..)
Ad ogni modo aspetto con ansia il risultato delle tue prove.
Grazie ancora e a presto.
Ciao a tutti.