Imagen

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


CARTA PORTE V3.1

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


.

Depurar XML (quitar addendas previas y otros atributos)

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 1:12 pm

Depurar XML (quitar addendas previas y otros atributos)

Mensaje por s3cr3to »

Mr DADO, buen día.
Continuo depurando mis XMLs.
Tengo unas dudas con el código de la addenda soriana, ojala tengas tiempo de contestarlas (ojala sean utiles para muchos más).

Si usando mi aplicacion se inserta la addenda a un documento y luego alguien la añade de nuevo (por error) porque no se fijo o como fuera (ya me paso esto a mi).
  • ¿Como puedo hacer que al añadir la addenda quite todas las addendas previamente registradas? (se esta insertando la addenda cada vez).
:::Ahora bien, si mas adelante adquiero codigo de otras adendas:
Voy a usar el RFC del receptor para permitir o negar añadir la addenda "x" en este caso soriana.
  • ¿Ademas del RFC del receptor, que otra cosa puedo usar para determinar cual addenda tiene el XML?
  • Si puedo detectar que el XML trae addenda ¿Puedo determinar cual es (soriana, femsa, etc)?
Seria ideal poder detectar al cargar el XML que este ya tiene una addenda (soriana) insertada, así podría desactivar el botón de añadir la addenda y activar otro que sirviera para quitar la addenda previa, al confirmar el usuario esto, reactivaria el botón de añadir addenda:

Código: Seleccionar todo

Cargar XML
IF ExisteAddendaX //revisa todo tipo de addendas
BEGIN
   Desactiva_Añadir_Addenda;
   Activa_Borrar_Addenda;
END
ELSE BEGIN
   Activa_Añadir_Addenda;
   Desactiva_Borrar_Addenda;
END
Gracias a tu consejo logre depurar el XML con:

Código: Seleccionar todo

FacturaEForm.CFD.SetAttribute('xmlns:basura',null);
FacturaEForm.CFD.SetAttribute('xsi:schemaLocation','http://www.sat.gob.mx/cfd/2 http://www.sat.gob.mx/sitio_internet/cfd/2/cfdv2.xsd');
Me pregunto si:
  • Existe algun glosario que me puedas proporcionar para poder hacer lo mismo con otros atributos que estan quedando como basura y me empiezan a ocasionar problemas?.
Como en el caso de "ISR retenido en cero" que Soriana no quiere recibir.
Digamos por ejemplo que si quiero quitar en las retenciones lo siguiente:

Código: Seleccionar todo

<Impuestos>
  <Retenciones>
   <Retencion importe="0.0" impuesto="ISR"/>
   <Retencion importe="0.0" impuesto="IVA"/>
  </Retenciones>
  <Traslados>
   <Traslado importe="0.00000" impuesto="IVA" tasa="0.0"/>
  </Traslados>
</Impuestos>
y dejarlo asi (esto si lo acepto soriana):

Código: Seleccionar todo

<Impuestos>
  <Retenciones>
   <Retencion importe="0.0" impuesto="IVA"/>
  </Retenciones>
  <Traslados>
   <Traslado importe="0.00000" impuesto="IVA" tasa="0.0"/>
  </Traslados>
</Impuestos>
¿Esto podria ser quizas así?:

Código: Seleccionar todo

FacturaEForm.CFD.SetAttribute('Retenciones',null);
FacturaEForm.CFD.SetAttribute('Retenciones','Retencion importe="0.0" impuesto="IVA"');
(caray, ahora pregunte y no probe la idea del codigo, disculpa).
Claro, al final debo de re-sellar el XML.
Si, es un gran lio... jeje
Ya me estoy tardando en desarrollar un connector propio a SQL Server (usando vistas).
Avatar de Usuario
Dado
Mensajes: 15981
Registrado: Mar Jul 06, 2010 7:56 pm

Re: Depurar XML (quitar addendas previas y otros atributos)

Mensaje por Dado »

  • ¿Como puedo hacer que al añadir la addenda quite todas las addendas previamente registradas? (se esta insertando la addenda cada vez).
Para quitar cualquier otra addenda usa el metodo Addenda.ChildNodes.Clear
  • ¿Ademas del RFC del receptor, que otra cosa puedo usar para determinar cual addenda tiene el XML?
Por desgracia el RFC no es suficiente, por ejemplo Soriana tiene 3 tipos de addenda, Femsa tiene dos (me parece) el IMSS tiene 60 (si, sesenta)
[*]Si puedo detectar que el XML trae addenda ¿Puedo determinar cual es (soriana, femsa, etc)?[/list]
Lo que tienes que hace es ver el nombre (ChildNode.Name) de la addenda y hacer una tabla, si el nombre es (lo voy a decir de memoria, no lo tomes literal) DSCargaRemision=Soriana; addenda=Femsa (si, escogieron el PEOR nombre para su addenda), Document=AMECE, PMT=Volkswagen (insisto, estoy diciendo de memoria los nombres, pero es solo por poner un ejemplo)
IF ExisteAddendaX //revisa todo tipo de addendas

Código: Seleccionar todo

if Addenda.Childnode.count > 0 // hay addenda, cual? todavia no sabemos
   case Addenda.Childnod[0].name of  //PSEUDOCODIGO, SE QUE EN case no acepta strings......
      'DSCargaRemision' : tenemos addenda remision soriana
      etc
Gracias a tu consejo logre depurar el XML con:
De verdad que me debes un tequila, te voy a mandar mi direccion...... ;)
  • Existe algun glosario que me puedas proporcionar para poder hacer lo mismo con otros atributos que estan quedando como basura y me empiezan a ocasionar problemas?.
Como en el caso de "ISR retenido en cero" que Soriana no quiere recibir.
Pues no, no hay un listado de "si tiene esto, haga aquello.....", es estudiarle mucho a los metodos y propiedades del XML....
Digamos por ejemplo que si quiero quitar en las retenciones lo siguiente:
En general, para quitar UN ATRIBUTO debes asignarle null (como en "basurita") para quitar un nodo sin importar en que nivel este debes usar ChildNodes.Clear; esto borra el nodo y todos sus hijos.
ADDENDAS? VALIDACION? CODIGO PARA PROGRAMAR TU PROPIA SOLUCION? TODO LO TENEMOS EN WWW.VALIDACFD.COM VISITANOS !!
s3cr3to
Mensajes: 502
Registrado: Mar Dic 28, 2010 1:12 pm

Depuracion de XML - al fin entendi.... Gracias!

Mensaje por s3cr3to »

Mr DADO.
Que decir? solo: GRACIAS

Deje de venir unos dias al foro, intende decompilar la aplicacion de mi proveedor para ver que rayos esta haciendo y si, logre ver el codigo definitivamente no tienen ganas de trabajar, Ya hasta le propuse algunas correcciones y mejoras.. pero no, no quieren cooperar.

En fin, con la gran explicación del post anterior, si voy a lograr mi cometido, añadir la addeda soriana sin duplicarla y sin tener que editar el XML a mano.

Saludos y muchas gracias.

P.S. Pues hablando de Tequila, si te das un paseo por el estado 18 me avisas por correo. Creo que podemos intercambiar recetas con Tequila.
P.S.2 Definitivamente es necesario entender el XML, ayer precisamente estuve buscando añadir un dato mas a la addenda (PedidoEmitidoProveedor) y no lograba saber como ni donde, al final entendi y gracias a que tu codigo esta bien estructurado lo consegui, aunque en un XML (de varios) me puso un error el validador, voy a investigar que o porque surge ese mensaje.
::: Bueno, y es que nadie nace sabiendo.
s3cr3to
Mensajes: 502
Registrado: Mar Dic 28, 2010 1:12 pm

Lo consegui!!!

Mensaje por s3cr3to »

Dado.
Ok, estaba a punto de gritar "no puedo" pero ya logre quitar la basura adicional en mi XML.

Dejo aqui mi resultado por si le sirve a alguien mas.

Código: Seleccionar todo

    if FacturaEForm.CFD.Impuestos.Retenciones.HasChildNodes then
    begin
      FacturaEForm.CFD.Impuestos.Retenciones.Clear; //¿sera necesario aún? -- mi primer intento deja el atributo <Retenciones> sin hijitos
      FacturaEForm.CFD.Impuestos.ChildNodes.Remove( FacturaEForm.CFD.Impuestos.Retenciones );//aqui esta la magia
    end;
Con esto ya queda limpiecito mi XML en la parte de impuestos.

Código: Seleccionar todo

<Impuestos>
 <Traslados>
  <Traslado importe="0.00000" impuesto="IVA" tasa="0.0"/>
 </Traslados>
</Impuestos>
Saludos
s3cr3to
Mensajes: 502
Registrado: Mar Dic 28, 2010 1:12 pm

pues dice mi mamá que siempre no

Mensaje por s3cr3to »

ok. el titulo lo dice todo, el tequila me hizo escribirlo asi.

ya llevo todo el dia y ya inicio el 27 de enero y nomas no puedo entenderlo:
Mi proveedor por fin me mando el codigo del conector corregido (sin basura: adenda balin y sin retenciones) en el xml.
Ahora quiero añadir la adenda de soriana sin mas ni mas ¿y que pasa?
el xml esta asi:

Código: Seleccionar todo

	<Impuestos>
		<Traslados>
			<Traslado importe="0.00000" impuesto="IVA" tasa="0.0"/>
		</Traslados>
	</Impuestos>
</Comprobante>
y al usar el codigo original para añadir la adenda... sin "tocar" nada (mas que los datos que requiero para la adenda extemporanea) me deja esto:

Código: Seleccionar todo

<Impuestos>
		<Traslados>
			<Traslado importe="0.00000" impuesto="IVA" tasa="0.0"/>
		</Traslados>
		<Retenciones/></Impuestos>
	<Addenda><DSCargaRemisionProv>
Esto no le gusta a soriana: <Retenciones/> No se de donde y porque lo añade... por favor DADO.. puedes decirme que esta pasando?
Ya le busque y nomas no logro entender porque añade ese atributo/nodo/cosa-rara en los impuestos.
Total que ya me avente hasta 7 tequilas desesperado y no, la solucion no esta en la botella. :mrgreen:

Saludosssssshhhh good nite.
ahhh anexo un extracto de "FacturaE" (para mostrar que no "cargo" las retenciones)

Código: Seleccionar todo

procedure TFacturaEForm.GeneraCadenaOriginal;
const pipe = '|';
var n,n1 : integer;
	CFDCopy : IXMLComprobante; //Se requiere una copia ya que si se lee el original lo llena de "Null"

	procedure AgregaDato(atom : string);
	begin
		if atom <> '' then CadOriginal := CadOriginal + pipe + atom;
	end;
begin
	CadOriginal := pipe;
	XMLDocCopy.XML := XMLDoc.XML;
	XMLDocCopy.Active := true;
	CFDCopy := GetComprobante(XMLDocCopy);

	with CFDCopy do
	begin
         ...
    //Impuestos.
		with Impuestos do
		begin
		    Retenciones.Clear; //con y sin añade <Retenciones/>
		          (*// Soriana no quiere las retenciones
		            with Retenciones do
		            for n:= 0 to ChildNodes.Count-1 do
		            if ChildNodes[n].NodeType = ntElement then
		            begin
		              AgregaDato(Retencion[n].Impuesto); AgregaDato(Retencion[n].Importe);
		            end; {with CFD.Impuestos.Retenciones}
		            AgregaDato(TotalImpuestosRetenidos);
		          *)
			with Traslados do
			for n:= 0 to ChildNodes.Count-1 do
			if ChildNodes[n].NodeType = ntElement then
			begin
				AgregaDato(Traslados[n].Impuesto); AgregaDato(Traslados[n].Tasa); AgregaDato(Traslados[n].Importe);
			end; {with CFD.Impuestos.Traslados}

			//AgregaDato(TotalImpuestosTrasladados);
		end; {with CFD.Impuestos}

		AgregaDato(pipe);
	end; {with CFD}
....
Quisiera añadir todo el codigo pero .. ¿te lo envio por correo?

Saludos ... y con (mucho) sueño
S 12:37 (GMT -7)
ya desesperado intente esto pero no funciono tampoco:

Código: Seleccionar todo

unit FacturaE;
...
procedure TFacturaEForm.ExportaXML(FName : string);
begin
try
	RemplazaCad('','<Retenciones/>',XMLDoc.XML.Text);
	XMLDoc.SaveToFile(FName);
  except
    // podria pasar algun error... si intento grabar en un lugar sin permiso de escritura.
    ;
  end;
end;
Avatar de Usuario
Dado
Mensajes: 15981
Registrado: Mar Jul 06, 2010 7:56 pm

Re: Depurar XML (quitar addendas previas y otros atributos)

Mensaje por Dado »

Paso3.pas quita la linea 85:

Código: Seleccionar todo

  Memo7.Lines.Add('Remision= '+sRemisionAvion);
  Memo7.Lines.Add('CFD = '+ Serie + Folio);
  Memo7.Lines.Add('Total = '+ Total);
  Memo7.Lines.Add('');
//  Memo7.Lines.Add('nodo retenciones = '+ Impuestos.Retenciones.NodeName); <<<<---Quita esta linea
  Memo7.Lines.Add('');
  b2AgregaAdenda.Enabled:= True;
Quise poner aqui la respuesta porque hay un detalle importante.

LA INTERFACE DE DELPHI tiene un .....mmmh bug?......no se si deberia llamarse bug, la cosa es que SI LEES UN NODO O ATRIBUTO que no existe entonces Delphi LO INSERTA AUTOMATICAMENTE.

Cuando estabas leyendo Impuestos.Retenciones.NodeName AUTOMATICAMENTE se genera ese nodo !!!
ADDENDAS? VALIDACION? CODIGO PARA PROGRAMAR TU PROPIA SOLUCION? TODO LO TENEMOS EN WWW.VALIDACFD.COM VISITANOS !!
s3cr3to
Mensajes: 502
Registrado: Mar Dic 28, 2010 1:12 pm

Master "the force is strong with this one"

Mensaje por s3cr3to »

DADO escribió:Paso3.pas quita la linea 85:
Quise poner aqui la respuesta porque hay un detalle importante.

LA INTERFACE DE DELPHI tiene un .....mmmh bug?......no se si deberia llamarse bug, la cosa es que SI LEES UN NODO O ATRIBUTO que no existe entonces Delphi LO INSERTA AUTOMATICAMENTE.

Cuando estabas leyendo Impuestos.Retenciones.NodeName AUTOMATICAMENTE se genera ese nodo !!!
Santos bugs de implementación Batm-- DADO-man!!
Que barbaridad con este "feature" en Delphi.... ¿pasara lo mismo en Lazarus (time to test/change) ?
Y con razón las primeras veces no me "aparecia" eso (no sabia como "leer" los atributos).

:::I wonder if... digo, me pregunto si, ¿sera posible "bloquear" al XML/interface en Delphi para que no haga esta "maravillosa" accion?, se que en algun momento voy a necesitar procesar xml con retenciones (mmmh mas me vale que lo compruebe).

Lo dicho, en tu proxima visita al estado 18... no te salvas de unos buenos tequilazos...

Mis respetos Master Jedi,
"the force is strong with this one"
Este Padawan esta orgulloso de recibir tus enseñanzas.
Última edición por s3cr3to el Jue Ene 27, 2011 5:02 pm, editado 1 vez en total.
Avatar de Usuario
Dado
Mensajes: 15981
Registrado: Mar Jul 06, 2010 7:56 pm

Re: Depurar XML (quitar addendas previas y otros atributos)

Mensaje por Dado »

:D
ADDENDAS? VALIDACION? CODIGO PARA PROGRAMAR TU PROPIA SOLUCION? TODO LO TENEMOS EN WWW.VALIDACFD.COM VISITANOS !!
Cerrado