Stampare più file esterni al DB se casella di spunta =si

di il
13 risposte

Stampare più file esterni al DB se casella di spunta =si

Buongiorno a tutti,
sono nuovo del forum e chiedo l'aiuto per risolvere un problema con la stampa di più file esterni al database in funzione della spunta di una casella di spunta appunto.
Premetto che sono autodidatta di access 2013 e profano del codice VBA
Ho una maschera con n record e alcuni campi la maschera poggia sulla seguente tabella:
Tb1:
Id =campo indice numerazione automatica
Stampa=campo di spunta si/no
fullPathPDFfile=campo testo breve dove il codice di seguito riportato memorizza il percorso del file esterno al database:

Private Sub cmdLoadPDF_Click()

Dim strPathFile As String
strPathFile = cmdFileDialog
If Len(strPathFile) > 0 Then
Me.fullPathPDFfile = strPathFile
Me.Dirty = False
End If

End Sub

Avrei bisogno, siccome da macro non riesco a farlo, di indicazioni su come fare a far si che premendo un pulsante siano inviati in stampa i file pdf precedentemente spuntati con spunta .
So perfettamente di avere bisogno di un ciclo recordset clone ma non sono in grado di scriverlo in termini di codice.
Ringrazio anticipatamente chi volesse darmi qualche diritta.

13 Risposte

  • Re: Stampare più file esterni al DB se casella di spunta =si

    Non puoi chiedere il codice pronto ... esiste un regolamento...
  • Re: Stampare più file esterni al DB se casella di spunta =si

    Penso che questo codice ti possa aiutare.
    ciao


    
    
    Option Compare Database
    Option Explicit
    
    Public Declare Function ShellExecute Lib "shell32.dll" Alias "ShellExecuteA" ( _
    ByVal hwnd As Long, _
    ByVal lpOperation As String, _
    ByVal lpFile As String, _
    ByVal lpParameters As String, _
    ByVal lpDirectory As String, _
    ByVal nShowCmd As Long) As Long
    Dim SQL         As String
    
     
    Public Function PrintThisDoc(formname As Long, FileName As String)
    	On Error Resume Next
    	Dim X As Long
    	X = ShellExecute(formname, "Print", FileName, 0&, 0&, 3)
    End Function
     
     
    Public Sub EsegueStampa()
        Dim printThis
        Dim strFile     As String
        Dim rp          As DAO.Recordset
        SQL = "Select * From Tb1 Where STAMPA = true Order by fullPathPDFfile "
        Set rp = CurrentDb.OpenRecordset(SQL, 4)
        Do While Not rp.EOF()
            strFile = rp!fullPathPDFfile
            printThis = PrintThisDoc(0, strFile)
            DoEvents
            rp.MoveNext
        Loop
        rp.Close: Set rp = Nothing
    End Sub
    
    
    
  • Re: Stampare più file esterni al DB se casella di spunta =si

    Justaquestion ha scritto:


    ...
    Ringrazio anticipatamente chi volesse darmi qualche diritta.
    Spiace rilevare che quanto indicato qui non sia stato recepito perché comunque era la soluzione giusta, da adattare, ok, ma era quella giusta. http://forum.masterdrive.it/access-79/stampare-pi-file-pdf-esterni-in-base-casella-spunta-98168/#post357413
    Quindi occhio a quanto suggerito da andreacesena perché potrebbe succedere quello che ha indicato @Alex con
    La stampa fine a se stessa sarebbe banale, (omissis) se non che, questo processo ASINCRONO rispetto al Driver ti inchioda tutto se i File sono tanti o se sono grossi
    Anche per il codice suggerito da andreacesena (che non conosce il fatto che il sistema operativo è a 64 bit) avrai lo stesso problema dell'altro thread.
    Da qui puoi prendere spunto per iniziare ad "adattare" il codice:
  • Re: Stampare più file esterni al DB se casella di spunta =si

    Sul fatto di inchiodare, non succede tanto per il numero di file dato che usa il DoEvents, ma se tali file sono pesanti.

    Comunque, visto che se ne è discusso sull'altro forum, si poteva anche partire avendo conoscenza di quella discussione.

    Resta il fatto che anche in questo forum la richiesta e fornitura di codice pronto sarebbe vietata, comunque non ben tollerata.
  • Re: Stampare più file esterni al DB se casella di spunta =si

    Ringrazio Andreacesena per la soluzione, a maggior ragione poichè sono consapevole del fatto che non si possa richiedere codice pronto, ma ritengo che trattandosi di una "istruzione" non ci sia altra soluzione per chi come me si accosta per la prima volta alla "programmazione" - passatemi il termine- e da questo assunto prometto che lo studierò per capire le logiche di funzionamento del codice stesso e poter poi svilupparne la scrittura pian pianino con l'aiuto di esperti quali voi tutti siete.
    Mi impegno poi a cercare di capirci qualcosa sul materiale linkato da Philcattivocarattere per superare l'incompatibilità di sistema.
    Spero che se non dovessi proprio riuscire di poter contare su di un vostro ulteriore aiuto per essere instradato nella giusta direzione.
    Mille grazie.
  • Re: Stampare più file esterni al DB se casella di spunta =si

    Ho provato prima a sostituire, per quello che ho potuto capire, il codice di Andreacesena
    Public Declare Function ShellExecute Lib "shell32.dll" Alias "ShellExecuteA" ( _
    ByVal hwnd As Long, _
    ByVal lpOperation As String, _
    ByVal lpFile As String, _
    ByVal lpParameters As String, _
    ByVal lpDirectory As String, _
    ByVal nShowCmd As Long) As Long
    Dim SQL         As String
    
    con il seguente prelevato dal link postato da Philcattivocarattere, ma temo di non essere sulla strada giusta,
    
    Private Declare Function ShellExecute Lib "shell32.dll" Alias "ShellExecuteA" ( _
    ByVal hwnd As Long, _
    ByVal lpOperation As String, _
    ByVal lpFile As String, _
    ByVal lpParameters As String, _
    ByVal lpDirectory As String, _
    ByVal nShowCmd As Long) As Long
    
    Ma non funzione. Ho provato poi a sostituire lo stesso codice con il seguente:
    
         Declare Function CreateProcess Lib "kernel32" _
                                       Alias "CreateProcessA" (ByVal lpApplicationName As String, _
                                                               ByVal lpCommandLine As String, _
                                                               lpProcessAttributes As SECURITY_ATTRIBUTES, _
                                                               lpThreadAttributes As SECURITY_ATTRIBUTES, _
                                                               ByVal bInheritHandles As Long, _
                                                               ByVal dwCreationFlags As Long, _
                                                               lpEnvironment As Any, _
                                                               ByVal lpCurrentDriectory As String, _
                                                               lpStartupInfo As STARTUPINFO, _
                                                               lpProcessInformation As PROCESS_INFORMATION) As Long
    
    
        Declare PtrSafe Function CreateProcess Lib "kernel32" _
                                       Alias "CreateProcessA" (ByVal lpApplicationName As String, _
                                                               ByVal lpCommandLine As String, _
                                                               lpProcessAttributes As SECURITY_ATTRIBUTES, _
                                                               lpThreadAttributes As SECURITY_ATTRIBUTES, _
                                                               ByVal bInheritHandles As Long, _
                                                               ByVal dwCreationFlags As Long, _
                                                               lpEnvironment As Any, _
                                                               ByVal lpCurrentDriectory As String, _
                                                               lpStartupInfo As STARTUPINFO, _
                                                               lpProcessInformation As PROCESS_INFORMATION) As LongPtr
    
    'Full example shown below, including the necessary structures
    #If VBA7 Then
        Declare PtrSafe Function CreateProcess Lib "kernel32" _
                                       Alias "CreateProcessA" (ByVal lpApplicationName As String, _
                                                               ByVal lpCommandLine As String, _
                                                               lpProcessAttributes As SECURITY_ATTRIBUTES, _
                                                               lpThreadAttributes As SECURITY_ATTRIBUTES, _
                                                               ByVal bInheritHandles As Long, _
                                                               ByVal dwCreationFlags As Long, _
                                                               lpEnvironment As Any, _
                                                               ByVal lpCurrentDriectory As String, _
                                                               lpStartupInfo As STARTUPINFO, _
                                                               lpProcessInformation As PROCESS_INFORMATION) As LongPtr
    
        Const INFINITE = &HFFFF
        Const STARTF_USESHOWWINDOW = &H1
    Private Enum enSW
        SW_HIDE = 0
        SW_NORMAL = 1
        SW_MAXIMIZE = 3
        SW_MINIMIZE = 6
    End Enum
    
    Private Type PROCESS_INFORMATION
        hProcess As LongPtr
        hThread As LongPtr
        dwProcessId As Long
        dwThreadId As Long
    End Type
    
    Private Type STARTUPINFO
        cb As Long
        lpReserved As String
        lpDesktop As String
        lpTitle As String
        dwX As Long
        dwY As Long
        dwXSize As Long
        dwYSize As Long
        dwXCountChars As Long
        dwYCountChars As Long
        dwFillAttribute As Long
        dwFlags As Long
        wShowWindow As Integer
        cbReserved2 As Integer
        lpReserved2 As Byte
        hStdInput As LongPtr
        hStdOutput As LongPtr
        hStdError As LongPtr
    End Type
    
    Private Type SECURITY_ATTRIBUTES
        nLength As Long
        lpSecurityDescriptor As LongPtr
        bInheritHandle As Long
    End Type
    
    Private Enum enPriority_Class
        NORMAL_PRIORITY_CLASS = &H20
        IDLE_PRIORITY_CLASS = &H40
        HIGH_PRIORITY_CLASS = &H80
    End Enum
    #Else
        Declare Function CreateProcess Lib "kernel32" _
                                       Alias "CreateProcessA" (ByVal lpApplicationName As String, _
                                                               ByVal lpCommandLine As String, _
                                                               lpProcessAttributes As SECURITY_ATTRIBUTES, _
                                                               lpThreadAttributes As SECURITY_ATTRIBUTES, _
                                                               ByVal bInheritHandles As Long, _
                                                               ByVal dwCreationFlags As Long, _
                                                               lpEnvironment As Any, _
                                                               ByVal lpCurrentDriectory As String, _
                                                               lpStartupInfo As STARTUPINFO, _
                                                               lpProcessInformation As PROCESS_INFORMATION) As Long
    
        Const INFINITE = &HFFFF
        Const STARTF_USESHOWWINDOW = &H1
    Private Enum enSW
        SW_HIDE = 0
        SW_NORMAL = 1
        SW_MAXIMIZE = 3
        SW_MINIMIZE = 6
    End Enum
    
    Private Type PROCESS_INFORMATION
        hProcess As Long
        hThread As Long
        dwProcessId As Long
        dwThreadId As Long
    End Type
    
    Private Type STARTUPINFO
        cb As Long
        lpReserved As String
        lpDesktop As String
        lpTitle As String
        dwX As Long
        dwY As Long
        dwXSize As Long
        dwYSize As Long
        dwXCountChars As Long
        dwYCountChars As Long
        dwFillAttribute As Long
        dwFlags As Long
        wShowWindow As Integer
        cbReserved2 As Integer
        lpReserved2 As Byte
        hStdInput As Long
        hStdOutput As Long
        hStdError As Long
    End Type
    
    Private Type SECURITY_ATTRIBUTES
        nLength As Long
        lpSecurityDescriptor As Long
        bInheritHandle As Long
    End Type
    
    Private Enum enPriority_Class
        NORMAL_PRIORITY_CLASS = &H20
        IDLE_PRIORITY_CLASS = &H40
        HIGH_PRIORITY_CLASS = &H80
    End Enum
    #End If
    
    Private Function SuperShell(ByVal App As String, ByVal WorkDir As String, dwMilliseconds As Long, _
                                ByVal start_size As enSW, ByVal Priority_Class As enPriority_Class) As Boolean
    
    
        Dim pclass As Long
        Dim sinfo As STARTUPINFO
        Dim pinfo As PROCESS_INFORMATION
        'Not used, but needed
        Dim sec1 As SECURITY_ATTRIBUTES
        Dim sec2 As SECURITY_ATTRIBUTES
        'Set the structure size
        sec1.nLength = Len(sec1)
        sec2.nLength = Len(sec2)
        sinfo.cb = Len(sinfo)
        'Set the flags
        sinfo.dwFlags = STARTF_USESHOWWINDOW
        'Set the window's startup position
        sinfo.wShowWindow = start_size
        'Set the priority class
        pclass = Priority_Class
    
        'Start the program
        If CreateProcess(vbNullString, App, sec1, sec2, False, pclass, _
                         0&, WorkDir, sinfo, pinfo) Then
            'Wait
           ' WaitForSingleObject pinfo.hProcess, dwMilliseconds
            SuperShell = True
        Else
            SuperShell = False
        End If
    End Function
    
    Sub Test()
        Dim sFile As String
        'Set the dialog's title
        sFile = Application.GetOpenFilename("Executables (*.exe), *.exe", , "")
        SuperShell sFile, Left(sFile, InStrRev(sFile, "\")), 0, SW_NORMAL, HIGH_PRIORITY_CLASS
    End Sub
    
    Ma niente ancora l'errore è sempre di incompatibilità di sistema.

    Qualche suggerimento? Chiedo scusa ma proprio non comprendo il codice a cosa si riferisca.

    Grazie
  • Re: Stampare più file esterni al DB se casella di spunta =si

    In via del tutto eccezionale, il presente thread non viene chiuso per violazione alle norme che proibiscono il cross-posting e la richiesta di codice pronto all'uso.

    Si invita l'OP a prestare maggiore attenzione in futuro, ed a fare sempre uso dei tag [ code ] per formattare il codice sorgente.
  • Re: Stampare più file esterni al DB se casella di spunta =si

    Justaquestion ha scritto:


    Ho provato prima a sostituire, per quello che ho potuto capire, il codice di Andreacesena ....
    Ma niente ancora l'errore è sempre di incompatibilità di sistema.

    Qualche suggerimento? Chiedo scusa ma proprio non comprendo il codice a cosa si riferisca.

    Grazie
    Conversione delle API a 64Bit...!
  • Re: Stampare più file esterni al DB se casella di spunta =si

    Ho l'impressione che l'intero codice pronto sia l'unica soluzione del thread.
  • Re: Stampare più file esterni al DB se casella di spunta =si

    Ringrazio per la clemenza, ed effettivamente ho posto la questione su un'altro forum, non era mia intenzione fare cross posting tant'è che sull'altro forum non avendo ricevuto nessun aiuto ho chiuso la discussione ringraziando perchè chi è in difficoltà e chiede aiuto non ha bisogno di risposte criptiche su di un argomento di per se criptico.
    Ricevere un aiuto che per sua natura non è di aiuto ma che a problema aggiunge problema ancora più insormontabile mi ha fatto decidere di rivolgermi ad altro forum.
    Se porre una questione in un forum, dove non si riceve aiuto, pone nella condizione di non poter porre lo stesso quesito altrove sperando in un esito migliore è post crossing, me ne dolgo e chiudo il post anche qui anche in questo caso senza ricevere aiuto se non fantastiche risposte del tipo
    " Conversione delle API a 64Bit...!"
    Volendo parafrasare senza però polemizzare, beninteso, solo per rendere l'idea di ciò che mi è arrivato di questi forum è come se mi fossi recato da un elettrauto con una lampadina da cambiare e questi mi tirasse fuori lo schema dell'intero impianto elettrico dell'auto e mi dicesse devi solo cambiare la lampadina.
    Ma mi rendo conto chela colpa non'è di nessuno delle parti troppo incapace io troppo sapienti gli altri. E la conclusione del post rimane la stessa dell'altro forum. Il livello è troppo alto .
    A questo punto pongo un quesito diverso:
    Esiste un forum per chi si vuole avvicinare al codice che trovi dall'altra parte qualcuno di buona volontà che gli spieghi come fare? in un ottica di condivisione.
    Perché questo dovrebbe essere la mission del forum' o sbaglio?
    Ad ogni modo non sono capace di scrivere un ciclo, figuriamoci di risolvere un problema di compatibilità.
    E' come se chiedessi qualcuno mi insegna a scrivere e dall'altra pare mi dicessero....comincia con il copiare la divina commedia.
    Ringrazio tutti per la pazienza e mi scuso con i meno pazienti.
    Ringrazio soprattutto Andreacesena che almeno ha provato a darmi un aiuto e il moderatore per l'indulgenza.
    Ed io me ne torno da sono venuto con il mio problema.
  • Re: Stampare più file esterni al DB se casella di spunta =si

    Justaquestion ha scritto:


    ... se non fantastiche risposte del tipo
    " Conversione delle API a 64Bit...!"
    Eppure è la risposta giusta! Questo è l'inizio della pagina di cui avevo riportato il link
    Declaring API functions in 64 bit Office
    Introduction
    With the introduction of Windows 7 and Office 2010 VBA developers face a new challenge: ensuring their applications work on both 32 bit and 64 bit platforms.
    This page is meant to become the first stop for anyone who needs the proper syntax for his API declaration statement in Office VBA.
    Da lì, come avevo detto, potevi trovare qualche spunto per adattare il codice di andreacesena, se non trovarlo già bello e pronto
    La tabella ha due colonne: "Function name" e "Declarations (32 bit followed by 64 bit)"
    In corrispondenza della riga ShellExecute trovi
    
    Private Declare Function ShellExecute Lib "shell32.dll" Alias "ShellExecuteA" ( _
            ByVal hwnd As Long, ByVal lpOperation As String, ByVal lpFile As String, _
            ByVal lpParameters As String, ByVal lpDirectory As String, ByVal nShowCmd As Long) As Long
    
    Private Declare PtrSafe Function ShellExecute Lib "shell32.dll" Alias "ShellExecuteA" ( _
            ByVal hwnd As LongPtr, ByVal lpOperation As String, ByVal lpFile As String, _
            ByVal lpParameters As String, ByVal lpDirectory As String, ByVal nShowCmd As Long) As LongPtr
    Ti garantisco che io di API non so quasi niente se però trovo una funzione pronta e funzionante con un sistema operativo a 32 bit, la conversione a 64 bit grazie a pagine come quella indicata (e ai file messi a disposizione da Microsoft citati sempre in quella pagina) di solito mi riesce.
  • Re: Stampare più file esterni al DB se casella di spunta =si

    Tutta la questione sta in questa tua frase
    non sono capace di scrivere un ciclo
    Quindi questo e l'altro forum (ma anche tanti altri) in cui è richiesta per Regolamento interno una preparazione minima che permetta di capire i suggerimenti e metterli in pratica, non va bene per te. Non a caso, sempre per Regolamento interno, non è consentita la richiesta (e la fornitura) di "pappa pronta", proprio per il motivo appena accennato.

    La questione dell'elettrauto, scusa, ma non c'entra nulla. Tu lo paghi l'elettrauto proprio per la "pappa pronta". Ovvero, tu non lo sai fare e paghi un professionista perché lo faccia al posto tuo. A questo punto è come se tu pagassi un programmatore per scrivere il codice al posto tuo ... è ovvio che lo farebbe senza problemi !

    Questi forum sono a partecipazione gratuita e sono di tipo "tecnico", per chi "almeno un ciclo lo sa scrivere", "almeno sa cosa cercare se si scrive una frase d'aiuto che a te sembra criptica" e sa "andare avanti con piccole spintarelle". La gente qui partecipa volontariamente nel tempo libero, non è tenuto a farti da "docente di programmazione".

    Esistono altri forum fatti proprio come vuoi tu ma non è detto che sia questa la "missione" dei forum, anzi non condivido questo modo di operare per niente. La condivisione delle informazioni l'hai ottenuta anche tu, se non sai sfruttare tali informazioni non è colpa di chi ti ha risposto.
    Te l'ho detto, l'unico modo per risolvere il tuo problema è fornirti il codice pronto e in questi forum si è scelto di non operare così !
    ... che almeno ha provato a darmi un aiuto ...
    E cosa ci hai fatto con quel codice? Nulla ... perché non sai dove mettere le mani neanche per adattare una sola istruzione.
    Quindi anche quel codice è stato inutile.
    Ed io me ne torno da sono venuto con il mio problema.
    Buona fortuna.
  • Re: Stampare più file esterni al DB se casella di spunta =si

    Che non fosse colpa vostra l'ho riconosciuto.
    Che del codice non ne abbia fatto nulla...non ancora è detto, ci sto lavorando e ringrazio ancora chi mi ha dato le diritte.
    Per il resto cosa vuoi che ti dica.... hai ragione.
Devi accedere o registrarti per scrivere nel forum
13 risposte