importare in Access dati estratti da file xml

Anonimo
2019-09-16T16:38:30+00:00

Salve,

ho la necessità di estrarre da files Xml alcuni dati da importare in Tab di Access.

ad onor del vero ho già estratto i dati che mi servono con un codice che pubblicherò, dopo aver spiegato il mio problema:

-estraggo dai files 12 campi di cui i primi 8 riguardano una Tab (che chiamiamo Tab "A") che contiena una PK (idfile)

-i 4 campi (dal N° 9 al 12 Tab "B") devono essere messi in relazione 1 a M con la tab principale) esempio:

Tab "A"

IdFile (PK)

campo 1_2_3_4_5_6_7_8

Tab "B"

IdB (PK)

Idfile (FK)

Campo 9...12

Fino a popolare la tab "A" nessun problema il problema nasce per polare la tab "B" e metterla in relazione con la "A"

Ecco il codice :

[Code]Dim NomeFile, PercorsoCompleto As String

 Dim strSQL As String

 Dim rs1 As DAO.Recordset

 Dim rs2 As DAO.Recordset

  'seleziona la riga unica

    strSQL = "SELECT IdFile, NomeFile, path, RagioneSociale, NumeroFatt, Data, CodiceDestinatario, MailPec, Pagamento, EstAllegato, NomeAllegato "

    strSQL = strSQL & "FROM TbFileFattForn"

    Set rs1 = CurrentDb.OpenRecordset(strSQL)

    Do Until rs1.EOF

   'seleziona la rige di riepilogo

    strSQL = "SELECT IdFile, AliquotaIva , ImponibileImporto , Imposta , EsigibilitaIVA "

    strSQL = strSQL & "FROM TbRigheRiepilogoFile WHERE idFile =" & Forms![mkFileFattForn]!IdFile

    Set rs2 = CurrentDb.OpenRecordset(strSQL)

    'rs2.MoveFirst

    Do Until rs2.EOF

NomeFile = (rs1!NomeFile) 'Prelevo dalla tabella il nome del file da elaborare

PercorsoCompleto = (rs1!Path) '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, Nodo9, Nodo10, Nodo11, Nodo12 As IXMLDOMNodeList

Dim Nome As IXMLDOMNode

Dim Testo1, Testo2, Testo3, Testo4, Testo5, Testo6, Testo7, Testo8, Testo9, Testo10, Testo11, Testo12 As String

Testo1 = ""

Testo2 = ""

Testo3 = ""

Testo4 = ""

Testo5 = ""

Testo6 = ""

Testo7 = ""

Testo8 = ""

Testo9 = ""

Testo10 = ""

Testo11 = ""

Testo12 = ""

'==========================================================================================

'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

'=========================================================================================

'Nodo DatiRiepilogo/AliquotaIva

'==========================================================================================

Set Nodo9 = obj.DocumentElement.SelectNodes("//DatiRiepilogo//AliquotaIva")

'leggo tutti i dati del nodo

For Each Nome In Nodo9

'estraggo il valore del nodo

Testo9 = Testo9 & " " & Nome.Text

Next

'=========================================================================================

'Nodo DatiRiepilogo/ImponibileImporto

'==========================================================================================

Set Nodo10 = obj.DocumentElement.SelectNodes("//DatiRiepilogo//ImponibileImporto")

'leggo tutti i dati del nodo

For Each Nome In Nodo10

'estraggo il valore del nodo

Testo10 = Testo10 & " " & Nome.Text

Next

'=========================================================================================

'Nodo DatiRiepilogo/Imposta

'==========================================================================================

Set Nodo11 = obj.DocumentElement.SelectNodes("//DatiRiepilogo//Imposta")

'leggo tutti i dati del nodo

For Each Nome In Nodo11

'estraggo il valore del nodo

Testo11 = Testo11 & " " & Nome.Text

Next

'=========================================================================================

'Nodo DatiRiepilogo/EsigibilitaIVA

'==========================================================================================

Set Nodo12 = obj.DocumentElement.SelectNodes("//DatiRiepilogo//EsigibilitaIVA")

'leggo tutti i dati del nodo

For Each Nome In Nodo12

'estraggo il valore del nodo

Testo12 = Testo12 & " " & Nome.Text

Next

'CHIUDO IL FILE

'==========================================================================================

Set obj = Nothing

'==========================================================================================

'AGGIORNO I CAMPI CON I DATI RECUPERATI

'==========================================================================================

rs1.Edit

With rs1

  .Fields("RagioneSociale") = Trim(Testo1)

  .Fields("NumeroFatt") = Trim(Testo2)

  .Fields("Data") = Left(Trim(Testo3), 10)

  .Fields("CodiceDestinatario") = Trim(Testo4)

  .Fields("MailPec") = Trim(Testo5)

  .Fields("Pagamento") = Left(Trim(Testo6), 4)

  .Fields("EstAllegato") = Trim(Testo7)

  .Fields("NomeAllegato") = Trim(Testo8)

  .Update

End With[/Code]

Grazie a chi vorrà darmi una dritta

Microsoft 365 e Office | Access | 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

3 risposte

Ordina per: Più utili
  1. Anonimo
    2019-09-17T10:57:34+00:00

    Salve Sandro,

    In allegato ti invio il Link con i file richiesti sono due nel PDF sono evidenziati i campi che mi interessa estrarre e l'originale (i dati sono evidentemente di fantasia)

    File xml e pdf

    La risposta è stata utile?

    0 commenti Nessun commento
  2. Anonimo
    2019-09-16T22:37:35+00:00

    Salve Sandro,

    intanto ti volevo ringraziare per la risposta e per la celerità.

    Premetto che il  codice che vedi l'ho copiato da un tred che non ricordo bene da chi perchè allora l' ho preso e conservato con l'intendo di usarlo in un secondo tempo.

    l'unica cosa che ho modificato sono i recordset utilizzando DAO al posto di ADO usato nell'originale. 

    SANDRO:

    ...mmmm.... le dichiarazioni delle variabili è tecnicamente errato,

    Dim Nodo, Nodo2, Nodo3, Nodo4, Nodo5, Nodo6, Nodo7, Nodo8, Nodo9, Nodo10, Nodo11, Nodo12 As IXMLDOMNodeList

    Dim Testo1, Testo2, Testo3, Testo4, Testo5, Testo6, Testo7, Testo8, Testo9, Testo10, Testo11, Testo12 As String

    solo nodo12 e testo12 sono correttamente dichiarate rispettivamente IXMLDOMNodeList e string tutto il resto è variant.

    Gianni: di questo sono consapevole, il fatto è che volevo usare così come è stato scritto per provarlo

    **Sandro:**Per il resto, corretto l'uso di Dom per parsare il file xlm, ma la modalità che mostri è ridondante...

    Gianni: anche di questo sono consapevole vedrò di renderlo meno rindondante

    Sandro: Valuta il metodo hasChildNodes per il lato molti, te lo dico perchè ho realizzato qualcosa      del genere con tre tabelle da relazionare e non c'è bisogno per ogni nodo di un ciclo          for...next...ma di una ricorsiva.

    Gianni: vedrò di studiare anche questo e faccio sapere

    perché valorizzi tutte le variabili come segue : 

    Testo1 = ""

    Testo2 = ""

    Testo3 = ""

    Testo4 = ""

    Testo5 = ""

    Testo6 = ""

    Testo7 = ""

    Testo8 = ""

    Testo9 = ""

    Testo10 = ""

    Testo11 = ""

    Testo12 = ""

    Credo che serva a resettare/inizializzare i testi 

    inoltre sarebbe bene attribuire loro un significato decisamente più esplicativo...sempre che servano…!

    Bene adesso ti chiederai perchè hai rimandato tutto questo?

    Semplicemente perchè, testato così com'era, funziona tolta la questione della seconda Tab da relazionare

    **Sandro :**Se quanto suggerito non basta, cosa molto probabile pubblica una demo senza dati sensibili del file da XML da parsare indicando i nodi aggiunge qualche dettaglio ulteriore dei dati che devi scrivere nelle tabelle di Access che vedo/vediamo di aiutarti in modo più concreto.

    **Gianni :**Ti ringrazio fin d'ora della disponibilità, i file sono delle fatture elettroniche delle quali mi serve estrapolare solo quei 12 campi, i primi  8 campi sono dei dati anagrafici e relativi alla fattura 

    gli altri 4 campi non sono altro che i totali della fattura, comunque vedrò di realizzare un file anonimo

    che ti farò avere.

    **Sandro :**Ultima cosa….se i files XML sono più di uno e generalmente è cosi devi comunque impostare un ciclo che li legga tutti, non mi pare ci sia….

    Gianni: questo l'ho già realizzato popolando la Tab "A", leggendo il file system, ti ripeto che funziona

    tutto quello che mi serve, tolta quella Tab "B"

    Vado a studiare, quello che mi hai suggerito e ti faccio sapere.

    Ciao, Giovanni.

    La risposta è stata utile?

    0 commenti Nessun commento
  3. Anonimo
    2019-09-16T18:24:22+00:00

    ciao Gianni55,

    ...mmmm.... le dichiarazioni delle variabili è tecnicamente errato,

    Dim Nodo, Nodo2, Nodo3, Nodo4, Nodo5, Nodo6, Nodo7, Nodo8, Nodo9, Nodo10, Nodo11, Nodo12 As IXMLDOMNodeList

    Dim Testo1, Testo2, Testo3, Testo4, Testo5, Testo6, Testo7, Testo8, Testo9, Testo10, Testo11, Testo12 As String

    solo nodo12 e testo12 sono correttamente dichiarate rispettivamente IXMLDOMNodeList e string tutto il resto è variant.

    Per il resto, corretto l'uso di Dom per parsare il file xlm, ma la modalità che mostri è ridondante...

    Valuta il metodo hasChildNodes per il lato molti, te lo dico perchè ho realizzato qualcosa del genere con tre tabelle da relazionare e non c'è bisogno per ogni nodo di un ciclo for...next...ma di una ricorsiva.perché valorizzi tutte le variabili come segue : 

    Testo1 = ""

    Testo2 = ""

    Testo3 = ""

    Testo4 = ""

    Testo5 = ""

    Testo6 = ""

    Testo7 = ""

    Testo8 = ""

    Testo9 = ""

    Testo10 = ""

    Testo11 = ""

    Testo12 = ""

    inoltre sarebbe bene attribuire loro un significato decisamente più esplicativo...sempre che servano…!

    Se quanto suggerito non basta, cosa molto probabile pubblica una demo senza dati sensibili del file da XML da parsare indicando i nodi aggiunge qualche dettaglio ulteriore dei dati che devi scrivere nelle tabelle di Access che vedo/vediamo di aiutarti in modo più concreto.

    Ultima cosa….se i files XML sono più di uno e generalmente è cosi devi comunque impostare un ciclo che li legga tutti, non mi pare ci sia….

    Facci sapere.

    Ciao, Sandro.

    La risposta è stata utile?

    0 commenti Nessun commento