PDA

Ver la Versión Completa : Mas problemas con la funcion F4IF_INT_TABLE_VALUE_REQUEST


kilofafeure
14/08/09, 13:01:37
Buenas, el otro día colgué un problema con esta función, el problema que tenía era que no me mostraba el matchcode, aquello se logró solucionar, sin embargo ahora lo que me pasa es que no me devuelve el valor seleccionado. Eso o no he entendido bien como funciona esta función y estoy haciendo algo mal. La cuestión es que me hace el matchcode, pero la tabla it_return siempre me la devuelve vacía, por lo que nunca puedo recuperar ni el objid ni el stext que necesito. ¿Alguien me puede indicar que estoy haciendo mal? Muchas gracias


TYPES: BEGIN OF ty_ubicacio,
objid LIKE hrp1000-objid,
stext LIKE hrp1000-stext,
END OF ty_ubicacio.

DATA: it_ubicacio TYPE STANDARD TABLE OF ty_ubicacio WITH HEADER LINE,
it_return TYPE STANDARD TABLE OF ddshretval WITH HEADER LINE.

CLEAR: it_ubicacio, it_ubicacio[], it_return, it_return[], SELECCIO_LLOC.

SELECT objid stext FROM hrp1000
INTO CORRESPONDING FIELDS OF TABLE it_ubicacio
WHERE otype = 'F' AND
endda GE sy-datum AND
plvar = '01' AND
istat = '1'.

SORT it_ubicacio BY stext.

CALL FUNCTION 'F4IF_INT_TABLE_VALUE_REQUEST'
EXPORTING
retfield = 'STEXT'
dynpprog = sy-repid
dynpnr = '3000'
dynprofield = 'SELECCIO_LLOC'
value_org = 'S'
multiple_choice = 'X'
TABLES
value_tab = it_ubicacio
return_tab = it_return
EXCEPTIONS
PARAMETER_ERROR = 1
NO_VALUES_FOUND = 2
OTHERS = 3
.
IF sy-subrc <> 0.
MESSAGE ID SY-MSGID TYPE SY-MSGTY NUMBER SY-MSGNO
WITH SY-MSGV1 SY-MSGV2 SY-MSGV3 SY-MSGV4.
ELSE.
READ TABLE it_return INDEX 1.
id_object_f = it_return-fieldval.
ENDIF.

Atlas
17/08/09, 10:55:55
Hola, he probado el codigo en un report ejecutable Z y funciona correctamente, debe ser algo relacionado con donde estas haciendo la llamada a la función, aunque no termino de ver en que influye

kilofafeure
17/08/09, 11:13:37
Esta es la dynpro y aquí hago la llamada al módulo.


PROCESS BEFORE OUTPUT.
* MODULE STATUS_3000.
MODULE INIT_3000.

PROCESS AFTER INPUT.
MODULE USER_COMMAND_3000.

PROCESS ON VALUE-REQUEST.
FIELD SELECCIO_LLOC MODULE VALORS_SELECCIO_LLOC2.


Y este es el módulo, ahora está un poco diferente porque he estado probando cosas y creo que mejorándolo...pero sigue sin funcionar, la tabla it_return siempre me vuelve vacia


*&---------------------------------------------------------------------*
*& Module VALORS_SELECCIO_LLOC2 INPUT
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
MODULE valors_seleccio_lloc2 INPUT.

TYPES: BEGIN OF ty_ubicacio,
objid TYPE hrp1000-objid,
stext TYPE hrp1000-stext,
END OF ty_ubicacio,
t_return_tab TYPE ddshretval.

DATA: it_ubicacio TYPE STANDARD TABLE OF ty_ubicacio,
it_return TYPE STANDARD TABLE OF ddshretval,
wa_ubicacio TYPE ty_ubicacio,
wa_return_tab TYPE t_return_tab.


IF it_ubicacio[] IS INITIAL. "Para hacer el select solo una vez, la 1ª q se pase
CLEAR: it_ubicacio, it_ubicacio[], it_return, it_return[], seleccio_lloc.
SELECT objid stext FROM hrp1000
INTO CORRESPONDING FIELDS OF TABLE it_ubicacio
WHERE otype = 'F' AND
endda GE sy-datum AND
plvar = '01' AND
istat = '1'.

SORT it_ubicacio BY stext.
ENDIF.

CALL FUNCTION 'F4IF_INT_TABLE_VALUE_REQUEST'
EXPORTING
retfield = 'OBJID'
dynpprog = sy-cprog
dynpnr = sy-dynnr
dynprofield = 'SELECCIO_LLOC'
value_org = 'S'
TABLES
value_tab = it_ubicacio
return_tab = it_return
EXCEPTIONS
parameter_error = 1
no_values_found = 2
OTHERS = 3.
IF sy-subrc <> 0.
MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno
WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
ELSE.
IF sy-ucomm = 'SELE' AND it_return IS NOT INITIAL.
READ TABLE it_return INTO wa_return_tab INDEX 1.
SELECCIO_LLOC = wa_return_tab-fieldval.
* id_object_f.
* SET SCREEN 0.
* LEAVE SCREEN.
ELSE.
info_text3 = text-023.
ENDIF.
ENDIF.

ENDMODULE. " VALORS_SELECCIO_LLOC2 INPUT

Atlas
17/08/09, 13:09:59
Pues no lo entiendo, yo he hecho algo parecido y la unica diferencia es que en vez de hacerlo en un module, dentro de este hice un perform y ahi la llamada a la funcion (era otra funcion pero no creo que influya ), Prueba a meter todo en un perform, poco mas te puedo decir :(.

kilofafeure
19/08/09, 10:26:30
He estado haciendo más pruebas y he visto que hace una cosa rara, a ver si va a ser por esto, aunque no se porque pasa...Me explico, cuando me salta el pop up el matchcode me aparece correctamente. Cuando yo selecciono algo del matchcode hago que sy-ucom se ponga a SELE y por lo tango que mue vuelva a tratar la dynpro, pues bien he puesto esto:


MODULE user_command_3000 INPUT.
CASE sy-ucomm.

WHEN 'SELE'.
id_object_f = seleccio_lloc.
* SET SCREEN 0.
* LEAVE SCREEN.


y al debugar seleccio_lloc, que es donde cargo el matchcode, tiene valor 50 y no tiene el valor del id del texto seleccionado ni el propio texto. ¿Saben a qué se debe esto? además 50 son los dos primeros valores del id . El Valor 50 cuando vuelve a la dynpro me aparece dentro del matchcode. ¿Podria ser por esto que la tabla it_return me vuelva siempre vacia? ¿Como lo puedo arreglar?

Atlas
19/08/09, 11:25:57
Es posible que la función te este recogiendo en el campo de pantalla directamente el valor seleccionado. Si quieres tratarlo manualmente comenta:

dynpprog = sy-cprog
dynpnr = sy-dynnr
dynprofield = 'SELECCIO_LLOC'

Y un consejo, en el module user_command mejor utiliza el ok_code de la pantalla y no el sy-uccom

A ver si es eso....

kilofafeure
19/08/09, 11:50:09
Es posible que la función te este recogiendo en el campo de pantalla directamente el valor seleccionado. Si quieres tratarlo manualmente comenta:

dynpprog = sy-cprog
dynpnr = sy-dynnr
dynprofield = 'SELECCIO_LLOC'

Y un consejo, en el module user_command mejor utiliza el ok_code de la pantalla y no el sy-uccom


He comentado las 3 lineas y me hace exactamente lo mismo...y lo del ok_code no lo entiendo muy bien, utilizo el sy-ucom pq en el campo de la dynpro en el Cód.func. le tengo puesto SELE, no por otra cosa, una vez que han seleccionado una de las posibles opciones me salta para hacer las comprobaciones y obtener el valor clicado...el ok_code lo he visto en alguna función pero no lo he utilizado nunca, en estoy soy casi autodidacta y según que cosas no se para que sirven...gracias por intentar ayudarme, esto es desesperante.

Atlas
19/08/09, 12:33:17
jejejej tranquilo hombre... todos hemos tenido incios dificiles.

el ok_code es un parametro de la pantalla que se utiliza para controlar el código de funcion ( como el sy-uccom pero para la pantalla )

El codigo sele ( si no me equivoco ) no necesitas tratarlo en el user_command ya que al desplegar el match code salta el module del mismo y es donde tienes que hacer todas las modificaciones, no en el user command.

La función no tengo ni idea de por que no te funciona ( a mi si ) prueba, auqnue sea bastante trabajo a ver si te sirve esta:

HELP_VALUES_GET_WITH_TABLE

A la que le tienes que pasar tu campo de pantalla en el parametro que retorna y te lo rellena directamente, solo tiene un inconveniente y es que no permite seleccion multiple

Con cualquier cosa me vas contando ;)

kilofafeure
19/08/09, 12:40:46
La función no tengo ni idea de por que no te funciona ( a mi si ) prueba, auqnue sea bastante trabajo a ver si te sirve esta:
HELP_VALUES_GET_WITH_TABLE


Estuve utilizando esta funcion porque la vi en otra dynpro y funcionaba bien alli pero en esta no me funcionaba, me pasaba lo mismo que me pasa ahora, que me devolvia la tabla vacia. Entonces busqué por internet y vi que estaba en desuso y que debia utilizar la de F4..., pense que alomejor seria eso pero no, ¿puede ser un problema de configuracion de algo?

Gracias por la explicacion del ok_code!

Atlas
19/08/09, 13:05:51
Pues no sabría decirte... :S el caso es que el mismo codigo a mi me funciona, y no se por que a ti no... sabes lo que hago yo en estos casos??? echarle moral y debuguearme la función.

Si no tal vez puedas pedir ayuda a alguien de sistemas o no se.... ya te digo que ni idea de por que puede ser...

kilofafeure
20/08/09, 06:50:18
Muchas gracias por el interes...habrá que ponerse a debugar, si lo aclaro comento por aquí....Gracias otra vez

kilofafeure
20/08/09, 09:39:36
Al final lo he logrado solucionar, no se si es la más correcta pero funciona. La solución ha sido quitar en la dynpro la opción listbox y por tanto el código de función y dejar el módulo así:


*&---------------------------------------------------------------------*
*& Module VALORS_SELECCIO_LLOC2 INPUT
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
MODULE valors_seleccio_lloc2 INPUT.

TYPES: BEGIN OF ty_ubicacio,
objid TYPE hrp1000-objid,
stext TYPE hrp1000-stext,
END OF ty_ubicacio,
t_return_tab TYPE ddshretval.

DATA: it_ubicacio TYPE STANDARD TABLE OF ty_ubicacio WITH HEADER LINE,
it_return TYPE STANDARD TABLE OF ddshretval,
wa_ubicacio TYPE ty_ubicacio,
wa_return_tab TYPE t_return_tab.


DATA: BEGIN OF valuetab OCCURS 10.
DATA: value(50) TYPE c.
DATA: END OF valuetab.

DATA: returnvalue TYPE TABLE OF ddshretval WITH HEADER LINE.



IF it_ubicacio[] IS INITIAL. "Para hacer el select solo una vez, la 1ª q se pase
CLEAR: it_ubicacio, it_ubicacio[], it_return, it_return[], seleccio_lloc.
SELECT objid stext FROM hrp1000
INTO CORRESPONDING FIELDS OF TABLE it_ubicacio
WHERE otype = 'F' AND
endda GE sy-datum AND
plvar = '01' AND
istat = '1'.

SORT it_ubicacio BY stext.
ENDIF.


CALL FUNCTION 'F4IF_INT_TABLE_VALUE_REQUEST'
EXPORTING
retfield = 'OBJID'
dynpprog = sy-cprog
dynpnr = sy-dynnr
dynprofield = 'OBJID'
value_org = 'S'
TABLES
value_tab = it_ubicacio
return_tab = returnvalue
EXCEPTIONS
parameter_error = 1
no_values_found = 2
OTHERS = 3.

id_object_f = returnvalue-fieldval.
leave to screen 0.

ENDMODULE. " VALORS_SELECCIO_LLOC2 INPUT

Atlas
20/08/09, 09:55:56
Anda!!!

haber empezado por decir que era un listbox... >_<.

Te explico, ( aunque no termino de entender que tendrá que ver con que la función devolviera la tabla vacía )

Un listbox es un tipo de campo que permite exclusivamente seleccionar un valor de entre una lista predefinida para dicho campo, parecido a un match code pero no exactamente igual. Mientras que un match code es simplemente una ayuda de busqueda para introducir valores existentes en el sistema. Si dicho campo no tiene tabla de verificación, el valor que puedes introducir no tiene por que ser uno de los valores del match code.

Por lo tanto, y aunque nunca lo he intentado, el matchcode para un listbox no tendria sentido y provablemente sean incompatibles.

Me alegro de que dieras con la solución ;)

kilofafeure
20/08/09, 10:09:46
Pero es muy raro porque utilizando la otra funcion que me dijiste la he visto funcionar con un listbox, sin embargo en este caso no me funcionaba...en fin, ya esta arreglado...gracias otra vez por tu tiempo.