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.