Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

fattura elettronica - file zip che contiene i file xml di un certo mese

179 views
Skip to first unread message

mario rossi

unread,
Dec 6, 2018, 8:48:23 AM12/6/18
to
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.

BFS

unread,
Dec 6, 2018, 9:08:35 AM12/6/18
to
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

mario rossi

unread,
Dec 6, 2018, 12:11:55 PM12/6/18
to
valida alternativa grazie, per zipparli usi riga di comando? o qualche utility particolare?

Graziano

unread,
Dec 6, 2018, 5:33:27 PM12/6/18
to
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)

@Alex

unread,
Dec 7, 2018, 2:56:02 AM12/7/18
to
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

RobertoA

unread,
Dec 7, 2018, 3:51:23 AM12/7/18
to
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

mario rossi

unread,
Dec 8, 2018, 9:21:24 AM12/8/18
to
avete un esempio con findexecutable per ricavare il percorso del file winzip?

grazie.

RobertoA

unread,
Dec 8, 2018, 11:05:19 AM12/8/18
to
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

Message has been deleted

@Alex

unread,
Dec 8, 2018, 12:46:41 PM12/8/18
to
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

ciroteo

unread,
Feb 3, 2020, 12:50:31 PM2/3/20
to
Ciao Alex!
Grazie per questo suggerimento mi sta servendo un sacco.
E' possibile anche aggiungere cartelle al file zip?
m

@Alex

unread,
Feb 3, 2020, 1:12:57 PM2/3/20
to

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

@Alex

unread,
Feb 3, 2020, 1:27:09 PM2/3/20
to
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

ciroteo

unread,
Feb 4, 2020, 5:56:06 AM2/4/20
to
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

ciroteo

unread,
Feb 4, 2020, 7:08:05 AM2/4/20
to
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:

ciroteo

unread,
Feb 4, 2020, 7:27:48 AM2/4/20
to

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 ...

ciroteo

unread,
Feb 4, 2020, 7:29:45 AM2/4/20
to
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:

@Alex

unread,
Feb 4, 2020, 7:31:44 AM2/4/20
to
Il giorno martedì 4 febbraio 2020 13:29:45 UTC+1, ciroteo ha scritto:
> ecco risolto!!!
> gli passavo una stringa ma lui si aspettava un variant ...
> grazie funziona!
> ;-)
>

Ottimo.

Ciao
@Alex
0 new messages