2007 Aug 17 1:27 PM
Hi, I need some help for a tree structure report, appreciate you help in this regard.
My requirement is as follows-
For example-
In the selection screen I have entered the VBELN(Sales order) as a range field, if enter some range of sales order my report should display the sales order in the display from lower range to higher range with + icon on every row, means
+ VBELN1 date1 date2
+VBELN2 date1 date2
+VBELN3 date1 date3
.
.
Etc
Now here, if I click on sales order +VBELN1(expand) it has to display all its available line items from VBAP table under this VBELN1 and if I click on a expand button(down arrow icon provided by me on top left corner) it has to expand all its +VBELNs at time and collapse too if I collapse.
After expanding I should get the o/p as follows-
- VBELN1 date1 date2
10 xyz date1
20 XY1 date1
30 ert date1
-VBELN2 date1 date2
10 line1 date1
20 line2 date1
-VBELN3 date1 date3
10
20
.
.
Etc
If I collapse again back to as follows-
+ VBELN1 date1 date2
+VBELN2 date1 date2
+VBELN3 date1 date3
.
.
Etc
You can refer the same functionality available with KSB5 t-code provided by SAP.
Based on above functionality I have to develop a report for my FI module, Please suggest me with some sample code and how to ubtain this functionality.
Your's suggestions are appreciated.
Regards,
D C.
Hi, I need some help for a tree structure report, appreciate you help in this regard.
My requirement is as follows-
For example-
In the selection screen I have entered the VBELN(Sales order) as a range field, if enter some range of sales order my report should display the sales order in the display from lower range to higher range with + icon on every row, means
+ VBELN1 date1 date2
+VBELN2 date1 date2
+VBELN3 date1 date3
.
.
Etc
Now here, if I click on sales order +VBELN1(expand) it has to display all its available line items from VBAP table under this VBELN1 and if I click on a expand button(down arrow icon provided by me on top left corner) it has to expand all its +VBELNs at time and collapse too if I collapse.
After expanding I should get the o/p as follows-
- VBELN1 date1 date2
10 xyz date1
20 XY1 date1
30 ert date1
-VBELN2 date1 date2
10 line1 date1
20 line2 date1
-VBELN3 date1 date3
10
20
.
.
Etc
If I collapse again back to as follows-
+ VBELN1 date1 date2
+VBELN2 date1 date2
+VBELN3 date1 date3
.
.
Etc
You can refer the same functionality available with KSB5 t-code provided by SAP.
Based on above functionality I have to develop a report for my FI module, Please suggest me with some sample code and how to ubtain this functionality.
Your's suggestions are appreciated.
Regards,
D C.
2007 Aug 17 1:34 PM
Go in transaction DWDM for examples of ALV Tree.
If it's too hard, I could give you an example (but more complex, with link to ALV grid)
Fred
2007 Aug 17 2:30 PM
Frederic,
Could you please give me the example? using ALV grid also its ok. Appreciate your response.
Regards,
D C
2007 Aug 17 2:38 PM
Here is one of my last ALV Tree
for this exemple, you will need to create a structure in the data dictionnary.
*---------------------------------------------------------------------*
*---------------------------------------------------------------------*
* Overview : *
* *
*---------------------------------------------------------------------*
*---------------------------------------------------------------------*
REPORT z.
*------------------------------ TABLES -------------------------------*
TABLES : rkwa ,
lfa1 ,
makt ,
t001w ,
mseg ,
likp ,
lips ,
vbrk ,
vbrp ,
afpo .
*------------------------------- CLASS --------------------------------*
CLASS lcl_toolbar_event_receiver DEFINITION.
PUBLIC SECTION.
METHODS: on_function_selected
FOR EVENT function_selected OF cl_gui_toolbar
IMPORTING fcode.
ENDCLASS. "lcl_toolbar_event_receiver DEFINITION
*------------------------------- TYPES -------------------------------*
TYPES : BEGIN OF ts_key1 ,
matnr2 TYPE matnr ,
maktx2 TYPE maktx ,
charg2 TYPE charg_d ,
END OF ts_key1 ,
BEGIN OF ts_key2 ,
matnr2 TYPE matnr ,
maktx2 TYPE maktx ,
charg2 TYPE charg_d ,
aufnr TYPE aufnr ,
END OF ts_key2 .
*------------------------------- DATA --------------------------------*
DATA : gw_ok_code TYPE syucomm ,
obj_tree TYPE REF TO cl_gui_alv_tree ,
obj_container TYPE REF TO cl_gui_custom_container ,
obj_container2 TYPE REF TO cl_gui_custom_container ,
obj_toolbar TYPE REF TO cl_gui_toolbar ,
obj_toolbar_event TYPE REF TO lcl_toolbar_event_receiver ,
obj_grid TYPE REF TO cl_gui_alv_grid ,
itg_data1 LIKE TABLE OF zsd_suivi_air1_002
WITH HEADER LINE ,
itg_data2 LIKE TABLE OF zsd_suivi_air1_002
WITH HEADER LINE ,
itg_data3 LIKE TABLE OF zsd_suivi_air1_002
WITH HEADER LINE ,
itg_key1 TYPE TABLE OF ts_key1
WITH HEADER LINE ,
itg_key2 TYPE TABLE OF ts_key2
WITH HEADER LINE ,
itg_tree LIKE TABLE OF zsd_suivi_air1_002 ,
itg_grid LIKE TABLE OF zsd_suivi_air1_002
WITH HEADER LINE ,
itg_fcat TYPE lvc_t_fcat .
*------------------------- SELECTION SCREEN --------------------------*
SELECTION-SCREEN BEGIN OF BLOCK b1 WITH FRAME TITLE text-t01.
PARAMETERS p_werks TYPE werks_d
OBLIGATORY
MEMORY ID wrk.
SELECT-OPTIONS : s_charg1 FOR mseg-charg
OBLIGATORY
NO INTERVALS ,
s_charg2 FOR afpo-charg
NO INTERVALS .
SELECTION-SCREEN SKIP 1.
SELECT-OPTIONS : s_mblnr FOR rkwa-mblnr ,
s_matnr FOR rkwa-matnr ,
s_bldat FOR rkwa-bldat .
SELECTION-SCREEN SKIP 1.
PARAMETERS p_all AS CHECKBOX.
SELECTION-SCREEN END OF BLOCK b1.
*------------------------------ EVENTS -------------------------------*
*------------------------------- MAIN --------------------------------*
START-OF-SELECTION.
* Appels écran 100.
CALL SCREEN 100.
END-OF-SELECTION.
*----------------------------------------------------------------------*
* Module PBO Screen 100. *
*----------------------------------------------------------------------*
MODULE pbo_100 OUTPUT.
DATA : is_variant TYPE disvariant ,
is_layout TYPE lvc_s_layo ,
is_hiera TYPE treev_hhdr ,
is_log TYPE bal_s_log .
* Check Grid object not already exist.
CHECK obj_tree IS INITIAL.
* Set menu-painter.
SET PF-STATUS '100'.
* Set title-bar.
SET TITLEBAR '100'.
* Get data.
PERFORM p_get_data.
* Create the fieldcatalog.
PERFORM p_build_fcat.
* Create the container.
CREATE OBJECT obj_container
EXPORTING container_name = 'OBJ_CUSTOM'.
* Create the grid object.
CREATE OBJECT obj_tree
EXPORTING
parent = obj_container
node_selection_mode = cl_gui_column_tree=>node_sel_mode_multiple
item_selection = 'x'
EXCEPTIONS
OTHERS = 8.
CHECK sy-subrc EQ space.
* Set the display variant.
MOVE : sy-repid TO is_variant-report ,
sy-uname TO is_variant-username ,
'1' TO is_variant-handle.
* Update the layout.
MOVE 'A' TO is_layout-sel_mode.
* Alimente la colonne hiérarchie.
MOVE : text-z05 TO is_hiera-heading ,
'100' TO is_hiera-width.
* Load ALV Tree.
CALL METHOD obj_tree->set_table_for_first_display
EXPORTING
is_variant = is_variant
i_save = 'X'
is_hierarchy_header = is_hiera
CHANGING
it_outtab = itg_tree
it_fieldcatalog = itg_fcat.
* Créé la hiérarchie.
PERFORM p_create_hiera.
* Modifie la bar de boutton.
PERFORM p_mod_toolbar.
ENDMODULE. " PBO_100
*----------------------------------------------------------------------*
* Module PAI Screen 100 *
*----------------------------------------------------------------------*
MODULE pai_100 INPUT.
* Dispatch the return code.
CASE gw_ok_code.
* Escape
WHEN 'EXIT' OR
'CANC' OR
'BACK'.
CALL METHOD obj_tree->free.
FREE obj_tree.
LEAVE TO SCREEN 0.
WHEN OTHERS.
CALL METHOD cl_gui_cfw=>dispatch.
ENDCASE.
* Clear code.
CLEAR gw_ok_code.
ENDMODULE. " PAI_100
*----------------------------------------------------------------------*
* Form P_BUILD_FCAT. *
*----------------------------------------------------------------------*
* Create the field catalog of the ALV Grid. *
*----------------------------------------------------------------------*
FORM p_build_fcat.
DATA : is_fcat TYPE lvc_s_fcat.
* Build field catalog.
CALL FUNCTION 'LVC_FIELDCATALOG_MERGE'
EXPORTING
i_structure_name = 'ZSD_SUIVI_AIR1_002'
i_bypassing_buffer = 'X'
CHANGING
ct_fieldcat = itg_fcat
EXCEPTIONS
OTHERS = 3.
* Indique les colonnes de type ICON.
LOOP AT itg_fcat
INTO is_fcat.
IF is_fcat-fieldname EQ 'STATU1'.
MOVE 'X' TO is_fcat-icon.
MODIFY itg_fcat FROM is_fcat.
ENDIF.
ENDLOOP.
ENDFORM. " P_BUILD_FCAT.
*---------------------------------------------------------------------*
* Form P_GET_DATA. *
*---------------------------------------------------------------------*
*---------------------------------------------------------------------*
FORM p_get_data.
DATA : BEGIN OF it_rkwa OCCURS 0 ,
bukrs TYPE bukrs ,
mblnr TYPE mblnr ,
mjahr TYPE mjahr ,
zeile TYPE mblpo ,
status TYPE mr_rkwast ,
bldat TYPE bldat ,
lifnr TYPE lifnr ,
werks TYPE werks_d ,
matnr TYPE matnr ,
wrbtr TYPE wrbtr ,
bwaer TYPE waers ,
bstmg TYPE mr_bstmg ,
bstme TYPE mr_bstme ,
belnr TYPE belnr_d ,
gjahr TYPE gjahr ,
buzei TYPE buzei ,
END OF it_rkwa ,
BEGIN OF it_mseg OCCURS 0 ,
mblnr TYPE mblnr ,
mjahr TYPE mjahr ,
zeile TYPE mblpo ,
bwart TYPE bwart ,
matnr TYPE matnr ,
charg TYPE charg_d ,
aufnr TYPE aufnr ,
END OF it_mseg ,
BEGIN OF it_mseg2 OCCURS 0 ,
bwart TYPE bwart ,
matnr TYPE matnr ,
charg TYPE charg_d ,
menge TYPE menge_d ,
meins TYPE meins ,
END OF it_mseg2 ,
BEGIN OF it_afpo OCCURS 0 ,
aufnr TYPE aufnr ,
posnr TYPE co_posnr ,
wemng TYPE co_wemng ,
amein TYPE co_aufme ,
matnr TYPE matnr ,
charg TYPE charg_d ,
ltrmi TYPE co_ltrmi ,
dwerk TYPE werks_d ,
END OF it_afpo ,
BEGIN OF it_lips OCCURS 0 ,
vbeln TYPE vbeln_vl ,
posnr TYPE posnr_vl ,
matnr TYPE matnr ,
charg TYPE charg_d ,
werks TYPE werks_d ,
vgbel TYPE vgbel ,
vgpos TYPE vgpos ,
ntgew TYPE ntgew ,
gewei TYPE meins ,
END OF it_lips ,
BEGIN OF it_likp OCCURS 0 ,
vbeln TYPE vbeln_vl ,
lfdat TYPE lfdat_v ,
kunwe TYPE kunnr ,
END OF it_likp ,
BEGIN OF it_vbrp OCCURS 0 ,
vbeln TYPE vbeln_vf ,
posnr TYPE posnr_vf ,
matnr TYPE matnr ,
charg TYPE charg_d ,
werks TYPE werks_d ,
vgbel TYPE vgbel ,
vgpos TYPE vgpos ,
aubel TYPE vbeln_va ,
aupos TYPE posnr_va ,
ntgew TYPE ntgew ,
gewei TYPE meins ,
END OF it_vbrp ,
BEGIN OF it_vbrk OCCURS 0 ,
vbeln TYPE vbeln_vf ,
fkdat TYPE fkdat ,
kunrg TYPE kunnr ,
END OF it_vbrk ,
BEGIN OF it_makt OCCURS 0 ,
matnr TYPE matnr ,
maktx TYPE maktx ,
END OF it_makt ,
BEGIN OF it_t001w OCCURS 0 ,
werks TYPE werks_d ,
name1 TYPE name1 ,
END OF it_t001w ,
BEGIN OF it_kna1 OCCURS 0 ,
kunnr TYPE kunnr ,
name1 TYPE name1_gp ,
ort01 TYPE ort01_gp ,
pstlz TYPE pstlz ,
END OF it_kna1 ,
it_komv TYPE TABLE OF komv WITH HEADER LINE ,
w_actvt TYPE activ_auth .
RANGES : r_status FOR rkwa-status ,
r_charg FOR afpo-charg .
* Authorization check.
MOVE '03' TO w_actvt.
AUTHORITY-CHECK OBJECT 'M_BEST_WRK'
ID 'ACTVT' FIELD w_actvt
ID 'WERKS' FIELD p_werks.
IF sy-subrc NE space.
MESSAGE i398(00) WITH text-e01.
LEAVE TO SCREEN 0.
ENDIF.
* Gère la case à cocher sur le statut.
IF p_all EQ ' '.
MOVE : '00' TO r_status-low ,
'I' TO r_status-sign ,
'EQ' TO r_status-option.
APPEND r_status.
ENDIF.
* Récupère les données ds RKWA - Stock consignation.
SELECT bukrs mblnr mjahr zeile status bldat lifnr werks matnr
wrbtr bwaer bstmg bstme belnr gjahr buzei
INTO TABLE it_rkwa
FROM rkwa
WHERE mblnr IN s_mblnr
AND werks EQ p_werks
AND matnr IN s_matnr
AND bldat IN s_bldat
AND status IN r_status.
CHECK sy-subrc EQ space.
* Avec le mvmt de stock récupère l'OP et l'article consommé.
SELECT mblnr mjahr zeile bwart matnr charg aufnr
INTO TABLE it_mseg
FROM mseg
FOR ALL ENTRIES IN it_rkwa
WHERE mblnr EQ it_rkwa-mblnr
AND mjahr EQ it_rkwa-mjahr
AND zeile EQ it_rkwa-zeile.
CHECK sy-subrc EQ space.
SORT it_mseg BY mblnr mjahr zeile.
* Nettoie en fonction du lot consommé.
IF NOT s_charg1[] IS INITIAL.
DELETE it_mseg
WHERE NOT charg IN s_charg1.
ENDIF.
* Recupère dans l'OP les articles & lot produit.
IF NOT it_mseg[] IS INITIAL.
SELECT aufnr posnr wemng amein matnr charg ltrmi dwerk
INTO TABLE it_afpo
FROM afpo
FOR ALL ENTRIES IN it_mseg
WHERE aufnr EQ it_mseg-aufnr
AND charg IN s_charg2.
SORT it_afpo BY aufnr posnr.
ENDIF.
* Récupère les mouvements de stocks parasites.
IF NOT it_afpo[] IS INITIAL.
LOOP AT it_afpo.
MOVE : 'I' TO r_charg-sign ,
'EQ' TO r_charg-option ,
it_afpo-charg TO r_charg-low .
APPEND r_charg.
ENDLOOP.
SORT r_charg.
DELETE ADJACENT DUPLICATES FROM r_charg COMPARING sign option low.
SELECT bwart matnr charg menge meins
INTO TABLE it_mseg2
FROM mseg
WHERE bwart IN ('701', '702', '501', '502')
AND werks EQ p_werks
AND charg IN r_charg.
* Chargement de la table ITG_DATA3, correction de stock.
IF sy-subrc EQ space.
LOOP AT it_mseg2.
MOVE : it_mseg2-matnr TO itg_data3-matnr2 ,
it_mseg2-charg TO itg_data3-charg2 ,
it_mseg2-meins TO itg_data3-bstme .
IF it_mseg2-bwart EQ '502' OR it_mseg2-bwart EQ '702'.
itg_data3-bstmg = - it_mseg2-menge.
ELSE.
itg_data3-bstmg = it_mseg2-menge.
ENDIF.
COLLECT itg_data3.
ENDLOOP.
ENDIF.
ENDIF.
* Recupère les livraisons.
IF NOT it_afpo[] IS INITIAL.
SELECT vbeln posnr matnr charg werks vgbel vgpos ntgew gewei
INTO TABLE it_lips
FROM lips
FOR ALL ENTRIES IN it_afpo
WHERE charg EQ it_afpo-charg.
* Recherche du client livré.
IF NOT it_lips[] IS INITIAL.
SELECT vbeln lfdat kunnr
INTO TABLE it_likp
FROM likp
FOR ALL ENTRIES IN it_lips
WHERE vbeln EQ it_lips-vbeln.
SORT it_likp BY vbeln.
ENDIF.
ENDIF.
* Récupère les factures.
IF NOT it_afpo[] IS INITIAL.
SELECT vbeln posnr matnr charg werks vgbel vgpos aubel aupos
ntgew gewei
INTO TABLE it_vbrp
FROM vbrp
FOR ALL ENTRIES IN it_afpo
WHERE charg EQ it_afpo-charg
AND werks EQ it_afpo-dwerk.
SORT it_vbrp BY vgbel vgpos.
* Recherche du client payeur.
IF NOT it_vbrp[] IS INITIAL.
SELECT vbeln fkdat kunrg
INTO TABLE it_vbrk
FROM vbrk
FOR ALL ENTRIES IN it_vbrp
WHERE vbeln EQ it_vbrp-vbeln.
SORT it_vbrk BY vbeln.
ENDIF.
ENDIF.
* Récupère les informations sur les clients.
IF NOT it_likp[] IS INITIAL.
SELECT kunnr name1 ort01 pstlz
INTO TABLE it_kna1
FROM kna1
FOR ALL ENTRIES IN it_likp
WHERE kunnr EQ it_likp-kunwe.
ENDIF.
IF NOT it_vbrk[] IS INITIAL.
SELECT kunnr name1 ort01 pstlz
APPENDING TABLE it_kna1
FROM kna1
FOR ALL ENTRIES IN it_vbrk
WHERE kunnr EQ it_vbrk-kunrg.
ENDIF.
SORT it_kna1 BY kunnr.
DELETE ADJACENT DUPLICATES FROM it_kna1 COMPARING kunnr.
* Récupère la désignation de l'article.
IF NOT it_rkwa[] IS INITIAL.
SELECT matnr maktx
INTO TABLE it_makt
FROM makt
FOR ALL ENTRIES IN it_rkwa
WHERE matnr EQ it_rkwa-matnr
AND spras EQ sy-langu.
ENDIF.
IF NOT it_afpo[] IS INITIAL.
SELECT matnr maktx
APPENDING TABLE it_makt
FROM makt
FOR ALL ENTRIES IN it_afpo
WHERE matnr EQ it_afpo-matnr
AND spras EQ sy-langu.
ENDIF.
SORT it_makt BY matnr.
DELETE ADJACENT DUPLICATES FROM it_makt COMPARING matnr.
* Récupère les noms des sites.
SELECT werks name1
INTO TABLE it_t001w
FROM t001w.
* Alimentation de la table globale.
LOOP AT it_rkwa.
* Depuis la table RKWA.
MOVE : it_rkwa-bukrs TO itg_data1-bukrs ,
it_rkwa-mblnr TO itg_data1-mblnr ,
it_rkwa-mjahr TO itg_data1-mjahr ,
it_rkwa-zeile TO itg_data1-zeile ,
it_rkwa-bldat TO itg_data1-bldat ,
it_rkwa-matnr TO itg_data1-matnr1 ,
it_rkwa-bstmg TO itg_data1-bstmg ,
it_rkwa-bstme TO itg_data1-bstme ,
it_rkwa-belnr TO itg_data1-belnr ,
it_rkwa-gjahr TO itg_data1-gjahr ,
it_rkwa-buzei TO itg_data1-buzei ,
it_rkwa-werks TO itg_data1-werk1 .
* Statut de la MRKO.
IF it_rkwa-status EQ '00'.
MOVE '@BZ@' TO itg_data1-statu1.
ELSEIF it_rkwa-status EQ '01'.
MOVE '@5B@' TO itg_data1-statu1.
ENDIF.
* Lecture des mvmts correspondant à RKWA.
READ TABLE it_mseg
WITH KEY mblnr = it_rkwa-mblnr
mjahr = it_rkwa-mjahr
zeile = it_rkwa-zeile
BINARY SEARCH.
IF sy-subrc EQ space.
MOVE : it_mseg-charg TO itg_data1-charg1 ,
it_mseg-aufnr TO itg_data1-aufnr .
ELSE.
CLEAR : itg_data1-charg1 ,
itg_data1-aufnr .
ENDIF.
* Récupère la désignation de l'article consommé.
READ TABLE it_makt
WITH KEY matnr = itg_data1-matnr1
BINARY SEARCH.
IF sy-subrc EQ space.
MOVE it_makt-maktx TO itg_data1-maktx1.
ELSE.
CLEAR itg_data1-maktx1.
ENDIF.
* Recherche de l'article produit.
READ TABLE it_afpo
WITH KEY aufnr = itg_data1-aufnr.
IF sy-subrc EQ space.
MOVE : it_afpo-matnr TO itg_data1-matnr2 ,
it_afpo-charg TO itg_data1-charg2 .
* Récupère la désignation de l'article produit.
READ TABLE it_makt
WITH KEY matnr = it_afpo-matnr
BINARY SEARCH.
IF sy-subrc EQ space.
MOVE it_makt-maktx TO itg_data1-maktx2.
ELSE.
CLEAR itg_data1-maktx2.
ENDIF.
ELSE.
CLEAR : itg_data1-matnr2 ,
itg_data1-charg2 .
ENDIF.
* Enregistre les modifications.
APPEND itg_data1.
* Sauvegarde les tables de clefs.
MOVE-CORRESPONDING : itg_data1 TO itg_key1 ,
itg_data1 TO itg_key2 .
APPEND : itg_key1, itg_key2.
CLEAR : itg_key1, itg_key2.
ENDLOOP.
* Supprime les lignes de table clefs vide.
DELETE : itg_key1 WHERE charg2 EQ space ,
itg_key2 WHERE aufnr EQ space.
* Supprime les doublons.
SORT : itg_key1 BY charg2 matnr2 ,
itg_key2 BY matnr2 aufnr .
DELETE ADJACENT DUPLICATES FROM : itg_key1 COMPARING charg2 matnr2 ,
itg_key2 COMPARING matnr2 aufnr .
* Chargement de la table des livraisons.
LOOP AT itg_key1.
* Recherche des livraisons.
LOOP AT it_lips
WHERE charg = itg_key1-charg2.
MOVE : itg_key1-charg2 TO itg_data2-charg2 ,
itg_key1-matnr2 TO itg_data2-matnr2 ,
itg_key1-maktx2 TO itg_data2-maktx2 ,
it_lips-vbeln TO itg_data2-vbeln_vl ,
it_lips-posnr TO itg_data2-posnr_vl ,
it_lips-matnr TO itg_data2-matnr3 ,
it_lips-werks TO itg_data2-werks ,
it_lips-vgbel TO itg_data2-vbeln_va ,
it_lips-vgpos TO itg_data2-posnr_va ,
it_lips-ntgew TO itg_data2-ntgew ,
it_lips-gewei TO itg_data2-meins .
* Recherche la désignation de la division.
READ TABLE it_t001w
WITH KEY werks = itg_data2-werks
BINARY SEARCH.
IF sy-subrc EQ space.
MOVE it_t001w-name1 TO itg_data2-werks_name1.
ELSE.
CLEAR itg_data2-werks_name1.
ENDIF.
* Recherche des infos du client livré.
READ TABLE it_likp
WITH KEY vbeln = it_lips-vbeln
BINARY SEARCH.
IF sy-subrc EQ space.
MOVE : it_likp-lfdat TO itg_data2-lfdat.
READ TABLE it_kna1
WITH KEY kunnr = it_likp-kunwe
BINARY SEARCH.
IF sy-subrc EQ space.
MOVE : it_kna1-kunnr TO itg_data2-kunwe ,
it_kna1-name1 TO itg_data2-kunwe_name1 ,
it_kna1-pstlz TO itg_data2-kunwe_pstlz ,
it_kna1-ort01 TO itg_data2-kunwe_ort01 .
ENDIF.
ELSE.
CLEAR : itg_data2-kunwe, itg_data2-kunwe_name1,
itg_data2-kunwe_pstlz, itg_data2-kunwe_ort01,
itg_data2-lfdat.
ENDIF.
* Recherche si le poste a été facturé.
READ TABLE it_vbrp
WITH KEY vgbel = itg_data2-vbeln_vl
vgpos = itg_data2-posnr_vl
BINARY SEARCH.
IF sy-subrc EQ space.
MOVE : it_vbrp-vbeln TO itg_data2-vbeln_vf ,
it_vbrp-posnr TO itg_data2-posnr_vf ,
it_vbrp-ntgew TO itg_data2-ntgew2 .
* Recherche des infos du client facturé.
READ TABLE it_vbrk
WITH KEY vbeln = it_vbrp-vbeln
BINARY SEARCH.
IF sy-subrc EQ space.
MOVE : it_vbrk-fkdat TO itg_data2-fkdat.
READ TABLE it_kna1
WITH KEY kunnr = it_vbrk-kunrg
BINARY SEARCH.
IF sy-subrc EQ space.
MOVE : it_kna1-kunnr TO itg_data2-kunag ,
it_kna1-name1 TO itg_data2-kunag_name1 ,
it_kna1-pstlz TO itg_data2-kunag_pstlz ,
it_kna1-ort01 TO itg_data2-kunag_ort01 .
ENDIF.
ELSE.
CLEAR : itg_data2-kunag, itg_data2-kunag_name1,
itg_data2-kunag_pstlz, itg_data2-kunag_ort01,
itg_data2-fkdat.
ENDIF.
* Recherche de la marge.
CALL FUNCTION 'ZSD_COND_GET_MARGE_FROM_VBRK2'
EXPORTING
vbeln = itg_data2-vbeln_vf
posnr = itg_data2-posnr_vf
IMPORTING
it_komv = it_komv[]
EXCEPTIONS
OTHERS = 3.
IF sy-subrc EQ space.
LOOP AT it_komv.
CASE it_komv-kschl.
WHEN 'ZR00'.
MOVE : it_komv-kwert TO itg_data2-marge_zr00 ,
it_komv-waers TO itg_data2-waers .
WHEN 'ZF01'.
MOVE it_komv-kwert TO itg_data2-marge_zf01.
WHEN 'VPRS'.
MOVE it_komv-kwert TO itg_data2-marge_vprs.
WHEN 'MWST'.
MOVE it_komv-kwert TO itg_data2-marge_mwst.
WHEN 'ZYA1'.
MOVE it_komv-kwert TO itg_data2-marge_zya1.
WHEN 'ZYA2'.
MOVE it_komv-kwert TO itg_data2-marge_zya2.
WHEN 'ZYA3'.
MOVE it_komv-kwert TO itg_data2-marge_zya3.
WHEN 'ZM00'.
MOVE it_komv-kwert TO itg_data2-marge_zm00.
ENDCASE.
ENDLOOP.
ELSE.
CLEAR : itg_data2-marge_zr00, itg_data2-marge_zf01,
itg_data2-marge_vprs, itg_data2-marge_mwst,
itg_data2-marge_zya1, itg_data2-marge_zya2,
itg_data2-marge_zya3, itg_data2-marge_zm00.
ENDIF.
* For the memory management.
CALL FUNCTION 'RV_PRICE_PRINT_REFRESH'
TABLES
tkomv = it_komv.
ENDIF.
* Sauvegarde des valeurs.
APPEND itg_data2.
CLEAR : itg_data2-vbeln_vl , itg_data2-posnr_vl ,
itg_data2-matnr3 , itg_data2-werks ,
itg_data2-vbeln_va , itg_data2-posnr_va ,
itg_data2-ntgew , itg_data2-meins ,
itg_data2-vbeln_vf , itg_data2-posnr_vf ,
itg_data2-ntgew2 , itg_data2-marge_zr00,
itg_data2-marge_zf01, itg_data2-marge_vprs,
itg_data2-marge_mwst, itg_data2-marge_zya1,
itg_data2-marge_zya2, itg_data2-marge_zya3,
itg_data2-marge_zm00.
ENDLOOP.
ENDLOOP.
ENDFORM. " P_GET_DATA.
*----------------------------------------------------------------------*
* Form P_CREATE_HIERA. *
*----------------------------------------------------------------------*
*----------------------------------------------------------------------*
FORM p_create_hiera.
DATA : w_niv_deb TYPE lvc_nkey ,
w_niv_lotp TYPE lvc_nkey ,
w_niv_op TYPE lvc_nkey ,
w_niv_corr TYPE lvc_nkey ,
w_niv_lotc TYPE lvc_nkey ,
w_niv_liv TYPE lvc_nkey .
* Boucle.
LOOP AT itg_key1.
* Ajout du niveau lot produit.
PERFORM p_add_lotp USING itg_key1
w_niv_deb
CHANGING w_niv_lotp.
* Recherche des OPs.
LOOP AT itg_key2
WHERE matnr2 = itg_key1-matnr2
AND charg2 = itg_key1-charg2.
* Ajout du niveau OP.
PERFORM p_add_op USING itg_key2
w_niv_lotp
CHANGING w_niv_op.
* Recherche des lots consommés
LOOP AT itg_data1
WHERE matnr2 = itg_key2-matnr2
AND charg2 = itg_key2-charg2
AND aufnr = itg_key2-aufnr.
PERFORM p_add_lotc USING itg_data1
w_niv_op
CHANGING w_niv_lotc.
ENDLOOP. " ITG_DATA --> Lot conso
ENDLOOP. " ITG_KEY2
* Recherche les corrections de stocks.
LOOP AT itg_data3
WHERE matnr2 = itg_key1-matnr2
AND charg2 = itg_key1-charg2.
PERFORM p_add_corr USING itg_data3
w_niv_lotp
CHANGING w_niv_corr.
ENDLOOP.
* Recherche des livraisons.
LOOP AT itg_data2
WHERE charg2 = itg_key1-charg2.
PERFORM p_add_liv USING itg_data2
w_niv_lotp
CHANGING w_niv_liv.
ENDLOOP.
ENDLOOP. " ITG_KEY1.
* Rafraichi l'écran après la création de la hiérarchie.
CALL METHOD obj_tree->frontend_update.
* Vide de la mémoire.
FREE : itg_data1, itg_data2.
ENDFORM. " P_CREATE_HIERA.
*----------------------------------------------------------------------*
* Form P_ADD_LOTC. *
*----------------------------------------------------------------------*
* Ajoute un niveau lot consommé dans l'arborescence. *
*----------------------------------------------------------------------*
FORM p_add_lotc USING is_key TYPE zsd_suivi_air1_002
w_pere TYPE lvc_nkey
CHANGING w_niveau TYPE lvc_nkey.
DATA: w_text TYPE lvc_value,
is_line LIKE zsd_suivi_air1_002 ,
is_layout TYPE lvc_s_layi ,
it_layout TYPE lvc_t_layi WITH HEADER LINE ,
is_node TYPE lvc_s_layn .
* Structure d'affichage de la ligne.
is_layout-fieldname = obj_tree->c_hierarchy_column_name.
is_layout-style = '3'.
is_layout-font = '1'.
APPEND is_layout TO it_layout.
* Texte de la branche de l'arbre.
WRITE text-z01 TO w_text.
CONCATENATE w_text
is_key-charg1
INTO w_text
SEPARATED BY ' -> '.
MOVE : '@QC@' TO is_node-n_image ,
'@QC@' TO is_node-exp_image .
MOVE-CORRESPONDING is_key TO is_line.
* Rajoute la ligne dans l'arbre.
CALL METHOD obj_tree->add_node
EXPORTING
i_relat_node_key = w_pere
i_relationship = cl_gui_column_tree=>relat_last_child
i_node_text = w_text
is_outtab_line = is_line
it_item_layout = it_layout[]
is_node_layout = is_node
IMPORTING
e_new_node_key = w_niveau.
ENDFORM. " P_ADD_LOTC.
*----------------------------------------------------------------------*
* Form P_ADD_OP. *
*----------------------------------------------------------------------*
* Ajoute un niveau OP dans l'arborescence. *
*----------------------------------------------------------------------*
FORM p_add_op USING is_key TYPE ts_key2
w_pere TYPE lvc_nkey
CHANGING w_niveau TYPE lvc_nkey.
DATA: w_text TYPE lvc_value,
is_line LIKE zsd_suivi_air1_002 ,
is_layout TYPE lvc_s_layi ,
it_layout TYPE lvc_t_layi WITH HEADER LINE ,
is_node TYPE lvc_s_layn .
* Structure d'affichage de la ligne.
is_layout-fieldname = obj_tree->c_hierarchy_column_name.
is_layout-style = '3'.
is_layout-font = '1'.
APPEND is_layout TO it_layout.
* Texte de la branche de l'arbre.
WRITE text-z02 TO w_text.
CONCATENATE w_text
is_key-aufnr
INTO w_text
SEPARATED BY ' '.
MOVE : '@9Z@' TO is_node-n_image ,
'@9Z@' TO is_node-exp_image .
MOVE-CORRESPONDING is_key TO is_line.
* Rajoute la ligne dans l'arbre.
CALL METHOD obj_tree->add_node
EXPORTING
i_relat_node_key = w_pere
i_relationship = cl_gui_column_tree=>relat_last_child
i_node_text = w_text
is_outtab_line = is_line
it_item_layout = it_layout[]
is_node_layout = is_node
IMPORTING
e_new_node_key = w_niveau.
ENDFORM. " P_ADD_OP.
*----------------------------------------------------------------------*
* Form P_ADD_LOTP. *
*----------------------------------------------------------------------*
* Ajoute un niveau lot produit dans l'arborescence. *
*----------------------------------------------------------------------*
FORM p_add_lotp USING is_key TYPE ts_key1
w_pere TYPE lvc_nkey
CHANGING w_niveau TYPE lvc_nkey.
DATA: w_text TYPE lvc_value,
is_line LIKE zsd_suivi_air1_002 ,
is_layout TYPE lvc_s_layi ,
it_layout TYPE lvc_t_layi WITH HEADER LINE ,
is_node TYPE lvc_s_layn .
* Structure d'affichage de la ligne.
is_layout-fieldname = obj_tree->c_hierarchy_column_name.
is_layout-style = '3'.
is_layout-font = '1'.
APPEND is_layout TO it_layout.
* Texte de la branche de l'arbre.
WRITE text-z03 TO w_text.
CONCATENATE w_text
'->'
is_key-charg2
'/'
is_key-maktx2
INTO w_text
SEPARATED BY ' '.
MOVE : '@EJ@' TO is_node-n_image ,
'@EJ@' TO is_node-exp_image .
MOVE-CORRESPONDING is_key TO is_line.
* Rajoute la ligne dans l'arbre.
CALL METHOD obj_tree->add_node
EXPORTING
i_relat_node_key = w_pere
i_relationship = cl_gui_column_tree=>relat_last_child
i_node_text = w_text
is_outtab_line = is_line
it_item_layout = it_layout[]
is_node_layout = is_node
IMPORTING
e_new_node_key = w_niveau.
ENDFORM. " P_ADD_LOTP.
*----------------------------------------------------------------------*
* Form P_ADD_CORR. *
*----------------------------------------------------------------------*
* Ajoute un niveau correction de stock dans l'arborescence. *
*----------------------------------------------------------------------*
FORM p_add_corr USING is_key TYPE zsd_suivi_air1_002
w_pere TYPE lvc_nkey
CHANGING w_niveau TYPE lvc_nkey.
DATA: w_text TYPE lvc_value,
is_line LIKE zsd_suivi_air1_002 ,
is_layout TYPE lvc_s_layi ,
it_layout TYPE lvc_t_layi WITH HEADER LINE ,
is_node TYPE lvc_s_layn .
* Structure d'affichage de la ligne.
is_layout-fieldname = obj_tree->c_hierarchy_column_name.
is_layout-style = '3'.
is_layout-font = '1'.
APPEND is_layout TO it_layout.
* Texte de la branche de l'arbre.
WRITE text-z07 TO w_text.
MOVE : '@03@' TO is_node-n_image ,
'@03@' TO is_node-exp_image .
MOVE-CORRESPONDING is_key TO is_line.
* Rajoute la ligne dans l'arbre.
CALL METHOD obj_tree->add_node
EXPORTING
i_relat_node_key = w_pere
i_relationship = cl_gui_column_tree=>relat_last_child
i_node_text = w_text
is_outtab_line = is_line
it_item_layout = it_layout[]
is_node_layout = is_node
IMPORTING
e_new_node_key = w_niveau.
ENDFORM. " P_ADD_CORR.
*----------------------------------------------------------------------*
* Form P_ADD_LIV. *
*----------------------------------------------------------------------*
* Ajoute un niveau liv produit dans l'arborescence. *
*----------------------------------------------------------------------*
FORM p_add_liv USING is_data LIKE zsd_suivi_air1_002
w_pere TYPE lvc_nkey
CHANGING w_niveau TYPE lvc_nkey.
DATA: w_text TYPE lvc_value,
is_line LIKE zsd_suivi_air1_002 ,
is_layout TYPE lvc_s_layi ,
it_layout TYPE lvc_t_layi WITH HEADER LINE ,
is_node TYPE lvc_s_layn .
* Structure d'affichage de la ligne.
is_layout-fieldname = obj_tree->c_hierarchy_column_name.
is_layout-style = '3'.
is_layout-font = '1'.
APPEND is_layout TO it_layout.
* Texte de la branche de l'arbre.
WRITE text-z04 TO w_text.
CONCATENATE w_text
is_data-vbeln_vl
is_data-posnr_vl
INTO w_text
SEPARATED BY ' -> '.
MOVE : '@O4@' TO is_node-n_image ,
'@O4@' TO is_node-exp_image .
MOVE-CORRESPONDING is_data TO is_line.
* Rajoute la ligne dans l'arbre.
CALL METHOD obj_tree->add_node
EXPORTING
i_relat_node_key = w_pere
i_relationship = cl_gui_column_tree=>relat_last_child
i_node_text = w_text
is_outtab_line = is_line
it_item_layout = it_layout[]
is_node_layout = is_node
IMPORTING
e_new_node_key = w_niveau.
ENDFORM. " P_ADD_LIV.
*----------------------------------------------------------------------*
* Form P_MOD_TOOLBAR *
*----------------------------------------------------------------------*
*----------------------------------------------------------------------*
FORM p_mod_toolbar.
CALL METHOD obj_tree->get_toolbar_object
IMPORTING
er_toolbar = obj_toolbar.
* Test qu'il y a bien une barre d'outil.
CHECK NOT obj_toolbar IS INITIAL.
*
* Ajoute un separateur à la barre d'outil.
CALL METHOD obj_toolbar->add_button
EXPORTING
fcode = ''
icon = ''
butn_type = cntb_btype_sep
text = ''
quickinfo = 'Seperator'.
* Ajoute le bouton grille ALV.
CALL METHOD obj_toolbar->add_button
EXPORTING
fcode = 'ALVG'
icon = '@3W@'
butn_type = cntb_btype_button
text = ''
quickinfo = 'Format grille'(i01).
* Ajoute un separateur à la barre d'outil.
CALL METHOD obj_toolbar->add_button
EXPORTING
fcode = ''
icon = ''
butn_type = cntb_btype_sep
text = ''
quickinfo = 'Seperator'.
* Ajoute le bouton MRKO
CALL METHOD obj_toolbar->add_button
EXPORTING
fcode = 'MRKO1'
icon = '@3C@'
butn_type = cntb_btype_button
text = 'MRKO'
quickinfo = 'MRKO'.
* Ajoute le bouton Affichage commande.
CALL METHOD obj_toolbar->add_button
EXPORTING
fcode = 'VA03'
icon = ''
butn_type = cntb_btype_button
text = '-> Cmd'
quickinfo = 'Affichage commande'(i02).
* Ajoute le bouton Affichage livraison
CALL METHOD obj_toolbar->add_button
EXPORTING
fcode = 'VL03N'
icon = ''
butn_type = cntb_btype_button
text = '-> Liv'
quickinfo = 'Affichage livraison'(i03).
* Ajoute le bouton grille ALV.
CALL METHOD obj_toolbar->add_button
EXPORTING
fcode = 'VF03'
icon = ''
butn_type = cntb_btype_button
text = '-> Fact'
quickinfo = 'Affichage facture'(i04).
* Active la gestion des evenements sur la barre d'outil.
CREATE OBJECT obj_toolbar_event.
SET HANDLER obj_toolbar_event->on_function_selected
FOR obj_toolbar.
ENDFORM. " P_MOD_TOOLAR
*---------------------------------------------------------------------*
CLASS lcl_toolbar_event_receiver IMPLEMENTATION.
* Methode On_Function_Selected
METHOD on_function_selected.
DATA : it_sel_node TYPE lvc_t_nkey ,
is_sel_node TYPE lvc_nkey ,
is_line TYPE zsd_suivi_air1_002 .
* Recherche le numéro du noeud.
CALL METHOD obj_tree->get_selected_nodes
CHANGING
ct_selected_nodes = it_sel_node.
CALL METHOD cl_gui_cfw=>flush.
* On se positionne sur la ligne lue.
READ TABLE it_sel_node
INTO is_sel_node
INDEX 1.
CHECK sy-subrc EQ space AND
NOT is_sel_node IS INITIAL.
* Récupère les informations.
CALL METHOD obj_tree->get_outtab_line
EXPORTING
i_node_key = is_sel_node
IMPORTING
e_outtab_line = is_line.
* En fonction du code fonction.
CASE fcode.
* Appels de la MRKO
WHEN 'MRKO1'.
PERFORM p_disp_mrko USING is_line.
* Appels affichage Grille ALV.
WHEN 'ALVG'.
PERFORM p_disp_alvgrid TABLES it_sel_node.
* Si affichage commande.
WHEN 'VA03'.
PERFORM p_disp_va03 USING is_line.
* Si affichage facture.
WHEN 'VF03'.
PERFORM p_disp_vf03 USING is_line.
* Si affichage livraison.
WHEN 'VL03N'.
PERFORM p_disp_vl03n USING is_line.
ENDCASE.
ENDMETHOD. "on_function_selected
ENDCLASS. "lcl_toolbar_event_receiver IMPLEMENTATION
*---------------------------------------------------------------------*
* Form P_DISP_MRKO. *
*---------------------------------------------------------------------*
*---------------------------------------------------------------------*
FORM p_disp_mrko USING is_line STRUCTURE zsd_suivi_air1_002.
DATA : it_btc TYPE tab_bdcdata WITH HEADER LINE ,
it_error TYPE tab_bdcmsgcoll WITH HEADER LINE .
* Vérifie qu'au moins on ait les infos.
CHECK is_line-bukrs NE space AND is_line-mblnr NE space.
* Alimente l'écran de sélection.
MOVE : 'RMVKON00' TO it_btc-program ,
'1000' TO it_btc-dynpro ,
'X' TO it_btc-dynbegin .
APPEND it_btc. CLEAR it_btc.
MOVE : 'BDC_OKCODE' TO it_btc-fnam ,
'=ONLI' TO it_btc-fval .
APPEND it_btc. CLEAR it_btc.
MOVE : 'SO_BUKRS-LOW' TO it_btc-fnam ,
is_line-bukrs TO it_btc-fval .
APPEND it_btc. CLEAR it_btc.
MOVE : 'SO_MBLNR-LOW' TO it_btc-fnam ,
is_line-mblnr TO it_btc-fval .
APPEND it_btc. CLEAR it_btc.
MOVE : 'SO_WERKS-LOW' TO it_btc-fnam ,
is_line-werk1 TO it_btc-fval .
APPEND it_btc. CLEAR it_btc.
MOVE : 'SO_MATNR-LOW' TO it_btc-fnam ,
is_line-matnr1 TO it_btc-fval .
APPEND it_btc. CLEAR it_btc.
* Vérifie si déjà imputés.
IF is_line-belnr NE space.
MOVE : 'PA_XINV' TO it_btc-fnam ,
'X' TO it_btc-fval .
APPEND it_btc. CLEAR it_btc.
ENDIF.
CALL TRANSACTION 'MRKO'
USING it_btc
MODE 'E'.
ENDFORM. " P_DISP_MRKO
*---------------------------------------------------------------------*
* Form P_DISP_VA03. *
*---------------------------------------------------------------------*
*---------------------------------------------------------------------*
FORM p_disp_va03 USING is_line STRUCTURE zsd_suivi_air1_002.
CHECK is_line-vbeln_va NE space.
SET PARAMETER ID 'AUN' FIELD is_line-vbeln_va.
CALL TRANSACTION 'VA03' AND SKIP FIRST SCREEN.
ENDFORM. " P_DISP_VA03
*---------------------------------------------------------------------*
* Form P_DISP_VF03. *
*---------------------------------------------------------------------*
*---------------------------------------------------------------------*
FORM p_disp_vf03 USING is_line STRUCTURE zsd_suivi_air1_002.
CHECK is_line-vbeln_vf NE space.
SET PARAMETER ID 'VF' FIELD is_line-vbeln_vf.
CALL TRANSACTION 'VF03' AND SKIP FIRST SCREEN.
ENDFORM. " P_DISP_VF03
*---------------------------------------------------------------------*
* Form P_DISP_VL03N. *
*---------------------------------------------------------------------*
*---------------------------------------------------------------------*
FORM p_disp_vl03n USING is_line STRUCTURE zsd_suivi_air1_002.
CHECK is_line-vbeln_vl NE space.
SET PARAMETER ID 'VL' FIELD is_line-vbeln_vl.
CALL TRANSACTION 'VL03N' AND SKIP FIRST SCREEN.
ENDFORM. " P_DISP_VL03N
*---------------------------------------------------------------------*
* Form P_DISP_ALVGRID. *
*---------------------------------------------------------------------*
*---------------------------------------------------------------------*
FORM p_disp_alvgrid TABLES it_column TYPE lvc_t_nkey.
DATA : is_col TYPE lvc_nkey ,
is_colw TYPE lvc_nkey ,
it_cols TYPE lvc_t_nkey .
* Vide le contenue de la table.
REFRESH itg_grid.
* Extrait les données correspondant à la sélection.
LOOP AT it_column
INTO is_col.
* Get the subtree.
CALL METHOD obj_tree->get_subtree
EXPORTING
i_node_key = is_col
IMPORTING
et_subtree_nodes = it_cols.
* For each line get the value.
LOOP AT it_cols
INTO is_colw.
CALL METHOD obj_tree->get_outtab_line
EXPORTING
i_node_key = is_colw
IMPORTING
e_outtab_line = itg_grid.
APPEND itg_grid.
ENDLOOP.
ENDLOOP.
** Supprime les lignes trop hautes (sans livraison)
* DELETE itg_grid
* WHERE vbeln_vl NE space.
* Vérifie qu'il reste quelque chose.
CHECK NOT itg_grid[] IS INITIAL.
* Appels écran 2.
CALL SCREEN 200.
ENDFORM. " P_DISP_ALVGRID.
*----------------------------------------------------------------------*
* Module PBO Screen 200. *
*----------------------------------------------------------------------*
MODULE pbo_200 OUTPUT.
DATA : is_variant2 TYPE disvariant ,
is_layout2 TYPE lvc_s_layo .
* Check Grid object not already exist.
CHECK obj_grid IS INITIAL.
* Set menu-painter.
SET PF-STATUS '200'.
* Set title-bar.
SET TITLEBAR '200'.
* Create the container.
IF obj_container2 IS INITIAL.
CREATE OBJECT obj_container2
EXPORTING container_name = 'OBJ_CUSTOM2'.
ENDIF.
* Create the grid object.
CREATE OBJECT obj_grid
EXPORTING
i_parent = obj_container2.
CHECK sy-subrc EQ space.
* Set the display variant.
MOVE : sy-repid TO is_variant2-report ,
sy-uname TO is_variant2-username ,
'2' TO is_variant2-handle.
* Update the layout.
MOVE 'A' TO is_layout2-sel_mode.
* Load ALV Grid.
CALL METHOD obj_grid->set_table_for_first_display
EXPORTING
is_layout = is_layout2
is_variant = is_variant2
i_save = 'A'
CHANGING
it_outtab = itg_grid[]
it_fieldcatalog = itg_fcat.
ENDMODULE. " PBO_200
*----------------------------------------------------------------------*
* Module PAI Screen 200 *
*----------------------------------------------------------------------*
MODULE pai_200 INPUT.
* Dispatch the return code.
CASE gw_ok_code.
* Escape
WHEN 'EXIT' OR
'CANC' OR
'BACK'.
CALL METHOD obj_grid->free.
FREE obj_grid.
LEAVE TO SCREEN 0.
WHEN OTHERS.
CALL METHOD cl_gui_cfw=>dispatch.
ENDCASE.
* Clear code.
CLEAR gw_ok_code.
ENDMODULE. " PAI_200
*
2007 Aug 17 2:51 PM
| User | Count |
|---|---|
| 3 | |
| 2 | |
| 2 | |
| 1 | |
| 1 | |
| 1 | |
| 1 | |
| 1 | |
| 1 | |
| 1 |