General

6.112 Inviare da VBA una copertina e/o un report per FAX usando WinFax PRO 10.0 di Symantec
  Roberto
Nella funzione SendWinFax contenuta nel modulo Funzione IvioFax DDE del database di esempio allegato si opera facendo riferimento a DDE e il report è inviato usando la stampante WinFax che viene installata automaticamente durante l’installazione di WinFAx PRO 10.0 della Symantec.

Per usare la suddetta funzione non è necessario aggiungere al database alcun particolare riferimento, in quanto non si fa uso di funzioni, oggetti o metodi SDK (Application Software Development Kit di WinFax PRO).

La funzione SendWinFax permette di inviare per fax una copertina e/o un report a scelta.

La funzione inoltre permette:
 1) Di impostare il nome ed il numero di fax del destinatario.
 2) Di impostare il nome dell’azienda del destinatario.
 3) Di impostare il nome del report da inviare per fax.
 4) Di impostare il testo della copertina.
 5) Di impostare il tipo di copertina da usare: si può usare quella di default od indicare il path di una delle copertine contenute nel database copertine di WinFax.
 6) Di impostare l’oggetto del fax.
 7) Di impostare la data e l’orario di invio del fax se diversi da quelli correnti (invio differito).
 8) Di decidere la risoluzione del fax.
 9) Di decidere se visualizzare o meno la finestra di progressione di invio fax.

Durante l’esecuzione della funzione occorre che il Controller di WinFax sia aperto. Se viene trovato chiuso, la funzione chiede di aprirlo ed eventualmente propone che l’apertura del Controller sia effettuato dalla funzione stessa.

Per usare la funzione SendWinFax è necessario registrare in un modulo del database quanto contenuto nel modulo Printers del database di esempio allegato. La maggior parte delle funzioni contenute in tale modulo sono state prese da altre FAQ del Sito Comune.
La funzione SendWinFax e quelle contenute nel modulo Printers sono state sviluppate e testate con Access 97 in ambiente Windows ME; si presupone però che funzionino anche anche con versioni successive di Access in ambienti operativi diversi da Windows ME.

Quando viene aperto per la prima volta il database di esempio allegato, poiché la tabella rubrica telefonica è vuota, il programma chiede di inserire nella rubrica almeno un nominativo con il suo relativo numero di fax.

Nel caso in cui non sia possibile aprire il database di esempio allegato, diamo qui di seguito il listato del codice VBA delle funzioni di cui sopra.

Declare Function FindWindow& Lib "user32" Alias "FindWindowA" _
(ByVal IpClassName As String, ByVal IpWindowName As String)

    '********************************************************************************************
    ' Data: Marzo 2003
    '
    ' La funzione SendWinFax trasmetterà per fax un report e lo indirizzerà al numero di fax
    ' che è stato fornito nella relativa variabile al momento del richiamo della funzione
    '
    ' Questa funzione è stata solamente testata con Access 97 sotto Windows ME e usando
    ' WinFax PRO versione 10.0 di Symantec
    '
    '*********************************************************************************************

Function SendWinFax(strFaxName As Variant, strFaxNumber As Variant, strReportName As String, _
Destinatario As Variant, Oggetto As Variant, Orario As Variant, DataFAX As Variant, _
Finestra As Integer, FileCover As Variant, TestoCover As Variant, Risoluzione As Integer) As Integer

'strFaxName      Variabile Stringa che contiene il nome del destinatario del FAX; può
'                anche assumere il valore Null o la lunghezza zero
'strFaxNumber    Variabile Stringa che contiene il numero di FAX; se NumeroFAX è Null o
'                ha lunghezza zero, verrà chiesto di digitare un numero di FAX in una
'                finestra di dialogo
'strReportName   Variabile Stringa che contiene il nome del report che va inviato per fax.
'                Può assumere anche il valore Null o avere lunghezza zero nel caso in cui
'                si vuole usare la funzione per inviare solo una copertina
'Destinatario    Variabile Stringa che contiene il nome della società del destinatario
'                può anche assumere il valore null o avere lunghezza zero
'Oggetto         Variabile Stringa che contiene l'oggetto del FAX;
'                può anche assumere il valore Null o avere lunghezza zero
'Orario          Variabile Stringa che contiene l'orario in cui inviare il FAX nella forma HH:nn:ss ;
'                se ha un valore Null o ha lunghezza zero, il fax verrà inviato all'ora corrente.
'DataFAX         Variabile Stringa che contiene la data di invio FAX nella forma mm/gg/aa ;
'                se ha un valore Null o ha lunghezza zero, il FAX verrà trasmesso nella data odierna
'Finestra        Variabile Intera che contiene il valore 1 la finestra di progressione va visualizzata;
'                se il valore numerico è diverso da 1, la finestra non verrà visualizzata
'FileCover       Variabile Stringa che contiene il path completo del file .CVP che contiene
'                la copertina da usare; può anche assumere il valore Null o avere lunghezza zero
'                nel caso non si vuole inviare una copertina o si vuole usare la copertina di default
'TestoCover      Variabile Striga che contiene il testo del messaggio da scrivere nella copertina;
'                può anche assumere il valore Null o avere lunghezza zero nel caso in cui non si vuole
'                inviare per FAX una copertina ma solamente un report
'Risoluzione     Variabile Intera che contiene il valore 1 se Alta risoluzione;
'                Se il valore numerico è diverso da 1, verà impostata la bassa risoluzione

    '**********************************
    ' Definizione di tutte le variabili
    '**********************************
    Dim Comodo As Variant
    Dim lngChannelNumber As Long
    Dim strFaxStatus As String
    Dim strRecipFaxNum As String
    Dim strRecipTime As String
    Dim strRecipDate As String
    Dim strRecipName As String
    Dim strDestinatario As String
    Dim strOggetto As String
    Dim MioNumeroFAX As Variant
    Dim strRecipient As String
    
    'Attiva la routine per il trattamento personalizzato degli errori
    On Error GoTo SendWinFax_Error
        
    '****************************************************************
    ' Settaggio delle variabili con i parametri passati alla funzione
    '****************************************************************
    MioNumeroFAX = strFaxNumber
    If Nz(strFaxNumber, "") = "" And Nz(strFaxName, "") = "" Then
        ' se il numero di fax ed il nome del destinatario
        ' non sono significativi fai digitare un numero di fax
        MioNumeroFAX = InputBox("Digita un numero di FAX!", "Destinatario sconosciuto")
        If MioNumeroFAX = "" Then
            ' se non è stato digitato un numero di fax, danne notizia e ...
            MsgBox "Non hai digitato un numero di FAX!" _
            & Chr$(10) & Chr$(13) & "Questo FAX non sarà inviato!", _
            vbCritical + vbOKOnly, "Destinatario sconosciuto"
            ' ... imposta l'esito di invio a negativo ...
            SendWinFax = 0
            ' ... ed esci dalla funzione
            Exit Function
        End If
    Else
        If Nz(strFaxNumber, "") = "" Then
            ' Se il numero di fax non è significativo
            ' fai digitare un numero di fax
            MioNumeroFAX = InputBox("Digita il numero di FAX" & Chr$(10) & _
            Chr$(13) & "di " & strFaxName, "Numero di FAX sconosciuto")
            If MioNumeroFAX = "" Then
                ' Se non non è stato digitato un numero di fax, danne notizia e ...
                MsgBox "Non hai digitato un numero di FAX!" _
                & Chr$(10) & Chr$(13) & "Questo FAX non sarà inviato!", _
                vbCritical + vbOKOnly, "Numero di FAX sconosciuto"
                ' ... imposta l'esito di invio a negativo ...
                SendWinFax = 0
                ' ... ed esci dalla funzione
                Exit Function
            End If
        End If
    End If
    strRecipFaxNum = Chr$(34) & MioNumeroFAX & Chr$(34)
    strRecipTime = Chr$(34) & Nz(Orario, "") & Chr$(34)
    strRecipDate = Chr$(34) & Nz(DataFAX, "") & Chr$(34)
    strRecipName = Chr$(34) & Nz(Left$(strFaxName, 24), "") & Chr$(34)
    strDestinatario = Chr$(34) & Nz(Mid(Trim(Destinatario), 1, 42), "") & Chr$(34)
    strOggetto = Chr$(34) & Nz(Oggetto, "") & Chr$(34)
    'Crea il recipiente di trasmissione
    strRecipient = strRecipFaxNum & "," & strRecipTime & "," & strRecipDate & "," & strRecipName & _
    "," & strDestinatario & "," & strOggetto
    
'*************************
' Inizio della sezione DDE
'*************************
    
' Verifica se il Controller di WinFax è attiva
If FindWindow("Cfaxmng", vbNullString) <= 0 Then
    ' Se Il Controller di WinFax non è attivo, danne notizia all'operatore
    MsgBox "Il Controller di WinFax non è attivo", vbCritical + vbOKOnly, "Messaggio WinFax"
    If Dir("C:\Programmi\WinFax\FAXMNG32.EXE") = "" Then
        ' Se il Controller NON è contenuto nella Directory C:\Programmi\WinFax
        ' richiedi che il Controller venga attivato manualmente ...
        MsgBox "Attiva manualmente il Controller di WinFax", _
        vbExclamation + vbOKOnly, "Messaggio WinFax"
    Else
        If MsgBox("Vuoi che lo attivo io automaticamente?", vbQuestion + vbYesNo, _
        "Controller WinFax non Attivo") = vbYes Then
            ' Se il Controller è contenuto nella directory C:\Programmi\WinFax
            ' e l'operatore lo ritiene opportuno, attivalo
            Comodo = Shell("C:\Programmi\WinFax\FAXMNG32.EXE", vbMinimizedNoFocus)
            ' Dai notizia all'operatore dell'avvenuta attivazione del Controller di WinFax
            MsgBox "Ora il Controller di WinFax é attivo", vbInformation + vbOKOnly, "Messaggio WinFax"
            ' Continua l'invio del FAX
            GoTo Riprova
        End If
    End If
    ' ... imposta l'esito di invio a negativo...
    SendWinFax = 0
    ' ... ed esci dalla funzione
    GoTo SendFax_Exit
End If
Riprova:
        'Inizializza la connessione DDE
        lngChannelNumber = DDEInitiate("faxmng32", "CONTROL")
        'Legge lo stato della connessione DDE
        strFaxStatus = DDERequest(lngChannelNumber, "STATUS")
        ' Se WinFax è occupato, cicla sino a quando non si libera
        While strFaxStatus Like "Busy*"
            strFaxStatus = DDERequest(lngChannelNumber, "STATUS")
        Wend
        'Imposta ChannelNumber con il Canale DDE corrente
        lngChannelNumber = DDEInitiate("faxmng32", "TRANSMIT")
        'Imposta il recioiente di trasmissione
        DDEPoke lngChannelNumber, "Sendfax", "recipient(" & strRecipient & ")"
        ' Se il valore di Finestra è uguale a 1 ...
        If Finestra = 1 Then
            ' ... imposta a SI la visualizzazione della finestra di dialogo
            DDEPoke lngChannelNumber, "Sendfax", "showsendscreen(""1"")"
        Else
            ' ... altrimenti imposta a NO la visualizzazione della finestra di dialogo
            DDEPoke lngChannelNumber, "Sendfax", "showsendscreen(""0"")"
        End If
        ' Se il valore di FileCover è significativo ...
        If Nz(FileCover, "") <> "" Then
            ' ... imposta il nome del file .CVP che contiene il path completo
            ' della copertina che si vuole usare ...
            DDEPoke lngChannelNumber, "Sendfax", "setcoverpage(" & Chr$(34) & FileCover & Chr$(34) & " )"
            ' Se il testo della copertina è significativo ...
            If Nz(TestoCover, "") <> "" Then
                ' ... imposta il testo della copertina
                DDEPoke lngChannelNumber, "Sendfax", "fillcoverpage(" & Chr$(34) & TestoCover & Chr$(34) & ")"
            End If
        End If
        ' Se il valore di Risoluzione è uguale a 1 ...
        If Risoluzione = 1 Then
            'Imposta ad Alta la risoluzione ...
            DDEPoke lngChannelNumber, "SendFax", "resolution(""HIGH"")"
        Else
            ' ... altrimenti impostala a Bassa
            DDEPoke lngChannelNumber, "SendFax", "resolution(""LOW"")"
        End If
        ' memorizza il nome della stampande predefinita nella variabile globale DefaultPrinter
        ' usando la funzione GetDefaultPrinter
        DefaultPrinter = Left(GetDefaultPrinter, InStr(GetDefaultPrinter, ",") - 1)
        ' Imposta WinFax come stampante predefinita usando la funzione SetDefaultPrinter
        Call SetDefaultPrinter("WinFax")
        'Esegui il report da inviare per FAX
        DoCmd.OpenReport strReportName, A_NORMAL
        ' Imposta a Vero l'esito dell'invio del FAX
        SendWinFax = -1
    
SendFax_Exit:
    ' Termina tutti i collegamenti e resetta ChannelNumber
    DDETerminateAll
    lngChannelNumber = False
    ' ripristina il nome della stampante predefinita
    Call ResetDefaultPrinter
    Exit Function
    
'************************************
'* ROUTINE DI GESTIONE DEGLI ERRORI *
'************************************
SendWinFax_Error:
        ' visualizza il numero e la descrizione degli altri errori
        MsgBox "Error:" + Error$, 0, "Invio FAX"
        ' esci dalla funzione
        Resume SendFax_Exit
        GoTo SendFax_Exit
End Function


‘**************************

Declare Function GetProfileSection& Lib "kernel32" Alias "GetProfileSectionA" (ByVal lpAppName As String, _
        ByVal lpReturnedString As String, ByVal nSize As Long)
Declare Function GetProfileString& Lib "kernel32" Alias "GetProfileStringA" (ByVal lpAppName As String, _
        ByVal lpKeyName As String, ByVal lpDefault As String, ByVal lpReturnedString As String, ByVal nSize As Long)
Declare Function WriteProfileString& Lib "kernel32" Alias "WriteProfileStringA" (ByVal lpszSection As String, _ ByVal lpszKeyName As String, ByVal lpszString As String)

Public DefaultPrinter As String

Public Function SostCar(s As String, c1 As String, c2 As String) As String
        'sostituisce un carattere con un altro in una stringa (solo prima occorrenza)
        Dim pos As Integer
        pos = InStr(1, s, c1)
        If pos > 0 Then Mid(s, pos) = c2
        SostCar = s
End Function

Public Sub SetDefaultPrinter(s As String)
        'imposta la stampante passata come argomento a predefinita
        On Error GoTo Esci
        Dim WshNetwork As Object
        If IsNull(s) Or s = "" Then Exit Sub
        Set WshNetwork = CreateObject("WScript.Network")
        WshNetwork.SetDefaultPrinter (s)
        Set WshNetwork = Nothing
        DoEvents
Esci:
End Sub

Public Sub ResetDefaultPrinter()
        'reimposta a predefinita la stampante memorizzata nella var globale
        SetDefaultPrinter (DefaultPrinter)
End Sub

Public Function GetDefaultPrinter() As String
        'ritorna il nome della stampante predefinita
        Dim x As Integer
        Dim buffer As String
        buffer = Space$(255)
        x = GetProfileString("windows", "device", "?", buffer, 255)
        GetDefaultPrinter = Left$(buffer, x)
End Function

Download:
 
  ReportFax.zip (89Kb) MSAccess97 database


Se pensate di avere del materiale freeware interessante e volete pubblicarlo, allora leggete qui.