Re: Codigo Fuente de Mdo Libre en Delphi distinto a version
Publicado: Mié Ago 25, 2010 9:03 am
El error de los caracteres especiales viene de FacturaE, en la funcion Generar la cadena Original, cuando copia el XMLDOC :
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:
de ahi para abajo todo lo de mas lo deje igual, si te fijas es exactamente el mismo codigo que se uso en la funcion
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 !!!
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 !!!