Newsgroup: it.comp.appl.access
Titolo: fattura elettronica - file zip che contiene i file xml di un certo mese

nel nome del file xml non è presente la data quindi vi chiedo se avete idea di come poter selezionare soltanto le fatture di un certo mese da una cartella e di quelle fatture creare un file zippato che le contenga tutte.
 
forse devo scorrere i file presenti nella cartella con DIR e leggere il tag data fattura all'interno di ogni xml per prelevare la data?
 
qualche altra strada? grazie a tutti.


io faccio cosi:
quando genero le fatture di tutto il mese le salvo nella cartella:
c:\cartellaprogramma\anno\mese\....xml
 
quindi so che nella cartella  \2019\01\  avrò tutti gli xml di gennaio
 
a questo punto ti basta zippare tutto il contenuto della cartella e 
cancellare gli xml per evidare di spedire due volte gli stessi
 
ciao
 
 
---
Questa email è stata esaminata alla ricerca di virus da AVG.
http://www.avg.com
 
 


valida alternativa grazie, per zipparli usi riga di comando? o qualche utility particolare?


Dim Prog as string, dim tipo as string
  Prog = "c:\Programmi\Winzip"
  Tipo = strCmd + FormaT(DataZip, "ddmmyyyy") & ".zip"
Inizio:
  strCmd = Prog + "\winzip32.exe -a -ex " + Tipo + ZipName
  retVal = Shell(strCmd, vbHide)


Una considerazione su questo suggerimento
 
   > Tipo = strCmd + FormaT(DataZip, "ddmmyyyy") & ".zip"
La variabile [strCmd] in questa riga forse non è corretta...?
La variabile [DataZip] non è riconoscibile, anche se si intuisce...
L'assegnazione della variabile [Prog] è poco affidabile, nel senso che va bene sul tuo PC... di certo... ma non su tutti.
 
Per questo suggerirei l'uso di FindExecutable al fine di ricavare da codice il PATH reale e non definirlo come Costante.
 
Sull'utilizzo di SHELL invece, in caso di ZIP di documenti leggeri non impatta di certo... se il "malloppo" fosse di discrete dimensioni, rendere il codice ASINCRONO potrebbe generare problemi... ad esempio invio immediato quando lo ZIP non è ancora terminato...
 
Per questo motivo si dovrebbe ricorrere all'esecuzione SINCRONA, fattibile in 2 modi:
 
1) API, ma serve anche capire come adattarne il codice a 32/64bit
 
http://access.mvps.org/access/api/api0004.htm
 
 
2) Oppure molto più comodo e semplice:
   Sub SyncShell(ByVal Cmd As String, ByVal WindowStyle As VbAppWinStyle)
       VBA.CreateObject("WScript.Shell").Run Cmd, WindowStyle, True
   End Sub
 
 
Saluti
@Alex


E si, direi che anche in caso di file piccoli e' consigliabile usare 
l'esecuzione asincrona, non sai mai quanto ci metta l'esterno a completarsi
 
Inoltre, essendo 'fuori dal codice interno' sarebbe auspicabile 
prevedere una gestione degli errori, se qualcosa non va a buon fine 
(disco pieno, file esistente, ecc..), e quindi l'uso di un eseguibile 
che restituisca dei valori a fine esecuzione oppure che produca un file 
di log che il codice Access andra' poi a leggere per 'capire' se 
l'operazione e' andata a buon fine
 


avete un esempio con findexecutable per ricavare il percorso del file winzip?
 
grazie.


Se dovessi farlo io, userei una versione 'portable' di Winzip o analogo, 
posizionata nella directory della procedura Access
Cosi' elimini la necessita' di verificare dov'e' (e se c'e') il 
programma compressore/decompressore
Ciapa ki
 
https://www.newstechnology.eu/it/microsoft/zippare-cartelle-da-linea-di-comando.html
 
 

L?idea del Portable è ottima... in quel caso FindExecutable fallirebbe quindi il programmatore sa dove lo installa, magari in una SubFolder dell'applicativo.
 
Se volete provare questo metodo... non richiede nulla:
 
Prima si predispone il FILE ZIP, poi si aggiungono i File da includere:
 
'    Call InitializeZipFile(strZIP)
'    Call AddFilesToZip(strZIP, PrimoFile)
'    Call AddFilesToZip(strZIP, SecondoFile)
'
 
Sub AddFilesToZip(ZipFile As String, FileToAdd As String)
 
    Dim objShell As Object
    Dim varZipFile As Variant
 
    If Len(Dir(FileToAdd)) > 0 Then
 
        Set objShell = CreateObject("Shell.Application")
        varZipFile = ZipFile
        objShell.Namespace(varZipFile).CopyHere (FileToAdd)
        Do Until objShell.Namespace(varZipFile).Items.Count >= 1
            Call Sleep(100)
        Loop
    End If
 
End Sub
 
Sub InitializeZipFile(ZipFile As String)
 
    Dim intFile As Integer
 
    If Len(Dir(ZipFile)) > 0 Then
        Kill ZipFile
    End If
 
    intFile = FreeFile
    Open ZipFile For Output As #intFile
      Print #intFile, Chr$(80) & Chr$(75) & Chr$(5) & Chr$(6) & String(18, 0)
    Close #intFile
End Sub
 
 
@Alex

Ciao Alex! 
Grazie per questo suggerimento mi sta servendo un sacco.
E' possibile anche aggiungere cartelle al file zip?
m


 
Forse questo è quello che chiedi, è bastato sullo stesso principio... prova a vedere se ho capito:
 
Sub CreateZipFile(folderToZipPath As Variant, zippedFileFullName As Variant)
 
Dim ShellApp As Object
 
'Create an empty zip file
Open zippedFileFullName For Output As #1
Print #1, Chr$(80) & Chr$(75) & Chr$(5) & Chr$(6) & String(18, 0)
Close #1
 
'Copy the files & folders into the zip file
Set ShellApp = CreateObject("Shell.Application")
ShellApp.Namespace(zippedFileFullName).CopyHere ShellApp.Namespace(folderToZipPath).items
 
'Zipping the files may take a while, create loop to pause the macro until zipping has finished.
On Error Resume Next
Do Until ShellApp.Namespace(zippedFileFullName).items.Count = ShellApp.Namespace(folderToZipPath).items.Count
    Application.Wait (Now + TimeValue("0:00:01"))
Loop
On Error GoTo 0
 
End Sub
 
@Alex

Ovviamente il codice è per Excel devi sostituire il WAIT con uno Sleep e Doevents...
Puoi manipolare il codice per farlo diventare un unico pezzo discriminando se il path passato è file o folder... usando gli Attributes 
 
GetAttr(fName) And vbDirectory)=vbDirectory
GetAttr(fName) And vbDirectory)<>vbDirectory
 
oppureusando DIR inserendo vbDirectory...
 
E dal primo codice aggiungi lo zip della cartella...
 
Ciao
@Alex

Grazie ci lavoro e ti do un riscontro.
Il processo che dovrei fare sarebbe questo: 
creare diversi pdf legati ad un tipo di analisi (non so a priori quanti)
in una cartella denominata in modo univoco e la zippo
da lì sono a posto, non devo cambiare la procedura di invio email perchè punto direttamente al file zip creato. In caso contrario dovrei ciclare tra tutti i file creati per allegarli all'email e sarebbe per me più complicato.
 
Grazie
m


Mi sta restituiendo errore 91 (variabile oggetto non impostata ...)
 
la cartella di origine esiste, il file lo crea ma non aggiunge i file.
e mi da l'errore ...
 
 
 
Il giorno lunedì 3 febbraio 2020 19:27:09 UTC+1, @Alex ha scritto:


 
da riga di comando se passo i due path per esteso la funzione lavora correttamente
se gli passo una stringa a partire dalla variabile non va ...


ecco risolto!!!
gli passavo una stringa ma lui si aspettava un variant ...
grazie funziona!
;-)
 
 
 
Il giorno martedì 4 febbraio 2020 13:08:05 UTC+1, ciroteo ha scritto:


 
 
Ottimo.
 
Ciao
@Alex