sábado, 4 de mayo de 2013

GUIXT: Personalizar el acceso al sistema y el comando image

Un sencillo script de GuiXT que modifica el aspecto visual de la  pantalla de acceso al sistema Sap y le añade una nueva funcionalidad. El script, añadirá una imagen con el logo de la compañía y un pulsador para que, en caso de problemas al acceder al sistema, pueda enviarse un email al administrador de sistemas.

Acceso al sistema Sap

Box (3,1) (11,85) "Acceso al sistema"

pos F[Clv.acc.]    (7,28)   
pos F[Idioma]      (8,28)  
pos F[Mandante] (5,28)  
pos F[Usuarios]   (6,28) 

Image (4,2) (9,25) "logo.jpg" 

text (9,28)   "Problemas de acceso?"
text (10,28) "Por favor, envie un email "
image(9,48) "email.gif" start="mailto:admin@datra.com?subject=Logon in system &V[_database]"
text (10,55) "al administrador"


Acceso al sistema Sap modificado por el script GuiXT

Excepto el comando Image, el resto de comandos utilizados en el script se han explicado en la entrada anterior.

El comando Image permite añadir imágenes, GuiXT admite los formatos BMP, GIF y JPG.
Es un comando muy  versátil, con muchas opciones y parámetros como veremos a continuación.

Image (row,column) "Name of image file"
Image (row1,column1) (row2,column2) "Name of image file"

Solo se admiten los siguientes formatos: BMP, GIF y JPG.

Si no se especifica ninguna ruta para acceder a la imagen,  por defecto, se busca en el mismo directorio en donde se encuentra el script de GuiXT que ejecuta el comando Image. Es posible  acceder a imágenes guardadas en un servidor http o FTP y en el  Repositorio Web de Sap.
Parámetros:
  • (row1,column1) ó (row,column): coordenadas de la esquina superior izquierda 
  • (row2,column2) : coordenadas de la esquina inferior derecha
Opciones:
  • -NoStretch  : Mantiene la anchura y altura de la imagen original 
  • -Plain  : Sin marco resaltado 
  • -NoBuffer  :No se almacena en memoria intermedia. 
  • -Transparent : Solo aplicable a GIF de 8 bits, la imagen se muestra de forma transparente, toma el fondo de la pantalla .
Aparte de estas opciones, también existen unos parámetros especiales para dibujar texto plano sobre la imagen:

  • Textstring=   : Escribe un texto plano sobre la imagen.
  • Textfont=      : Fuente del texto, por defecto es Arial y en sistemas Unicode Arial Unicode MS. 
  • Textcolor=    : Color del texto.
  • Textheight=  : Altura en pixeles, por defecto 10.
  • Textweight=  : Anchura, el valor es entre 1 ( fina) y 9 ( gruesa ), resaltado es 7
  • Textarea=     : Área de la imagen donde se dibujara el texto
                    ..... Textarea=(10,20)       Área de 10x20 desde la esquina superior izquierda
                    ..... Textarea=(-50,-50)    Área de 50x50 desde la esquina inferior derecha
                    ..... Textarea=(30,50,-30,-50)    Área 30x50 centrada en la imagen
  • -textcenter    : El texto queda centrado en la imagen
Por Ejemplo, en el script anterior, para dibujar el texto  "GUIXT" sobre la imagen del logo

   Image (4,2) (9,25) "logo.jpg"  textstring="GUIXT" textheight=80 -textcenter

Texto sobre la imagen

Es posible mostrar varias imágenes en una misma posición, por ejemplo:.

   Image (10,40) (16,65) "img&##.gif"

Para esta finalidad re-nombraremos las imágenes de la siguiente manera :

    IMG01.gif, IMG02.gif, IMG03.gif…..

Por cada click con el botón derecho del ratón sobre la imagen, se incrementara el contador. Sustituyendo los comodines  por 1, 2, 3 o 01, 02, 03 o también 001, 002, 003 (depende de cuantos comodines utilicemos &#, &##, &### ).

Es posible relacionar también la imagen con un campo de datos de la pantalla. Por ejemplo,  si el usuario introduce por pantalla el código de material A03, mostrar por pantalla la imagen imgA06.jpg. Recordemos que para extraer el valor de una variable o elemento de la pantalla, se antepone el carácter especial “&” al nombre de la variable o campo de la pantalla ( Por  ejemplo: &V[data_nombre] , &F[Material] ).

   Image (4,80) "C:\products\img&F[Material].jpg"
La versatilidad de este comando es tal, que si no esta disponible la imagen, podemos ejecutar un archivo exe o bat para que copie la imagen de cualquier localización posible a un directorio local

   Image (row,column) "Name of image file" exe="program name"

   Image (10,40) (18,74) "C:\tempimg\imagen1.gif" exe="C:\prog\getchart.exe"

Una opción muy interesante, es convertir la imagen en interactiva, que responda ante alguna acción o evento provocado por el  usuario, como un click con el ratón, sobre la imagen. este evento o acción puede dar como resultado que se ejecute un Input Screen ( ya lo explicare mas adelante ) o una opción del menú.

    Image (row,column) "Name of image file" Input="string" 

Por ejemplo:

    Al pulsar sobre la imagen, se rellena el campo de la pantalla 'Material' y se ejecuta INTRO.
    Image (4,10) "logo.jpg" Input="Material:1221;OK"

    Al pulsar sobre la imagen, se rellenan los campos de la pantalla 'Material' y 'Planta, pero no se ejecuta intro.
    Image (4,10) "logo.jpg" Input="Material:1221;Planta:1001" 

    Ejecutar   Funciones del menú, selección de vistas en la MM03 al pulsar en la imagen
    Image (4,10) "logo.jpg"  "Input=OK:AUSW" 

    Llamar a otra transaccion en la misma ventana o generar una ventana nueva
    Image (4,10) "logo.jpg"  Input="OK:/NMM01" 
    Image (4,10) "logo.jpg"  Input="OK:/OMM01" 

    Llamar a un Input Screen con parámetros de entrada.
    Image (4,10)   "numbutton.gif" Input="U[digit]:7;OK:process=digit.txt"

El comando también permite ejecutar una aplicación o software externo, un archivo HTLM o un documento, ademas de archivos ejecutables exe o bat

   Image (row,column) "Name of image file" Start="string" 

Por Ejemplo:

   Llamar a un archvio HTLM
   Image (4,10) "logo.jpg"  Start="\\P00800\Doc12\me21.html"


Si estamos utilizando GuiXT para dar soporte a una pantalla táctil, las opciones siguientes pueden ayudar a crear una navegación a través del sistema, por ejemplo, si estamos mostrando un ALV por pantalla podemos crear nuestro propio pulsador para desplazarnos entre las líneas en el ALV.

    Image (0,1) (3,8) "nextline.gif" Input="X[Grid1]:<DOWN>"

Están soportadas las siguientes funciones:
  •  <DOWN> Cursor abajo 
  •  <UP> Cursor arriba 
  •  <LEFT> Cursor a la izquierda 
  •  <RIGHT> Cursor a la derecha 
  •  <NEXT> Page down 
  •  <PRIOR> Page up 
  •  <END> End 
  •  <HOME> Home 
  •  <BOTTOM> Ctrl+End 
  •  <TOP> Ctrl+Home

Panel táctil con GuiXT

jueves, 2 de mayo de 2013

Clasicos ABAP: Descargar tabla interna a una hoja Excel

Esto es un clásico de la programación ABAP que no puede faltar en todo desarrollo , proyecto , listado , etc... siempre habrá un usuario que te pedirá que el listado 'A', 'B' o 'C' tenga la opción de descargarse  a una hoja Excel.

Para descargar una tabla interna a una hoja de excel:  bapi MS_EXCEL_OLE_STANDARD_DAT

IMPORTANTE: Para que esta bapi os funcione, es necesario que la aplicación Microsoft EXCEL este instala en el equipo local.  Esta bapi envía los datos al SapGUI y después al EXCEL, por tanto tampoco funcionara si ejecutáis el programa como un job en fondo o si queréis que el fichero se cree en el servidor o en una unidad de red.

Si  la tabla interna tiene campos numéricos, por ejemplo integer, float... al ejecutar la bapi MS_EXCEL_OLE_STANDARD_DAT saltara un precioso dump. Esto esta relacionado con lo que anteriormente os he comentado, la Bapi no realiza ningún ajuste, transformación o cast con los datos, lo que puede derivar en problemas con campo numérico, decimales o fechas.

Hay que crear otra tabla interna,  idéntica a la que queremos descargar a excel, pero con todos sus campos de tipo carácter. Traspasaremos los registros a la nueva tabla y descargaremos el contenido de la tabla a una hoja excel con la bapi MS_EXCEL_OLE_STANDARD_DAT.

Un ejemplo vale mas que  mil palabras....

Listado ALV que muestra los vuelos para las compañías y fechas seleccionadas:

Nota: solo voy a pegar las partes importantes del código, si queréis el código completo del ejemplo lo tenéis aquí.


Añadir un pulsador para descargar el ALV a una hoja excel y el siguiente código para controlar el evento.

*---------------------------------------------------------------------*
*       FORM USER_COMMAND_01  Process Call Back Events (Begin)         *
*---------------------------------------------------------------------*
FORM user_command_01 USING ucomm    LIKE sy-ucomm
                        selfield TYPE slis_selfield.

  DATA: wl_file TYPE string.

  CASE ucomm.
    WHEN '&EXC'.
      PERFORM get_filename  CHANGING wl_file.
      PERFORM download_to_exc  USING wl_file ti_spfli.
  ENDCASE.
ENDFORM.                    "user_command_01

*---------------------------------------------------------------------*
*      Form  GET_FILENAME
*---------------------------------------------------------------------*
*     Abrir navegador para seleccionar fichero
*----------------------------------------------------------------------*
FORM get_filename  CHANGING p_file TYPE string.

  DATA w_file LIKE rlgrap-filename.

  CALL FUNCTION 'KD_GET_FILENAME_ON_F4'
    CHANGING
      file_name     = w_file
    EXCEPTIONS
      mask_too_long = 1
      OTHERS        = 2.

  p_file = w_file.

ENDFORM.                      "GET_FILENAME

*---------------------------------------------------------------------*
*      Form  DOWNLOAD_TO_EXC
*---------------------------------------------------------------------*
FORM download_to_exc  USING Pi_file  TYPE STRING
                            ti_spfli TYPE type_t_spfli.

  TYPES: BEGIN OF tl_name,
    fldname(11) TYPE c,
   END OF tl_name.

  DATA: tl_name  TYPE STANDARD TABLE OF tl_name.

  DATA: wl_file TYPE  rlgrap-filename.

  FIELD-SYMBOLS:  <FL> TYPE tl_name.

  wl_file = Pi_file.

  LOOP AT gt_fieldcat .
    APPEND INITIAL LINE TO tl_name ASSIGNING <FL>.
    <FL>-fldname =  gt_fieldcat-fieldname.
  ENDLOOP.

  CALL FUNCTION 'MS_EXCEL_OLE_STANDARD_DAT'
    EXPORTING
      file_name                 = wl_file
      data_sheet_name           = 'SPFLI'
      password_option           = 0
    TABLES
      data_tab                  = ti_spfli
      fieldnames                = tl_name
    EXCEPTIONS
      file_not_exist            = 1
      filename_expected         = 2
      communication_error       = 3
      ole_object_method_error   = 4
      ole_object_property_error = 5
      invalid_filename          = 6
      invalid_pivot_fields      = 7
      download_problem          = 8
      OTHERS                    = 9.

  CASE sy-subrc.
    WHEN 1.
      MESSAGE e000(yv01) WITH 'File does not exist'.
    WHEN 2.
      MESSAGE e000(yv01) WITH 'Filename expected'.
    WHEN 3.
      MESSAGE e000(yv01) WITH 'Communication error'.
    WHEN 4.
      MESSAGE e000(yv01) WITH 'OLE object method error'.
    WHEN 5.
      MESSAGE e000(yv01) WITH 'OLE object property error'.
    WHEN 6.
      MESSAGE e000(yv01) WITH 'Invalid filename'.
    WHEN 7.
      MESSAGE e000(yv01) WITH 'Invalid pivot fields'.
    WHEN 8.
      MESSAGE e000(yv01) WITH 'Download problem'.
    WHEN 9.
      MESSAGE e000(yv01) WITH 'Other problem'.
  ENDCASE.


ENDFORM.                    " DOWNLOAD_TO_EXC


La tabla interna TL_NAME son las cabeceras de las columnas. Si comentáis el parámetro de entrad de la bapi o le pasáis una tabla interna vacía, generara la hoja excel sin cabecera para las columnas.

Preguntamos donde quiere guardar la hoja excel


Tabla interna descargada a hoja excel

En este ejemplo , como todos los campos son de tipo caracter ( CONNID es NUMC, texto numérico ) , no existe ningun problema en pasar directamente la tabla a la bapi MS_EXCEL_OLE_STANDARD_DAT. Pero, si añadimos un nuevo campo numerico a la tabla interna:

TYPES: BEGIN OF type_spfli,
  carrid     TYPE spfli-carrid,    "compañía aérea
  connid     TYPE spfli-connid,    "Código de conexión de vuelo directo
  countryf   TYPE spfli-countryfr, "Clave de país
  cityfrom   TYPE spfli-cityfrom,  "Ciudad de salida
  airpfrom   TYPE spfli-airpfrom,  "Aeropuerto de salida
  countryto  TYPE spfli-countryto, "Clave de país
  cityto     TYPE spfli-cityto,    "Ciudad de llegada
  airpto     TYPE spfli-airpto,    "Aeropuerto de destino
  integer    TYPE i,               "CAMPO NUMERICO
END OF type_spfli.

Aunque el campo integer este vació en todos los registros, al descargar a excel dará el siguiente DUMP

sólo se permiten caracteres
Hay que traspasar, antes de llamar a la bapi, todo el contenido de la tabla ti_spfli a una tabla cuyos campos sean todos de tipo caracter.



*---------------------------------------------------------------------*
*      Form  DOWNLOAD_TO_EXC
*---------------------------------------------------------------------*
FORM download_to_exc  USING pi_file  TYPE string
                            ti_spfli TYPE type_t_spfli.

  TYPES: BEGIN OF tl_name,
    fldname(11) TYPE c,
   END OF tl_name.

  TYPES: BEGIN OF type_excel,
    carrid(3)    TYPE c,
    connid(4)    TYPE c,
    countryfr(3) TYPE c,
    cityfrom(20) TYPE c,
    airpfrom(3)  TYPE c,
    countryto(3) TYPE c,
    cityto(20)   TYPE c,
    airpto(3)    TYPE c,
    integer(15)  TYPE c,
  END OF type_excel.

  DATA: tl_name  TYPE STANDARD TABLE OF tl_name.
  DATA: tl_excel TYPE STANDARD TABLE OF type_excel.

  DATA: wl_file TYPE  rlgrap-filename.

  FIELD-SYMBOLS:  <FN> TYPE tl_name,
                  <FO> TYPE TYPE_spfli,
                  <FD> TYPE type_excel.

  wl_file = pi_file.

  LOOP AT gt_fieldcat .
    APPEND INITIAL LINE TO tl_name ASSIGNING <FN>.
    <FN>-fldname =  gt_fieldcat-fieldname.
  ENDLOOP.

  LOOP AT ti_spfli ASSIGNING <FO>.

    APPEND INITIAL LINE TO TL_EXCEL ASSIGNING <FD>.

    MOVE: <FO>-carrid    TO <FD>-CARRID,
          <FO>-connid    TO <FD>-CONNID,
          <FO>-countryfr TO <FD>-countryfr,
          <FO>-cityfrom  TO <FD>-cityfrom,
          <FO>-airpfrom  TO <FD-airpfrom,
          <FO>-countryto TO <FD>-countryto,
          <FO>-cityto    TO <FD>-cityto,
          <FO>-airpto    TO <FD>-airpto.

    WRITE <FO>-integer TO <FD>-INTEGER.

  ENDLOOP.

  CALL FUNCTION 'MS_EXCEL_OLE_STANDARD_DAT'
    EXPORTING
      file_name                 = wl_file
      data_sheet_name           = 'SPFLI'
      password_option           = 0
    TABLES
      data_tab                  = TL_EXCEL
      fieldnames                = tl_name
    EXCEPTIONS
      file_not_exist            = 1
      filename_expected         = 2
      communication_error       = 3
      ole_object_method_error   = 4
      ole_object_property_error = 5
      invalid_filename          = 6
      invalid_pivot_fields      = 7
      download_problem          = 8
      OTHERS                    = 9.

  CASE sy-subrc.
    WHEN 1.
      MESSAGE e000(yv01) WITH 'File does not exist'.
    WHEN 2.
      MESSAGE e000(yv01) WITH 'Filename expected'.
    WHEN 3.
      MESSAGE e000(yv01) WITH 'Communication error'.
    WHEN 4.
      MESSAGE e000(yv01) WITH 'OLE object method error'.
    WHEN 5.
      MESSAGE e000(yv01) WITH 'OLE object property error'.
    WHEN 6.
      MESSAGE e000(yv01) WITH 'Invalid filename'.
    WHEN 7.
      MESSAGE e000(yv01) WITH 'Invalid pivot fields'.
    WHEN 8.
      MESSAGE e000(yv01) WITH 'Download problem'.
    WHEN 9.
      MESSAGE e000(yv01) WITH 'Other problem'.
  ENDCASE.


ENDFORM.                    " DOWNLOAD_TO_EXC



Después de ajustar el código, si volvemos a ejecutar y descargar a excel:


Descargar a hoja excel tabla interna con campos numéricos
Notas relacionadas:
   721793 - Problems with MS_EXCEL_OLE_STANDARD_DAT
   104165 - Problems with MS EXCEL-download from HR-reports

domingo, 10 de marzo de 2013

GUIXT: Los Scripts de GuiXT

¿Que es un scripts de GuiXT?

Un script de GuiXT es un archivo de órdenes o un archivo de procesamiento por lotes, que modifica elementos de la pantalla del sistema Sap. No modifica el estándar de SAP, no realiza ningún cambio en el servidor de Sap, solo actúa en la capa de presentación sobre SapGUI.

Scripts de GuiXT

¿Cuando se interpreta un GuiXT Script? 

Cuando accedemos a una transacción estándar o ejecutamos un rapport, el servidor SAP envía la información al cliente SapGUI  que la muestra por pantalla al usuario. Si GuiXT se encuentra activado en el sistema Sap, antes de mostrar los datos por pantalla, se busca el script GuiXT cuyo nombre coincida con la combinación  <programa>.<idioma><dynpro> ( ej SAPMF05A.S0100 ) en alguna de las 4 localizaciones que se pueden indicar para guardar los scripts. Si se encuentra el script, se interpreta y se aplican los cambios a la información recibida del sistema Sap y después se muestra por pantalla el resultado. 

GuiXt actúa en la capa de presentación

Los scripts se interpretan 1 vez por cada ventana abierta .Si ejecutamos dos veces /oMM03, que abrirá dos  ventanas nuevas del maestro de materiales, si existe un scripts GuiXT, se ejecutara en cada ventana independiente y las acciones , cálculos, valores de las variables en una ventana no afectaran a la ejecución del scripts en la otra ventana.  Por el contrario, si en vez de abrir nuevas ventanas, reiniciamos la actual  ejecutado, por ejemplo,  varias veces /nMM03 y existen variables globales que no se iniciaran al principio del script, están conservan sus últimos valores.


¿Cómo se construye el nombre del archivo que contiene el script?

<Nombre del programa que contiene la DYNPRO>.<IDIOMA><Nº de la DYNPRO>.txt

Programa: SAPMF05A
Dynpro: 0100
Idioma : Español - S

Fichero se llamaría: SAPMF05A.S0100.txt

Para simplificar,  ir a la transacción que queremos modificar y  en la ventana de GuiXT presionar el pulsador Script en la barra de herramientas. Si os fijáis,  en la ventana de GuiXT, en el área de la derecha, aparece la ruta y nombre del archivo para el scripts de GuiXt para la transacción que tengamos activa.

Nombre del archivo que contiene el script de GuiXT

Reglas sintácticas de un scripts de GuiXT:
  • Cada comando está formado por una sola línea. 
  • Los espacios en blanco son ignorados. 
  • GuiXT no es “case sensitive”, no diferencia ente mayúsculas y minúsculas 
  • Se pueden abreviar los textos con él carácter punto ‘.’ 
  • Los elementos/componentes se indican entre corchetes []. 
  • Las coordenadas se indican entre paréntesis (). 
  • La longitud máxima de una línea de scripts es de 4000 caracteres. 
  • Los pulsadores que solo muestran un icono, puede utilizarse su texto de ayuda rápida para identificarlo. 
  • Para usar las comillas dobles dentro de un script, deben ir entrecomilladas a su vez con comillas dobles. 
Elementos/Componentes de la pantalla que podemos manipular con GuiXT:
  • Fields, campos de entrada/salida de datos. 
  • Text Control, textos. 
  • Fields groups, grupos de campos de entrada. 
  • Pushbutton, pulsadores, en la pantalla o en la barra de herramientas 
  • Radiobuttons, radiobuttons de selección.. 
  • Check boxes, casillas de selección o verificación. 
  • Table controls, tablas de datos. 
  • Tabstrips, pestañas. 
  • R/3 controls , controles del sistema SAP. 
  • Menu ítems, elementos de los menús despegables. 
¿Cómo se especifica en un scripts un elemento de la pantalla?

Cada elemento de la pantalla se reconoce por el texto que lo acompaña.


Es lo mismo [Plazo de entrega] que [PLAZO DE ENTREGA] ó [plazo de entrega].
Es lo mismo [Plazo de entrega] que [plazodeentrega] ó [PLAZOde Entrega].
Es lo mismo [Plazo de entrega] que [Plazo de ent.].

También podemos el tipo de elemento delante de los corchetes
  • F[...] Field 
  • G[...] Field group 
  • P[...] Pushbutton 
  • R[...] Radiobutton 
  • C[...] Check box 
  • S[...] Tabstrip 
  • T[...] Table 
  • X[...] R/3 controll (e.g. image control) 
  • M[...] Menu ítem
Los elementos de la ventana activa que podemos modificar aparecen a la izquierda en la ventana de GuiXT

En la ventana GuiXT aparecen todos los elementos de la ventana activa
Dentro de las opciones del perfil de GuiXT podemos seleccionar “No language Key” . Permite referirnos a los elementos de la pantalla por su nombre técnico y no por su descripción o texto en el idioma del usuario, con esta opción podemos crear scripts de GuiXT independientes del lenguaje del usuario.

Referencia a los elementos de pantalla por su nombre tecnico
El nombre técnico de un elemento de la pantalla puede ser averiguado, seleccionándolo con el ratón y con la tecla F1, en la ventana de ayuda que se mostrara a continuación, pulsamos el icono de Ayuda técnica.

GuiXT, como todo lenguaje de programación de scripts, posee un juego de caracteres especiales que pueden ser utilizados como comodines,  son sustituidos en tiempo de ejecución permitiendo así una programación más flexible. Para referirnos a un elemento de la pantalla, que no sabemos qué tipo de elemento es ( F, G, P, R… ) , se puede utilizar el carácter “#”, por ejemplo:

F[Material] es lo mismo que #[Material].

Para extraer el valor de una variable o elemento de la pantalla, se antepone el carácter especial “&” al nombre de la variable (ej. &V[data_nombre] , &F[Material] ).


GuiXT Scripts Editor


GuiXT script Editor es un editor de textos, con diferentes herramientas para la programación de scripts de guiXT. Es gratuito y se puede descargar desde la pagina de synactive. Se instala por defecto, en el mismo directorio donde esta instalado el SapGUI y una vez instalado se configurara como editor por defecto para los scripts de GuiXT.

GuiXT Scripts Editor

Características del GuiXT Script Editor:
  • ANSI y UTF-8 Codepage 
  • Resaltado de sintaxis 
  • Ayuda disponible sobre los comandos de GuiXT 
  • Navegación instantánea a los archivos “include” o “process=” 
  • Conversión de bloques de líneas 
  • Gestión de copias de seguridad 
  • Inserción de bloques de código automático 
  • Inserción de comandos
Una de las ventajas de este editor de texto para la creación de script de GuiXT , es que posee una herramienta para inserción automática de comandos, , cada vez que insertemos un comando, se crearan una o varias líneas , que contienen el comando seleccionado y varias opciones del mismo.

Inserción automática de comandos

Si trabajamos en un sistema SAP con UNICODE, debemos grabar los scripts en formato de codificación de caracteres UTF-8, porque si no, los caracteres especiales (el: diéresis, acentos, letra ñ... ) no se visualizaran correctamente y los elementos de pantalla que lleven esos caracteres no podrán ser reconocidos. El editor soporta UTF-8 desde   su versión 2009 1. 

Si queremos nuestro script en un formato de caracteres ANSI ó UTF-8, grabamos el script desde el menú File ► Save as.  GuiXT Script Editor mostrara en que formato estamos trabajando a continuación del nombre del archivo en la esquina superior derecha.

Formato de caracteres ANSI ó UTF-8

Practica 1: Cambiar la disposición de elementos en la pantalla 

Transacción MM01: El usuario, soló necesita un conjunto básico y determinado de campos en la pestaña Datos Básicos 1 para crear nuevos materiales del maestro de materiales cuando crea un nuevo material. Para evitar confusiones y simplificar la pestaña vamos a utilizar un script de GuiXT  para simplificar esta pestaña

Procedimiento: Accedemos a la transacción MM01, después de ejecutar la pantalla de selección, pasamos a la pestaña Datos Básicos 1. Manteniendo esta ventana activa,  saltamos a la ventana de GuiXT y click en el pulsador “SCRIPT”, se abrirá una nueva ventana con el GuiXT Script Editor si esta instalado, si no esta instalado, se abrirá el editor de texto asignado en el perfil ( por defecto el notepad de Windows ).


Como se ha comentado anteriormente, el nombre del archivo donde se guardara el scripts de GuiXT se genera automáticamente y es una combinación del nombre del programa en SAP, un punto, una letra que indica el idioma y la dynpro del programa que esta activa en estos momentos en el SapGui.

Escribimos el siguiente código:

Text F[Material] "Material Nº"
Default F[Unidad medida base] "Kg"
Del F[Sector]

Para copiar mas rápidamente los elementos de la pantalla en el script, si hacemos doble click sobre un elemento en la ventana “Screen Element” del GuiXT, este automáticamente queda copiado en el portapapeles de Windows y con Ctrl+V se copia al editor de texto. 

Grabamos y cerramos el editor, volvemos a entrar en la transacción MM01.

Los elementos de la pantalla han sido modificados por el script de GuiXT
Si al ejecutar el script, ocurriese algún error de sintaxis o de ejecución, el icono de GuiXT de la esquina superior izquierda cambiara a color rojo y en el area de la derecha de la ventana de GuiXT aparecerá en rojo la linea que provoca el error.

El script contiene un error de sintaxis
Vamos a ampliar el script eliminado y desplazando varios elementos de la pestaña Datos Básicos 1

Para borrar elementos de la pantalla utilizamos el comando Del. Con este comando se pueden eliminar de la pantalla campos, pulsadores, radiobuttons, tablas y elementos de los menús.

Opciones:
  • -Triple :Aplicable para campos de salida/entrada con textos adicionales detrás del campo, borra los tres elementos. 
  • -Value :Aplicable para campos de salida/entrada, solo borra el valor que contiene el campo. 
  • -Text :Aplicable para campos de salida/entrada, solo el texto del campo es borrado de la pantalla. 
  • -Box : Aplicable a un grupo de elementos agrupados en un marco, solo el margo alrededor del grupo de elementos se borra de la pantalla. 
  • -WithBox :Aplicable si el elemento de la pantalla es una pestaña ( S[tabstrip] ). Se borra el marco alrededor de los campos.
Ampliamos el script con las siguientes instrucciones:

del F[Jquía.productos] 
del F[Labor/oficina] 
del F[Grupo art. ext.] 
del F[Grupo artículos] 
del F[Válido de] 
del C[Val.parám.validez] 
del F[Gr.tp.pos.gral.] -triple 
del G[Grupo de autoriz. material] 
del F[Status mat.todos ce.] 
del F[Volumen] 
del F[Unidad volumen] 
del F[Tamaño/Dimensión]

Grabamos el script y volvemos a entrar en la transacción MM01 


Con el comando POS, es posible cambiar la posición de los elementos de la pantalla.

pos [screen element] (position X,Y)

Puedes indicar la posición absoluta, por ejemplo (15,10) o relativa a la posición de otro elemento de la pantalla.

Opciones:
  • -Triple : Aplicable para campos de salida/entrada con textos adicionales detrás del campo, desplaza los tres elementos. 
  • -Value :  Aplicable para campos de salida/entrada, solo desplaza el campo. 
  • -Text : Aplicable para campos de salida/entrada, solo desplaza el texto. 
  • width= : Soló para elementos de la pantalla X[...], ej. un grid control: cambia el ancho del elemento de la pantalla..
  • height= : Soló para elementos de la pantalla X[...], ej. un grid control: cambia la altura del elemento de la pantalla.
Ampliamos el script con las siguientes instrucciones:

pos F[Esquema contingente] F[Nºmaterial antiguo]+(1,0)
pos F[Código EAN/UPC] F[Peso neto]+(1,0) 
pos F[Tipo EAN] F[Código EAN/UPC]+(0,40)
pos G[Datos generales] F[Material]+(2,0)
pos G[Dimensiones/EAN] (10,1)
pos G[Datos material de embalaje] (15,1)
pos G[Textos de datos básicos] (18,1)

Por ultimo, con el comando BOXSIZE,  ajustamos los marcos que  agrupan los elementos de la pantalla.

BoxSize G[Marco] (filas,columnas)

Ampliamos el script con las siguientes instrucciones:

boxSize G[Datos generales] (6,83)
boxSize G[Dimensiones/EAN] (5,83)
boxSize G[Datos material de embalaje] (3,83)
boxSize G[Textos de datos básicos] (3,83)


Grabamos el script y volvemos a entrar en la transacción MM01 para ver el resultado final


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.