2014 Oct 16 11:56 AM
Hello,
i'm trying to insert the values of an internal table into a ztable and inspite of the data in the internal table is correct, when i pass the values to the ztable it shows up messed up (like on the imagem i'm sending)...
any idea why?
**********************************
******** MODIFICAR INSERIR *******
******* NA TABELA Z **************
**********************************
v_mat = w_tab1-mat.
w_tab1-data = sy-datum.
w_tab1-hora = sy-uzeit.
w_tab1-dsc = v_maktx.
w_tab1-user = sy-uname.
w_tab1-idioma = so_lang.
w_tab1-t_lote = v_tlotes.
MODIFY t_tab1 FROM w_tab1.
MODIFY ztab1 FROM TABLE t_tab1.
ENDLOOP.
ENDIF.
My ztab1 is like this structure (plus the MANDT).
TYPES:
BEGIN OF t_type1.
TYPES:
* client type mara-mandt,
mat TYPE mara-matnr,
data TYPE ztab1-datac,
hora TYPE ztab1-horac,
dsc TYPE makt-maktx,
user TYPE ztab1-userc,
idioma TYPE makt-spras,
t_lote TYPE int4,
END OF t_type1.
TYPES: t_table TYPE TABLE OF t_type1.
DATA: t_tab1 TYPE t_table.
DATA: w_tab1 TYPE t_type1.
Messed up table
- ON THE ATTACHED FILES
description (denominaçao) should be FRANGO VIVO, for example.
it seems it's shifted... o.O can't understand why.
Thanks in advance.
2014 Oct 16 5:34 PM
Hi bruno,
Pls check following code: I have modified.
*&---------------------------------------------------------------------*
*& Report ZR_EX1
*&
*&---------------------------------------------------------------------*
*&
*&
*&---------------------------------------------------------------------*
REPORT ZR_EX1.
**** TABELAS STANDARD E Z
TABLES: mara, makt, marc, mcha, ztab1.
**** ESTRUTURA DADOS TABELA Z_TAB1
TYPES:
BEGIN OF t_type1.
TYPES:
client type mara-mandt,
mat TYPE mara-matnr,
data TYPE ztab1-datac,
hora TYPE ztab1-horac,
dsc TYPE makt-maktx,
user TYPE ztab1-userc,
idioma TYPE makt-spras,
t_lote TYPE int4,
END OF t_type1.
TYPES: t_table TYPE TABLE OF t_type1.
DATA: t_tab1 TYPE t_table.
DATA: w_tab1 TYPE t_type1.
*** SELECT OPTIONS
SELECT-OPTIONS: so_matnr FOR mara-matnr.
SELECT-OPTIONS: so_date FOR sy-datum DEFAULT sy-datum TO '99991231'.
SELECT-OPTIONS: so_time FOR sy-timlo DEFAULT sy-timlo TO '235959'.
PARAMETER: so_lang TYPE makt-spras.
SELECT-OPTIONS: so_centr FOR marc-werks.
SELECT-OPTIONS: so_userc FOR ztab1-userc NO INTERVALS.
**** RADIO BUTTONS
PARAMETERS: p_read RADIOBUTTON GROUP g1,
p_write RADIOBUTTON GROUP g1 DEFAULT 'X'.
**** Estrutura WA dos valores retornados dos forms
DATA: v_mat TYPE mara-matnr,
v_maktx TYPE makt-maktx,
v_marc TYPE marc-werks,
v_tlotes TYPE i VALUE 0,
v_data TYPE date,
v_hora TYPE time,
v_user TYPE username.
DATA: v_count TYPE i VALUE 0.
START-OF-SELECTION.
************************************
** LEITURA NA TABELA INTERNA
************************************
IF p_read = 'X'.
write: ztab1-mat.
* DATA r_grid TYPE REF TO cl_gui_alv_grid. "referencia à classe alvgrid
* DATA: wa_fieldcat TYPE slis_fieldcat_alv, "field catalog
* wa_layout TYPE slis_layout_alv,
* it_fieldcat TYPE slis_t_fieldcat_alv.
* PERFORM MONTAR_CAMPOS.
* PERFORM MONTAR_LAYOUT.
* PERFORM EXIBIR_ALV.
************************************
** ESCRITA NA TABELA INTERNA
************************************
ELSEIF p_write = 'X'.
* preform s_mara - BUSCA NUM MATERIAL
PERFORM select_mara.
LOOP AT t_tab1 INTO w_tab1.
* preform select makt - BUSCA DESCRIÇÃO
PERFORM select_makt USING w_tab1-mat
so_lang
CHANGING v_maktx.
* preform select mcha - CALCULA TOTAL LOTES por Material
PERFORM select_charg TABLES so_centr
USING w_tab1-mat
CHANGING v_tlotes .
**********************************
******** MODIFICAR INSERIR *******
******* NA TABELA Z **************
**********************************
* valores dos results forms p/WA
v_mat = w_tab1-mat.
w_tab1-data = sy-datum.
w_tab1-hora = sy-uzeit.
w_tab1-dsc = v_maktx.
w_tab1-user = sy-uname.
w_tab1-idioma = so_lang.
w_tab1-t_lote = v_tlotes.
* Carrega tabela interna com valores da WA
MODIFY t_tab1 FROM w_tab1.
* Carrega Ztable com valores da Tab intern
ENDLOOP.
LOOP AT t_tab1 into w_tab1.
MODIFY ztab1 FROM w_tab1.
ENDLOOP.
ENDIF.
*---------------------------------------------------------------------*
* FORM s_mara *
*---------------------------------------------------------------------*
* ........ *
*---------------------------------------------------------------------*
FORM select_mara.
BREAK-POINT.
SELECT matnr AS mat
FROM mara
INTO CORRESPONDING FIELDS OF TABLE t_tab1
WHERE matnr IN so_matnr.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form select_makt
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* -->P_W_TAB1_MATNR text
* -->P_SO_LANG text
* <--P_V_MAKTX text
*----------------------------------------------------------------------*
FORM select_makt USING p_w_tab1_mat
p_so_lang
CHANGING p_v_maktx.
SELECT SINGLE maktx FROM makt INTO p_v_maktx
WHERE matnr = p_w_tab1_mat
AND spras = p_so_lang.
IF sy-subrc NE 0.
CLEAR p_v_maktx.
ENDIF.
ENDFORM. " SELECT_MAKT
*
**&---------------------------------------------------------------------
**
**& Form select_charg
**&---------------------------------------------------------------------
**
** text
**----------------------------------------------------------------------
**
** -->P_W_TAB1_MAT text
** -->P_SO_CENTR text
** -->P_SO_LOTE text
** <--P_V_TLOTES text
**----------------------------------------------------------------------
*
FORM select_charg TABLES p_so_centr USING
p_w_tab1_mat
CHANGING p_v_tlotes.
* cria table interna p/carregar só valores de lotes c/matnr passados P
TYPES:
BEGIN OF int_type,
matnr TYPE mara-matnr,
werks TYPE marc-werks,
charg TYPE mcha-charg,
END OF int_type.
TYPES: int_type1 TYPE TABLE OF int_type.
DATA: t_tablei TYPE int_type1.
DATA: w_tablei TYPE int_type.
* carrega tabela interna
SELECT matnr werks charg FROM mcha
INTO TABLE t_tablei
WHERE matnr = p_w_tab1_mat
AND werks IN p_so_centr.
* Se encontra registos, vai contar quantos sao...
IF sy-subrc = 0.
* percorre todos os campos da tabela adicionando contador
LOOP AT t_tablei INTO w_tablei.
v_count = v_count + 1.
ENDLOOP.
* nr total de lotes naquele matnr passado como parametro
p_v_tlotes = v_count.
CLEAR v_count.
ENDIF.
ENDFORM. " select_charg
Hello,
i'm trying to insert the values of an internal table into a ztable and inspite of the data in the internal table is correct, when i pass the values to the ztable it shows up messed up (like on the imagem i'm sending)...
any idea why?
**********************************
******** MODIFICAR INSERIR *******
******* NA TABELA Z **************
**********************************
v_mat = w_tab1-mat.
w_tab1-data = sy-datum.
w_tab1-hora = sy-uzeit.
w_tab1-dsc = v_maktx.
w_tab1-user = sy-uname.
w_tab1-idioma = so_lang.
w_tab1-t_lote = v_tlotes.
MODIFY t_tab1 FROM w_tab1.
MODIFY ztab1 FROM TABLE t_tab1.
ENDLOOP.
ENDIF.
My ztab1 is like this structure (plus the MANDT).
TYPES:
BEGIN OF t_type1.
TYPES:
* client type mara-mandt,
mat TYPE mara-matnr,
data TYPE ztab1-datac,
hora TYPE ztab1-horac,
dsc TYPE makt-maktx,
user TYPE ztab1-userc,
idioma TYPE makt-spras,
t_lote TYPE int4,
END OF t_type1.
TYPES: t_table TYPE TABLE OF t_type1.
DATA: t_tab1 TYPE t_table.
DATA: w_tab1 TYPE t_type1.
Messed up table
- ON THE ATTACHED FILES
description (denominaçao) should be FRANGO VIVO, for example.
it seems it's shifted... o.O can't understand why.
Thanks in advance.
2014 Oct 16 12:02 PM
2014 Oct 16 12:20 PM
I'm new at abap so i was declaring like that at first and then realize that i should declare it like the way you said... thing is i try to change it to:
DATA: t_tab1 type standard table of ztab1 " my ztable
DATA: w_tab1 type ztab1.
but then i don't know what to change in the code, as the values of t_tab1 don't appear in my table.
basically the ztab1 is a table that records fields from mara, mcha etc and then i'll put it as ALV GRID.
the code is here and ztable on the image attached:
REPORT z_ex1 .
**** TABELAS STANDARD E Z
TABLES: mara, makt, marc, mcha, ztab1.
**** ESTRUTURA DADOS TABELA Z_TAB1
TYPES:
BEGIN OF t_type1.
TYPES:
* client type mara-mandt,
mat TYPE mara-matnr,
data TYPE ztab1-datac,
hora TYPE ztab1-horac,
dsc TYPE makt-maktx,
user TYPE ztab1-userc,
idioma TYPE makt-spras,
t_lote TYPE int4,
END OF t_type1.
TYPES: t_table TYPE TABLE OF t_type1.
DATA: t_tab1 TYPE t_table.
DATA: w_tab1 TYPE t_type1.
*** SELECT OPTIONS
SELECT-OPTIONS: so_matnr FOR mara-matnr.
SELECT-OPTIONS: so_date FOR sy-datum DEFAULT sy-datum TO '99991231'.
SELECT-OPTIONS: so_time FOR sy-timlo DEFAULT sy-timlo TO '235959'.
PARAMETER: so_lang TYPE makt-spras.
SELECT-OPTIONS: so_centr FOR marc-werks.
SELECT-OPTIONS: so_userc FOR ztab1-userc NO INTERVALS.
**** RADIO BUTTONS
PARAMETERS: p_read RADIOBUTTON GROUP g1,
p_write RADIOBUTTON GROUP g1.
**** Estrutura WA dos valores retornados dos forms
DATA: v_mat TYPE mara-matnr,
v_maktx TYPE makt-maktx,
v_marc TYPE marc-werks,
v_tlotes TYPE i VALUE 0,
v_data TYPE date,
v_hora TYPE time,
v_user TYPE username.
DATA: v_count TYPE i VALUE 0.
START-OF-SELECTION.
************************************
** LEITURA NA TABELA INTERNA
************************************
*
IF p_read = 'X'.
write: ztab1.
* DATA r_grid TYPE REF TO cl_gui_alv_grid. "referencia à classe alvgrid
* DATA: wa_fieldcat TYPE slis_fieldcat_alv, "field catalog
* wa_layout TYPE slis_layout_alv,
* it_fieldcat TYPE slis_t_fieldcat_alv.
*
* PERFORM MONTAR_CAMPOS.
* PERFORM MONTAR_LAYOUT.
* PERFORM EXIBIR_ALV.
************************************
** ESCRITA NA TABELA INTERNA
************************************
ELSEIF p_write = 'X'.
* preform s_mara - BUSCA NUM MATERIAL
PERFORM select_mara.
LOOP AT t_tab1 INTO w_tab1.
* preform select makt - BUSCA DESCRIÇÃO
PERFORM select_makt USING w_tab1-mat
so_lang
CHANGING v_maktx.
* preform select mcha - CALCULA TOTAL LOTES por Material
PERFORM select_charg TABLES so_centr
USING w_tab1-mat
CHANGING v_tlotes .
**********************************
******** MODIFICAR INSERIR *******
******* NA TABELA Z **************
**********************************
* valores dos results forms p/WA
v_mat = w_tab1-mat.
w_tab1-data = sy-datum.
w_tab1-hora = sy-uzeit.
w_tab1-dsc = v_maktx.
w_tab1-user = sy-uname.
w_tab1-idioma = so_lang.
w_tab1-t_lote = v_tlotes.
* Carrega tabela interna com valores da WA
MODIFY t_tab1 FROM w_tab1.
* Carrega Ztable com valores da Tab interna
MODIFY ztab1 FROM TABLE t_tab1.
ENDLOOP.
ENDIF.
*---------------------------------------------------------------------*
* FORM s_mara *
*---------------------------------------------------------------------*
* ........ *
*---------------------------------------------------------------------*
FORM select_mara.
SELECT matnr
FROM mara
INTO TABLE t_tab1
WHERE matnr IN so_matnr.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form select_makt
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* -->P_W_TAB1_MATNR text
* -->P_SO_LANG text
* <--P_V_MAKTX text
*----------------------------------------------------------------------*
FORM select_makt USING p_w_tab1_mat
p_so_lang
CHANGING p_v_maktx.
SELECT SINGLE maktx FROM makt INTO p_v_maktx
WHERE matnr = p_w_tab1_mat
AND spras = p_so_lang.
IF sy-subrc NE 0.
CLEAR p_v_maktx.
ENDIF.
ENDFORM. " SELECT_MAKT
*
**&---------------------------------------------------------------------
**
**& Form select_charg
**&---------------------------------------------------------------------
**
** text
**----------------------------------------------------------------------
**
** -->P_W_TAB1_MAT text
** -->P_SO_CENTR text
** -->P_SO_LOTE text
** <--P_V_TLOTES text
**----------------------------------------------------------------------
*
FORM select_charg TABLES p_so_centr USING
p_w_tab1_mat
CHANGING p_v_tlotes.
* cria table interna p/carregar só valores de lotes c/matnr passados P
TYPES:
BEGIN OF int_type,
matnr TYPE mara-matnr,
werks TYPE marc-werks,
charg TYPE mcha-charg,
END OF int_type.
TYPES: int_type1 TYPE TABLE OF int_type.
DATA: t_tablei TYPE int_type1.
DATA: w_tablei TYPE int_type.
* carrega tabela interna
SELECT matnr werks charg FROM mcha
INTO TABLE t_tablei
WHERE matnr = p_w_tab1_mat
AND werks IN p_so_centr.
* Se encontra registos, vai contar quantos sao...
IF sy-subrc = 0.
* percorre todos os campos da tabela adicionando contador
LOOP AT t_tablei INTO w_tablei.
v_count = v_count + 1.
ENDLOOP.
* nr total de lotes naquele matnr passado como parametro
p_v_tlotes = v_count.
CLEAR v_count.
ENDIF.
ENDFORM. " select_charg
2014 Oct 16 12:40 PM
Hi Bruno,
this one has to be done once after your loop
* Carrega Ztable com valores da Tab interna
MODIFY ztab1 FROM TABLE t_tab1.
and you need to know, that your table need all other fields of mara in the same form than before.
Additional to that, I recommend you to work through the help content SAP provides you. Here is the link to your specific problem:
Here is a snippet out of the link:
MODIFY dbtab FROM TABLE itab. or
MODIFY (dbtabname) FROM TABLE itab.
... CLIENT SPECIFIED
Effect
Mass modify: Inserts new lines or updates existing lines of a database table. The primary keys for identifying the lines to be inserted or updated and the relevant values are taken from the internal table itab. The lines of the internal table itab must satisfy the same conditions as the work area wa in addition 1 to variant 1.
Note
If the internal table itab is empty, SY-SUBRC and SY-DBCNT are set to 0.
~Florian
2014 Oct 16 1:00 PM
Hi Bruno.
You should declare your Internal Table as your Z Table type.
DATA: t_tab1 type standard table of ztab1 " my ztable
DATA: w_tab1 type ztab1.
After this, you have to change some fields name because, for example, you don't have DATA and HORA in your Z Table. But you have DATAC e HORAC.
w_tab1-datac = sy-datum.
w_tab1-horac = sy-uzeit.
w_tab1-dsc = v_maktx.
w_tab1-userc = sy-uname.
w_tab1-idioma = so_lang.
w_tab1-t_lote = v_tlotes.
Besides it, you have a lot of performance issues in your code.
You should avoid to use SELECT inside a LOOP block. The same for MODIFY operations...
But first you have to solve this problem and make your program works, then you think about performance.
2014 Oct 16 12:05 PM
2014 Oct 16 12:57 PM
Hi Bruno,
Hope it help full.
Try,
Data: wa type ztab1,
itab type table of ztab1.
Inside loop.
MOVE-CORRESPONDING w_tab1 to wa.
| MODIFY ztab1 FROM wa. |
Clear wa.
Outside loop.
APPEND the Work area values to internal table itab.
MODIFY ztab1 FROM TABLE itab.
if sy-subrc = 0.
commit work.
endif.
Regards,
Venkat.
2014 Oct 16 1:10 PM
2014 Oct 16 5:34 PM
Hi bruno,
Pls check following code: I have modified.
*&---------------------------------------------------------------------*
*& Report ZR_EX1
*&
*&---------------------------------------------------------------------*
*&
*&
*&---------------------------------------------------------------------*
REPORT ZR_EX1.
**** TABELAS STANDARD E Z
TABLES: mara, makt, marc, mcha, ztab1.
**** ESTRUTURA DADOS TABELA Z_TAB1
TYPES:
BEGIN OF t_type1.
TYPES:
client type mara-mandt,
mat TYPE mara-matnr,
data TYPE ztab1-datac,
hora TYPE ztab1-horac,
dsc TYPE makt-maktx,
user TYPE ztab1-userc,
idioma TYPE makt-spras,
t_lote TYPE int4,
END OF t_type1.
TYPES: t_table TYPE TABLE OF t_type1.
DATA: t_tab1 TYPE t_table.
DATA: w_tab1 TYPE t_type1.
*** SELECT OPTIONS
SELECT-OPTIONS: so_matnr FOR mara-matnr.
SELECT-OPTIONS: so_date FOR sy-datum DEFAULT sy-datum TO '99991231'.
SELECT-OPTIONS: so_time FOR sy-timlo DEFAULT sy-timlo TO '235959'.
PARAMETER: so_lang TYPE makt-spras.
SELECT-OPTIONS: so_centr FOR marc-werks.
SELECT-OPTIONS: so_userc FOR ztab1-userc NO INTERVALS.
**** RADIO BUTTONS
PARAMETERS: p_read RADIOBUTTON GROUP g1,
p_write RADIOBUTTON GROUP g1 DEFAULT 'X'.
**** Estrutura WA dos valores retornados dos forms
DATA: v_mat TYPE mara-matnr,
v_maktx TYPE makt-maktx,
v_marc TYPE marc-werks,
v_tlotes TYPE i VALUE 0,
v_data TYPE date,
v_hora TYPE time,
v_user TYPE username.
DATA: v_count TYPE i VALUE 0.
START-OF-SELECTION.
************************************
** LEITURA NA TABELA INTERNA
************************************
IF p_read = 'X'.
write: ztab1-mat.
* DATA r_grid TYPE REF TO cl_gui_alv_grid. "referencia à classe alvgrid
* DATA: wa_fieldcat TYPE slis_fieldcat_alv, "field catalog
* wa_layout TYPE slis_layout_alv,
* it_fieldcat TYPE slis_t_fieldcat_alv.
* PERFORM MONTAR_CAMPOS.
* PERFORM MONTAR_LAYOUT.
* PERFORM EXIBIR_ALV.
************************************
** ESCRITA NA TABELA INTERNA
************************************
ELSEIF p_write = 'X'.
* preform s_mara - BUSCA NUM MATERIAL
PERFORM select_mara.
LOOP AT t_tab1 INTO w_tab1.
* preform select makt - BUSCA DESCRIÇÃO
PERFORM select_makt USING w_tab1-mat
so_lang
CHANGING v_maktx.
* preform select mcha - CALCULA TOTAL LOTES por Material
PERFORM select_charg TABLES so_centr
USING w_tab1-mat
CHANGING v_tlotes .
**********************************
******** MODIFICAR INSERIR *******
******* NA TABELA Z **************
**********************************
* valores dos results forms p/WA
v_mat = w_tab1-mat.
w_tab1-data = sy-datum.
w_tab1-hora = sy-uzeit.
w_tab1-dsc = v_maktx.
w_tab1-user = sy-uname.
w_tab1-idioma = so_lang.
w_tab1-t_lote = v_tlotes.
* Carrega tabela interna com valores da WA
MODIFY t_tab1 FROM w_tab1.
* Carrega Ztable com valores da Tab intern
ENDLOOP.
LOOP AT t_tab1 into w_tab1.
MODIFY ztab1 FROM w_tab1.
ENDLOOP.
ENDIF.
*---------------------------------------------------------------------*
* FORM s_mara *
*---------------------------------------------------------------------*
* ........ *
*---------------------------------------------------------------------*
FORM select_mara.
BREAK-POINT.
SELECT matnr AS mat
FROM mara
INTO CORRESPONDING FIELDS OF TABLE t_tab1
WHERE matnr IN so_matnr.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form select_makt
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* -->P_W_TAB1_MATNR text
* -->P_SO_LANG text
* <--P_V_MAKTX text
*----------------------------------------------------------------------*
FORM select_makt USING p_w_tab1_mat
p_so_lang
CHANGING p_v_maktx.
SELECT SINGLE maktx FROM makt INTO p_v_maktx
WHERE matnr = p_w_tab1_mat
AND spras = p_so_lang.
IF sy-subrc NE 0.
CLEAR p_v_maktx.
ENDIF.
ENDFORM. " SELECT_MAKT
*
**&---------------------------------------------------------------------
**
**& Form select_charg
**&---------------------------------------------------------------------
**
** text
**----------------------------------------------------------------------
**
** -->P_W_TAB1_MAT text
** -->P_SO_CENTR text
** -->P_SO_LOTE text
** <--P_V_TLOTES text
**----------------------------------------------------------------------
*
FORM select_charg TABLES p_so_centr USING
p_w_tab1_mat
CHANGING p_v_tlotes.
* cria table interna p/carregar só valores de lotes c/matnr passados P
TYPES:
BEGIN OF int_type,
matnr TYPE mara-matnr,
werks TYPE marc-werks,
charg TYPE mcha-charg,
END OF int_type.
TYPES: int_type1 TYPE TABLE OF int_type.
DATA: t_tablei TYPE int_type1.
DATA: w_tablei TYPE int_type.
* carrega tabela interna
SELECT matnr werks charg FROM mcha
INTO TABLE t_tablei
WHERE matnr = p_w_tab1_mat
AND werks IN p_so_centr.
* Se encontra registos, vai contar quantos sao...
IF sy-subrc = 0.
* percorre todos os campos da tabela adicionando contador
LOOP AT t_tablei INTO w_tablei.
v_count = v_count + 1.
ENDLOOP.
* nr total de lotes naquele matnr passado como parametro
p_v_tlotes = v_count.
CLEAR v_count.
ENDIF.
ENDFORM. " select_charg
2014 Oct 16 7:44 PM
Thanks mate! Can you explain what was wrong with my code? I'm new so all the info i can get is very useful... thank you once again! Hope i can help people too in a near future
2014 Oct 16 8:10 PM
Hi bruno,
I removed MODIFY ztab1 FROM w_tab1 from the Loop to a new Loop. That's it.
LOOP AT t_tab1 into w_tab1.
MODIFY ztab1 FROM w_tab1.
ENDLOOP.
| User | Count |
|---|---|
| 4 | |
| 2 | |
| 2 | |
| 1 | |
| 1 | |
| 1 | |
| 1 | |
| 1 | |
| 1 | |
| 1 |