‎2006 Jun 23 10:20 PM
Hi All,
I have a ALV report based on workflow which helps the coders, approvers to choose as many invoices and 'Forward' 'Reject' or "approve' invoices at one time.
I am having runtime issues. This is how the code looks. Can anyone please help me and see what I am doing wrong or how do I get to run this report faster.
It doesn't take a lot of time fetching data from VBKPF and VBSEGK. Its in the PERFORM PROCESS_FI_INVOICE which takes a lot of time.
Any help is appreciated
START-OF-SELECTION.
PERFORM get_fi_mm_parked_docs.
FORM get_fi_mm_parked_docs .
SELECT * FROM vbkpf INTO TABLE int_bkpf
WHERE bukrs IN s_bukrs AND
belnr IN s_belnr AND
gjahr IN s_gjahr AND
bldat IN s_bldat AND "INVOICE DATE
xblnr IN s_xblnr AND
blart IN s_blart AND
tcode IN s_fi AND "FV60 and FBV1
bstat = c_bstat. "V - only parked
SELECT * FROM vbsegk INTO TABLE int_bseg
FOR ALL entries in int_bkpf
WHERE bukrs = int_bkpf-bukrs AND
belnr = int_bkpf-belnr AND
gjahr = int_bkpf-gjahr AND
lifnr IN s_lifnr AND
wrbtr IN s_wrbtr.
PERFORM PROCESS_FI_INVOICE.
END-OF-SELECTION.
FORM PROCESS_FI_INVOICE .
FOR ALL THE FI INVOICES, BASED ON THE OBJECT KEY GET THE WORK ITEM IDS
FOR FI INVOICES THE OBJECT KEY IS DOC #, CC AND FISCAL YEAR
LOOP AT int_bseg.
CLEAR: wf_flag, object_key, wf_objkey, zfbdt, first_dis_date, discount_per.
READ HEADER TABLE
READ TABLE int_bkpf WITH KEY bukrs = int_bseg-bukrs
belnr = int_bseg-belnr
gjahr = int_bseg-gjahr.
CHECK sy-subrc = 0.
PERFORM get_fi_invoice.
IF NOT int_worklist[] IS INITIAL.
NOW ALL THE WORK ITEMS IS IN TABLE INT_WORKLIST
LOOP AT int_worklist.
IF THERE IS VALUE ON SELECTION SCREEN FOR WI_ID
IF NOT s_wiid[] IS INITIAL.
IF int_worklist-wi_id IN s_wiid.
ELSE.
CONTINUE.
ENDIF.
ENDIF.
TRAFFIC LIGHT COLUMN
PERFORM get_traffic_light_fi USING OBJECT_key int_worklist-wi_id c_fi_task.
if no child WI is found for the parent..continue.
IF wf_wi_cancelled = 'Y'.
continue.
ENDIF.
CURRENT AGENT
IF wf_flag = 'Y'.
CONTINUE.
ENDIF.
CLEAR object_key.
object_key = wf_objkey.
swc_create_object duedat 'FIPP' object_key.
swc_get_property duedat 'zDueDate' zfbdt.
FIRST DISCOUNT DATE
swc_get_property duedat 'zVend1stDiscDate' first_dis_date.
GET THE DISCOUNT%
swc_get_property duedat 'zVend1stDisc' discount_per.
GET VENDOR NAME
PERFORM get_vendor_name USING int_bseg-lifnr
CHANGING int_fields-name1.
MOVE: int_worklist-wi_id TO int_wi-top_wi_id,
swwwihead-wi_id TO int_wi-wi_id.
APPEND int_wi.
CLEAR int_wi.
clear: zapinv_header.
ELSEIF INT_BKPF-TCODE = C_FV60.
GET THE PRIORITY PAY
if not int_bkpf-zzdocumentumid is initial.
WF_OBJKEY = INT_BKPF-AWKEY.
SELECT SINGLE * FROM zapinv_header INTO zapinv_header
WHERE id = int_bkpf-zzdocumentumid.
IF sy-subrc = 0.
IF zapinv_header-priority_pay_ind = 'Y'.
MOVE 'Priority pay' TO int_fields-pay.
MOVE 'C601' to int_fields-color_line.
ENDIF.
ENDIF.
endif.
MOVE ALL THE FIELDS TO AN INTERNAL TABLE
MOVE: int_bkpf-bukrs TO int_fields-bukrs,
int_bkpf-belnr TO int_fields-belnr,
int_bkpf-gjahr TO int_fields-gjahr,
int_bkpf-xblnr TO int_fields-xblnr,
int_bseg-lifnr TO int_fields-lifnr,
int_bkpf-bldat TO int_fields-bldat,
zfbdt TO int_fields-zfbdt,
first_dis_date TO int_fields-first_discount_date, "FIRST DISCOUNT DATE
discount_per TO int_fields-discount, "DISCOUNT%
wf_awkey TO int_fields-inv_doc, "INVOICE DOC NUMBER
int_bkpf-blart TO int_fields-blart,
wf_po TO int_fields-ebeln,
wf_po_item TO int_fields-ebelp,
int_bseg-zlspr TO int_fields-zlspr, "PAYMENT BLOCK KEY
int_bseg-wrbtr TO int_fields-wrbtr, "INVOICE AMOUNT
int_worklist-wi_id TO int_fields-wi_id,
swwwihead-wi_id TO int_fields-wi_id,
zname TO int_fields-wi_aagent,
int_bkpf-tcode TO int_fields-tcode,
int_bkpf-awkey TO int_fields-awkey,
int_bkpf-zzdocumentumid TO int_fields-ID.
WF_INDEX TO INT_FIELDS-INDEX.
WRITE icon_tif TO int_fields-url.
IF NOT wf_lin IS INITIAL.
wf_lin = wf_lin + 1.
MOVE wf_lin TO int_fields-index.
ELSE.
MOVE wf_index TO int_fields-index.
ENDIF.
APPEND int_fields. CLEAR: int_fields, wf_po, wf_po_item, wf_objkey, object_key, zfbdt, first_dis_date,
lfa1, wf_awkey, zapinv_header, int_bseg, int_bkpf, swwwihead, object_key,
discount_per, int_worklist, wf_flag.
wf_index = wf_index + 1.
ENDLOOP.
ELSE.
FOR INVOICES WHICH DOEN'T HAVE A WI ATTACHED, WE STILL NEED TO SHOW ON THE REPORT
WITH ALL THE ATTRIBUTES
if wf_admin = 'Y' AND p_no_wi = 'X'..
perform get_attr_for_inv_without_wi_FI.
endif.
ENDIF.
refresh int_worklist. clear int_worklist.
ENDLOOP.
ENDFORM.
********************************************************
*********************FORMS****************************
********************************************************
FORM get_fi_invoice .
CONCATENATE int_bseg-bukrs int_bseg-belnr int_bseg-gjahr INTO wf_objkey.
PERFORM get_workitems_to_object USING wf_objkey
c_fi_typ
int_bkpf-zzdocumentumid.
CLEAR wf_awkey.
wf_awkey = int_bkpf-awkey+4(10).
ENDFORM. " GET_FI_INVOICE
FORM get_workitems_to_object USING p_objkey
p_typ
p_id.
CLEAR int_worklist. REFRESH int_worklist.
if int_bkpf-tcode in s_fi[].
SELECT SINGLE wiid INTO zapinv_wi-wiid
FROM zapinv_wi
WHERE tid = p_id.
IF sy-subrc EQ 0.
int_worklist-wi_id = zapinv_wi-wiid.
APPEND int_worklist.
ENDIF.
endif.
CLEAR zapinv_wi.
ENDFORM.
FORM get_traffic_light_fi USING p_key p_id p_task.
get current agent name
CLEAR: object_key, zname, int_agents, swwwihead,container, cnt_elem_tab, wf_flag, wf_wi_cancelled.
REFRESH: int_agents, container, cnt_elem_tab.
SELECT SINGLE * FROM swwwihead INTO swwwihead
WHERE top_wi_id = p_id AND
wi_type = 'W' AND
wi_stat IN s_wistat AND
WI_RH_TASK = p_task.
IF sy-subrc = 0.
read the container and get the status
CALL FUNCTION 'SWK_WI_CONTAINER_READ'
EXPORTING
im_wi_id = swwwihead-wi_id
TABLES
cnt_elem_tab = cnt_elem_tab.
ELSE.
wf_wi_cancelled = 'Y'.
ENDIF.
GET THE AGENT NAME
READ TABLE cnt_elem_tab WITH KEY element = 'DeliverTo'.
IF sy-subrc = 0.
PERFORM get_agent_name.
ENDIF.
IF THE USER IS AN ADMIN, SHOW ALL WORK ITEMS
IF WF_ADMIN = 'Y'.
if an agent name is input on the screen, show only workitems associated with that user
IF NOT s_agent[] IS INITIAL.
IF object_key IN s_agent.
ELSE.
CLEAR wf_flag.
wf_flag = 'Y'.
ENDIF.
ENDIF.
if the user is a coder
ELSEIF WF_ADMIN <> 'Y' AND WF_CODER = 'Y'.
IF SY-UNAME = OBJECT_KEY.
ELSE.
wf_flag = 'Y'.
ENDIF.
if the user is an approver
ELSEIF wf_admin <> 'Y' AND wf_coder <> 'Y'.
IF OBJECT_KEY IN S_AGENT[].
ELSE.
wf_flag = 'Y'.
ENDIF.
ENDIF.
IF wf_flag <> 'Y'.
READ TABLE cnt_elem_tab WITH KEY element = 'PostingStatus'.
IF sy-subrc = 0.
CASE cnt_elem_tab-value.
WHEN 'F'. "FAILURE = RED LIGHT
WRITE icon_red_light AS ICON TO int_fields-traffic.
MOVE 'Not Ready To Post' TO int_fields-status.
WHEN 'P' OR 'R'..
CHECK FOR YELLOW AND GREEN LIGHT
CHECK THE PAYMENT BLOCK FIELD, IF ITS BLANK, GREEN LIGHT
IF int_fields-zlspr = ' '.
Here make another check..to see if the user has approval authorization. If
yes turn the light green..else make it yellow and change the description
to 'Insufficient approval authority'.
PERFORM check_approve_authorization TABLES int_bkpf
USING wf_fi_typ.
IF wf_ind = 'N'.
WRITE icon_yellow_light AS ICON TO int_fields-traffic.
MOVE 'Insufficient approval authority' TO int_fields-status.
ELSE.
WRITE icon_green_light AS ICON TO int_fields-traffic.
MOVE 'Ready To Post' TO int_fields-status.
ENDIF.
ELSE.
WRITE icon_yellow_light AS ICON TO int_fields-traffic.
MOVE 'Blocked' TO int_fields-status.
ENDIF.
ENDCASE.
ENDIF.
ENDIF.
ENDFORM. " GET_TRAFFIC_LIGHT
‎2006 Jun 23 10:35 PM
For starters change the highlighted code:
FORM process_fi_invoice .
* FOR ALL THE FI INVOICES, BASED ON THE OBJECT KEY GET THE WORK ITEM IDS
* FOR FI INVOICES THE OBJECT KEY IS DOC #, CC AND FISCAL YEAR
<b> SORT int_bkpf BY bukrs belnr gjahr.</b>
LOOP AT int_bseg.
CLEAR: wf_flag, object_key, wf_objkey, zfbdt, first_dis_date,
discount_per.
* READ HEADER TABLE
READ TABLE int_bkpf WITH KEY bukrs = int_bseg-bukrs
belnr = int_bseg-belnr
<b> gjahr = int_bseg-gjahr
BINARY SEARCH.</b>
CHECK sy-subrc = 0.
PERFORM get_fi_invoice.
Rob