Archive for Mayo, 2007

Grabar una variante de un Dynpro

Alguna vez han querido grabar una variante de un Dynpro? Aquí les dejo un pequeño ejemplo -:)


REPORT Z_VARIANTS.
 
*---------------------------------------------------------------–*
*   TABLES                                                        *
*---------------------------------------------------------------–*
TABLES: SPFLI.
 
*---------------------------------------------------------------–*
*   TYPE-POOLS                                                    *
*---------------------------------------------------------------–*
TYPE-POOLS: SLIS.
 
*---------------------------------------------------------------–*
*   INTERNAL TABLES                                               *
*---------------------------------------------------------------–*
DATA: T_RKEY TYPE STANDARD TABLE OF RSVARKEY WITH HEADER LINE,
      T_SELCTAB TYPE STANDARD TABLE OF RSSCR WITH HEADER LINE,
      T_VARI TYPE STANDARD TABLE OF RVARI WITH HEADER LINE,
      IT_EXTAB TYPE SLIS_T_EXTAB,
      WA_EXTAB LIKE LINE OF IT_EXTAB.
 
*---------------------------------------------------------------–*
*   VARIABLES                                                     *
*---------------------------------------------------------------–*
DATA: OK_CODE TYPE SY-UCOMM,
      W_VARIANT TYPE RSVAR-VARIANT,
      W_USER_VARI TYPE RSVAR-VARIANT,
      W_VARI_REPORT TYPE RSVAR-REPORT,
      SEL_VARIANT TYPE RSVAR-VARIANT,
      SEL_VARIANT_TEXT TYPE RSVAR-VTEXT,
      W_REPORT TYPE RSVAR-REPORT,
      VARIANT_EXISTS TYPE C.
 
*---------------------------------------------------------------–*
*   SELECTION-SCREEN                                              *
*---------------------------------------------------------------–*
SELECTION-SCREEN BEGIN OF SCREEN 101 AS SUBSCREEN.
SELECT-OPTIONS: S_CARRID FOR SPFLI-CARRID,
                S_CONNID FOR SPFLI-CONNID.
SELECTION-SCREEN END OF SCREEN 101.
 
*---------------------------------------------------------------–*
*   INITIALIZATION                                                *
*---------------------------------------------------------------–*
INITIALIZATION.
 
W_REPORT = SY-REPID.
 
PERFORM VARIANT_EXISTS.
 
*---------------------------------------------------------------–*
*   START-OF-SELECTION                                            *
*---------------------------------------------------------------–*
START-OF-SELECTION.
 
  CALL SCREEN 0100.
 
*&----------------------------------------------------------------*
*&      Module  STATUS_0100  OUTPUT                               *
*&----------------------------------------------------------------*
MODULE STATUS_0100 OUTPUT.
 
  SET PF-STATUS '100' EXCLUDING IT_EXTAB.
 
ENDMODULE.                 " STATUS_0100  OUTPUT
 
*&----------------------------------------------------------------*
*&      Module  USER_COMMAND_0100  INPUT                          *
*&----------------------------------------------------------------*
MODULE USER_COMMAND_0100 INPUT.
 
  OK_CODE = SY-UCOMM.
  CASE OK_CODE.
    WHEN 'SAVE'.
      PERFORM SAVE_VARIANT.
      PERFORM VARIANT_EXISTS.
    WHEN 'BACK'.
      LEAVE TO SCREEN 0.
    WHEN 'GET_VAR'.
      PERFORM LOAD_VARIANT.
    WHEN 'DEL_VAR'.
      PERFORM DELETE_VARIANT.
      PERFORM VARIANT_EXISTS.
  ENDCASE.
 
ENDMODULE.                 " USER_COMMAND_0100  INPUT
 
*&----------------------------------------------------------------*
*&      Form  SAVE_VARIANT                                        *
*&----------------------------------------------------------------*
FORM SAVE_VARIANT.
 
  T_RKEY-REPORT = SY-REPID.
  APPEND T_RKEY.
 
  CALL FUNCTION 'RS_VARIANT_SAVE_FROM_SELSCREEN'
       EXPORTING
            CURR_REPORT          = SY-REPID
            VARI_REPORT          = SY-REPID
       IMPORTING
            VARIANT              = W_VARIANT
       TABLES
            P_SSCR               = T_SELCTAB
            P_VARI               = T_VARI
       EXCEPTIONS
            ILLEGAL_VARIANT_NAME = 1
            NOT_AUTHORIZED       = 2
            NO_REPORT            = 3
            REPORT_NOT_EXISTENT  = 4
            REPORT_NOT_SUPPLIED  = 5
            OTHERS               = 6.
 
  T_RKEY-VARIANT = W_VARIANT.
  MODIFY T_RKEY INDEX 1.
 
  CALL FUNCTION 'RS_RWSET_SAVE_VARIANT'
       EXPORTING
            RKEY    = T_RKEY
       TABLES
            SELCTAB = T_SELCTAB.
 
ENDFORM.                    " SAVE_VARIANT
 
*&----------------------------------------------------------------*
*&      Form  LOAD_VARIANT                                        *
*&----------------------------------------------------------------*
FORM LOAD_VARIANT.
 
  PERFORM CHOOSE_VARIANT CHANGING SEL_VARIANT.
 
  IF SEL_VARIANT NE SPACE.
 
    CALL FUNCTION 'RS_SUPPORT_SELECTIONS'
         EXPORTING
              REPORT               = W_REPORT
              VARIANT              = SEL_VARIANT
         EXCEPTIONS
              VARIANT_NOT_EXISTENT = 1
              VARIANT_OBSOLETE     = 2
              OTHERS               = 3.
 
  ENDIF.
 
ENDFORM.                    " LOAD_VARIANT
 
*&----------------------------------------------------------------*
*&      Form  DELETE_VARIANT                                      *
*&----------------------------------------------------------------*
FORM DELETE_VARIANT.
 
  PERFORM CHOOSE_VARIANT CHANGING SEL_VARIANT.
 
  IF SEL_VARIANT NE SPACE.
 
    CALL FUNCTION 'RS_VARIANT_DELETE'
         EXPORTING
              REPORT               = W_REPORT
              VARIANT              = SEL_VARIANT
              FLAG_CONFIRMSCREEN   = 'X'
              FLAG_DELALLCLIENT    = 'X'
         EXCEPTIONS
              NOT_AUTHORIZED       = 1
              NOT_EXECUTED         = 2
              NO_REPORT            = 3
              REPORT_NOT_EXISTENT  = 4
              REPORT_NOT_SUPPLIED  = 5
              VARIANT_LOCKED       = 6
              VARIANT_NOT_EXISTENT = 7
              NO_CORR_INSERT       = 8
              VARIANT_PROTECTED    = 9
              OTHERS               = 10.
 
  ENDIF.
 
ENDFORM.                    " DELETE_VARIANT
 
*---------------------------------------------------------------–*
*       FORM CHOOSE_VARIANT                                       *
*---------------------------------------------------------------–*
FORM CHOOSE_VARIANT CHANGING L_SEL_VARIANT.
 
  CALL FUNCTION 'RS_VARIANT_CATALOG'
       EXPORTING
            REPORT               = W_REPORT
            MASKED               = 'X'
       IMPORTING
            SEL_VARIANT          = L_SEL_VARIANT
            SEL_VARIANT_TEXT     = SEL_VARIANT_TEXT
       EXCEPTIONS
            NO_REPORT            = 1
            REPORT_NOT_EXISTENT  = 2
            REPORT_NOT_SUPPLIED  = 3
            NO_VARIANTS          = 4
            NO_VARIANT_SELECTED  = 5
            VARIANT_NOT_EXISTENT = 6
            OTHERS               = 7.
 
ENDFORM.
 
*&----------------------------------------------------------------*
*&      Form  VARIANT_EXISTS                                      *
*&----------------------------------------------------------------*
FORM VARIANT_EXISTS.
 
CALL FUNCTION 'RS_VARIANT_FOR_ONE_SCREEN'
       EXPORTING
            PROGRAM        = W_REPORT
            DYNNR          = '0101'
       IMPORTING
            VARIANT_EXISTS = VARIANT_EXISTS.
 
  IF VARIANT_EXISTS EQ 'X'.
    CLEAR: WA_EXTAB, IT_EXTAB.
    REFRESH IT_EXTAB.
  ELSE.
    CLEAR: WA_EXTAB, IT_EXTAB.
    REFRESH IT_EXTAB.
    WA_EXTAB-FCODE = 'GET_VAR'.
    APPEND WA_EXTAB TO IT_EXTAB.
  ENDIF.
 
ENDFORM.                    " VARIANT_EXISTS

Y unas cuantas imagenes -;)




Saludos,

Blag.

Comentarios (2)

ALV Tree Orientado a Objetos

Seguramente muchos de ustedes no saben como crear un ALV Tree y quizás menos sepan crearlo utilizando ABAP Orientado a Objetos…Yo hasta hace un par de semanas, tampoco sabía como hacerlo -:) Simplemente porque nunca me lo habían pedido…Así que aquí les dejo un ejemplo simple y funcional.

Lo único que necesitamos es un Dynpro 100, con un Custom Contro llamado TREE_CONTROL.

REPORT Z_ALV_TREE.

*——————————————————————*
* DECLARACION DE TYPES *
*——————————————————————*
TYPES: BEGIN OF TY_SPFLI,
CARRID TYPE SPFLI-CARRID,
CONNID TYPE SPFLI-CONNID,
COUNTRYFR TYPE SPFLI-COUNTRYFR,
CITYFROM TYPE SPFLI-CITYFROM,
AIRPFROM TYPE SPFLI-AIRPFROM,
COUNTRYTO TYPE SPFLI-COUNTRYTO,
CITYTO TYPE SPFLI-CITYTO,
END OF TY_SPFLI.

TYPES: BEGIN OF TY_HEADER,
CARRID TYPE SPFLI-CARRID,
END OF TY_HEADER.

*—————————————————————–*
* DECLARACION DE TABLAS INTERNAS *
*—————————————————————–*
DATA: T_SPFLI TYPE STANDARD TABLE OF TY_SPFLI
WITH HEADER LINE,
TAB_TREE TYPE STANDARD TABLE OF TY_SPFLI
WITH HEADER LINE,
T_TREE TYPE STANDARD TABLE OF TY_SPFLI
WITH HEADER LINE,
T_HEADER TYPE STANDARD TABLE OF TY_HEADER
WITH HEADER LINE.

*—————————————————————–*
* DECLARACION DE VARIABLES *
*—————————————————————–*
DATA: G_ALV_TREE TYPE REF TO CL_GUI_ALV_TREE,
L_HIERARCHY_HEADER TYPE TREEV_HHDR,
GS_FIELDCAT TYPE LVC_S_FCAT,
GT_FIELDCAT_TREE TYPE LVC_T_FCAT,
G_CUSTOM_CONTAINER TYPE REF TO CL_GUI_CUSTOM_CONTAINER.

*—————————————————————–*
* DECLARACION DE FIELD-SYMBOLS *
*—————————————————————–*
FIELD-SYMBOLS: &lt,HEADER> LIKE LINE OF T_HEADER,
&lt,SPFLI> LIKE LINE OF T_SPFLI.

*—————————————————————–*
* SELECTION-SCREEN *
*—————————————————————–*
SELECTION-SCREEN BEGIN OF SCREEN 1001.
SELECTION-SCREEN END OF SCREEN 1001.

*—————————————————————–*
* START-OF-SELECTION *
*—————————————————————–*
START-OF-SELECTION.

PERFORM OBTENER_DATOS.

IF G_ALV_TREE IS INITIAL.
PERFORM INIT_TREE.

CALL METHOD CL_GUI_CFW=>FLUSH
EXCEPTIONS CNTL_SYSTEM_ERROR = 1
CNTL_ERROR = 2.
ENDIF.

CALL SCREEN 100.

*—————————————————————–*
* FORM init_tree *
*—————————————————————–*
FORM INIT_TREE.

DATA: L_TREE_CONTAINER_NAME(30) TYPE C.

L_TREE_CONTAINER_NAME = ‘TREE_CONTROL’.

CREATE OBJECT G_CUSTOM_CONTAINER
EXPORTING
CONTAINER_NAME = L_TREE_CONTAINER_NAME
EXCEPTIONS
CNTL_ERROR = 1
CNTL_SYSTEM_ERROR = 2
CREATE_ERROR = 3
LIFETIME_ERROR = 4
LIFETIME_DYNPRO_DYNPRO_LINK = 5.

CREATE OBJECT G_ALV_TREE
EXPORTING
PARENT = G_CUSTOM_CONTAINER
NODE_SELECTION_MODE = CL_GUI_COLUMN_TREE=>NODE_SEL_MODE_SINGLE
ITEM_SELECTION = ”
NO_HTML_HEADER = ‘X’
NO_TOOLBAR = ”
EXCEPTIONS
CNTL_ERROR = 1
CNTL_SYSTEM_ERROR = 2
CREATE_ERROR = 3
LIFETIME_ERROR = 4
ILLEGAL_NODE_SELECTION_MODE = 5
FAILED = 6
ILLEGAL_COLUMN_NAME = 7.

PERFORM FILL_CATALOG_TREE.
PERFORM BUILD_HIERARCHY_HEADER CHANGING L_HIERARCHY_HEADER.

CALL METHOD G_ALV_TREE->SET_TABLE_FOR_FIRST_DISPLAY
EXPORTING
IS_HIERARCHY_HEADER = L_HIERARCHY_HEADER
CHANGING
IT_OUTTAB = T_TREE[]
IT_FIELDCATALOG = GT_FIELDCAT_TREE.

PERFORM CREATE_HIERARCHY.

ENDFORM.

*—————————————————————–*
* FORM FILL_CATALOG_TREE *
*—————————————————————–*
FORM FILL_CATALOG_TREE.

DATA: GS_FIELDCAT_ADD TYPE LVC_S_FCAT.

CLEAR GS_FIELDCAT.
GS_FIELDCAT-COL_POS = 1.
GS_FIELDCAT-REPTEXT = ‘Flight’.
GS_FIELDCAT-SCRTEXT_S = ‘Flight’.
GS_FIELDCAT-FIELDNAME = ‘CONNID’.
GS_FIELDCAT-TABNAME = ‘T_SPFLI’.
APPEND GS_FIELDCAT TO GT_FIELDCAT_TREE.

CLEAR GS_FIELDCAT.
GS_FIELDCAT-COL_POS = 2.
GS_FIELDCAT-REPTEXT = ‘Country’.
GS_FIELDCAT-SCRTEXT_S = ‘Country’.
GS_FIELDCAT-FIELDNAME = ‘COUNTRYFR’.
GS_FIELDCAT-TABNAME = ‘T_SPFLI’.
APPEND GS_FIELDCAT TO GT_FIELDCAT_TREE.

CLEAR GS_FIELDCAT.
GS_FIELDCAT-COL_POS = 3.
GS_FIELDCAT-REPTEXT = ‘Dep.City’.
GS_FIELDCAT-SCRTEXT_S = ‘Dep.City’.
GS_FIELDCAT-FIELDNAME = ‘CITYFROM’.
GS_FIELDCAT-TABNAME = ‘T_SPFLI’.
GS_FIELDCAT-OUTPUTLEN = ‘15′.
APPEND GS_FIELDCAT TO GT_FIELDCAT_TREE.

CLEAR GS_FIELDCAT.
GS_FIELDCAT-COL_POS = 4.
GS_FIELDCAT-REPTEXT = ‘Dep.Airp’.
GS_FIELDCAT-SCRTEXT_S = ‘Dep.Airp’.
GS_FIELDCAT-FIELDNAME = ‘AIRPFROM’.
GS_FIELDCAT-TABNAME = ‘T_SPFLI’.
GS_FIELDCAT-OUTPUTLEN = ‘20′.
APPEND GS_FIELDCAT TO GT_FIELDCAT_TREE.

CLEAR GS_FIELDCAT.
GS_FIELDCAT-COL_POS = 5.
GS_FIELDCAT-REPTEXT = ‘Country’.
GS_FIELDCAT-SCRTEXT_S = ‘Country’.
GS_FIELDCAT-FIELDNAME = ‘COUNTRYTO’.
GS_FIELDCAT-TABNAME = ‘T_SPFLI’.
GS_FIELDCAT-OUTPUTLEN = ‘15′.
APPEND GS_FIELDCAT TO GT_FIELDCAT_TREE.

CLEAR GS_FIELDCAT.
GS_FIELDCAT-COL_POS = 6.
GS_FIELDCAT-REPTEXT = ‘Arr.City’.
GS_FIELDCAT-SCRTEXT_S = ‘Arr.City’.
GS_FIELDCAT-FIELDNAME = ‘CITYTO’.
GS_FIELDCAT-TABNAME = ‘T_SPFLI’.
GS_FIELDCAT-OUTPUTLEN = ‘20′.
APPEND GS_FIELDCAT TO GT_FIELDCAT_TREE.

ENDFORM.

*———————————————————————*
* FORM build_hierarchy_header *
*———————————————————————*
FORM BUILD_HIERARCHY_HEADER CHANGING
P_HIERARCHY_HEADER TYPE TREEV_HHDR.

CLEAR P_HIERARCHY_HEADER.
P_HIERARCHY_HEADER-HEADING = ‘Airline carrier’(300).
P_HIERARCHY_HEADER-WIDTH = 18.
P_HIERARCHY_HEADER-WIDTH_PIX = ‘ ‘.

ENDFORM.

*———————————————————————*
* FORM create_hierarchy *
*———————————————————————*
FORM CREATE_HIERARCHY.

DATA: L_ROOT_KEY TYPE LVC_NKEY,
L_NEXT_KEY TYPE LVC_NKEY,
L_LAST_KEY TYPE LVC_NKEY,
HEADER TYPE STRING,
W_MENGE_TEXT(13) TYPE C.

CLEAR L_ROOT_KEY.

LOOP AT T_HEADER ASSIGNING &lt,HEADER>.
CLEAR L_ROOT_KEY.
CLEAR L_NEXT_KEY.
PERFORM ADD_NODE USING &lt,HEADER>-CARRID L_ROOT_KEY
CHANGING L_NEXT_KEY.
LOOP AT T_SPFLI ASSIGNING &lt,SPFLI>
WHERE CARRID EQ &lt,HEADER>-CARRID.

MOVE-CORRESPONDING &lt,SPFLI> TO TAB_TREE.

PERFORM ADD_LEAF USING TAB_TREE L_NEXT_KEY
CHANGING L_LAST_KEY.
ENDLOOP.
ENDLOOP.

CALL METHOD G_ALV_TREE->FRONTEND_UPDATE.

ENDFORM.

*———————————————————————*
* FORM ADD_NODE *
*———————————————————————*
FORM ADD_NODE USING L_NAME L_ROOT_KEY
CHANGING L_NEXT_KEY.

DATA: L_NODE_TEXT TYPE LVC_VALUE,
LS_TREE TYPE TY_SPFLI.

L_NODE_TEXT = L_NAME.
CALL METHOD G_ALV_TREE->ADD_NODE
EXPORTING
I_RELAT_NODE_KEY = L_ROOT_KEY
I_RELATIONSHIP = CL_GUI_COLUMN_TREE=>RELAT_LAST_CHILD
I_NODE_TEXT = L_NODE_TEXT
IS_OUTTAB_LINE = LS_TREE
IMPORTING
E_NEW_NODE_KEY = L_NEXT_KEY.

ENDFORM.

*———————————————————————*
* FORM ADD_LEAF *
*———————————————————————*
FORM ADD_LEAF USING L_TREE TYPE TY_SPFLI
L_NEXT_KEY
CHANGING L_LAST_KEY.

CALL METHOD G_ALV_TREE->ADD_NODE
EXPORTING
I_RELAT_NODE_KEY = L_NEXT_KEY
I_RELATIONSHIP = CL_GUI_COLUMN_TREE=>RELAT_LAST_CHILD
IS_OUTTAB_LINE = TAB_TREE
IMPORTING
E_NEW_NODE_KEY = L_LAST_KEY.

ENDFORM.

*———————————————————————*
* FORM OBTENER_DATOS *
*———————————————————————*
FORM OBTENER_DATOS.

SELECT CARRID CONNID COUNTRYFR CITYFROM
AIRPFROM COUNTRYTO CITYTO
INTO TABLE T_SPFLI
FROM SPFLI.

IF SY-SUBRC EQ 0.
LOOP AT T_SPFLI ASSIGNING &lt,SPFLI>.
MOVE &lt,SPFLI>-CARRID TO T_HEADER-CARRID.
APPEND T_HEADER.
ENDLOOP.

SORT T_HEADER.
DELETE ADJACENT DUPLICATES FROM T_HEADER.

ENDIF.

ENDFORM.

Saludos,

Blag.


Technorati tags:

Comentarios (3)

Todos mis ejemplos de PHP y Ruby con SAP!

Si les interesa la integración PHP/SAP y Ruby/SAP, pueden descargar de manera gratuita, dos archivos .zip con todos los emuladores que hecho hasta el momento -:D

PHP/SAP

  • SBWP
  • SE10
  • SE11_SE16
  • SE38
  • SE49
  • SE78
  • SE93
  • SM30
  • SP01
  • ST22

Ruby/SAP

  • SE10
  • SE16
  • SE16 con WxRuby

Para acceder, ingresen a Blag’s Public Box

Saludos,

Blag.

Comentarios (1)

Como pasarle un rango a una función.

Hoy quiero explicar como hago para pasarle un rango a una función. La verdad es que no he creado muchas funciones, porque no soy nada ordenado. Una caracteristica muy mala en un programador, claro está a mi parecer. Por lo que me gustaría si alguién sabe otra forma más comoda de hacerlo lo comente. Sin más rodeos vamos a empezar a describir el proceso.

Como todos sabemos las funciones constan de varias pestañas a través de las cuales les podemos comunicar datos.

Import - Son los parámetros de entrada a la función. Se pueden pasar valores individuales creando el campo referenciandolo a un tipo, o como un campo de una tabla o simplemente indicadole de que tipo es.

Export - Son básicamente igual que los parámetros de entrada, con la única diferencia que son parámetros de salida. Es decir el resultado que nos va a devolver la función.

Modif - Son parametros de entrada/salida es decir que les pasamos un valor y nos devuelve otro.

Y por último Tablas - Son tablas internas que les pasamos a la función, y que son tanto de entrada como de salida. Pues bien este tipo de parámetros son los que vamos a aprovechar para poder pasarle rangos a la función. Ya que un rango no es más que una tabla interna con una determinada estructura.

Pues bien solamente tenemos que buscar una estructura que corresponda al rango que queremos crear. Ejemplo si queremos crear un rango del tipo de centro. Nos vamos a la transacción SE11, pinchamos en tipos de datos y escribimos werks* y le damos al matchcode. Al leer todas las opciones posibles encontraremos una que es werks_rang rangos para werks. Y utilizamos este tipo de dato para crear nuestra tabla de entrada.

Por ultimo solamente tenemos que definirnos un rango igual en el include top del grupo de funciones y asignar el uno al otro.

Bueno como siempre espero vuestras sugerencias, y otras formas de hacer esto.

Comentarios

Como grabar una variante en una función.

He decidido ir escribiendo pequeños trucos elementales para utilizar sap, que me voy dando cuenta con el tiempo.

Muchas veces tenemos que probar una función desde la transacción se37 y tiene muchos parametros de entrada. Pues hasta el dia de hoy no me he dado cuenta de que se podían grabar variantes, como en los programas.

Solamente tienes que completar tus parámetros de entrada, y después pinchamos en tratar –> Grabar reg. de datos o darle al botón grabar. Almacenandolo en una variante que la podremos recuperar en un botón llamado Dir. datos test.

Comentarios

Instalar MiniSAP

Una forma sencilla de aprender y practicar ABAP es instalar MiniSAP.

MiniSAP es un release 4.6D de SAP totalmente funcional durante 1 mes (ampliable 90 días más) con el que practicar la creación de Reports, ALVs, módulos de función, Module Pool, etc. (No aplicable para desarrollar aplicaciones "de nueva generación", como BSPs, Web Dynpro ABAP, etc.; para ello se debe instalar MiniWAS o SAP NetWeaver SneakPreview)

MiniSAP es un pequeño BASIS que contiene una completa base de datos sobre agencias de vuelo. Pero también proporciona la posibilidad de crear nuestros objetos de diccionario.

Aunque es una versión reducida de SAP y con un instaler típico de Windows, no son pocas las personas a las que se les presentan multitud de problemas a la hora de instalarlo. En este blog, intentaré ofrecer una guía step-by-step del procedimiento de instalación de MiniSAP, basado en mi experiencia personal, por supuesto, aunque podréis encontrar más información en el CD de MiniSAP (archivo install.htm) y en los foros especializados, como SAP4 o SDN.

Instalar MiniSAP

Technorati tags: ,

Comentarios

Cerrar
E-mail It