martes, 12 de febrero de 2013

Recuperar varios campos con una ayuda busqueda

Las ayudas búsquedas de sap, nos ayudan a completar los valores de los campos de entrada en las pantallas  de selección . Pero a veces, el cliente piden que ejecutando la ayuda búsqueda sobre un campo de la pantalla de selección , el resto de campos se rellenen automáticamente.

Por ejemplo, un  programa que recupera datos de la tabla MKPF y en la pantalla de selección podemos introducir el nº de documento de material, el documento de referencia  el ejercicio. El cliente quiere una ayuda búsqueda que rellene automáticamente los tres campos.

Ayuda Búsqueda que recupera varios campos
En este ejemplo vamos a recuperar el documento de material, ejercicio y el documento de referencia cuando situemos el cursor en cualquiera de los tres campos, presionemos F4 y seleccionemos un valor de la lista.

Primero creamos una ayuda búsqueda en la SE11 ( Ej: ZMCODE_MATERIAL ) sobre la MKPF y con los tres campos que queremos recuperar.


En el evento AT SELECTION-SCREEN ON VALUE-REQUEST FOR  llamaremos a una subrutina que ejecutara 3 bapis:
  • F4IF_GET_SHLP_DESCR: Recupera los datos de la ayuda búsqueda, una vez ejecutada, marcar el campo VALFIELD. en la tabla SHLP de los campos que se quieren recuperar. También se pueden crear filtro utilizando el campo SELOPT.
  • F4IF_START_VALUE_REQUEST: muestra un popup con la ayuda búsqueda y recupera los datos seleccionados por el usuario. 
  • DYNP_VALUES_UPDATE: Actualiza los campos de la pantalla de selección.

Podéis descargaros el codigo desde el repositorio git del blog:


El código completo del programa es el siguiente:

*&---------------------------------------------------------------------*
*& PROGRAMA.............: ZAYUDA_BUSQUEDA
*& AUTOR................: David Rueda Barrón
*& FECHA................: 12.02.2013
*& TRANSACCION..........: ZAYUDA_BUSQUEDA
*& ORDEN DE TRANSPORTE..: 
*& EMPRESA..............: 
*&---------------------------------------------------------------------*
*& DESCRIPCION: 
*& Ejemplo de una ayuda busqueda que rellena varios campos en la
*& pantalla de selección
*&---------------------------------------------------------------------*
*& Modificador Fecha    MARCA Motivo 
*&---------------------------------------------------------------------*
*& XXXXXXXX    DD.MM.AA @01   xxxxxxxxxxxxxx 
*&---------------------------------------------------------------------*

REPORT zayuda_busqueda.

TYPE-POOLS: shlp.

*&---------------------------------------------------------------------*
*& Parámetros de Selección
*&---------------------------------------------------------------------*
SELECTION-SCREEN BEGIN OF BLOCK block01 WITH FRAME TITLE text-s01.
   PARAMETERS : pi_xblnr TYPE xblnr,
                pi_mblnr TYPE mblnr,
                pi_mjahr TYPE mjahr.
SELECTION-SCREEN END OF BLOCK block01.

*&---------------------------------------------------------------------*
*& Validaciones de Pantalla
*&---------------------------------------------------------------------*
AT SELECTION-SCREEN ON VALUE-REQUEST FOR pi_xblnr.
  PERFORM f4_help_variant.

AT SELECTION-SCREEN ON VALUE-REQUEST FOR pi_mjahr.
  PERFORM f4_help_variant.

AT SELECTION-SCREEN ON VALUE-REQUEST FOR pi_mblnr.
  PERFORM f4_help_variant.

*&---------------------------------------------------------------------*
*& INITIALIZATION
*&---------------------------------------------------------------------*
INITIALIZATION.

*&---------------------------------------------------------------------*
*& START-OF-SELECTION
*&---------------------------------------------------------------------*
START-OF-SELECTION.

*&---------------------------------------------------------------------*
*& END-OF-SELECTION
*&---------------------------------------------------------------------*
END-OF-SELECTION.

*&---------------------------------------------------------------------*
*&      Form  F4_HELP_VARIANT
*&---------------------------------------------------------------------*
FORM f4_help_variant .

  DATA: dyname LIKE d020s-prog VALUE,
        dynumb LIKE d020s-dnum VALUE.

  DATA: BEGIN OF dynpfields OCCURS 3.
         INCLUDE STRUCTURE dynpread.
  DATA: END OF dynpfields.

  DATA: l_shlp     TYPE shlp_descr.
  DATA: lv_name_sh TYPE shlpname VALUE 'ZMCODE_MATERIAL'.
  DATA: t_return   TYPE STANDARD TABLE OF  ddshretval .
  DATA: v_subrc    TYPE sysubrc.

  FIELD-SYMBOLS: <FI> TYPE ddshiface,
                 <FH> TYPE ddshretval,
                 <FD>  LIKE LINE OF dynpfields.
  dyname = sy-repid.
  dynumb = sy-dynnr.

  CALL FUNCTION 'F4IF_GET_SHLP_DESCR'
    EXPORTING
      shlpname = lv_name_sh
      shlptype = 'SH'
   IMPORTING
      shlp     = l_shlp.


  LOOP AT l_shlp-interface ASSIGNING <FI>.
    <FI>-valfield = 'X'.
  ENDLOOP.

  CALL FUNCTION 'F4IF_START_VALUE_REQUEST'
     EXPORTING
      shlp          = l_shlp
     IMPORTING
      rc            = v_subrc
     TABLES
      return_values = t_return.

  LOOP AT t_return ASSIGNING <FH>.

    APPEND INITIAL LINE TO  dynpfields ASSIGNING <FD>.
    CONCATENATE 'PI_' <FH>-FIELDNAME INTO <FD>-FIELDNAME.
    <FD>-FIELDVALUE  = <FH>-FIELDVAL.

  ENDLOOP.

  CALL FUNCTION 'DYNP_VALUES_UPDATE'
   EXPORTING
     dyname     = dyname
     dynumb     = dynumb
   TABLES
     dynpfields = dynpfields.

endform   .                    " F4_HELP_VARIANT 



Entradas relacionadas
Filtrar los datos para las ayudas busquedas

lunes, 11 de febrero de 2013

GUIXT: Instalación y Configuración (II)

Directorios Scripts: Un  script de GuiXT  es un archivo de órdenes o un archivo de procesamiento por lotes, cuyo procesamiento modifica la pantalla o transacción del sistema Sap. Suelen ser  bastante simples y se guardan en un archivo de texto plano. Los scripts son interpretados, es decir, GuiXT realiza la traducción a medida que va siendo procesado el archivo.

Los archivos que contienen el script, pueden estar almacenados:
  • En un equipo local
  • En un servidor de archivos o directorio compartido (Ej: \\Server\guixt\scripts )
  • FTP o Servidor Web
  • Repositorio Web Sap ( transacción SWM0 )
Se pueden indicar hasta 4 localizaciones en la configuración de GuiXT

Directorios  Scripts
El orden de búsqueda es de mayor a menor; GuiXT buscara los scripts, primero en la localización del campo Scripts 4, si no encuentra el archivo con el script, buscara en la localización del campo Scripts 3 y así sucesivamente.

Componentes Instalados: Aquí  marcamos los componentes instalados que se utilizan, solo GUIXT no requiere de un numero de licencia para su uso.

License Key,TestKey o UserKey: Es necesario un nº de licencia para poder utilizar cualquier componente que no sea el GuiXT.  Si utilizamos , por ejemplo el componente InputAssistant y no tenemos nº de licencia, el scripts no se ejecutara y la ventana de GuiXT mostrara el siguiente mensaje.

Componentes instalados y las Licencias
Mensaje de Error:  El componente no esta registrado
Las TestKey son suministradas por Synactive.  Rellenando el siguiente formulario, recibiremos en nuestra cuenta de correo una TestKey que permite utilizar los componentes durante un mes. Existe un truco para registrar los componentes temporalmente:
  1. Cuando iniciemos sesión en el sistema SAP, abrimos la ventana de configuración del GuiXT
  2. En la casilla USER KEY  introducimos un valor aleatorio 
  3. Guardamos la configuración
  4. Reiniciamos la transacción -> /n  ( OJO!! no salir del sistema!!! )
A partir de este momento y hasta que cerremos la sesión en el sistema SAP, estarán activos todos los componentes del GuiXT,



Sistemas Habilitados:  Nombres de los sistemas SAP para los que la configuración GuiXT debe estar activo. Los nombres de los sistemas se pueden encontrar en Sistema  ► Estado ► datos de base de datos ► Nombre, por ejemplo, ST1. Se puede especificar varios sistemas.


Editor de Texto: Indicamos el editor de texto que vamos a utilizar para escribir los scripts.


Start Windows: Esta opción, evita que cada vez que iniciemos una sesión en SAPGUI aparezca la ventana de GuiXT, evitamos así que los usuarios normales puedan acceder a GuiXT.


Usuario RFC: los scripts de GuiXt también pueden ejecutar bapis RFC ( Remote Fuction Call ) pero necesitas especificar un usuario con permisos para ejecutar RFCs.


Un par de detalles que casi me vuelven loco la primera vez que utilice GuiXT. La contraseña va entre comillas dobles, por ejemplo: "PEPITO" . recordarlo, escribir la contraseña con las comillas dobles. Y segundo, por defecto, aunque tu entres en el cliente 300, GuiXT intentara entrar en el cliente 000 si no marcas la casilla Script Dowmload via current client.

Ejemplo:  Scripts desde el Repositorio Web de SAP

Esta opción para gestionar los scripts, permite centralizar los archivos en el repositorio web de sap (transacción SMW0) de esta manera los scripts estarán disponibles para todos los usuarios del sistema.

Lo primero es decidir un identificador o texto, que colocaremos delante del nombre del script que subiremos al repositorio web. También se utilizara ese identificador en el perfil de GuiXT. La única regla a seguir es que el identificador debe empezar por la letra Z. En este ejemplo vamos a utilizar  Z.GUIXT como identificador.

Identificador Z:GUIXT
Recordar que el orden de búsqueda es de mayor a menor; GUIXT buscara primero en la localización del campo Scripts 4, si no encuentra el archivo con el script, buscara en la localización del campo Scripts 3 y así sucesivamente. 

En SAP, en la transacción SMW0, Repositorio Web de SAP, seleccionamos la segunda opción Datos binarios p.aplicaciones WebRFC  y ejecutamos la búsqueda para el objeto Z.GUIXT*  (F8).

Transacción SWM0

Búsqueda del objeto Z.GUIXT*

Para subir un nuevo archivo de script de GuiXT, seleccionamos Crear un objeto Repository SAP web. Como nombre del objeto escribimos el identificador y el nombre del archivo que contiene el script separados por un punto. 

Por Ejemplo si tenemos:
  • Nombre del archivo que contiene el script: SAPMV45A.E0101.TXT 
  • Identificador seleccionado: Z.GUIX
El nombre del objeto sera: ZGUIXT.SAPMV45A.E0101.TXT

Crear Objeto Repository Sap Web

Comprobamos el resultado:


Este método de gestión de los archivos con los scripts GUIXT no es muy adecuado desde el punto de vista del desarrollador, ya que una vez subido el archivo, no lo podemos modificar, tenemos que volver a subirlo. Con las otras modalidades con las que podemos tener el archivo abierto con el notepad, modificar el scripts y ver los resultados al momento sobre el sistema SAP.

Pero desde el punto de vista del usuario, tenemos todos los scripts centralizados en el servidor SAP y todos los usuarios ejecutaran el mismo script, esto facilita mucho el control sobre los scripts.

viernes, 14 de diciembre de 2012

GUIXT: Introducción

GUIXT es un software que trabaja sobre el cliente SapGui y está basado en scripts que permite personalizar y mejorar la experiencia del usuario con nuevas funcionalidades ( botones personalizados, imágenes , datos por defecto, campos de entrada y textos…) o la posibilidad de cambiar el aspecto visual del cliente SapGui adaptándolo a las necesidades del usuario.


Cuando solicitamos o ejecutamos una transacción/programa/dynpro en SAP, el servidor de aplicacion envía un objeto al SapGui que lo ejecuta  la información encapsulada en el objeto, interpreta las instrucciones y   muestra por la pantalla al usuario la información. GuiXT consiste fundamentalmente, en que antes de que SapGui muestre la información en la pantalla, interpreta secuencialmente una serie de scripts contenidos en un archivo de texto plano ( .txt ). Estos scripts pueden modificar el contenido del objeto, pueden eliminar elementos de la pantalla, cargar valores por defecto, añadir imágenes, crear matchcodes, crear pulsadores, llamar a BAPIS y un sinfín de pequeñas utilidades que permiten al consultor poder personalizar el aspecto del sistema a cada usuario.

Guixt trabaja sobre el cliente SapGui
Por ejemplo podríamos diseñar un script que ocultase campos que no se utilizan del maestro de materiales.

Cambiando el maestro de materiales (MM03)
GuiXT no modifica nada en el servidor de aplicación. las modificaciones son locales , únicamente en el equipo conectado a Sap y con GuiXT activado, otro equipo sin GuiXT seguiría viendo la MM03 estándar.

El cambio visual que se puede desarrollar con GuiXT no es solo aplicable a transacciones individualmente, es tan flexible que nos permite combinar varias transacciones en una sola o sustituir varios elementos de  una transacción, también puede ejecutar BAPIS desarrolladas en ABAP a través de RFC. 

Por ejemplo, podemos combinar todas las pestañas de la transacción MM01,  con Info records de la transacción ME11. Imaginemos un usuario que para crear un material necesita utilizar 15 campos de las diferentes pestañas de la transacción MM01 y 4 pantallas de la transacción ME11, con GuiXT el usuario será capaz de crear el material, los info records y extender el material a 3 canales de distribución con solo un click sobre un pulsador. También, podemos a la vez, actualizar códigos de descuento que se almacenan en una tabla Z del diccionario, a través de una BAPI programada en ABAP.

MM01 y ME11 recreada con GuiXT



GuiXT ha sido desarrollado por la empresa Synactive, fundada en 1998 en Mannheim, Alemania por el    Dr. Gerhard Rodé, desarrollan componentes de software de gran calidad en conjunto con SAP. Son productos a medida, enfocados a adaptar los interfaces de un sistema SAP, a las necesidades del usuario, pero con una instalación sencilla de sus componentes y sin modificar el sistema SAP. 

Los productos de software que ofrece son los siguientes:


Su software GUIXT ha sido integrado completamente en el sistema SAP ERP (SAPGUI) y  viene ya incluido en el cliente SapGui a partir de la versión 4.6B y es compatible con todas las versiones certificadas por SAP para NETWEAVER. 


Para comprobar si tenemos las DLLs instaladas, en la esquina superior izquierda del SapGui y sobre el símbolo hacer click con el botón derecho del ratón y seleccionar 'Acerca de Sap Logon' -> DLLs cargadas


Sapgui DLLs cargadas
El archivo ejecutable GUIXT.EXE podemos encontrarlo en la ruta:

  • C:\Archivos de programa\SAP\FrontEnd\SapGui 
Para activar GUIXT, desde pantalla de inicio de SAP, click sobre el icono (  ALT+F12 ).

Se desplegara el menú de 'Ajustar disposición local', seleccionar la opción 'Activar GUIXT', aparecerá en la pantalla una segunda ventana con el título “Synactive GUIXT”.




Fuente:
Synactive Documentation


Entradas siguientes:
GUIXT: Instalación y Configuración (I)
GUIXT: Instalación y Configuración (II)
GUIXT: Los scripts de GuiXT
GUIXT: Personalizar el acceso al sistema y el comando image
GUIXT: Añadir y Modificar campos de texto, pulsadores y radiobuttons
GUIXT: El modulo InputAssistant
GUIXT: Estructuras de control
GUIXT: Teclado numérico táctil para Sap

lunes, 3 de diciembre de 2012

Carga Masiva de anexos en SAP


El código de la anterior entrada esta limitado a un solo archivo que debe ser elegido por el usuario pero ¿ Y si necesitamos cargar 1000 pdf  o 10000...o 100000!!? .

Si utilizamos la clase CL_GOS_DOCUMENT_SERVICE anexaríamos de uno en uno....demasiado tiempo y el programa podria llegar a ralenizar todo el sistema.




Lo primero de todo, es especificar  una relación entre los archivos  y objetos de negocio en sap (solicitudes de compra, pedidos de compra, pedidos de venta documentos contables ) .  Gracias a esta relación podremos determinar a que objeto de negocio anexar cada archivo del directorio. Podemos determinar cualquier relación como por ejemplo que el nombre del archivo coincidirá con el nº de factura que referencia el documento contable en SAP.

Por ejemplo, la Factura 0000157910 es el archivo  0000157910.PDF y el archivo 0000157910.PDF tiene que adjuntarse al documento contable que tenga la factura  0000157910 como documento de referencia (campo BKPF-XBLNR).

Como caso de prueba, tenemos un directorio "fuente" con 6 facturas en PDF,

Facturas en PDF y los doc. contables a los que deben ser adjuntadas

El nombre del archivo es el nº de factura y coincide con el campo BKPF-XBLNR del doc. contable.

El programa seguirá la siguiente lógica:
  1. Lee los archivos del directorio "fuente"
  2. Busca los doc. contables con BKPF-XBLNR igual al nombre del archivo
  3. Si existe, anexa el archivo al doc. contable y mueve el archivo al directorio "procesados".
  4. Si no existe, deja el archivo en el directorio fuente
Podeis encontrar el código del programa en el repositorio git del blog:
Para organizar mejor el código he dividido el programa en 3 archivos:
  • ZZ_ATTA_MULTIPLES_PDF: programa pincipal.
  • ZZ_ATTA_MULTIPLES_PDF_TOP: variables globales.
  • ZZ_ATTA_MULTIPLES_PDF_F01: Subrutinas.

Notas OSS de interes:
927407 - Determining the content of GOS and SAPoffice documents
904711 - SAPoffice: Where are documents physically stored?
916512 - SAPoffice: Directory for upload/download/display
448074 - Calling generic object services from the dialog

Entradas Anteriores:

viernes, 9 de noviembre de 2012

Crear, Visualizar y Borrar anexos con CL_GOS_DOCUMENT_SERVICE

Seguimos con los anexos. Esta vez vamos a hablar de la clase CL_GOS_DOCUMENT_SERVICE.

En la transacción SE24 podemos visualizar sus métodos y atributos:

CL_GOS_DOCUMENT_SERVICE

Esta clase tiene muchos métodos para crear, modificar, borrar y visualizar documentos anexos a un objeto de negocio.

Para los ejemplos con esta clase, seguiremos utilizando el anexo de archivos a documentos contables en SAP pero recordemos que es posible anexar archivos a un gran numero de objetos de negocio en SAP ( materiales, facuras, pedidos de compra, etc... ).


CREAR ANEXO

Seleccionado el documento contable, se abre una ventana del explorador de archivos, seleccionamos el archivo a anexar, y en la FB03 comprobamos que se ha anexado correctamente

Crear Anexo

VISUALIZAR  ANEXOS

Primero recuperamos los anexos del documento contable en la tabla SRGBTBREL, pero aquí solo esta el enlace interno al anexo, para recuperar el  nombre del anexo utilizar  la bapi SO_OBJECT_GET_CONTENT

Visualizar Anexo

BORRAR ANEXOS

Primero recuperamos los anexos del documento contable en la tabla SRGBTBREL, pero aquí solo esta el enlace interno al anexo, para recuperar el  nombre del anexo utilizar  la bapi SO_OBJECT_GET_CONTENT selecionamos el anexo y comprobamos que se ha borrado en al FB03

Borra Anexo

CODIGO ABAP

Y llegamos  lo importante, aqui esta el codigo ABAP que permite crear, visualizar y borrar anexos.

Teneis también el código ABAP disponible en el repositorio github del blog



REPORT ZZ_PRUEBA_ANEXOS_GOS.

*&---------------------------------------------------------------------*
*& TYPE-POOLS
*&---------------------------------------------------------------------*
TYPE-POOLS: slis. 
*&---------------------------------------------------------------------*
*& Tablas
*&---------------------------------------------------------------------*
TABLES: BSEG.

*&---------------------------------------------------------------------*
*& Variables Glovales
*&---------------------------------------------------------------------*
DATA: obj_gos        TYPE REF TO cl_gos_document_service.
DATA: wa_borident TYPE                borident.
DATA: wa_objkey   TYPE                borident-objkey.

*&---------------------------------------------------------------------*
*& Parámetros de Selección
*&---------------------------------------------------------------------*
SELECTION-SCREEN BEGIN OF BLOCK BLOCK01 WITH FRAME TITLE TEXT-S01.
PARAMETERS: P_BUKRS TYPE BUKRS OBLIGATORY,
                           P_BELNR TYPE BELNR_D OBLIGATORY,
                           P_GJAHR TYPE GJAHR OBLIGATORY.
SELECTION-SCREEN END OF BLOCK BLOCK01.

SELECTION-SCREEN BEGIN OF BLOCK BLOCK02 WITH FRAME TITLE TEXT-S01.
PARAMETERS: P_crear  type c RADIOBUTTON GROUP GR1,
                           P_visua  type c RADIOBUTTON GROUP GR1,
                           P_borra type c RADIOBUTTON GROUP GR1.
SELECTION-SCREEN END OF BLOCK BLOCK02.

*&---------------------------------------------------------------------*
*& Validaciones de Pantalla
*&---------------------------------------------------------------------*
AT SELECTION-SCREEN.

*&---------------------------------------------------------------------*
*& INITIALIZATION
*&---------------------------------------------------------------------*
INITIALIZATION.

*&---------------------------------------------------------------------*
*& START-OF-SELECTION
*&---------------------------------------------------------------------*
START-OF-SELECTION.

SELECT SINGLE *
      FROM BSEG
      WHERE BUKRS EQ P_BUKRS
           AND BELNR EQ P_BELNR
           AND GJAHR EQ P_GJAHR.

IF ( SY-SUBRC <> 0 ).
     MESSAGE 'No existe el documento' TYPE 'S' DISPLAY LIKE 'E'. 
ELSE.

CREATE OBJECT obj_gos.

CONCATENATE P_BUKRS P_BELNR P_GJAHR INTO wa_borident-objkey.
wa_borident-objtype = 'BKPF'.

IF P_crear IS NOT INITIAL.

CALL METHOD obj_gos->create_attachment
     EXPORTING        
        is_object = wa_borident
     IMPORTING
        ep_attachment = wa_borident-objkey.

COMMIT WORK.

ELSEIF p_visua IS NOT INITIAL.

    PERFORM SELECT_ATTA USING  wa_borident CHANGING  wa_objkey.


    IF  ( wa_objkey IS NOT INITIAL ).
       CALL METHOD obj_gos->display_attachment
               EXPORTING
                    ip_attachment = wa_objkey.
    ENDIF.

  ELSEIF P_Borra IS NOT INITIAL.

    PERFORM SELECT_ATTA USING wa_borident CHANGING wa_objkey.

    IF  ( wa_objkey IS NOT INITIAL ).
        CALL METHOD obj_gos->delete_attachment
               EXPORTING
                   ip_attachment = wa_objkey.

        COMMIT WORK. 
   ENDIF.

  ENDIF.

ENDIF. 

*&---------------------------------------------------------------------*
*& Form SELECT_ATTA
*&---------------------------------------------------------------------*
* Muestra un Popu para que el cliente seleccione el adjunto
*----------------------------------------------------------------------*
FORM  SELECT_ATTA USING    pi_borident TYPE borident
                  CHANGING po_objkey   TYPE borident-objkey.

    TYPES: BEGIN OF type_anexos,
      box(1)   TYPE C,
      instid_b TYPE srgbtbrel-instid_b,
      name(15) TYPE C,
    END OF type_anexos.

    DATA: tl_anexos TYPE STANDARD TABLE OF type_anexos, 
          tl_head TYPE STANDARD TABLE OF SOLI,
          tl_cond TYPE STANDARD TABLE OF SOLI,
          i_fieldcat TYPE  SLIS_T_FIELDCAT_ALV,
          l_program  TYPE sY-REPID.

    DATA: Wl_SOODK TYPE SOODK,
          w_fieldcat TYPE slis_fieldcat_alv.

    FIELD-SYMBOLS: <fanexos> TYPE type_anexos,
                   <fsoli>   TYPE SOLI.

    CLEAR: po_objkey.
    REFRESH: TL_anexos.

    SELECT instid_b INTO CORRESPONDING FIELDS OF TABLE TL_anexos
          FROM srgbtbrel
            where   instid_a = pi_borident-objkey
              and   typeid_a = pi_borident-objtype
              and   reltype  = 'ATTA'.

    LOOP AT TL_anexos ASSIGNING <fanexos>.

        CLEAR Wl_SOODK.

        Wl_SOODK-OBJTP = <fanexos>-instid_b+17(3).
        Wl_SOODK-OBJYR = <fanexos>-instid_b+20(2).
        Wl_SOODK-OBJNO = <fanexos>-instid_b+22.

        CALL FUNCTION 'SO_OBJECT_GET_CONTENT'
          EXPORTING
            object_id              = Wl_SOODK
          tables
            OBJHEAD                = tl_head
            objcont                = tl_cond
          EXCEPTIONS
           ARCHIVE_ERROR          = 1
           OBJECT_NOT_EXIST       = 2
           OTHERS                 = 3
                  .
        IF sy-subrc EQ 0.

          READ TABLE tl_head INDEX 1 ASSIGNING <FSOLI>.
          IF ( SY-SUBRC EQ 0 ).
            <fanexos>-NAME = <FSOLI>-LINE+13.
          ENDIF.

        ENDIF.

    ENDLOOP.

    l_program = sy-repid.

    w_fieldcat-fieldname = 'NAME'.
    w_fieldcat-tabname   = 'TL_ANEXOS'.
    w_fieldcat-seltext_m = 'Anexo'.
    APPEND w_fieldcat TO i_fieldcat.

    call function 'REUSE_ALV_POPUP_TO_SELECT'
      exporting
        i_title     = TEXT-T01
        i_tabname   = 'TL_ANEXOS'
        i_selection = 'X'
        i_zebra = 'X'
        i_checkbox_fieldname = 'BOX'
        it_fieldcat          = i_fieldcat
        i_callback_program   = l_program
      tables
        t_outtab = TL_ANEXOS
      exceptions
        program_error = 1
        others = 2.

    IF ( Sy-SUBRC EQ 0 ).
      READ TABLE TL_ANEXOS WITH KEY BOX = 'X' ASSIGNING <fanexos>.
      IF ( SY-SUBRC EQ 0 ).
        po_objkey = <fanexos>-instid_b.
      ENDIF.
    ENDIF.

endform.                    " SELECT_ATTA 


Entradas Siguientes:
Carga masiva de anexos en SAP

Entradas Anteriores:

domingo, 21 de octubre de 2012

RSIRPIRL: recolocando los contenidos de SOFFCONT1

En la transacción DB12 se puede comprobar el tamaño de la tabla SOFFCONT1:


  • Transacción DB12 -> Space -> Single Table Analysis -> SOFFCONT1
DB12 tamaño de la tabla SOFFCONT1

Si el tamaño de la tabla es muy grande, con el programa estándar RSIRPIRL es posible mover el contenido de una categoría de archivo a otra es decir, podemos liberar espacio en la tabla SOFFCONT1 y traspasar el contenido de los archivos y documentos anexados a un repositorio externo. 

Antes de ejecutar el programa, recomiendo aplicar los cambios de la siguiente nota de SAP:
Esta nota amplia la pantalla de selección del programa para poder seleccionar por la fecha de creación. Esto es muy útil para poder realizar pruebas o mover solamente algunos anexos.


Una vez aplicada la nota, podemos ejecutar el programa. Por ejemplo, vamos a traspasar desde la categoría de archivo SOFFDB ( base de datos , tabla SOFFCONT1 ) a la nueva categoría SOFFHTTP todos los anexos creados en el mes de septiembre de 2012:


El enlace entre Clase y Categoría puede verse en la Transacción SKPR08.
Las categorías de archivo están en la transacción OACT.

Notas OSS de interés:

Entradas Anteriores: