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.

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.

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.

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

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.

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

martes, enero 12, 2010

SAPSCRIPT - Leer variables del SAPSCRIPT

CALL FUNCTION 'GET_TEXTSYMBOL'
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

lunes, noviembre 30, 2009

PDF - Report conversión orden spool y PDF

Existe el report standard para pasar órdenes de spool a PDF:

- 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.

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\

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.

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

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.

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

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)&

miércoles, julio 22, 2009

SAPSCRIPT - Descargar/Subir formulario SAPSCRIPT

Hay dos programas standard:

- 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

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 '').

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.

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.

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.

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

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,

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.

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.

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.

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'.

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

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.

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.

lunes, septiembre 03, 2007

DYNPRO - pantallas

Para volver a la pantalla inicial:
- LEAVE TO SCREEN 0.
- SET SCREEN 0. "Puntero
LEAVE SCREEN.

Para terminar programa :
- LEAVE PROGRAM.

CALL SCREEN -> va guardando ciclo. Se llega a un tope.

miércoles, julio 25, 2007

DYNPRO - Textos

La primera idea que nos viene a la cabeza cuando queremos guardar texto es crear un campo de char255 en una tabla Z. Pero no se mantendría el formato (negrita, cursiva, salta de línea). Para resolver este problema se pueden utilizar los textos de sap.

Los diferentes id de textos se guardan en la tabla TTXID.

1) Configurar Texto nuevo Tx. SE75.

Si vamos a la sm30 hay un botón donde para buscar pasos en el Customizing que trabajen con esta tabla. Debemos buscar una descripción parecida a 'Definir ID de texto'. Aquí crearemos nuestros objetos y clases nuevas. Previamente hay que buscar un tipo de objeto al que queremos añadir los nuevos ID's.

2) Inicializar variables
IF NOT cc_org IS INITIAL.
CALL METHOD cc_org->free.
ENDIF.

IF NOT txtedit_nota IS INITIAL.
CALL METHOD txtedit_nota->free.
ENDIF.

3) Recuperar Texto.

Programa Control =>
DATA: cc_nota TYPE REF TO cl_gui_custom_container.
DATA: txtedit_nota TYPE REF TO cl_gui_textedit.
************************************************************************************
PBO
************************************************************************************
* Crear CUSTOM-CONTROL
IF cc_nota IS INITIAL.

CREATE OBJECT cc_nota
EXPORTING
container_name = 'CC_TEXTO' "Nombre del custom control del Dynpro
EXCEPTIONS
cntl_error = 1
cntl_system_error = 2
create_error = 3
lifetime_error = 4
lifetime_dynpro_dynpro_link = 5
others = 6.

ENDIF.

* Asignarle edición de texto
IF txtedit_nota IS INITIAL.

CREATE OBJECT txtedit_nota
EXPORTING
wordwrap_mode = 2
wordwrap_position = 72
parent = cc_nota
EXCEPTIONS
error_cntl_create = 1
error_cntl_init = 2
error_cntl_link = 3
error_dp_create = 4
gui_type_not_supported = 5
others = 6.

* Quitar botones
CALL METHOD txtedit_nota->set_toolbar_mode.
CALL METHOD txtedit_nota->set_statusbar_mode.
PERFORM llenar_texto.
ENDIF.

* Visualizar/Modificar
IF action EQ 'DISP'.
CALL METHOD txtedit_nota->set_readonly_mode
EXPORTING
readonly_mode = '1'.
ELSE.
CALL METHOD txtedit_nota->set_readonly_mode
EXPORTING
readonly_mode = '0'.
ENDIF.

****************************************************************************
Rutina=> PERFORM llenar_texto.
****************************************************************************
DATA: w_header TYPE thead,
t_tline TYPE TABLE OF tline,
w_tline TYPE tline,
t_texto TYPE TABLE OF char255.

w_header-tdobject = 'FORMMAT'.
w_header-tdname = zwf_mat_alta_dg-formnumber.
w_header-tdspras = sy-langu.

CALL FUNCTION 'READ_TEXT'
EXPORTING
id = w_header-tdid "Tipo de texto
language = w_header-tdspras "Idioma
name = w_header-tdname "Id del texto
object = w_header-tdobject "Nombre del objeto
TABLES
lines = t_tline
EXCEPTIONS
id = 1
language = 2
name = 3
not_found = 4
object = 5
reference_check = 6
wrong_access_to_archive = 7
OTHERS = 8.

*Copiar texto con formato a sólo texto
LOOP AT t_tline INTO w_tline.
APPEND w_tline-tdline TO t_texto.
ENDLOOP.

* Guardar texto en objeto
CALL METHOD txtedit_nota->set_text_as_r3table
EXPORTING
table = t_texto
EXCEPTIONS
error_dp = 1
error_dp_create = 2
OTHERS = 3.

3) Guardar texto.
DATA: w_header TYPE thead,
t_tline TYPE TABLE OF tline,
w_tline TYPE tline,
t_texto TYPE TABLE OF char255,
w_texto TYPE char255.

CLEAR w_header.
w_header-tdobject = 'FORMMAT'.
w_header-tdname = zwf_mat_alta_dg-formnumber.
w_header-tdspras = sy-langu.
w_header-tdid = 'DG'. " texto datos generales

* Eliminar texto anterior
CALL FUNCTION 'DELETE_TEXT'
EXPORTING
id = w_header-tdid
language = w_header-tdspras
name = w_header-tdname
object = w_header-tdobject
EXCEPTIONS
not_found = 1
OTHERS = 2.

* Recuperar texto de la pantalla
CALL METHOD txtedit_nota->get_text_as_r3table
IMPORTING
table = t_texto.

LOOP AT t_texto INTO w_texto.
w_tline-tdformat = '*'.
w_tline-tdline = w_texto.
APPEND w_tline TO t_tline .
ENDLOOP.

* Guardar texto nuevo
CALL FUNCTION 'SAVE_TEXT'
EXPORTING
header = w_header
TABLES
lines = t_tline
EXCEPTIONS
id = 1
language = 2
name = 3
object = 4
OTHERS = 5.

CALL FUNCTION 'COMMIT_TEXT'.

* Para deshabilitar el scroll horitzontal al realizar el CREATE OBJECT informar         wordwrap_mode              = cl_gui_textedit=>wordwrap_off

miércoles, julio 18, 2007

TC - TABLE CONTROL

Este es un de los temas que menos me apasiona pero me gustaría hacer unos comentarios. Como ejemplo en hay los programas DEMO_DYNPRO_TABCONT_LOOP y demo_dynpro_tabcont_loop_at.

1) En un DYNPRO podemos tener varios TABLE CONTROL (TC). Comentar que a la hora de crear el segundo TC no funciona correctamente el asistente por la tanto se deberá utilizar la técnica de copy&paste. También tenemos que ir con ojo a la hora de tratar 2 TC en el PBO,
primer tratar el TC que este más abajo, y así hasta el primero.

2) Eliminar barra de SCROLL HORIZONTAL. Rellenar el atributo Col.fijas del TC en el editor de SCREEN PAINTER.

3) Eliminar barra de SCROLL VERTICAL. Ajustar tamaño TC en el editor de SCREEN PAINTER para mostrar el núm. de registros y modificar atributo del TC lines= 0.

4) Actualización de los registros del TC. El modify que automáticamente se realiza no funciona correctamente, se debe modificar la condición. Probar de modificar registro de la tabla y en caso de que no exista crearlo.

5) SY-TCODE del SCROLL. Al utilizar el SCROLL se pasa por el PAI. En la rutina se chequea el valor del ok-code (variable que le hemos asignado al DYNPRO para que nos retorna la función ejecutada). Es este caso el valor ok-code no se actualiza y tiene el valor de la última operación ejecutada, por lo tanto se debe de limpiar la variable ok-code. El scroll es realizado por el estandard.

6) Mediante las instrucciones GET CURSOR y SET CURSOR podemos movernos por el TABLE CONTROL. Esto es muy útil cuando el usuario esta utilizando el SCROLL y queremos que visualice el mismo trozo de pantalla.
-> GET CURSOR field gv_field LINE gv_line. Obtenemos la fila y columna donde tenemos el cursor. Se debe ejecutar en el PAI. Es recomendable que borremos el valor de la dos variables antes de ejecutar la sentancia
-> SET CURSOR FIELD gv_field line gv_line. Se ejecuta en el PBO. Se tendría que chequear que fueran correctos los valores de la variables.

5) A la hora de modificar el tamaño del TC hay que vigilar que el atributo resizing no esté activado. Si está activado es el propio SAP quien decide cuantos registros mostrar.

6) Para añadir un nueva linea en blanco se hace un DESCRIBE TABLE de la tabla y campo TC-lines = sy-tfill + 1. Después habría que desplazarse hasta la nueva linea.

7) Para habilitar/deshabilitar columnas realizar MODULE en el PBO después del LOOP AT ... WITH CONTROL.

8) Para habilitar/deshabilitar files, añadir código dentro del LOOP AT ... WITH CONTROL.
Por ejemplo:
LOOP AT SCREEN.
IF screen-name(3) EQ 'LIN' AND
screen-name NE 'LIN-POSTC' AND
screen-name NE 'LIN-MAKTX' AND
screen-name NE 'LIN-AGRUP' AND
screen-name NE 'LIN-CHECK'.
screen-input = 1.
ENDIF.
ENDLOOP.

9) Para indicar la selección de un registro, informar flag c.marc.col. y poner el campo que indique la marcar G_WA-CHECK.