Líder SAP ABAP
LSA-CM
LSA-CM
Create successful ePaper yourself
Turn your PDF publications into a flip-book with our unique Google optimized e-Paper software.
<strong>Líder</strong> <strong>SAP</strong><br />
<strong>ABAP</strong><br />
Controle la calidad de sus desarrollos, vigile que<br />
sus desarrolladores trabajen de manera<br />
homogénea, enfoque su estrategia de desarrollo.<br />
¡Aprenda cómo!<br />
GUPTON BRAZILE<br />
P á g i n a | 1
Todos los derechos reservados. Ninguna parte de este libro se puede<br />
reproducir, almacenar en sistema alguno de recuperación, o transmitir<br />
en ninguna forma, o por ningún medio electrónico, mecánico,<br />
fotocopia, grabación o cualquier otro, sin la autorización escrita del<br />
editor.<br />
© Gupton Brazile<br />
email: Gupton.brazile@hotmail.com<br />
REGISTRO SAFECREATIVE: 1602296717113<br />
P á g i n a | 2
<strong>Líder</strong> <strong>SAP</strong><br />
<strong>ABAP</strong><br />
Por Gupton Brazile<br />
P á g i n a | 3
Deuteronomio 28:8<br />
”Jehová enviará su bendición sobre tus graneros y sobre<br />
todo aquello en que pongas tu mano, y te bendecirá en<br />
la tierra que Jehová, tu Dios, te da.”<br />
Reina-Valera 1960 (RVR1960)<br />
Copyright © 1960 by American Bible Society<br />
P á g i n a | 4
Agradecimientos<br />
A mi Dios, de quien soy y a quien sirvo. Que<br />
todo lo puede, y en quien todo lo puedo.<br />
A mis hijos, que me mueven siempre a ser<br />
mejor, Dami y Ángel.<br />
P á g i n a | 5
CONTENIDO<br />
Agradecimientos ......................................................................................... 5<br />
CONTENIDO ........................................................................................... 6<br />
Introducción................................................................................................ 7<br />
Capítulo 1 Evaluar dónde estamos ............................................................ 9<br />
Capítulo 2 Reporte de Órdenes de Transporte ...................................... 12<br />
Capítulo 3 Analizando el Trabajo de los Desarrolladores ...................... 26<br />
Capítulo 4 Configurando el Code Inspector ............. ¡Error! Marcador no<br />
definido.<br />
Capítulo 5 Analizando los Dumps en el ambiente Productivo ....... ¡Error!<br />
Marcador no definido.<br />
Capítulo 6 Creación de Estándares de Desarrollo en <strong>ABAP</strong> .......... ¡Error!<br />
Marcador no definido.<br />
Capítulo 7 Conclusiones ............................. ¡Error! Marcador no definido.<br />
P á g i n a | 6
Introducción<br />
Cuando uno se dedica mucho tiempo a la programación en<br />
<strong>SAP</strong> <strong>ABAP</strong> (1), suele suceder después de un tiempo que ve<br />
otros proyectos de tecnología, nace el deseo en uno de poder<br />
dirigir proyectos pues considera que ya se tiene suficiente<br />
experiencia para poder liderar empresas de ese estilo.<br />
A veces, lo que uno quiere es ir avanzando en su carrera y<br />
pasar de ser un simple programador, a llegar a ser el líder de<br />
un equipo de programadores y desarrolladores. Para lograr<br />
esto, no solo se necesita conocer bien el lenguaje de<br />
programación <strong>ABAP</strong>, sino que también es necesario conocer<br />
algunas de las otras herramientas que ofrece <strong>SAP</strong> (1), ya sea<br />
transacciones de uso común por funcionales o BASIS, para<br />
poder mejorar, digamos, el rendimiento del sistema o de los<br />
programas. Sabemos que <strong>SAP</strong> es una herramienta basada en<br />
procesos y en las mejores prácticas para llevar a cabo esos<br />
procesos, así que para poder realizar mejor los desarrollos<br />
hechos en <strong>ABAP</strong>, se vuelve necesario conocer un poco al<br />
menos de estos procesos que afectan al sistema ERP.<br />
El objetivo de este libro, es mostrar algunas de estas<br />
transacciones, a fin de poder guiar un área de desarrolladores<br />
de <strong>ABAP</strong> hacia la mejora continua en la entrega de los<br />
programas, a fin de evitar errores en los ambientes de<br />
producción del sistema, homogeneizar la calidad de los<br />
programas, y estandarizar las buenas prácticas de desarrollo<br />
dentro de la misma, para que con el tiempo se liberen<br />
mejores programas, tener un mínimo de errores, poder<br />
P á g i n a | 7
cuantificar la efectividad del equipo de desarrollo, evaluar la<br />
cantidad de trabajo desarrollada por el equipo, conocer los<br />
miembros más productivos del mismo, y detectar áreas de<br />
oportunidad en los desarrollos elaborados en el área, a fin de<br />
siempre mejorar la calidad de los desarrollos y mitigar los<br />
errores que afectan el sistema.<br />
Aclaro: éste NO ES un libro sobre programación en <strong>ABAP</strong>.<br />
Aquí doy por sentado que el lector ya sabe programar mejor<br />
que peor en el lenguaje de programación <strong>ABAP</strong>, y ya ha<br />
tenido algo de experiencia en este campo.<br />
Dicho esto, le invito a que siga leyendo para que aprenda<br />
algunas de las actividades que puede realizar para llevar a cabo<br />
todo lo anterior.<br />
Gupton Brazile<br />
(1) <strong>SAP</strong>, R/3, my<strong>SAP</strong>, my<strong>SAP</strong>.com, xApps, xApp y otros servicios y productos <strong>SAP</strong><br />
mencionados aquí, como también los respectivos logos son marcas registradas de<br />
<strong>SAP</strong> AG en Alemania y en otros países del mundo. Todos los demás productos y<br />
servicios mencionados son marcas registradas de sus respectivas compañías. Datos<br />
contenidos en este documento sirven solo para propósitos de información. Las<br />
especificaciones nacionales de los productos pueden variar en cada país.<br />
P á g i n a | 8
Capítulo 1<br />
Evaluar dónde estamos<br />
El primer paso antes de llevar a cabo cualquier plan, es<br />
saber en dónde estamos parados. Después de esto, definir a<br />
dónde queremos llegar. El siguiente paso, definir nuestra<br />
estrategia para logarlo.<br />
Entonces, la primera actividad que deberíamos evaluar, es<br />
conocer cuántos programas se están desarrollando cada día,<br />
cada semana o cada mes, separar los que están liberados de<br />
los que aún están modificándose (para solo enfocarnos en los<br />
ya liberados), y evaluar los que ya se liberaron para darnos una<br />
idea de la cantidad de trabajo que se está realizando por<br />
nuestros desarrolladores, y conocer la cantidad de errores que<br />
tienen dichos programas, a fin de poder mejorar con el<br />
tiempo.<br />
La segunda actividad, sería definir cuál es la meta de<br />
transportes, y un límite de errores al que queremos llegar,<br />
para que no se pase nunca de dicho límite. Es decir, si por<br />
ejemplo, al recabar la información (ya veremos cómo hacer<br />
esto), nos diera como resultado que se hicieron, no sé, 240<br />
órdenes de transporte, y de todas ellas nos da un total de<br />
1,650 errores, tal vez querríamos que el mes siguiente,<br />
tomando algunas acciones, pudiéramos reducir los errores<br />
para que no pasen de 1,500 y que cada mes pudiéramos irlos<br />
bajando en 100, al cabo de 10 meses la meta sería llegar con<br />
esas mismas 240 órdenes de transporte, pero que no tuvieran<br />
más de 150 errores.<br />
P á g i n a | 9
¿Cómo lograr esto? Bueno, pues hay que definir una<br />
estrategia, que era nuestro tercer paso. Se me ocurre sugerir<br />
que se debe redactar un estándar de mejores prácticas de<br />
desarrollo en <strong>ABAP</strong>, procedimientos para hacer que la gente<br />
lo conozca y lo ponga en práctica, y posteriormente enfocarse<br />
en darle seguimiento.<br />
En los siguientes capítulos vamos a ver un programa que<br />
recaba las órdenes transporte, la fecha de creación, el usuario<br />
creador del mismo, una breve descripción, y si está liberado o<br />
no.<br />
También veremos, un ejemplo de un procedimiento donde se<br />
redactan los pasos que cualquier desarrollador del área debe<br />
conocer, leer, y comprometerse a aplicar.<br />
Posteriormente, veremos cómo crear una hoja de cálculo<br />
donde se agregarán los errores de cada orden de transporte<br />
para poder evaluarlos en una hoja dinámica, y donde<br />
podremos analizar la cantidad de transportes liberados,<br />
modificados, los errores mensuales, los programadores más<br />
apegados al estándar, el que libera más transportes, y el que<br />
menos.<br />
Además de los puntos que se mencionan arriba, otra de las<br />
cosas que deben entrar en el alcance de lo que un buen líder<br />
de <strong>SAP</strong> <strong>ABAP</strong> tiene que hacer, es conocer la cantidad de<br />
DUMPs que suceden en el sistema de producción. Usted<br />
podría preguntar “¿pero qué eso no es tarea de los BASIS?”.<br />
En parte sí, pero también algunos de los DUMPs (no sabemos<br />
ahorita cuáles) pueden ser causa de una mala programación,<br />
no necesariamente debido a la falta de aplicación de alguna<br />
nota de <strong>SAP</strong>. Y esto hace que el problema caiga en nuestra<br />
cancha, y no en la del área de BASIS.<br />
P á g i n a | 10
Viéndolo con este punto de vista, necesitamos bajar los<br />
DUMPs de producción, clasificarlos en una hoja de cálculo<br />
también, de manera que podamos saber cuántos dumps caen<br />
por día, hacer una estratificación semanal, ver cuántos y cuáles<br />
son los programas afectados haciendo un Pareto de los<br />
mismos para siempre enfocarnos en el 80-20 más relevante,<br />
cuáles son los usuarios más afectados y también hacer un<br />
Pareto (de hecho, yo sugiero en todo lo que se va a comentar,<br />
que siempre se trabaje siguiendo la técnica de Pareto, que<br />
consiste en ordenar los problemas por cantidad y tipo de<br />
mayor a menor, y enfocarse en el 20% principal, pues<br />
comúnmente este 20% suele resolver el 80% de los<br />
problemas. Lo veremos más adelante), y también ver la<br />
clasificación de cuáles son los tipos de error más comunes,<br />
con su respectivo Pareto.<br />
Como menciono, trabajar con Paretos nos va a dar la pauta de<br />
siempre enfocarnos en los problemas más serios y atacarlos en<br />
este orden va a hacer que nuestro esfuerzo rinda más frutos<br />
rápidamente.<br />
Por último, con la información que vayamos obteniendo,<br />
iremos definiendo nuestros KPIs (Key Performance<br />
Indicators – Indicadores Clave de Rendimiento) y veremos si<br />
vamos mejorando o no.<br />
Estoy seguro que si comienza a hacer esto, además de la<br />
programación que tanto le encanta, podrá granjearse con su<br />
jefe un puesto de liderazgo en su equipo de <strong>ABAP</strong>.<br />
Comencemos!!<br />
P á g i n a | 11
Capítulo 2<br />
Reporte de Órdenes de<br />
Transporte<br />
A continuación presento un programa que le va a ser útil<br />
para conocer la cantidad de órdenes de transporte que se<br />
realizan día con día en su ambiente de desarrollo. Si copia<br />
usted y pega el código en un reporte de <strong>ABAP</strong>, podrá obtener<br />
la información que comentamos en el capítulo anterior (o al<br />
menos una parte) y veremos después cómo ir agregando la<br />
parte de los errores, que desafortunadamente, es una parte<br />
que hay que hacer manualmente.<br />
Nota: aclaro que tanto el programa como los ejemplos de<br />
reportes en Excel que comento en este libro, están disponibles<br />
como ejemplos para facilitar su uso en una liga que viene al<br />
final de este libro, por si no quiere ir siguiendo paso por paso<br />
la creación del programa o la elaboración de las hojas de<br />
cálculo mencionadas aquí, y se le facilita más copiarlas y solo<br />
vaciar sus datos sobre los ejemplos.<br />
Por favor, copie el programa de abajo y actívelo en su<br />
mandante de desarrollo. No tiene que generarle transporte, así<br />
que lo puede manejar como sólo local.<br />
*&-------------------------------------------------------<br />
--------------*<br />
*& Report ZALV_ORDEN<br />
*&<br />
*&-------------------------------------------------------<br />
--------------*<br />
*&<br />
P á g i n a | 12
*& Nombre del Programa: <br />
*& Paquete<br />
: <br />
*& Transacción : <br />
*& Creado por<br />
: <br />
*& Creado el<br />
: <br />
*& Descripción : <br />
*&<br />
*&-------------------------------------------------------<br />
--------------*<br />
*& Log de Modificaciones<br />
*&-------------------------------------------------------<br />
--------------*<br />
*& Transporte : <br />
*& Modificado por : <br />
*& Modified el : <br />
*& Descripción : <br />
*&-------------------------------------------------------<br />
--------------*<br />
REPORT zalv_orden NO STANDARD PAGE HEADING.<br />
*&-------------------------------------------------------<br />
--------------*<br />
*& START-OF-SELECTION<br />
*&-------------------------------------------------------<br />
--------------*<br />
START-OF-SELECTION.<br />
PERFORM llenar_datos.<br />
PERFORM llenar_alv.<br />
PERFORM llenar_encabezado.<br />
PERFORM crear_alv.<br />
END-OF-SELECTION.<br />
*&-------------------------------------------------------<br />
--------------*<br />
*& Include<br />
ZAFCOGLR011_TOP<br />
*&-------------------------------------------------------<br />
--------------*<br />
* Tablas<br />
TYPE-POOLS: slis.<br />
" ALV<br />
TABLES:<br />
e070.<br />
P á g i n a | 13
*&-------------------------------------------------------<br />
--------------*<br />
*& VARIABLES GLOBALES<br />
*&-------------------------------------------------------<br />
--------------*<br />
DATA:<br />
g_encab(45) TYPE c VALUE 'Reporte de Órdenes de T<br />
ransporte', "Encabezado<br />
g_langu LIKE sy-langu,<br />
g_pspnr(24) TYPE c,<br />
g_lineas TYPE i,<br />
g_aibu TYPE c VALUE ' '.<br />
*&-------------------------------------------------------<br />
--------------*<br />
*& TYPES<br />
*&-------------------------------------------------------<br />
--------------*<br />
TYPES:<br />
ty_e070 LIKE e070,<br />
ty_e07t LIKE e07t.<br />
TYPES:<br />
BEGIN OF t_tabla,<br />
trkorr TYPE e070-trkorr, " TRANSPORTE<br />
tarsystem TYPE e070-tarsystem, " DESTINO DE TRANSPORTE<br />
as4user TYPE e070-as4user, " USUARIO<br />
as4date TYPE e070-as4date, " FECHA<br />
as4text TYPE e07tas4text,<br />
" DESCRIPCION DE LA ORDEN DE TRANSPORTE<br />
statu(11) TYPE c,<br />
" ESTATUS<br />
END OF t_tabla.<br />
*&-------------------------------------------------------<br />
--------------*<br />
*& TABLAS INTERNAS<br />
*&-------------------------------------------------------<br />
--------------*<br />
DATA:<br />
t_orden TYPE SORTED TABLE OF ty_e070 WITH UNIQUE<br />
KEY trkorr WITH HEADER LINE,<br />
t_tarea TYPE STANDARD TABLE OF ty_e070 WITH HEADER<br />
LINE,<br />
t_texto TYPE SORTED TABLE OF ty_e07t WITH UNIQUE<br />
KEY trkorr WITH HEADER LINE, " Idioma<br />
w_texto LIKE LINE OF t_texto,<br />
w_are_e070 TYPE ty_e070,<br />
w_are_e07t TYPE ty_e07t.<br />
P á g i n a | 14
*&-------------------------------------------------------<br />
--------------*<br />
*& CONSTANTES GLOBALES<br />
*&-------------------------------------------------------<br />
--------------*<br />
CONSTANTS: c_program(11) TYPE c VALUE 'ZALV_ORDEN',<br />
c_x TYPE c VALUE 'X',<br />
c_back<br />
TYPE char5 VALUE 'BACK',<br />
c_a TYPE c VALUE 'A',<br />
c_err(64) TYPE c VALUE 'No existen re<br />
gistros!!!'. "#EC NOTEXT<br />
DATA: c_trkorr(6) TYPE c VALUE 'TRKORR',<br />
c_tarsystem(9) TYPE c VALUE 'TARSYSTEM',<br />
c_as4user(7) TYPE c VALUE 'AS4USER',<br />
c_as4date(7) TYPE c VALUE 'AS4DATE',<br />
c_as4text(7) TYPE c VALUE 'AS4TEXT',<br />
c_statu(5) TYPE c VALUE 'STATU'.<br />
*&-------------------------------------------------------<br />
--------------*<br />
*& TABLAS PARA ALV<br />
*&-------------------------------------------------------<br />
--------------*<br />
DATA: t_salida TYPE STANDARD TABLE OF t_tabla WITH HEAD<br />
ER LINE,<br />
t_tabla TYPE STANDARD TABLE OF t_tabla WITH HEAD<br />
ER LINE, "tabla principal<br />
t_title TYPE slis_listheader OCCURS 0.<br />
*&-------------------------------------------------------<br />
--------------*<br />
*& AREAS DE TRABAJO<br />
*&-------------------------------------------------------<br />
--------------*<br />
DATA: w_salida LIKE t_salida,<br />
w_title TYPE slis_listheader, " ListHeader<br />
w_tabla LIKE t_tabla.<br />
*&-------------------------------------------------------<br />
--------------*<br />
*& ALV<br />
*&-------------------------------------------------------<br />
--------------*<br />
DATA: catalcamps TYPE slis_t_fieldcat_alv,<br />
opciosalid TYPE slis_layout_alv,<br />
t_sort TYPE slis_t_sortinfo_alv WITH HEADER L<br />
INE,<br />
P á g i n a | 15
INE.<br />
st_events TYPE slis_t_event WITH HEADER L<br />
DATA: st_t_event TYPE slis_alv_event,<br />
l_estructura LIKE dd02l-tabname.<br />
DATA:<br />
w_top_of_page TYPE slis_formname VALUE 'TOP_O<br />
F_PAGE',<br />
w_user_command TYPE slis_formname VALUE 'USER_<br />
COMMAND',<br />
w_pf_status_set TYPE slis_formname VALUE 'PF_ST<br />
ATUS_SET',<br />
gt_list_top_of_page TYPE slis_t_listheader.<br />
TYPES: BEGIN OF log,<br />
field1(15),<br />
field2(100),<br />
END OF log.<br />
DATA: t_bdcdata TYPE STANDARD TABLE OF bdcdata WITH<br />
HEADER LINE,<br />
t_messages TYPE STANDARD TABLE OF bdcmsgcoll WITH<br />
HEADER LINE,<br />
t_log TYPE STANDARD TABLE OF log WITH<br />
HEADER LINE,<br />
t_class TYPE STANDARD TABLE OF sclass WITH<br />
HEADER LINE,<br />
t_objectdata TYPE STANDARD TABLE OF clobjdat WITH<br />
HEADER LINE.<br />
DATA: ls_line<br />
DATA: c_vbtyp_v<br />
TYPE slis_listheader.<br />
LIKE vbfa-vbtyp_v VALUE 'C'.<br />
*&-------------------------------------------------------<br />
--------------*<br />
*& SELECTION SCREEN, SELECT-OPTIONS & PARAMETERS<br />
*&-------------------------------------------------------<br />
--------------*<br />
SELECTION-<br />
SCREEN BEGIN OF BLOCK block1 WITH FRAME TITLE textt01.<br />
" PARAMETROS DE SELECCION<br />
SELECT-OPTIONS:<br />
s_user FOR e070-as4user DEFAULT sy-uname, " USUARIO<br />
s_data FOR e070-as4date DEFAULT sy-datum. " FECHA<br />
SELECTION-SCREEN END OF BLOCK block1.<br />
P á g i n a | 16
*Selection texts<br />
*--------------------------------------------------------<br />
--<br />
* P_USER Usuario<br />
* S_DATA Fecha<br />
*Text elements<br />
*--------------------------------------------------------<br />
--<br />
* 001 Transporte<br />
* 002 Usuario<br />
* 003 Fecha<br />
* 004 Descripción de la orden de transporte<br />
* 005 Estatus<br />
*&-------------------------------------------------------<br />
--------------*<br />
*& Include<br />
ZAFCOGLR011_F001<br />
*&-------------------------------------------------------<br />
--------------*<br />
*&-------------------------------------------------------<br />
--------------*<br />
*& Form VALIDAR_SEGURIDAD<br />
*&-------------------------------------------------------<br />
--------------*<br />
* text<br />
*--------------------------------------------------------<br />
--------------*<br />
* --> p1 text<br />
* p1 text<br />
*
CLEAR catalcamps.<br />
REFRESH catalcamps.<br />
* ACTIVAR OPCIONES DE PRESENTACIÓN O SALIDA<br />
opciosalidcolwidth_optimize<br />
= c_x. "Optimiza ancho de columnas del<br />
ALV<br />
opciosalidzebra<br />
= c_x. "Hace patron de zebra en el ALV<br />
t_sortfieldname<br />
= c_trkorr. " Campo por el que se ordena el ALV<br />
t_sort-up = c_x. " Ordena ascendentemente<br />
APPEND t_sort.<br />
" Anexa a la tabla de orden<br />
amiento<br />
DATA: ls TYPE slis_fieldcat_alv.<br />
REFRESH catalcamps.<br />
CLEAR catalcamps.<br />
CLEAR ls.<br />
ls-fieldname = c_trkorr.<br />
ls-seltext_l = text-001. " TRANSPORTE<br />
ls-key<br />
= c_x.<br />
APPEND ls TO catalcamps.<br />
CLEAR ls.<br />
ls-fieldname = c_tarsystem.<br />
ls-seltext_l = text-006. " DESTINO DE TRANSPORTE<br />
ls-key<br />
= c_x.<br />
APPEND ls TO catalcamps.<br />
CLEAR ls.<br />
ls-fieldname = c_as4user.<br />
ls-seltext_l = text-002. " USUARIO<br />
* ls-key = c_x.<br />
APPEND ls TO catalcamps.<br />
CLEAR ls.<br />
ls-fieldname = c_as4date.<br />
ls-seltext_l = text-003. " FECHA<br />
ls-key<br />
= c_x.<br />
APPEND ls TO catalcamps.<br />
CLEAR ls.<br />
ls-fieldname = c_as4text.<br />
ls-seltext_l = text-<br />
004. " DESCRIPCION DE LA ORDEN DE T.<br />
APPEND ls TO catalcamps.<br />
P á g i n a | 18
CLEAR ls.<br />
ls-fieldname = c_statu.<br />
ls-seltext_l = text-005. " ESTATUS<br />
APPEND ls TO catalcamps.<br />
CLEAR st_events .<br />
st_events-name = 'TOP_OF_PAGE'. "Coloca encabezado<br />
st_eventsform<br />
= 'LLENAR_ENCABEZADO'. "Rutina del encabezado<br />
APPEND st_events .<br />
* Asigna a l_lineas el número de líneas encontradas con e<br />
l criterio de selección<br />
DESCRIBE TABLE t_salida LINES g_lineas.<br />
IF g_lineas EQ 0.<br />
MESSAGE c_err TYPE c_a. " No existen datos para los c<br />
riterios de selección suministrados.<br />
ELSE.<br />
CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY'<br />
EXPORTING<br />
i_callback_program = 'ZALV_ORDEN' " De aquí toma lo<br />
s encabezados<br />
is_layout<br />
= opciosalid<br />
it_fieldcat = catalcamps<br />
it_events<br />
= st_events[]<br />
it_sort<br />
= t_sort[]<br />
i_save<br />
= 'A'<br />
TABLES<br />
a el ALV<br />
ENDIF.<br />
ENDFORM.<br />
t_outtab<br />
= t_salida. " Tabla interna par<br />
" CREAR_ALV<br />
*&-------------------------------------------------------<br />
--------------*<br />
*& Form LLENAR_DATOS<br />
*&-------------------------------------------------------<br />
--------------*<br />
* text<br />
*--------------------------------------------------------<br />
--------------*<br />
* --> p1 text<br />
*
--------------*<br />
FORM llenar_datos.<br />
CLEAR: t_orden, t_tarea, t_texto.<br />
SELECT *<br />
INTO TABLE t_tarea<br />
FROM e070<br />
WHERE as4user IN s_user<br />
AND as4date IN s_data.<br />
IF sy-subrc 0.<br />
MESSAGE 'No se encontraron datos en la tabla E070.' T<br />
YPE 'I' .<br />
ENDIF.<br />
SORT t_tarea BY strkorr.<br />
DELETE ADJACENT DUPLICATES FROM t_tarea COMPARING strko<br />
rr.<br />
DELETE t_tarea WHERE strkorr IS INITIAL.<br />
IF NOT t_tarea[] IS INITIAL.<br />
SELECT *<br />
INTO TABLE<br />
t_orden<br />
FROM<br />
e070<br />
FOR ALL ENTRIES IN t_tarea<br />
WHERE<br />
trkorr EQ t_tarea-strkorr.<br />
IF sy-subrc EQ 0.<br />
SELECT *<br />
INTO TABLE<br />
t_texto<br />
FROM<br />
e07t<br />
FOR ALL ENTRIES IN t_orden<br />
WHERE<br />
trkorr EQ t_orden-trkorr AND<br />
langu EQ sy-langu OR<br />
langu EQ 'EN'. " RI20090-<br />
20140519 Encuentra la descripción en inglés<br />
DELETE ADJACENT DUPLICATES FROM t_texto COMPARING t<br />
rkorr.<br />
ENDIF.<br />
ENDIF.<br />
* Mueve los registros de tab_orden a la tabla de salida d<br />
el ALV<br />
LOOP AT t_orden.<br />
MOVE-CORRESPONDING t_orden TO t_tabla.<br />
CASE t_orden-trstatus.<br />
WHEN 'A' OR 'D' OR 'L'.<br />
t_tabla-statu = 'Modificable'.<br />
WHEN OTHERS.<br />
P á g i n a | 20
t_tabla-statu = 'Liberada'.<br />
ENDCASE.<br />
APPEND t_tabla.<br />
ENDLOOP.<br />
LOOP AT t_texto.<br />
READ TABLE t_tabla WITH KEY trkorr = t_texto-trkorr.<br />
IF sy-subrc EQ 0.<br />
MOVE t_texto-as4text TO t_tabla-as4text.<br />
MODIFY t_tabla INDEX sy-tabix.<br />
ENDIF.<br />
ENDLOOP.<br />
ENDFORM.<br />
" LLENAR_DATOS<br />
*&-------------------------------------------------------<br />
--------------*<br />
*& Form LLENAR_ENCABEZADO<br />
*&-------------------------------------------------------<br />
--------------*<br />
* text<br />
*--------------------------------------------------------<br />
--------------*<br />
* --> p1 text<br />
*
w_title-typ = c_subtitle. " 'S' Tamaño estándar<br />
w_titleinfo<br />
= l_subtitulo. " Valor del encabezado secundario<br />
APPEND w_title TO t_title.<br />
CLEAR w_title.<br />
CALL FUNCTION 'REUSE_ALV_COMMENTARY_WRITE'<br />
EXPORTING<br />
it_list_commentary = t_title[].<br />
ENDFORM.<br />
" LLENAR_ENCABEZADO<br />
*&-------------------------------------------------------<br />
--------------*<br />
*& Form LLENAR_ALV<br />
*&-------------------------------------------------------<br />
--------------*<br />
* text<br />
*--------------------------------------------------------<br />
--------------*<br />
* --> p1 text<br />
*
Figura 1. Reporte de Órdenes de Transporte.<br />
Puede meter como parámetros de entrada, un * (asterisco) en<br />
el usuario, para indicarle al programa que quiere que<br />
despliegue las órdenes de transporte de TODOS los usuarios,<br />
y en la fecha, darle la fecha del mes en curso, por ejemplo, del<br />
01.02.2016 al 29.02.2016. El resultado, sería algo parecido al<br />
de la figura 2, reporte de órdenes de transporte.<br />
Figura 2. Resultado del Reporte de Órdenes de Transporte.<br />
P á g i n a | 23
Para poder trabajar con este reporte, va a ser necesario<br />
descargarlo a una hoja de cálculo, por lo que seguiremos los<br />
siguientes pasos:<br />
1. Hacer clic en el ícono de Fichero local.<br />
2. Seleccionar de la ventana Grabar lista fichero la opción<br />
Texto con tabuladores, y hacer clic en el ícono de<br />
aceptar .<br />
3. Después, hay que seleccionar una carpeta para guardar<br />
nuestro archivo de Excel, digamos, C:\ y darle un nombre,<br />
que bien podría ser ORDENES_201602.xls<br />
P á g i n a | 24
4. Hacemos clic en el botón crear y listo, nuestro archivo ya se<br />
debió haber grabado.<br />
Nuestro archivo deberá ser algo como el que se muestra a<br />
continuación.<br />
Figura 3. Resultado en Excel del Reporte de Órdenes de<br />
Transporte.<br />
Ahora tenemos que procesarlo, como indicaremos en el<br />
próximo capítulo.<br />
P á g i n a | 25
Capítulo 3<br />
Analizando el Trabajo de los<br />
Desarrolladores<br />
Ahora con el archivo resultante del capítulo anterior, hay<br />
que trabajar para irlo transformando y obtener todos los<br />
indicadores que necesitamos referentes a las órdenes liberadas<br />
por el equipo de desarrollo.<br />
Lo primero, es agregar una columna con el nombre del<br />
usuario, a fin de tener este detalle en el reporte. Al final debe<br />
quedar como la figura 4.<br />
Figura 4. Se inserta la columna NOMBRE para agregar el<br />
nombre del usuario que programó dicho transporte.<br />
Solo para no dejar con la duda a nadie, puede usar la<br />
transacción SU01D para que, dado el usuario, conocer el<br />
nombre del mismo. Ver Figura 5 a, b y c.<br />
P á g i n a | 26
Figura 5 a. Se introduce la transacción su01d.<br />
Figura 5 b. Se introduce el usuario y se presiona el ícono de<br />
los lentes .<br />
P á g i n a | 27
Figura 5 c. Se ve el nombre completo de dicho usuario.<br />
P á g i n a | 28
o<br />
<strong>Líder</strong><br />
<strong>SAP</strong><br />
<strong>ABAP</strong><br />
GUPTON BRAZILE<br />
Conocer si sus programadores se están<br />
apegando a los estándares definidos en<br />
la empresa, saber cuántos errores se<br />
liberan cada mes por programador, quién<br />
es el que más transportes libera, o tener<br />
un pareto de los programas más<br />
afectados en su sistema, y los usuarios<br />
más afectados por los errores de<br />
programación y así poder hacer una<br />
estrategia de mejora continua en su área,<br />
son algunas de las cosas que se enseñan<br />
en este libro.<br />
Defina sus estrategias de mejora en <strong>SAP</strong><br />
basado en transacciones comunes,<br />
aunado a un programa que le ayudará a<br />
tener el control y la visibilidad de la<br />
calidad de los transportes liberados en su<br />
empresa.<br />
Gupton Brazile<br />
Nació en Poza Rica, Veracruz el 27 de Septiembre de 1969.<br />
Es Ingeniero en Computación y Consultor de <strong>SAP</strong>,<br />
aficionado a las artes marciales y la lectura ecléctica. Este<br />
es su cuarto libro.<br />
P á g i n a | 29