Página 1 de 1

Addenda Chrysler

Publicado: Jue Dic 13, 2012 4:16 pm
por fcobanda
Hola dado

estoy en la fase de certificacion de la addenda PPY de Chrysler, pero tengo un detalle que no puedo resolver, ojala y tu me puedas ayudar

el detalle es que la addenda tiene el nodo llamado factura el cual debera llevar el prefijo PPY, el problema es que no en todo me pone el prefijo en todos los elementos, la manera de como lo estoy haciendo es :

- Despues del proceso normal de la generacion del CFD normal, genero un archivo ya sellado.

- el archivo XML ya sellado lo mando como parametro a una DLL que se encargara de pegar la Addenda y lo regresara completo al modulo principal

- dentro del modulo DLL de la addenda lo hago da la siguiente forma:

Código: Seleccionar todo

function Generar_Addenda(PathCFD : String; ValidaOnly : Integer) : Integer;
const
  xmlns = 'xmlns=""';             (* Cadena String a Borrar, (se genera al obtener la interaz Factura) *)
var
  XMLFactura : IXMLDocument;
  Factura : IXMLFactura;
  CFD : TCFD;
begin

  Try
    CFD := TCFD.Create(cfdV22);       // AQUI CREO UNA INSTANCIA DEL CFD, PARA TENER LA CLASE COMPLETA 
    CFD.LoadFromFile(PathCFD);       // AQUI CARGO EL XML YA SELLADO, LISTO PARA PEGAR LA ADDENDA

    XMLFactura := TXMLDocument.Create(Nil);
    XMLFactura.Active := True;

    Factura := GetFactura(XMLFactura);

// ************* PERSONALIZAR ADDENDA CHRYSLER PPY  **********************             AQUI LLENO LA ADDENDA CON LOS DATOS DE LA BASE DE DATOS 
    With Factura do
     begin
       TipoDocumento := cds_cliente.FieldByName('TipoDocumento').AsString;
       TipoDocumentoFiscal := cds_Cliente.FieldByName('TipoDocumentoFiscal').AsString;    
       Version := cds_Cliente.FieldByName('Version').AsString;
      ......
      .....
    end;

    FACTURA.OwnerDocument.Options := [doAutoPrefix];


    CFD.Datos.Addenda.ChildNodes.Add(Factura);

    Factura.SetAttributeNS('xmlns:PPY','', 'http://www.dfdchryslerdemexico.com.mx/Addenda/PPY');
    Factura.Attributes['xsi:schemaLocation'] :=  'http://www.dfdchryslerdemexico.com.mx/Addenda/PPY http://www.dfdchryslerdemexico.com.mx/Addenda/PPY/PPY.XSD';

    CFD.SaveToFile('C:\Paso\CFD_PRUEBA_ADDENDA_CHRYSLER.XML');
  Finally
     ......
     ......

  End;

los cambios que hice dentro de la interfaz Intf_PPY que hice fueron los siguientes, agregar el prefijo PPY en le nombre del nodo factura

Código: Seleccionar todo

function Getfactura(Doc: IXMLDocument): IXMLFactura;
function Loadfactura(const FileName: string): IXMLFactura;
function Newfactura: IXMLFactura;

const
  TargetNamespace =
   'http://www.dfdchryslerdemexico.com.mx/Addenda/PPY'; // xsi:schemaLocation="http://www.dfdchryslerdemexico.com.mx/Addenda/PPY http://www.dfdchryslerdemexico.com.mx/Addenda/PPY/PPY.XSD"';

implementation

{ Global Functions }

function Getfactura(Doc: IXMLDocument): IXMLFactura;
begin
  Result := Doc.GetDocBinding('PPY:factura', TXMLFactura, TargetNamespace) as IXMLFactura;
end;

function Loadfactura(const FileName: string): IXMLFactura;
begin
  Result := LoadXMLDocument(FileName).GetDocBinding('PPY:factura', TXMLFactura, TargetNamespace) as IXMLFactura;
end;

function Newfactura: IXMLFactura;
begin
  Result := NewXMLDocument.GetDocBinding('PPY:factura', TXMLFactura, TargetNamespace) as IXMLFactura;
end;
y esto es lo que me resulta, con los nodos nota, otroscargos, part sin prefijo, pero si con el namespace incluido dentro de ellos

Código: Seleccionar todo

<Addenda>
		<PPY:factura tipoDocumento="PPY" TipoDocumentoFiscal="FA" version="1.0" serie="A" folioFiscal="451" fecha="2012-06-20" montoTotal="9960.98" referenciaProveedor="A 451" xmlns:PPY="http://www.dfdchryslerdemexico.com.mx/Addenda/PPY" xsi:schemaLocation="http://www.dfdchryslerdemexico.com.mx/Addenda/PPY http://www.dfdchryslerdemexico.com.mx/Addenda/PPY/PPY.XSD">
			<PPY:moneda tipoMoneda="USD" tipoCambio="1.0000"/>
			<PPY:proveedor codigo="20215" nombre="NOMBRE DE LA EMPRESA S.A. DE C.V."/>
			<PPY:destino codigo="8476" nombre="PLANTA DE MOTORES 4 CILINDROS - SALTILLO"/>
			<nota xmlns="http://www.dfdchryslerdemexico.com.mx/Addenda/PPY">Addenda de Prueba</nota>
			<otrosCargos xmlns="http://www.dfdchryslerdemexico.com.mx/Addenda/PPY" codigo="V6" monto="1373.93"/>
			<PPY:partes>
				<part xmlns="http://www.dfdchryslerdemexico.com.mx/Addenda/PPY" numero="123456" cantidad="1.0000" unidadDeMedida="EA" precioUnitario="8587.0500" montoDeLinea="8587.05">
					<references ordenCompra="XYZ6675" releaseRequisicion="XYZ4218000" ammendment="A"/>
					<nota>Probando Addenda</nota>
				</part>
			</PPY:partes>
		</PPY:factura>
	</Addenda>
Ojala puedas ayudarme a encontrar el error que estoy cometiendo o otra manera de hacerlo, te adjunto el esquema PPY.

Gracias

Re: Addenda Chrysler

Publicado: Jue Dic 13, 2012 4:33 pm
por Dado
Estas usando Delphi XE/XE2 verdad?

Es el mismo problema que tengo y por el que no he cambiado a ese compilador y no he podido resolverlo.

Re: Addenda Chrysler

Publicado: Vie Dic 14, 2012 10:40 am
por fcobanda
Asi es estoy usando Delphi XE2.
entonces tu crees que no hay cura para este mal por el momento?

Gracias

Re: Addenda Chrysler

Publicado: Vie Dic 14, 2012 10:52 am
por Dado
Yo no he encontrado como, lo raro que en las 3 o 4 ocasiones en las que me meto a ver este asunto no he encontrado NADA en internet, ni siquiera una queja de alguien con un problema similar

Y solo pasa en los nodos que se agregan con el metodo ADD

La ultima opcion (y que probe pero no me gusto) es usar las instrucciones primitivas del objeto TXMLDocument, es decir algo asi como

AddChild('PPY:NombreDelNodo')

y Luego atributo por atributo

SetAttribute('nombreatributo','valor')

Pero es muy laborioso y enredado

Re: Addenda Chrysler

Publicado: Vie Dic 14, 2012 6:00 pm
por fcobanda
Gracias Dado

Pues voy a seguir buscando en internet, lo malo es que ya se hizo super-urgente esto,
te pido por favor si encuentras algo, me lo pases, y si yo le encuentro te lo hago llegar

Gracias

Re: Addenda Chrysler

Publicado: Vie May 24, 2013 1:22 pm
por jassivg
Que tal, solo para saber si hubo alguna solución al respecto, ya que estoy teniendo el mismo problema,

De antemano gracias, Saludos

Re: Addenda Chrysler

Publicado: Mié Jun 05, 2013 12:37 pm
por jassivg
Que tal, espero les sirva a los compañeros del foro.

El problema está en que la unidad XMLDoc de Delphi cambió la función TXMLNode.AddChild

Delphi 2006:
if Assigned(NSDecl) then
NodeName := GetPrefixedName(TagName, NamespaceURI)

Delphi XE3
if Assigned(NSDecl) and GenPrefix then
NodeName := GetPrefixedName(TagName, NamespaceURI)

Si se fijan ahora utiliza el parámetro para saber si genera ó no el prefijo, lo cual es correcto, ya que antes se tenía el problema de que si querías agregar nodos con un prefijo diferente no podías porque siempre agregaba el default, independientemente de que el parámetro fuera True ó False,

Entonces la unidad que genera el XML Data Binding, utiliza el siguiente código para agregar nodos:

function TXMLAnexos.Add(const Anexo: WideString): IXMLNode;
begin
Result := AddItem(-1);
Result.NodeValue := Anexo;
end;

y la función AddItem, tiene el siguiente código:

function TXMLNodeCollection.AddItem(Index: Integer): IXMLNode;
begin
if ItemTag = '' then
XMLDocError(SMissingItemTag);
Result := AddChild(ItemTag, ItemNS, False, Index);
end;

Si se fijan siempre manda llamar a la función AddChild con el parámetro 3 en False, y como ahora el AddChild si toma en cuenta este parámetro, pues lo genera sin el Prefijo.

Solución que encontré: Mandar llamar directamente la función AddChild, en lugar de AddItem, pero con el parámetro en True así:

function TXMLAnexos.Add(const Anexo: WideString): IXMLNode;
begin
Result := AddChild(ItemTag, ItemNS, True, -1);
Result.NodeValue := Anexo;
end;

Esto mismo hay que hacer con todos los nodos donde aplique, tanto en el .Add como en el .Insert, y ya con eso funciona correctamente.

Creo que el detalle está en que corrigieron el XMLDoc, pero no cambiaron el Wizard del XML Data Binding.

Cualquier otra cosa que pueda ayudar, con gusto,

Saludos

Re: Addenda Chrysler

Publicado: Jue Ene 16, 2014 4:38 pm
por ranaya
Gracias por tu Información jassivg me fue de mucha ayuda.

Saludos.