Fatturazione Elettronica

di il
17 risposte

Fatturazione Elettronica

Ho creato il file XML come da specificheFatturePA.
Testando il file su https://sdi.fatturapa.gov.it/SdI2FatturaPAWeb/ControllaFatturaAction.do mi da questo errore:

Descrizione errore
File non conforme al formato (nella descrizione del messaggio è riportata lâ¬"indicazione puntuale della non conformità ) - Errore nella parse del file (idSdi 8155600 ): Content is not allowed in prolog.

Suggerimento
Verificare che il file inviato sia conforme al formato previsto

Codice Errore
00200

Il fatto è che se io apro e chiudo il file con il programma DreamWeaver (salvo senza cambiare nulla) lo stesso file, allo stesso controllo passa brillantemente l'esame ed è considerato valido.

Cosa succede?
Cambia qualcosa nei caratteri non visibili, probabilmente -il resto rimane identico- ma cosa?

Qualcuno mi da una mano?
Grazie

17 Risposte

  • Re: Fatturazione Elettronica

    PeoSoft ha scritto:


    Ho creato il file XML come da specificheFatturePA.
    Testando il file su https://sdi.fatturapa.gov.it/SdI2FatturaPAWeb/ControllaFatturaAction.do mi da questo errore:

    Descrizione errore
    File non conforme al formato (nella descrizione del messaggio è riportata lâ¬"indicazione puntuale della non conformità ) - Errore nella parse del file (idSdi 8155600 ): Content is not allowed in prolog.

    Suggerimento
    Verificare che il file inviato sia conforme al formato previsto

    Codice Errore
    00200

    Il fatto è che se io apro e chiudo il file con il programma DreamWeaver (salvo senza cambiare nulla) lo stesso file, allo stesso controllo passa brillantemente l'esame ed è considerato valido.

    Cosa succede?
    Cambia qualcosa nei caratteri non visibili, probabilmente -il resto rimane identico- ma cosa?

    Qualcuno mi da una mano?
    Grazie
    Effettivamente l'errore 00200 corrisponde a "File non conforme al formato", dunque un po' generico, ma se viene accettato semplicemente salvandolo con un altro programma potrebbe essere banalmante la codifica/formato non UTF-8.
    Io di solito uso Notepad++ (menù formato) per rendermi conto del set di caratteri usato: ti consiglio dunque di verificare il formato del file prima e dopo averlo salvato.

    Piccolo aneddoto:
    un problema simile l'ho avuto con l'XML dello spesometro che non veniva accettato se privo di CR+LF.
    Cioè mi bastava prendere l'XML, aprirlo e salvarlo senza modifiche con XmlNotepad per farlo passare ai controlli dell'AdE. Fortunatamente la mancanza di CR+LF sembra non impattare viceversa il tracciato della fattura elettronica.

    Ciao,

    Carlo
  • Re: Fatturazione Elettronica

    Anche io propendo per l'ipotesi che il file che ho scritto sia in formato "non UFT-8", o UFT-8 non perfetto.

    Scrivo il file in VBA con il comando "Write" prendendo i valori da una tabella di Access.
    Con un ciclo leggo la tabella sequenzialmente e per ogni suo record scrivo nel file XML una riga a cui aggiungo vbCrLf per andare a capo.

    Non ho molta dimestichezza, quindi forse devo dire da qualche parte in qualche modo che la scrittura Write sia in formato UFT-8... probabilmente.
    Oppure magari sbaglio proprio nel "definire" il file da scrivere, ora faccio in questo modo:

    Dim fso As Object
    Set fso = CreateObject("Scripting.FileSystemObject")
    Dim FileXML As Object
    Set FileXML = fso.CreateTextFile("C:\FatturaPA.xml", True, True)

    Qualche idea?
  • Re: Fatturazione Elettronica

    PeoSoft ha scritto:


    Qualche idea?
    Non penso sia un problema di CR+LF (ci sta o non ci sta, non importa...)

    a volte basta la presenza di un carattere "strano" sull'indirizzo / città / descrizione articolo per andare in errore UTF8.

    Per carattere strano intendo il "<" ">" "°" "&" ... ed altri ancora....
  • Re: Fatturazione Elettronica

    NO, non c'entra CF+LF.

    Controllando il file NON VALIDO (quello prodotto dal mio programma) e quello OK (lo stesso file salvato senza alcuna modifica da DreamWeaver) con un visualizzatore esadecimale online ( ) si nota subito che i 2 file sono molto diversi: in quello non valido sono presenti molti bytes in più (anche il diverso peso dei 2 file fa la spia, il file valido pesa 3,80 Kb contro 7,61 kb di quello che da errore).

    Qui pubblico un'immagine con la stessa parte iniziale dei 2 file visti in formato esadecimali:

    Quella riportata sarebbe la 1° riga del file XML (sottolineati in verde i bytes inutili e dannosi, solo la prima linea)
    <?xml version="1.0" encoding="UTF-8" ?>

    Esaminando completamente i file risulta che dopo ogni byte (valido) venga aggiunto un carattere esadecimale hex 00.
    Inoltre vengono aggiunti all'inizio del file i primi 2 bytes (hex FF e hex FE).
    Sarebbe bello eliminare il problema all'origine (alla creazione del file), perchè lo fa? Perchè?
    O, in subordine, conoscete un sistema per rimuovere da un file tramite codice VBA i primi 2 caratteri e i successivi hex 00 (o byte in posizione pari)?
  • Re: Fatturazione Elettronica

    Sto cercando e cercando e cercando la soluzione, per adesso mi pare di aver capito che il mio file è scritto in UTF-16 anziché UTF-8 (e quindi viene aggiunto un byte "null" dopo ogni byte valido).
    Sto cercando un convertitore e come utilizzarlo da VBA.
    Ma l'ideale sarebbe scrivere un file UTF-8 e quindi la domanda diventa come "forzare" (ci sarà qualche parametro) la scrittura direttamente in UTF-8 ?
  • Re: Fatturazione Elettronica

    PeoSoft ha scritto:


    Ma l'ideale sarebbe scrivere un file UTF-8 e quindi la domanda diventa come "forzare" (ci sarà qualche parametro) la scrittura direttamente in UTF-8 ?
    direi proprio che devi cercare di scriverlo direttamente in UTF8, come si fa in VB ?????
  • Re: Fatturazione Elettronica

    PeoSoft ha scritto:


    Anche io propendo per l'ipotesi che il file che ho scritto sia in formato "non UFT-8", o UFT-8 non perfetto.

    Scrivo il file in VBA con il comando "Write" prendendo i valori da una tabella di Access.
    Con un ciclo leggo la tabella sequenzialmente e per ogni suo record scrivo nel file XML una riga a cui aggiungo vbCrLf per andare a capo.

    Non ho molta dimestichezza, quindi forse devo dire da qualche parte in qualche modo che la scrittura Write sia in formato UFT-8... probabilmente.
    Oppure magari sbaglio proprio nel "definire" il file da scrivere, ora faccio in questo modo:

    Dim fso As Object
    Set fso = CreateObject("Scripting.FileSystemObject")
    Dim FileXML As Object
    Set FileXML = fso.CreateTextFile("C:\FatturaPA.xml", True, True)

    Qualche idea?
    Impostazione completamente sbagliata.
    Devi scrivere in una tabella temporanea tutte le righe del file xml, partendo dall'intestazione ed arrivando alla chiusura, assegnando ad ogni riga il valore previsto dalle specifiche.
    Al termine, dopo avere salvato, esporti in un file di testo con estensione ".xml"
  • Re: Fatturazione Elettronica

    "direi proprio che devi cercare di scriverlo direttamente in UTF8, come si fa in VB ????? "

    Neapolis non capisco... io non lo so, altrimenti non chiedevo. E' la prima volta che affronto cose simili.
    Non si può fare in VB (VBA) ?
    Oppure è semplicissimo e io sono un pollo (possibile, anzi probabile)?
    Se si può fare mi puoi aiutare?
    Grazie.
  • Re: Fatturazione Elettronica

    Ettore56, grazie.
    Io ho già la tabella temporanea completa di tutti i dati dall'intestazione alla chiusura e perfettamente coerente con le specifiche.
    Ho tutto pronto e a posto.
    Devo solo trovare il modo di esportarlo o scriverlo o teletrasportarlo in un file XML con charset UFT-8
    Ho sottovalutato la cosa (credevo che facendo come pensavo andasse bene e invece mi ritrovo un file UFT-16) e adesso sono un attimo in difficoltà.
    Come faresti tu la fase "esporti in un file di testo con estensione .xml"?
    Sarà che sono andato in confusione ma io da ieri sto sbattendo contro il muro della validazione che finora non avevo mai incontrato perché quando ho organizzato e pianificato il tutto il file che validavo era precedentemente controllato (e salvato) in DreamWeaver e quindi andava sempre bene.
  • Re: Fatturazione Elettronica

    PeoSoft ha scritto:


    Ettore56, grazie.
    Io ho già la tabella temporanea completa di tutti i dati dall'intestazione alla chiusura e perfettamente coerente con le specifiche.
    Ho tutto pronto e a posto.
    Devo solo trovare il modo di esportarlo o scriverlo o teletrasportarlo in un file XML con charset UFT-8
    Ho sottovalutato la cosa (credevo che facendo come pensavo andasse bene e invece mi ritrovo un file UFT-16) e adesso sono un attimo in difficoltà.
    Come faresti tu la fase "esporti in un file di testo con estensione .xml"?
    Sarà che sono andato in confusione ma io da ieri sto sbattendo contro il muro della validazione che finora non avevo mai incontrato perché quando ho organizzato e pianificato il tutto il file che validavo era precedentemente controllato (e salvato) in DreamWeaver e quindi andava sempre bene.
    Bene.
    Se hai già tutti i records conformi nella tua tabella temporanea, esportali in un file di testo utilizzando:
    Open NomeTuoFile For Output As #1
    dove "NomeTuoFile" rispecchierà quanto previsto dall'AdE ( "IT" + "C.FISCALE" + "_" + "PROGRESSIVO UNIVOCO" + ".xml".
    Seleziona il tuo recordset (la tua tabella temporanea) e scrivi tutte le righe del recordset nel file "NomeTuoFile"
    Do While Not Rst.EOF
    Rst.Edit
    VV = Rst!Testo: Print #1, VV
    Rst.MoveNext
    Loop
    Alla fine dai l'istruzione per chiudere sia il recordset, sia "#1"
  • Re: Fatturazione Elettronica

    [Neapolis] ha scritto:


    PeoSoft ha scritto:


    Ma l'ideale sarebbe scrivere un file UTF-8 e quindi la domanda diventa come "forzare" (ci sarà qualche parametro) la scrittura direttamente in UTF-8 ?
    direi proprio che devi cercare di scriverlo direttamente in UTF8, come si fa in VB ?????
    Ciao,
    credo che il modo più semplice ( senza scomodare le api window) sia usare adodb.stream
    che permette di impostare lo charset



    HTH
  • Re: Fatturazione Elettronica

    Ecco, esatto, stavo per scriverlo, anche io sono arrivato alla stessa conclusione di "sspintux"!
    Da una mezz'ora ho completato i test e usando l'oggetto Stream funziona.
    Io ho fatto così:

    Dim objStream As Object
    Set objStream = CreateObject("ADODB.Stream")
    objStream.Charset = "utf-8"
    objStream.Open

    Dim DBCorrente As DAO.Database
    Dim Tabella As DAO.Recordset

    Set DBCorrente = CurrentDb
    Set Tabella = DBCorrente.OpenRecordset("AppoggioDatiXML", dbOpenDynaset)

    Do Until Tabella.EOF
    objStream.WriteText Tabella.Fields("RigaTAG") & vbCrLf ' leggo il campo del record e lo scrivo nel file XML (+ a capo riga)
    Tabella.MoveNext ' vado al record successivo
    Loop

    objStream.SaveToFile "C:\FatturaPA.xml", 2 ' file fattura ovviamente da rinominare

    Tabella.Close
    DBCorrente.Close
    objStream.Close

    Se c'è qualcosa da migliorare dite pure che vedo e provvedo ma così va.
    Il file generato è accettato in validazione (anche se presenta 3 caratteri iniziali che non dovrebbero esserci ma evidentemente non danno fastidio)
    Grazie a tutti per la collaborazione!
  • Re: Fatturazione Elettronica

    Signori, non ci siamo proprio. Non è questo il modo da seguire per creare un XML in vb6.

    Esiste la libreria msxml6.dll da utilizzare come riferimento (menu progetto, riferimenti, microsoft XML 6.0).
    Poi ci va il codice.

    breve esempio:
    ' ****** dichiarazione oggetti XML per apertura file
    Dim oXML As DOMDocument60
    Dim nameXML As IXMLDOMNodeList
    Dim elemXML As IXMLDOMElement
    Dim nodeXML As IXMLDOMNode
    Dim nodeListXML As IXMLDOMNodeList
    
        ' creazione file XML
        Dim dom
        Set dom = New DOMDocument60
        dom.async = False
        dom.validateOnParse = False
        dom.resolveExternals = False
        dom.preserveWhiteSpace = True
        Set CreateDOM = dom
    
            ' inzia a creare l'XML
            ' create dom document
            Set objDoc = XMLCreateDoc
            ' Create a processing instruction targeted for xml.
            XMLCreateProcessingInstruction objDoc, "xml", "version='1.0' encoding='UTF-8'"
            ' <p:FatturaElettronica>
            Set objNodeRoot = XMLCreateNode(objDoc, Nothing, "ns2:FatturaElettronica")
                ' <versione>
                XMLCreateAttribute objDoc, objNodeRoot, "versione", XMLInvoiceType
                ' <xmlns:ds>
                XMLCreateAttribute objDoc, objNodeRoot, "xmlns:ds", "http://www.w3.org/2000/09/xmldsig#"
                ' <xmlns:p>
                XMLCreateAttribute objDoc, objNodeRoot, "xmlns:ns2", "http://ivaservizi.agenziaentrate.gov.it/docs/xsd/fatture/v1.2"
                ' <xmlns:xsi>
                XMLCreateAttribute objDoc, objNodeRoot, "xmlns:xsi", "http://www.w3.org/2001/XMLSchema-instance"
                ' <xsi:schemaLocation>
                XMLCreateAttribute objDoc, objNodeRoot, "xsi:schemaLocation", "http://ivaservizi.agenziaentrate.gov.it/docs/xsd/fatture/v1.2 fatturaordinaria_v1.2.xsd "
                ' ---- XML header ----
                ' <FatturaElettronicaHeader>
                Set objNodeHeader = XMLCreateNode(objDoc, objNodeRoot, "FatturaElettronicaHeader")
                    ' <DatiTrasmissione>
                    Set objNode1 = XMLCreateNode(objDoc, objNodeHeader, "DatiTrasmissione")
                        ' <IdTrasmittente>
                        Set objNode2 = XMLCreateNode(objDoc, objNode1, "IdTrasmittente")
                            XMLCreateNode objDoc, objNode2, "IdPaese", dbField2Var(ADOrsXMLM1.Fields("ISOStato"), dbCTString)
                            XMLCreateNode objDoc, objNode2, "IdCodice", dbField2Var(ADOrsXMLM1.Fields("CodFisc"), dbCTString)
                        ' <ProgressivoInvio>
                        Set objNode2 = XMLCreateNode(objDoc, objNode1, "ProgressivoInvio", ConvStr(IDFatturaPA, 5))
                        ' <FormatoTrasmissione>
                        Set objNode2 = XMLCreateNode(objDoc, objNode1, "FormatoTrasmissione", XMLInvoiceType)
                        ' <CodiceDestinatario>
                        Set objNode2 = XMLCreateNode(objDoc, objNode1, "CodiceDestinatario", dbField2Var(ADOrsFPA.Fields("GovCodiceDestinatario"), dbCTString))
                        ' <ContattiTrasmittente>
                        Set objNode2 = XMLCreateNode(objDoc, objNode1, "ContattiTrasmittente")
                            XMLCreateNode objDoc, objNode2, "Telefono", GetNum(dbField2Var(ADOrsXMLM1.Fields("Telefono1"), dbCTString))
                            XMLCreateNode objDoc, objNode2, "Email", dbField2Var(ADOrsXMLM1.Fields("Email"), dbCTString)
                        ' <PECDestinatario>
                        If dbField2Var(ADOrsFPA.Fields("GovCodiceDestinatario"), dbCTString) = "0000000" Then
                            Set objNode2 = XMLCreateNode(objDoc, objNode1, "PECDestinatario", dbField2Var(ADOrsFPA.Fields("PEC"), dbCTString))
                        End If
                    ' <CedentePrestatore>
                    Set objNode1 = XMLCreateNode(objDoc, objNodeHeader, "CedentePrestatore")
                        ' <DatiAnagrafici>
    .........
    ............
    ...........
    





    ' funzioni utilizzate:
    ' ------------------------------------------------
    ' sub per creazione file XML
    ' testate e funzionanti - 23 ago 2014
    '
    ' http://www.vbforums.com/showthread.php?538334-Child-Elements-(XML-with-VB6)
    '
    Private Function XMLCreateDoc()
        ' crea il documento XML
        Dim objDoc
        Set objDoc = New DOMDocument60
        objDoc.async = False
        objDoc.validateOnParse = False
        objDoc.resolveExternals = False
        objDoc.preserveWhiteSpace = True
        Set XMLCreateDoc = objDoc
    End Function
    
    Private Sub XMLCreateProcessingInstruction(XMLDoc As DOMDocument60, InstrName As String, InstrValue As String)
        Dim objNode As IXMLDOMProcessingInstruction
    
        Set objNode = XMLDoc.createProcessingInstruction(InstrName, InstrValue)
        XMLDoc.appendChild objNode
        Set objNode = Nothing
    End Sub
    
    Private Sub XMLCreateComment(XMLDoc As DOMDocument60, ByVal CommentText As String)
        Dim objComment As IXMLDOMComment
        
        Set objComment = XMLDoc.createComment(CommentText)
        XMLDoc.appendChild objComment
        Set objComment = Nothing
    End Sub
    
    Private Function XMLCreateNode(XMLDoc As DOMDocument60, ParentNode As IXMLDOMNode, NodeName As String, Optional NodeValue As String = "") As IXMLDOMNode
        ' crea un nodo nel documento XML
        Dim objNode As IXMLDOMNode
        
        'Create the node
        Set objNode = XMLDoc.createElement(NodeName)
        'Add the text if it has any
        If NodeValue <> "" Then
            objNode.text = NodeValue
        End If
        'Add the node to the document
        If ParentNode Is Nothing Then
            XMLDoc.appendChild objNode
        Else
            ParentNode.appendChild objNode
        End If
        Set XMLCreateNode = objNode
        Set objNode = Nothing
    End Function
    
    Private Sub XMLCreateAttribute(XMLDoc As DOMDocument60, oNode As IXMLDOMNode, AttribName As String, AttribValue As String)
        Dim oElement As IXMLDOMElement
    
        Set oElement = oNode
        oElement.setAttribute AttribName, AttribValue
        Set oElement = Nothing
    End Sub
    
    Private Sub XMLFormatDoc(ByVal xml_doc As DOMDocument60)
        ' Add formatting to the document.
        XMLFormatNode xml_doc.documentElement, 0
    End Sub
    
    Private Sub XMLFormatNode(ByVal node As IXMLDOMNode, ByVal indent As Integer)
        ' Add formatting to this element. Indent it and add a
        ' carriage return before its children. Then recursively
        ' format the children with increased indentation.
        Dim child As IXMLDOMNode
        Dim text_only As Boolean
    
        ' Do nothing if this is a text node.
        If TypeOf node Is IXMLDOMText Then Exit Sub
        ' See if this node contains only text.
        text_only = True
        If node.hasChildNodes Then
            For Each child In node.childNodes
                If Not (TypeOf child Is IXMLDOMText) Then
                    text_only = False
                    Exit For
                End If
            Next child
        End If
        ' Process child nodes.
        If node.hasChildNodes Then
            ' Add a carriage return before the children.
            If Not text_only Then
                node.insertBefore node.ownerDocument.createTextNode(vbCrLf), node.firstChild
            End If
            ' Format the children.
            For Each child In node.childNodes
                XMLFormatNode child, indent + 2
            Next child
        End If
        ' Format this element.
        If indent > 0 Then
            ' Indent before this element.
            node.ParentNode.insertBefore node.ownerDocument.createTextNode(Space$(indent)), node
            ' Indent after the last child node.
            If Not text_only Then node.appendChild node.ownerDocument.createTextNode(Space$(indent))
            ' Add a carriage return after this node.
            If node.nextSibling Is Nothing Then
                node.ParentNode.appendChild node.ownerDocument.createTextNode(vbCrLf)
            Else
                node.ParentNode.insertBefore node.ownerDocument.createTextNode(vbCrLf), node.nextSibling
            End If
        End If
    End Sub
    ' ---------------------------------------
  • Re: Fatturazione Elettronica

    andwork ha scritto:


    Signori, non ci siamo proprio. Non è questo il modo da seguire per creare un XML in vb6.
    Concordo con te.
    E' preferibile la libreria msxml6.dll.

    A parte questo, il codice va postato utilizzando il tag CODE, come da Regolamento: regola 7. Formattare il codice sorgente
Devi accedere o registrarti per scrivere nel forum
17 risposte