2007 Jun 25 12:10 AM
Please tell me ALV report basics and how to start any ALV report program.
Message was edited by:
Praveen Singh
Please tell me ALV report basics and how to start any ALV report program.
Message was edited by:
Praveen Singh
2007 Jun 25 12:15 AM
2007 Jun 25 12:16 AM
Hi Praveen,
To start with ALV, you first need to be very clear with the normal report programs.It will make developing ALV very easy.
Are you clear with the normal report programs (classical reports)? I am just asking as I seen your other thread on normal reports.
Regards,
Atish
2007 Jun 25 12:25 AM
2007 Jun 25 12:36 AM
Hi Praveen,
Please refer to the code below.
You will get better idea.
************************************************************************
TYPE-POOLS *
************************************************************************
TYPE-POOLS: slis.
************************************************************************
TABLES *
************************************************************************
TABLES: mkpf,
mseg.
************************************************************************
TYPES DECLARATION *
************************************************************************
TYPES: BEGIN OF t_disp_table,
box, "to show select all button in ALV
bukrs LIKE mseg-bukrs, "Company Code
mblnr LIKE mkpf-mblnr, "Number of Material Document
region LIKE adrc-region, "Region(State,Province,County)
budat LIKE mkpf-budat, "Posting Date in the Document
werks LIKE mseg-werks, "Plant
name2 LIKE adrc-name2, "Name 2
taxjurcode LIKE adrc-taxjurcode, "Tax jurisdiction code
sakto LIKE mseg-sakto, "G/L Account Number
matnr LIKE mseg-matnr, "Material Number
maktx LIKE makt-maktx, "Material Description
menge LIKE mseg-menge, "Quantity
meins LIKE mseg-meins, "Base Unit of Measure
unit_price LIKE mseg-dmbtr, "Unit Price
dmbtr LIKE mseg-dmbtr, "Amount in local currency
procd LIKE t007a-procd, "Product Code
wgbez LIKE t023t-wgbez, "Description of material group
matkl LIKE mara-matkl, "Material Group
END OF t_disp_table.
TYPES: BEGIN OF t_tax_details,
matnr LIKE mara-matnr, "Material Number
kappl LIKE a600-kappl, "Application
kschl LIKE a600-kschl, "Condition type
lland LIKE a600-lland, "Destination country
matkl LIKE a600-matkl, "Material Group
datbi LIKE a600-datbi, "Validity end date of the cond. record
knumh LIKE konp-knumh, "Condition record number
kopos LIKE konp-kopos, "Sequential number of the condition
mwsk1 LIKE konp-mwsk1, "Tax on sales/purchases code
kalsm LIKE t007a-kalsm, "Procedure (pricing, output control..)
mwskz LIKE t007a-mwskz, "Tax on sales/purchases code
procd LIKE t007a-procd, "SAP product code (external interface)
END OF t_tax_details.
TYPES: BEGIN OF t_mseg_data,
mblnr LIKE mseg-mblnr, "Number of Material Document
budat LIKE mkpf-budat, "Posting Date
bwart LIKE mseg-bwart, "Movement Type added for EBP
umlgo LIKE mseg-umlgo, "Receiving/issuing storage location
bukrs LIKE mseg-bukrs, "Company Code
umwrk LIKE mseg-umwrk, "Plant
werks LIKE mseg-werks, "Plant
sakto LIKE mseg-sakto, "G/L Account Number
matnr LIKE mseg-matnr, "Material Number
menge LIKE mseg-menge, "Quantity
meins LIKE mseg-meins, "Base Unit of Measure
ablad LIKE mseg-ablad, "Unloading point added for EBP
dmbtr LIKE mseg-dmbtr, "Amount in local currency
mjahr LIKE mseg-mjahr, "Material Document Year
zeile LIKE mseg-zeile, "Item in Material Document
line_id LIKE mseg-line_id, "Document line
lifnr LIKE mseg-lifnr, "Account Number of the Vendor
maktx LIKE makt-maktx, "Material Description
spras LIKE makt-spras, "Language key
name1 LIKE lfa1-name1, "Vendor Name
matkl LIKE mara-matkl, "Material Group
END OF t_mseg_data.
TYPES: BEGIN OF t_address_data,
lgort LIKE twlad-lgort, "Storage Location
werks LIKE twlad-werks, "Plant
region LIKE adrc-region, "Region(State,Province,County)
name2 LIKE adrc-name2, "Name 2
taxjurcode LIKE adrc-taxjurcode, "Tax jurisdiction code
lfdnr LIKE twlad-lfdnr, "Sequential address number
addrnumber LIKE adrc-addrnumber, "Address Number
date_from LIKE adrc-date_from, "From Date
nation LIKE adrc-nation, "Nation
END OF t_address_data.
TYPES: BEGIN OF t_scitem_id ,
object_id TYPE crmt_object_id_co,
number_int TYPE crmt_item_no_co,
END OF t_scitem_id.
TYPES: BEGIN OF t_zscitem_address_details,
object_id TYPE crmt_object_id_co,
number_int TYPE crmt_item_no_co,
del_code(10).
INCLUDE TYPE bapiaddr3.
TYPES: END OF t_zscitem_address_details.
TYPES: BEGIN OF t_t023t,
spras LIKE t023t-spras,
matkl LIKE t023t-matkl,
wgbez LIKE t023t-wgbez,
END OF t_t023t.
************************************************************************
GLOBAL VARIABLES *
************************************************************************
DATA: gv_repid LIKE sy-repid,
gv_title(80) TYPE c,
gv_rfcdest LIKE crmrfcpar-rfcdest.
************************************************************************
GLOBAL CONSTANTS *
************************************************************************
CONSTANTS: gc_bwart(3) TYPE c VALUE '903',
gc_country_key(3) TYPE c VALUE 'US',
gc_kalsm(6) TYPE c VALUE 'TAXUSX',
gc_bwart_ebp LIKE mseg-bwart VALUE '201'.
************************************************************************
INTERNAL TABLE DECLARATION *
************************************************************************
DATA: gt_disp_table TYPE TABLE OF t_disp_table,
gs_disp_table TYPE t_disp_table,
gt_tax_details TYPE TABLE OF t_tax_details,
gs_tax_details TYPE t_tax_details,
gt_mseg_data TYPE TABLE OF t_mseg_data,
gs_mseg_data TYPE t_mseg_data,
gt_address_data TYPE TABLE OF t_address_data,
gs_address_data TYPE t_address_data,
gt_t023t TYPE TABLE OF t_t023t,
gs_t023t TYPE t_t023t.
DATA: gt_scitem_id TYPE STANDARD TABLE OF t_scitem_id ,
gs_scitem_id TYPE t_scitem_id ,
gt_scitem_address_details TYPE STANDARD TABLE OF
t_zscitem_address_details ,
gs_scitem_address_details TYPE t_zscitem_address_details.
DATA: BEGIN OF gt_bukrs OCCURS 0,
bukrs LIKE anla-bukrs,
END OF gt_bukrs.
*Events for handling the top-of-page
DATA: gs_events TYPE slis_alv_event.
DATA: gt_events TYPE slis_t_event.
DATA: gt_listheader TYPE slis_t_listheader .
DATA: gs_layout TYPE slis_layout_alv .
DATA: gt_fieldcat TYPE slis_t_fieldcat_alv.
************************************************************************
SELECTION SCREEN *
************************************************************************
SELECTION-SCREEN BEGIN OF BLOCK block1 WITH FRAME TITLE text-001 .
SELECT-OPTIONS: s_bukrs FOR mseg-bukrs,
s_budat FOR mkpf-budat,
s_werks FOR mseg-werks,
s_matnr FOR mseg-matnr.
SELECTION-SCREEN END OF BLOCK block1.
************************************************************************
INITIALIZATION EVENT *
************************************************************************
INITIALIZATION.
gv_repid = sy-repid.
gv_title = text-t01.
************************************************************************
AT SELECTION-SCREEN EVENTS *
************************************************************************
AT SELECTION-SCREEN.
PERFORM validate_selection_criteria.
************************************************************************
START-OF-SELECTION EVENT *
************************************************************************
START-OF-SELECTION.
PERFORM fetch_data.
************************************************************************
END-OF-SELECTION EVENT *
************************************************************************
END-OF-SELECTION.
IF gt_disp_table IS INITIAL.
MESSAGE s000 WITH text-m01.
ELSE.
PERFORM display_alv.
ENDIF.
************************************************************************
&----
*& Form validate_selection_criteria
&----
Validation of entries for company code plant and material number
----
FORM validate_selection_criteria .
DATA: lv_matnr LIKE mara-matnr,
lv_werks LIKE t001w-werks.
validating company code and selecting US Company codes only
SELECT bukrs
FROM t001
INTO TABLE gt_bukrs
WHERE bukrs IN s_bukrs
AND land1 = gc_country_key.
IF sy-subrc NE 0.
MESSAGE e000 WITH text-t03.
ENDIF.
Plant
IF s_werks IS NOT INITIAL.
SELECT SINGLE werks FROM t001w INTO lv_werks WHERE werks IN s_werks.
IF sy-subrc NE 0.
MESSAGE e000 WITH text-t04.
ENDIF.
ENDIF.
Material Number
IF s_matnr IS NOT INITIAL.
SELECT SINGLE matnr FROM mara INTO lv_matnr WHERE matnr IN s_matnr.
IF sy-subrc NE 0.
MESSAGE e000 WITH text-t05.
ENDIF.
ENDIF.
ENDFORM. " validate_selection_criteria
&----
*& Form fetch_data
&----
FORM fetch_data .
REFRESH: gt_tax_details,gt_mseg_data,gt_address_data.
CLEAR: gt_tax_details,gt_mseg_data,gt_address_data.
DATA: lv_object_id TYPE crmt_object_id_co,
lv_number_int TYPE crmt_item_no_co.
SELECT f~mblnr
f~budat
g~bwart
g~umlgo
g~bukrs
g~umwrk
g~werks
g~sakto
g~matnr
g~menge
g~meins
g~ablad
g~dmbtr
g~mjahr
g~zeile
g~line_id
g~lifnr
t~maktx
t~spras
INTO TABLE gt_mseg_data
FROM (
mseg AS g
INNER JOIN mkpf AS f ON gmblnr = fmblnr
AND gmjahr = fmjahr
INNER JOIN makt AS t ON tmatnr = gmatnr )
FOR ALL ENTRIES IN gt_bukrs
WHERE g~bukrs = gt_bukrs-bukrs
AND f~budat IN s_budat
AND g~werks IN s_werks
AND g~matnr IN s_matnr
AND ( g~bwart = gc_bwart OR
g~bwart = gc_bwart_ebp )
AND t~spras = sy-langu.
CHECK sy-subrc EQ 0.
getting address details
SELECT d~lgort
d~werks
c~region
c~name2
c~taxjurcode
d~lfdnr
c~addrnumber
c~date_from
c~nation
INTO TABLE gt_address_data
FROM (
twlad AS d INNER JOIN
adrc AS c ON caddrnumber = dadrnr
)
FOR ALL ENTRIES IN gt_mseg_data
WHERE d~werks = gt_mseg_data-umwrk
AND d~lgort = gt_mseg_data-umlgo.
getting product code & tax details
SELECT m~matnr
a~kappl
a~kschl
a~lland
a~matkl
a~datbi
k~knumh
k~kopos
k~mwsk1
t~kalsm
t~mwskz
t~procd
INTO TABLE gt_tax_details
FROM ( ( (
mara AS m
INNER JOIN a600 AS a ON mmatkl = amatkl )
INNER JOIN konp AS k ON aknumh = kknumh
AND akappl = kkappl
AND akschl = kkschl )
INNER JOIN t007a AS t ON kmwsk1 = tmwskz )
FOR ALL ENTRIES IN gt_mseg_data
WHERE m~matnr = gt_mseg_data-matnr
AND t~kalsm = gc_kalsm.
IF sy-subrc = 0.
SORT gt_tax_details BY matnr.
DELETE ADJACENT DUPLICATES FROM gt_tax_details COMPARING matnr.
SELECT spras
matkl
wgbez
INTO TABLE gt_t023t
FROM t023t
FOR ALL ENTRIES IN gt_tax_details
WHERE matkl = gt_tax_details-matkl
AND spras = sy-langu.
SORT gt_t023t BY matkl.
ENDIF.
SORT gt_address_data BY lgort werks.
Logic for getting EBP details
LOOP AT gt_mseg_data INTO gs_mseg_data
WHERE bwart = gc_bwart_ebp
AND ablad IS NOT INITIAL.
SPLIT gs_mseg_data-ablad AT '\' INTO gs_scitem_id-object_id
gs_scitem_id-number_int.
IF sy-subrc EQ 0.
APPEND gs_scitem_id TO gt_scitem_id.
CLEAR gs_scitem_id.
ENDIF.
ENDLOOP.
DELETE ADJACENT DUPLICATES FROM gt_scitem_id COMPARING ALL FIELDS.
IF NOT gt_scitem_id[] IS INITIAL.
SELECT SINGLE rfcdest
INTO gv_rfcdest
FROM crmrfcpar.
CALL FUNCTION 'Z_GET_SC_DELADDRESS' DESTINATION gv_rfcdest
EXPORTING
scitem_id = gt_scitem_id
IMPORTING
scdel_details = gt_scitem_address_details.
IF sy-subrc <> 0.
MESSAGE e000 WITH text-e01 text-e02.
ELSE.
ENDIF.
ENDIF.
SORT gt_scitem_address_details BY object_id number_int.
Filling all selected data in display table
LOOP AT gt_mseg_data INTO gs_mseg_data.
Adding MSEG/MKPF/MAKT fields
gs_disp_table-bukrs = gs_mseg_data-bukrs.
gs_disp_table-mblnr = gs_mseg_data-mblnr.
gs_disp_table-budat = gs_mseg_data-budat.
gs_disp_table-werks = gs_mseg_data-werks.
gs_disp_table-sakto = gs_mseg_data-sakto.
gs_disp_table-matnr = gs_mseg_data-matnr.
gs_disp_table-maktx = gs_mseg_data-maktx.
gs_disp_table-menge = gs_mseg_data-menge.
gs_disp_table-meins = gs_mseg_data-meins.
IF gs_mseg_data-menge IS NOT INITIAL.
gs_disp_table-unit_price = gs_mseg_data-dmbtr / gs_mseg_data-menge.
ENDIF.
gs_disp_table-dmbtr = gs_mseg_data-dmbtr.
Address details
READ TABLE gt_address_data INTO gs_address_data
WITH KEY lgort = gs_mseg_data-umlgo
werks = gs_mseg_data-umwrk
BINARY SEARCH.
gs_disp_table-region = gs_address_data-region.
gs_disp_table-name2 = gs_address_data-name2.
gs_disp_table-taxjurcode = gs_address_data-taxjurcode.
Adding Product Code
READ TABLE gt_tax_details INTO gs_tax_details
WITH KEY matnr = gs_mseg_data-matnr.
IF sy-subrc = 0.
gs_disp_table-procd = gs_tax_details-procd.
gs_disp_table-matkl = gs_tax_details-matkl.
CLEAR gs_t023t.
READ TABLE gt_t023t INTO gs_t023t
WITH KEY matkl = gs_tax_details-matkl
BINARY SEARCH.
gs_disp_table-wgbez = gs_t023t-wgbez.
ENDIF.
IF gs_mseg_data-bwart = gc_bwart_ebp.
For EBP
CLEAR: lv_object_id,
lv_number_int.
SPLIT gs_mseg_data-ablad AT '\' INTO lv_object_id
lv_number_int.
CLEAR gs_scitem_address_details.
READ TABLE gt_scitem_address_details
INTO gs_scitem_address_details
WITH KEY object_id = lv_object_id
number_int = lv_number_int
BINARY SEARCH.
gs_disp_table-region = gs_scitem_address_details-region.
gs_disp_table-name2 = gs_scitem_address_details-name_2.
gs_disp_table-taxjurcode = gs_scitem_address_details-taxjurcode.
ENDIF.
APPEND gs_disp_table TO gt_disp_table.
CLEAR: gs_disp_table,
gs_tax_details,
gs_address_data.
ENDLOOP.
ENDFORM. " fetch_data
&----
*& Form display_alv
&----
FORM display_alv .
PERFORM get_alv_events.
PERFORM fieldcat_init.
PERFORM build_top_of_page CHANGING gt_listheader.
CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY'
EXPORTING
i_bypassing_buffer = 'X'
i_buffer_active = ' '
i_callback_program = gv_repid
it_fieldcat = gt_fieldcat[]
it_events = gt_events
is_layout = gs_layout
TABLES
t_outtab = gt_disp_table
EXCEPTIONS
program_error = 1
OTHERS = 2.
IF sy-subrc <> 0.
MESSAGE ID sy-msgid TYPE 'I' NUMBER sy-msgno
WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
ENDIF.
ENDFORM. " display_alv
&----
*& Form get_alv_events
&----
FORM get_alv_events .
CALL FUNCTION 'REUSE_ALV_EVENTS_GET'
EXPORTING
i_list_type = 0
IMPORTING
et_events = gt_events
EXCEPTIONS
list_type_wrong = 1
OTHERS = 2.
IF sy-subrc <> 0.
MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno
WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
ENDIF.
gs_events-form = 'STD_TOP_OF_PAGE'.
MODIFY gt_events FROM gs_events TRANSPORTING form WHERE name =
'TOP_OF_PAGE'.
ENDFORM. " get_alv_events
&----
*& Form fieldcat_init
&----
FORM fieldcat_init.
DATA: ls_fieldcat TYPE slis_fieldcat_alv.
DATA: pos TYPE i VALUE 1.
PERFORM fill_fieldcat_table USING pos 'BUKRS' 'MSEG'.
pos = pos + 1.
PERFORM fill_fieldcat_table USING pos 'MBLNR' 'MSEG'.
pos = pos + 1.
PERFORM fill_fieldcat_table USING pos 'REGION' 'ADRC'.
pos = pos + 1.
PERFORM fill_fieldcat_table USING pos 'BUDAT' 'MKPF'.
pos = pos + 1.
PERFORM fill_fieldcat_table USING pos 'WERKS' 'MSEG'.
pos = pos + 1.
ls_fieldcat-col_pos = pos.
ls_fieldcat-fieldname = 'NAME2'.
ls_fieldcat-tabname = 'GT_DISP_TABLE'.
ls_fieldcat-ref_fieldname = 'NAME2'.
ls_fieldcat-ref_tabname = 'MSEG'.
ls_fieldcat-reptext_ddic = text-c02.
ls_fieldcat-seltext_l = text-c02.
ls_fieldcat-seltext_m = text-c02.
ls_fieldcat-seltext_s = text-c02.
ls_fieldcat-ddic_outputlen = 15.
APPEND ls_fieldcat TO gt_fieldcat.
CLEAR ls_fieldcat.
pos = pos + 1.
PERFORM fill_fieldcat_table USING pos 'TAXJURCODE' 'ADRC'.
pos = pos + 1.
PERFORM fill_fieldcat_table USING pos 'SAKTO' 'MSEG'.
pos = pos + 1.
PERFORM fill_fieldcat_table USING pos 'MATNR' 'MSEG'.
pos = pos + 1.
PERFORM fill_fieldcat_table USING pos 'MAKTX' 'MAKT'.
pos = pos + 1.
PERFORM fill_fieldcat_table USING pos 'MATKL' 'MARA'.
pos = pos + 1.
PERFORM fill_fieldcat_table USING pos 'WGBEZ' 'T023T'.
pos = pos + 1.
PERFORM fill_fieldcat_table USING pos 'PROCD' 'T007A'.
pos = pos + 1.
PERFORM fill_fieldcat_table USING pos 'MENGE' 'MSEG'.
pos = pos + 1.
PERFORM fill_fieldcat_table USING pos 'MEINS' 'MSEG'.
pos = pos + 1.
ls_fieldcat-col_pos = pos.
ls_fieldcat-fieldname = 'UNIT_PRICE'.
ls_fieldcat-tabname = 'GT_DISP_TABLE'.
ls_fieldcat-ref_fieldname = 'DMBTR'.
ls_fieldcat-ref_tabname = 'MSEG'.
ls_fieldcat-reptext_ddic = text-c01.
ls_fieldcat-seltext_l = text-c01.
ls_fieldcat-seltext_m = text-c01.
ls_fieldcat-seltext_s = text-c01.
ls_fieldcat-ddic_outputlen = 15.
APPEND ls_fieldcat TO gt_fieldcat.
CLEAR ls_fieldcat.
pos = pos + 1.
ls_fieldcat-col_pos = pos.
ls_fieldcat-fieldname = 'DMBTR'.
ls_fieldcat-tabname = 'GT_DISP_TABLE'.
ls_fieldcat-ref_fieldname = 'DMBTR'.
ls_fieldcat-ref_tabname = 'MSEG'.
ls_fieldcat-reptext_ddic = text-c04.
ls_fieldcat-seltext_l = text-c04.
ls_fieldcat-seltext_m = text-c04.
ls_fieldcat-seltext_s = text-c04.
ls_fieldcat-ddic_outputlen = 15.
APPEND ls_fieldcat TO gt_fieldcat.
CLEAR ls_fieldcat.
pos = pos + 1.
gs_layout-box_fieldname = 'BOX'.
ENDFORM. " fieldcat_init1
&----
*& Form fill_fieldcat_table
&----
FORM fill_fieldcat_table USING p_pos
value(p_fieldname)
value(p_tabname).
DATA: ls_fieldcat TYPE slis_fieldcat_alv.
ls_fieldcat-col_pos = p_pos.
ls_fieldcat-fieldname = p_fieldname.
ls_fieldcat-tabname = 'GT_DISP_TABLE'.
ls_fieldcat-ref_fieldname = p_fieldname.
ls_fieldcat-ref_tabname = p_tabname.
APPEND ls_fieldcat TO gt_fieldcat.
CLEAR ls_fieldcat.
ENDFORM. " fill_fieldcat_table
&----
*& Form build_top_of_page
&----
FORM build_top_of_page CHANGING l_top_of_page TYPE slis_t_listheader.
DATA:ls_line TYPE slis_listheader.
CLEAR ls_line.
ls_line-typ = 'H'.
ls_line-info = gv_title .
APPEND ls_line TO l_top_of_page.
CLEAR ls_line.
ls_line-typ = 'S'.
ls_line-key = text-t02.
WRITE sy-datum TO ls_line-info.
APPEND ls_line TO l_top_of_page.
CLEAR ls_line.
ENDFORM. " build_top_of_page
&----
*& Form std_top_of_page
&----
FORM std_top_of_page.
CALL FUNCTION 'REUSE_ALV_COMMENTARY_WRITE'
EXPORTING
it_list_commentary = gt_listheader
i_logo = 'ENJOYSAP_LOGO'.
ENDFORM. "std_top_of_page
Reward points if useful.
Regards,
Atish
2007 Jun 25 12:17 AM
Also, here is a very simply example of using the function module based ALV tool.
report zrich_0003 .
* Global ALV Data Declarations
type-pools: slis.
* Internal Tables
data: begin of ialv occurs 0,
test1(10) type c,
test2(10) type c,
end of ialv.
data: fieldcat type slis_t_fieldcat_alv.
start-of-selection.
perform get_data.
perform call_alv.
*********************************************************************
* Form GET_DATA
*********************************************************************
form get_data.
ialv-test1 = 'ABC'.
ialv-test2 = 'DEF'.
append ialv.
ialv-test1 = 'GHI'.
ialv-test2 = 'JKL'.
append ialv.
ialv-test1 = '123'.
ialv-test2 = '456'.
append ialv.
endform. "GET_DATA
************************************************************************
* CALL_ALV
************************************************************************
form call_alv.
perform build_field_catalog.
* Call ABAP List Viewer (ALV)
call function 'REUSE_ALV_GRID_DISPLAY'
exporting
it_fieldcat = fieldcat
tables
t_outtab = ialv.
endform. "CALL_ALV
************************************************************************
* BUILD_FIELD_CATALOG
************************************************************************
form build_field_catalog.
clear: fieldcat. refresh: fieldcat.
data: tmp_fc type slis_fieldcat_alv.
tmp_fc-reptext_ddic = 'Test1'.
tmp_fc-fieldname = 'TEST1'.
tmp_fc-tabname = 'IALV'.
tmp_fc-outputlen = '10'.
append tmp_fc to fieldcat.
tmp_fc-reptext_ddic = 'Test2'.
tmp_fc-fieldname = 'TEST2'.
tmp_fc-tabname = 'IALV'.
tmp_fc-outputlen = '10'.
append tmp_fc to fieldcat.
endform. "BUILD_FIELD_CATALOG
Regards,
RIch Heilman
2011 Mar 25 6:29 AM
| User | Count |
|---|---|
| 3 | |
| 2 | |
| 2 | |
| 1 | |
| 1 | |
| 1 | |
| 1 | |
| 1 | |
| 1 | |
| 1 |