XMLDocCopy.XML := XMLDoc.XML ;
XMLDocCopy.Active := true;
Lo que hice fue generar otra ves el CFD en ves de hacerle un copy, te paso el codigo completo de la funcion para que te des una idea:
Código: Seleccionar todo
procedure TFacturaEForm.GeneraCadenaOriginal;
const pipe = '|';
var n,n1,i : integer;
CFDCopy : IXMLComprobante; //Se requiere una copia ya que si se lee el original lo llena de "Null"
s : string;
procedure AgregaDato(atom : string);
begin
if atom <> '' then CadOriginal := CadOriginal + pipe + atom;
end;
begin
CadOriginal := pipe;
//**********************************************************
XMLDocCopy.XML.Text := '<?xml version="1.0" encoding="UTF-8" ?><Comprobante xmlns="http://www.sat.gob.mx/cfd/2"></Comprobante>';
XMLDocCopy.Active := True;
CFDCopy := GetComprobante(XMLDocCopy);
// A PARTIR DE AQUI TIENE QUE ADAPTARSE A TOMAR LOS DATOS DE SU BASE DE DATOS O FORMULARIO O DE DONDE
// TENGAN LA FACTURA "NORMAL", LOS RENGLONES QUE TIENEN UNA {opc} SIGNIFICA QUE (SEGUN EL ANEXO 20) SON
// DATOS OPCIONALES.
// El *unico* dato que entra como parametro es FolioFactura....ya que aqui pueden hacer una consulta SQL
// a una factura que ya este grabada en una base de datos y de ahi ir tomando los valores, es decir pueden usar:
// SQL.Add('select * from mitablafactura where foliofactura=' + IntToStr(FolioFactura));
// SQL.Execute
with CFDCopy do
begin
SetAttribute('xmlns:xsi','http://www.w3.org/2001/XMLSchema-instance');
SetAttribute('xsi:schemaLocation','http://www.sat.gob.mx/cfd/2 http://www.sat.gob.mx/sitio_internet/cfd/2/cfdv2.xsd');
Version := '2.0';
{opc} Serie := OpcC('FacturaE','FolioSerie');
Folio := IntToStr(1234);
Fecha := '2010-01-01T12:12:12'; //<<<<<<<<<<<<<<<<<<<<<REQUIERE TRABAJO AQUI
Sello := ''; //Este dato *no* es opcional, pero se calcula mas adelante...
NoAprobacion := StrToIntDef(OpcC('FacturaE','FolioNoAprobacion'),0);
AnoAprobacion := StrToIntDef(OpcC('FacturaE','FolioAnoAprobacion'),0);
FormaDePago := 'Pago en una sola exhibicion';
NoCertificado := OpcC('FacturaE','CertNo');
{opc Certificado := '';}
{opc CondicionesDePago := '';}
SubTotal := '68.50'; //<<<<<<<<<<<<<<<<<<<<<REQUIERE TRABAJO AQUI
{opc Descuento := '';}
{opc MotivoDescuento := '';}
Total := '79.46'; //<<<<<<<<<<<<<<<<<<<<<REQUIERE TRABAJO AQUI
{opc MetodoDePago := '';}
TipoDeComprobante := 'ingreso';
with Emisor do
begin
Rfc := OpcC('FacturaE','RFC');
Nombre := OpcC('FacturaE','Nombre');
with DomicilioFiscal {alias UbicacionFiscal} do
begin
Calle := OpcC('FacturaE','Calle');
{opc} NoExterior := OpcC('FacturaE','NoExterior');
{opc NoInterior := '';}
{opc} Colonia := OpcC('FacturaE','Colonia');
{opc} Localidad := OpcC('FacturaE','Localidad');
{opc Referencia := '';}
Municipio := OpcC('FacturaE','Municipio');
Estado := OpcC('FacturaE','Estado');
Pais := OpcC('FacturaE','Pais');
CodigoPostal := OpcC('FacturaE','CodigoPostal');
end; {with CFDCopy.Emisor.DomicilioFiscal}
if false then {todo el bloque es opcional, solo se usa si hay sucursales}
{opc} with ExpedidoEn {alias Ubicacion} do
begin
{opc} Calle := '';
{opc} NoExterior := '';
{opc} NoInterior := '';
{opc} Colonia := '';
{opc} Localidad := '';
{opc} Referencia := '';
{opc} Municipio := '';
{opc} Estado := '';
Pais := '';
{opc} CodigoPostal := '';
end; {with CFDCopy.Emisor.ExpedidoEn}
end; {with CFDCopy.Emisor}
with Receptor do
begin
Rfc := Paso2Form.RFCCliente.Text;
Nombre := Paso2Form.NombreCliente.Text;;
with Domicilio {alias Ubicacion} do
begin
{opc} Calle := Paso2Form.CalleCliente.Text;
{opc} NoExterior := Paso2Form.NoExteriorCliente.Text;
{opc NoInterior := '';}
{opc} Colonia := Paso2Form.ColoniaCliente.Text;
{opc} Localidad := Paso2Form.CiudadCliente.Text;
{opc Referencia := '';}
{opc} Municipio := Paso2Form.MunicipioCliente.Text;
{opc} Estado := Paso2Form.EstadoCliente.Text;
Pais := Paso2Form.PaisCliente.Text;
{opc} CodigoPostal := Paso2Form.CodigoPostalCliente.Text;
end; {with CFDCopy.Receptor.Domicilio}
end; {with CFDCopy.Receptor}
with Conceptos do
//AQUI DEBEN USAR UN FOR, REPEAT, WHILE, ETC SEGUN SU BASE DE DATOS
{for n := 1 to maxarticulos do
Repeat .... Until todoslosarticulos
While not EOF do}
begin
with Conceptos.Add do
begin
Cantidad := Paso2Form.Cantidad1.Text;
{opc} Unidad := Paso2Form.Unidad1.Text;
{opc NoIdentificacion := '';}
Descripcion := Paso2Form.Descr1.Text;
ValorUnitario := FloatToStrF(StrToFloatDef(Paso2Form.PU1.Text,0),ffFixed,10,2);
Importe := FloatToStrF(StrToFloatDef(Paso2Form.PT1.Text,0),ffFixed,10,2);
end; {with CFDCopy.Concepto}
with Conceptos.Add do
begin
Cantidad := Paso2Form.Cantidad2.Text;
{opc} Unidad := Paso2Form.Unidad2.Text;
{opc NoIdentificacion := '';}
Descripcion := Paso2Form.Descr2.Text;
ValorUnitario := FloatToStrF(StrToFloatDef(Paso2Form.PU2.Text,0),ffFixed,10,2);
Importe := FloatToStrF(StrToFloatDef(Paso2Form.PT2.Text,0),ffFixed,10,2);
end; {with CFDCopy.Concepto}
with Conceptos.Add do
begin
Cantidad := Paso2Form.Cantidad3.Text;
{opc} Unidad := Paso2Form.Unidad3.Text;
{opc NoIdentificacion := '';}
Descripcion := Paso2Form.Descr3.Text;
ValorUnitario := FloatToStrF(StrToFloatDef(Paso2Form.PU3.Text,0),ffFixed,10,2);
Importe := FloatToStrF(StrToFloatDef(Paso2Form.PT3.Text,0),ffFixed,10,2);
end; {with CFDCopy.Concepto}
end; {with CFDCopy.Conceptos}
with Impuestos do
begin
{opc TotalImpuestosRetenidos := '';}
//Si hay impuesto retenido se debe usar el siguiente bloque:
{ with Retenciones.Add do
begin
Impuesto := 'ISR o IVA';
Importe := 'calculo de la retencion';
end;}
{opc} TotalImpuestosTrasladados := '10.96'; //<<<<<<<<<<<<<<<<<<<<<REQUIERE TRABAJO AQUI
with Traslados.Add do
begin
Impuesto := 'IVA';
Tasa := '16.00';
Importe := '10.96'; //<<<<<<<<<<<<<<<<<<<<<REQUIERE TRABAJO AQUI
end;
//Si necesitan IEPS usen este bloque ::
{ with Traslados.Add do
begin
Impuesto := 'IEPS';
Tasa := 'tasa del impuesto';
Importe := 'valor calculado a partir del subtotal';
end;}
end ; {CFDCopy.Impuestos}
end; {with CFDCopy}
//*********************************************************
// XMLDocCopy.XML := XMLDoc.XML ; //<<<<<<<<<<<<<<ESTO YA NO ES NECESARIO POR QUE SE GENERO
//<<<<<<<<<<< OTRA VES LA FACTURA EN EL XMLDocCopy
XMLDocCopy.Active := true;
CFDCopy := GetComprobante(XMLDocCopy);
with CFDCopy do
begin.........................
GeneraXML, solo que en ves de XMLDoc se cambio por XMLDocCopy y el CFD se cambio por CFDCopy, tambien en el
apartado de folio lo defini manual, por que alli no resive parametros ( Folio := InttoStr(1234); ).
Si me di a entender ? Suerte, Saludos !!!