Lettura file xml con vba access

di il
34 risposte

Lettura file xml con vba access

Ciao Ragazzi
quale è il miglior modo per leggere il file xml della fattura elettronica con vba access?
grazie a tutti

34 Risposte

  • Re: Lettura file xml con vba access

    Cosa intendi per "leggere"?
  • Re: Lettura file xml con vba access

    riddik ha scritto:


    Ciao Ragazzi
    quale è il miglior modo per leggere il file xml della fattura elettronica con vba access?
    grazie a tutti
    Migliore è in relazione alle esigenze...
    Si può fare un Parserino VBA aprendolo con Open ...., come anche usare le Librerie dedicate DOM per accedere in modo più strutturato alla gerarchia del documento.

    Sono entrambi validi, ma entrambi hanno necessità di essere conosciuti...
  • Re: Lettura file xml con vba access

    Scusate il ritardo.
    Fin ora inserivo le fatture nel mio database access a mano.
    Adesso vorrei leggere il file xml e popolare la tabella fatture con le informazioni lette
    Grazie
  • Re: Lettura file xml con vba access

    A prescindere dallo scopo che era abbastanza ovvio visto il periodo di fattura elettronica... la risposta che ti ho dato cosa ti ha suggerito di fare..?
    Inizia a documentari su quei 2 metodi...
  • Re: Lettura file xml con vba access

    riddik ha scritto:


    Scusate il ritardo.
    Fin ora inserivo le fatture nel mio database access a mano.
    Adesso vorrei leggere il file xml e popolare la tabella fatture con le informazioni lette
    Grazie
    Sei in grado di leggere un database mysql?
    Nel qual caso posso darti il 90% già bello che pronto (il resto quando mi viene voglia).

    La possibilità che mi metta io a scrivere un mdb è modestissima, non dovrebbe essere difficile, ma ho altre priorità.
  • Re: Lettura file xml con vba access

    Vi spiego cosa sono riuscito a fare finora:
    in una maschera pannello, mi sono creato una casella di riepilogo che si popola con l'evento load della maschera principale, elencando tutti gli xml presenti in una data cartella.
    sul doppio click nella casella mi leggo il file xml :
    con la partita iva del cessionario identifico di quale mia azienda è la fattura (ho tre aziende nel gruppo)
    con la partita iva del cedente identifico il fornitore (se non esiste, lo creo)
    leggo i DatiGeneraliDocumento per popolare la tabella fatture
    il problema è che se un nodo non esiste mi da erroe e si blocca l'esecuzione
    come posso fare a capire se il nodo esiste prima di leggerlo e farlo bloccare?
    posto il codice fin qui scritto:

    Private Sub ElencoXML_DblClick(Cancel As Integer)
    Dim xmlDoc As DOMDocument
    Dim xmlElement As IXMLDOMElement
    Dim RsFatt As New ADODB.Recordset


    Set xmlDoc = New MSXML2.DOMDocument
    xmlDoc.async = False
    xmlDoc.validateOnParse = False
    nomefile = folderdoc & Me.elencoxml
    Verifica = xmlDoc.Load(nomefile)
    If Not Verifica Then
    MsgBox "NON E' POSSIBILE LEGGERE IL FILE XML"
    Exit Sub
    End If
    Set xmlElement = xmlDoc.documentElement

    piva = xmlElement.selectSingleNode("FatturaElettronicaHeader/CessionarioCommittente/DatiAnagrafici/IdFiscaleIVA/IdCodice").Text
    azienda = DLookup("[idazienda]", "aziende", "[piva] = '" & piva & "'") 'controllo se esiste L'AZIENDA
    If IsNull(azienda) Then
    MsgBox "ATTENZIONE LA FATTURA NON E' DELLE AZIENDE GESTITE", vbCritical
    Exit Sub
    End If
    fornit = xmlElement.selectSingleNode("FatturaElettronicaHeader/CedentePrestatore/DatiAnagrafici/IdFiscaleIVA/IdCodice").Text
    trovato = DLookup("[idcodice]", "fornitori", "[idcodice] = '" & fornit & "'") 'controllo se esiste il fornitore

    If IsNull(trovato) Then 'se non esiste il fornitore lo inserisco
    denominazione = xmlElement.selectSingleNode("FatturaElettronicaHeader/CedentePrestatore/DatiAnagrafici/Anagrafica/Denominazione").Text
    indirizzo = xmlElement.selectSingleNode("FatturaElettronicaHeader/CedentePrestatore/Sede/Indirizzo").Text
    cap = xmlElement.selectSingleNode("FatturaElettronicaHeader/CedentePrestatore/Sede/CAP").Text
    comune = xmlElement.selectSingleNode("FatturaElettronicaHeader/CedentePrestatore/Sede/Comune").Text
    provincia = xmlElement.selectSingleNode("FatturaElettronicaHeader/CedentePrestatore/Sede/Provincia").Text
    nazione = xmlElement.selectSingleNode("FatturaElettronicaHeader/CedentePrestatore/Sede/Nazione").Text

    sqltxt = "insert into fornitori (idcodice,denominazione,indirizzo,cap,comune,provincia,nazione) values (""" & fornit & """,'" & denominazione & "','" & indirizzo & "','" & cap & "','" & comune & "','" & provincia & "','" & nazione & "')"
    DoCmd.RunSQL sqltxt
    End If

    RsFatt.ActiveConnection = CurrentProject.Connection
    RsFatt.CursorType = adOpenForwardOnly
    RsFatt.CursorLocation = adUseServer
    RsFatt.LockType = adLockOptimistic
    RsFatt.Open "fatture", , , , adCmdTableDirect
    'On Error Resume Next
    RsFatt.AddNew
    RsFatt("azienda") = azienda
    RsFatt("fornitore") = fornit
    RsFatt("datareg") = Date
    RsFatt("tipodoc") = xmlElement.selectSingleNode("FatturaElettronicaBody/DatiGenerali/DatiGeneraliDocumento/TipoDocumento").Text
    RsFatt("datadoc") = Format(xmlElement.selectSingleNode("FatturaElettronicaBody/DatiGenerali/DatiGeneraliDocumento/Data").Text, "dd/mm/yyyy")
    RsFatt("numdoc") = xmlElement.selectSingleNode("FatturaElettronicaBody/DatiGenerali/DatiGeneraliDocumento/Numero").Text
    'RsFatt("importo") = (Replace(xmlElement.selectSingleNode("FatturaElettronicaBody/DatiPagamento/DettaglioPagamento/ImportoPagamento").Text, ".", ",")) * DLookup("[segno]", "tipidoc", "[codicetipodoc] = '" & RsFatt("tipodoc") & "'")
    RsFatt("importo") = xmlElement.selectSingleNode("FatturaElettronicaBody/DatiGenerali/DatiGeneraliDocumento/ImportoTotaleDocumento").Text

    RsFatt.Update
    Set xmlDoc = Nothing
    Set xmlElement = Nothing
    End Sub
  • Re: Lettura file xml con vba access

    Sei molto, ma molto, lontano.
    riparsare l'intero XML non è una passeggiata, neppure per me (soprattutto per gli sconti, ma ho avuto un aiuto insperato, prima o poi ci guardo).

    devi essenzialmente prendere tutti i vari campi obbligatori, poi gli opzionali, poi le righe, poi il castelletto iva, poi gli altridati eccetera.

    Scordati di prendere 4 campi in croce "fissi" e magicamente di poterla importare, diciamo un due settimane/due mesi di lavoro (adesso è molto più facile, ci sono le fatture che circolano)
    ---
    lato access non ho la minima idea, io parso a mano le stringhe, non uso componenti per elaborazioni xml
  • Re: Lettura file xml con vba access

    +m2+ ha scritto:


    riddik ha scritto:


    Scusate il ritardo.
    Fin ora inserivo le fatture nel mio database access a mano.
    Adesso vorrei leggere il file xml e popolare la tabella fatture con le informazioni lette
    Grazie
    Sei in grado di leggere un database mysql?
    Nel qual caso posso darti il 90% già bello che pronto (il resto quando mi viene voglia).

    La possibilità che mi metta io a scrivere un mdb è modestissima, non dovrebbe essere difficile, ma ho altre priorità.
    posso provarci
  • Re: Lettura file xml con vba access

    +m2+ ha scritto:


    Sei molto, ma molto, lontano.
    riparsare l'intero XML non è una passeggiata, neppure per me (soprattutto per gli sconti, ma ho avuto un aiuto insperato, prima o poi ci guardo).

    devi essenzialmente prendere tutti i vari campi obbligatori, poi gli opzionali, poi le righe, poi il castelletto iva, poi gli altridati eccetera.

    Scordati di prendere 4 campi in croce "fissi" e magicamente di poterla importare, diciamo un due settimane/due mesi di lavoro (adesso è molto più facile, ci sono le fatture che circolano)
    ---
    lato access non ho la minima idea, io parso a mano le stringhe, non uso componenti per elaborazioni xml
    a me non serve il body
    mi servono solo i dati generali e l'allegato (se esiste) il pdf
  • Re: Lettura file xml con vba access

    riddik ha scritto:



    a me non serve il body
    mi servono solo i dati generali e l'allegato (se esiste) il pdf
    allora è già più facile.
    per i dati generali sono "zzi tuoi" (non so aiutarti, non uso access, di sicuro qualcuno potrà darti informazioni più precise).

    per l'allegato - volendo - ho programmello che lo estrae (da riga di comando).
    qualcosa tipo
    xml2pdf.exe 10 c:\ilmiobelxml.p7m k:\cartellaoutput
  • Re: Lettura file xml con vba access

    +m2+ ha scritto:


    riddik ha scritto:



    a me non serve il body
    mi servono solo i dati generali e l'allegato (se esiste) il pdf
    allora è già più facile.
    per i dati generali sono "zzi tuoi" (non so aiutarti, non uso access, di sicuro qualcuno potrà darti informazioni più precise).

    per l'allegato - volendo - ho programmello che lo estrae (da riga di comando).
    qualcosa tipo
    xml2pdf.exe 10 c:\ilmiobelxml.p7m k:\cartellaoutput
    Mi dai il link per scaricarlo per piacere?
  • Re: Lettura file xml con vba access

    riddik ha scritto:


    Mi dai il link per scaricarlo per piacere?
    Lo trovi qui:

    https://www.iprogrammatori.it/forum-programmazione/fatturazione-elettronica/fatturazione-elettronica-b2b-programmeli-xml2pdf-t37541.html

    Seguo la discussione con interesse.
    Sto cercando di importare automaticamente le fatture dei fornitori nelle mie tabelle di access, dovrò "parsare" campo dopo campo tutto quanto (le mie conoscenze ed il mio tempo a disposizione non mi permettono di andare oltre per adesso).

    Per adesso, utilizzando il programmino di +m2+ ho creato una routine con una shell che mi converte i p7m in xml.

    Poi sto "rubando" un po' dal tuo codice per l'estrazione dall'xml.

    Anche io devo affrontare il problema dell'errore causato dall'assenza di un nodo, se trovo qualcosa lo scrivo qui.
  • Re: Lettura file xml con vba access

    Quindi avrebbe un utilizzo, un parsatore che scrivessse un file mdb?
  • Re: Lettura file xml con vba access

    weldox ha scritto:


    riddik ha scritto:


    Mi dai il link per scaricarlo per piacere?
    anche io devo affrontare il problema dell'errore causato dall'assenza di un nodo, se trovo qualcosa lo scrivo qui.
    Ciao io importo in questo modo e se i nodi non esistono non mi da nessun errore funziona tutto correttamente ... almeno per le mie esigenze... sono in fase di test

    '==============================================================================================================================
    'APRO LA TABELLA PER RECUPERARE IL NOME FILE XML DA ELABORARE PER POTER AGGIORNARE I CAMPI CON I VALORI RECUPERATI DALL'XML STESSO
    '==============================================================================================================================
    Dim NomeFile, PercorsoCompleto As String

    Dim RS1 As ADODB.Recordset ' Tabella (ELENCO_FILE)popolato precedentemente con tutti i nomi dei file xml e il rispettivo percorso
    Set RS1 = New ADODB.Recordset

    RS1.Open "ELENCO_FILE_NUOVI_DA_AGGIUNGERE", CurrentProject.Connection, adOpenKeyset, adLockOptimistic

    Do Until RS1.EOF

    NomeFile = (RS1!NOME_FILE) 'Prelevo dalla tabella il nome del file da elaborare
    PercorsoCompleto = (RS1!PERCORSO) 'Prelevo dalla tabella il percorso del file da elaborare
    PercorsoCompleto = PercorsoCompleto & NomeFile 'Compongo il percorso completo

    '==========================================================================================
    'INIZIO LETTURA FILE XML
    '==========================================================================================
    Dim Obj As DOMDocument
    Dim Verifica As Boolean
    Dim Nodo, Nodo2, Nodo3, Nodo4, Nodo5, Nodo6, Nodo7, Nodo8 As IXMLDOMNodeList
    Dim Nome As IXMLDOMNode
    Dim Testo1, Testo2, Testo3, Testo4, Testo5, Testo6, Testo7, Testo8 As String

    Testo1 = ""
    Testo2 = ""
    Testo3 = ""
    Testo4 = ""
    Testo5 = ""
    Testo6 = ""
    Testo7 = ""
    Testo8 = ""

    '==========================================================================================
    'ACCESSO AL FILE XML
    '==========================================================================================
    Set Obj = New DOMDocument
    Obj.async = False
    Obj.Load (PercorsoCompleto)
    '==========================================================================================
    'NODO RAGIONE SOCIALE
    '==========================================================================================
    'seleziono il nodo da leggere
    Set Nodo = Obj.DocumentElement.SelectNodes("//CedentePrestatore//Denominazione")
    'leggo tutti i dati del nodo
    For Each Nome In Nodo
    'estraggo il valore del nodo
    Testo1 = Testo1 & " " & Nome.Text
    Next
    '==========================================================================================
    'NODO NUMERO FATTURA
    '==========================================================================================
    Set Nodo2 = Obj.DocumentElement.SelectNodes("//DatiGenerali//Numero")
    'leggo tutti i dati del nodo
    For Each Nome In Nodo2
    'estraggo il valore del nodo
    Testo2 = Testo2 & " " & Nome.Text
    Next
    '==========================================================================================
    'NODO DATA FATTURA
    '==========================================================================================
    Set Nodo3 = Obj.DocumentElement.SelectNodes("//DatiGenerali//Data")
    'leggo tutti i dati del nodo
    For Each Nome In Nodo3
    'estraggo il valore del nodo
    Testo3 = Testo3 & " " & Nome.Text
    Next
    '==========================================================================================
    'NODO DATA CODICE DESTINATARIO
    '==========================================================================================
    Set Nodo4 = Obj.DocumentElement.SelectNodes("//DatiTrasmissione//CodiceDestinatario")
    'leggo tutti i dati del nodo
    For Each Nome In Nodo4
    'estraggo il valore del nodo
    Testo4 = Testo4 & " " & Nome.Text
    Next
    '==========================================================================================
    'NODO DATA MAIL PEC
    '==========================================================================================
    Set Nodo5 = Obj.DocumentElement.SelectNodes("//DatiTrasmissione//PECDestinatario")
    'leggo tutti i dati del nodo
    For Each Nome In Nodo5
    'estraggo il valore del nodo
    Testo5 = Testo5 & " " & Nome.Text
    Next
    '==========================================================================================
    'NODO PAGAMENTO
    '==========================================================================================
    Set Nodo6 = Obj.DocumentElement.SelectNodes("//DatiPagamento//ModalitaPagamento")
    'leggo tutti i dati del nodo
    For Each Nome In Nodo6
    'estraggo il valore del nodo
    Testo6 = Testo6 & " " & Nome.Text
    Next
    '==========================================================================================
    'NODO ESTENSIONE ALLEGATO
    '==========================================================================================
    Set Nodo7 = Obj.DocumentElement.SelectNodes("//Allegati//FormatoAttachment")
    'leggo tutti i dati del nodo
    For Each Nome In Nodo7
    'estraggo il valore del nodo
    Testo7 = Testo7 & " " & Nome.Text
    Next
    '==========================================================================================
    'NODO NOME ALLEGATO
    '==========================================================================================
    Set Nodo8 = Obj.DocumentElement.SelectNodes("//Allegati//NomeAttachment")
    'leggo tutti i dati del nodo
    For Each Nome In Nodo8
    'estraggo il valore del nodo
    Testo8 = Testo8 & " " & Nome.Text
    Next
    '==========================================================================================
    'CHIUDO IL FILE
    '==========================================================================================
    Set Obj = Nothing

    '==========================================================================================
    'AGGIORNO I CAMPI CON I DATI RECUPERATI
    '==========================================================================================
    With RS1
    .Fields("RAG_SOC") = Trim(Testo1)
    .Fields("NUMERO") = Trim(Testo2)
    .Fields("DATA") = Left(Trim(Testo3), 10)
    .Fields("CODICE_DESTINATARIO") = Trim(Testo4)
    .Fields("MAIL_PEC") = Trim(Testo5)
    .Fields("PAGAMENTO") = Left(Trim(Testo6), 4)
    .Fields("ESTENSIONE_ALLEGATO") = Trim(Testo7)
    .Fields("NOME_ALLEGATO") = Trim(Testo8)
    .Update
    End With
    '==========================================================================================
    'LOOP TABELLA PER AGGIORNAMENTO CAMPI
    RS1.MoveNext
    Loop
    '==========================================================================================

    MsgBox "CAMPI AGGIORNATI"

    Non sono un esperto ma a me funziona (ho provato solo con i nodi che vedete)...p.s. io prima ho creato una tabella dove vado ad elaborare solo i file aggiunti e non tutti ogni volta
Devi accedere o registrarti per scrivere nel forum
34 risposte