Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Envío de registros y sus respuestas (https://www.clubdelphi.com/foros/forumdisplay.php?f=66)
-   -   Cómo leer datos (https://www.clubdelphi.com/foros/showthread.php?t=97217)

_Io 09-02-2025 11:58:02

Cómo leer datos
 
Buenos días.

Una pregunta:

Cómo hacéis vosotros para leer los campos:

Código:

      Subsanacion :SubsanacionType;
      SinRegistroPrevio :SinRegistroPrevioType;

La definición de los tipos es:

Código:

  SubsanacionType = (S, N);
  SinRegistroPrevioType = (S, N);

Cómo sabéis si los valores "S" que viene en ambos campos los ha establecido la AEAT, o son valores que se generan al crear el objeto?.

Muchas Gracias.

bmfranky 10-02-2025 09:15:41

Cita:

Empezado por _Io (Mensaje 561859)
Buenos días.

Una pregunta:

Cómo hacéis vosotros para leer los campos:

Código:

      Subsanacion :SubsanacionType;
      SinRegistroPrevio :SinRegistroPrevioType;

La definición de los tipos es:

Código:

  SubsanacionType = (S, N);
  SinRegistroPrevioType = (S, N);

Cómo sabéis si los valores "S" que viene en ambos campos los ha establecido la AEAT, o son valores que se generan al crear el objeto?.

Muchas Gracias.

Hola @_Io, buenos dias, no entiendo la pregunta, esos campos, tanto si estan en el registro de alta, como en el de respuesta a consulta, de un registro enviado por tu SIF, los codificas tu al generar el registro, al generar de 0 un registro, no hay nada cumpliementado, lo has de cumplimentar siguiendo la causistica.


Para ello, has de tener en cuenta si el registro lo generas nuevo o es una subsanacion/rectificacion , de uno existenete en tu sif, exista o no en la AEAT, ya sea porque al generarse aun no se enviavan por estar trabajando como no verifactu, como que se rechazo al realizar el envio, etc...


Si no es esta la pregunta, por favor clarifica la duda, un saludo.

_Io 10-02-2025 10:41:32

Cita:

Empezado por bmfranky (Mensaje 561862)
Hola @_Io, buenos dias, no entiendo la pregunta, esos campos, tanto si estan en el registro de alta, como en el de respuesta a consulta, de un registro enviado por tu SIF, los codificas tu al generar el registro, al generar de 0 un registro, no hay nada cumpliementado, lo has de cumplimentar siguiendo la causistica.


Para ello, has de tener en cuenta si el registro lo generas nuevo o es una subsanacion/rectificacion , de uno existenete en tu sif, exista o no en la AEAT, ya sea porque al generarse aun no se enviavan por estar trabajando como no verifactu, como que se rechazo al realizar el envio, etc...


Si no es esta la pregunta, por favor clarifica la duda, un saludo.

Hola, buenos días.

Obviamente no me he sabido explicar.

Haz una prueba.

Realiza una consulta de una factura que hallas subido y que no esté marcada como Macrodato y comprueba el valor de este campo en el resultado. Creo que te saldrá "S"

Ya me dices si lo puedes hacer.

Saludos.

Jarogo08 10-02-2025 10:57:13

Cita:

Empezado por _Io (Mensaje 561871)
Hola, buenos días.

Obviamente no me he sabido explicar.

Haz una prueba.

Realiza una consulta de una factura que hallas subido y que no esté marcada como Macrodato y comprueba el valor de este campo en el resultado. Creo que te saldrá "S"

Ya me dices si lo puedes hacer.

Saludos.


Buenas _Io


Yo lo acabo de hacer y efectivamente, al imprimir el campo "Macrodato" de la factura ya subida que estoy consultando me devuelve una "S" (a pesar de que cuando la subí no le informé ese valor, y según la documentación si no se informa equivale a "N"). ¿cuál sería la duda? ¿porqué devuelve una "S" en vez de una "N"?


Saludos

_Io 10-02-2025 11:26:09

Cita:

Empezado por Jarogo08 (Mensaje 561872)
Buenas _Io


Yo lo acabo de hacer y efectivamente, al imprimir el campo "Macrodato" de la factura ya subida que estoy consultando me devuelve una "S" (a pesar de que cuando la subí no le informé ese valor, y según la documentación si no se informa equivale a "N"). ¿cuál sería la duda? ¿porqué devuelve una "S" en vez de una "N"?


Saludos

Hola, buenos días.

Sí esa es la duda, todos los campos enumerados, como por ejemplo:

Código:

  SubsanacionType = (S, N);
  SinRegistroPrevioType = (S, N);

Si no son modificados, toman como valor por defecto el primer elemento.

La consulta sería:

Cómo saber si la "S" del campo "Macrodato", la ha puesto la AEAT, o es el valor por defecto que toma?.

Esto afecta a todos los campos enumerados.

Saludos.

bmfranky 10-02-2025 12:21:51

Cita:

Empezado por _Io (Mensaje 561875)
Hola, buenos días.

Sí esa es la duda, todos los campos enumerados, como por ejemplo:

Código:

  SubsanacionType = (S, N);
  SinRegistroPrevioType = (S, N);

Si no son modificados, toman como valor por defecto el primer elemento.

La consulta sería:

Cómo saber si la "S" del campo "Macrodato", la ha puesto la AEAT, o es el valor por defecto que toma?.

Esto afecta a todos los campos enumerados.

Saludos.

Hola, probad directamente aqui a ver que os devuelve. https://prewww1.aeat.es/wlpl/TIKE-CO...eEmitidasQuery

Jarogo08 10-02-2025 12:57:33

Cita:

Empezado por bmfranky (Mensaje 561877)
Hola, probad directamente aqui a ver que os devuelve. https://prewww1.aeat.es/wlpl/TIKE-CO...eEmitidasQuery


Ahí ya probé y la columna "Macrodato" está vacía, no se ve ningún valor (lo que según la documentación debería ser lo mismo que una "N"). Pero luego el objeto que devuelve viene con la "S". Es un poco raro/confuso !

rci 10-02-2025 13:06:58

Hola, yo trabajo en C# y en algunas ocasiones me ha pasado algo parecido a lo que comentáis con algunas propiedades y con otras no.

No se si os habéis fijado que algunas propiedades tienen otra propiedad con el mismo nombre pero terminadas con la palabra "Specified" que es boleana. Por ejemplo hay Macrodato y MacrodatoSpecified
Si esa segunda propiedad tiene valor falso, el valor de la propiedad principal no lo utilizo porque normalmente tiene el valor por defecto y no se ha informado.

De hecho esta "segunda" propiedad la tengo que poner a cierto cuando informo algún valor en la "primera" propiedad del objeto que estoy rellenando, porque sino ese valor no se tiene en cuenta y por ejemplo si serializo el objeto a XML, esa "primera" propiedad no aparece, como si no la hubiese informado.

A ver si os sirve para vuestro caso

rci 10-02-2025 13:46:41

Cita:

Empezado por Jarogo08 (Mensaje 561884)
Ahí ya probé y la columna "Macrodato" está vacía, no se ve ningún valor (lo que según la documentación debería ser lo mismo que una "N"). Pero luego el objeto que devuelve viene con la "S". Es un poco raro/confuso !

Acabo de probar en "Consulta de datos de presentación de registros de facturación" y cuando he informado macrodato, la columna tiene valor (el que haya informado) y cuando no he informado, la columna está vacía (que significa que no en este caso).

No he probado la consulta de datos desde mi programa, estoy pendiente de hacerlo mas adelante.

Saludos

bmfranky 10-02-2025 15:01:12

Hola, simplemente consulte , el valor especified, si esta en true , lo ha puesto uesto usted, si esta en false, obvie el valor puesto que es indiferente, si hace correctamente la deserializacion en el resultado no aparecen esas claves, lo acabo de verificar, una cosa es lo que observa precargado en la respuesta y otra lo que ha detener en cuenta, que son unicamnete las claves con el flag escificado a true.

Hola, @rci, no me he dado cuenta que ya habias respondido a ello, un saludo.

_Io 11-02-2025 13:13:37

Buenas Tardes.

La variables Specified, son privadas.

Código:

RespuestaDatosRegistroFacturacionType = class(TRemotable)
  private

    ...

    FRefExterna_Specified: boolean;
    FSubsanacion_Specified: boolean;
    FRechazoPrevio_Specified: boolean;

  ....


Voy a hacer esta prueba a ver si funciona

Código:

RespuestaDatosRegistroFacturacionType = class(TRemotable)
  private

    ...

    FRefExterna_Specified: boolean;
    FSubsanacion_Specified: boolean;
    FRechazoPrevio_Specified: boolean;

  ....

  public

    property Subsanacion_Especificada: boolean read  FSubsanacion_Specified;
    property RechazoPrevio_Especificada: boolean read  FRechazoPrevio_Specified;

En teoría podría acceder a sus valores sin tener que modificar la operativa de la clase :rolleyes:
Saludos.

_Io 11-02-2025 17:59:31

Hola.

Probado, y funciona.
Un poco rollo buscar las clases a modificar, pero ya está.

Salu2.

rci 11-02-2025 18:07:08

Cita:

Empezado por _Io (Mensaje 561946)
Hola.

Probado, y funciona.
Un poco rollo buscar las clases a modificar, pero ya está.

Salu2.

Hola _Io, en mi caso no he modificado nada de las clases que genera la importación del WSDL y las propiedades Specified son publicas (en c#). Te paso una parte del fichero Reference.cs creado al importar el WSDL:

Código:


private bool macrodatoFieldSpecified;

....

public bool MacrodatoSpecified
{
  get
  {
          return this.macrodatoFieldSpecified;
  }
  set
  {
          this.macrodatoFieldSpecified = value;
          this.RaisePropertyChanged("MacrodatoSpecified");
  }
}


_Io 11-02-2025 19:39:29

Cita:

Empezado por rci (Mensaje 561947)
Hola _Io, en mi caso no he modificado nada de las clases que genera la importación del WSDL y las propiedades Specified son publicas (en c#). Te paso una parte del fichero Reference.cs creado al importar el WSDL:

Código:


private bool macrodatoFieldSpecified;

....

public bool MacrodatoSpecified
{
  get
  {
          return this.macrodatoFieldSpecified;
  }
  set
  {
          this.macrodatoFieldSpecified = value;
          this.RaisePropertyChanged("MacrodatoSpecified");
  }
}



Hola.

Yo utilizo Delphi 12, y en la importación me crea estas propiedades como privadas, por eso lo de la chapucilla.

Sinceramente no sé si en las opciones de importación existe alguna opción para que saque estas propiedades como públicas.

También puede ser, que se pueda acceder a ellas y yo desconozca el cómo :confused:

Una Clase de la importación del WDSL:
Código:

  RespuestaBaseType = class(TRemotable)
  private
    FCSV: string;
    FCSV_Specified: boolean;
    FDatosPresentacion: DatosPresentacionType;
    FDatosPresentacion_Specified: boolean;
    FCabecera: CabeceraType;
    FTiempoEsperaEnvio: Tipo6Type;
    FEstadoEnvio: EstadoEnvioType;
    procedure SetCSV(Index: Integer; const Astring: string);
    function  CSV_Specified(Index: Integer): boolean;
    procedure SetDatosPresentacion(Index: Integer; const ADatosPresentacionType: DatosPresentacionType);
    function  DatosPresentacion_Specified(Index: Integer): boolean;
  public
    destructor Destroy; override;
  published
    property CSV:              string                Index (IS_OPTN) read FCSV write SetCSV stored CSV_Specified;
    property DatosPresentacion: DatosPresentacionType  Index (IS_OPTN) read FDatosPresentacion write SetDatosPresentacion stored DatosPresentacion_Specified;
    property Cabecera:          CabeceraType          read FCabecera write FCabecera;
    property TiempoEsperaEnvio: Tipo6Type              read FTiempoEsperaEnvio write FTiempoEsperaEnvio;
    property EstadoEnvio:      EstadoEnvioType        read FEstadoEnvio write FEstadoEnvio;
  end;


Aquí pongo la modificación:

Código:

  RespuestaBaseType = class(TRemotable)
  private
    FCSV: string;
    FCSV_Specified: boolean;
    FDatosPresentacion: DatosPresentacionType;
    FDatosPresentacion_Specified: boolean;
    FCabecera: CabeceraType;
    FTiempoEsperaEnvio: Tipo6Type;
    FEstadoEnvio: EstadoEnvioType;
    procedure SetCSV(Index: Integer; const Astring: string);
    function  CSV_Specified(Index: Integer): boolean;
    procedure SetDatosPresentacion(Index: Integer; const ADatosPresentacionType: DatosPresentacionType);
    function  DatosPresentacion_Specified(Index: Integer): boolean;
  public
    property CSV_Especificada: boolean read FCSV_Specified;
    property DatosPresentacion_Especificada: boolean read FDatosPresentacion_Specified;
  public
    destructor Destroy; override;
  published
    property CSV:              string                Index (IS_OPTN) read FCSV write SetCSV stored CSV_Specified;
    property DatosPresentacion: DatosPresentacionType  Index (IS_OPTN) read FDatosPresentacion write SetDatosPresentacion stored DatosPresentacion_Specified;
    property Cabecera:          CabeceraType          read FCabecera write FCabecera;
    property TiempoEsperaEnvio: Tipo6Type              read FTiempoEsperaEnvio write FTiempoEsperaEnvio;
    property EstadoEnvio:      EstadoEnvioType        read FEstadoEnvio write FEstadoEnvio;
  end;


Saludos !!!

bmfranky 11-02-2025 19:45:11

Cita:

Empezado por rci (Mensaje 561947)
Hola _Io, en mi caso no he modificado nada de las clases que genera la importación del WSDL y las propiedades Specified son publicas (en c#). Te paso una parte del fichero Reference.cs creado al importar el WSDL:

Código:




private bool macrodatoFieldSpecified;

....

public bool MacrodatoSpecified
{
  get
  {
          return this.macrodatoFieldSpecified;
  }
  set
  {
          this.macrodatoFieldSpecified = value;
          this.RaisePropertyChanged("MacrodatoSpecified");
  }
}


Hola, yo cambio el timestamp a string porque al pasear introducía milisegundos, y daba error al enviar, a ti no te pasa?

rci 12-02-2025 09:18:27

Cita:

Empezado por bmfranky (Mensaje 561954)
Hola, yo cambio el timestamp a string porque al pasear introducía milisegundos, y daba error al enviar, a ti no te pasa?

Hola bmfranky, no modifico nada de las clases creadas al importar el wsdl porque sinó lo tendría que hacer cada vez que lo importo :)

No se exactamente a que propiedades te refieres con esto de los milisegundos, pero supongo que no me ocurre el error porque al rellenar todas las propiedades de fecha ya les doy el formato esperado.

Saludos

bmfranky 12-02-2025 14:52:32

Cita:

Empezado por rci (Mensaje 561967)
Hola bmfranky, no modifico nada de las clases creadas al importar el wsdl porque sinó lo tendría que hacer cada vez que lo importo :)

No se exactamente a que propiedades te refieres con esto de los milisegundos, pero supongo que no me ocurre el error porque al rellenar todas las propiedades de fecha ya les doy el formato esperado.

Saludos


Hola, buenos dias el parametro FechaHoraUsoGenREgistro es un System.DateTime , si lo paso directamente, me genera el xml, asi:
Código:

<FechaHoraHusoGenRegistro >2024-10-01T15:05:26.908824+02:00</FechaHoraHusoGenRegistro>

Al enviar daba error de la fecha no correcta.


Código:

<EstadoRegistro>AceptadoConErrores</EstadoRegistro>
<CodigoErrorRegistro>2004</CodigoErrorRegistro>
<DescripcionErrorRegistro>El valor del campo FechaHoraHusoGenRegistro debe ser la fecha actual del sistema de la AEAT, admitiéndose un margen de error de: 120 segundos.</DescripcionErrorRegistro>


Como no hay forma de evitarlo por codigo,. lo cambie a string.


Por lo menos en c# VisualStudio 2015, que es la version que yo uso, pero ya te comente que la 2022, es diferente, en muchas cosas.

rci 12-02-2025 15:35:58

Cita:

Empezado por bmfranky (Mensaje 561984)
Hola, buenos dias el parametro FechaHoraUsoGenREgistro es un System.DateTime , si lo paso directamente, me genera el xml, asi:
Código:

<FechaHoraHusoGenRegistro >2024-10-01T15:05:26.908824+02:00</FechaHoraHusoGenRegistro>

Al enviar daba error de la fecha no correcta.


Código:

<EstadoRegistro>AceptadoConErrores</EstadoRegistro>
<CodigoErrorRegistro>2004</CodigoErrorRegistro>
<DescripcionErrorRegistro>El valor del campo FechaHoraHusoGenRegistro debe ser la fecha actual del sistema de la AEAT, admitiéndose un margen de error de: 120 segundos.</DescripcionErrorRegistro>


Como no hay forma de evitarlo por codigo,. lo cambie a string.


Por lo menos en c# VisualStudio 2015, que es la version que yo uso, pero ya te comente que la 2022, es diferente, en muchas cosas.

Hola bmfranky, Puedes adaptarlo a lo que necesites:
Código:

DateTime currentDateTime = GetDateTime(); // Coge la fecha y hora de internet o del ordenador

// Convert to Veri*Factu FORMAT EXPECTED: YYYY-MM-DDThh:mm:ssTZD (ej: 2024-01-01T19:20:30+01:00) (ISO 8601)
var creationDateTime = new DateTime(currentDateTime.Year, currentDateTime.Month, currentDateTime.Day, currentDateTime.Hour, currentDateTime.Minute, currentDateTime.Second, DateTimeKind.Local);

registroFacturacionAlta.FechaHoraHusoGenRegistro = creationDateTime;

Prueba a ver si te sirve, creo que no depende de la versión del VisualStudio que tengas

Saludos

bmfranky 12-02-2025 16:36:52

Cita:

Empezado por rci (Mensaje 561988)
Hola bmfranky, Puedes adaptarlo a lo que necesites:
Código:

DateTime currentDateTime = GetDateTime(); // Coge la fecha y hora de internet o del ordenador

// Convert to Veri*Factu FORMAT EXPECTED: YYYY-MM-DDThh:mm:ssTZD (ej: 2024-01-01T19:20:30+01:00) (ISO 8601)
var creationDateTime = new DateTime(currentDateTime.Year, currentDateTime.Month, currentDateTime.Day, currentDateTime.Hour, currentDateTime.Minute, currentDateTime.Second, DateTimeKind.Local);

registroFacturacionAlta.FechaHoraHusoGenRegistro = creationDateTime;

Prueba a ver si te sirve, creo que no depende de la versión del VisualStudio que tengas

Saludos

Hola, la verdad es que el problema lo tenia al comenzar las pruebas con las primeras versiones del servicio, como puede ver por las fechas, probare a ver sin la modificacion a ver, porque el codigo que me pasa , es una de las formas que prove, entre otras de generar y pasar el timestamp, esa, es igual que crearlo desde un DateTime.now y forzar los mislisegundos a cero.
Como pada poder enviar , tuve que modificar, pues desde entonces he mantenido la modificacion, luego provare a vover atras, total son unas 15/20 lineas de codigo, no mas.

Gracias de todos modos, le digo algo, igual hera un fallo de las primeras versiones de codigo.

bmfranky 12-02-2025 16:59:04

Cita:

Empezado por bmfranky (Mensaje 561989)
Hola, la verdad es que el problema lo tenia al comenzar las pruebas con las primeras versiones del servicio, como puede ver por las fechas, probare a ver sin la modificacion a ver, porque el codigo que me pasa , es una de las formas que prove, entre otras de generar y pasar el timestamp, esa, es igual que crearlo desde un DateTime.now y forzar los mislisegundos a cero.
Como pada poder enviar , tuve que modificar, pues desde entonces he mantenido la modificacion, luego provare a vover atras, total son unas 15/20 lineas de codigo, no mas.

Gracias de todos modos, le digo algo, igual hera un fallo de las primeras versiones de codigo.


Pues algo han cambiado, porque ahora si funciona, pues nada, maquina aban....
Gracias.


La franja horaria es GMT +2. Ahora son las 23:48:47.

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