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 loop a la tabla como como el siguiente LOOP AT tabla_int 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_HEA D_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
http://abaperitos.blogspot.com/search/label/ABAP
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_CL ICK. 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 ---> calen dario (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 comercial.Integre 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