Status de Sistema AJTM (Ajuste manual necesario)

24 05 2008

Los otros días tuve que liberar un grafo operativo (un grafo operativo nace en forma automática con la creación de la orden de venta, copiándose del grafo Standard). Lo cual suele ser algo relativamente sencillo: Tratar –> Status –> Liberar.
Pero sorpresivamente me encontré con el mensaje de error:
“El status del sistema AjtM está activo: Para el objeto GRF 6000022 se activó el status de sistema AjtM (Ajuste manual necesario). Este prohibe la ejecución de la operación ‘Liberar’.

Esta era la primera vez que veía este status, ya que no es de los más comunes. Como ser EDET, FENA, LIBP, NOTP, etc.

Era obvio que debía desactivar el status AjtM para poder liberar mi grafo. El problema era qué significaba Ajuste manual necesario y dónde se activaba?.

Luego de investigar un buen rato, romperme un poco la cabeza y algunas pruebas, pude encontrar la solución:
Hay que tratar el grafo operativo desde la transacción CN22. Ir al menú Detalles –> Configuración –> Gestión modif.

Aquí podemos gestionar modificaciones en la configuración del grafo. Nos encontraremos con una tabla con todas las comparaciones de modificación.
Para crear o cerrar una modificación lo hacemos desde menú Tratar“.
Seleccionando una entrada y luego apretando el botón “Pasos de modificación“, veremos en detalle todos los componentes y tendremos marcados aquellos para realizarles modificaciones. Finalmente apretando F8 efectuaremos todos los pasos de modificación disponibles.

Resumiendo entonces, tuve que cerrar todas las entradas de comparación de modificaciones. Consiguiendo  desactivar el status AjtM y así lograr liberar el grafo.


Technorati tags:







Cambiar la denominación de las clases de órdenes

23 04 2008

Este documento explica cómo cambiar la denominación de las clases de órdenes para una orden de trabajo (OT).

La modificación se debe realizar desde el mandante de desarrollo. Para luego transportar una orden hasta el mandante de producción.

Pasos a seguir:

1º) Ingresar al Customizing:

clip_image002 y clickear en botón clip_image004

 

2º) Seguir el camino:

Mantenimiento y servicio al cliente -> Gestión de mantenimiento y servicio -> Órdenes de mantenimiento y de servicios -> Funciones y parametrizaciones de clases de orden -> Parametrizar clases de órdenes

clip_image006

 

3º) Modificar los textos de las Clases de órdenes que deseamos y luego apretar el botón de guardar

clip_image008

Nos pedirá que grabemos los cambios en una orden de transporte

 

4º) El último paso es agregar las modificaciones en nuestra orden de transporte:

Hay que pasar al modo de visualización: clip_image010

Seleccionamos las filas que queremos transportar:

clip_image012

Y vamos al menú: Tratar -> Transporte -> Incluir en la orden

Finalmente, sólo nos resta pedir que pasen la orden de transporte hasta el ambiente de producción.


Technorati tags:





Bases de datos lógica – HR

19 04 2008

¿Qué es una base de datos lógica?

Una base de datos lógica (BDL) es un programa SAP especial abap/4 que lee y procesa información de tablas de una base de datos. Puede incluirse como atributo de un programa abap/4 de usuario, y se compila conjuntamente con él.
Desde la transacción SE36 podemos crear o administrar base de datos lógica.
Más información sobre BDL

 

¿Cómo utilizar base de datos lógica en nuestros programas?

Voy a mostrar como usamos BDL en nuestros reportes. Este es un ejemplo para un programa para el módulo de HR (Human Resources), ya que para ese módulo se utilizan mucho las bases de datos lógica.

Para agregar una BDL en un programa hay que ir a la transacción SE38 donde colocamos el nombre de nuestro reporte, nos posicionamos en la opción Atributos y clickeamos en Modificar.

image 

Tenemos que modificar las siguientes opciones:

Aplicación: elegimos el tipo de aplicación, en este caso por ser de HR elegí Gestión de personal.
Base de datos lógica: completamos con el nombre de una BDL, las mismas se pueden visualizar desde la SE36.
Vers.imagen selecc: Acá se elige el tipo de pantalla de selección que queremos para nuestro reporte.

 

Se pueden crear o modificar los filtros de selección:
Clickeando en el botón Clase report HR

image 
En este caso PY_DEF es un tipo de pantalla de selección, para ver las opciones de la misma o crear una nueva definición de filtros vamos a la opción Clase report.
Se abrirá una tabla donde vamos a poder crear nuevas entradas y elegir los filtros de selección que queramos que aparezcan en nuestra pantalla inicial.

 

Finalmente para traer los datos de la BDL; desde nuestro código fuente utilizamos la sentencia GET más el nombre de la tabla. Ej: GET PAYROLL. 

En este link podrán encontrar más detalles sobre el uso de base de datos lógica y HR.


Technorati tags:





Transacción SM04 – Lista de usuarios

18 04 2008

Con la transacción SM04 vamos a poder visualizar los usuarios conectados en el mandante.

Podemos ver entre otras cosas:

  • la terminal de donde esta conectado el usuario
  • la cantidad de modos que tiene abierto
  • el consumo de memoria

 

Desde esta transacción también podemos cerrar el modo/transacción/programa de un usuario. Para eso debemos seleccionar al usuario, clickear en el botón Modos. Esto nos abrirá un pop up donde nos posicionamos en la transacción y apretamos en Borrar modo.


Technorati tags:





Transacción SU01 – Actualización de usuarios

17 04 2008

Con la transacción SU01 podemos crear, copiar, eliminar o modificar la clave de cualquier usuario.

También se puede modificar un usuario:

  • los datos personales
  • los datos logon
  • los parámetros
  • los roles

 


Technorati tags:





Transacción SCC4 – Vista de Mandantes

16 04 2008

La transacción SCC4 nos lista los mandantes de un ambiente. Nos muestra el Nro de mandante, la denominación, población y moneda.


Technorati tags:





Transacción SM66 – Resumen general de procesos

15 04 2008

SM66 es la transacción que nos muestra todos los procesos que se están corriendo en el servidor.

Esta transacción nos detalla lo siguiente:

  • Nombre del servidor
  • Número y Tipo del proceso de trabajo
  • Identificación del proceso del sistema operativo
  • Status del proceso de trabajo
  • Motivo de espera
  • Tiempo de CPU consumido
  • Nombre del usuario cuya orden está siendo ejecutada
  • Report ejecutado actualmente
  • Actividad actual del proceso de trabajo
  • Tabla BD a la que accedió por última vez el proceso trabajo

Otra opción importante que tenemos es la de poder activar el modo debugging en cualquiera de los procesos que se estén ejecutando. Para esto sólo hay que elegir el proceso y clickear en el botón Debugging.


Technorati tags:





Enviar e-mails desde SAP

23 01 2008

Con la función SO_DOCUMENT_SEND_API1 se pueden enviar mails desde nuestros programas.
Hay que tener en cuenta que una vez que se ejecuta la función, el email debe ser liberado con la transacción SCOT (guía de configuración).


Technorati tags:





Tabla TNAPR – tratamiento de mensajes

11 12 2007

La tabla transparente TNAPR contiene toda la información referida al tratamiento de clase de mensajes.

Se puede buscar u obtener información de:

  • Clase de mensaje
  • Medio de envío
  • Aplicación
  • Programa impresor
  • Rutina form
  • Formulario

Es muy útil cuando hay que modificar formularios, ya sean sapscripts o smartforms.


Technorati tags:





TRY-CATCH para ABAP

8 12 2007

El otro día viendo la documentación de SAP me encontré que existe la posibilidad de utilizar en ABAP el TRY-CATCH (muy usado en Java).
TRY-CATCH sirve para el manejo de errores y excepciones. Y nos puede ser muy útil para evitar los odiosos Short Dumps.


Dejo un ejemplo donde trato de insertar un registro en una tabla Z usando try-catch para evitar errores de SQL:

*Intento insertar un registro en la tabla ZPROYECTOS, si hay algún tipo de error de SQL (que generalmente arroja un dump)… manejo la excepción con un mensaje de advertencia.
                TRY.
                    INSERT INTO ZPROYECTOS VALUES WA_ZPROYEC.  
                  CATCH CX_SY_DYNAMIC_OSQL_ERROR.
                    MESSAGE ‘Error al actualizar la tabla ZPROYECTOS’ TYPE ‘I’.
                ENDTRY.


Technorati tags:





RSTXPDFT4 – Pasar orden de spool (formulario) a PDF

7 12 2007

RSTXPDFT4 es un programa estándar que se corre desde la transacción SE38 y que sirve para convertir un sapscript (formulario) o orden de spool a pdf.

Solamente hay que pasarle como filtro el número de una orden de spool y si deseamos una ruta para guardarla en PDF.
Para encontrar una orden de spool, hay que ir al menú Sistema –> Órdenes SPOOL propias o bien buscarla en la tabla TSP01.


Technorati tags:





Pasar orden de spool a PDF

6 12 2007

Es común que nos pidan hacer un resguardo de un formulario. Y probablemente tengamos que hacer el backup a PDF.
Con este código vamos a poder tomar una orden de spool, por ejemplo de un formulario, para luego crear el PDF.


  DATA: IT_TSP01 LIKE TSP01 OCCURS 0 WITH HEADER LINE.
  DATA: NUMBYTES TYPE I,
             PDFSPOOLID LIKE TSP01-RQIDENT,
             IT_PDF LIKE TLINE OCCURS 0.

*Lo primero es buscar el número de la orden de spool en la tabla  TSP01. *En este caso le paso el nombre del usuario y el mandante.
  SELECT RQIDENT
     INTO (IT_TSP01-RQIDENT)
     FROM TSP01
     WHERE RQOWNER EQ SY-UNAME
       AND RQCLIENT EQ SY-MANDT.
    APPEND IT_TSP01.
  ENDSELECT.

*Ordeno en forma descendente para quedarme con el último formulario *generado
  SORT IT_TSP01 DESCENDING.

*Al siguiente módulo de función le paso el número de la orden para que *me devuelva el formulario dentro de la tabla IT_PDF
  CALL FUNCTION ‘CONVERT_OTFSPOOLJOB_2_PDF’
    EXPORTING
      SRC_SPOOLID              = IT_TSP01-RQIDENT
    IMPORTING
      PDF_BYTECOUNT            = NUMBYTES
    TABLES
      PDF                      = IT_PDF
    EXCEPTIONS
      ERR_NO_OTF_SPOOLJOB      = 1
      ERR_NO_SPOOLJOB          = 2
      ERR_NO_PERMISSION        = 3
      ERR_CONV_NOT_POSSIBLE    = 4
      ERR_BAD_DSTDEVICE        = 5
      USER_CANCELLED           = 6
      ERR_SPOOLERROR           = 7
      ERR_TEMSEERROR           = 8
      ERR_BTCJOB_OPEN_FAILED   = 9
      ERR_BTCJOB_SUBMIT_FAILED = 10
      ERR_BTCJOB_CLOSE_FAILED  = 11
      OTHERS                   = 12.

  IF SY-SUBRC EQ 0.

*Una vez que tengo el formulario en la tabla hago el download 
    CALL FUNCTION ‘GUI_DOWNLOAD’
      EXPORTING
        BIN_FILESIZE            = NUMBYTES
        FILENAME                = P_FILE
        FILETYPE                = ‘BIN’
      TABLES
        DATA_TAB                = IT_PDF
      EXCEPTIONS
        FILE_WRITE_ERROR        = 1
        NO_BATCH                = 2
        GUI_REFUSE_FILETRANSFER = 3
        INVALID_TYPE            = 4
        NO_AUTHORITY            = 5
        UNKNOWN_ERROR           = 6.

    IF SY-SUBRC EQ 0.
      MESSAGE I014(ZSM) WITH P_FILE
           ‘ .Nombre de archivo creado’
           ‘ con Nro. Doc. Interno Sap.’.
    ELSE.
      MESSAGE I014(ZSM) WITH P_FILE.
      DELETE FROM TSP01 WHERE RQIDENT EQ T_TSP01-RQIDENT.
    ENDIF.

  ENDIF.


Technorati tags:





Formas de recordar o relacionar los nombres de las tablas de SAP

29 11 2007

La manera fácil de recordar las tabla en sap es:

Simplemente hay que tratar de relacionar la terminología de SAP para los objetos de negocio.

Todas las tablas de proveedores comienzan con L como ser LFA1, etc..
Todas las tablas de clientes comienzan con K … KNA1, KONV, etc..
Todas las tablas de ventas comienzan con V… VBAK, VBAP, etc..
Todas las tablas de maestros comienzan con T… T001, T001W, etc..
Todas las tablas de bancos comienzan con B.. BKNF, BKPF, etc..
Todas las tablas de compras comienzan con E.. EKKO, EKPO, etc..
Todas las tablas de materiales comienzan con M… MARA, MAKT, MARC, etc..

 

En ventas, entregas, facturación y compras:
Si el nombre de la tabla contiene una K es de cabecera de datos, como VBAK, LIKP, VBRK, EKKO, etc..
Si el nombre de la tabla contiene una P es de posición, como VBAP, LIPS, VBRP, EKPO, etc..

 

En el módulo de finanzas (FI)… existen solamente 6 tablas importantes…
Pueden ser recordadas por:
Si el nombre de la tabla contiene una I, es una posición abierta. Ej: BSID
Si el nombre de la tabla contiene una A, es una posición cerrada. Ej: BSAD
Si el nombre de la tabla termina con S, es una cuenta GL. Ej: BSIS – GL maestro de posiciones abiertas, BSAS – GL maestro de posiciones cerradas.
Por otro lado, si el nombre de la tabla termina con una D es de clientes. Y si el nombre de la tabla termina con una K, es de proveedores. 

 

Finalmente, la tabla TSTC contiene la lista de todas las transacciones.


Technorati tags:





Crear Matchcodes (ayudas) con una tabla interna.

28 11 2007

El próximo ejemplo sirve para crear ayudas (matchcodes) con una tabla interna de nuestro programa.
Así de simple, hacemos una búsqueda a alguna tabla y el resultado lo guardamos en una tabla interna que se la pasamos a la función F4IF_INT_TABLE_VALUE_REQUEST que nos va a mostrar la ayuda.

Quiero agradecer esta forma de crear ayudas a mi compañero y amigo Rodrigo (http://ramgv-sap.blogspot.com).


*En este ejemplo creo un select-option para un material. Cuya ayuda será *el nº de material para VBELN =  ‘0000000001’ y POSNR = ‘000010’.

TABLES: VBAP,
             DDSHRETVAL.

DATA: BEGIN OF IT_MATNR OCCURS 0,
               MATNR LIKE VBAP-MATNR,
               ARKTX LIKE VBAP-ARKTX,
           END OF IT_MATNR.

DATA: BEGIN OF IT_MATCH OCCURS 0,  “Esta tabla nos devuelve la ayuda
               SHLPNAME  LIKE DDSHRETVAL-SHLPNAME,
               FIELDNAME LIKE DDSHRETVAL-FIELDNAME,
               RECORDPOS LIKE DDSHRETVAL-RECORDPOS,
               FIELDVAL  LIKE DDSHRETVAL-FIELDVAL,
               RETFIELD  LIKE DDSHRETVAL-RETFIELD,
           END OF IT_MATCH.

SELECTION-SCREEN BEGIN OF BLOCK BLQ1 WITH FRAME TITLE TEXT-T01.
  SELECT-OPTIONS: S_MATNR FOR VBAP-MATNR NO-EXTENSION NO INTERVALS.
SELECTION-SCREEN END OF BLOCK BLQ1.

AT SELECTION-SCREEN ON VALUE-REQUEST FOR S_MATNR-LOW.
  SELECT MATNR
              ARKTX
      FROM VBAP
        INTO TABLE IT_MATNR
        WHERE VBELN EQ ‘0000000001’ AND
                    POSNR EQ ‘000010’.

  CALL FUNCTION ‘F4IF_INT_TABLE_VALUE_REQUEST’
    EXPORTING
      RETFIELD        = ‘MATNR’
      WINDOW_TITLE    = ‘Material’
      VALUE_ORG       = ‘S’
    TABLES
      VALUE_TAB       = IT_MATNR
      RETURN_TAB      = IT_MATCH
    EXCEPTIONS
      PARAMETER_ERROR = 1
      NO_VALUES_FOUND = 2
      OTHERS          = 3.

  IF SY-SUBRC EQ 0.
    READ TABLE IT_MATCH INDEX 1.
    MOVE IT_MATCH-FIELDVAL TO S_MATNR-LOW.
  ENDIF.


Technorati tags:





Ayudas (matchcodes) para entradas en base al tipo de datos

27 11 2007

Generalmente cuando queremos agregar ayudas (matchcodes) vamos a la transacción SE11 y nos fijamos qué “Ayuda para búsqueda” tiene asociado el campo.

Pero muchas veces el matchcode es del tipo “Ayudas para entradas en base al tipo de datos”. En esos casos la ayuda se genera con una función.
Por tal motivo la solución es buscar alguna transacción que tenga el matchcode del campo que necesitamos y debuggueamos al momento de abrir la ayuda para encontrar la función.

A continuación voy a dejar un ejemplo para los campos LAUFD (Fecha de Ejecución) y LAUFI (ID Ejecución). Son parámetros muy comunes (Ej: transacción F110).


DATA: TLAUFK LIKE ILAUFK OCCURS 0 WITH HEADER LINE.

PARAMETERS:
            P_LAUFD LIKE F110V-LAUFD OBLIGATORY,   “Fecha de Ejecución
            P_LAUFI LIKE F110V-LAUFI OBLIGATORY.     “ID Ejecución

**Habilito con la tecla F4 el matchcode para el campo LAUFI
AT SELECTION-SCREEN ON VALUE-REQUEST FOR P_LAUFI.
  REFRESH TLAUFK.
  TLAUFK-LAUFK = SPACE.
  TLAUFK-SIGN = ‘I’.
  APPEND TLAUFK. 

  CALL FUNCTION ‘F4_ZAHLLAUF’
    EXPORTING
      F1TYP = ‘D’
      F2NME = ‘P_LAUFI’
    IMPORTING
      LAUFD = P_LAUFD
      LAUFI = P_LAUFI
    TABLES
      LAUFK = TLAUFK.

 

**Habilito con la tecla F4 el matchcode para el campo LAUFD
AT SELECTION-SCREEN ON VALUE-REQUEST FOR P_LAUFD.
  REFRESH TLAUFK.
  TLAUFK-LAUFK = SPACE.
  TLAUFK-SIGN = ‘I’.
  APPEND TLAUFK. 

CALL FUNCTION ‘F4_ZAHLLAUF’
    EXPORTING
      F1TYP = ‘D’
      F2NME = ‘P_LAUFI’
    IMPORTING
      LAUFD = P_LAUFD
      LAUFI = P_LAUFI
    TABLES
      LAUFK = TLAUFK.


Technorati tags:





ALV Tree Orientado a Objetos

26 11 2007

Hace unos días en el trabajo me tocó hacer un reporte ALV Tree .
image 

No encontré mucha información ni manuales al respecto, mucho menos en español. Pero por suerte pude encontrar un ejemplo que me sirvió mucho. Es un post de ALV Tree orientado a objetos del conocido Alvaro Tejada Galindo (http://atejada.blogspot.com/2007/05/alv-tree-orientado-objetos.html#links)

Por lo tanto aprovecho para hacer referencia de ese post con algunas cosas que faltaban y cambios en la sintaxis para que active. Y además voy a describir en detalle como crear una Dynpro y el Custom Control necesarios para correr el reporte ALV Tree.


1º) Desde la transacción SE38 creamos el reporte Z_ALV_TREE y pegamos el siguiente código:

*&———————————————————————*
*& Report  Z_ALV_TREE                                                  *
*&                                                                     *
*&———————————————————————*
*&                                                                     *
*&                                                                     *
*&———————————————————————*

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:  <HEADER> LIKE LINE OF T_HEADER,
                <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 <HEADER>.
    CLEAR L_ROOT_KEY.
    CLEAR L_NEXT_KEY.
    PERFORM ADD_NODE USING <HEADER>-CARRID L_ROOT_KEY
                     CHANGING L_NEXT_KEY.
    LOOP AT T_SPFLI ASSIGNING <SPFLI>
    WHERE CARRID EQ <HEADER>-CARRID.

      MOVE-CORRESPONDING  <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 <SPFLI>.
      MOVE <SPFLI>-CARRID TO T_HEADER-CARRID.
      APPEND T_HEADER.
    ENDLOOP.

    SORT T_HEADER.
    DELETE ADJACENT DUPLICATES FROM T_HEADER.

  ENDIF.

ENDFORM.

2º) Luego de activar el reporte vamos a la transacción SE80:
Buscamos nuestro programa Z_ALV_TREE. Nos paramos sobre la carpeta con mismo nombre, click con el botón derecho del mouse… opción Crear y luego Dynpro: 
image
Ingresamos como número de dynpro 100. Ponemos la descripción que queramos y luego de activar apretamos el botón “Dispos.

A continuación se va a abrir el Screen Painter: 
Clickeamos en el botón Custom Control (image ) y creamos un cuadrado con el nombre TREE_CONTROL
image
Simplemente falta guardar, activar… cerrar el Screen Painter. Y por último en la transacción SE80 doble click en la carpeta Z_ALV_TREE y ejecutamos.
Cabe aclarar que este ejemplo trabaja con la tabla SPFLI que se usa comúnmente en los ejemplos.


Technorati tags:





Programa para listar el contenido de un IDOC

25 11 2007

Con el siguiente reporte vamos a poder mostrar el contenido de un IDOC y luego guardarlo en un fichero.
Simplemente corremos el programa con el número de IDOC y luego que se liste el contenido, podemos grabar un fichero desde el menú Lista —> Grabar/Enviar —> Fichero…


REPORT Z_DISPLAY_IDOC LINE-SIZE 275.

DATA: IDOC_CONTROL LIKE EDIDC,
      NUMBER_OF_DATA_RECORDS LIKE SY-DBCNT,
      NUMBER_OF_STATUS_RECORDS LIKE SY-DBCNT,
      INT_EDIDS LIKE EDIDS OCCURS 0 WITH HEADER LINE,
      INT_EDIDD LIKE EDIDD OCCURS 0 WITH HEADER LINE.

TYPE-POOLS :  LEDID.

DATA: STRUCT_TYPE TYPE  LEDID_STRUCT_TYPE ,
      IDOC_STRUCT TYPE  LEDID_T_IDOC_STRUCT,
      SEGMENTS TYPE  LEDID_T_SEGMENT,
      SEGMENT_STRUCT TYPE  LEDID_T_SEGMENT_STRUCT,
      EXCEL_TAB(2000) OCCURS 0 WITH HEADER LINE.

PARAMETER: DOCNUM LIKE EDIDC-DOCNUM OBLIGATORY, “”Idoc Number
           SAP_REL LIKE SY-SAPRL DEFAULT SY-SAPRL OBLIGATORY,
           PI_VER LIKE EDI_VERREC-VERSION DEFAULT ‘3’ OBLIGATORY.

START-OF-SELECTION.
  PERFORM READ_IDOC.
  PERFORM PROCESS_IDOC.

END-OF-SELECTION.

*&———————————————————————*
*&      Form  read_idoc
*&———————————————————————*
*       text
*———————————————————————-*

FORM READ_IDOC.
  CALL FUNCTION ‘IDOC_READ_COMPLETELY’
    EXPORTING
      DOCUMENT_NUMBER          = DOCNUM
    IMPORTING
      IDOC_CONTROL             = IDOC_CONTROL
      NUMBER_OF_DATA_RECORDS   = NUMBER_OF_DATA_RECORDS
      NUMBER_OF_STATUS_RECORDS = NUMBER_OF_STATUS_RECORDS
    TABLES
      INT_EDIDS                = INT_EDIDS
      INT_EDIDD                = INT_EDIDD
    EXCEPTIONS
      DOCUMENT_NOT_EXIST       = 1
      DOCUMENT_NUMBER_INVALID  = 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.
  ENDIF.

ENDFORM.                    “” read_idoc

*&———————————————————————*
*&      Form  process_idoc
*&———————————————————————*
*       text
*———————————————————————-*

FORM PROCESS_IDOC.
  PERFORM READ_IDOC_STRUCTURE.
  PERFORM DISPLAY_DATA_RECORDS.
ENDFORM.                    “” process_idoc

*&———————————————————————*
*&      Form  display_data_records
*&———————————————————————*
*       text
*———————————————————————-*

FORM DISPLAY_DATA_RECORDS.

  DATA: PE_SEG_HEADER LIKE EDI_SAPI01,
        SEGNAME LIKE EDI_IAPI12-SEGMENTTYP,
        PREV_SEGNAME LIKE EDI_IAPI12-SEGMENTTYP VALUE ‘ ‘,
        PT_FIELDS2 LIKE EDI_IAPI12 OCCURS 0 WITH HEADER LINE,
        PT_FVALUES2 LIKE EDI_IAPI14 OCCURS 0 WITH HEADER LINE,
        BYTE_FIRST TYPE I,
        BYTE_LAST TYPE I,
        FIELD_VAL(50),
        TMP_STR(15),
        TMP_STR3(15),
        SEG_REPEATS TYPE I VALUE 0,
        TMP_STR2(15),
        TAB_CR(2) TYPE C VALUE ’09’,
        TOT_CTR TYPE I VALUE 0,
        CTR TYPE I VALUE 0,
        MSG(40) TYPE C.

  DATA: IDOC_STRUCT_WA TYPE  LEDID_IDOC_STRUCT.

  SORT INT_EDIDD BY SEGNUM.
  DESCRIBE TABLE INT_EDIDD LINES TOT_CTR.
  LOOP AT INT_EDIDD.
    MOVE INT_EDIDD-SEGNAM TO SEGNAME.
    CLEAR MSG.
    CONCATENATE ‘Reading segment ‘ SEGNAME
                INTO MSG SEPARATED BY SPACE.
    IF TOT_CTR <> 0.
      CTR = ( 100 * SY-TABIX ) / TOT_CTR.
    ENDIF.
    CALL FUNCTION ‘SAPGUI_PROGRESS_INDICATOR’
      EXPORTING
        PERCENTAGE = CTR
        TEXT       = MSG.
    ADD 1 TO SEG_REPEATS.
    CLEAR TMP_STR2.
    IF INT_EDIDD-SEGNAM <> PREV_SEGNAME.
      SEG_REPEATS = 1.
      CLEAR: PE_SEG_HEADER, PT_FIELDS2, PT_FVALUES2.
      REFRESH: PT_FIELDS2, PT_FVALUES2.
      CALL FUNCTION ‘SEGMENT_READ_COMPLETE’
        EXPORTING
          PI_SEGTYP                 = SEGNAME
          PI_RELEASE                = SAP_REL
          PI_VERSION                = PI_VER
        IMPORTING
          PE_HEADER                 = PE_SEG_HEADER
        TABLES
          PT_FIELDS                 = PT_FIELDS2
          PT_FVALUES                = PT_FVALUES2
        EXCEPTIONS
          SEGMENT_UNKNOWN           = 1
          SEGMENT_STRUCTURE_UNKNOWN = 2
          OTHERS                    = 3.
      IF SY-SUBRC <> 0.
        MESSAGE ID SY-MSGID TYPE ‘I’ NUMBER SY-MSGNO
                WITH SY-MSGV1 SY-MSGV2 SY-MSGV3 SY-MSGV4.
      ENDIF.
      PREV_SEGNAME = INT_EDIDD-SEGNAM.
    ENDIF.
    READ TABLE IDOC_STRUCT INTO IDOC_STRUCT_WA WITH KEY
                           SEGMENT_TYPE = INT_EDIDD-SEGNAM.
    IF SY-SUBRC = 0.
      IF IDOC_STRUCT_WA-SYNTAX_ATTRIB-MUSTFL = ‘X’.
        TMP_STR = ‘Mandatory’.                  “”Mandatory
      ELSE.
        TMP_STR = ‘Optional’.                  “”Optional
      ENDIF.
      IF IDOC_STRUCT_WA-SEGMENT_TYPE_ATTRIB-QUALIFIER = ‘X’.
        TMP_STR3 = ‘Qualified’.
      ELSE.
        TMP_STR3 = ‘Non-Qualified’.
      ENDIF.
      SHIFT IDOC_STRUCT_WA-SYNTAX_ATTRIB-OCCMAX
                                 LEFT DELETING LEADING ‘0’.
      MOVE SEG_REPEATS TO TMP_STR2.
      CONDENSE: IDOC_STRUCT_WA-SYNTAX_ATTRIB-OCCMAX, TMP_STR2.
      CONCATENATE TMP_STR2 ‘of’  IDOC_STRUCT_WA-SYNTAX_ATTRIB-OCCMAX
          INTO TMP_STR2 SEPARATED BY SPACE.

      WRITE :/ IDOC_STRUCT_WA-SEGMENT_TYPE,
           TMP_STR,
           TMP_STR3,
           TMP_STR2,
           IDOC_STRUCT_WA-SYNTAX_ATTRIB-HLEVEL,
           IDOC_STRUCT_WA-SEGMENT_TYPE_ATTRIB-PLAST,
           IDOC_STRUCT_WA-SEGMENT_TYPE_ATTRIB-DESCRP.
    ENDIF.
    SORT PT_FIELDS2 BY FIELD_POS.
    BYTE_FIRST = 0.
    LOOP AT PT_FIELDS2.
      CLEAR: FIELD_VAL.
      BYTE_LAST = PT_FIELDS2-EXTLEN.
      WRITE INT_EDIDD-SDATA+BYTE_FIRST(BYTE_LAST) TO
            FIELD_VAL LEFT-JUSTIFIED.
      SHIFT PT_FIELDS2-EXTLEN LEFT DELETING LEADING ‘0’.
      SHIFT PT_FIELDS2-BYTE_FIRST LEFT DELETING LEADING ‘0’.
      SHIFT PT_FIELDS2-BYTE_LAST LEFT DELETING LEADING ‘0’.
      WRITE:/ ‘   ‘, PT_FIELDS2-FIELDNAME,
              PT_FIELDS2-DATATYPE,
              PT_FIELDS2-EXTLEN,
              PT_FIELDS2-BYTE_FIRST ,
              PT_FIELDS2-BYTE_LAST,
              PT_FIELDS2-DESCRP,
              FIELD_VAL.
      READ TABLE PT_FVALUES2 WITH KEY FIELDNAME = PT_FIELDS2-FIELDNAME
                    FLDVALUE_L = FIELD_VAL.
      ADD BYTE_LAST TO BYTE_FIRST.
      IF SY-SUBRC = 0.
        WRITE : PT_FVALUES2-DESCRP.
      ELSE.
        CLEAR PT_FVALUES2-DESCRP.
      ENDIF.
    ENDLOOP.
  ENDLOOP.
ENDFORM.                    “” display_data_records

*&———————————————————————*
*&      Form  read_idoc_structure
*&———————————————————————*
*       text
*———————————————————————-*

FORM READ_IDOC_STRUCTURE.
  DATA: IDOCTYPE TYPE LEDID_IDOCTYPE.

  IF NOT IDOC_CONTROL-CIMTYP IS INITIAL.
    STRUCT_TYPE = ‘E’. “”Extended
    IDOCTYPE = IDOC_CONTROL-CIMTYP.
  ELSE.
    STRUCT_TYPE = ‘B’. “”Basic
    IDOCTYPE = IDOC_CONTROL-IDOCTP.
  ENDIF.

  CALL FUNCTION ‘IDOC_TYPE_COMPLETE_READ’
       EXPORTING
            RELEASE              = SAP_REL
            STRUCT_TYPE          = STRUCT_TYPE
            IDOCTYPE             = IDOCTYPE
            VERSION              = PI_VER
*       IMPORTING
*            IDOC_TYPE            = idoctype
       TABLES
            IDOC_STRUCT          = IDOC_STRUCT
            SEGMENTS             = SEGMENTS
            SEGMENT_STRUCT       = SEGMENT_STRUCT
       EXCEPTIONS
            IDOCTYPE_UNKNOWN     = 1
            IDOCSTRUCT_UNKNOWN   = 2
            SEGMENT_DATA_MISSING = 3
            ILLEGAL_STRUCT_TYPE  = 4
            OTHERS               = 5.
  IF SY-SUBRC <> 0.
    MESSAGE ID SY-MSGID TYPE SY-MSGTY NUMBER SY-MSGNO
            WITH SY-MSGV1 SY-MSGV2 SY-MSGV3 SY-MSGV4.
  ENDIF.

ENDFORM.                    “” read_idoc_structure


Technorati tags:





Leer campos de texto en SAP

24 11 2007

Para poder leer los campos de texto se usa la función read_text_inline. Esto generalmente lo usamos en formularios para mostrar textos de cabecera o de posición por ejemplo.


Para saber como llenar los campos, vamos al lugar donde cargamos el texto:
image

Una vez ahí clickeamos en el menú Pasar a —> Cabecera…
image

VG_INLINE  suele tener el valor 1 (VG_INLINE = ‘1’.)

 

El código que tenemos que agregar es:

TYPES: it_lin LIKE tline .

DATA:   VG_INLINE TYPE CHAR1,
             VG_NAME LIKE THEAD-TDNAME,
             IT_LINES TYPE TABLE OF IT_LIN,
             IT_INLINE TYPE TABLE OF IT_LIN,
             VG_ID LIKE THEAD-TDID,
             VG_LANG LIKE THEAD-TDSPRAS,
             VG_OBJ LIKE THEAD-TDOBJECT,

CALL FUNCTION ‘READ_TEXT_INLINE’
  EXPORTING
    ID                        = VG_ID
    INLINE_COUNT    = VG_INLINE
    LANGUAGE          = VG_LANG
    NAME                  =  VG_NAME
    OBJECT               = VG_OBJ
  TABLES
    INLINES               = IT_INLINE
    LINES                  = IT_LINES
EXCEPTIONS
   ID                              = 1
   LANGUAGE                = 2
   NAME                        = 3
   NOT_FOUND              = 4
   OBJECT                     = 5
   REFERENCE_CHECK   = 6
   OTHERS                     = 7.
IF SY-SUBRC <> 0.
  MESSAGE ID SY-MSGID TYPE SY-MSGTY NUMBER SY-MSGNO
         WITH SY-MSGV1 SY-MSGV2 SY-MSGV3 SY-MSGV4.
ENDIF.

* En la tabla IT_LINES nos queda el texto guardado


Technorati tags: