Dlver Trucos Abap
Dlver Trucos Abap
Dlver Trucos Abap
Recorre Tabla Transarente y tabla Interna (*) Prueba con Cadenas Replace, Split, translate, etc (*) Parameters y Valor por Referencia (Using Changing) (*) Select Anidados (*) ABM de Tablas Internas (Altas Bajas y Modificaciones) (*) ABM de Tablas Transaparentes (Altas Bajas y Modificaciones) (*) Parameters Y Select Options (*) Submit y Exports (*) Invocacion de un Reporte desde una funcion (**) Frame y At Line seleccion (*) Seleccion Sreen para frame de Comentarios
Manejo de Archivos o Levantar / Upload o Archivo de Textos (*) o Planilla de Calculos (x) o Generar / Download o Generar Txt o Cualquier Archivo de Texto. o Ejecutar Archivos externos. o Ejecutar Desde Sap Diferentes Archivos Externos Insertar Un registro en tabla Transparente (*) Funciones SAP Vanilla (*) At of Selection-Screen On Field(*) Hipervinculos de Lineas (At Line selection) (**) Field-Symbols (**) Tabs en una cadena (**) Para que un Parametro de Seleccion sea Oculto (Password) (1) Unpack y Pack Cmo desactivar el chequeo sintntico Manejar Radio Buttons y al lado del otro. For all Entries Calculadora en POP-UP Try-Catch en Abap Leer Textos en Sap Busca un String en Programa ABAP Completar o Sacar ceros a la Izquierda de un programa
(*)Ejemplos del banco Hipotecario (**)Base de conocimientos sap1 (1)Sintaxis Abap / Trucos (x)Fuente Desconocida
*else. * write 'se encontro'. *endif. *72*468921# *-----------------------------------------------------DATA: cadena1(20) TYPE c, cadena2(20) TYPE c, off1 TYPE i, len1 TYPE i, off2 TYPE i, len2 TYPE i. off1 = 2. len1 = 3. off2 = 4. len2 = 3. cadena1 = 'abcdefghij'. MOVE cadena1+off1(len1) TO cadena2. NEW-LINE. WRITE cadena2.
Select Anidados
REPORT ycb04 . TABLES: t000, customers, bookings. DATA mitabla TYPE t000 OCCURS 10 WITH HEADER LINE. SELECT * FROM customers. SELECT * FROM bookings WHERE customid = customers-id. WRITE: / customers-name, bookings-fldate. ENDSELECT. ENDSELECT.
*------------------------------------------------------------------*MOSTRAR *------------------------------------------------------------------FORM mostrar_datos. SKIP. LOOP AT my_customers. WRITE: / my_customers-id, my_customers-name. ENDLOOP. ENDFORM. *------------------------------------------------------------------*------------------------------------------------------------------*ALTA *------------------------------------------------------------------FORM insertar_registro. READ TABLE my_customers WITH KEY id = '12'. IF sy-subrc NE 0. my_customers-id = '12'. my_customers-name = 'Bart Simpson2'. my_customers-postcode = '7600'. my_customers-city = 'Mar del plata'. INSERT TABLE my_customers. ELSE. WRITE: / 'Ya existe dicho registro'. ENDIF. ENDFORM. *------------------------------------------------------------------*------------------------------------------------------------------*BAJA *------------------------------------------------------------------*------------------------------------------------------------------FORM borrar_registro. DELETE my_customers WHERE id = '12'. WRITE / 'registro borrado'. ENDFORM. *------------------------------------------------------------------*MODIFICACION *------------------------------------------------------------------FORM modificar_registro. READ TABLE my_customers WITH KEY id = '12'. IF sy-subrc EQ 0. my_customers-name = 'Bart Simpson modificado'. MODIFY my_customers INDEX sy-tabix. WRITE: / 'Registro modificado!'. ELSE.
WRITE: / 'No existe dicho registro. No se puede modificar'. ENDIF. ENDFORM. *-------------------------------------------------------------------
*------------------------------------------------------FORM update_forma1. customers-id = '1'. customers-city = 'modificado!'. UPDATE customers. IF sy-subrc <> 0. WRITE 'entry not existing'. ENDIF. ENDFORM. *------------------------------------------------------*UPDATE FORMA 2 *------------------------------------------------------FORM update_forma2. UPDATE customers SET city = 'City Unknow' WHERE city = space. ENDFORM. *------------------------------------------------------*UPDATE FORMA 3 *------------------------------------------------------FORM update_forma3. customers-id = '50'. customers-name = 'prueba'. customers-city = sy-datum. MODIFY customers. ENDFORM. *------------------------------------------------------*MOSTRAR DATOS *------------------------------------------------------FORM mostrar_datos. SKIP. WRITE: / 'customers-id', ' customers-name', ' customers-city'. SKIP. SELECT * FROM customers. WRITE: / customers-id, customers-name, customers-city. ENDSELECT. ENDFORM. *-------------------------------------------------------
Ejemplo 2
Programa que Exporta
REPORT ycb08 . TABLES: t000. DATA: my_t000 LIKE t000 OCCURS 10 WITH HEADER LINE. SELECT * FROM t000 INTO TABLE my_t000. EXPORT my_t000 TO MEMORY ID 'ZCBMEM01'. WRITE / 'Esto es 08 y voy a invocar a 09'. *submit ycb09 using selection-set 'ZCB02'. SUBMIT ycb09 USING SELECTION-SET 'ZCB02' AND RETURN. *submit ycb09 using selection-set 'ZCB02' via selection-screen.
ENDLOOP.
Variante para prog. YCB09 Variante: ZCB02 p_Id: 20 a 50 *Corroborar que en la tabla Customers existan los datos
Submite un reporte desde una funcion, y vuelve a la funcion. Esto es porque utiliza el parmetro AND RETURN. Si el reporte tena salida por pantalla, no la muestra. Esto es porque utiliza el parametro EXPORTING LIST TO MEMORY Le pasa los paramtros de seleccion al reporte. Para hacer esto, utiliza WITH CAMPO_PARAM = 'VALOR'
FUNCTION ycb01. *"---------------------------------------------------------------------*"*"Local interface: *" IMPORTING *" VALUE(CADENA2) TYPE CHAR100 OPTIONAL *" EXPORTING *" VALUE(RETURN_DESC) TYPE CHAR200 *"---------------------------------------------------------------------* Tabla interna usada para recibir los datos de memoria. DATA: cadena(100) TYPE c OCCURS 0 WITH HEADER LINE. *Submite el reporte con un parametro de seleccin, y vuelve. SUBMIT ycb03 WITH p_id = 'caso1' EXPORTING LIST TO MEMORY AND RETURN. *Obtiene los datos importados de la memoria. *IMPORTANTE: la variable a importar se debe llamar igual a la exportada. IMPORT cadena FROM MEMORY ID 'ZBCS_MEM01'.
*Muestra los datos importados. LOOP AT cadena. CONCATENATE return_desc cadena INTO return_desc. ENDLOOP. ENDFUNCTION. *------------------------------------------------------------------REPORT ycb03 . DATA: cadena(100) TYPE c OCCURS 0 WITH HEADER LINE. PARAMETERS: p_id TYPE char10. *-------------------------------------------------------START-OF-SELECTION. * Dependiendo del valor del parametro, inserta distintos datos en la * tabla interna. IF p_id EQ 'CASO1'. cadena = '-caso1 1!-'. APPEND cadena. cadena = '-caso1 2!-'. APPEND cadena. ELSE. cadena = '-caso no 1!-'. APPEND cadena. ENDIF. *Exporta la tabla interna a memoria. EXPORT cadena TO MEMORY ID 'ZBCS_MEM01'. WRITE: / 'Se finaliz'.
SELECTION-SCREEN POSITION POS_high. PARAMETERS parm LIKE saplane-planetype. SELECTION-SCREEN END OF LINE.
At-seleccin Screen.
KEY-WORD: AT SELECTION-SCREEN, Validaciones, ON
SIRVE PARA VALIDAR QUE LA ENTRADA DE DATOS CUMPLA CIERTAS CONDICIONES ANTES QUE EL PROGRAMA SE EJECUTE. OBS: ESTAS VALIDACIONES SE PODRIAN HACER DENTRO DEL PROGRAMA, PERO LO BUENO DE PONERLO ACA ES QUE NO SE PERMITE CONTINUAR HASTA QUE LA ENTRADA DE DATOS SEA VALIDA. ADEMAS PERO EL PROGRAMA NO CORTA ABRUPTAMENTE COMO PASARIA SI SE MUESTRA UN MENSAJE DE ERROR DENTRO DEL PROGRAMA.
REPORT zcbprueba04 MESSAGE-ID 00. PARAMETERS: campo1(10) TYPE c. AT SELECTION-SCREEN ON campo1. IF campo1 = '1'. MESSAGE e398 WITH 'Error en el nmero.'. ENDIF. START-OF-SELECTION. WRITE:/ 'Bien!'. END-OF-SELECTION.
Manejo de Archivos
Archivo de Textos
Trx: AL11 para ver los directorios al que tienen acceso sap
REPORT ycb11 . TABLES: customers. DATA: dsn(50) VALUE '\\s000sad\interfaces\cristian\archivo.txt', dsn2(50) VALUE '\\s000sad\interfaces\cristian\prueba.txt', record(80). DATA: BEGIN OF rec, name LIKE customers-name, END OF rec. *perform escritura_archivo_plano. *perform lectura_archivo_plano. *perform escritura_archivo_binario. *perform lectura_archivo_binario. *perform append_archivo_binario. *perform lectura_archivo_binario. PERFORM lectura_con_ws_upload. ************************************************************************ *ESCRITURA DE UN ARCHIVO
************************************************************************ FORM escritura_archivo_plano. ULINE. WRITE: / 'form escritura_archivo_plano.'. WRITE: / '______________________________'. OPEN DATASET dsn FOR OUTPUT IN TEXT MODE. TRANSFER 'prueba111' TO dsn. TRANSFER 'prueba222' TO dsn. TRANSFER 'prueba333' TO dsn. CLOSE DATASET dsn. ENDFORM. ************************************************************************ *LECTURA DE UN ARCHIVO ************************************************************************ FORM lectura_archivo_plano. ULINE. WRITE: / 'form lectura_archivo_plano.'. WRITE: / '______________________________'. OPEN DATASET dsn FOR INPUT IN TEXT MODE. DO. READ DATASET dsn INTO record. IF sy-subrc NE 0. EXIT. ELSE. WRITE: / record. ENDIF. ENDDO. CLOSE DATASET dsn. ENDFORM. ************************************************************************ * CREACION DE ARCHIVO BINARIO ************************************************************************ FORM escritura_archivo_binario. ULINE. WRITE: / 'form escritura_archivo_binario.'. WRITE: / '______________________________'. OPEN DATASET dsn2 FOR OUTPUT. SELECT * FROM customers. MOVE-CORRESPONDING customers TO rec. TRANSFER rec TO dsn2. ENDSELECT. CLOSE DATASET dsn2. ENDFORM. ************************************************************************ * LECTURA DE ARCHIVO BINARIO ************************************************************************ FORM lectura_archivo_binario. ULINE. WRITE: / 'form lectura_archivo_binario..'. WRITE: / '______________________________'. OPEN DATASET dsn2 FOR INPUT. DO. READ DATASET dsn2 INTO rec. IF sy-subrc NE 0. EXIT. ENDIF. WRITE: / rec-name. ENDDO. ENDFORM. ************************************************************************ * Appending a file ************************************************************************ FORM append_archivo_binario. ULINE. WRITE: / 'form append_archivo_binario.'. WRITE: / '______________________________'. OPEN DATASET dsn2 FOR APPENDING IN BINARY MODE. SELECT * FROM customers. MOVE-CORRESPONDING customers TO rec.
TRANSFER rec TO dsn2. ENDSELECT. CLOSE DATASET dsn2. ENDFORM. ************************************************************************ * LECTURA DE UN ARCHIVO CON WS_UPLOAD * SIRVE PARA ARCHIVOS LOCALES (presentation server), o se la PC local. ************************************************************************ FORM lectura_con_ws_upload. DATA p_file LIKE rlgrap-filename VALUE 'c:\archivo.txt'. DATA: BEGIN OF it_entrada OCCURS 0, campo(80) TYPE c, END OF it_entrada. CALL FUNCTION 'WS_UPLOAD' EXPORTING filename = p_file filetype = 'DAT' TABLES data_tab = it_entrada EXCEPTIONS conversion_error =1 file_open_error =2 file_read_error =3 invalid_table_width =4 invalid_type =5 no_batch =6 unknown_error =7 gui_refuse_filetransfer = 8 customer_error =9 OTHERS = 10. *Si no lo puedo abrir informo el error y termino el programa. IF sy-subrc <> 0. WRITE: / 'No se pudo abrir el archivo: ', p_file. ENDIF. LOOP AT it_entrada. WRITE / it_entrada-campo. ENDLOOP. ENDFORM.
FIELD-SYMBOLS: <fs1>. PARAMETERS: filenm LIKE rlgrap-filename MEMORY ID m01, noheader AS CHECKBOX. CALL FUNCTION 'ALSM_EXCEL_TO_INTERNAL_TABLE' EXPORTING filename = filenm i_begin_col =1 i_begin_row =1 i_end_col = 100 i_end_row = 30000 TABLES intern = iexcel EXCEPTIONS inconsistent_parameters = 1 upload_ole =2 OTHERS = 3. IF sy-subrc <> 0. WRITE: / 'EXCEL UPLOAD FAILED ', filenm, sy-subrc. ELSE. SORT iexcel BY row col. LOOP AT iexcel. IF noheader = 'X' AND iexcel-row = 1. CONTINUE. ENDIF. tind = iexcel-col. CONCATENATE 'DATA_TAB-VALUE_' tind INTO zwfeld. ASSIGN (zwfeld) TO <fs1>. <fs1> = iexcel-value. AT END OF row. APPEND data_tab. WRITE:/ 'data_tab ', data_tab-value_0001, data_tab-value_0002, data_tab-value_0003, data_tab-value_0004. CLEAR data_tab. ENDAT. ENDLOOP. ENDIF
Generar / Download
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 OTHERS = 22.. *FILETYPE: "ASC,bin
*Para crear un archivo a partir de una tabla con los campos separador por tab: USAR el FILETYPE = 'DAT'= o ns = "urn:schemas-microsoft-com:office:office" />
CALL FUNCTION 'WS_EXECUTE' EXPORTING program = 'wordpad' commandline = 'c:archivo1.rtf' EXCEPTIONS frontend_error =1 no_batch =2 prog_not_found =3 illegal_option =4 gui_refuse_execute = 5 OTHERS = 6.
At of Selection-Screen On Field
REPORT ycb16 . PARAMETERS: p_numero TYPE n. AT SELECTION-SCREEN ON p_numero. IF p_numero = 1. MESSAGE e001(zficomm) WITH text-003. ENDIF. START-OF-SELECTION. WRITE: / 'hola'.
Field-Symbols
ENDLOOP. WRITE: / sy-uline. LOOP AT t_t000. ASSIGN ('t_t000-mandt') TO <f_campo1>. * Modifica el valor de la variable apuntada por el field-symbol. <f_campo1> = sy-tabix. WRITE: / <f_campo1>. ENDLOOP.
* ... ENDDO.
PROGRAMA QUE CONCATENA UN CARACTER TAB AL FINAL DE UNA CADENA Y EN CUALQUIER LUGAR DE UNA CADENA.
REPORT ycb_prueba07 DATA: v_salida(10) TYPE c. DATA: v_tab TYPE c. FIELD-SYMBOLS: <fld>. START-OF-SELECTION. *--------------------*FORMA 1 * *CONCATENA UN TAB ATRAS *--------------------v_salida = 'SAPGLOBAL'. ASSIGN v_tab(1) TO <fld> TYPE 'X'. <fld> = '09'. CONCATENATE v_salida v_tab INTO v_salida. WRITE v_salida . *--------------------*FORMA 2 * *CAMBIA UN CARACTER POR * UN TAB *--------------------v_salida = 'SAPGLOBAL'. ASSIGN v_salida+3(1) TO <fld> TYPE 'X'. <fld> = '09'. WRITE v_salida . *--------------------*FORMA 3 * *Invocando a una clase * *--------------------CLASS cl_abap_char_utilities DEFINITION LOAD. DATA: v_cadena(30) TYPE c. DATA: vertical_tab(1) TYPE c, horizontal_tab. horizontal_tab = cl_abap_char_utilities=>horizontal_tab. v_cadena = 'HORIZONTAL_TAB-SAPGLOBAL'. CONCATENATE v_cadena horizontal_tab INTO v_cadena. WRITE:/ v_cadena. .
Unpack y Pack
Si se hace un pack de una cadena numerica a un tipo P, y este tipo P est definido con decimales, completa primero la parte decimal y luego la parte entera. DATA: vp TYPE p DECIMALS 3. DATA: cadena(10) TYPE c VALUE '105473'. PACK cadena TO vp. WRITE:/ 'cadena:',cadena. WRITE:/ 'vp:', vp NO-GAP.
imprime: cadena: 105473 vp: 105,473 Si se hace un unpack de un tipo P definido con decimales a una cadena, copia todos los digitos a la cadena, pero sin la coma decimal. Y completa con CEROS a la izquierda.= o ns = "urn:schemas-microsoft-com:office:office" /> ejemplo: data: vp type p decimals 3 value '99.641'. DATA: cadena(10) TYPE c. UNPACK vp TO cadena. WRITE:/ 'cadena:',cadena. WRITE:/ 'vp:', vp NO-GAP. imprime: cadena: 0000099641 vp: 99,641
Como hacer que una columna no se mueva cuando el usuario dezplaza la pantalla para la derecha? RESPUESTA: Ejemplo: set left scroll-boundary column 13. Esto mantendr los primeros 13 caracteres de todas las filas siempre visibles.
Calculadora el Pop-UP
El siguiente cdigo nos generar una calculadora en una ventana (POP-UP). La funcin FITRV_CALCULATOR nos devolver en la variable X_VALUE el resultado del clculo que haya hecho el usuario para luego utilizarlo como queramos en nuestro programa.
REPORT zcalculadora. DATA: x_value(15) TYPE c. CALL FUNCTION fitrv_calculator * EXPORTING * INPUT_VALUE = * CURRENCY = * START_COLUMN = 10' * START_ROW = 10' IMPORTING output_value = x_value EXCEPTIONS invalid_input =1 calculation_canceled =2 OTHERS = 3. IF sy-subrc = 0. en este ejemplo imprimimos por pantalla el resultado write:/ output value , x_value. ENDIF.
Try-Catch en ABAP
El otro da viendo la documentacin de SAP me encontr que existe la posibilidad de utilizar en ABAP el TRY-CATCH (muy usado en Java). TRY-CATCH sirve para el manejo de errores y excepciones. Y nos puede ser muy til para evitar los odiosos Short Dumps. Dejo un ejemplo donde trato de insertar un registro en una tabla Z usando try-catch para evitar errores de SQL: *Intento insertar un registro en la tabla ZPROYECTOS, si hay algn tipo de error de SQL (que generalmente arroja un dump) manejo la excepcin con un mensaje de advertencia. TRY. INSERT INTO ZPROYECTOS VALUES WA_ZPROYEC. CATCH CX_SY_DYNAMIC_OSQL_ERROR. MESSAGE Error al actualizar la tabla ZPROYECTOS TYPE I. ENDTRY.
* Funcin que completa con ceros a la izquierda de una variable CALL FUNCTION conversion_exit_alpha_input EXPORTING input = vg_variable IMPORTING output = vg_variable.