2013 Mar 20 3:19 PM
Hi Experts,
I´m very bad with abap programing, and I´m trying to create a function module to read an DSO table and extract the data between D-1 and D-365.
But I´m having some problems, can anyone check my code and help me, please???
I made a copy of the Function Group using the RSAX.
And my problem is that I can´t extract any data!
Thanks in advance.
FUNCTION ZF_BW_DESEMP_FORNECEDOR.
*"----------------------------------------------------------------------
*"*"Interface local:
*" IMPORTING
*" VALUE(I_REQUNR) TYPE SRSC_S_IF_SIMPLE-REQUNR
*" VALUE(I_DSOURCE) TYPE SRSC_S_IF_SIMPLE-DSOURCE OPTIONAL
*" VALUE(I_MAXSIZE) TYPE SRSC_S_IF_SIMPLE-MAXSIZE OPTIONAL
*" VALUE(I_INITFLAG) TYPE SRSC_S_IF_SIMPLE-INITFLAG OPTIONAL
*" VALUE(I_READ_ONLY) TYPE SRSC_S_IF_SIMPLE-READONLY OPTIONAL
*" TABLES
*" I_T_SELECT TYPE SRSC_S_IF_SIMPLE-T_SELECT
*" I_T_FIELDS TYPE SRSC_S_IF_SIMPLE-T_FIELDS
*" E_T_DATA STRUCTURE ZDESEMPFOR
*" EXCEPTIONS
*" NO_MORE_DATA
*" ERROR_PASSED_TO_MESS_HANDLER
*"----------------------------------------------------------------------
DATA: BEGIN OF it_requis OCCURS 0,
rnr(30) TYPE c,
updmode(2) TYPE c,
seldate LIKE sy-datum,
END OF it_requis.
DATA: it_opt TYPE rfc_db_opt OCCURS 0 WITH HEADER LINE,
it_field TYPE rfc_db_fld OCCURS 0 WITH HEADER LINE,
v_desti TYPE rfcdest.
* Estruturas - ( Máximo número de linhas para tabela do DB ) *
STATICS: s_s_if TYPE srsc_s_if_simple,
s_counter_datapakid LIKE sy-tabix.
* Variavel de memoria *
*----------------------------------------------------------------------*
DATA: v_lsselect TYPE srsc_s_select,
v_max TYPE i.
DATA: cnt TYPE i,
pack TYPE i,
max1 TYPE i,
max2 TYPE i,
data TYPE sy-datum,
v_data1 TYPE sy-datum,
v_data2 TYPE sy-datum,
control TYPE c,
v_index LIKE sy-tabix,
v_index2 LIKE sy-tabix,
v_tabix1 LIKE sy-tabix,
l_s_select2 TYPE srsc_s_select,
s_cursor TYPE cursor.
* Incluir linhas de dados da tabela I_T_SELECT para S_S_IF-T_SELECT
APPEND LINES OF i_t_select TO s_s_if-t_select.
STATICS: tipocarga TYPE c.
DATA: BEGIN OF it_vendas OCCURS 0,
vendor LIKE /BIC/AULVEFDS100-vendor,
fiscper LIKE /BIC/AULVEFDS100-fiscper,
material LIKE /BIC/AULVEFDS100-material,
vendasvar LIKE /BIC/AULVEFDS100-RTBAINSASV,
vendasvarimp LIKE /BIC/AULVEFDS100-rtbainsast,
vendapecas LIKE /BIC/AULVEFDS100-BASE_QTY,
tipovenda LIKE /BIC/AULVEFDS100-/BIC/ULINDTPVN,
moeda LIKE /BIC/AULVEFDS100-LOC_CURRCY,
unidade LIKE /BIC/AULVEFDS100-BASE_UOM,
dia LIKE /BIC/AULVEFDS100-Calday,
END OF it_vendas.
STATICS: BEGIN OF it_data OCCURS 0,
vendor LIKE /BIC/AULVEFDS200-vendor,
fiscper LIKE /BIC/AULVEFDS200-fiscper,
material LIKE /BIC/AULVEFDS200-material,
vendasvar LIKE /BIC/AULVEFDS200-RTBAINSASV,
vendasvarimp LIKE /BIC/AULVEFDS200-rtbainsast,
vendapecas LIKE /BIC/AULVEFDS200-BASE_QTY,
tipovenda LIKE /BIC/AULVEFDS200-/BIC/ULINDTPVN,
moeda LIKE /BIC/AULVEFDS200-LOC_CURRCY,
unidade LIKE /BIC/AULVEFDS200-BASE_UOM,
dia LIKE /BIC/AULVEFDS100-Calday,
END OF it_data.
* Iniciar ( primeira chamada por SAPI ) ou transferência de dados
IF i_initflag = sbiwa_c_flag_on.
* Validação do DataSource
CASE i_dsource.
WHEN 'ZDS_BW_DESEMP_FORNECEDOR'.
WHEN OTHERS.
IF 1 = 2. MESSAGE e009(r3). ENDIF.
* Mensagem de erro
log_write 'E' "message type
'R3' "message class
'009' "message number
i_dsource "message variable 1
' '. "message variable 2
RAISE error_passed_to_mess_handler.
ENDCASE.
* Incluir linhas de dados da tabela I_T_SELECT para S_S_IF-T_SELECT
APPEND LINES OF i_t_select TO s_s_if-t_select.
* Mover dados p/ estrutura S_S_IF (parâmetro de extração de dados)
s_s_if-requnr = i_requnr.
s_s_if-dsource = i_dsource.
s_s_if-maxsize = i_maxsize.
* Incluir linhas de dados da tabela I_T_FIELDS para S_S_IF-T_FIELDS
APPEND LINES OF i_t_fields TO s_s_if-t_fields.
ELSE. "Initialization mode or data extraction ?
************************************************************************
* Data transfer: First Call OPEN CURSOR + FETCH
* Following Calls FETCH only
************************************************************************
IF s_counter_datapakid EQ 0.
v_data1 = sy-datum - 1.
v_data2 = sy-datum - 365.
* VENDAS
SELECT vendor fiscper material RTBAINSASV rtbainsast BASE_QTY /BIC/ULINDTPVN LOC_CURRCY BASE_UOM Calday
FROM /BIC/AULVEFDS100
INTO TABLE it_vendas
WHERE Calday BETWEEN v_data1 and v_data2.
SORT it_vendas BY vendor fiscper.
LOOP AT it_vendas.
READ TABLE it_vendas WITH KEY vendor = it_vendas-vendor
fiscper = it_vendas-fiscper
BINARY SEARCH.
IF sy-subrc EQ 0.
it_data-vendor = it_vendas-vendor.
it_data-fiscper = it_vendas-vendor.
it_data-material = it_vendas-material.
it_data-vendasvar = it_vendas-vendasvar.
it_data-vendasvarimp = it_vendas-vendasvarimp.
it_data-vendapecas = it_vendas-vendapecas.
it_data-tipovenda = it_vendas-tipovenda.
it_data-moeda = it_vendas-moeda.
it_data-unidade = it_vendas-unidade.
it_data-dia = it_vendas-dia.
ENDIF.
APPEND it_data.
ENDLOOP.
ENDIF.
IF it_data[] IS INITIAL.
RAISE no_more_data.
ENDIF.
CLEAR: max1, max2.
max2 = s_s_if-maxsize.
LOOP AT it_data.
DELETE it_data.
e_t_data-vendor = it_data-vendor.
e_t_data-fiscper = it_data-fiscper.
e_t_data-material = it_data-material.
e_t_data-vendasvar = it_data-vendasvar.
e_t_data-vendasvarimp = it_data-vendasvarimp.
e_t_data-vendapecas = it_data-vendapecas.
e_t_data-tipovenda = it_data-tipovenda.
e_t_data-moeda = it_data-moeda.
e_t_data-unidade = it_data-unidade.
e_t_data-dia = it_data-dia.
APPEND e_t_data.
ADD 1 TO max1.
IF max1 >= max2.
EXIT.
ENDIF.
ENDLOOP.
ADD 1 TO s_counter_datapakid.
ENDIF.
ENDFUNCTION.
2013 Mar 20 3:41 PM
Did you try to debug the execution via RSA3 ?
Also read again your code for unusual code like
LOOP AT it_vendas.
READ TABLE it_vendas WITH KEY vendor = it_vendas-vendor
fiscper = it_vendas-fiscper
BINARY SEARCH.
IF sy-subrc EQ 0.
Check its own existence ?
And what will happen at second extraction (datapakid = 1) as you loaded the data in a non-statics internal table. (In fact here you should have open a cursor with hold at first datapakidn and then fetch data by package.)
Debug via RSA3, you should understand.
Regards,
Raymond
2013 Mar 20 3:41 PM
Did you try to debug the execution via RSA3 ?
Also read again your code for unusual code like
LOOP AT it_vendas.
READ TABLE it_vendas WITH KEY vendor = it_vendas-vendor
fiscper = it_vendas-fiscper
BINARY SEARCH.
IF sy-subrc EQ 0.
Check its own existence ?
And what will happen at second extraction (datapakid = 1) as you loaded the data in a non-statics internal table. (In fact here you should have open a cursor with hold at first datapakidn and then fetch data by package.)
Debug via RSA3, you should understand.
Regards,
Raymond
2013 Mar 20 3:49 PM
Hello,
There is a mistake in the code. You are looping the table and checking the same table.
LOOP AT it_vendas.
READ TABLE it_vendas WITH KEY vendor = it_vendas-vendor
fiscper = it_vendas-fiscper
BINARY SEARCH.
Check that..I think it should fix your issue.