Files XML con struttura diversa in unico file Excel

Anonimo
2019-12-06T14:28:19+00:00

Buonasera con l'arrivo della fatturazione elettronica nascono nuove esigenze e devo per una piccola trattoria di Milano creare un file per l'inventario e la successiva costruzione di un foglio per il costo piatto.

Tutto parte quindi dai file xml che si ricevono dai fornitori, files che spesso e volentieri hanno una struttura diversa, ovvero le colonne, ad esempio, prezzo unitario d'acquisto e quantità, possono avere posizioni diverse....

volevo chiedere se é possibile esportare più fatture costi xml (fornitori) in un unico file excel con una macro

L'obbiettivo é quello di creare, mensilmente, una sorta di inventario di tutto l'acquistato quindi nel nostro file ideale di destinazione ci dovrebbe essere:

  • nome fornitore
  • partita iva fornitore
  • data fattura
  • mese di emissione della fattura
  • numero fattura
  • codice articolo acquistato
  • descrizione articolo
  • unità misura
  • quantità
  • costo unitario
  • costo totale
  • aliquota Iva
  • ecc

Penso si possa ovviare importando massivamente tanti files xml in un'unica cartella di lavoro excel per poi creare una macro che dica "vai in ogni foglio e riporta tutto quello che c'é nella colonna con intestazione, ad esempio, Descrizione prodotto ed incollalo su un nuovo foglio master dove a fine anno troverò tutte le fatture dell'anno di tutti i fornitori con quindi tutte le quantità acquistate e quando

Grazie mille per il preventivo aiuto

Microsoft 365 e Office | Excel | Per la casa | Windows

Domanda bloccata. Questa domanda è stata eseguita dalla community del supporto tecnico Microsoft. È possibile votare se è utile, ma non è possibile aggiungere commenti o risposte o seguire la domanda.

0 commenti Nessun commento
Risposta accettata dall'autore della domanda
Anonimo
2019-12-10T06:46:43+00:00

Aggiungo che in questa versione tre troverai che per il prezzo unitario, in caso di nota di credito, il valore viene reso "assoluto" ma non anche negativo:

arrDatiFattura(13, cont) = Abs(CDec(Replace(.SelectNodes("PrezzoUnitario")(0).Text, ".", ","))) ' * -1

Credo che da un punto di vista della "lettura" e per eventuali conteggi sia meglio rappresentare in tal modo il dato, considerato che le quantità sono sempre in negativo (e anche il prezzo totale).

Per le fatture normali invece i valori vengono sempre presi così come indicati perché non è possibile sapere se si sia di fronte ad uno storno se non in base al prezzo totale (poiché c'è che indica le quantità in positivo ma il prezzo unitario in negativo e chi viceversa).

La risposta è stata utile?

1 persona ha trovato utile questa risposta.
0 commenti Nessun commento
Risposta accettata dall'autore della domanda
Anonimo
2019-12-10T06:39:14+00:00

Se togli la spunta, chiudi la finestra dei riferimenti, la ricarichi e cerchi il componente lo trovi (magari una versione anche differente come la v4.0 che nel mio pc è installata nella cartella Windows/SysWOW64)?

Prova comunque con questo file dove ho eliminato il riferimento è utilizzo l'oggetto MSXML2.DOMDocument tramite CreateObject e con definzione delle variabili come Object.

Se il componente è installato correttamente non dovresti avere errori. Altrimenti dovresti avere l'errore che non è possibile creare il "componente Activex" o qualcosa di simile.

File esempio 3: File Esempio (3)

La risposta è stata utile?

0 commenti Nessun commento

8 risposte aggiuntive

Ordina per: Più utili
  1. Anonimo
    2019-12-09T15:31:18+00:00

    Ciao Andrea,

    non riporti il messaggio dell'errore VBA ma probabilmente si tratta del fatto che non risulta "agganciata" la dll "Microsoft XML, V6.0.

    Nella barra degli strumenti dell'editor VBA c'è la voce Strumenti e una sottovoce Riferimenti ...

    Cliccando su Riferimenti ... si apre questa finestra:

    Come vedi da me ho la spunta su Microsoft XML, v6.0.

    Se non vedi anche da te allora devi cercare il componente.

    In realtà postresti anche utilizzare quello che si vede il lista, ma non è selezionato, Microsoft XML, v3.0

    Comunque ti metto il link ad una nuova versione: File esempio (2)

    Oggi ho potuto provare il file con un numero maggiore di file xml e ho riscontrato un errore con la fuzione "Transpose" (che ho utilizzato prima di inserire i dati elaborati nella tabella).

    Non sono riuscito a capire perché la funzione Transpose andasse in errore e allora ho provveduto ad effettuare una transposizione dalla matrice originaria ad una in maniera "manuale" (tramite un ciclo).

    Forse i tempi si allungano di qualcosa ma provando non mi pare che sia percepibile dai "sensi umani".

    Inoltre ho impostato tre diverse gestioni di eventuali errori (mi sono reso conto che così come avevo impostato prima un errore in fase successiva all'elaborazione dei file mandava in "loop" il messaggio di errore.

    Riporto tutto il codice modificato a benificio di tutti:

    Sub CaricaDatiFatture()

       '''--- N.B. è stata caricata la dll msxml6.dll

       '''--- Strumenti->Riferimenti...->Microsoft XML, V6.0

       Dim sPath As String

       Dim oFso As Object

       Dim oFsoFolder As Object

       Dim oFile As Object

       Dim strFile As String

       Dim sNomeFile As String

       Dim vMatch As Variant

       '---

       Dim DomDoc As DOMDocument

       Dim oChildNodeFatturaElettronicaBody As IXMLDOMElement

       '---

       Dim sNominativoFornitore As String

       Dim sCodiceIva As String

       Dim sTipoDocumento As String

       Dim sDataFattura As Long

       Dim sMeseFattura As Long

       Dim sNumeroFattura As String

       Dim bCaricaDatiFattura As Boolean

       Dim cont As Long

       Dim i As Long, j As Long

       Dim arrDatiFattura() As Variant

       Dim arrDatiFatturaTrasposti() As Variant

       Dim nRighe As Long

       '---

       Dim oLoDataBase As ListObject

       Const NumeroCampiDati As Long = 15

       Const sNodoDatiAnagrafici As String = "FatturaElettronicaHeader/CedentePrestatore/DatiAnagrafici"

       Const sNodoDenominazioneCedente As String = sNodoDatiAnagrafici & "/Anagrafica/Denominazione"

       Const sNodoCognomeCedente As String = sNodoDatiAnagrafici & "/Anagrafica/Cognome"

       Const sNodoNomeCedente As String = sNodoDatiAnagrafici & "/Anagrafica/Nome"

       Const sNodoIdPaese As String = sNodoDatiAnagrafici & "/IdFiscaleIVA/IdPaese"

       Const sNodoIdCodice As String = sNodoDatiAnagrafici & "/IdFiscaleIVA/IdCodice"

       Const sDatoNonDisponibile As String = "N.D."

       '''--- procedura per selezionare la cartella in cui sono presenti i file delle fatture elettroniche da caricare nel db

       'With Application.FileDialog(msoFileDialogFolderPicker)

       '   .Title = "Seleziona il percorso contenente i file xml delle fatture di acquisto da cui importare i dati"

       '   If .Show = -1 Then

       '      sPath = .SelectedItems(1)

       '   Else

       '      Exit Sub

       '   End If

       'End With

       '''---in alternativa alla procedura di cui sopra indicazione del percorso "predeterminato" in cui sono presenti i file delle fatture elettroniche da caricare nel db

       sPath = "C:\Test\xml"

       On Error GoTo ErroreFaseIniziale

       Set oFso = CreateObject("Scripting.FileSystemObject")

       Set oFsoFolder = oFso.GetFolder(sPath)

       Set DomDoc = New DOMDocument

       With ThisWorkbook

          With .Worksheets("DataBase")

             Set oLoDataBase = .ListObjects("DataBase")

             If oLoDataBase.DataBodyRange Is Nothing Then oLoDataBase.ListRows.Add AlwaysInsert:=True

          End With

       End With

       On Error GoTo ErroreElaborazioneFile

       For Each oFile In oFsoFolder.Files

          strFile = oFile

          sNomeFile = oFile.Name

          vMatch = Application.Match(sNomeFile, oLoDataBase.ListColumns("Nome File").DataBodyRange, 0)

          If IsError(vMatch) Then

             bCaricaDatiFattura = True

          Else

             bCaricaDatiFattura = False

          End If

          If bCaricaDatiFattura Then

             If LCase(oFso.getExtensionName(oFile)) = "xml" Then

                With DomDoc

                   .async = False

                   .Load strFile

                      With .DocumentElement

                         If .BaseName = "FatturaElettronica" Then

                            If .SelectNodes(sNodoDenominazioneCedente).Length > 0 Then

                               sNominativoFornitore = .SelectNodes(sNodoDenominazioneCedente)(0).Text

                            Else

                               sNominativoFornitore = .SelectNodes(sNodoCognomeCedente)(0).Text & " " & _

                                                      .SelectNodes(sNodoNomeCedente)(0).Text

                            End If

                            sCodiceIva = .SelectNodes(sNodoIdPaese)(0).Text & _

                                         .SelectNodes(sNodoIdCodice)(0).Text

                            'Dati per ciascuna fattura presente nel "lotto di fatture"

                            For Each oChildNodeFatturaElettronicaBody In .SelectNodes("FatturaElettronicaBody")

                               With oChildNodeFatturaElettronicaBody

                                  'Dati Generali

                                  With .getElementsByTagName("DatiGenerali")(0)

                                     With .SelectNodes("DatiGeneraliDocumento")(0)

                                      sTipoDocumento = .SelectNodes("TipoDocumento")(0).Text

                                      sDataFattura = CLng(CDate(Format(.SelectNodes("Data")(0).Text, "dd/mm/yyyy")))

                                      sMeseFattura = Month(sDataFattura)

                                      sNumeroFattura = "'" & .SelectNodes("Numero")(0).Text

                                     End With ' .SelectNodes("DatiGeneraliDocumento")(0)

                                  End With ' .getElementsByTagName("DatiGenerali")(0)

                                  'Dati Beni Servizi con riporto dati comuni della fattura per ciacuna riga di dettaglio

                                  With .getElementsByTagName("DatiBeniServizi")(0)

                                     For i = 1 To .SelectNodes("DettaglioLinee").Length

                                        cont = cont + 1

                                        ReDim Preserve arrDatiFattura(1 To NumeroCampiDati, 1 To cont)

                                        arrDatiFattura(1, cont) = sNomeFile

                                        arrDatiFattura(2, cont) = sNominativoFornitore

                                        arrDatiFattura(3, cont) = sCodiceIva

                                        arrDatiFattura(4, cont) = sTipoDocumento

                                        arrDatiFattura(5, cont) = sDataFattura

                                        arrDatiFattura(6, cont) = sMeseFattura

                                        arrDatiFattura(7, cont) = sNumeroFattura

                                        'dati per ciascuna linea di dettaglio con riporto dati solo dell'eventuale prima istanza del codice articolo

                                        With .SelectNodes("DettaglioLinee")(i - 1)

                                           'Codice Articolo

                                           If .SelectNodes("CodiceArticolo").Length > 0 Then

                                              arrDatiFattura(8, cont) = .SelectNodes("CodiceArticolo")(0).SelectNodes("CodiceTipo")(0).Text

                                              arrDatiFattura(9, cont) = .SelectNodes("CodiceArticolo")(0).SelectNodes("CodiceValore")(0).Text

                                           Else

                                              arrDatiFattura(8, cont) = sDatoNonDisponibile

                                              arrDatiFattura(9, cont) = sDatoNonDisponibile

                                           End If

                                           'Descrizione

                                           arrDatiFattura(10, cont) = .SelectNodes("Descrizione")(0).Text

                                           'Unità di misura, Prezzo Unitario e Quantità

                                           'Se il tipo documento è una nota di credito i valori vengono resi "assoluti" e poi negativi

                                           If sTipoDocumento = "TD04" Then

                                              If .SelectNodes("Quantita").Length > 0 Then

                                                 arrDatiFattura(11, cont) = Abs(CDec(Replace(.SelectNodes("Quantita")(0).Text, ".", ","))) * -1

                                              Else

                                                 arrDatiFattura(11, cont) = -1

                                              End If

                                              arrDatiFattura(13, cont) = Abs(CDec(Replace(.SelectNodes("PrezzoUnitario")(0).Text, ".", ","))) * -1

                                              arrDatiFattura(14, cont) = Abs(CDec(Replace(.SelectNodes("PrezzoTotale")(0).Text, ".", ","))) * -1

                                           Else

                                              If .SelectNodes("Quantita").Length > 0 Then

                                                 arrDatiFattura(11, cont) = CDec(Replace(.SelectNodes("Quantita")(0).Text, ".", ","))

                                              Else

                                                 arrDatiFattura(11, cont) = 1

                                              End If

                                               arrDatiFattura(13, cont) = CDec(Replace(.SelectNodes("PrezzoUnitario")(0).Text, ".", ","))

                                               arrDatiFattura(14, cont) = CDec(Replace(.SelectNodes("PrezzoTotale")(0).Text, ".", ","))

                                           End If

                                           'Unità di misura

                                           If .SelectNodes("UnitaMisura").Length > 0 Then

                                              arrDatiFattura(12, cont) = .SelectNodes("UnitaMisura")(0).Text

                                           Else

                                              arrDatiFattura(12, cont) = sDatoNonDisponibile

                                           End If

                                           'Aliquota IVA

                                           arrDatiFattura(15, cont) = CDec(Replace(.SelectNodes("AliquotaIVA")(0).Text, ".", ",")) / 100

                                        End With

                                     Next i

                                  End With ' .getElementsByTagName("DatiBeniServizi")(0)

                               End With ' oChildNodeFatturaElettronicaBody

                            Next oChildNodeFatturaElettronicaBody

                         End If ' .BaseName = "FatturaElettronica"

                      End With ' .DocumentElement

                End With ' DomDoc

                End If ' LCase(oFso.getExtensionName(oFile)) = "xml"

             End If ' bCaricaDatiFattura

    RiprendiErroreElaborazioneFile:

       Next oFile

       On Error GoTo ErroreInserimentoDati

       With Application

          .Calculation = xlCalculationManual

          .ScreenUpdating = False

          .EnableEvents = False

       End With

       If cont > 0 Then

          'trasposizone dei dati in una nuova matrice

          'procedura per non utilizzare la funzione Transpose che ha portato ad un errore

          'di cui non ho ancora compreso l'origine

          ReDim arrDatiFatturaTrasposti(1 To cont, 1 To NumeroCampiDati)

          For i = 1 To cont

             For j = 1 To NumeroCampiDati

                arrDatiFatturaTrasposti(i, j) = arrDatiFattura(j, i)

             Next j

          Next i

          With oLoDataBase

             With .DataBodyRange

                If .Cells(1).Value = "" Then

                   .Resize(cont, NumeroCampiDati).Value = arrDatiFatturaTrasposti

                Else

                   oLoDataBase.ListRows.Add AlwaysInsert:=True

                   nRighe = .Rows.Count + 1

                   Debug.Print UBound(arrDatiFattura, 1), UBound(arrDatiFattura, 2)

                   Dim arr As Variant

                   .Cells(nRighe, 1).Resize(cont, NumeroCampiDati).Value = arrDatiFatturaTrasposti

                End If

             End With

          End With

       End If

    RiprendiErroreUscitaDefinitiva:

       With Application

          .Calculation = xlCalculationAutomatic

          .ScreenUpdating = True

          .EnableEvents = True

       End With

       Set oFso = Nothing

       Set oFsoFolder = Nothing

       Set DomDoc = Nothing

       Exit Sub

    ErroreFaseIniziale:

       Select Case Err.Number

          Case 76

             MsgBox "Il percorso dei file xml non è stato trovato!" & vbNewLine & _

                    "Verificare le impostazioni del percorso della variabile sPath.", vbExclamation, "Errore Percorso File Xml"

          Case Else

             MsgBox "Si è verificato un errore imprevisto in fase iniziale!" & vbNewLine & _

                    "La procedura verrà interrotta.", vbExclamation, "Errore Fase Iniziale"

       End Select

       Resume RiprendiErroreUscitaDefinitiva

    ErroreElaborazioneFile:

       MsgBox "Si è verificato un errore per il file " & sNomeFile & vbNewLine & _

              "I dati di questo file non verranno importati", vbExclamation, "Errore Elaborazione File"

       Resume RiprendiErroreElaborazioneFile

    ErroreInserimentoDati:

       MsgBox "Si è verificato un errore in fase di inserimento dati nel db!", vbExclamation, "Errore Inserimento Dati"

       Resume RiprendiErroreUscitaDefinitiva

    End Sub

    La risposta è stata utile?

    0 commenti Nessun commento
  2. Anonimo
    2019-12-09T12:21:50+00:00

    Buongiorno e grazie mille per la super risposta, lo apprezzo molto.

    Ho letto con attenzione ed ha individuato al meglio quali sono le mie necessità, legato anche alle problematiche da Lei indicate, tipo note di credito ed altro....

    Stavo facendo qualche prova ma quando lancio la macro mi restituisce questo errore

    cosa sbaglio?

    Grazie

    AD

    La risposta è stata utile?

    0 commenti Nessun commento
  3. Anonimo
    2019-12-08T08:36:34+00:00

    Ciao Andrea,

    premesso che lo schema xml per le fatture elettroniche è uguale per tutte le fatture, e che quindi ogni fornitore dovrà utilizzare sempre gli stessi campi per riportare le informazioni, ma che alcune informazioni, come ad es. quelle relative al "CodiceArticolo" possono essere multiple rispetto a ciascuna riga di dettaglio, così come ogni singola fattura presente nel file xml potrebbe avere decine di righe di dettaglio (Il tag "DettaglioLinee" dello schema delle FE). Che una fattura potrebbe essere una nota di credito che storna un precedente acquisto, che ogni file a sua volta potrebbe contenere più fatture (quello che viene definito "lotto di fatture", quello che chiedi non è una cosa proprio "banale".

    Quello che a te serve, da quanto ho inteso, è un "database" con le righe di dettaglio di ciascuna fattura. Database che dovrà incrementarsi man mano che riceverai le fatture (con aggiornamento secondo periodi a te più congeniali).

    Da qui la necessità, a mio parere, di avere nel database anche il nominativo del file da cui i dati sono stati prelevati (per poter verificare che gli stessi dati non vengano caricati più volte, e per ogni riga di dettaglio, ragionando in termini di "database", avere sempre presenti i dati della fattura a cui appartengono.

    Nel limite delle mie possibilità, e tenuto conto che la procedura lavora solo su file xml che non risultino firmati digitalmente (per intenderci quei file che si ricevono con estensione p7m i quali nel caso dovranno essere "specchettati" estraendo l'xml con gli appositi programmi di lettura dei file con firma digiale, tipo Dike6) ti propongo questo esempio dove riporto, oltre al nome del file, come detto per verificare che non venga caricato due volte le seguenti informazioni:

    • nome fornitore
    • partita iva fornitore
    • data fattura
    • mese di emissione della fattura
    • numero fattura
    • codice articolo acquistato
    • descrizione articolo
    • unità misura
    • quantità
    • costo unitario
    • costo totale
    • aliquota Iva

    Questo il file di esempio: File Esempio

    Questo il codice VBA presente nel Modulo1 del progetto vba:

    Sub CaricaDatiFatture()

       '''--- N.B. è stata caricata la dll msxml6.dll

       '''--- Strumenti->Riferimenti...->Microsoft XML, V6.0

       Dim sPath As String

       Dim oFso As Object

       Dim oFsoFolder As Object

       Dim oFile As Object

       Dim strFile As String

       Dim sNomeFile As String

       Dim vMatch As Variant

       '---

       Dim DomDoc As DOMDocument

       Dim oChildNodeFatturaElettronicaBody As IXMLDOMElement

       '---

       Dim sNominativoFornitore As String

       Dim sCodiceIva As String

       Dim sTipoDocumento As String

       Dim sDataFattura As Long

       Dim sMeseFattura As Long

       Dim sNumeroFattura As String

       Dim bCaricaDatiFattura As Boolean

       Dim cont As Long

       Dim i As Long

       Dim arrDatiFattura() As Variant

       '---

       Dim oLoDataBase As ListObject

       Const NumeroCampiDati As Long = 15

       Const sNodoDatiAnagrafici As String = "FatturaElettronicaHeader/CedentePrestatore/DatiAnagrafici"

       Const sNodoDenominazioneCedente As String = sNodoDatiAnagrafici & "/Anagrafica/Denominazione"

       Const sNodoCognomeCedente As String = sNodoDatiAnagrafici & "/Anagrafica/Cognome"

       Const sNodoNomeCedente As String = sNodoDatiAnagrafici & "/Anagrafica/Nome"

       Const sNodoIdPaese As String = sNodoDatiAnagrafici & "/IdFiscaleIVA/IdPaese"

       Const sNodoIdCodice As String = sNodoDatiAnagrafici & "/IdFiscaleIVA/IdCodice"

       Const sDatoNonDisponibile As String = "N.D."

       '''--- procedura per selezionare la cartella in cui sono presenti i file delle fatture elettroniche da caricare nel db

       'With Application.FileDialog(msoFileDialogFolderPicker)

       '   .Title = "Seleziona il percorso contenente i file xml delle fatture di acquisto da cui importare i dati"

       '   If .Show = -1 Then

       '      sPath = .SelectedItems(1)

       '   Else

       '      Exit Sub

       '   End If

       'End With

       '''---in alternativa alla procedura di cui sopra indicazione del percorso "predeterminato" in cui sono presenti i file delle fatture elettroniche da caricare nel db

       sPath = "C:\Test\xml"

       Set oFso = CreateObject("Scripting.FileSystemObject")

       Set oFsoFolder = oFso.GetFolder(sPath)

       Set DomDoc = New DOMDocument

       With ThisWorkbook

          With .Worksheets("DataBase")

             Set oLoDataBase = .ListObjects("DataBase")

             If oLoDataBase.DataBodyRange Is Nothing Then oLoDataBase.ListRows.Add AlwaysInsert:=True

          End With

       End With

       For Each oFile In oFsoFolder.Files

          strFile = oFile

          sNomeFile = oFile.Name

          vMatch = Application.Match(sNomeFile, oLoDataBase.ListColumns("Nome File").DataBodyRange, 0)

          If IsError(vMatch) Then

             bCaricaDatiFattura = True

          Else

             bCaricaDatiFattura = False

          End If

          If bCaricaDatiFattura Then

             If LCase(oFso.getExtensionName(oFile)) = "xml" Then

                On Error GoTo ErroreElaborazioneFile

                With DomDoc

                   .async = False

                   .Load strFile

                      With .DocumentElement

                         If .BaseName = "FatturaElettronica" Then

                            If .SelectNodes(sNodoDenominazioneCedente).Length > 0 Then

                               sNominativoFornitore = .SelectNodes(sNodoDenominazioneCedente)(0).Text

                            Else

                               sNominativoFornitore = .SelectNodes(sNodoCognomeCedente)(0).Text & " " & _

                                                      .SelectNodes(sNodoNomeCedente)(0).Text

                            End If

                            sCodiceIva = .SelectNodes(sNodoIdPaese)(0).Text & _

                                         .SelectNodes(sNodoIdCodice)(0).Text

                            'Dati per ciascuna fattura presente nel "lotto di fatture"

                            For Each oChildNodeFatturaElettronicaBody In .SelectNodes("FatturaElettronicaBody")

                               With oChildNodeFatturaElettronicaBody

                                  'Dati Generali

                                  With .getElementsByTagName("DatiGenerali")(0)

                                     With .SelectNodes("DatiGeneraliDocumento")(0)

                                      sTipoDocumento = .SelectNodes("TipoDocumento")(0).Text

                                      sDataFattura = CLng(CDate(Format(.SelectNodes("Data")(0).Text, "dd/mm/yyyy")))

                                      sMeseFattura = Month(sDataFattura)

                                      sNumeroFattura = "'" & .SelectNodes("Numero")(0).Text

                                     End With ' .SelectNodes("DatiGeneraliDocumento")(0)

                                  End With ' .getElementsByTagName("DatiGenerali")(0)

                                  'Dati Beni Servizi con riporto dati comuni della fattura per ciacuna riga di dettaglio

                                  With .getElementsByTagName("DatiBeniServizi")(0)

                                     For i = 1 To .SelectNodes("DettaglioLinee").Length

                                        cont = cont + 1

                                        ReDim Preserve arrDatiFattura(1 To NumeroCampiDati, 1 To cont)

                                        arrDatiFattura(1, cont) = sNomeFile

                                        arrDatiFattura(2, cont) = sNominativoFornitore

                                        arrDatiFattura(3, cont) = sCodiceIva

                                        arrDatiFattura(4, cont) = sTipoDocumento

                                        arrDatiFattura(5, cont) = sDataFattura

                                        arrDatiFattura(6, cont) = sMeseFattura

                                        arrDatiFattura(7, cont) = sNumeroFattura

                                        'dati per ciascuna linea di dettaglio con riporto dati solo dell'eventuale prima istanza del codice articolo

                                        With .SelectNodes("DettaglioLinee")(i - 1)

                                           'Codice Articolo

                                           If .SelectNodes("CodiceArticolo").Length > 0 Then

                                              arrDatiFattura(8, cont) = .SelectNodes("CodiceArticolo")(0).SelectNodes("CodiceTipo")(0).Text

                                              arrDatiFattura(9, cont) = .SelectNodes("CodiceArticolo")(0).SelectNodes("CodiceValore")(0).Text

                                           Else

                                              arrDatiFattura(8, cont) = sDatoNonDisponibile

                                              arrDatiFattura(9, cont) = sDatoNonDisponibile

                                           End If

                                           'Descrizione

                                           arrDatiFattura(10, cont) = .SelectNodes("Descrizione")(0).Text

                                           'Unità di misura, Prezzo Unitario e Quantità

                                           'Se il tipo documento è una nota di credito i valori vengono resi "assoluti" e poi negativi

                                           If sTipoDocumento = "TD04" Then

                                              If .SelectNodes("Quantita").Length > 0 Then

                                                 arrDatiFattura(11, cont) = Abs(CDec(Replace(.SelectNodes("Quantita")(0).Text, ".", ","))) * -1

                                              Else

                                                 arrDatiFattura(11, cont) = -1

                                              End If

                                              arrDatiFattura(13, cont) = Abs(CDec(Replace(.SelectNodes("PrezzoUnitario")(0).Text, ".", ","))) * -1

                                              arrDatiFattura(14, cont) = Abs(CDec(Replace(.SelectNodes("PrezzoTotale")(0).Text, ".", ","))) * -1

                                           Else

                                              If .SelectNodes("Quantita").Length > 0 Then

                                                 arrDatiFattura(11, cont) = CDec(Replace(.SelectNodes("Quantita")(0).Text, ".", ","))

                                              Else

                                                 arrDatiFattura(11, cont) = 1

                                              End If

                                               arrDatiFattura(13, cont) = CDec(Replace(.SelectNodes("PrezzoUnitario")(0).Text, ".", ","))

                                               arrDatiFattura(14, cont) = CDec(Replace(.SelectNodes("PrezzoTotale")(0).Text, ".", ","))

                                           End If

                                           'Unità di misura

                                           If .SelectNodes("UnitaMisura").Length > 0 Then

                                              arrDatiFattura(12, cont) = .SelectNodes("UnitaMisura")(0).Text

                                           Else

                                              arrDatiFattura(12, cont) = sDatoNonDisponibile

                                           End If

                                           'Aliquota IVA

                                           arrDatiFattura(15, cont) = CDec(Replace(.SelectNodes("AliquotaIVA")(0).Text, ".", ",")) / 100

                                        End With

                                     Next i

                                  End With ' .getElementsByTagName("DatiBeniServizi")(0)

                               End With ' oChildNodeFatturaElettronicaBody

                            Next oChildNodeFatturaElettronicaBody

                         End If ' .BaseName = "FatturaElettronica"

                      End With ' .DocumentElement

                End With ' DomDoc

                End If ' LCase(oFso.getExtensionName(oFile)) = "xml"

             End If ' bCaricaDatiFattura

    RiprendiErrore:

       Next oFile

       Dim nRighe As Long

       With Application

          .Calculation = xlCalculationManual

          .ScreenUpdating = False

          .EnableEvents = False

       End With

       If cont > 0 Then

          With oLoDataBase

             With .DataBodyRange

                If .Cells(1).Value = "" Then

                   .Resize(cont, NumeroCampiDati).Value = Application.Transpose(arrDatiFattura)

                Else

                   oLoDataBase.ListRows.Add AlwaysInsert:=True

                   nRighe = .Rows.Count + 1

                   .Cells(nRighe, 1).Resize(cont, NumeroCampiDati).Value = Application.Transpose(arrDatiFattura)

                End If

             End With

          End With

       End If

       With Application

          .Calculation = xlCalculationAutomatic

          .ScreenUpdating = True

          .EnableEvents = True

       End With

       Set oFso = Nothing

       Set oFsoFolder = Nothing

       Set DomDoc = Nothing

       Exit Sub

    ErroreElaborazioneFile:

       MsgBox "Si è verificato un errore per il file " & sNomeFile & vbNewLine & _

              "I dati di questo file non verranno importati", vbExclamation, "Errore Elaborazione File"

       Resume RiprendiErrore

    End Sub

    Il file Excel, nel foglio nominato "DataBase" presenta una "Tabella", anch'essa nominata "DataBase" dove, in modo "incrementale" vengono caricati i dati presenti nei file xml (è presente una modifica che vengano elaborati tutti i file presenti in un percorso la cui estensione sia "xml") che siano delle fatture elettroniche (vengono elaborati i soli file xml la cui "BaseName" corrisponda a "FatturaElettronica".

    Nota che la procedura si basa sullo schema delle fatture ordinarie (e non anche quelle semplificate che non ho testato).

    Se il file elaborato non è già presente nel database (campo Nome File) i dati vengono caricati.

    Se nella tabella sono presenti dati precedenti i dati delle nuove fatture vengono accodati a quelli precedenti.

    In questo modo si crea un database di dati periodicamente incrementabile.

    Vedi se ti può essere di spunto per ulteriori implementazioni a partire da questo database.

    La risposta è stata utile?

    0 commenti Nessun commento