Press "Enter" to skip to content

Programa ABAP para crear selecciones para BI en Infopakage

admin 0

Bueno, en ocasiones me toca hacer algunas cosas realmente difíciles y que me hacen pensar mucho para encontrar la solución correcta, como lo es este sencillo programita, que aunque sencillo, no resulto nada sencillo de imaginar, pero se los dejo para si a alguien le ayuda de algo, bueno platicando el escenario, Tengo una tabla en la que inserto todos los valores que quiero que un extractor filtre y cargue a BI, esto con el propósito de actualizar la información de manera automática, ya que la tabla es llenada por otro programa y me acota la información errónea de un extractor que debe ser corregida, basado en esto lo que hago es tomar la tabla y crear las selecciones, aquí el código:


program conversion_routine.
* Type pools used by conversion program
type-pools: rsarc, rsarr, rssm.
tables: rssdlrange.
* Global code used by conversion rules
*$*$ begin of global - insert your declaration only below this line *-*
* TABLES: ...
* DATA: ...
*$*$ end of global - insert your declaration only before this line *-*
* -------------------------------------------------------------------
* InfoObject =
* Fieldname = RANL
* data type = CHAR
* length = 000013
* convexit = ALPHA
* -------------------------------------------------------------------
form compute_RANL
tables l_t_range structure rssdlrange
using p_infopackage type rslogdpid
p_fieldname type rsfnm
changing p_subrc like sy-subrc.
* Insert source code to current selection field
*$*$ begin of routine - insert your code only below this line *-*
data: l_idx like sy-tabix,
it_cmldelta type TABLE OF ZCMLDELTA WITH HEADER LINE,
v_ranlow type /BI0/OIFS_CTR_NO,
v_ranligh type /BI0/OIFS_CTR_NO,
v_ranlcomp type /BI0/OIFS_CTR_NO,
v_cont type i.
*read table l_t_range with key
* fieldname = 'RANL'.
*IF sy-subrc eq 0.
l_idx = sy-tabix.
* modify l_t_range index l_idx.
*ENDIF.
*BREAK-POINT: 'dbenavides'.
refresh: it_cmldelta.
SELECT *
FROM ZCMLDELTA INTO CORRESPONDING FIELDS OF TABLE it_cmldelta
WHERE RANL BETWEEN '3000000000000' AND '3099999999999'.
IF sy-subrc eq 0.
* limpiar duplicados
SORT it_cmldelta BY RANL ASCENDING.
DELETE ADJACENT DUPLICATES FROM it_cmldelta COMPARING RANL.
* Insertar filtros
v_cont = 1.
LOOP AT it_cmldelta.
CLEAR: l_t_range-high.
if v_cont = 1.
v_ranlow = it_cmldelta-RANL.
v_ranlcomp = v_ranlow + 1.
v_cont = 2.
else.
v_ranligh = it_cmldelta-RANL.
ENDIF.
IF v_ranligh is not INITIAL.
IF v_ranlcomp EQ v_ranligh.
v_ranlcomp = v_ranlcomp + 1.
v_cont = 3.
else.
IF v_cont EQ 3.
l_t_range-FIELDNAME = 'RANL'.
l_t_range-SIGN = 'I'.
l_t_range-OPTION = 'BT'.
l_t_range-LOW = v_ranlow.
l_t_range-high = v_ranlcomp - 1.
append l_t_range.
v_ranlow = v_ranligh.
v_ranlcomp = v_ranlow + 1.
v_cont = 2.
else.
l_t_range-FIELDNAME = 'RANL'.
l_t_range-SIGN = 'I'.
l_t_range-OPTION = 'EQ'.
l_t_range-LOW = v_ranlow.
append l_t_range.
v_ranlow = v_ranligh.
v_ranlcomp = v_ranlow + 1.
ENDIF.
ENDIF.
ENDIF.
ENDLOOP.
ENDIF.
DELETE l_t_range WHERE LOW = ''.
*....
p_subrc = 0.
*$*$ end of routine - insert your code only before this line *-*
endform. "

Lo que hace este código es simplemente tomar una tabla con valores y definir si hay consecutivos, si los hay se genera un rango y determina el inicio y final, si no se ponen los  valores directamente, por ejemplo:

Contrato
1
2
3
4
8
13
 

Tomando lo anterior el programa crearía lo siguiente para ser insertado en el infopackage:

1 – 4
8
13