![]() |
![]() |
| Paypal | FTP | CCD | Buscar | Trucos | Trabajo | Foros |
|
|||||||
| Registrarse | FAQ | Miembros | Calendario | Guía de estilo | Temas de Hoy |
|
|
Herramientas | Buscar en Tema | Desplegado |
|
#1
|
|||
|
|||
|
Problema con los XML generados
Tengo un problema con mis XML y acabo de darme cuenta ahora. la verdad es que no sé cuándo pudo empezar, estoy revisando XML antiguos y son correctos, pero tras algún cambio me ocurre lo siguiente.
Algunos nodos del XML aparecen como <item> en vez del nombre correcto. Por ejemplo este: Código:
<Desglose>
<item>
<Impuesto>01</Impuesto>
<ClaveRegimen>04</ClaveRegimen>
<CalificacionOperacion>S2</CalificacionOperacion>
<TipoImpositivo>0</TipoImpositivo>
<BaseImponibleOimporteNoSujeto>33.64</BaseImponibleOimporteNoSujeto>
<CuotaRepercutida>0</CuotaRepercutida>
</item>
</Desglose>
Aquí va una porción simplificada del código: Código:
// Desglose de impuestos
ListaDesglose := DesgloseType.Create();
j:=0;
query2.First;
while not (query2.Eof) do
begin
DetalleDesglose := DetalleType.Create;
DetalleDesglose.Impuesto := ImpuestoType(combobox11.ItemIndex); //IVA, IPSI, IGIC, OTROS
DetalleDesglose.ClaveRegimen := GetOperationTypeFromCode('_'+copy(ComboBox3.text,1,2));
if (AdvOfficeCheckBox3.Checked) or (ComboBox6.ItemIndex=8) then //Inversión del sujeto pasivo
DetalleDesglose.CalificacionOperacion := CalificacionOperacionType.S2
else
DetalleDesglose.CalificacionOperacion := CalificacionOperacionType.S1;
DetalleDesglose.BaseImponibleOimporteNoSujeto := cambiaen(formatfloat('0.00',VeriFactuForm.query2.FieldByName('base_e').asfloat),',','.');
if ComboBox6.ItemIndex=9 then //No sujeta (no se incluyen las cuotas de iva)
begin
DetalleDesglose.CalificacionOperacion := CalificacionOperacionType(2);
end
else
if ComboBox6.ItemIndex=10 then //No sujeta (no se incluyen las cuotas de iva)
begin
DetalleDesglose.CalificacionOperacion := CalificacionOperacionType(3);
end
else // Sujeta + Inversión sujeto pasivo (cuotas iva a cero)
if DetalleDesglose.CalificacionOperacion=CalificacionOperacionType.S2 then
begin
DetalleDesglose.TipoImpositivo := '0';
DetalleDesglose.CuotaRepercutida := '0';
end
else
begin //No exenta/sujeta
DetalleDesglose.TipoImpositivo := cambiaen(VeriFactuForm.query2.FieldByName('porciento').asstring,',','.');
DetalleDesglose.CuotaRepercutida := cambiaen(formatfloat('0.00',VeriFactuForm.query2.FieldByName('IVA_E').asfloat),',','.');
if (Table1.fieldbyname('IVA_RE').asstring='R') and (query2.FieldByName('porciento_re').asfloat>0) then
begin
DetalleDesglose.TipoRecargoEquivalencia := cambiaen(formatfloat('0.00',query2.FieldByName('porciento_re').asfloat),',','.');
DetalleDesglose.CuotaRecargoEquivalencia := cambiaen(formatfloat('0.00',query2.FieldByName('RE_E').asfloat),',','.');
end;
end;
// colocar el desglose en la lista
SetLength(ListaDesglose, j+1 );
ListaDesglose[j] := DetalleDesglose;
inc(j);
query2.Next;
end;
// asignar los desgloses de IVA al objeto de factura
F.RegistroAlta.Desglose:= ListaDesglose;
Ese archivo XML ya está mal guardado, con los nodos <item>, así que creo que el problema en la forma de guardarlos. Para guardar el RF como XML uso esta función que alguien publicó en el foro: Código:
function ExtraerXMLdelRF(RegistroFactura: RegistroFacturaType): String;
var
RootNode, NewNode: IXMLNode;
RefId, Swdsl: string;
MyXML: TXMLDocument;
Resultado: string;
MOPToSoapDomConvert: TOPToSoapDomConvert;
begin
Resultado := '';
MyXML := TXMLDocument.Create(Application);
MOPToSoapDomConvert := TOPtoSoapDomConvert.Create(Application);
try
MyXML.Active := True;
MyXML.Encoding := 'utf-8';
// Creamos nodo raíz neutro
RootNode := MyXML.CreateNode('root');
MOPToSoapDomConvert.Encoding := 'utf-8';
MOPToSoapDomConvert.Options := [
TSOAPConvertOption.soDontSendEmptyNodes,
TSOAPConvertOption.soUTF8EncodeXML,
TSOAPConvertOption.soTryAllSchema,
TSOAPConvertOption.soSendUntyped,
TSOAPConvertOption.soSOAP12
];
Swdsl := 'https://prewww2.aeat.es/static_files/common/internet/dep/aplicaciones/es/aeat/tikeV1.0/cont/ws/SistemaFacturacion.wsdl';
// Aquí es donde se genera el XML sin duplicados
NewNode := RegistroFactura.ObjectToSOAP(RootNode, RootNode, MOPToSoapDomConvert,
'RegistroFactura', Swdsl, 'T',
[ocoDontPrefixNode, ocoDontPutTypeAttr], RefId);
// Reemplazamos el nodo raíz con el generado
MyXML.DocumentElement := NewNode;
MyXML.XML.Text := FormatXMLData(MyXML.XML.Text);
MyXML.XML.SaveToFile(extractfilepath(application.exename)+'VeriFactu/RF'+RegistroFactura.RegistroAlta.RefExterna+'.xml',TEncoding.UTF8); // Provisional
Resultado := MyXML.XML.Text;
// Eliminamos cabecera XML y envoltorios innecesarios si hicieran falta
Resultado := StringReplace(Resultado, '<?xml version="1.0"?>', '', [rfIgnoreCase]);
except
on E: Exception do
begin
Log('Error al guardar el XML: ' + E.Message);
ShowMessage('Error al guardar el XML: ' + E.Message);
Resultado := '';
end;
end;
MyXML.Free;
MOPToSoapDomConvert.Free;
Result := Resultado;
end;
Agradecería cualquier pista, o si alguien usa otra forma de guardar el XML estaría agradecido de estudiarla y ver si me sirve, teniendo en cuenta que después tengo que volver a convertir ese XML en el RF para el envío. Por cierto, aunque el XML tenga esos nodos <item>, los RF se envían sin problema a Hacienda y no da error, pero me preocupa por si en un futuro empiezan a fallar. Última edición por espinete fecha: 20-10-2025 a las 14:33:56. |
|
|
Temas Similares
|
||||
| Tema | Autor | Foro | Respuestas | Último mensaje |
| Restar Campo Generados de SQL | kurono | Varios | 15 | 23-06-2013 09:35:10 |
| Archivos _XXXX.DBF generados por consulta sql | klionsis | Varios | 1 | 08-09-2008 18:05:43 |
| Ficheros generados por delphi.NET | Mariolarr | .NET | 1 | 29-10-2007 19:59:41 |
| Archivos .MAP generados por Delphi | Ana Tudela | Varios | 2 | 26-10-2005 18:44:48 |
| Archivos temporales generados por TQuerys | Balda | Conexión con bases de datos | 0 | 14-04-2005 14:18:29 |
|