Application Development and Automation Discussions
Join the discussions or start your own on all things application development, including tools and APIs, programming models, and keeping your skills sharp.
cancel
Showing results for 
Search instead for 
Did you mean: 
Read only

Runtime issue - workflow ALV report

Former Member
0 Likes
460

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

1 REPLY 1
Read only

Former Member
0 Likes
372

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