Hola compañeros me acaban de pasar un incidente, es acerca de un proxy pero aún no se muy bien como trabajan y veo poca documentación en google. el incidente esque me comentan que el proxy debe de mandar unas tablas (log, clientes y cuentas) y solo manda las del log, veo que el proxy se ejecuta mediante una clase y este a su vez manda llamar un método. creen que donde deba revisar sea el método?
Efectivamente, a través del método es como debes pasar y obtener información del proxy. Yo lo utilizo para el timbrado de facturación electrónica en México, de la siguiente manera:
Sólo tienes que revisar la estructura de tu proxy
Hola @lrobertorosor muchas gracias por tu respuesta, ahora ya entré a la clase y al método, ya encontré las 2 estructuras de cliente y cuenta, al parecer no se están llenando por eso eso no las manda llamar, ahora como puedo debbugear el método?.
Por cierto igual vi en internet que algunos recomiendan colocar el “TRY” y el “CATCH” en el método que función tiene?
Try…Endtry para que se tenga la posibilidad de obtener dump en este caso de la ejecución del método del proxy. Catch para especificar el error que deseamos procesar.
Para debuguear, pues debes navegar a través de tu método y tratar de ubicar la línea donde quieras poner tu “break”:
ok ok muchas gracias @lrobertorosor solo una última duda ya navego por el método, etc y vi donde colocar mi break point, ahora para ejecutarlo y entre a la pantalla del debbug? ya que si lo ejecuto me sale la siguiente imagen.
¿Ya intentaste darle F5, F6, F8?, para que avance hasta tu break point
si ya amigo y me aparece la segunda pantalla, lo que pasa que en la imagen anterior vienen 2 pantallas . la primera esta el método le doy f8 y me manda a la segunda pantalla que dice: Test de la clase ZSIPREVCL_GENERAR_CALIFICACION
¿puedes compartir la imagen del debugueo cuando se llega a la instrucción donde colocaste el break point?
Bien, así lo haré la siguiente vez
Hola @lrobertorosor ya quedó el ajuste y ya me trae las tablas con la información de clientes y cuentas, ahora por ejemplo si no trae datos el XML sale una serie de errores muy largo y me solicitan que en lugar de eso solo aparezca un renglón vacio, me dijeron que ajuste el proxy pero no se en que parte hacer eso o como se hace?
Seguramente el proxy debe contener una sección donde devuelve los errores. Te paso el código de cómo proceso los errores:
try.
call method zrechcore_33->TIMBRAR_COMPROBANTE
exporting
TIMBRAR_COMPROBANTE_REQUEST = input
importing
TIMBRAR_COMPROBANTE_RESPONSE = output
.
catch cx_ai_system_fault into lr_ex_system.
catch cx_ai_application_fault into lr_ex_application.
MESSAGE e001(ZFE_RECH).
endtry.
IF OUTPUT-ERROR-BASE-CODE IS NOT INITIAL. <<<<------ AQUI ERROR-BASE-CODE es donde se guardan los errores en la parte de la estructura del PROZY que se está utilizando
CALL FUNCTION 'ECATT_CONV_XSTRING_TO_STRING'
EXPORTING
im_xstring = OUTPUT-ERROR-INNER_ERRORS
im_encoding = 'UTF-8'
IMPORTING
ex_string = l_string.
CALL FUNCTION 'ZZWS_MENSAJE_ERRORS'
EXPORTING
l_string = l_string.
MESSAGE resultado TYPE 'I' RAISING sin_timbrar.
LA FUNCIÓN PARA TRATAR EL ERROR:
FUNCTION ZZWS_MENSAJE_ERRORS .
*"----------------------------------------------------------------------
*"*"Interfase local
*" IMPORTING
*" REFERENCE(L_STRING) TYPE STRING
*"----------------------------------------------------------------------
DATA: patt TYPE string,
text TYPE string,
off TYPE i,
moff TYPE i,
mlen TYPE i,
ind TYPE i,
idx TYPE i.
TYPES: BEGIN OF t_errorws."Tabla de códigos de error
TYPES: indice TYPE i,
codews_i TYPE i,
codews_f TYPE i,
codews TYPE string,
messagews_i TYPE i,
messagews_f TYPE i,
messagews TYPE string,
targetws_i TYPE i,
targetws_f TYPE i,
targetws TYPE string,
detailsws_i TYPE i,
detailsws_f TYPE i,
detailsws TYPE string.
TYPES: END OF t_errorws.
DATA: it_errorws TYPE STANDARD TABLE OF t_errorws INITIAL SIZE 0,
wa_errorws TYPE t_errorws.
ind = 1.
WHILE ind le 8.
off = 0.
idx = 1.
sy-subrc = 0.
WHILE sy-subrc = 0.
clear wa_errorws.
case ind.
when 1.
patt = '<Code>'.
when 2.
patt = '</Code>'.
when 3.
patt = '<Message>'.
when 4.
patt = '</Message>'.
when 5.
patt = '<Target>'.
when 6.
patt = '</Target>'.
when 7.
patt = '<Details>'.
when 8.
patt = '</Details>'.
endcase.
FIND patt IN SECTION OFFSET off OF l_string
MATCH OFFSET moff
MATCH LENGTH mlen.
IF sy-subrc = 0.
case ind.
when 1.
wa_errorws-indice = idx.
wa_errorws-codews_i = moff + mlen.
APPEND wa_errorws TO it_errorws.
when 2.
READ TABLE it_errorws WITH KEY indice = idx into wa_errorws.
IF sy-subrc = 0.
wa_errorws-codews_f = moff - wa_errorws-codews_i.
wa_errorws-codews = l_string+wa_errorws-codews_i(wa_errorws-codews_f).
MODIFY it_errorws FROM wa_errorws TRANSPORTING codews_f codews WHERE indice = idx.
ENDIF.
when 3.
READ TABLE it_errorws WITH KEY indice = idx into wa_errorws.
IF sy-subrc = 0.
wa_errorws-messagews_i = moff + mlen.
MODIFY it_errorws FROM wa_errorws TRANSPORTING messagews_i WHERE indice = idx.
ENDIF.
when 4.
READ TABLE it_errorws WITH KEY indice = idx into wa_errorws.
IF sy-subrc = 0.
wa_errorws-messagews_f = moff - wa_errorws-messagews_i.
wa_errorws-messagews = l_string+wa_errorws-messagews_i(wa_errorws-messagews_f).
MODIFY it_errorws FROM wa_errorws TRANSPORTING messagews_f messagews WHERE indice = idx.
ENDIF.
when 5.
READ TABLE it_errorws WITH KEY indice = idx into wa_errorws.
IF sy-subrc = 0.
wa_errorws-targetws_i = moff + mlen.
MODIFY it_errorws FROM wa_errorws TRANSPORTING targetws_i WHERE indice = idx.
ENDIF.
when 6.
READ TABLE it_errorws WITH KEY indice = idx into wa_errorws.
IF sy-subrc = 0.
wa_errorws-targetws_f = moff - wa_errorws-targetws_i.
wa_errorws-targetws = l_string+wa_errorws-targetws_i(wa_errorws-targetws_f).
MODIFY it_errorws FROM wa_errorws TRANSPORTING targetws_f targetws WHERE indice = idx.
ENDIF.
when 7.
READ TABLE it_errorws WITH KEY indice = idx into wa_errorws.
IF sy-subrc = 0.
wa_errorws-detailsws_i = moff + mlen.
MODIFY it_errorws FROM wa_errorws TRANSPORTING detailsws_i WHERE indice = idx.
ENDIF.
when 8.
READ TABLE it_errorws WITH KEY indice = idx into wa_errorws.
IF sy-subrc = 0.
wa_errorws-detailsws_f = moff - wa_errorws-detailsws_i.
wa_errorws-detailsws = l_string+wa_errorws-detailsws_i(wa_errorws-detailsws_f).
MODIFY it_errorws FROM wa_errorws TRANSPORTING detailsws_f detailsws WHERE indice = idx.
ENDIF.
endcase.
off = moff + mlen.
idx = idx + 1.
ENDIF.
ENDWHILE.
ind = ind + 1.
ENDWHILE.
EXPORT it_errorws FROM it_errorws TO DATABASE indx(ws) ID 'ZERRORWS'.
ENDFUNCTION.
En tu caso, pienso que limpiando la variable de la estuctura del proxy donde viene el error sea suficiente, pues no les interesa procesar dichos errores; por ejemplo para mi caso sería:
ok ok perfecto lo busco y te aviso
hola @lrobertorosor me imagino que debo limpiar las variables de las estructuras de salida? son las que vienen en el código mira
` BEGIN OF ty_error,
zseveridad TYPE num10,
zmensaje TYPE string,
END OF ty_error .
"Variables Locales
DATA: vl_iderror TYPE numc2.
"Definición de estructuras necesarias para recuperar información de la interfaz
"Estructuras de Entrada
DATA: tl_generar_calificacion_re TYPE zsiprevgenerar_calificacion_re,
tl_cliente_in TYPE zsiprevcliente_tab,
sl_cliente_in TYPE zsiprevcliente,
sl_siprev_cte TYPE zsiprev_cte,
tl_cuenta_in TYPE zsiprevcuenta_tab,
tl_cuenta_in_aux TYPE zsiprevcuenta_tab,
sl_cuenta_in TYPE zsiprevcuenta,
sl_siprev_cta TYPE zsiprev_cta,
"Estructuras de Salida
tl_calificacion_res TYPE zsiprevcalificacion_res,
tl_cliente_out TYPE STANDARD TABLE OF zsiprevcliente_resp,
sl_cliente_out TYPE zsiprevcliente_resp,
tl_cuenta_out TYPE STANDARD TABLE OF zsiprevcuenta_resp,
sl_cuenta_out TYPE zsiprevcuenta_resp,
tl_error_out TYPE STANDARD TABLE OF zsiprevcalificacion_res_log,
sl_error_out TYPE zsiprevcalificacion_res_log,
tg_cliente TYPE STANDARD TABLE OF ty_cliente,
sl_cliente LIKE LINE OF tg_cliente,
tg_cuenta TYPE STANDARD TABLE OF ty_cuenta,
sl_cuenta LIKE LINE OF tg_cuenta,
tg_error TYPE STANDARD TABLE OF ty_error,
sl_error LIKE LINE OF tg_error.`
esto es en el proxy
Por lo que observo, la información que regresa el proxy se almacena en tl_cliente_out y sl_cliente_out; así como tl_cuenta_out y sl_cuenta_out y los errores devueltos se almacenan en tl_error_out y sl_error_out; entonces de estas tablas, ¿qué deseas que se limpie, de tal manera que no muestre los errores que no quieren que se desplieguen?; si no estás seguro, quizás un debugueo a estas tablas te pueda dar la respuesta
Al inicio la tabla cliente y cuenta no aparecía en el XML y eso ya lo conseguí, entonces cuando ejecutan el XML y borran los registros de las tablas(o sea que vengan vacías) salen una serie de errores, pero esos no se de donde vienen?
en este ejemplo el XML ya trae los datos de la tabla de cliente, no se si ahí me explico mejor
¿qué método utilizan para la creación de xml?, por ejemplo xslt, rutinas que van formando el xml línea por línea, ¿es posible para ti compartir la función donde se pueda ver todo el proceso?. ¿puedes enviar esas líneas de error que mencionas?