Para previsualizar un formulario se debe informar la variable control_parameters ( de tipo ssfctrlop) en llamada al módulo de función de SMARTFORM :
- CONTROL-DEVICE = 'PRINTER'.
- CONTROL-NO_DIALOG = 'X'.
- CONTROL-PREVIEW = 'X'.
- CONTROL-GETOTF = ''.
COMENTARIO: En el parámetro US_SCREEN de la rutina ENTRY viene informado si el usuario está previsualizando (US_SCREEN= 'X') o no.
lunes, febrero 21, 2011
martes, febrero 15, 2011
ALV - Mostrar icono
Las pasos para mostrar un icono en un listado ALV son:
- Definir un campo en nuestra estructura de datos de tipo char con 4 dígitos. ICONO TYPE CHAR4
- Incluir el grupo de tipos ICON. TYPE-POOLS: ICON.
- Informar el icono que se quiere mostrar en nuestra estructura IT_ALV-ICONO = '@08@' Gracias a incluir ICON podemos utilizar las constantes IT_ALV_ICONO = ICON_GREEN_LIGHT.
- Informar en el catálogo que el campo muestra un icono. fieldcat-icon = 'X'.
- Definir un campo en nuestra estructura de datos de tipo char con 4 dígitos. ICONO TYPE CHAR4
- Incluir el grupo de tipos ICON. TYPE-POOLS: ICON.
- Informar el icono que se quiere mostrar en nuestra estructura IT_ALV-ICONO = '@08@' Gracias a incluir ICON podemos utilizar las constantes IT_ALV_ICONO = ICON_GREEN_LIGHT.
- Informar en el catálogo que el campo muestra un icono. fieldcat-icon = 'X'.
lunes, enero 10, 2011
Autorizaciones imágenes de SAPSCRIPT
El usuario de SAP debe la autorización de S_BDS_DS para poder realizar la impresión de imágenes en los formularios SAPSCRIPT.
viernes, enero 07, 2011
Programs de SAPSCRIPT
Algunos programas relacionado con SAPSCRIPT:
RSTXFCAT - Program to find out SAP Scirpt names (Search Program)
RSTXCDM1 - SAPscript: Sample Program for Form Printing
RSTXCNVR - Converting SAPscript standard text to RAW format (ASCII)
RSTXCPDF - Routines for Converting OTF Format to PDF Format
RSTXDBUG - Activate/Deactivate Form Debugger
RSTXFCAT - Find Forms
RSTXFCPY - Copy Forms Between Clients
RSTXFCOM - Comparison of Two Forms
RSTXFCON - SAPscript: Conversion of Page Format for Forms
RSTXFINF - Comprehensive Information about a Specific Form
RSTXHTML - Conversion of SAPscript Texts (ITF) to HTML
RSTXICON - List of SAP icons and their names and SAP numbers
RSTXSYMB - List of SAP symbols and their names as well as SAP number
RSTXR3TR - Transport Program For SAPscript Transport Objects
RSTXSCAT - Find Styles
RSTXSF01 - TrueType font installation for SAPscript/SmartForms
RSTXTCAT - Find Standard Texts
RSTXFCAT - Program to find out SAP Scirpt names (Search Program)
RSTXCDM1 - SAPscript: Sample Program for Form Printing
RSTXCNVR - Converting SAPscript standard text to RAW format (ASCII)
RSTXCPDF - Routines for Converting OTF Format to PDF Format
RSTXDBUG - Activate/Deactivate Form Debugger
RSTXFCAT - Find Forms
RSTXFCPY - Copy Forms Between Clients
RSTXFCOM - Comparison of Two Forms
RSTXFCON - SAPscript: Conversion of Page Format for Forms
RSTXFINF - Comprehensive Information about a Specific Form
RSTXHTML - Conversion of SAPscript Texts (ITF) to HTML
RSTXICON - List of SAP icons and their names and SAP numbers
RSTXSYMB - List of SAP symbols and their names as well as SAP number
RSTXR3TR - Transport Program For SAPscript Transport Objects
RSTXSCAT - Find Styles
RSTXSF01 - TrueType font installation for SAPscript/SmartForms
RSTXTCAT - Find Standard Texts
miércoles, noviembre 03, 2010
MF: Primer y ultimo día del mes
Para calcular el primer y última día del mes se utiliza el MF OIL_MONTH_GET_FIRST_LAST
EXPORTING
i_month = p_month
i_year = sy-datum(4)
IMPORTING
e_first_day = r_audat-low
e_last_day = r_audat-high
EXCEPTIONS
wrong_date = 1
OTHERS = 2.
martes, octubre 26, 2010
Gestión modificaciones de tablas (Z y stándard)
SAP permite visualizar datos sobre las modificaciones de contenido sobre las tablas de SAP (insertar, modificar y borrar registros) tanto de tablas Z como tablas estándar (incluidas customizing). Para que se guarden las modificaciones de una tabla, dicha tabla debe tener informado el flag “Grabar en log modificaciones de datos) de la pantalla de “Opciones Técnicas” de la tabla. Además se tiene que modificar la variable de sistema "rec/client" con el valor del mandante que queremos gestionar o "ALL" para gestionar todos los mandantes. Con la transacción spfpar se puede visualizar el contenido lo parámetros del servidor.
Para visualizar las modificaciones se accede a la tx. SCU3. Hay dos opciones: visualizar la tablas que están configuradas para actualizar el log “Lista de tablas grabadas en log” o visualizar las modificaciones “Evaluar logs”.
Si continuamos por la opción “Evaluar logs”, aparece una pantalla de selección se indica: la tabla que se requiere evaluar, el intervalo de fechas y horas, el tipo de tabla y las opciones de salida. El radiobutton “Visualización cuadrícula” muestra el listado en formato ALV (más intuitivo).
jueves, septiembre 09, 2010
SQL - Select + LIKE
En las consultas SELECT se puede utilizar comando LIKE para filtrar valores. En el siguiente ejemplo se filtrar los cecos que el tercer y cuarto dígito sea '00'. Con '_' se indica posiciones individuales que no nos importa el valor (en el ejemplo se ponen dos) y con '%' se indicas posiciones multiples que nos nos importa el valor.
CONCATENATE '__' '00' '%' INTO l_kostl_aux.
SELECT kostl ltext FROM cskt
INTO CORRESPONDING FIELDS OF TABLE f_it_centros_coste
WHERE spras EQ sy-langu
AND kokrs EQ g_kokrs
AND kostl LIKE l_kostl_aux
AND datbi >= sy-datum.
CONCATENATE '__' '00' '%' INTO l_kostl_aux.
SELECT kostl ltext FROM cskt
INTO CORRESPONDING FIELDS OF TABLE f_it_centros_coste
WHERE spras EQ sy-langu
AND kokrs EQ g_kokrs
AND kostl LIKE l_kostl_aux
AND datbi >= sy-datum.
martes, agosto 31, 2010
Eliminar chequeo duplicidad de DNI
En SAP no se puede tener dos clientes con el mismo DNI. Se puede eliminar dicho chequeo mediante custominzing, cambiando el tipo de mensaje.
jueves, agosto 26, 2010
Buscar string en programas
Existe el programa estandard RS_ABAP_SOURCE_SCAN para buscar string en programas.
miércoles, julio 07, 2010
Tablas de textos
Cuando queremos que un variable coja unos valores concreto (por ejemplo color: azul, rojo, verde) podemos hacer dos cosas:
A) Generar un dominio e informar los valores como valores fijos. En este caso cada vez que queremos añadir algún valor deberemos modificar el dominio y transportar las modificaciones.
B) Generar una tabla de valores. Esta tabla se puede informar sin la necesidad de modificar ningún objeto. Esta es la mejor opción si los valores pueden cambiar con el tiempo.
Ejemplo tonto: quiero un tabla que informe ID_COCHE ID_COLOR. El campo ID_COLOR tiene un identificador del color. Los pasos a seguir son:
1) Crear una tabla de textos con los siguientes campos: MANDANTE, ID_COLOR y IDIOMA DESCRIPCIÓN. En esta tabla se informa la descripción de cada color.
2) Crear una tabla para los valores con los siguientes campos: MANDANTE y ID_COLOR.
En esta tabla se informa los colores.
3) Desde la tabla de textos relacionar a la tabla de valores mediante una clave externa de tipo "Campos clave de una tabla de texto".
4) Por último se crea la tabla principal donde se informaría el color de cada coche con los campo MANDATE, ID_COCHE y ID_COLOR.
5) Para que sólo se pudieran informar valores correctos a esta última tabla se añadiría una clave externa que apuntara a la tabla de valores.
A) Generar un dominio e informar los valores como valores fijos. En este caso cada vez que queremos añadir algún valor deberemos modificar el dominio y transportar las modificaciones.
B) Generar una tabla de valores. Esta tabla se puede informar sin la necesidad de modificar ningún objeto. Esta es la mejor opción si los valores pueden cambiar con el tiempo.
Ejemplo tonto: quiero un tabla que informe ID_COCHE ID_COLOR. El campo ID_COLOR tiene un identificador del color. Los pasos a seguir son:
1) Crear una tabla de textos con los siguientes campos: MANDANTE, ID_COLOR y IDIOMA DESCRIPCIÓN. En esta tabla se informa la descripción de cada color.
2) Crear una tabla para los valores con los siguientes campos: MANDANTE y ID_COLOR.
En esta tabla se informa los colores.
3) Desde la tabla de textos relacionar a la tabla de valores mediante una clave externa de tipo "Campos clave de una tabla de texto".
4) Por último se crea la tabla principal donde se informaría el color de cada coche con los campo MANDATE, ID_COCHE y ID_COLOR.
5) Para que sólo se pudieran informar valores correctos a esta última tabla se añadiría una clave externa que apuntara a la tabla de valores.
viernes, mayo 21, 2010
SD - Añadir Campos Clientes a los Pedidos de Ventas
Para añadir nuevos campos en la transacción VA01/VA02/VA03 en la pestaña "Datos adicionales B" se debe realizar un append (no es necesario registrar la tabla) de una estructura en las tablas:
- VBAK, datos de cabecera.
- VBAP, datos de posición.
Si que es necesario registro el programa SAPMV45A donde se definen los dynpros para mostrar los campos:
- Dynpro 8459, datos de cabecera
- Dynpro 8309, datos de posición.
Estos dynpros trabajan con los includes MV45AOZZ (lógica del PBO) y MV45ATZZ (definición de datos globales).
NOTAS:
- Hace falta controlar manualmente si se está en modo visualización o modificación para habilitar o deshabilitar la modificación de los datos.
- VBAK, datos de cabecera.
- VBAP, datos de posición.
Si que es necesario registro el programa SAPMV45A donde se definen los dynpros para mostrar los campos:
- Dynpro 8459, datos de cabecera
- Dynpro 8309, datos de posición.
Estos dynpros trabajan con los includes MV45AOZZ (lógica del PBO) y MV45ATZZ (definición de datos globales).
NOTAS:
- Hace falta controlar manualmente si se está en modo visualización o modificación para habilitar o deshabilitar la modificación de los datos.
jueves, mayo 13, 2010
SAPCRIPT - Buscar formularios
Mediante la transacción SE71 se puede realizar la búsqueda de formularios mediante el matchcode. Esta búsqueda no es del todo eficiente. Hay una búsqueda más exhaustiva: dentro de la pantalla de búsqueda ir "BUSCAR" y después a "Función Búsqueda Técnica".
ALV - recuperar catálogo de campos
Para mostrar un ALV se debe utilizar el módulo de función REUSE_ALV_GRID_DISPLAY. Es necesario informar los campos del catálogo (campo it_fieldcat). Para ello se puede utilizar el módulo de función REUSE_ALV_FIELDCATALOG_MERGE que recupera el catálogo a partir de una tabla interna del programa, una tabla del diccionario o una estructura del diccionario.
martes, abril 06, 2010
SHARED OBJECTS
A partir de la versión ECC6.0 se ha añadido una nueva funcionalidad "SHARED OBJECTS" para compartir datos por memoria. Aún se puede utilizar métodos de siempre sentencias IMPORT/EXPORT y SET/GET PARAMETER.
Pasos a seguir:
1) Crear una área mediante la transacción SHMA. Esta área genera automáticamente una interfase. En el ejemplo se crea el area Z_CL_SHM_AREA_1 y se genera la clase con el mismo nombre.
2) Crear una clase mediante la transacción SE24 que herede de la clase CL_SHM_ROOT_1. En el ejemplo se crea la clase ZCL_SHM_ROOT_1.
Hay que marcar el flag para memória compartida. Se añade el atributo variable a la clase y sus métodos set/get:
METHOD get_variable.
e_variable = variable.
ENDMETHOD.
METHOD set_variable.
variable = i_variable.
ENDMETHOD.
3) Crear programa que guardar información en memoria.
REPORT zshare_objects.
PARAMETERS: p_param(128).
DATA: hdl TYPE REF TO z_cl_shm_area_1.
DATA: root TYPE REF TO zcl_shm_root_1.
DATA: l_variable TYPE string.
START-OF-SELECTION.
hdl = z_cl_shm_area_1=>attach_for_write( )."Indicar que para escritura
CREATE OBJECT root AREA HANDLE hdl.
l_variable = p_param.
CALL METHOD root->set_variable
EXPORTING
i_variable = l_variable.
hdl->set_root( root ).
hdl->detach_commit( ) .
4) Crear programa que lea de memória.
REPORT zshare_objects2.
DATA: hdl TYPE REF TO z_cl_shm_area_1.
DATA: root TYPE REF TO zcl_shm_root_1.
DATA: l_variable TYPE string.
START-OF-SELECTION.
TRY.
hdl = z_cl_shm_area_1=>attach_for_read( )."indicar que es para lectura
CATCH cx_shm_attach_error.
ENDTRY.
CALL METHOD hdl->root->get_variable
IMPORTING
e_variable = l_variable.
WRITE: 'Valor variable', l_variable.
Para más información:
http://help.sap.com/saphelp_nw2004s/helpdata/EN/14/dafc3e9d3b6927e10000000a114084/frameset.htm
http://www.sap-press.de/katalog/buecher/htmlleseproben/gp/htmlprobID-111
Pasos a seguir:
1) Crear una área mediante la transacción SHMA. Esta área genera automáticamente una interfase. En el ejemplo se crea el area Z_CL_SHM_AREA_1 y se genera la clase con el mismo nombre.
2) Crear una clase mediante la transacción SE24 que herede de la clase CL_SHM_ROOT_1. En el ejemplo se crea la clase ZCL_SHM_ROOT_1.
Hay que marcar el flag para memória compartida. Se añade el atributo variable a la clase y sus métodos set/get:
METHOD get_variable.
e_variable = variable.
ENDMETHOD.
METHOD set_variable.
variable = i_variable.
ENDMETHOD.
3) Crear programa que guardar información en memoria.
REPORT zshare_objects.
PARAMETERS: p_param(128).
DATA: hdl TYPE REF TO z_cl_shm_area_1.
DATA: root TYPE REF TO zcl_shm_root_1.
DATA: l_variable TYPE string.
START-OF-SELECTION.
hdl = z_cl_shm_area_1=>attach_for_write( )."Indicar que para escritura
CREATE OBJECT root AREA HANDLE hdl.
l_variable = p_param.
CALL METHOD root->set_variable
EXPORTING
i_variable = l_variable.
hdl->set_root( root ).
hdl->detach_commit( ) .
4) Crear programa que lea de memória.
REPORT zshare_objects2.
DATA: hdl TYPE REF TO z_cl_shm_area_1.
DATA: root TYPE REF TO zcl_shm_root_1.
DATA: l_variable TYPE string.
START-OF-SELECTION.
TRY.
hdl = z_cl_shm_area_1=>attach_for_read( )."indicar que es para lectura
CATCH cx_shm_attach_error.
ENDTRY.
CALL METHOD hdl->root->get_variable
IMPORTING
e_variable = l_variable.
WRITE: 'Valor variable', l_variable.
Para más información:
http://help.sap.com/saphelp_nw2004s/helpdata/EN/14/dafc3e9d3b6927e10000000a114084/frameset.htm
http://www.sap-press.de/katalog/buecher/htmlleseproben/gp/htmlprobID-111
miércoles, marzo 10, 2010
TRANSACCIONS - Menús de ámbito MM
Menús de Ámbito de MM:
- Materiales MM00.
- Documentos compras ME00.
- Inventario MI00.
- Stock MB00.
- Materiales MM00.
- Documentos compras ME00.
- Inventario MI00.
- Stock MB00.
martes, marzo 09, 2010
USER-EXIT buscar ampliación a partir de MF
Utilizar la tx. SMOD. Después utilizar F4 de ampliación, botón de 'Sistema de información', botón 'Selecciones (todas)' y por último informar campo nombre de componente.
ALV - Catálogo
ROW_POS:
Solo se informará este campo en el caso en el que el report de salida sea multilínea. Valores: 0, 1, 2 y 3.
COL_POS:
Solo es relevante en el caso que se quiera que la salida en el listado tenga un orden distinto a su posición en la tabla interna de datos.
TABNAME:
Nombre de la tabla interna que contiene los datos a mostrar en el listado.
REF_FIELDNAME:
Nombre del campo de la tabla del diccionario de datos al cual está referenciado el campo de la tabla interna (en el caso en el que lo esté).
CFIELDNAME:
Nombre del campo de la tabla interna de datos que contiene la moneda para el campo importe.
CTABNAME:
Este dato sólo es relevante informarlo para listados con más de una cabecera.
QFIELDNAME:
Nombre del campo de la tabla interna de datos que contiene la unidad de medida para el campo cantidad.
QTABNAME:
Este dato solo es relevante informarlo para listados con más de una cabecera.
OUTPUTLEN:
Siempre que el campo a mostrar en el listado de salida no esté referenciado a ningún campo de tabla del diccionario, se especificará aquí la longitud de salida del campo.
KEY:
El campo del registro actual se tomará como clave si se marca este campo. No podrá ocultarse en el listado de salida este campo.
KEY_SEL:
El campo será clave, pero podrá no salir en el listado de salida.
NO_OUT:
El campo no será mostrado en el listado de salida.
TECH:
Si se marca este campo, el campo actual no puede nunca salir en el listado de salida.
EMPHASIZE:
Para mostrar el campo de algún color.
HOTSPOT:
El campo aparece como hotspot.
FIX_COLUMN:
Si se marca, este campo aparecería como columna fija.
DO_SUM:
Se calculará la suma de este campo.
NO_SUM:
No se calculará la suma de este campo.
ICON:
El campo será mostrado como un icono.
SYMBOL:
El campo será mostrado como un símbolo.
JUST:
Justificación del campo. R= justificado a la derecha, L= justificado a la izquierda, C= centrado.
LZERO:
Mostrará los campos de tipo NUMC justificados a la derecha y sin ceros a la izquierda.
NO_SIGN:
Mostrará el campo sin signos.
NO_ZERO:
Suprime los 0’s.
EDIT_MASK:
Mostrará el campo con una máscara.
SELTEXT_L:
Se mostrará en la cabecera de la columna el texto largo de la definición del campo en la tabla del diccinario de datos.
SELTEXT_M:
Se mostrará en la cabecera de la columna el texto medio de la definición del campo en la tabla del diccinario de datos.
SELTEXT_S:
Se mostrará en la cabecera de la columna el texto corto de la definición del campo en la tabla del diccinario de datos.
DDICTXT:
Especificará mediante L, M y S el texto largo, medio o corto que se utilizará en los títulos de las cabeceras.
DATATYPE:
Se especificará cuando el campo de la tabla interna de datos no esté referenciado a ningún campo de tabla del diccionario de datos.
DDIC_OUTPUTLEN:
Especifica la longitud de salida. Para campos no referenciados al diccionario de datos.
SP_GROUP:
Si se marca este campo, el campo actual pertenecerá a un grupo que se especificará después en el parámetro IT_SPECIAL_GROUPS.
REPREP:
El campo será tomado como un criterio de selección
Solo se informará este campo en el caso en el que el report de salida sea multilínea. Valores: 0, 1, 2 y 3.
COL_POS:
Solo es relevante en el caso que se quiera que la salida en el listado tenga un orden distinto a su posición en la tabla interna de datos.
TABNAME:
Nombre de la tabla interna que contiene los datos a mostrar en el listado.
REF_FIELDNAME:
Nombre del campo de la tabla del diccionario de datos al cual está referenciado el campo de la tabla interna (en el caso en el que lo esté).
CFIELDNAME:
Nombre del campo de la tabla interna de datos que contiene la moneda para el campo importe.
CTABNAME:
Este dato sólo es relevante informarlo para listados con más de una cabecera.
QFIELDNAME:
Nombre del campo de la tabla interna de datos que contiene la unidad de medida para el campo cantidad.
QTABNAME:
Este dato solo es relevante informarlo para listados con más de una cabecera.
OUTPUTLEN:
Siempre que el campo a mostrar en el listado de salida no esté referenciado a ningún campo de tabla del diccionario, se especificará aquí la longitud de salida del campo.
KEY:
El campo del registro actual se tomará como clave si se marca este campo. No podrá ocultarse en el listado de salida este campo.
KEY_SEL:
El campo será clave, pero podrá no salir en el listado de salida.
NO_OUT:
El campo no será mostrado en el listado de salida.
TECH:
Si se marca este campo, el campo actual no puede nunca salir en el listado de salida.
EMPHASIZE:
Para mostrar el campo de algún color.
HOTSPOT:
El campo aparece como hotspot.
FIX_COLUMN:
Si se marca, este campo aparecería como columna fija.
DO_SUM:
Se calculará la suma de este campo.
NO_SUM:
No se calculará la suma de este campo.
ICON:
El campo será mostrado como un icono.
SYMBOL:
El campo será mostrado como un símbolo.
JUST:
Justificación del campo. R= justificado a la derecha, L= justificado a la izquierda, C= centrado.
LZERO:
Mostrará los campos de tipo NUMC justificados a la derecha y sin ceros a la izquierda.
NO_SIGN:
Mostrará el campo sin signos.
NO_ZERO:
Suprime los 0’s.
EDIT_MASK:
Mostrará el campo con una máscara.
SELTEXT_L:
Se mostrará en la cabecera de la columna el texto largo de la definición del campo en la tabla del diccinario de datos.
SELTEXT_M:
Se mostrará en la cabecera de la columna el texto medio de la definición del campo en la tabla del diccinario de datos.
SELTEXT_S:
Se mostrará en la cabecera de la columna el texto corto de la definición del campo en la tabla del diccinario de datos.
DDICTXT:
Especificará mediante L, M y S el texto largo, medio o corto que se utilizará en los títulos de las cabeceras.
DATATYPE:
Se especificará cuando el campo de la tabla interna de datos no esté referenciado a ningún campo de tabla del diccionario de datos.
DDIC_OUTPUTLEN:
Especifica la longitud de salida. Para campos no referenciados al diccionario de datos.
SP_GROUP:
Si se marca este campo, el campo actual pertenecerá a un grupo que se especificará después en el parámetro IT_SPECIAL_GROUPS.
REPREP:
El campo será tomado como un criterio de selección
martes, enero 12, 2010
SAPSCRIPT - Leer variables del SAPSCRIPT
CALL FUNCTION 'GET_TEXTSYMBOL'
EXPORTING
line = '&PAGE&'
start_offset = 0
IMPORTING
value = hlp_page.
EXPORTING
line = '&PAGE&'
start_offset = 0
IMPORTING
value = hlp_page.
jueves, diciembre 31, 2009
FICHEROS - Leer y Escribir en local y servidor
Grupo de funciones EPSF.
DATA: gt_itab TYPE STANDARD TABLE OF char2048.
DATA: gs_itab TYPE char2048.
*&---------------------------------------------------------------------*
*& Form recuperar_datos_fichero_s
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
FORM recuperar_datos_fichero_s.
DATA: l_filename TYPE string.
l_filename = p_path_o.
REFRESH gt_itab.
OPEN DATASET l_filename FOR INPUT IN TEXT MODE ENCODING DEFAULT.
IF sy-subrc EQ 0.
DO.
CLEAR: gs_itab.
READ DATASET l_filename INTO gs_itab.
IF sy-subrc NE 0.
EXIT.
ELSE.
APPEND gs_itab TO gt_itab.
ENDIF.
ENDDO.
ELSE.
g_error = 'X'.
MESSAGE i000(zmm) WITH 'Error al abrir fichero:'
'No existe fichero'
'l_filename'.
ENDIF.
ENDFORM. "recuperar_datos_fichero_s
*&---------------------------------------------------------------------*
*& Form recuperar_datos_fichero
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
FORM recuperar_datos_fichero_l.
DATA: l_filename TYPE string.
l_filename = p_path_o.
REFRESH gt_itab.
CALL METHOD cl_gui_frontend_services=>gui_upload
EXPORTING
filename = l_filename
CHANGING
data_tab = gt_itab
EXCEPTIONS
file_open_error = 1
file_read_error = 2
no_batch = 3
gui_refuse_filetransfer = 4
invalid_type = 5
no_authority = 6
unknown_error = 7
bad_data_format = 8
header_not_allowed = 9
separator_not_allowed = 10
header_too_long = 11
unknown_dp_error = 12
access_denied = 13
dp_out_of_memory = 14
disk_full = 15
dp_timeout = 16
OTHERS = 17.
IF sy-subrc <> 0.
g_error = 'X'.
MESSAGE ID sy-msgid
TYPE 'I' "sy-msgty
NUMBER sy-msgno
WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
ENDIF.
ENDFORM. "recuperar_datos_fichero
*&---------------------------------------------------------------------*
*& Form guardar_datos_fichero
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
FORM guardar_datos_fichero_s.
DATA: l_filename TYPE string.
l_filename = p_path_d.
OPEN DATASET l_filename FOR OUTPUT IN TEXT MODE ENCODING DEFAULT.
IF sy-subrc EQ 0.
LOOP AT gt_itab INTO gs_itab.
TRANSFER gs_itab TO l_filename.
ENDLOOP.
CLOSE DATASET l_filename.
ELSE.
g_error = 'X'.
MESSAGE i000(zmm) WITH 'Error al crear fichero'
'l_filename'.
ENDIF.
ENDFORM. "guardar_datos_fichero_L
*&---------------------------------------------------------------------*
*& Form guardar_datos_fichero_L
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
FORM guardar_datos_fichero_l.
DATA: l_filename TYPE string.
l_filename = p_path_d.
CALL METHOD cl_gui_frontend_services=>gui_download
EXPORTING
filename = l_filename
filetype = 'ASC'
CHANGING
data_tab = gt_itab
EXCEPTIONS
file_write_error = 1
no_batch = 2
gui_refuse_filetransfer = 3
invalid_type = 4
no_authority = 5
unknown_error = 6
header_not_allowed = 7
separator_not_allowed = 8
filesize_not_allowed = 9
header_too_long = 10
dp_error_create = 11
dp_error_send = 12
dp_error_write = 13
unknown_dp_error = 14
access_denied = 15
dp_out_of_memory = 16
disk_full = 17
dp_timeout = 18
file_not_found = 19
dataprovider_exception = 20
control_flush_error = 21
not_supported_by_gui = 22
error_no_gui = 23
OTHERS = 24.
IF sy-subrc <> 0.
g_error = 'X'.
MESSAGE ID sy-msgid
TYPE sy-msgty
NUMBER sy-msgno
WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
ENDIF.
ENDFORM. "guardar_datos_fichero
DATA: gt_itab TYPE STANDARD TABLE OF char2048.
DATA: gs_itab TYPE char2048.
*&---------------------------------------------------------------------*
*& Form recuperar_datos_fichero_s
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
FORM recuperar_datos_fichero_s.
DATA: l_filename TYPE string.
l_filename = p_path_o.
REFRESH gt_itab.
OPEN DATASET l_filename FOR INPUT IN TEXT MODE ENCODING DEFAULT.
IF sy-subrc EQ 0.
DO.
CLEAR: gs_itab.
READ DATASET l_filename INTO gs_itab.
IF sy-subrc NE 0.
EXIT.
ELSE.
APPEND gs_itab TO gt_itab.
ENDIF.
ENDDO.
ELSE.
g_error = 'X'.
MESSAGE i000(zmm) WITH 'Error al abrir fichero:'
'No existe fichero'
'l_filename'.
ENDIF.
ENDFORM. "recuperar_datos_fichero_s
*&---------------------------------------------------------------------*
*& Form recuperar_datos_fichero
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
FORM recuperar_datos_fichero_l.
DATA: l_filename TYPE string.
l_filename = p_path_o.
REFRESH gt_itab.
CALL METHOD cl_gui_frontend_services=>gui_upload
EXPORTING
filename = l_filename
CHANGING
data_tab = gt_itab
EXCEPTIONS
file_open_error = 1
file_read_error = 2
no_batch = 3
gui_refuse_filetransfer = 4
invalid_type = 5
no_authority = 6
unknown_error = 7
bad_data_format = 8
header_not_allowed = 9
separator_not_allowed = 10
header_too_long = 11
unknown_dp_error = 12
access_denied = 13
dp_out_of_memory = 14
disk_full = 15
dp_timeout = 16
OTHERS = 17.
IF sy-subrc <> 0.
g_error = 'X'.
MESSAGE ID sy-msgid
TYPE 'I' "sy-msgty
NUMBER sy-msgno
WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
ENDIF.
ENDFORM. "recuperar_datos_fichero
*&---------------------------------------------------------------------*
*& Form guardar_datos_fichero
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
FORM guardar_datos_fichero_s.
DATA: l_filename TYPE string.
l_filename = p_path_d.
OPEN DATASET l_filename FOR OUTPUT IN TEXT MODE ENCODING DEFAULT.
IF sy-subrc EQ 0.
LOOP AT gt_itab INTO gs_itab.
TRANSFER gs_itab TO l_filename.
ENDLOOP.
CLOSE DATASET l_filename.
ELSE.
g_error = 'X'.
MESSAGE i000(zmm) WITH 'Error al crear fichero'
'l_filename'.
ENDIF.
ENDFORM. "guardar_datos_fichero_L
*&---------------------------------------------------------------------*
*& Form guardar_datos_fichero_L
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
FORM guardar_datos_fichero_l.
DATA: l_filename TYPE string.
l_filename = p_path_d.
CALL METHOD cl_gui_frontend_services=>gui_download
EXPORTING
filename = l_filename
filetype = 'ASC'
CHANGING
data_tab = gt_itab
EXCEPTIONS
file_write_error = 1
no_batch = 2
gui_refuse_filetransfer = 3
invalid_type = 4
no_authority = 5
unknown_error = 6
header_not_allowed = 7
separator_not_allowed = 8
filesize_not_allowed = 9
header_too_long = 10
dp_error_create = 11
dp_error_send = 12
dp_error_write = 13
unknown_dp_error = 14
access_denied = 15
dp_out_of_memory = 16
disk_full = 17
dp_timeout = 18
file_not_found = 19
dataprovider_exception = 20
control_flush_error = 21
not_supported_by_gui = 22
error_no_gui = 23
OTHERS = 24.
IF sy-subrc <> 0.
g_error = 'X'.
MESSAGE ID sy-msgid
TYPE sy-msgty
NUMBER sy-msgno
WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
ENDIF.
ENDFORM. "guardar_datos_fichero
lunes, noviembre 30, 2009
PDF - Report conversión orden spool y PDF
Existe el report standard para pasar órdenes de spool a PDF:
- RSTXPDFT4.
- RSTXPDFT4.
viernes, noviembre 13, 2009
FS - Field-Symbols
Necesarios para recuperar datos de variables no accesibles en modo local.
FIELD-SYMBOLS: TYPE docubatch_data_s.
FIELD-SYMBOLS: TYPE docubatch_data_t.
DATA: l_wa_docubatch_com TYPE docubatch_screen_fields.
DATA: l_nombre_campo(100).
DATA: l_charg TYPE charg_d.
* Tabla sin cabecera, si tuviera cabecera habría que acceder por GT_DATA[].
l_nombre_campo = '(SAPLVBDOCUBATCH_DM)GT_DATA'.
ASSIGN (l_nombre_campo) TO.
l_subrc = sy-subrc.
*********
* Tabla *
*********
READ TABLE ASSIGNING
WITH KEY matnr = l_wa_mseg-matnr.
************************************************
* Tabla que contiene un campo que es una tabla *
************************************************
IF sy-subrc EQ 0.
CLEAR: l_wa_docubatch_com.
READ TABLE-t_docubatches INDEX 2
INTO l_wa_docubatch_com.
IF sy-subrc EQ 0.
l_charg = l_wa_docubatch_com-docubatch_charg.
ENDIF.
ENDIF.
FIELD-SYMBOLS:
FIELD-SYMBOLS:
DATA: l_wa_docubatch_com TYPE docubatch_screen_fields.
DATA: l_nombre_campo(100).
DATA: l_charg TYPE charg_d.
* Tabla sin cabecera, si tuviera cabecera habría que acceder por GT_DATA[].
l_nombre_campo = '(SAPLVBDOCUBATCH_DM)GT_DATA'.
ASSIGN (l_nombre_campo) TO
l_subrc = sy-subrc.
*********
* Tabla *
*********
READ TABLE
WITH KEY matnr = l_wa_mseg-matnr.
************************************************
* Tabla que contiene un campo que es una tabla *
************************************************
IF sy-subrc EQ 0.
CLEAR: l_wa_docubatch_com.
READ TABLE
INTO l_wa_docubatch_com.
IF sy-subrc EQ 0.
l_charg = l_wa_docubatch_com-docubatch_charg.
ENDIF.
ENDIF.
martes, noviembre 10, 2009
FICHEROS - Trabajar con nombres de rutas y ficheros
¿Qué tenemos?
C:\CARPETA1\CARPETA2\FICHERO.EXE
¿Qué queremos?
valor1 = C:\CARPETA1\CARPETA2\
valor2 = FICHERO.EXE
¿Además de la sentencia ABAP split que podemos utilizar?
CALL FUNCTION 'SO_SPLIT_FILE_AND_PATH'
EXPORTING
full_name = p_ruta_completa " C:\CARPETA1\CARPETA2\FICHERO.EXE
IMPORTING
stripped_name = v_exe " FICHERO.EXE
file_path = v_cd. " C:\CARPETA1\CARPETA2\
C:\CARPETA1\CARPETA2\FICHERO.EXE
¿Qué queremos?
valor1 = C:\CARPETA1\CARPETA2\
valor2 = FICHERO.EXE
¿Además de la sentencia ABAP split que podemos utilizar?
CALL FUNCTION 'SO_SPLIT_FILE_AND_PATH'
EXPORTING
full_name = p_ruta_completa " C:\CARPETA1\CARPETA2\FICHERO.EXE
IMPORTING
stripped_name = v_exe " FICHERO.EXE
file_path = v_cd. " C:\CARPETA1\CARPETA2\
miércoles, noviembre 04, 2009
FICHEROS - Listar ficheros de directorio local y del servidor SAP
Transacciones para trabajar con fichero del servidor SAP AL11, N2UX, CG3Y y CG3Z.
*****
PARAMETER: p_fdir TYPE pfeflnamel DEFAULT
*'/usr/sap/tmp'.
'C:\pruebas\xml'.
PARAMETER: p_local AS CHECKBOX DEFAULT 'X'.
DATA: BEGIN OF it_filedir OCCURS 10.
INCLUDE STRUCTURE salfldir.
DATA: END OF it_filedir.
DATA: l_it_file_table TYPE TABLE OF sdokpath WITH HEADER LINE.
DATA: l_it_dir_table TYPE TABLE OF sdokpath.
************************************************************************
START-OF-SELECTION.
************************************************************************
IF p_local EQ 'X'.
CALL FUNCTION 'TMP_GUI_DIRECTORY_LIST_FILES'
EXPORTING
directory = p_fdir
filter = '*.XML'
* IMPORTING
* FILE_COUNT =
* DIR_COUNT =
TABLES
file_table = l_it_file_table
dir_table = l_it_dir_table
EXCEPTIONS
cntl_error = 1
OTHERS = 2.
LOOP AT l_it_file_table.
WRITE: / l_it_file_table-pathname.
ENDLOOP.
ELSE.
* Get Current Directory Listing for OUT Dir
* OJO al probar el MF directamente en la SE37 (convierte a mayúsculas).
CALL FUNCTION 'RZL_READ_DIR_LOCAL'
EXPORTING
name = p_fdir
TABLES
file_tbl = it_filedir.
* List of files are contained within table it_filedir
LOOP AT it_filedir.
WRITE: / it_filedir-name.
ENDLOOP.
ENDIF.
*****
PARAMETER: p_fdir TYPE pfeflnamel DEFAULT
*'/usr/sap/tmp'.
'C:\pruebas\xml'.
PARAMETER: p_local AS CHECKBOX DEFAULT 'X'.
DATA: BEGIN OF it_filedir OCCURS 10.
INCLUDE STRUCTURE salfldir.
DATA: END OF it_filedir.
DATA: l_it_file_table TYPE TABLE OF sdokpath WITH HEADER LINE.
DATA: l_it_dir_table TYPE TABLE OF sdokpath.
************************************************************************
START-OF-SELECTION.
************************************************************************
IF p_local EQ 'X'.
CALL FUNCTION 'TMP_GUI_DIRECTORY_LIST_FILES'
EXPORTING
directory = p_fdir
filter = '*.XML'
* IMPORTING
* FILE_COUNT =
* DIR_COUNT =
TABLES
file_table = l_it_file_table
dir_table = l_it_dir_table
EXCEPTIONS
cntl_error = 1
OTHERS = 2.
LOOP AT l_it_file_table.
WRITE: / l_it_file_table-pathname.
ENDLOOP.
ELSE.
* Get Current Directory Listing for OUT Dir
* OJO al probar el MF directamente en la SE37 (convierte a mayúsculas).
CALL FUNCTION 'RZL_READ_DIR_LOCAL'
EXPORTING
name = p_fdir
TABLES
file_tbl = it_filedir.
* List of files are contained within table it_filedir
LOOP AT it_filedir.
WRITE: / it_filedir-name.
ENDLOOP.
ENDIF.
miércoles, octubre 28, 2009
Trabajar con decimales
Puede interesar redondear cantidades. Para ello hay dos opciones:
- Utitlizar variables de tipo entero, que realizan automáticamente la conversión.
- Utilizar las sentencias de ABAP, 'floor' y 'ceil'.
DATOS:
Cantidad 1 1,200
Cantidad 2 1,600
RESULTADO:
Variable tipo "I" cantidad 1 = 1 ( parte decimal < 0,50 )
Variable tipo "I" cantidad 2 = 2 ( parte decimal > 0,50 )
Sentencia "Ceil" cantidad 1 = 2,000
Sentencia "Floor" cantidad 1 = 1,000
- Utitlizar variables de tipo entero, que realizan automáticamente la conversión.
- Utilizar las sentencias de ABAP, 'floor' y 'ceil'.
DATOS:
Cantidad 1 1,200
Cantidad 2 1,600
RESULTADO:
Variable tipo "I" cantidad 1 = 1 ( parte decimal < 0,50 )
Variable tipo "I" cantidad 2 = 2 ( parte decimal > 0,50 )
Sentencia "Ceil" cantidad 1 = 2,000
Sentencia "Floor" cantidad 1 = 1,000
lunes, octubre 05, 2009
MF - Trabajar con importes
Tenemos un fichero con importes y queremos grabarlo en SAP (separador decimales = ',')
Definir variables de tipo char de tamaño = longitud+decimales+1 del punto
SAP guardar los importes con el separador de importe '.'
Utilizar el MF:
data: l_importe_c(28).
data: l_importe type BAPIWRBTR.
CALL FUNCTION 'MOVE_CHAR_TO_NUM'
EXPORTING
chr = l_importe_c
IMPORTING
NUM = l_importe
EXCEPTIONS
CONVT_NO_NUMBER = 1
CONVT_OVERFLOW = 2
OTHERS = 3.
Definir variables de tipo char de tamaño = longitud+decimales+1 del punto
SAP guardar los importes con el separador de importe '.'
Utilizar el MF:
data: l_importe_c(28).
data: l_importe type BAPIWRBTR.
CALL FUNCTION 'MOVE_CHAR_TO_NUM'
EXPORTING
chr = l_importe_c
IMPORTING
NUM = l_importe
EXCEPTIONS
CONVT_NO_NUMBER = 1
CONVT_OVERFLOW = 2
OTHERS = 3.
martes, septiembre 15, 2009
SAPSCRIPT - Llamar a una rutina
Código de SAPSCRIPT:
/: PERFORM RECUPERAR_DATOS_PAGOS IN PROGRAM ZPROGRAMA
/: USING &VAR1&
/: USING &VAR2&
/: CHANGING &VAR3&
/: ENDPERFORM
REPORT zfi_include.
*&---------------------------------------------------------------------*
*& Form recuperar_codigo_nacional
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* -->IN_TAB text
* -->OUT_TAB text
*----------------------------------------------------------------------*
FORM recuperar_datos_pagos TABLES in_tab STRUCTURE itcsy
out_tab STRUCTURE itcsy.
DATA: l_wa_in_tab TYPE itcsy.
DATA: l_wa_out_tab TYPE itcsy.
DATA: l_var1 TYPE reguh-laufd.
DATA: l_var2 TYPE reguh-laufi.
DATA: l_var3 TYPE reguh-rwbtr.
* Recuperar valores SAPSCRIPT
CLEAR: l_wa_in_tab.
READ TABLE in_tab WITH KEY name = 'VAR1'
INTO l_wa_in_tab.
IF sy-subrc EQ 0.
l_var1 = l_wa_in_tab-value.
ENDIF.
CLEAR: l_wa_in_tab.
READ TABLE in_tab WITH KEY name = 'VAR2'
INTO l_wa_in_tab.
IF sy-subrc EQ 0.
l_var2 = l_wa_in_tab-value.
ENDIF.
* Modificar valores SAPSCRIPT
l_var3 = l_var1 + l_var2.
l_wa_out_tab-value = l_var3.
l_wa_out_tab-name = 'VAR3'.
MODIFY out_tab FROM l_wa_out_tab
TRANSPORTING value
WHERE name EQ 'VAR3'.
ENDFORM. "recuperar_datos_pagos
/: PERFORM RECUPERAR_DATOS_PAGOS IN PROGRAM ZPROGRAMA
/: USING &VAR1&
/: USING &VAR2&
/: CHANGING &VAR3&
/: ENDPERFORM
REPORT zfi_include.
*&---------------------------------------------------------------------*
*& Form recuperar_codigo_nacional
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* -->IN_TAB text
* -->OUT_TAB text
*----------------------------------------------------------------------*
FORM recuperar_datos_pagos TABLES in_tab STRUCTURE itcsy
out_tab STRUCTURE itcsy.
DATA: l_wa_in_tab TYPE itcsy.
DATA: l_wa_out_tab TYPE itcsy.
DATA: l_var1 TYPE reguh-laufd.
DATA: l_var2 TYPE reguh-laufi.
DATA: l_var3 TYPE reguh-rwbtr.
* Recuperar valores SAPSCRIPT
CLEAR: l_wa_in_tab.
READ TABLE in_tab WITH KEY name = 'VAR1'
INTO l_wa_in_tab.
IF sy-subrc EQ 0.
l_var1 = l_wa_in_tab-value.
ENDIF.
CLEAR: l_wa_in_tab.
READ TABLE in_tab WITH KEY name = 'VAR2'
INTO l_wa_in_tab.
IF sy-subrc EQ 0.
l_var2 = l_wa_in_tab-value.
ENDIF.
* Modificar valores SAPSCRIPT
l_var3 = l_var1 + l_var2.
l_wa_out_tab-value = l_var3.
l_wa_out_tab-name = 'VAR3'.
MODIFY out_tab FROM l_wa_out_tab
TRANSPORTING value
WHERE name EQ 'VAR3'.
ENDFORM. "recuperar_datos_pagos
viernes, septiembre 04, 2009
SAPSCRIPT - Varios
Varias temas sobre SAPSCRIPT:
- Linea muy larga, se ponde '=' para que mantenga mismo párrafo.
- Mostrar texto sólo cuando una variable esta informada, &'TEXTO 'VARIABLE&.
- Eliminar espacios cantidades, &VARIABLE(C)&.
- Para suprimir el reconocimiento de un carácter especial, use <(>...<)>.
- Variables de paginación:
DEFINE &PAGINA_ACTUAL& = &PAGE(2)&
DEFINE &TOTAL_PAGINA& = &SAPSCRIPT-FORMPAGES(2)&
IF &PAGINA_ACTUAL(C)& EQ &TOTAL_PAGINA(C)&
- Linea muy larga, se ponde '=' para que mantenga mismo párrafo.
- Mostrar texto sólo cuando una variable esta informada, &'TEXTO 'VARIABLE&.
- Eliminar espacios cantidades, &VARIABLE(C)&.
- Para suprimir el reconocimiento de un carácter especial, use <(>...<)>.
- Variables de paginación:
DEFINE &PAGINA_ACTUAL& = &PAGE(2)&
DEFINE &TOTAL_PAGINA& = &SAPSCRIPT-FORMPAGES(2)&
IF &PAGINA_ACTUAL(C)& EQ &TOTAL_PAGINA(C)&
miércoles, julio 22, 2009
SAPSCRIPT - Descargar/Subir formulario SAPSCRIPT
Hay dos programas standard:
- RSTXSCRP. Testeado. Marcar opción "Formato binario de ficher".
- RSTXR3TR.
- RSTXSCRP. Testeado. Marcar opción "Formato binario de ficher".
- RSTXR3TR.
viernes, julio 17, 2009
MF - Módulos de función POPUP
* POPUP_GET_VALUES, se informa tabla y campo que hace referencia (crear matchcode).
* POPUP_GET_VALUES_DB_CHECKED, se informa tabla y campo que hace referenci (crea matchcode) y hace la verificación que exista valor.
* POPUP_TO_CONFIRM, realizar pregunta si/no. Para mostrar texto muy largo se puede un texto dialog mediante la transacción SE61 (tipo DT). Después en la llamada del módulo de función se informa campo DIAGNOSE_OBJECT = 'Z_NOMBRE_TEXTO_DIALOGO'.
Para más información:
http://help.sap.com/saphelp_nw04/helpdata/en/2a/f9fff0493111d182b70000e829fbfe/content.htm
* POPUP_GET_VALUES_DB_CHECKED, se informa tabla y campo que hace referenci (crea matchcode) y hace la verificación que exista valor.
* POPUP_TO_CONFIRM, realizar pregunta si/no. Para mostrar texto muy largo se puede un texto dialog mediante la transacción SE61 (tipo DT). Después en la llamada del módulo de función se informa campo DIAGNOSE_OBJECT = 'Z_NOMBRE_TEXTO_DIALOGO'.
Para más información:
http://help.sap.com/saphelp_nw04/helpdata/en/2a/f9fff0493111d182b70000e829fbfe/content.htm
viernes, abril 03, 2009
Utilizar memoria de SAP
Hay dos operaciones:
- Grabar en memoria, EXPORT l_variable TO MEMORY ID 'ID_MEMORIA'.
- Cargar de memoria, IMPORT l_variable FROM MEMORY ID 'ID_MEMORIA'.
Las dos variables se deben llamar igual y tener la misma estructura.
Variables standard:
- CECO => KOS.
IMPORTANTE: para poder trabajar con variables en memoria es necesario crear en el perfil del usuario (con valor '').
- Grabar en memoria, EXPORT l_variable TO MEMORY ID 'ID_MEMORIA'.
- Cargar de memoria, IMPORT l_variable FROM MEMORY ID 'ID_MEMORIA'.
Las dos variables se deben llamar igual y tener la misma estructura.
Variables standard:
- CECO => KOS.
IMPORTANTE: para poder trabajar con variables en memoria es necesario crear en el perfil del usuario (con valor '').
jueves, febrero 26, 2009
BAPI - Tratar mensajes error
- Utilizar la sentencia MESSAGE y añadir INTO p_variable.
- MF BAPI_MESSAGE_GETDETAIL.
- MF RPY_MESSAGE_COMPOSE.
- MF C14ALD_BAPIRET2_SHOW.
- MF C14Z_MESSAGES_SHOW_AS_POPUP.
- MF BAPI_MESSAGE_GETDETAIL.
- MF RPY_MESSAGE_COMPOSE.
- MF C14ALD_BAPIRET2_SHOW.
- MF C14Z_MESSAGES_SHOW_AS_POPUP.
MESSAGE ID wa-id TYPE wa-type NUMBER wa-number
INTO wa-message
WITH wa-message_v1 wa-message_v2 wa-message_v3 wa-message_v4.
miércoles, enero 21, 2009
DYNPRO - ocultar botones
Al trabajar con dynpro si queremos ocultar botones:
LOOP AT SCREEN
IF screen-name EQ 'Nombre_campo_ocultar'.
screen-output = 1.
screen-input = 0.
screen-invisible = 1.
modify screen.
ENDIF.
ENDLOOP.
Esta parte de código de pone en el PBO si el programa es de tipo PROGRAM o en el evento AT SELECTION-SCREEN OUTPUT si el programa es de tipo REPORT.
LOOP AT SCREEN
IF screen-name EQ 'Nombre_campo_ocultar'.
screen-output = 1.
screen-input = 0.
screen-invisible = 1.
modify screen.
ENDIF.
ENDLOOP.
Esta parte de código de pone en el PBO si el programa es de tipo PROGRAM o en el evento AT SELECTION-SCREEN OUTPUT si el programa es de tipo REPORT.
jueves, noviembre 13, 2008
ALV - modificar valores ALV
1) Informar campos en el catálogo:
l_fieldcat-edit = 'X'.
l_fieldcat-input = 'X'.
2) Declarar variable que se utilizará llamada ALV:
DATA: g_it_grid_setting TYPE lvc_s_glay.
3) Informar variable que se utilizará llamada ALV:
g_it_grid_setting-edt_cll_cb = 'X'.
4) En la llamada 'REUSE_ALV_GRID_DISPLAY añadir parametro:
i_grid_settings = g_it_grid_setting
COMENTARIO:
Útil si el que registro que modificamos en el ALV es el que justamente después seleccionamos con el checbox para tratar.
l_fieldcat-edit = 'X'.
l_fieldcat-input = 'X'.
2) Declarar variable que se utilizará llamada ALV:
DATA: g_it_grid_setting TYPE lvc_s_glay.
3) Informar variable que se utilizará llamada ALV:
g_it_grid_setting-edt_cll_cb = 'X'.
4) En la llamada 'REUSE_ALV_GRID_DISPLAY añadir parametro:
i_grid_settings = g_it_grid_setting
COMENTARIO:
Útil si el que registro que modificamos en el ALV es el que justamente después seleccionamos con el checbox para tratar.
martes, julio 22, 2008
ALV - Actualizar datos
En una ALV se pueden añadir botones a la barra de STATUS que realicen operaciones sobre los registros. Nos puede interesar actualizar los valores que se muestran en el ALV, si se modifica algún valor de la tabla interna que tiene asociada. Tenemos que capturar la ejecución del nuevo botón en la rutina USER_COMMAND, consultar de nuevo los datos de la base de datos (recomendable tener cread una rutina) y volver a mostrar la información actualizada por pantalla. Esta última operación se realiza forzando la ejecución del evento de refresco que se realiza con la siguiente asignación: i_ucomm = '&REFRESH'.
miércoles, julio 16, 2008
MF - ejecutar dos módulos de función
Es muy normal que queramos ejecutar dos módulos de función (uno detrás del otro) mediante la transancción SE37 sin tener que crear un report provisional. El típico ejemplo es cuando se utiliza una BAPI, que ya es imprecindible realizar un commit work para que tenga efecto la ejecución. Para realizar esta operación se utiliza la tx.SE37 y por el menú 'MÓDULO DE FUNCIÓN->VERIFICAR-> SECUENCIA TEST' en la crea se crea una secuencia con los Módulos de funcion que queremos ejecutar. Se irá ejecutando función a función, cuando se termina la ejecución de un módulo de función al dar al botón de atrás se ejecutará el siguiente módulo de función que habíamos informado en la secuencia. El módulo de función que realiza el COMMIT WORK es '
lunes, julio 07, 2008
ALV - Mostrar celdas en colores
Tenemos 2 opciones:
1) Mostrar un fila de un color, añadir un campo en la tabla interna de tipo CHAR04 que se le pasa al MF i guardar el nombre de este campo en la variable del LAYOUT g_layout-info_fieldname = 'COLOR'.
ROJO -> C600
2) Mostrar un columna de un color, cuando se informa los valores para el catálogo, además informar el campo g_catalog-emphasize= C123, 1=> color, 2 y 3 => intensidad.
Para más info sobre los colores:
http://www.abap.es/Centro_ALV_colores.htm
1) Mostrar un fila de un color, añadir un campo en la tabla interna de tipo CHAR04 que se le pasa al MF i guardar el nombre de este campo en la variable del LAYOUT g_layout-info_fieldname = 'COLOR'.
ROJO -> C600
2) Mostrar un columna de un color, cuando se informa los valores para el catálogo, además informar el campo g_catalog-emphasize= C123, 1=> color, 2 y 3 => intensidad.
Para más info sobre los colores:
http://www.abap.es/Centro_ALV_colores.htm
jueves, marzo 06, 2008
DICC - Descripción Valores dominio
Por medio del diccionario podemos crear un dominio y asignarle unos valores posibles, como por ejemplo:
1 moto
2 coche
3 avión.
En SAP se guardan los valores 1,2,3. ¿Como se haría para mostrar las descripciones (moto coche, avión)? La primera opcion sería hacer un case y manualmente obtener las descripciones (mantenimiento stático, cada vez se añada un valor al dominio se debe modificar CASE).
La seguna opción, es recuperar los valores accediendo a las tablas DD07L t DD07T (acceder por idioma).
viernes, febrero 15, 2008
Trabajar con timestamp
Hay varias maneras de guardar fechas y horas en variables. Por una lado podríamos tener dos variables de tipo sy-datum y sy-uzeit, a simple vista parece que se la forma normal, pero nos podemos encontrar tablas del standard de SAP que utilicen un tipo de datos TIMESTAMP, en el que en única variables se guarda conjuntamente la hora y el día.
********************CONVERSION TIMESTAMP A TIME******************
CONVERT TIME STAMP lv_created_at TIME ZONE lv_tzone INTO DATE e_fecha TIME e_hora.
*******************CONVERSION TIME A TIMESTAMP*******************
CONVERT DATE par_date TIME par_time INTO TIME STAMP par_timestamp TIME ZONE par_time_zone.
*******************INCREMENTAR TIEMPO*****************************
DATA : l_tstamp TYPE timestamp,
DATA : l_tstamp TYPE timestamp,
l_tstamp_out TYPE timestamp.
GET TIME STAMP FIELD l_tstamp.WRITE: / l_tstamp time zone sy-zonlo.TRY. CALL METHOD cl_abap_tstmp=>add
EXPORTING tstmp = l_tstamp
secs = 3600 "<<<===--- 1 hour = 3600 seconds
RECEIVING r_tstmp = l_tstamp_out.
ENDTRY.
WRITE: / l_tstamp_out TIME ZONE sy-zonlo.
lunes, enero 21, 2008
SMARTFORM - Imprimir formulario Smartform sin preview
Tenemos la necesidad de imprimir un formulario de Smartform sin preview, es decir, sin la necesidad que el usuario tenga que seleccionar la impresora. Para ello debemos de informar correctamente los campos del módulo de función que llama al smartform.
Hay que recordar que cada smartform genera un módulo de función, y que su nombre sólo es conocido en tiempo de ejecución (llamando a otro módulo de función pasándole el nombre del formulario a SSF_FUNCTION_MODULE_NAME y retornando el nombre del MF). Después se realiza la llamada CALL FUNCTION variable_nombre_mf.
Se debe informar unos campos en concreto para realizar la operación requerida (impresión directa). Los campos son :
ls_output_options-tdcopies = '001'.
ls_output_options-tddest = 'ZWIN'.
ls_output_options-tdprinter = 'SAPWIN'.
ls_output_options-bcs_langu = sy-langu.
ls_output_options-tdimmed ='X'.
ls_control_parameters-preview = ''.
ls_control_parameters-no_dialog = 'X'.
Además debemos indicar al MF que utilice eston campos con los nuevos valores para ello también es necesario poner:
user_settings = ''
Para descubrir cuales son los valores correctos de nuestra impresora, podemos activar el preview (ls_control_parameters-preview = 'X') para que se seleccionen los datos correctos y visualizar el campo de salida
es_job_output_info que retorna los valores que el ususario ha seleccionado. Una vez conocido los datos hay que volver a deshabilitar preview.
Hay que recordar que cada smartform genera un módulo de función, y que su nombre sólo es conocido en tiempo de ejecución (llamando a otro módulo de función pasándole el nombre del formulario a SSF_FUNCTION_MODULE_NAME y retornando el nombre del MF). Después se realiza la llamada CALL FUNCTION variable_nombre_mf.
Se debe informar unos campos en concreto para realizar la operación requerida (impresión directa). Los campos son :
ls_output_options-tdcopies = '001'.
ls_output_options-tddest = 'ZWIN'.
ls_output_options-tdprinter = 'SAPWIN'.
ls_output_options-bcs_langu = sy-langu.
ls_output_options-tdimmed ='X'.
ls_control_parameters-preview = ''.
ls_control_parameters-no_dialog = 'X'.
Además debemos indicar al MF que utilice eston campos con los nuevos valores para ello también es necesario poner:
user_settings = ''
Para descubrir cuales son los valores correctos de nuestra impresora, podemos activar el preview (ls_control_parameters-preview = 'X') para que se seleccionen los datos correctos y visualizar el campo de salida
es_job_output_info que retorna los valores que el ususario ha seleccionado. Una vez conocido los datos hay que volver a deshabilitar preview.
Configuración de impresora local en SAP
Lo que se pretende es que a la hora de imprimir documentos en SAP, el sistema detecte nuestra impresora local. De esta manera no es necesario configurar todas las impresoras dentro de SAP sino que se utilizará la que tenga el usuario en windows por defecto. Para ello se llama a la transacción SPAD y se realiza la siguiente configuración:
1) Crear una impresora nueva.
2) Informar los campos de la pestaña 'Atributos Dispositivo'
3) Informar los campos de la pestaña 'Acoplamiento SPOOL host'.
miércoles, octubre 24, 2007
DUMP Error DBIF_RSQL_INVALID_RSQL RSQL error 13 when accessing table
El otro día me apereció en siguiente DUMP:
"Error DBIF_RSQL_INVALID_RSQL RSQL error 13 when accessing table".
Esto resulta de realizar una consulta SELECT a la Base de datos con una variable de tipo SELECT-OPTIONS muy grande. Como solución se propener dividir esta variable en partes. Para ello se crearan variables auxilixares de tipo RANGES, que son del mismo tipo que los SELECT-OPTION. De hará un bucle y se utilizará el comando APPENDING en el SELECT para ir guardando los valores.
"Error DBIF_RSQL_INVALID_RSQL RSQL error 13 when accessing table".
Esto resulta de realizar una consulta SELECT a la Base de datos con una variable de tipo SELECT-OPTIONS muy grande. Como solución se propener dividir esta variable en partes. Para ello se crearan variables auxilixares de tipo RANGES, que son del mismo tipo que los SELECT-OPTION. De hará un bucle y se utilizará el comando APPENDING en el SELECT para ir guardando los valores.
miércoles, octubre 17, 2007
Ficheros Mostrar ventana para seleccionar fichero local
Por lo menos tenemos dos módulos de funcion que realizan la operación:
1) Ventana escogiendo local/servidor: F4_DXFILENAME_TOPRECURSION.
2) Fichero Local: método cl_gui_frontend_services=>file_open_dialog
3) Fichero Servidor: MF 'F4_DXFILENAME_TOPRECURSION' con i_location_flag = A
4) MF ISH_N2_FILENAME_GET
Los tres MF los debemos llamar en el evento:
AT SELECTION-SCREEN ON VALUE-REQUEST FOR p_path.
Además p_path ha de ser del tipo rlgrap-filename.
Ojito porque si la ruta es muy larga no se actualiza correctamente el parámetro de la pantalla de selección.
1) Ventana escogiendo local/servidor: F4_DXFILENAME_TOPRECURSION.
2) Fichero Local: método cl_gui_frontend_services=>file_open_dialog
3) Fichero Servidor: MF 'F4_DXFILENAME_TOPRECURSION' con i_location_flag = A
4) MF ISH_N2_FILENAME_GET
Los tres MF los debemos llamar en el evento:
AT SELECTION-SCREEN ON VALUE-REQUEST FOR p_path.
Además p_path ha de ser del tipo rlgrap-filename.
Ojito porque si la ruta es muy larga no se actualiza correctamente el parámetro de la pantalla de selección.
lunes, octubre 08, 2007
Debugger programa en proceso de fondo
Para debuggear un programa lanzado en fondo realizar las siguientes operaciones.
1)Ejecutar Tx. SM50
2)Seleccionar work process.
3)Menú 'Programa/Modo'->'Programa'->'Debugging'.
1)Ejecutar Tx. SM50
2)Seleccionar work process.
3)Menú 'Programa/Modo'->'Programa'->'Debugging'.
ALV - Trabajar con variantes de ALV
Mostrar un campo en la pantalla de selección para seleccionar una variante previamente guardada.
1) Crear variables:
DATA: ls_variant TYPE disvariant.
PARAMETERS p_dispo LIKE disvariant-variant.
2) Mostrar matchcode variantes
AT SELECTION-SCREEN ON VALUE-REQUEST FOR p_dispo.
MOVE: p_dispo TO ls_variant-variant,
sy-repid TO ls_variant-report.
CALL FUNCTION 'REUSE_ALV_VARIANT_F4'
EXPORTING
is_variant = ls_variant
IMPORTING
es_variant = ls_variant
EXCEPTIONS
not_found = 1
program_error = 2
OTHERS = 3.
MOVE ls_variant-variant TO p_dispo.
3)Indicar variante al mostrar ALV
CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY'
EXPORTING
is_variant = ls_variant
1) Crear variables:
DATA: ls_variant TYPE disvariant.
PARAMETERS p_dispo LIKE disvariant-variant.
2) Mostrar matchcode variantes
AT SELECTION-SCREEN ON VALUE-REQUEST FOR p_dispo.
MOVE: p_dispo TO ls_variant-variant,
sy-repid TO ls_variant-report.
CALL FUNCTION 'REUSE_ALV_VARIANT_F4'
EXPORTING
is_variant = ls_variant
IMPORTING
es_variant = ls_variant
EXCEPTIONS
not_found = 1
program_error = 2
OTHERS = 3.
MOVE ls_variant-variant TO p_dispo.
3)Indicar variante al mostrar ALV
CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY'
EXPORTING
is_variant = ls_variant
jueves, septiembre 20, 2007
ERROR - Capturar excepciones
Para evitar que se produzan DUMP's (casos inevitables) se utiliza el comando TRY/ENDTRY.
Ejemplo sencillo: 'Hacer una consulta a una tabla de la BD y se produzca overflow"
TRY.
SELECT .......
CATCH cx_sy_open_sql_db.
MESSAGE i098(z40pp) WITH 'Select con demasiados registros'.
EXIT.
ENDTRY.
Ejemplo sencillo: 'Hacer una consulta a una tabla de la BD y se produzca overflow"
TRY.
SELECT .......
CATCH cx_sy_open_sql_db.
MESSAGE i098(z40pp) WITH 'Select con demasiados registros'.
EXIT.
ENDTRY.
miércoles, septiembre 19, 2007
Crear un nuevo modo
Hay la posibilidad de que cuando se este ejecutando un programa se abra un nuevo modo independiente al modo inicial (cada uno se ejecuta por separado). Tenemos que realizar 3 operaciones.
- Crear un nuevo módulo de función que contenga la lógica del programa que queremos que se ejecute en el nuevo modo.
- Modificar los atributos del módulo de función para que se pueda llamar en un nuevo modo. En el recuadro 'Forma Ejecución' seleccionar radiobutton 'Módulo de acceso remoto'.
- Realizar la llamada al módulo de función añadiendo sentencia IN NEW TASK.
CALL FUNCTION 'nombre_modulo_funcion' STARTING NEW TASK 'nombre_tarea'.
El nombre de la tarea tiene que se como máximo de 3 letras.
- Crear un nuevo módulo de función que contenga la lógica del programa que queremos que se ejecute en el nuevo modo.
- Modificar los atributos del módulo de función para que se pueda llamar en un nuevo modo. En el recuadro 'Forma Ejecución' seleccionar radiobutton 'Módulo de acceso remoto'.
- Realizar la llamada al módulo de función añadiendo sentencia IN NEW TASK.
CALL FUNCTION 'nombre_modulo_funcion' STARTING NEW TASK 'nombre_tarea'.
El nombre de la tarea tiene que se como máximo de 3 letras.
Suscribirse a:
Entradas (Atom)
