Hola,
Me di cuenta que el error de los caracteres especiales me lo marcaba al momento de Generar la cadena Original, cuando cuando copia el XMLDOC :
XMLDocCopy.XML := XMLDoc.XML ;
XMLDocCopy.Active := true;
Al momento de activarlo me marcaba el error, lo que hice fue, en ves de hacer una copia de los XMLDoc, genere otro exactamente igual al XMLDoc en el XMLDocCopy, algo asi :
Código: Seleccionar todo
XMLDocCopy.XML.Text := '<?xml version="1.0" encoding="UTF-8" ?><Comprobante xmlns="http://www.sat.gob.mx/cfd/2"></Comprobante>';
XMLDocCopy.Active := True;
CFD := 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 CFD 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 CFD.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 CFD.Emisor.ExpedidoEn}
end; {with CFD.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 CFD.Receptor.Domicilio}
end; {with CFD.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 CFD.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 CFD.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 CFD.Concepto}
end; {with CFD.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 ; {CFD.Impuestos}
end; {with CFD}
Lo deje todo exactamente igual, solo en el parametro de folio, se lo tube que pasar manual como se ve en el codigo:
Folio := IntToStr(1234);
Lo corri y no me marco ningun error, me genero todo con caracteres especiales
no creo que afecte en nada hacer este procedimiento verdad ??? ahora solo me falta validarlo, me puedes decir donde lo valido ??
Gracias.