Nodi e sottonodi XML fattura elettronica

di il
11 risposte

Nodi e sottonodi XML fattura elettronica

Buongiorno a tutti, premesso che è la prima volta che cerco di leggere dei nodi XML, sono alle prese con la fattura elettronica, e più precisamente, dopo aver scritto una tabella con le linee di dettaglio della fattura devo abbinare ad ogni riga il codice articolo. Fino alla lettura del dettagliolinee tutto bene, il problema è che non so come recuperare i sottonodi con il codice articolo per inserirli in un altra tabella, o meglio, li riuscirei e recuperare e scrivere in tabella come il dettagliolinee ma non riesco ad abbinare il numero della riga a cui si riferiscono.
Sotto quanto ho scritto (in buona parte mutuato da un post sul vostro forum - Magari è rimasta in giro un po di sporcizia facendo delle prove):
[CODE] Public Function ImportaRigheAnno() 'Massivo Anno 'Dim StartPath As String, NomeFile, FullPath As String, strsql As String, MyAnno As Integer, NrLinee As Integer, i As Integer, Testo As String Dim rs2 As DAO.Recordset Dim rs3 As DAO.Recordset Dim FullPath As String FullPath = "C:\gestione\file1.XML" Dim obj As DOMDocument60 Dim Nodo As IXMLDOMNodeList Dim Nome As IXMLDOMNode Dim dettaglioLinee As IXMLDOMNodeList Dim lineaDettaglio As IXMLDOMNode Dim NumeroLinea As IXMLDOMNode, Descrizione As IXMLDOMNode, QUANTITA As IXMLDOMNode, UnitaMisura As IXMLDOMNode Dim PrezzoUnitario As IXMLDOMNode, ScontoMaggiorazione As IXMLDOMNode, PrezzoTotale As IXMLDOMNode, AliquotaIva As IXMLDOMNode Set obj = New DOMDocument60 obj.async = False obj.Load (FullPath) Set dettaglioLinee = obj.documentElement.selectNodes("//DatiBeniServizi/DettaglioLinee") For Each lineaDettaglio In dettaglioLinee Set NumeroLinea = lineaDettaglio.selectSingleNode("./NumeroLinea") '========================================================================================== 'QUI DOVREI RECUPERARE I DATI DEL CODICE ARTICOLO E SCRIVERLI IN UNA TABELLA A PARTE '========================================================================================== Set Descrizione = lineaDettaglio.selectSingleNode("./Descrizione") Set QUANTITA = lineaDettaglio.selectSingleNode("./Quantita") Set UnitaMisura = lineaDettaglio.selectSingleNode("./UnitaMisura") Set PrezzoUnitario = lineaDettaglio.selectSingleNode("./PrezzoUnitario") If Not lineaDettaglio.selectSingleNode("./ScontoMaggiorazione") Is Nothing Then Set ScontoMaggiorazione = lineaDettaglio.selectSingleNode("./ScontoMaggiorazione") End If Set PrezzoTotale = lineaDettaglio.selectSingleNode("./PrezzoTotale") Set AliquotaIva = lineaDettaglio.selectSingleNode("./AliquotaIVA") Debug.Print AliquotaIva.text 'Set obj = Nothing Set rs2 = CurrentDb.OpenRecordset("TMP-ImportaXML_DettaglioLinee", dbOpenDynaset) 'Recordset per popolare il Lato Molti With rs2 .AddNew .Fields("NumeroLinea") = Trim(NumeroLinea.text) .Fields("Descrizione") = Trim(Descrizione.text) .Fields("Quantita") = Replace(QUANTITA.text, ".", ",") .Fields("UnitaMisura") = Trim(UnitaMisura.text) .Fields("PrezzoUnitario") = Replace(PrezzoUnitario.text, ".", ",") If Not lineaDettaglio.selectSingleNode("./ScontoMaggiorazione") Is Nothing Then .Fields("ScontoMaggiorazione") = Replace(ScontoMaggiorazione.text, ".", ",") End If .Fields("PrezzoTotale") = Replace(PrezzoTotale.text, ".", ",") .Fields("AliquotaIVA") = Replace(AliquotaIva.text, ".", ",") .Update 'DoEvents End With rs2.Close Set rs2 = Nothing '========================================================================================== 'QUI HO PROVATO AD AGGIUNGERE I CODICI ARTICOLO '========================================================================================== Dim obj1 As DOMDocument60 Dim CodiceArticolo As IXMLDOMNodeList Dim CodiceArticolo_Nodo As IXMLDOMNode Dim CodiceTipo As IXMLDOMNode, CodiceValore As IXMLDOMNode Set obj1 = New DOMDocument60 obj1.async = False obj1.Load (FullPath) Set CodiceArticolo = obj1.documentElement.selectNodes("//DatiBeniServizi/DettaglioLinee/CodiceArticolo") For Each CodiceArticolo_Nodo In CodiceArticolo '========================================================================================== 'QUI DOVREI RECUPERARE IL NumeroLinea '========================================================================================== Set CodiceTipo = CodiceArticolo_Nodo.selectSingleNode("./CodiceTipo") Set CodiceValore = CodiceArticolo_Nodo.selectSingleNode("./CodiceValore") Set obj1 = Nothing Set rs3 = CurrentDb.OpenRecordset("TMP-ImportaXML_CodiceArticolo", dbOpenDynaset) 'Recordset per popolare il Lato Molti With rs3 .AddNew .Fields("NumeroLinea") = Trim(NumeroLinea.text) .Fields("CodiceTipo") = Trim(CodiceTipo.text) .Fields("CodiceValore") = Trim(CodiceValore.text) .Update End With rs3.Close Set rs3 = Nothing Next Next MsgBox "Righe Estratte!", vbInformation End Function

11 Risposte

  • Re: Nodi e sottonodi XML fattura elettronica

    Hai scritto parecchio codice. Mettilo tra i tag CODE e se è adeguatamente indentato è ancora meglio.
  • Re: Nodi e sottonodi XML fattura elettronica

    Ciao, scusa ma sono nuovo del forum, non capisco cosa dovrei fare
  • Re: Nodi e sottonodi XML fattura elettronica

    Gulp ha scritto:


    Ciao, scusa ma sono nuovo del forum, non capisco cosa dovrei fare
    C'hai provato, almeno, la buona volontà c'è. Però i tag CODE, anche se nella videata sono contrassegnati con le parentesi angolari < > vanno racchiusi con le classiche parentesi quadrate. Lo faccio io per te, mettendo anche i rientri.
    Public Function ImportaRigheAnno() 'Massivo Anno
    'Dim StartPath As String, NomeFile, FullPath As String, strsql As String, MyAnno As Integer, NrLinee As Integer, i As Integer, Testo As String
    
    Dim rs2 As DAO.Recordset
    Dim rs3 As DAO.Recordset
    Dim FullPath As String
    FullPath = "C:\gestione\file1.XML"
    
    Dim obj As DOMDocument60
    Dim Nodo As IXMLDOMNodeList
    Dim Nome As IXMLDOMNode
    
    Dim dettaglioLinee As IXMLDOMNodeList
    Dim lineaDettaglio As IXMLDOMNode
    Dim NumeroLinea As IXMLDOMNode, Descrizione As IXMLDOMNode, QUANTITA As IXMLDOMNode, UnitaMisura As IXMLDOMNode
    Dim PrezzoUnitario As IXMLDOMNode, ScontoMaggiorazione As IXMLDOMNode, PrezzoTotale As IXMLDOMNode, AliquotaIva As IXMLDOMNode
    
    Set obj = New DOMDocument60
    obj.async = False
    obj.Load (FullPath)
    
    Set dettaglioLinee = obj.documentElement.selectNodes("//DatiBeniServizi/DettaglioLinee")
    For Each lineaDettaglio In dettaglioLinee
    
    	Set NumeroLinea = lineaDettaglio.selectSingleNode("./NumeroLinea")
    	'==========================================================================================
    	'QUI DOVREI RECUPERARE I DATI DEL CODICE ARTICOLO E SCRIVERLI IN UNA TABELLA A PARTE
    	'==========================================================================================
    	Set Descrizione = lineaDettaglio.selectSingleNode("./Descrizione")
    	Set QUANTITA = lineaDettaglio.selectSingleNode("./Quantita")
    	Set UnitaMisura = lineaDettaglio.selectSingleNode("./UnitaMisura")
    	Set PrezzoUnitario = lineaDettaglio.selectSingleNode("./PrezzoUnitario")
    
    	If Not lineaDettaglio.selectSingleNode("./ScontoMaggiorazione") Is Nothing Then
    		Set ScontoMaggiorazione = lineaDettaglio.selectSingleNode("./ScontoMaggiorazione")
    	End If
    
    	Set PrezzoTotale = lineaDettaglio.selectSingleNode("./PrezzoTotale")
    	Set AliquotaIva = lineaDettaglio.selectSingleNode("./AliquotaIVA")
    
    	Debug.Print AliquotaIva.text
    
    	'Set obj = Nothing
    
    	Set rs2 = CurrentDb.OpenRecordset("TMP-ImportaXML_DettaglioLinee", dbOpenDynaset) 'Recordset per popolare il Lato Molti
    	With rs2
    		.AddNew
    		.Fields("NumeroLinea") = Trim(NumeroLinea.text)
    		.Fields("Descrizione") = Trim(Descrizione.text)
    		.Fields("Quantita") = Replace(QUANTITA.text, ".", ",")
    		.Fields("UnitaMisura") = Trim(UnitaMisura.text)
    		.Fields("PrezzoUnitario") = Replace(PrezzoUnitario.text, ".", ",")
    
    		If Not lineaDettaglio.selectSingleNode("./ScontoMaggiorazione") Is Nothing Then
    			.Fields("ScontoMaggiorazione") = Replace(ScontoMaggiorazione.text, ".", ",")
    		End If
    
    		.Fields("PrezzoTotale") = Replace(PrezzoTotale.text, ".", ",")
    		.Fields("AliquotaIVA") = Replace(AliquotaIva.text, ".", ",")
    		.Update
    		'DoEvents
    	End With
    	rs2.Close
    	Set rs2 = Nothing
    
    	'==========================================================================================
    	'QUI HO PROVATO AD AGGIUNGERE I CODICI ARTICOLO
    	'==========================================================================================
    
    	Dim obj1 As DOMDocument60
    	Dim CodiceArticolo As IXMLDOMNodeList
    	Dim CodiceArticolo_Nodo As IXMLDOMNode
    	Dim CodiceTipo As IXMLDOMNode, CodiceValore As IXMLDOMNode
    
    	Set obj1 = New DOMDocument60
    	obj1.async = False
    	obj1.Load (FullPath)
    
    	Set CodiceArticolo = obj1.documentElement.selectNodes("//DatiBeniServizi/DettaglioLinee/CodiceArticolo")
    	For Each CodiceArticolo_Nodo In CodiceArticolo
    		'==========================================================================================
    		'QUI DOVREI RECUPERARE IL NumeroLinea
    		'==========================================================================================
    		Set CodiceTipo = CodiceArticolo_Nodo.selectSingleNode("./CodiceTipo")
    		Set CodiceValore = CodiceArticolo_Nodo.selectSingleNode("./CodiceValore")
    
    		Set obj1 = Nothing
    
    		Set rs3 = CurrentDb.OpenRecordset("TMP-ImportaXML_CodiceArticolo", dbOpenDynaset) 'Recordset per popolare il Lato Molti
    		With rs3
    			.AddNew
    			.Fields("NumeroLinea") = Trim(NumeroLinea.text)
    			.Fields("CodiceTipo") = Trim(CodiceTipo.text)
    			.Fields("CodiceValore") = Trim(CodiceValore.text)
    			.Update
    		End With
    		rs3.Close
    		Set rs3 = Nothing
    	Next
    Next
    
    MsgBox "Righe Estratte!", vbInformation
    End Function
  • Re: Nodi e sottonodi XML fattura elettronica

    Gulp ha scritto:


    ...il problema è che non so come recuperare i sottonodi con il codice articolo per inserirli in un altra tabella, o meglio, li riuscirei e recuperare e scrivere in tabella come il dettagliolinee ma non riesco ad abbinare il numero della riga a cui si riferiscono.
    Come sono collegate le due tabelle ImportaXML_DettaglioLinee e TMP-ImportaXML_CodiceArticolo?
  • Re: Nodi e sottonodi XML fattura elettronica

    Ciao, l'elemento in comune è NumeroLinea, che è poi quello che non riesco ad inserire nella tabella TMP-ImportaXML_CodiceArticolo, comunque ho fatto dei passi avanti, adesso funziona, ma mi piacerebbe ciclare con "For Each" per ogni sottonodo di CodiceArticolo [CODE] Public Function ImportaRighe() Dim rs2 As DAO.Recordset Dim rs3 As DAO.Recordset Dim FullPath As String FullPath = "C:\gestione\file1.XML" '========================================================================================== 'INIZIO LETTURA FILE XML ## dati di righe solo i Dieci nodi '========================================================================================== Dim obj As DOMDocument60 Dim Nodo As IXMLDOMNodeList Dim Nome As IXMLDOMNode Dim dettaglioLinee As IXMLDOMNodeList Dim lineaDettaglio As IXMLDOMNode Dim NumeroLinea As IXMLDOMNode, Descrizione As IXMLDOMNode, QUANTITA As IXMLDOMNode, UnitaMisura As IXMLDOMNode Dim PrezzoUnitario As IXMLDOMNode, ScontoMaggiorazione As IXMLDOMNode, PrezzoTotale As IXMLDOMNode, AliquotaIva As IXMLDOMNode Dim CodiceTipo1 As IXMLDOMNode, CodiceValore1 As IXMLDOMNode, CodiceTipo2 As IXMLDOMNode, CodiceValore2 As IXMLDOMNode, CodiceTipo3 As IXMLDOMNode, CodiceValore3 As IXMLDOMNode, CodiceTipo4 As IXMLDOMNode, CodiceValore4 As IXMLDOMNode '========================================================================================== 'ACCESSO AL FILE XML '========================================================================================== Set obj = New DOMDocument60 obj.async = False obj.Load (FullPath) Set rs3 = CurrentDb.OpenRecordset("TMP-ImportaXML_CodiceArticolo", dbOpenDynaset) Set rs2 = CurrentDb.OpenRecordset("TMP-ImportaXML_DettaglioLinee", dbOpenDynaset) Do Until rs3.EOF rs3.Delete rs3.MoveNext Loop Do Until rs2.EOF rs2.Delete rs2.MoveNext Loop Set dettaglioLinee = obj.documentElement.selectNodes("//DatiBeniServizi/DettaglioLinee") For Each lineaDettaglio In dettaglioLinee Set NumeroLinea = lineaDettaglio.selectSingleNode("./NumeroLinea") Set CodiceTipo1 = lineaDettaglio.childNodes(1).childNodes(0) Set CodiceValore1 = lineaDettaglio.childNodes(1).childNodes(1) If Not lineaDettaglio.childNodes(1).childNodes(1) Is Nothing Then With rs3 .AddNew .Fields("NumeroLinea") = Trim(NumeroLinea.text) .Fields("CodiceTipo") = Trim(CodiceTipo1.text) .Fields("CodiceValore") = Trim(CodiceValore1.text) .Update End With End If Set CodiceTipo2 = lineaDettaglio.childNodes(2).childNodes(0) Set CodiceValore2 = lineaDettaglio.childNodes(2).childNodes(1) If Not lineaDettaglio.childNodes(2).childNodes(1) Is Nothing Then With rs3 .AddNew .Fields("NumeroLinea") = Trim(NumeroLinea.text) .Fields("CodiceTipo") = Trim(CodiceTipo2.text) .Fields("CodiceValore") = Trim(CodiceValore2.text) .Update End With End If Set CodiceTipo3 = lineaDettaglio.childNodes(3).childNodes(0) Set CodiceValore3 = lineaDettaglio.childNodes(3).childNodes(1) If Not lineaDettaglio.childNodes(3).childNodes(1) Is Nothing Then With rs3 .AddNew .Fields("NumeroLinea") = Trim(NumeroLinea.text) .Fields("CodiceTipo") = Trim(CodiceTipo3.text) .Fields("CodiceValore") = Trim(CodiceValore3.text) .Update End With End If Set CodiceTipo4 = lineaDettaglio.childNodes(4).childNodes(0) Set CodiceValore4 = lineaDettaglio.childNodes(4).childNodes(1) If Not lineaDettaglio.childNodes(4).childNodes(1) Is Nothing Then With rs3 .AddNew .Fields("NumeroLinea") = Trim(NumeroLinea.text) .Fields("CodiceTipo") = Trim(CodiceTipo4.text) .Fields("CodiceValore") = Trim(CodiceValore4.text) .Update End With End If 'MsgBox CodiceTipo3.text & " - " & CodiceValore3.text Set Descrizione = lineaDettaglio.selectSingleNode("./Descrizione") Set QUANTITA = lineaDettaglio.selectSingleNode("./Quantita") Set UnitaMisura = lineaDettaglio.selectSingleNode("./UnitaMisura") Set PrezzoUnitario = lineaDettaglio.selectSingleNode("./PrezzoUnitario") If Not lineaDettaglio.selectSingleNode("./ScontoMaggiorazione") Is Nothing Then Set ScontoMaggiorazione = lineaDettaglio.selectSingleNode("./ScontoMaggiorazione") End If Set PrezzoTotale = lineaDettaglio.selectSingleNode("./PrezzoTotale") Set AliquotaIva = lineaDettaglio.selectSingleNode("./AliquotaIVA") With rs2 .AddNew ' .Fields("IdPrimaNota") = (rs1!IdPrimaNota) .Fields("NumeroLinea") = Trim(NumeroLinea.text) .Fields("Descrizione") = Trim(Descrizione.text) .Fields("Quantita") = Replace(QUANTITA.text, ".", ",") .Fields("UnitaMisura") = Trim(UnitaMisura.text) .Fields("PrezzoUnitario") = Replace(PrezzoUnitario.text, ".", ",") If Not lineaDettaglio.selectSingleNode("./ScontoMaggiorazione") Is Nothing Then .Fields("ScontoMaggiorazione") = Replace(ScontoMaggiorazione.text, ".", ",") End If .Fields("PrezzoTotale") = Replace(PrezzoTotale.text, ".", ",") .Fields("AliquotaIVA") = Replace(AliquotaIva.text, ".", ",") .Update End With Next rs3.Close Set rs3 = Nothing rs2.Close Set rs2 = Nothing Set obj = Nothing MsgBox "Righe Estratte!", vbInformation End Function
  • Re: Nodi e sottonodi XML fattura elettronica

    Parto da una cosa che non hai chiesto ma che nel codice è inguardabile

    Gulp ha scritto:


    
            Do Until rs3.EOF
                rs3.Delete
                rs3.MoveNext
            Loop
            
            Do Until rs2.EOF
                rs2.Delete
                rs2.MoveNext
            Loop
    Noooo, per svuotare una tabella/query fai la più classica delle query di cancellazione dal metodo Execute di un oggetto Database
    Dim currDb as DAO.Database
    Set currDb = CurrentDb()
    With currDb
         .Execute "DELETE FROM TMP-ImportaXML_CodiceArticolo", dbFailOnError
         .Execute "DELETE FROM TMP-ImportaXML_DettaglioLinee", dbFailOnError
    End With
    meglio ancora se in una transazione che, già che ci sei, dovrà comprendere anche le azioni di Update sui recordset.

    Gulp ha scritto:


    ... mi piacerebbe ciclare con "For Each" per ogni sottonodo di CodiceArticolo
    e non ci riesci? (domanda retorica, evidentemente non ci riesci altrimenti non lo chiederesti)
    Già sai fare il ciclo su altri nodi e su questo ti pianti?
                    Set CodiceTipo1 = lineaDettaglio.childNodes(1).childNodes(0)
                    Set CodiceValore1 = lineaDettaglio.childNodes(1).childNodes(1)
            
                    If Not lineaDettaglio.childNodes(1).childNodes(1) Is Nothing Then
                         With rs3
                           .AddNew
                                .Fields("NumeroLinea") = Trim(NumeroLinea.text)
                                .Fields("CodiceTipo") = Trim(CodiceTipo1.text)
                                .Fields("CodiceValore") = Trim(CodiceValore1.text)
                            .Update
                        End With
                    End If
    
    Ti rendi conto di come hai scritto il resto del codice? Tutto un copia/incolla in cui cambia solo il numero alla fine delle variabili: CodiceTipo da 1 a N. Campanello d'allarme: o puoi scrivere una funzione ad hoc o puoi fare un ciclo o... c'è comunque qualcosa che ti permette di fare le cose giuste nel modo giusto.
    NumeroLinea è un oggetto del DOM di cui poi tu sfrutti la proprietà .text per scriverla nel campo NumeroLinea. Siccome non cambia tra le varie ripetizioni del codice, crei una variabile apposita e le assegni il valore e quando è ora di scrivere nel campo usi il valore "definitivo" già ottenuto con la variabile, senza dover ogni volta sottoporre a Trim al proprietà .text di NumeroLinea (ipotizzo si tratti di una stringa, se è numerico modifica il datatype della variabile)
    Dim strNumeroLinea as String
    strNumeroLinea = Trim(NumeroLinea.text)
    Andando più nel dettaglio, vedo che fai una If, qui

    Gulp ha scritto:


    
                    Set CodiceTipo1 = lineaDettaglio.childNodes(1).childNodes(0)
                    Set CodiceValore1 = lineaDettaglio.childNodes(1).childNodes(1)
            
                    If Not lineaDettaglio.childNodes(1).childNodes(1) Is Nothing Then
    Può accadere che CodiceTipo sia valorizzato ma non lo sia CodiceValore?
    Il resto dei suggerimenti quando hai chiarito questo.
    Potresti agevolare il tutto pubblicando un piccolissimo estratto del file, nella parte che si va ad analizzare con quel codice che tu hai ripetuto 4 volte? Così capisco meglio e non rischio di prendere fischi per fiaschi e fare anche brutta figura.
    (metti anche quello tra tag code, un file xml si legge meglio, a mio avviso, se scritto in quel modo)
  • Re: Nodi e sottonodi XML fattura elettronica

    Ciao, ti ringrazio per la risposta, avevo premesso di non conoscere l'utilizzo dei nodi, con il codice mi arrangio copiando qua e la senza grandi basi, ma riesco a fare quello che voglio, comunque CodiceTipo e Codicevalore vanno in copia, se c'è l'uno c'è anche l'altro, o ci sono entrambi o non ci sono, e possono essere da 0 a N (non per forza 3 come nell'esempio), di seguito il codice da leggere: [CODE] <DettaglioLinee> <NumeroLinea>1</NumeroLinea> <CodiceArticolo> <CodiceTipo>EN</CodiceTipo> <CodiceValore>4711081725435</CodiceValore> </CodiceArticolo> <CodiceArticolo> <CodiceTipo>TU</CodiceTipo> <CodiceValore>D500MD-5124004X</CodiceValore> </CodiceArticolo> <CodiceArticolo> <CodiceTipo>COD_FORNITORE</CodiceTipo> <CodiceValore>90PF03A1-M002P0</CodiceValore> </CodiceArticolo> <Descrizione>D500MD-512400004X/I5/8/512/W11P</Descrizione> <Quantita>1.00</Quantita> <UnitaMisura>PCE</UnitaMisura> <PrezzoUnitario>506.16</PrezzoUnitario> <PrezzoTotale>506.16</PrezzoTotale> <AliquotaIVA>22.00</AliquotaIVA> <AltriDatiGestionali> <TipoDato>NOTE</TipoDato> <RiferimentoTesto>Spedito a: C.N.T. DI UGOLOTTI GIOVANNI .</RiferimentoTesto> </AltriDatiGestionali> <AltriDatiGestionali> <TipoDato>NOTE</TipoDato> <RiferimentoTesto>STRADA LAURANO NUMERO 1/1 NEVIANO DEGLI ARDUINI 43024 PR .</RiferimentoTesto> </AltriDatiGestionali> <AltriDatiGestionali> <TipoDato>Seriale</TipoDato> <RiferimentoTesto>N4PFCG01M05418E</RiferimentoTesto> </AltriDatiGestionali> <AltriDatiGestionali> <TipoDato>NOTE</TipoDato> <RiferimentoTesto>SM</RiferimentoTesto> </AltriDatiGestionali> </DettaglioLinee> <DettaglioLinee> <NumeroLinea>2</NumeroLinea> <CodiceArticolo> <CodiceTipo>EN</CodiceTipo> <CodiceValore>4710886027089</CodiceValore> </CodiceArticolo> <CodiceArticolo> <CodiceTipo>TU</CodiceTipo> <CodiceValore>UM.UV6EE.009</CodiceValore> </CodiceArticolo> <CodiceArticolo> <CodiceTipo>COD_FORNITORE</CodiceTipo> <CodiceValore>UM.UV6EE.009</CodiceValore> </CodiceArticolo> <Descrizione>V246HQLBMID</Descrizione> <Quantita>1.00</Quantita> <UnitaMisura>PCE</UnitaMisura> <PrezzoUnitario>92.90</PrezzoUnitario> <PrezzoTotale>92.90</PrezzoTotale> <AliquotaIVA>22.00</AliquotaIVA> <AltriDatiGestionali> <TipoDato>Seriale</TipoDato> <RiferimentoTesto>MMT2BEE01A2250B0944240</RiferimentoTesto> </AltriDatiGestionali> </DettaglioLinee> Comunque il sistema che sto usando funziona ma è concettualmente errato e potrebbe restituire valori sballati perchè interrogo il nodo figlio senza indicare il nome, per me deve essere: [CODE] Se esiste seleziono il "Sottonodo CodiceArticolo" in "DettaglioLinea.Numerolinea" For Earch "Sottonodo CodiceArticolo" in "DettaglioLinea.Numerolinea" Set CodiceTipo = lineaDettaglio.CodiceArticolo.CodiceTipo Set CodiceValore = lineaDettaglio.CodiceArticolo.CodiceTipo E scrivo i dati nel database.
  • Re: Nodi e sottonodi XML fattura elettronica

    Gulp ha scritto:


    ...avevo premesso di non conoscere l'utilizzo dei nodi, con il codice mi arrangio copiando qua e la senza grandi basi
    E' normale che tu non mi conosca, salvo che ti sia messo a scorrere il forum articolo per articolo: buona parte di quello che scrivo come rimprovero è da leggere in modo ironico.

    Gulp ha scritto:


    , comunque CodiceTipo e Codicevalore vanno in copia, se c'è l'uno c'è anche l'altro, o ci sono entrambi o non ci sono, e possono essere da 0 a N (non per forza 3 come nell'esempio), di seguito il codice da leggere:
    Perfetto, con questo ho inquadrato la situazione.

    Gulp ha scritto:


    Comunque il sistema che sto usando funziona ma è concettualmente errato e potrebbe restituire valori sballati
    Quindi non funziona. Una cosa non può funzionare con un "ma".

    Gulp ha scritto:


    [CODE] Se esiste seleziono il "Sottonodo CodiceArticolo" in "DettaglioLinea.Numerolinea" For Earch "Sottonodo CodiceArticolo" in "DettaglioLinea.Numerolinea" Set CodiceTipo = lineaDettaglio.CodiceArticolo.CodiceTipo Set CodiceValore = lineaDettaglio.CodiceArticolo.CodiceTipo E scrivo i dati nel database.
    Ecco, secondo me è qui l'inghippo, proprio alla luce dell'estratto di file che hai mostrato.
    La logica che mi sembra più adatta è
    ===inizio===
    1) leggi NumeroLinea

    2) Per ogni "CodiceArticolo" in "DettaglioLinee"

    2.1) Scrivi NumeroLinea
    2.2) Scrivi CodiceTipo
    2.3) Scrivi CodiceValore
    nel database.
    (torna al punto 2 per il CodiceArticolo successivo, meccanismo insito nel concetto "Per ogni" )
    ===fine===
    	Set dettaglioLinee = obj.documentElement.selectNodes("//DatiBeniServizi/DettaglioLinee")
    	
    	For Each lineaDettaglio In dettaglioLinee
    		
    		Set NumeroLinea = lineaDettaglio.selectSingleNode("./NumeroLinea")
    		Dim strNumeroLinea as String
    		strNumeroLinea = Trim(NumeroLinea.text)
       
    		Dim codiciArticolo As IXMLDOMNodeList '<-- codici, al plurale
    		Set codiciArticolo = lineaDettaglio.SelectNodes("./CodiceArticolo")
    		
    		Dim codiceArticolo As IXMLDOMNode '<-- codice, al singolare
    
    		If codiciArticolo.Lengh > 0 Then
    		
    			For Each codiceArticolo In codiciArticolo
    			
    			Set CodiceTipo = codiceArticolo.childNodes(0)
    			Set CodiceValore = codiceArticolo.childNodes(1)
    
    			With rs3
    				.AddNew
    					.Fields("NumeroLinea") = strNumeroLinea
    					.Fields("CodiceTipo") = Trim(CodiceTipo.text)
    					.Fields("CodiceValore") = Trim(CodiceValore.text)
    				.Update
    			End With
    			
    			Next
    			
    		End If
    		
    'qui riparte il tuo codice da
    		Set Descrizione = lineaDettaglio.selectSingleNode("./Descrizione")
    		Set QUANTITA = lineaDettaglio.selectSingleNode("./Quantita")
     ...
    Attenzione: è tutto codice scritto al volo su notepad++, quindi potrei aver commesso errori di digitazione, non ho pututo verificare con il Compila se metodi e proprietà degli oggetti sono perfetti.
    Spero che sia chiara la logica. Siccome c'è un'elevata probabilità che al primo colpo non funzioni (gli xml mi fregano sempre) ... sarai costretto a capirla o a tornare qui per chiedere di spiegartela meglio.
  • Re: Nodi e sottonodi XML fattura elettronica

    Perfetto, era quello che mi serviva, ho fatto un paio di aggiustamenti e funziona tutto, ti ringrazio molto
  • Re: Nodi e sottonodi XML fattura elettronica

    Gulp ha scritto:


    .. ho fatto un paio di aggiustamenti ...
    Quali? pubblicali così il thread è completo e possono beneficiarne tutti (anch'io, visto che hai dovuto aggiustare quello che ho scritto)
  • Re: Nodi e sottonodi XML fattura elettronica

    Banalità, CodiceTipo e CodiceValore non dichiarati (erano rimasti i miei CodiceTipo1 e CodiceValore1) e codiciArticolo.Lengh sostituito da <> Nothing
Devi accedere o registrarti per scrivere nel forum
11 risposte