Archivo
Crear grupo de autorización para tabla
Caso: se requiere crear un grupo de autorización para asignarlo a una tabla Z, para luego indicarlo al área de Roles & Perfiles para asignación de las autorizaciones correspondientes.
Solución: Se debe ingresar a la transacción SM30, y actualizar la vista V_BRG_54.
Aquí podremos ver los valores del objeto de autorización S_TABU_DIS, creamos un nuevo registro y nos quedará creado el grupo a asignar.

Este cambio solicitará OT de customizing y se podrá utilizar luego en la SE11 (Utilidades-Asignar grupo de autorización) o también cuando seleccionamos Utilidades-Generador actualiz.tab.


Tipos de Popup en SAP – Parte 4 – POPUP ALV GRID
Caso: Encontré un POPUP para visualizar en ALV GRID la información de una tabla interna, adjunto link directo de la fuente ya que fue probado y quedó funcionando.
Fuente: https://blogs.sap.com/2014/05/07/very-simple-alv-in-pop-up-window/
Color en celda de ALV GRID
Caso: Se desea ponerle color a una celda de un ALV.
Solución: Para pintar una celda, podemos utilizar, en el fieldcat del ALV la estructura lvc_t_scol, por ejemplo (sólo pongo lo importante):
TYPES: BEGIN OF ty_alv.
TYPES: name1 TYPE name1,
cellcolors TYPE lvc_t_scol,
TYPES: END OF ty_alv.
TYPES: tty_alv TYPE STANDARD TABLE OF ty_alv.
DATA: gt_alv TYPE ty_alv OCCURS 0 WITH HEADER LINE,
gs_alv TYPE LINE OF tty_alv.
FORM layout_alv USING ls_layout TYPE slis_layout_alv.
DATA l_color TYPE lvc_s_scol.
ls_layout-zebra = ‘X’.
ls_layout-colwidth_optimize = ‘X’.
FIELD-SYMBOLS <fs_report> LIKE LINE OF gt_alv.
ls_layout-coltab_fieldname = ‘CELLCOLORS’.
UNASSIGN <fs_report>.
LOOP AT GT_alv ASSIGNING <fs_report>.
CASE <fs_report>-name1.
WHEN ‘PEDRO’.
l_color-fname = ‘NAME1’ .
l_color-color-col = ‘6’. «ROJO
l_color-color-int = ‘1’. «INTENSIDAD
l_color-color-inv = ‘0’. «INVERSO
APPEND l_color TO <fs_report>-CELLCOLORS.
WHEN ‘JUAN’.
l_color-fname = ‘NAME1’ .
l_color-color-col = ‘3’. «AMARILLO
l_color-color-int = ‘1’.
l_color-color-inv = ‘0’.
APPEND l_color TO <fs_report>-CELLCOLORS.
ENDCASE.
ENDLOOP.
ENDFORM. » layout_alv
BAPI para liberar documentos de venta (VKM1)
Caso: se requería encontrar una BAPI para liberar documentos de venta por bloqueo de facturación (cliente bloqueado por gestión de crédito).
Solución: la función SD_ORDER_CREDIT_RELEASE funciona perfecto, indicándole el documento de venta y si queremos que sea sincrónica la actualización.
CALL FUNCTION 'SD_ORDER_CREDIT_RELEASE'
EXPORTING
vbeln = lv_vbeln
if_synchron = 'X'.
Nuevo SAP GUI 7.5
Noticia: SAP liberó el nuevo GUI 7.50
El 04.05.2017 SAP liberó la versión GUI 7.50, disponible para descargar e instalar para todos los clientes.
Algunas de las características de esta nueva versión son:
– Mayor vida útil para SAP GUI, ya que está desarrollado con Visual Studio 2013
– Selección de colores por cliente / sistema con Blue Crystal Theme
– Soporte productivo para las características de SAP Screen Personas 3.0
Las nuevas características se mencionan en las siguientes notas:
2417687 – New features in SAP GUI for Windows 7.50
147519 – Maintenance strategy / deadlines for SAP GUI
Para aquellos que no tienen acceso a SAP Service Marketplace, se adjunta link: http://www.sabitlink.com/index.php/l/jc
3 trucos ABAP para programar menos
Caso: Se enumeran algunos trucos para reducir el tiempo que se tarda programando.
Solución:
Truco 1: Armar estructuras utilizando el botón “MODELO”.
Casi siempre usamos estructuras para nuestros reportes y se pierde mucho tiempo en agregar los campos tipeándolos, veamos este trick usando el “MODELO”, también se pueden ver otras opciones ahí mismo.
- image001
- image002
- image003
Y el resultado final:
2. Copy+Paste de datos en columna
Si nos gusta crear una estructura desde el diccionario y luego completar con el texto TYPE manualmente, aquí un truco:
Seleccionamos los campos para pegarlos en nuestro programa:
- image005
- image006
He aquí el truco! Usamos ALT+drag and drop del mouse para seleccionar la info y trabajar con ella.
Por ejemplo me traigo los TYPES del punto anterior….o selecciono los tipos de datos y los elimino todos de una vez!
Para eliminar igual, con CTRL+X (cortar) o Suprimir (delete).
3. Uso del TAB para proponer texto personalizado.
Ya sabemos que el TAB nos ayuda a proponernos instrucciones, pero podemos agregar código nuestro? Si, veamos donde: el editor ABAP, en la esquina inferior derecha hay un ícono, lo presionamos.
Ahí en Modelos de códigos podemos ver los actuales y crearnos nuevos, por ejemplo:
- image010
- image011
Ahora, ya en el código:
Nos aparece el código ingresado
IW38 – Campo de cliente en estructura RIHAUFK_LIST no aparece en ALV
Caso: En la IW38, si tenemos en la estructura RIHAUFK_LIST creada una estructura append con campos de cliente y éstos no comienzan con Z, no aparecen en el ALV de resultados.
En la IW38:
- image0011
- image002
Solución: Usamos la BADI BADI_EAM_SINGLELEVEL_LIST, método CHANGE_FIELD_CATALOG, borrando el valor del campo CS_FIELDCATALOG-TECH, tal como indica la nota 1509429 – Customer-defined fields are not displayed in all PM lists after upgrade
1. Por la SE18, presionamos VISUALIZAR:
- image003
- image004
2. Por la SE19 creamos una copia del QNAO_SFWS_SC_SIGLELEVEL_LIST:
3. Ingresamos a modificar el objeto recién copiado:
4. Modificamos los tildes para activar la ampliación luego y vamos a “Clase que implementa”:
5. Tomamos la clase que implementa y hacemos una copia Z de ella para poder editarla:
Para ello le agregamos una Z adelante y presionamos ENTER:
- image009
- image010
Ahora con la nueva clase Z, hacemos click en el método CHANGE_FIELD:
- image011
- image012
Agregamos el código según lo que indica la nota de SAP:
Finalmente volvemos hacia atrás y agregamos el reporte de la IW38 al filtro para visualización:
- image014
- image015
- image016
Finalmente activamos. Si volvemos a la SE18, veremos que ahora aparece implementado:
Finalmente en la IW38 validamos:
Links: 1509429 – Customer-defined fields are not displayed in all PM lists after upgrade
SU53 – Obtener del BUFFER errores de autorización
Caso: se solicita obtener los errores de autorización del usuario, tal cual cuando se ejecuta la SU53.
Solución: No encontré una solución perfecta. De lo que pude investigar fue “simular” la SU53, obteniendo desde el BUFFER del usuario los resultados.
La SU53, al ser ejecutada, graba el último error de autorización en la tabla USR07. Pero sólo guarda el último, por lo cual una opción sería ejecutar un JOB (creándolo desde el mismo usuario) para obtener el buffer y así ir guardando cada X tiempo los errores de autorización leyéndolos desde el BUFFER, sin tener que ejecutar la SU53.
- Les paso esta nota que aclara un poco el tema: http://solveissue.com/note?id=1974803
- El programa en cuestión es el siguiente:
REPORT zleer_su53. DATA: BEGIN OF usr07key, objct LIKE usr07-objct, fiel0 LIKE usr07-fiel0, fiel1 LIKE usr07-fiel0, fiel2 LIKE usr07-fiel0, fiel3 LIKE usr07-fiel0, fiel4 LIKE usr07-fiel0, fiel5 LIKE usr07-fiel0, fiel6 LIKE usr07-fiel0, fiel7 LIKE usr07-fiel0, fiel8 LIKE usr07-fiel0, fiel9 LIKE usr07-fiel0, END OF usr07key. DATA: BEGIN OF usr07val1, val01 LIKE usr07-val01, val02 LIKE usr07-val01, val03 LIKE usr07-val01, val04 LIKE usr07-val01, val05 LIKE usr07-val01, val06 LIKE usr07-val01, END OF usr07val1. DATA: BEGIN OF usr07val2, val07 LIKE usr07-val01, val08 LIKE usr07-val01, val09 LIKE usr07-val01, val10 LIKE usr07-val01, END OF usr07val2. DATA: g_buffer_method(10), usr07 TYPE usr07. CALL 'C_SAPGPARAM' ID 'NAME' FIELD 'auth/new_buffering' ID 'VALUE' FIELD g_buffer_method. GET PARAMETER ID 'XU1' FIELD usr07key. "#EC EXISTS GET PARAMETER ID 'XU2' FIELD usr07val1. "#EC EXISTS GET PARAMETER ID 'XU7' FIELD usr07val2. "#EC EXISTS CLEAR usr07. usr07-bname = sy-uname. MOVE-CORRESPONDING usr07key TO usr07. MOVE-CORRESPONDING usr07val1 TO usr07. MOVE-CORRESPONDING usr07val2 TO usr07. MOVE sy-datum TO usr07-cdate. MOVE sy-uzeit TO usr07-ctime. WRITE / : usr07-bname. WRITE / : usr07-objct. WRITE / : usr07-fiel0. WRITE / : usr07-fiel1. WRITE / : usr07-VAL01.
3. También encontré una transacción ZSU53 que puede servirles, lo que hace es generar el error de autorización y muestra qué perfiles necesita el usuario para cumplir con dicha autorización:
https://code.google.com/p/zsu53/
4. También encontré una BAPI que ejecuta en fondo la SU53 para obtener en un texto el resultado: http://searchsap.techtarget.com/tip/BAPI-to-retrieve-Check-Values-like-SU53-result
Función para validar RUT (Documento de Identidad en Chile)
Caso: se busca crear una función que valide el RUT de una persona/empresa
Solución: se crea la siguiente función:
FUNCTION zvalidar_rut. *"---------------------------------------------------------------------- *"*"Interfase local *" IMPORTING *" REFERENCE(KUNNR) TYPE ICNUM *" EXPORTING *" REFERENCE(RESP) TYPE SY-SUBRC *" REFERENCE(RUTHIGH) TYPE ICNUM *" REFERENCE(RUTLOW) TYPE ICNUM *" REFERENCE(RINGLOW) TYPE ICNUM *"---------------------------------------------------------------------- DATA: rut TYPE char50, rut_aux TYPE char50, rut_cort TYPE char50, dv(01) TYPE c, dv_aux TYPE c, nmax TYPE i, nroc TYPE i, suma TYPE i, contador TYPE i, long TYPE i, kunnr2 TYPE kna1_bf-stcd1. rut = kunnr. TRANSLATE rut USING '- '. CONDENSE rut NO-GAPS. CALL FUNCTION 'CONVERSION_EXIT_ALPHA_OUTPUT' EXPORTING * input = kunnr input = rut IMPORTING output = rut. long = STRLEN( rut ). IF long = 8. CONCATENATE rut+0(7) '-' rut+7(8) INTO rut. ENDIF. IF long = 9. CONCATENATE rut+0(8) '-' rut+8(9) INTO rut. ENDIF. TRANSLATE rut TO UPPER CASE. CONDENSE rut NO-GAPS. * Quito caracteres no correspondientes long = STRLEN( rut ). contador = 0. resp = 0. IF long < 2. resp = 4. ENDIF. CHECK long >= 2. DO long TIMES. IF rut+contador(01) CO '0123456789Kk'. CONCATENATE rut_aux rut+contador(01) INTO rut_aux. ringlow = rut_aux. ENDIF. ADD 1 TO contador. ENDDO. rut = rut_aux. CONDENSE rut NO-GAPS. IF NOT ( rut IS INITIAL ). long = STRLEN( rut ). long = long - 1. dv = rut+long(1). nmax = long - 1. rut_aux = rut+0(long). contador = 2. DO long TIMES. nroc = rut_aux+nmax(01). suma = suma + ( nroc * contador ). nmax = nmax - 1. contador = contador + 1. IF contador > 7. contador = 2. ENDIF. ENDDO. suma = 11 - suma MOD 11. IF suma = 10. dv_aux = 'K'. ELSEIF suma > 10. dv_aux = '0'. ELSE. dv_aux = suma. ENDIF. IF dv NE dv_aux. resp = 4. ENDIF. ELSE. resp = 4. "Incorrecto. ENDIF. CONCATENATE rut_aux '-' dv_aux INTO ruthigh. CONCATENATE rut_aux dv_aux INTO rutlow. * Validar Guión XL ( ALT 196 ) * Validar Rut contenga caracteres válidos kunnr2 = kunnr. CALL FUNCTION 'TAX_NUMBER_CHECK' EXPORTING country = 'CL' * NATURAL_PERSON_FLAG = 'X' * REGION = ' ' * STKZU = ' ' tax_code_1 = kunnr2 * TAX_CODE_2 = ' ' * TYPE_OF_TAX_CODE_1 = ' ' * TAX_CODE_3 = ' ' * TAX_CODE_4 = ' ' EXCEPTIONS not_valid = 1 different_fprcd = 2 OTHERS = 3 . IF sy-subrc <> 0. resp = 4. ENDIF. * Validar como máximo 10 caracteres long = STRLEN( kunnr ). IF long > 10. resp = 4. ENDIF. ENDFUNCTION.
Ayuda de búsqueda en dynpro para Fecha-Hora
Caso: Se desea agregar un matchcode en campos de fecha y hora de una dynpro.
Solución: En el ejemplo, se utilizan las ayudas de búsqueda CACS_CALENDAR y SRM_F4_UZEIT para mostrar el matchcode correspondiente a cada caso.
1. Para la fecha
Quedando al presionar el matchcode:
2. Para la hora
Presionando el matchcode muestra: