0% encontró este documento útil (0 votos)
105 vistas10 páginas

Mejora del Rendimiento en ABAP

El documento proporciona consejos para mejorar el rendimiento de programas ABAP que involucran tablas internas y acceso a la base de datos. Recomienda usar búsqueda binaria en lugar de lineal para tablas internas ordenadas, copiar tablas completas en lugar de bucles, y usar cláusulas como FOR ALL ENTRIES para optimizar consultas a la base de datos. También sugiere indicar campos específicos en consultas SELECT en lugar de seleccionar todos los campos.

Cargado por

lguevarat
Derechos de autor
© Attribution Non-Commercial (BY-NC)
Nos tomamos en serio los derechos de los contenidos. Si sospechas que se trata de tu contenido, reclámalo aquí.
Formatos disponibles
Descarga como DOC, PDF, TXT o lee en línea desde Scribd
0% encontró este documento útil (0 votos)
105 vistas10 páginas

Mejora del Rendimiento en ABAP

El documento proporciona consejos para mejorar el rendimiento de programas ABAP que involucran tablas internas y acceso a la base de datos. Recomienda usar búsqueda binaria en lugar de lineal para tablas internas ordenadas, copiar tablas completas en lugar de bucles, y usar cláusulas como FOR ALL ENTRIES para optimizar consultas a la base de datos. También sugiere indicar campos específicos en consultas SELECT en lugar de seleccionar todos los campos.

Cargado por

lguevarat
Derechos de autor
© Attribution Non-Commercial (BY-NC)
Nos tomamos en serio los derechos de los contenidos. Si sospechas que se trata de tu contenido, reclámalo aquí.
Formatos disponibles
Descarga como DOC, PDF, TXT o lee en línea desde Scribd

ABAP Performance

Operación en una tabla interna


Búsqueda Lineal Vs Binary

El rendimiento de tu programa se podría ver afectado cuando manejas tablas internas con más de 10 mil registros.
Con los siguientes tips podrás proveer de mejor performance a tu reporte.

READ TABLE table_interna WITH criterio.

Por defecto el comando READ TABLE en una tabla interna leerá la tabla de manera secuencial. Sin embargo al algoritmo BINARY
SEARCH proporcionara una búsqueda más rápida de un valor en la tabla.
Para ello la tabla debe estar ordenada por los campos que van a ser leídos.

SORT table_interna BY campo1.


READ TABLE table_interna WITH KEY campo1 = criterio.

También pueden aplicar este criterio para mejorar los loops anidados.
Vean el siguiente ejemplo

SORT tabla_interna1 BY campo1.


SORT tabla_interna2 BY campo1.

LOOP AT tabla_interna1.
READ TABLE tabla_interna2 with key campo1 = tabla_interna-campo1 BINARY SEARCH.
IF sy-subrc = 0.
LOOP AT tabla_interna2 FROM sy-tabix.
IF TABLA_INTERNA2-CAMPO1 = TABLA_INTERNA-CAMPO2.
"aca desarrollas el código requerido
ELSE.
EXIT. "Los registro son mayores
ENDIF.
ENDLOOP.
ENDIF.
ENDLOOP.

Copiando Tablas Internas

Si las dos tablas son iguales, la opción NO recomendada es la siguiente:

LOOP AT tabla_orig.
MOVE tabla_orig TO tabla_dest.
APPEND tabla_dest.
ENDLOOP.

Es mejor la siguiente opcion:

tabla_dest[ ] = tabla_orig[ ].

De la misma manera, si se requiere es agregar lines de una tabla a otra, la mejor opcion es la siguiente:

APPEND LINES OF tabla_orig TO tabla_dest.

Borrando un conjunto de Lineas

Antes de pensar en hacer un loop a la tabla como el siguiente

LOOP AT tabla_int WHERE campo1 = valor.


DELETE TABLA_INT.
ENDLOOP.

Es mejor realizar los siguiente.

DELETE tabla_int WHERE campo = valor.

Modificando un Conjunto de Lineas

En lugar de utilizar este código:

LOOP AT tabla_int .
IF tabla_int -flag IS INITIAL.
tabla_int-flag = 'X'.
ENDIF.
MODIFY TAB.
ENDLOOP.

Es mejor lo siguiente:

tabla_int-flag = 'X',
MODIFY tabla_int TRANSPORTING flag WHERE flag IS INITIAL.
Optimización en el acceso a la Base de Datos
Unos simples consejos son los siguientes:

Si se va a acceder a varias tablas relaciones, es recomendable crear una vista con las tablas relacionadas y accesar a ella.

Con la opción FOR ALL ENTRIES se consigue que las entradas que se consiguieron en el primer select (tabla driver) se consigan en el
segundo select por lo que se ejecutaría el segundo select solo una vez.

SELECT matnr FROM mara INTO TABLE imara WHERE cond.


SELECT * FROM mard FOR ALL ENTRIES IN imara WHERE mantr = imara-matnr.

Con la Instrucción FORL ALL ENTRIES hay que tener sumo cuidado en la manera en que se va a usar, primero se debe asegurar que la
tabla driver con la se va a comparar no se encuentre vacia, pues si es así, traería toda la data que esté en la base de datos,
perjudicando el performance del programa, y segundo, si la tabla interna tiene muchos registros, el select a la Base de Datos sería
mucha mas lento pues si utilizaría mucha memoria.

Para hacer mas eficiente el FOR ALL ENTRIES es recomendable, borrar los valores duplicado de la tabla driver, ordenarla y si es
posible convertirla en una tabla de rangos usando la sentencia BETWEEN.

FOR ALL ENTRIES IN imara WHERE matnr >= imara-matnr


AND matnr <= imara-matnr.

Es recomendable y mas rápido indicarle al SELECT que campos va leer, si no se necesitan todos ellos.

SELECT campo1 campo2 campo3 FROM TABLE tabla INTO TABLE itabla.

Donde itabla debe estar declarada con los campos que se quieren seleccionar de la tabla

Operación en una tabla interna


Búsqueda Lineal Vs Binary

El rendimiento de tu programa se podría ver afectado cuando manejas tablas internas con más de 10 mil registros.
Con los siguientes tips podrás proveer de mejor performance a tu reporte.

READ TABLE table_interna WITH criterio.

Por defecto el comando READ TABLE en una tabla interna leerá la tabla de manera secuencial. Sin embargo al algoritmo BINARY
SEARCH proporcionara una búsqueda más rápida de un valor en la tabla.
Para ello la tabla debe estar ordenada por los campos que van a ser leídos.

SORT table_interna BY campo1.


READ TABLE table_interna WITH KEY campo1 = criterio.

También pueden aplicar este criterio para mejorar los loops anidados.
Vean el siguiente ejemplo

SORT tabla_interna1 BY campo1.


SORT tabla_interna2 BY campo1.

LOOP AT tabla_interna1.
READ TABLE tabla_interna2 with key campo1 = tabla_interna-campo1 BINARY SEARCH.
IF sy-subrc = 0.
LOOP AT tabla_interna2 FROM sy-tabix.
IF TABLA_INTERNA2-CAMPO1 = TABLA_INTERNA-CAMPO2.
"aca desarrollas el código requerido
ELSE.
EXIT. "Los registro son mayores
ENDIF.
ENDLOOP.
ENDIF.
ENDLOOP.

Copiando Tablas Internas

Si las dos tablas son iguales, la opción NO recomendada es la siguiente:

LOOP AT tabla_orig.
MOVE tabla_orig TO tabla_dest.
APPEND tabla_dest.
ENDLOOP.

Es mejor la siguiente opcion:

tabla_dest[ ] = tabla_orig[ ].

De la misma manera, si se requiere es agregar lines de una tabla a otra, la mejor opcion es la siguiente:

APPEND LINES OF tabla_orig TO tabla_dest.

Borrando un conjunto de Lineas

Antes de pensar en hacer un loop a la tabla como el siguiente


LOOP AT tabla_int WHERE campo1 = valor.
DELETE TABLA_INT.
ENDLOOP.

Es mejor realizar los siguiente.

DELETE tabla_int WHERE campo = valor.

Modificando un Conjunto de Lineas

En lugar de utilizar este código:

LOOP AT tabla_int .
IF tabla_int -flag IS INITIAL.
tabla_int-flag = 'X'.
ENDIF.
MODIFY TAB.
ENDLOOP.

Es mejor lo siguiente:

tabla_int-flag = 'X',
MODIFY tabla_int TRANSPORTING flag WHERE flag IS INITIAL.

Optimización en el acceso a la Base de Datos


Unos simples consejos son los siguientes:

Si se va a acceder a varias tablas relaciones, es recomendable crear una vista con las tablas relacionadas y accesar a ella.

Con la opción FOR ALL ENTRIES se consigue que las entradas que se consiguieron en el primer select (tabla driver) se consigan en el
segundo select por lo que se ejecutaría el segundo select solo una vez.

SELECT matnr FROM mara INTO TABLE imara WHERE cond.


SELECT * FROM mard FOR ALL ENTRIES IN imara WHERE mantr = imara-matnr.

Con la Instrucción FORL ALL ENTRIES hay que tener sumo cuidado en la manera en que se va a usar, primero se debe asegurar que la
tabla driver con la se va a comparar no se encuentre vacia, pues si es así, traería toda la data que esté en la base de datos,
perjudicando el performance del programa, y segundo, si la tabla interna tiene muchos registros, el select a la Base de Datos sería
mucha mas lento pues si utilizaría mucha memoria.

Para hacer mas eficiente el FOR ALL ENTRIES es recomendable, borrar los valores duplicado de la tabla driver, ordenarla y si es
posible convertirla en una tabla de rangos usando la sentencia BETWEEN.

FOR ALL ENTRIES IN imara WHERE matnr >= imara-matnr


AND matnr <= imara-matnr.

Es recomendable y mas rápido indicarle al SELECT que campos va leer, si no se necesitan todos ellos.

SELECT campo1 campo2 campo3 FROM TABLE tabla INTO TABLE itabla.

Donde itabla debe estar declarada con los campos que se quieren seleccionar de la tabla.

Publicado por Marsi Linares en 11:55 0 comentarios


Etiquetas: ABAP, Performance, Tuning

viernes 23 de octubre de 2009

Otras Funciones SAP


ABAP_DOCU_DOWNLOAD - Descargar Documentación ABAP en formato HTML.

ARFC_GET_TID - Devuelve la dirección IP de la terminal en hexadecimal.

CLOI_PUT_SIGN_IN_FRONT - Coloca el signo negativo después de un número. En SAP está predeterminado colocar el signo negativo
después del número

CLPB_EXPORT - Exportar una tabla de texto en el Portapapeles (en el servidor de presentación)

CLPB_IMPORT - Importar una tabla de texto desde el Portapapeles (en el servidor de presentación)

DATE_GET_WEEK - devolverá la semana en la que una fecha está.

DYNP_VALUES_READ - Lee los valores desde un dynpro. Esta función puede ser usada para leer valores desde un reporte con screen
también .
DYNP_VALUES_UPDATE - Es similar al DYNP_VALUES_READ, esta función permitirá la actualización de campos en un dynpro. Muys
usado cuando quieras cambiar un campo basado en el valor registrado por otro campo.

ENQUE_SLEEP - Espera un período determinado de tiempo antes de continuar el procesamiento.

ENQUEUE_ESFUNCTION - Bloquear un programa ABAP de modo que, no pueda ser ejecutado.

Se debe establecer los parámetros de la siguiente manera:

• RELID = 'ZZ'
• SRTF2 = 0
• SRTF = (Tú nombre del programa)

F4_DATE - muestra un calendario en una ventana emergente y permite que el usuario seleccione una fecha, o puede mostrarse de sólo
lectura.

HOLIDAY_GET - Proporciona una tabla de todos los días no laborables basado en un calendario de fábrica & / calendario de
vacaciones..

INIT_TEXT - Para cargar texto largo en SAP

K_WERKS_OF_BUKRS_FIND - Devuelve una lista de todas los centros para un código de empresa dada.

MONTH_NAMES_GET - Devuelve todos los meses y los nombres en el lenguaje respectivo.

MS_EXCEL_OLE_STANDARD_OLE - Se genere un archivo e inicie automáticamente Excel

POPUP_TO_CONFIRM_LOSS_OF_DATA - Crea un cuadro de diálogo en el que realiza una pregunta si el usuario desea realizar un
paso de procesamiento con pérdida de datos.

POPUP_TO_CONFIRM_WITH_MESSAGE - Crea un cuadro de diálogo en el que usted informa al usuario acerca de un punto de
decisión específica durante una acción.

POPUP_TO_CONFIRM_WITH_VALUE - Crear un cuadro de diálogo en el que realiza una pregunta si el usuario desea realizar un paso
de procesamiento con un objeto determinado.

POPUP_TO_DECIDE - Proporciona el usuario con varias opciones como botones de selección.

POPUP_TO_DECIDE_WITH_MESSAGE - Crea un cuadro de diálogo en el que usted informar al usuario acerca de un punto de
decisión concreta a través de un texto de diagnóstico.

POPUP_TO_DISPLAY_TEXT - Crea una caja de dialogo en el cual puedes mostrar dos lineas de mensaje.

POPUP_TO_SELECT_MONTH - Popup para escoger un mes

POPUP_WITH_TABLE_DISPLAY - Muestra una tabla al usuario donde puede seleccionar uno, con el valor de la línea de tabla
devuelto cuando se selecciona.

PRICING - Regresa las condiciones de precios en una table interna. Usa la estructura TCOMK para el parámetro COMM_HEAD_1, y la
estructura TCOMP para el parámetro COMM_ITEM_1, y establece CALCULATION_TYPE para B. Las condiciones de los precios se
devolverán en XOMV. Debes de llenar la TCOMP, y la TCOMK con los valores apropiados antes de llamar a la función para que
funcione correctamente.

RP_LAST_DAY_OF_MONTHS - Determina el ultimo día del mes.

RPY_DYNPRO_READ - Lee la pantalla, incluyendo el flujo de pantalla.

RPY_TRANSACTION_READ - Dada una transacción, regresa el programa y la pantalla; o dado un programa y una pantalla, regresa las
transacciones que el programa y la pantalla.

RS_SEND_MAIL_FOR_SPOOLLIST - Envía un mensaje desde un ABAP/4 a SAPoffice.

RZL_SLEEP - Cuelga la actual aplicación desde 1 a 5 segundos.

SAVE_TEXT - Para subir un texto largo a SAP.

SCROLLING_IN_TABLE - Si estas programando un module pool y usas un table-control, puedes usar esta función para manejar
cualquier scrolling.

SD_DATETIME_DIFFERENCE - Regresa la diferencia en días y tiempo para 2 fechas.

TH_DELETE_USER - Cierra un usuario. Resulta similar usando SM04.

TH_POPUP - Muestra un mensaje de sistema de ventanas emergentes en una pantalla de usuarios específicos.

WS_EXCEL - Comienza EXCEL en la PC

WS_EXECUTE - ejecutar un programa en un PC Windows.

WS_MSG - Crea un cuadro de diálogo en el que se muestra un mensaje de una línea.


WWW_LIST_TO_HTML - Después de ejecutar un reporte, llama a esta función para convertir la salida de lista a HTML.
Publicado por Marsi Linares en 13:08 1 comentarios
Etiquetas: ABAP, Funciones SAP

Colocar Número Total de Paginas a Un Reporte


Este es un sencillo Ejemplo para colocar el Total de Paginas a un Reporte sencillo ABAP,
aunque este tipo de reporte ya no es tan usado.

REPORT zimprpag NO STANDARD PAGE HEADING LINE-COUNT 65 line-size 80.

DATA: num_pag(10) TYPE c.

PERFORM escribe.
PERFORM get_total_pageno.

*&---------------------------------------------------------------------
**& Form TOP-OF-PAGE
*&---------------------------------------------------------------------
TOP-OF-PAGE.
WRITE:/(sy-linct) 'PRUEBA - PAGINA' CENTERED.
WRITE: / sy-datum, 60 sy-pagno,'of', '*****'.
SKIP.

*&---------------------------------------------------------------------
**& Form ESCRIBE
*&---------------------------------------------------------------------
FORM escribe.
DO 200 TIMES.
WRITE:/ 'PRUEBA', sy-linno.
ENDDO.

ENDFORM. " ESCRIBE

*&---------------------------------------------------------------------*
*& Form GET_TOTAL_PAGENO
*&---------------------------------------------------------------------*
FORM get_total_pageno.

WRITE sy-pagno TO num_pag LEFT-JUSTIFIED.

DO sy-pagno TIMES.
READ LINE 2 OF PAGE sy-index.
REPLACE '*****' WITH num_pag INTO sy-lisel.
MODIFY LINE 2 OF PAGE sy-index.
ENDDO.

ENDFORM. " GET_TOTAL_PAGENO

[Link]

Para ALV tipo Grid


En la definición de los elementos de datos

Debes declarar lo siguiente


type-pools: slis.

constants: top_of_page type slis_formname value 'TOP_OF_PAGE',


top_of_list type slis_formname value 'TOP_OF_LIST'.
constants: end_of_list type slis_formname value 'END_OF_LIST',
user_command type slis_formname value 'ALV_USER_COMMAND' .

En la funcion de visualizar la grid ('REUSE_ALV_GRID_DISPLAY') debes poner un command_alv:

CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY'


EXPORTING
i_callback_program = prg
*LA SIGUIENTE SENTENCIA SE USA PARA EL EVENTO DE DOBLE CLICK.
i_callback_user_command = user_command
it_fieldcat = fieldcat
it_sort = sortcat
i_save = 'X'
TABLES
t_outtab = it_datos ( tabla con los datos a mostrar en el ALV)
EXCEPTIONS
program_error = 1
OTHERS = 2.

Luego debes generar un perform en el que se ejecuta el doble click:

*---------------------------------------------------------------------
* * FORM ALV_USER_COMMAND
** --> R_UCOMM
** --> RS_SELFIELD
**---------------------------------------------------------------------*
FORM alv_user_command USING r_ucomm LIKE sy-ucommrs_selfield TYPE slis_selfield.

* Aqui hago el tratamiento del evento doble click


* CUANDO SE HACE DOBLE CLICK SE VIENE A ESTA SUBRUTINA
*HAY QUE PREGUNTAR CUAL ES LA CELDA QUE SE HA PINCHADO.
*HACIENDO WHEN '
*SE USA RS_SELFIELD (CAMPO SELECCIONADO)

CASE RS_SELFIELD-FIELDNAME.
WHEN 'BELNR'.
Llama a una transacción
WHEN 'COD'.
Llama a un reporte
ENDCASE.

ENDFORM.

Los botones los gestionas de forma normal. `

Para un ALV POO


Se define la clase para capturar el evento DOUBLE_CLICK.
Cuando se de doble click en alguna parte del grid se enviaran
los valores a esta clase.
***********************************************************************
* CLASSES
***********************************************************************
CLASS LCL_EVENT_RECEIVER DEFINITION.
PUBLIC SECTION.
METHODS:
CATCH_DOUBLECLICK FOR EVENT DOUBLE_CLICK OF CL_GUI_ALV_GRID
IMPORTING
E_COLUMN
ES_ROW_NO
SENDER.
ENDCLASS. "lcl_event_receiver DEFINITION

*-----
CLASS LCL_EVENT_RECEIVER IMPLEMENTATION.
METHOD CATCH_DOUBLECLICK.

DATA: ET_TABLASALIDA TYPE TI_REPORTE,


(tabla del mismo tipo de la tabla que contiene la data de salida del ALV)
E_ESTILOCHEK TYPE LVC_S_STYL.

READ TABLE TI_REPORTE INTO ET_TABLASALIDA INDEX ES_ROW_NO-ROW_ID.

Luego acá colocas el codigo según lo que vayas a realizar.


Ten en cuenta que la estructura e_column te trae la información del campo al que has pinchado y tienes que pasar la data de los
valores seleccionados de la data del ALV a la tabla de salida.

ENDMETHOD. "catch_doubleclick
ENDCLASS. "lcl_event_receiver IMPLEMENTATION

Al implementar el ALV

CALL METHOD G_GRID->SET_TABLE_FOR_FIRST_DISPLAY


EXPORTING
IS_LAYOUT = GS_LAYOUT
IT_TOOLBAR_EXCLUDING = LT_EXCLUDE
CHANGING
IT_FIELDCATALOG = GT_CATALOGO
IT_OUTTAB = TI_REPORTE[].

Es importante llamar al evento que se define al hacer Doble Click.

CREATE OBJECT G_EVENT_RECEIVER.


SET HANDLER EVENT_RECEIVER->CATCH_DOUBLECLICK FOR G_GRID.

En la definiciones de los datos se declara los eventos

DATA: event_receiver TYPE REF TO lcl_event_receiver.


Publicado por Marsi Linares en 09:12 0 comentarios

lunes 2 de marzo de 2009

Algunas Funciones SAP


Algunas Funciones SAP

Función para obtener el Nombre del Día de la Semana


RH_GET_DATE_DAYNAME

Función que saca los ceros a la izquierda de una variable


CALL FUNCTION 'CONVERSION_EXIT_ALPHA_OUTPUT'
EXPORTING
INPUT = VG_VARIABLE
IMPORTING
OUTPUT = VG_VARIABLE.

Función que completa con ceros a la izquierda de una variable


CALL FUNCTION 'CONVERSION_EXIT_ALPHA_INPUT'
EXPORTING
INPUT = VG_VARIABLE
IMPORTING
OUTPUT = VG_VARIABLE.

Calculadora en un POP-UP
Con la siguiente funcion se generará una calculadora en un POP-UP. La función 'FITRV_CALCULATOR' nos devolverá en la variable VALOR el resultado del
cálculo que haya hecho el usuario.

CALL FUNCTION 'FITRV_CALCULATOR'


* EXPORTING
* INPUT_VALUE =
* CURRENCY =
* START_COLUMN = '10′
* START_ROW = '10′
IMPORTING
OUTPUT_VALUE = VALOR
EXCEPTIONS
INVALID_INPUT = 1
CALCULATION_CANCELED = 2
OTHERS = 3.

Función que convierte variable tipo char a decimal.

CALL FUNCTION 'RS_CONV_EX_2_IN_NO_DD'


EXPORTING
input_external = caracteres
IMPORTING
output_internal = paquete
EXCEPTIONS
input_not_numerical = 1
too_many_decimals = 2
more_than_one_sign = 3
ill_thousand_separator_dist = 4
too_many_digits = 5
sign_for_unsigned = 6
too_large = 7
too_small = 8
OTHERS = 20 .

Funcion para sumar/restar dias/meses a una fecha


Con esta función se suma o resta días o meses a una fecha.
CALL FUNCTION 'RP_CALC_DATE_IN_INTERVAL'
EXPORTING
date = sy-datum
days = 15
months = 1
signum = '+'
years = 0
IMPORTING
calc_date = resulta_fecha.
Para restar dias o meses a la fecha debe cambiar el signo '+' por '-'.

Función para calcular el próximo o anterior día habil


Se puede usar la siguiente funcion:
CALL FUNCTION 'DATE_CONVERT_TO_FACTORYDATE'
EXPORTING
CORRECT_OPTION = signo ---> + o -
DATE = fecha
FACTORY_CALENDAR_ID = IDENT ---> calendario (T001W-FABKL)
IMPORTING
DATE = fecha_resultado
WORKINGDAY_INDICATOR = workingday inidicator
EXCEPTIONS
DATE_AFTER_RANGE = 01
DATE_BEFORE_RANGE = 02.
Reloj - Mostrar progreso

Esta función permite agregar un reloj que indica el progreso de un reporte en la barra de status.
CALL FUNCTION 'SAPGUI_PROGRESS_INDICATOR'
EXPORTING
PERCENTAGE = tiempo
TEXT = mensaje.

Calcula fecha a futuro o pasado


CALL FUNCTION 'DATE_IN_FUTURE'
EXPORTING
ANZAHL_TAGE = '3' --> 3 días adelante
IMPORT_DATUM = fecha_i "fecha a la que se le suma oresta los dias
IMPORTING
EXPORT_DATUM_INT_FORMAT = fecha_s. "fecha obtenida

Función para sumarle meses a una fecha


CALL FUNCTION 'HR_PSD_DATES_ADD_MONTHS'
EXPORTING
V_DATE = fecha_en ---> fecha de entrada
V_MONTHS = num_meses ---> numero de meses a sumar
IMPORTING
E_DATE = fecha_sal ---> fecha obtenida
EXCEPTIONS
NOT_POSITIVE = 1
OTHERS = 2.
IF SY-SUBRC <> 0.
MESSAGE ID SY-MSGID TYPE SY-MSGTY NUMBER SY-MSGNO WITH SY-MSGV1 SY-MSGV2 SY-MSGV3 SY-MSGV4.
ENDIF.

Mostrar Importe en Letras


CALL FUNCTION 'SPELL_AMOUNT'
EXPORTING
AMOUNT = monto "importe que se va a mostrar en letras
CURRENCY = 'USD' "moneda del sistema
LANGUAGE = SY-LANGU "idioma en que devuelve el texto
IMPORTING
IN_WORDS = monto_letras "Importe en Letras
EXCEPTIONS
NOT_FOUND = 1
TOO_LARGE = 2
OTHERS = 3.

Si al hacer la conversión, los importes están dando de manera incorrecta se puede entrar a la tabla T015Z por la transacción SE16 y por allí se modifica solo
las cifras que están incorrecta.

Definir un rango en SAP


A través de la transacción SNRO se pueden definir los rangos que sean autoincrementables.
Luego a traves del programa se llama a la siguiente función

CALL FUNCTION 'NUMBER_GET_NEXT'


EXPORTING
nr_range_nr = '01' ---> numero del rango del objeto
object = objeto ---> objeto definido a través del SNRO
IMPORTING
number = contador ---> numero del contador
EXCEPTIONS
interval_not_found = 1
number_range_not_intern = 2
object_not_found = 3
quantity_is_0 = 4
quantity_is_not_1 = 5
interval_overflow = 6
buffer_overflow = 7
OTHERS = 8.

Enviar e-mail desde SAP


Con la siguiente función SO_DOCUMENT_SEND_API1 pueden ser enviados a través de nuestros programas SAP. Luego el e-mail debe ser liberado a través
de la transacción SCOT

Publicado por Marsi Linares en 09:17 1 comentarios

Extensión del Maestro de Clientes


BAdis para la Realización de Extensión del Maestro de Clientes
PASO 1: En la SPRO se busca la siguiente Configuración: Logistica en General --> Interlocutor Comercial --> Clientes --> Control --> Toma de Campos
Específicos de Cliente --> Add-in empresarial: subscreen de cliente.
Las siguientes son las Badis a Implementar:

El add-in empresarial (BADI) CUSTOMER_ADD_DATA _CS sirve junto al BADI CUSTOMER_ADD_DATA para el proceso de ampliaciones en el maestro de
clientes. El BADI CUSTOMER_ADD_DATA_CS sirve para la inclusión de subscreens propios en el diálogo estándar. En estos subscreens pueden tratarse
datos propios (datos add-on).
PASO 2: Antes de realizar la implementación, por la SPRO, siguiendo la ruta: Logistica en General --> Interlocutor Comercial --> Clientes --> Control --> Toma
de Campos Específicos de Cliente --> Preparar ampliación sin modificaciones del maestro de deudor.
Se debe realizar la siguiente configuración:
1. Seleccione Grupo de imágenes Tratar y almacene para los grupos de imágenes deseados respectivamente una clave alfanumérica de dos posiciones y una
denominación. ( En este caso se utilizo ZS, para Grp. de Dynpros y en la Denominación Datos PCM ).
La denominación del grupo de imágenes aparece posteriormente en forma de un pulsador en las pantallas de acceso de sus datos maestros del interlocutor
comercial.
Para poder utilizar su ampliación, es decir, que su pulsador sea visible, actívelo mediante el add-in empresarial Proceso de ampliaciones de datos maestros
con el método CHECK_ADD_ON_ACTIVE (véase paso 3 más abajo).
2. Seleccione Marcar etiquetas e introduzca para cada grupo de imágenes los datos necesarios para las etiquetas. Puede crear un máximo de 32 etiquetas por
grupo de imágenes.
Tenga en cuenta lo siguiente:

• Mediante el número ordinal se controla la secuencia de las etiquetas. ( Se uso 1 ) .

• Mediante el código de función el sistema identifica en el tiempo de ejecución la etiqueta seleccionada por el usuario. (Se uso ZSD) .

• La denominación aparece como cabecera de la etiqueta. ( Se uso Datos Generales XXXXX )

• El icono (opcional) aparece junto con la cabecera en el título de la etiquetas.

Las etiquetas se llaman posteriormente en los datos maestros de interlocutores comerciales mediante el pulsador correspondiente. En cada etiqueta tiene a su
disposición su subscreen propio de cliente en el que puede tratar sus datos de interlocutor [Link] sus subscreens mediante su add-in empresarial
dependiente de filtro Subscreens propios de cliente; seleccione como filtro su grupo de imágenes (véase paso 3 más abajo).
3. Para conectar sus subscreens y datos a la aplicación estándar, utilice los add-ins empresariales siguientes:
Add-in empresarial: Proceso de ampliaciones de datos maestros
(CUSTOMER_ADD_DATA/VENDOR_ADD_DATA)
Add-in empresarial: Subscreens propios de cliente
(CUSTOMER_ADD_DATA_CS/VENDOR_ADD_DATA_CS)
Add-in empresarial: Proceso de ampliaciones de datos maestros con batch input(CUSTOMER_ADD_DATA_BI/VENDOR_ADD_DATA_BI)
PASO 3: Para comenzar la implementación debe dirigirse a la Transacción se19.
En el frame de Crear Implementación Seleccion BAdi Clasico y en el nombre de la Badi coloque:

• Nombre BAdI CUSTOMER_ADD_DATA_CS.

• Presione el Botón Implementar

• Nombre de la Implementación (Ejemplo ZP_CUSTOMER_ADD_DATA)

• Enter

• En la siguiente pantalla, seleccione el filtro creado en el paso 2. Ej. ZS

• Para poder activar se debe crear una Enhancement Implementation, para ello en el nombre coloque el nombre asignado, (Ejemplo
ZP_CUSTOMER_ADD_DATA) y de un texto breve explicativo.
• Presione ENTER y Active en la Ampliación.

PASO 4: Repetir el procedimiento anterior para la BADI CUSTOMER_ADD_DATA.


NOTA IMPORTANTE, ASEGURARSE DE:

• que en el Customizing del maestro de clientes en la opción Transferencia de campos de datos maestros propios de cliente se ha preparado la
ampliación sin modificaciones del maestro de clientes de forma que un grupo de pantallas se ha almacenado con denominación y las etiquetas
están rotuladas
• que el tratamiento de sus datos propios de clientes mediante el método CHECK_ADD_ON_ACTIVE del add-in empresarial
CUSTOMER_ADD_DATA está activado el diálogo estándar. El codigo usado por ejemplo es

IF i_screen_group = 'ZS'. (Filtro definido en el paso 2.)

e_add_on_active = 'X'.

ENDIF.

PASO 5: Realizar un Append Structure a la tabla estándar SAP KNA1. Según los campos Adicionales que se quieran crear en el sistema.

PASO 6: Trabajar con los métodos según sea la necesidad. Para este ejemplo se usaron los siguientes:

Para la implementacion de la BADI CUSTOMER_ADD_DATA_CS:

SET_DATA--> Método que lee la data de la KNA1 y la muestra en el dynpro de la extensión.

Código Ejemplo.

CALL FUNCTION 'ZSET_DATA_CLIE'


EXPORTING
i_activity = i_activity
s_kna1 = s_kna1
read = 'X'
EXCEPTIONS
OTHERS = 1.
GET_DATA--> Método que devuelve la data al standar, en este caso actualiza la data de la KNA1, si se ha creado o si se ha modificado.
Código Ejemplo.
DATA: me_kna1 TYPE kna1.
CALL FUNCTION 'ZSET_DATA_CLIE'
EXPORTING
read = ' '
IMPORTING
e_kna1 = me_kna1
EXCEPTIONS
other = 1.
s_kna1-zzcliente = me_kna1-zzcliente .
GET_TAXI_SCREEN --> Método que muestra el Dynpro realizado para la extensión.
Código Ejemplo.
CASE i_taxi_fcode.
WHEN 'ZSD'. "Datos Generales
e_program = 'SAPLZPCMCLIE'.
e_screen = '1000'.
e_headerscreen_layout = ' '.
ENDCASE.
Para la implementacion de la BADI CUSTOMER_ADD_DATA:
CHECK_ALL_DATA --> Método que permite realizar validaciones de la data colocada en el dynpro de la extensión.
Código Ejemplo.
* validar que para el grupo de ZSYC esten llenos los campos
DATA: w_mensaje(40).
IF s_kna1-ktokd = 'ZSYC'.
IF s_kna1-zzcliente EQ space.
w_mensaje = 'Completar el Campo Cliente'.
MESSAGE e208(00) WITH w_mensaje.
ENDIF.
ENDIF.
CHECK_ADD_ON_ACTIVE --> Método que según el grupo de Dynpros definido en el Customizing debe estar activo para que se pueda mostrar en la
transacción.
IF i_screen_group = 'ZS'.
e_add_on_active = 'X'.
ENDI

También podría gustarte