NOS CAMBIAMOS DE PROVEEDOR DE HOST (POR FIN!) DEBIDO A ELLO SE PERDIERON LAS CLAVES DE ACCESO, USE LA OPCION "Olvide Mi Contraseña" PARA REGISTRAR NUEVAMENTE SU CLAVE


Imagen

DESCARGA SOFTWARE PARA FACTURA ELECTRONICA DE AQUI.
Facturacion, Validacion, Addendas, Librerias de programacion, etc.


ECODEX TIENE ESTOS NUEVOS DATOS DE CONTACTO :
Comercializacion y Ventas - Evelia Vicke evicke@ecodex.com.mx 33-16-03-03-48
Soporte - Humberto Guerrero soporte@ecodex.com.mx 33-34-90-46-03


.

Leer comprobantes no codificados en UTF8

Para los que programamos en Delphi, aqui estan las respuestas
[[ FORO CERRADO DEBIDO A QUE YA LA INFORMACION YA NO ES VIGENTE ]]
Cerrado
s3cr3to
Mensajes: 502
Registrado: Mar Dic 28, 2010 2:12 pm

Leer comprobantes no codificados en UTF8

Mensaje por s3cr3to »

Buen día.

Estoy preparando una aplicación (en Delphi 7) para leer los comprobantes, revisar su vigencia y registrarlos en nuestra BD.
Hasta ahora todo bien, excepto con unos casos donde el comprobante esta codificado de manera diferente a utf-8 (con y sin bom).
Estos vienen codificados como UCS2-L (al menos hasta ahora) creo que estos son Unicode.
Entonces, con este código he logrado identificar los utf-8 que si puedo cargar y procesar.

Código: Seleccionar todo

function UTF8Comprueba (FileName : string): boolean;
var
    Stream: TFileStream;
    bom : array[0..3] of byte;
    flagTest : boolean;
begin
  flagTest:= False;
  Stream := TFileStream.Create(FileName, fmOpenRead or fmShareDenyWrite);
  try
    Stream.ReadBuffer(bom, SizeOf(bom)); //rGet the byte-order mark, if there is one
    if ((bom[0] = $ef) and (bom[1] = $bb) and (bom[2] = $bf))
      or ((bom[0] = $3c) and (bom[1] = $3f) and (bom[2] = $78)) //3C 3F 78 6D
      or ((bom[0] = $3c) and (bom[1] = $63) and (bom[2] = $66)) //60 99 102 100 utf-8 w/o BOM
    then flagTest:= True;  // utf-8
  finally
    Stream.Free;
  end;
  Result:= flagTest;
end;
Con esto cargo el comprobante en un registro:

Código: Seleccionar todo

function LeerDatosCFD (sFileName : string; var vData: TdataCFD) : boolean;
var flag: boolean;
  temp : TStringList;
  XMLDoc1, TimbreXMLDoc : IXMLDocument; //TXMLDocument;
  CFD32 : cfdv32.IXMLComprobante;
  CFD3 : cfdv2030.IXMLComprobante;
  CFD2 : cfdv2030.IXMLComprobante;
  TimbreDatos : TimbreFiscalDigital.IXMLTimbreFiscalDigital;
  AttrNode : IXMLNode;
begin
  flag:= False;

  with vData do begin
    version := '';  Emisor := '';    Receptor := ''; Fecha := '';  FechaTimbrado:= '';
    UUID := '';     Serie := '';       Folio := '';      Total := '';   TotalImpuestosRetenidos := '';
    TotalImpuestosTrasladados := '';    Moneda:= ''; TipoCambio := '';
  end;

  if UTF8Comprueba(sFileName) then
  begin
    try
      temp:= TStringList.Create;
      temp.LoadFromFile(sFileName);
      XMLDoc1:= NewXMLDocument;
      TimbreXMLDoc:= NewXMLDocument;
      XMLDoc1.LoadFromFile(sFileName); // este carga los comprobantes correctos UTF-8 y truena con los unicode

      if pos('version="3.2"', temp.Text) > 0 then
      begin
        XMLDoc1.Active := true;
        CFD32 := cfdv32.GetComprobante(XMLDoc1);
        // obtener complemento...
        AttrNode:= CFD32.Complemento.ChildNodes.FindNode('TimbreFiscalDigital', CFD32.Complemento.FindNamespaceURI('tfd'));
        TimbreXMLDoc.XML.Text:=  UTF8Encode(AttrNode.XML);
        TimbreXMLDoc.Active := true;
        TimbreDatos := GetTimbreFiscalDigital(TimbreXMLDoc);
        with vData do begin
          version := CFD32.version;             Emisor := CFD32.Emisor.Rfc;          Receptor := CFD32.Receptor.Rfc;
          Fecha := CFD32.Fecha;                 UUID := TimbreDatos.UUID;           FechaTimbrado := TimbreDatos.FechaTimbrado;
          Serie := CFD32.Serie;                   Folio := CFD32.Folio;
          Total := CFD32.Total;                   Moneda:= CFD32.Moneda;            TipoCambio:= CFD32.TipoCambio;
          TotalImpuestosRetenidos := CFD32.Impuestos.TotalImpuestosRetenidos;
          TotalImpuestosTrasladados := CFD32.Impuestos.TotalImpuestosTrasladados;
        end;
        flag:= True;
      end //3.2
      else
      if pos('version="3.0"', temp.Text) > 0 then
      begin
        //... blah blah
        flag:= True;
      end //3.0
      else
      if pos('version="2.0"', temp.Text) > 0 then
      begin
        XMLDoc1.Active:= true;
        CFD2 := cfdv2030.GetComprobante(XMLDoc1);
        with vData do begin
          version := CFD2.version;   Emisor := CFD2.Emisor.Rfc;   Receptor := CFD2.Receptor.Rfc;
          Fecha := CFD2.Fecha;       UUID := ''; // no, aqui no hay
          Serie := CFD2.Serie;   Folio := CFD2.Folio;   Total := CFD2.Total;
          TotalImpuestosRetenidos := CFD2.Impuestos.TotalImpuestosRetenidos;
          TotalImpuestosTrasladados := CFD2.Impuestos.TotalImpuestosTrasladados;
        end;
        flag:= True;
      end; // 2.0
    finally
      temp.Free;
    end;
  end;
  Result:= flag;
end;
El problema no se como leer y decodificar los comprobantes no UTF-8. sin que truene en: XMLDoc1.LoadFromFile(sFileName);
¿Alguien que puede compartir algún tip-truco-código en Delphi7 para leer estos archivos? para así obtener los datos del comprobante.
Hasta ahora, los tengo que abrir en notepad++ y convertir a utf8... algo bastante "problematico" para los usuarios.

Saludos y gracias de antemano.
Adjuntos
UCS2-LE_wo_BOM.xml
con datos ficticios.
(8.93 KiB) Descargado 667 veces
Cerrado