Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > Internet
Registrarse FAQ Miembros Calendario Guía de estilo Buscar Temas de Hoy Marcar Foros Como Leídos

Grupo de Teaming del ClubDelphi

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 03-05-2019
APO APO is offline
Miembro
 
Registrado: feb 2008
Posts: 121
Poder: 17
APO Va por buen camino
Al consumir WebService me da Accessviolation al acceder al resultado

Hola,
Lo que pretendo es consumir un Webservice enviando un XML (generado con los métodos ya importados del WSDL) y luego obtener el XML de respuesta para saber si es aceptado o rechazado. El caso es que logro consumir correctamente el Webservice, pero a la hora de acceder a la respuesta me da un error Accessviolation. Seguramente no estoy inicializando o creando correctamente alguna clase o lo que sea, pero llevo ya varios días probándolo de todas las maneras y no logro solucionarlo. Os pongo en detalle lo que hago a ver si alguien me puede ayudar.

Primero importo el WSDL de la siguiente dirección:
https://www3.agenciatributaria.gob.e...s/Ie215V1.wsdl

Esto genera una unidad en Delphi para consumir el Webservice, pongo solamente la parte que interesa para obtener el resultado:

Código Delphi [-]
  
Ie215V1 = interface(IInvokable)
  ['{AC981E05-A0BD-5252-1FB3-FB4E248F1318}']

    // Cannot unwrap: 
    //     - Output part does not refer to an element
    //     - Input element wrapper name does not match operation's name
    function  Ie215V1(const Ie215V1Ent: Ie215): Ie215V1SalType; stdcall;
  end;

function GetIe215V1(UseWSDL: Boolean=System.False; Addr: string=''; HTTPRIO: THTTPRIO = nil): Ie215V1;

La función GetIe215V1 devuelve una clase TRemotable que es la que contiene el resultado del Webservice y a la que no logro acceder. La clase es esta:

Código Delphi [-]
  Ie215V1SalType = class(TRemotable)
  private
    FIe201: Ie201;
    FIe201_Specified: boolean;
    FIe204: Ie204;
    FIe204_Specified: boolean;
    procedure SetIe201(Index: Integer; const AIe201: Ie201);
    function  Ie201_Specified(Index: Integer): boolean;
    procedure SetIe204(Index: Integer; const AIe204: Ie204);
    function  Ie204_Specified(Index: Integer): boolean;
  public
    constructor Create; override;
    destructor Destroy; override;
  published
    property Ie201: Ie201  Index (IS_OPTN or IS_REF) read FIe201 write SetIe201 stored Ie201_Specified;
    property Ie204: Ie204  Index (IS_OPTN or IS_REF) read FIe204 write SetIe204 stored Ie204_Specified;
  end;

Y este es el código que utilizo para consumir el Webservice:
Código Delphi [-]

procedure TfrmSIANE.Ie215_PresentacionAlbaranCirculacion;
var
   XMLEnvio: Ie215;
   XMLRespuesta: Ie215V1SalType;
begin
   //Relleno los datos para consumir el WebService
   XMLEnvio:=Ie215.Create;
   XMLEnvio.Id:='20190503000001';
   XMLEnvio.NifDeclarante:='11111111H';
   XMLEnvio.NombreDeclarante:='NOMBRE DEL DECLARANTE';
…

   //Aquí llamo a la función para consumir el WebService
   XMLRespuesta:=GetIe215V1(True,'',HTTPRIO1).Ie215V1(XMLEnvio);

   //Proceso el resultado
   if XMLRespuesta.Ie201.Cuerpo.AlbaranVER.DatosAceptacion.CRE)<>'' then   --> Esta es la línea que me da AccessViolation 
   begin
      //...
   end;
end;

Por favor, si alguien puede arrojar luz sobre este tema se lo agradeceré, pero llevo ya atascado con esto varios días y no doy con la solución.
Muchas gracias!!
Responder Con Cita
  #2  
Antiguo 03-05-2019
Avatar de dec
dec dec is offline
Moderador
 
Registrado: dic 2004
Ubicación: Alcobendas, Madrid, España
Posts: 13.107
Poder: 34
dec Tiene un aura espectaculardec Tiene un aura espectacular
Hola a todos,

¿Tal vez tendrías que instanciar la clase antes de llamar a "GetIe215V1"? Es decir:

Código Delphi [-]
XMLRespuesta := Ie215V1SalType.Create();
try
  XMLRespuesta := GetIe215V1(True,'',HTTPRIO1).Ie215V1(XMLEnvio);
finally
  XMLRespuesta.Free();
end;

En todo caso, asegúrate de que la respuesta de "GetIe215V1" es del tipo esperado, por ejemplo, antes de intentar acceder al mismo:

Código Delphi [-]
if (XMLRespuesta is Ie215V1) and (XMLRespuesta.Ie201.Cuerpo.AlbaranVER.DatosAceptacion.CRE) <> '') then
begin
  //...
end;

No estoy seguro de haberte ayudado... pero a lo mejor tomas alguna idea...
__________________
David Esperalta
www.decsoftutils.com
Responder Con Cita
  #3  
Antiguo 03-05-2019
APO APO is offline
Miembro
 
Registrado: feb 2008
Posts: 121
Poder: 17
APO Va por buen camino
Hola dec,
He probado como dices, haciendo el Create, pero me sigue dando el mismo error AcessViolation.

Tanto si pongo el Create como si no, lo raro es que el XMLRespuesta que es de tipo Ie215V1SalType, tiene dos propiedades que son Ie201 y Ie204 y las dos vienen a nil, y por eso me da el accessviolation. Lo que no entiendo es porque vienen a nil, porque he conseguido capturar el XML de respuesta y tiene valor:

Cita:
<?xml version="1.0" encoding="ISO-8859-1"?>
<env:Envelope xmlns:env="http://schemas.xmlsoap.org/soap/envelope/">
<env:Header/>
<env:Body Id="Body">
<Ie204 xmlns:tip="https://www3.agenciatributaria.gob.es/static_files/common/internet/dep/aduanas/es/aeat/adia/avit/ws/tipos.xsd" xmlns:lis="https://www3.agenciatributaria.gob.es/static_files/common/internet/dep/aduanas/es/aeat/adia/avit/ws/listas.xsd" xmlns:cab="https://www3.agenciatributaria.gob.es/static_files/common/internet/dep/aduanas/es/aeat/adia/avit/ws/cab.xsd" xmlns="https://www3.agenciatributaria.gob.es/static_files/common/internet/dep/aduanas/es/aeat/adia/avit/ws/Ie204V1Sal.xsd">
<Cabecera>
<cab:EmisorMensaje>SIANE.ES</cab:EmisorMensaje>
<cab:ReceptorMensaje>11111111H</cab:ReceptorMensaje>
<cab:FechaPreparacion>2019-05-03</cab:FechaPreparacion>
<cab:HoraPreparacion>10:09:49</cab:HoraPreparacion>
<cab:IdentificadorMensaje>20190503100949351618</cab:IdentificadorMensaje>
<cab:IdentificadorRelacionado>201904300000000001</cab:IdentificadorRelacionado>
</Cabecera>
<Cuerpo>
<MensajeRechazo>
<ErrorFuncional>
<CodigoError>12</CodigoError>
<MotivoError>07009-Mensaje YA consumido con anterioridad y rechazado.</MotivoError>
<PosicionError>Cabecera:IdentificadorMensaje</PosicionError>
<ValorOriginal>201904300000000001</ValorOriginal>
</ErrorFuncional>
</MensajeRechazo>
</Cuerpo>
</Ie204>
</env:Body>
</env:Envelope>
Gracias por tu ayuda de todas formas!
Responder Con Cita
  #4  
Antiguo 04-05-2019
Avatar de dec
dec dec is offline
Moderador
 
Registrado: dic 2004
Ubicación: Alcobendas, Madrid, España
Posts: 13.107
Poder: 34
dec Tiene un aura espectaculardec Tiene un aura espectacular
Hola a todos,

El XML de respuesta que muestras en tu último mensaje contiene un error... ¿no tendrá eso que ver? Tú tratas de acceder a algo como "XMLRespuesta.Ie201.Cuerpo.AlbaranVER", pero, en el XML que muestras, no aparece "Ie201", sino "Ie204". Pero, es que además, tampoco parece existir algo como "XMLRespuesta.Ie204.Cuerpo.AlbaranVER"...

Tal vez tengas que comprobar si la respuesta contiene un error, puesto que, al menos en ese caso, el XML no parece ser el que tú esperas.
__________________
David Esperalta
www.decsoftutils.com
Responder Con Cita
  #5  
Antiguo 06-05-2019
APO APO is offline
Miembro
 
Registrado: feb 2008
Posts: 121
Poder: 17
APO Va por buen camino
Hola dec, gracias por tu tiempo.

Sí, el XML de respuesta es correcto que contenga un error. Lo estoy forzando para poder procesar los errores, por eso dice 'Mensaje YA consumido con anterioridad y rechazado.'
El problema lo tengo precisamente con eso, que sí que puedo obtener el XML de respuesta, pero en cambio el objeto que me tiene que devolver el WebService me lo devuelve vacío, a nil.

Lo que devuelve el WebService es la clase Ie215V1SalType :

Código Delphi [-]
  Ie215V1SalType = class(TRemotable)
  private
    FIe201: Ie201;
    FIe201_Specified: boolean;
    FIe204: Ie204;
    FIe204_Specified: boolean;
    procedure SetIe201(Index: Integer; const AIe201: Ie201);
    function  Ie201_Specified(Index: Integer): boolean;
    procedure SetIe204(Index: Integer; const AIe204: Ie204);
    function  Ie204_Specified(Index: Integer): boolean;
  public
    constructor Create; override;
    destructor Destroy; override;
  published
    property Ie201: Ie201  Index (IS_OPTN or IS_REF) read FIe201 write SetIe201 stored Ie201_Specified;
    property Ie204: Ie204  Index (IS_OPTN or IS_REF) read FIe204 write SetIe204 stored Ie204_Specified;
  end;

Y esta a su vez contiene dos propiedades, Ie201 si el mensaje es correcto y Ie204 si el mensaje es rechazado.
Pongo el esquema para que se vea más claro https://ibb.co/D9hjVRY :



En este caso el XML viene rellenado con Ie204 porque viene rechazado. Pero el problema, es la respuesta Ie215V1SalType me viene tanto con el Ie201 y Ie204 a nil. La única manera que puedo acceder a la respuesta es consultando el XML. Si no hay más remedio lo tendré que hacer así, pero lo ideal es poder trabajar con el objeto Ie215V1SalType que proporciona el WebService ya que es mucho más cómodo para acceder a sus valores...

Muchas gracias de nuevo.

Última edición por Casimiro Notevi fecha: 06-05-2019 a las 12:22:39.
Responder Con Cita
  #6  
Antiguo 07-05-2019
kino_ct kino_ct is offline
Registrado
 
Registrado: may 2019
Posts: 3
Poder: 0
kino_ct Va por buen camino
Mismo Problema

Hola APO


He realizado la implementación en Delphi y además desde .Net con c#
Al realizar la llamada Ie215V1, la respuesta devuelta es null, empiezo a pensar que el mensaje que devuelve el servicio no es parseable al objeto (no lo se)...


Por favor, si alguién diera con la solución del problema indicadlo.
Un saludo y gracias
Responder Con Cita
  #7  
Antiguo 08-05-2019
ja_73 ja_73 is offline
Miembro
 
Registrado: abr 2017
Posts: 20
Poder: 0
ja_73 Va por buen camino
me pasa lo mismo

Cita:
Empezado por kino_ct Ver Mensaje
Hola APO


He realizado la implementación en Delphi y además desde .Net con c#
Al realizar la llamada Ie215V1, la respuesta devuelta es null, empiezo a pensar que el mensaje que devuelve el servicio no es parseable al objeto (no lo se)...


Por favor, si alguién diera con la solución del problema indicadlo.
Un saludo y gracias
hola kino_ct
yo estoy haciendo la implementacion en .Net con c# también.
tengo el mismo problema, la respuesta siempre es null.
analizando con wireshark, compruebo que si tengo respuesta, por lo que el problema es que no se puede parsear a objeto.
encontré una página web, donde se puede validar el esquema wsdl

wsdl-analyzer(punto)com

fuí subiendo el equema, y me dice que hay el siguiente error (por si puede servirle a alguien)
Ie215V1SoapBinding
The part of the message 'Salida' references a schema type instead of a schema element.

revisando el archivo Reference.cs del servicio veo lo siguiente en la clase salida

public partial class Salida {

[System.ServiceModel.MessageBodyMemberAttribute(Namespace="", Order=0)]
public WasAvituallamientos.Ie215V1Service.Ie215V1SalType Ie215V1Sal;

public Salida() {
}

public Salida(WasAvituallamientos.Ie215V1Service.Ie215V1SalType Ie215V1Sal) {
this.Ie215V1Sal = Ie215V1Sal;
}
}

el Namespace está vacío, en todas los demás tipos, hay un xsd, pero en este no.
creo que el problema viene por aqui, la duda es que asignamos en el namespace para que pueda parsearlo.
a alguien se le ocurre algo?
saludos.
Responder Con Cita
  #8  
Antiguo 08-05-2019
APO APO is offline
Miembro
 
Registrado: feb 2008
Posts: 121
Poder: 17
APO Va por buen camino
Cita:
Empezado por ja_73 Ver Mensaje
hola kino_ct
yo estoy haciendo la implementacion en .Net con c# también.
tengo el mismo problema, la respuesta siempre es null.
analizando con wireshark, compruebo que si tengo respuesta, por lo que el problema es que no se puede parsear a objeto.
encontré una página web, donde se puede validar el esquema wsdl

wsdl-analyzer(punto)com

fuí subiendo el equema, y me dice que hay el siguiente error (por si puede servirle a alguien)
Ie215V1SoapBinding
The part of the message 'Salida' references a schema type instead of a schema element.

revisando el archivo Reference.cs del servicio veo lo siguiente en la clase salida

public partial class Salida {

[System.ServiceModel.MessageBodyMemberAttribute(Namespace="", Order=0)]
public WasAvituallamientos.Ie215V1Service.Ie215V1SalType Ie215V1Sal;

public Salida() {
}

public Salida(WasAvituallamientos.Ie215V1Service.Ie215V1SalType Ie215V1Sal) {
this.Ie215V1Sal = Ie215V1Sal;
}
}

el Namespace está vacío, en todas los demás tipos, hay un xsd, pero en este no.
creo que el problema viene por aqui, la duda es que asignamos en el namespace para que pueda parsearlo.
a alguien se le ocurre algo?
saludos.

Hola,
En mi caso estoy implementándolo en Delphi XE8 y en la unidad que me genera el WSDL de importación me pone estos namespace en el esquema de salida Ie215V1SalType:
Código Delphi [-]
  
RemClassRegistry.RegisterExternalPropName(TypeInfo(Ie215V1SalType), 'Ie201', '[Namespace="https://www3.agenciatributaria.gob.es/static_files/common/internet/dep/aduanas/es/aeat/adia/avit/ws/Ie201V1Sal.xsd"]');
RemClassRegistry.RegisterExternalPropName(TypeInfo(Ie215V1SalType), 'Ie204', '[Namespace="https://www3.agenciatributaria.gob.es/static_files/common/internet/dep/aduanas/es/aeat/adia/avit/ws/Ie204V1Sal.xsd"]');

Código Delphi [-]
  // ************************************************************************ //
  // XML       : Ie215V1SalType, global, 
  // Namespace : https://www3.agenciatributaria.gob.e...s/Ie215V1.wsdl
  // Serializtn: [xoLiteralParam]
  // Info      : Wrapper
  // ************************************************************************ //

Y algo curioso, es que en la función para consumir el WebService me pone 'Cannot unwrap'. ¿Será por esto que no puede parsearlo correctamente?:

Código Delphi [-]
  Ie215V1 = interface(IInvokable)
  ['{AC981E05-A0BD-5252-1FB3-FB4E248F1318}']

    // Cannot unwrap: 
    //     - Output part does not refer to an element
    //     - Input element wrapper name does not match operation's name
    function  Ie215V1(const Ie215V1Ent: Ie215): Ie215V1SalType; stdcall;
  end;

function GetIe215V1(UseWSDL: Boolean=System.False; Addr: string=''; HTTPRIO: THTTPRIO = nil): Ie215V1;

Revisando la documentación hay dos esquemas de salida, uno para cuando el mensaje es aceptado y otro para cuando es rechazado. Son estos:

El diseño del esquema de salida correcta:
https://www3.agenciatributaria.gob.e...Ie201V1Sal.xsd

El diseño del esquema de salida para los albaranes incorrectos:
https://www3.agenciatributaria.gob.e...Ie204V1Sal.xsd

A ver si entre todos podemos conseguirlo. Gracias!!
Responder Con Cita
  #9  
Antiguo 08-05-2019
APO APO is offline
Miembro
 
Registrado: feb 2008
Posts: 121
Poder: 17
APO Va por buen camino
Este es el PDF donde se encuentra la documentación técnica:

https://www3.agenciatributaria.gob.e...t/ws/Ie215.pdf

Última edición por APO fecha: 08-05-2019 a las 12:09:24.
Responder Con Cita
  #10  
Antiguo 08-05-2019
ja_73 ja_73 is offline
Miembro
 
Registrado: abr 2017
Posts: 20
Poder: 0
ja_73 Va por buen camino
hola APO
no tengo ni idea de delphi, pero supongo que sucederá lo mismo que en .NET
el objeto que tiene que resolver es el Ie215V1SalType que sería el "padre" de Ie201V1Sal y Ie204V1Sal (está en el esquema que pusiste antes)
la definición de Ie215V1SalType está definido dentro de Ie215V1.wsdl, no como los demás que hay un XSD en una url, por ejemplo Ie215V1Ent que en .NET si pone el namespace https://www3.agenciatributaria.gob.e...Ie215V1Ent.xsd
Responder Con Cita
  #11  
Antiguo 09-05-2019
APO APO is offline
Miembro
 
Registrado: feb 2008
Posts: 121
Poder: 17
APO Va por buen camino
Hola de nuevo,

Me han respondido de la AEAT sobre la consulta que les hice respecto a que la respuesta del WebService venía vacía a null. Pongo textualmente lo que me han respondido:

Buenos días:
Hay gente que tiene problemas con que la salida pueda tienes dos tipos de salida. Para eso tenemos diferentes soluciones. Te paso las posibles modificaciones (sobre ejemplos de los esquemas del EMCS) que se pueden realizar sobre los ficheros wsdl's que sabemos que han encontrado y aplicado satisfactoriamente algunas empresas que tuvieron este problema.

La primera, que mejor ha funcionado y que aplicasteis ya en el EMCS, es desplegar los wsdl's cambiando, sobre el fichero wsdl, la definición del mensaje de salida dejándolo de la siguiente forma:

<wsdl:message name="Salida">
<wsdl : part name="Ie215V1Sal1" element="Sal201:Ie201" />
<wsdl : part name="Ie215V1Sal2" element="Sal204:Ie204" />
</wsdl:message>

Con esto, en lugar de hacer referencia al tipo complejo que nosotros tenemos declarado, se definen las salidas como elementos, declarando los 2 posibles elementos raíz que la invocación al Servicio Web puede retornar, con lo que la definición del tipo complejo Ie215V1SalType puede eliminarse del wsdl. Se debe tener en cuenta también que el Servicio Web puede, además, devolver mensajes del tipo SOAP FAULT.

La segunda consiste en el uso de una definición del elemento del tipo 'sequence' cuyos elementos presenten ocurrencias mínimas 0; Dado que el control de respuesta recae en nuestro lado, siempre os aseguramos que solo uno de los dos elementos de la secuencia va a ser devuelto, salvo el caso del SOAP FAULT:
<xs:complexType name="Ie215V1SalType">
<xs:sequence>
<xs:element ref="Sal201:Ie201" minOccurs="0"></xs:element>
<xs:element ref="Sal204:Ie204" minOccurs="0"></xs:element>
</xs:sequence>
</xs:complexType>


Por último, definir un elemento del tipo 'all' con el atributo indicador de las ocurrencias mínimas igual a 0 que da a entender que los elementos hijos (CD815A/CD704A) pueden ser devueltos en cualesquiera orden, pudiendo aparecer los mismos ninguna o una vez; Como antes, dicho control recae en nuestro lado y SIEMPRE os será devuelto uno de los dos, nunca ambos, y nunca ninguno, salvo en el caso particular del SOAP FAULT.
<xs:complexType name="Ie215V1SalType">
<xs:all minOccurs="0">
<xs:element ref="Sal201:Ie201"></xs:element>
<xs:element ref="Sal204:Ie204"></xs:element>
</xs:all>
</xs:complexType>

Atentamente,
AEAT


¿Qué entendéis de todo esto?
Yo no sé si lo he entendido muy bien, pero da a entender que se debe modificar el WSDL? O quizá modificar la unidad que genera el WSDL al importar?

He probado de modificar el WSDL ( https://www3.agenciatributaria.gob.e...s/Ie215V1.wsdl ) así:

Sustituir esta parte:
Código:
<wsdl:message name="Salida">
<wsdl:part type="Ie215V1SalType" name="Ie215V1Sal"/>
</wsdl:message>
Por esta?
Código:
<wsdl:message name="Salida"> 
   <wsdl:part name="Ie215V1Sal1" element="Sal201:Ie201" /> 
   <wsdl:part name="Ie215V1Sal2" element="Sal204:Ie204" /> 
</wsdl:message>
Lo he probado de hacer, creando una copia del WSDL modificado en mi pc, pero al importarlo me genera una unidad sin apneas líneas de código. No estoy seguro de si es así cómo se debe hacer ?¿??¿?

Última edición por Casimiro Notevi fecha: 09-05-2019 a las 19:06:41.
Responder Con Cita
  #12  
Antiguo 09-05-2019
ja_73 ja_73 is offline
Miembro
 
Registrado: abr 2017
Posts: 20
Poder: 0
ja_73 Va por buen camino
hola apo
he probado la primera parte y me funcionó.
ya me dirás a que correo enviaste la pregunta, yo envié uno aemcs(arroba)correo.aeat.es pero no me contestaron.
podrían publicar esto en las faq de la aeat, nos libraría de muchos dolores de cabeza...
te cuento lo que hice, yo lo hice en .NET, pero espero que te pueda ayudar.
me descarge el wsdl de la página de hacienda, y los todos los xsd necesarios, los guardas todos en una carpeta
modificas con el bloc de notas el archivo wsdl, y en la parte donde define el Ie215V1SalType pones el que pusiste tu.
luego cuando añades la referencia al servicio en .NET, normalmente agregas una url, ahora tines que hacer referencia a un archivo del disco duro.
se añade la referencia al servicio, y a partir de aquí ya es como siempre.
lo que ví que cambió, es que antes la llamada al servicio era así:
Código:
Ie215V1SalType respuesta = cliente.Ie215V1(ie215Tipo);
y ahora queda así
Código:
cliente.Ie215V1(ie215Tipo, out Ie215V1Service2.IE204Tipo iE204);
la respuesta la recibe la variable IE204.

sigo recibiendo el error 07009-Mensaje YA consumido con anterioridad y rechazado.
pero eso ya es otra historia
ahora por lo menos no recibo null
muchas gracias APO
y al señor de AEAT también

si alguien se anima a probar el resto de opciones, que publique a ver que tal les fué.
Responder Con Cita
  #13  
Antiguo 10-05-2019
APO APO is offline
Miembro
 
Registrado: feb 2008
Posts: 121
Poder: 17
APO Va por buen camino
Cita:
Empezado por ja_73 Ver Mensaje
hola apo
he probado la primera parte y me funcionó.
ya me dirás a que correo enviaste la pregunta, yo envié uno aemcs(arroba)correo.aeat.es pero no me contestaron.
podrían publicar esto en las faq de la aeat, nos libraría de muchos dolores de cabeza...
te cuento lo que hice, yo lo hice en .NET, pero espero que te pueda ayudar.
me descarge el wsdl de la página de hacienda, y los todos los xsd necesarios, los guardas todos en una carpeta
modificas con el bloc de notas el archivo wsdl, y en la parte donde define el Ie215V1SalType pones el que pusiste tu.
luego cuando añades la referencia al servicio en .NET, normalmente agregas una url, ahora tines que hacer referencia a un archivo del disco duro.
se añade la referencia al servicio, y a partir de aquí ya es como siempre.
lo que ví que cambió, es que antes la llamada al servicio era así:
Código:
Ie215V1SalType respuesta = cliente.Ie215V1(ie215Tipo);
y ahora queda así
Código:
cliente.Ie215V1(ie215Tipo, out Ie215V1Service2.IE204Tipo iE204);
la respuesta la recibe la variable IE204.

sigo recibiendo el error 07009-Mensaje YA consumido con anterioridad y rechazado.
pero eso ya es otra historia
ahora por lo menos no recibo null
muchas gracias APO
y al señor de AEAT también

si alguien se anima a probar el resto de opciones, que publique a ver que tal les fué.
Hola ja_73,

Me alegro que ya te funcione! Te pongo el email donde hice la consulta a la AEAT por si necesitaras alguna otra información: atenusu(arroba)correo.aeat.es

Yo, sin embargo, sigo teniendo problemas. He modificado el WSDL y todos los xsd relacionados, pero la respuesta me sigue viniendo a nil.
¿Podrías aquí poner el WSDL ya modificado? Y el código cuando consumes el WebService? No sé, algo me debo estar dejando.

Por otra parte, a todo esto le veo un inconveniente. Y es que, si modifican el Webservice, también tendremos que hacer de nuevo estas modificaciones no?

Muchas gracias!
Responder Con Cita
  #14  
Antiguo 10-05-2019
ja_73 ja_73 is offline
Miembro
 
Registrado: abr 2017
Posts: 20
Poder: 0
ja_73 Va por buen camino
Cita:
Empezado por APO Ver Mensaje
Hola ja_73,

Me alegro que ya te funcione! Te pongo el email donde hice la consulta a la AEAT por si necesitaras alguna otra información: atenusu(arroba)correo.aeat.es

Yo, sin embargo, sigo teniendo problemas. He modificado el WSDL y todos los xsd relacionados, pero la respuesta me sigue viniendo a nil.
¿Podrías aquí poner el WSDL ya modificado? Y el código cuando consumes el WebService? No sé, algo me debo estar dejando.

Por otra parte, a todo esto le veo un inconveniente. Y es que, si modifican el Webservice, también tendremos que hacer de nuevo estas modificaciones no?

Muchas gracias!
hola apo,
yo solo modifiqué el wsdl, la primera opción
sustituir
esto:
Código:
	<wsdl:message name="Salida">
		<wsdl:part name="Ie215V1Sal" type="Ie215V1SalType"/>
	</wsdl:message>
por esto:
Código:
<wsdl:message name="Salida"> 
    <wsdl : part name="Ie215V1Sal1" element="Sal201:Ie201" /> 
    <wsdl : part name="Ie215V1Sal2" element="Sal204:Ie204" /> 
</wsdl:message>
importas el wsdl y el resto del código debería funcionarte igual, (por lo menos en .NET, en delphi no se como puede ser)
un truco, copia el wsdl y los archivos modificados en una carpeta nueva, antes de volver a importar, en .net por lo menos a mi, siempre me importaba el mismo y me daba error, hasta que lo copié en una carpeta nueva y me lo importó bien.
Responder Con Cita
  #15  
Antiguo 14-05-2019
mtxtania mtxtania is offline
Registrado
 
Registrado: may 2019
Posts: 8
Poder: 0
mtxtania Va por buen camino
Buenas tardes, yo de momento quiero probar sin modificar el WDSL aunque me salta el siguiente error y no puedo analizar las respuestas:


Codigo[1207].Se esperaba Atributo 'Id' event: com.ibm.xml.xlxp.api.stax.events.StartElementImpl@84705eb1


Estoy con los albaranes, Ie215V1.wsdl



Os suena a alguno?
Responder Con Cita
  #16  
Antiguo 15-05-2019
APO APO is offline
Miembro
 
Registrado: feb 2008
Posts: 121
Poder: 17
APO Va por buen camino
Cita:
Empezado por mtxtania Ver Mensaje
Buenas tardes, yo de momento quiero probar sin modificar el WDSL aunque me salta el siguiente error y no puedo analizar las respuestas:

Codigo[1207].Se esperaba Atributo 'Id' event: com.ibm.xml.xlxp.api.stax.events.StartElementImpl@84705eb1

Estoy con los albaranes, Ie215V1.wsdl

Os suena a alguno?
Hola mtxtania,
Eso también me pasaba a mí. Es porque al importar el WSDL al final de todo añade unos namespace a los atributos Id, NifDeclarante, NombreDeclarante y Test. Se ve que al generar el XML de salida no le gusta con esos namespace.

Yo lo solucioné comentando esas líneas:

Código Delphi [-]
//  RemClassRegistry.RegisterExternalPropName(TypeInfo(Ie201Tipo), 'Test', '[Namespace="https://www3.agenciatributaria.gob.es/static_files/common/internet/dep/aduanas/es/aeat/adia/avit/ws/listas.xsd"]');
//  RemClassRegistry.RegisterExternalPropName(TypeInfo(Ie215Tipo), 'Id', '[Namespace="https://www3.agenciatributaria.gob.es/static_files/common/internet/dep/aduanas/es/aeat/adia/avit/ws/tipos.xsd"]');
//  RemClassRegistry.RegisterExternalPropName(TypeInfo(Ie215Tipo), 'NifDeclarante', '[Namespace="https://www3.agenciatributaria.gob.es/static_files/common/internet/dep/aduanas/es/aeat/adia/avit/ws/tipos.xsd"]');
//  RemClassRegistry.RegisterExternalPropName(TypeInfo(Ie215Tipo), 'NombreDeclarante', '[Namespace="https://www3.agenciatributaria.gob.es/static_files/common/internet/dep/aduanas/es/aeat/adia/avit/ws/tipos.xsd"]');
//  RemClassRegistry.RegisterExternalPropName(TypeInfo(Ie215Tipo), 'Test', '[Namespace="https://www3.agenciatributaria.gob.es/static_files/common/internet/dep/aduanas/es/aeat/adia/avit/ws/listas.xsd"]');

Pruébalo y cuéntanos a ver qué tal
Responder Con Cita
  #17  
Antiguo 15-05-2019
mtxtania mtxtania is offline
Registrado
 
Registrado: may 2019
Posts: 8
Poder: 0
mtxtania Va por buen camino
Perfecto gracias!!

Ahora me encuentro que las respuestas me vienen a nil como comentabais mas arriba. Tengo que modificar el WSDL? Os ha funcionado a vosotros?
Responder Con Cita
  #18  
Antiguo 15-05-2019
APO APO is offline
Miembro
 
Registrado: feb 2008
Posts: 121
Poder: 17
APO Va por buen camino
¿En qué lenguaje de programación lo estás haciendo? Porque yo utilizando Delphi XE8, y modificando el WSDL me siguen viniendo a nil. En cambio, ja_73 que lo está haciendo en .NET, modificando el WSDL sí que le ha funcionado.

Básicamente del WSDL hay que cambiar esta parte:
Código Delphi [-]
message name="Salida">
art type="Ie215V1SalType" name="Ie215V1Sal"/>
message>

Por esta otra:
Código Delphi [-]
message name="Salida"> 
   art name="Ie215V1Sal1" element="Sal201:Ie201" /> 
   art name="Ie215V1Sal2" element="Sal204:Ie204" /> 
message>

Y luego a la hora de consumir el Webservice debería ser algo así:
Código Delphi [-]
//Aquí declaro las variables para consumir el Webservice
var
   XML: Ie215V11.Ie215;
   XMLRespuestaIe201: Ie215V11.Ie201;
   XMLRespuestaIe204: Ie215V11.Ie204;

begin
   //Rellenemos los datos que voy a enviar
   XML:=Ie215V11.Ie215.Create;
   XML.Id:='201905150001'; //Debe ser un identificar único por mensaje
   XML.NifDeclarante:='XXXXXXXXX';
   XML.NombreDeclarante:='XXXXXXXXXX';

   //… rellenar los demás datos necesarios ...


   //Y aquí consumo el Webservice
   Ie215V11.GetIe215V1(True,'',HTTPRIO1).Ie215V1(XML,XMLRespuestaIe201,XMLRespuestaIe204);

Y en teoría una de las dos respuestas XMLRespuestaIe201 (mensaje aceptado) o XMLRespuestaIe204 (mensaje rechazado) debería tener valor. Pero a mí me vienen las dos a nil.
Responder Con Cita
  #19  
Antiguo 15-05-2019
mtxtania mtxtania is offline
Registrado
 
Registrado: may 2019
Posts: 8
Poder: 0
mtxtania Va por buen camino
Lo estoy haciendo con Delphi 10.2 y a mi también me vienen a nil. Aún estou probando pero es lo que he visto de momento.
Responder Con Cita
  #20  
Antiguo 16-05-2019
mtxtania mtxtania is offline
Registrado
 
Registrado: may 2019
Posts: 8
Poder: 0
mtxtania Va por buen camino
Buenos días, he estado hablando con la AEAT pero de momento no saben dar solución a que las respuestas lleguen a nil… He probado a modificar lo que comentáis pero eso es para .NET, al menos es lo que me ha corroborado el de la AEAT.

Alguien ha hablado de leer el XML aunque estamos de acuerdo que no es nada recomendable. Crearíais una clase con la estructura del XML o os lo leerías directamente? Alguien ha avanzado un poco mas?

A parte estoy mirando algunos de los errores que me da. Uno de ellos es Formato de hora no válido, cuando le paso un datetime. En el XML de petición se genera 10:50:00.000Z El problema viene que muestra .000Z Podría probar de modificar el WDSL pero si tenemos que tocar mil cosas vaya gracia

He probado así:

Código Delphi [-]
 HoraPreparacion :=  Ie215V11.HoraTipo.Create;
    HoraPreparacion.AsTime   :=now;

Y así:
Código Delphi [-]
HoraPreparacion :=  Ie215V11.HoraTipo.Create;
     with HoraPreparacion do
     begin
       Hour:=10;
       Minute:=50;
       Millisecond:=00;
     end;

Sabéis como puedo pasarlo correctamente. No quiero tener que quitarlo directamente del XML.
Responder Con Cita
Respuesta


Herramientas Buscar en Tema
Buscar en Tema:

Búsqueda Avanzada
Desplegado

Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro

Temas Similares
Tema Autor Foro Respuestas Último mensaje
Consumir Webservice darkerbyte Delphi para la web 5 17-11-2012 21:59:50
Consumir un webservice echo en delphi con php anahuel Delphi para la web 3 27-10-2012 08:20:42
Consumir WebService nasedo Varios 1 11-08-2011 15:32:57
Consumir Webservice MARLON1 Internet 0 06-07-2011 01:07:12
Problema al consumir un Webservice netcigos Varios 0 08-03-2004 16:09:30


La franja horaria es GMT +2. Ahora son las 16:30:38.


Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi
Copyright 1996-2007 Club Delphi