Mas problemas con la funcion F4IF_INT_TABLE_VALUE_REQUEST

Colapsar
X
 
  • Tiempo
  • Mostrar
Limpiar Todo
nuevos mensajes
  • kilofafeure
    Member
    • oct
    • 42

    #1

    Mas problemas con la funcion F4IF_INT_TABLE_VALUE_REQUEST

    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

    Código:
      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
    Senior Member
    • ago
    • 107

    #2
    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

    Comentario

    • kilofafeure
      Member
      • oct
      • 42

      #3
      Esta es la dynpro y aquí hago la llamada al módulo.

      Código:
      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

      Código:
      *&---------------------------------------------------------------------*
      *&      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

      Comentario

      • Atlas
        Senior Member
        • ago
        • 107

        #4
        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 .

        Comentario

        • kilofafeure
          Member
          • oct
          • 42

          #5
          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:

          Código:
          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?
          Editado por última vez por kilofafeure; 19/08/2009, 10:39:26.

          Comentario

          • Atlas
            Senior Member
            • ago
            • 107

            #6
            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....

            Comentario

            • kilofafeure
              Member
              • oct
              • 42

              #7
              Originalmente publicado por Atlas
              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.
              Editado por última vez por kilofafeure; 19/08/2009, 11:54:01.

              Comentario

              • Atlas
                Senior Member
                • ago
                • 107

                #8
                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

                Comentario

                • kilofafeure
                  Member
                  • oct
                  • 42

                  #9
                  Originalmente publicado por Atlas
                  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!

                  Comentario

                  • Atlas
                    Senior Member
                    • ago
                    • 107

                    #10
                    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...

                    Comentario

                    • kilofafeure
                      Member
                      • oct
                      • 42

                      #11
                      Muchas gracias por el interes...habrá que ponerse a debugar, si lo aclaro comento por aquí....Gracias otra vez

                      Comentario

                      • kilofafeure
                        Member
                        • oct
                        • 42

                        #12
                        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í:

                        Código:
                        *&---------------------------------------------------------------------*
                        *&      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

                        Comentario

                        • Atlas
                          Senior Member
                          • ago
                          • 107

                          #13
                          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

                          Comentario

                          • kilofafeure
                            Member
                            • oct
                            • 42

                            #14
                            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.

                            Comentario

                            Trabajando...