SAP VIM Default Approval can be set in SAP VIM ( Vendor Invoice Management) to allow SAP VIM to retrieve the an?pprover by default in the workflow of DP validation.
This Article will explain ?How to retrieve SAP VIM Default Approval will explain from a Cost Center and a Document Type.
First, I am explaining technically the complexity of how Approval Data is stored in different SAP Table.
Second, I am giving away the full ABAP program ( actually it is a function module I developed) to retrieve the list of Default Approval.
Technical Overview of SAP VIM Default Approval
The Default Approval in SAP VIM can be maintained by Cost Center.
DP Document Type DOCTYPE
DP Document Type defines the type of Document Processing.
The information is set on Document Header in the SAP field /OPT/VIM_1HEAD-DOCTYPE.
Cost Center KOSTL
The cost Center is defined on Document Line level.
The Value can be retrieve from SAP Table /OPT/VIM_1ITEM-KOSTL.
Customizing for Document Type and Cost Center
The Second step is to Read the customizing of Cost Center by the Document Type.
In Order to get all the Data, we need a join between
- Key Determination Range Configuration /PTGWFI/Z_KEYRNG
- Webflow Key Determination Configuration /PTGWFI/Z_KEYDET
All we need is to retrieve the right key?/ptgwfi/z_keydet-OKEY
Key Determination Range Configuration : /PTGWFI/Z_KEYRNG
This table sets the Rules to link?with Selection-Option Kind Rules between
- Document Type and a RangeId
- Cost Center and a Range ID
[table tablesorter=”o” class=”table table-border”]
Field, Description
MANDT , Client
RANGEID , Range ID for Key Determination
SEQUENCE , Four-digit number
SIGN , I/E (include/exclude values)
ZOPTION , Selection option (EQ/BT/CP/…)
LOW , ABAP/4: Selection value
HIGH , ABAP/4: Selection value
[/table]
Webflow Key Determination Configuration /PTGWFI/Z_KEYDET
This table sets the links between
- The RangeId and the Attribut Value (OBJATTRIB)
[table tablesorter=”o” class=”table table-border”]
Field, Description
MANDT , Client
ZPDCD , Client
OKDEF , Product Code
OKEY , Output Key Definition
FIELDID , Output Key Value
RANGEID , Character Field Length = 10
OBJTYP , Range ID for Key Determination
OBJATTRIB , Object Type
SUBOFFSET , Object key
SUBLENGTH , Natural Number
ZORGL , Natural Number
ZDUP , Natural Number
[/table]
Retrieve list of SAP VIM Default Approver User form Hierarchy
With the OKEY retrieve previously and filtered by the input COST Center and DocType, we retrieve the users list from the /PTGWFI/W_ORG with these parameters:
- ZRSP =?’XXXX_DFLT_APPR’ ?” XXXX must be remplaced with your customizing schema.
- OBJTY =?’US’ ? ” Person
Check this link for More information on SAP VIM Tables
How to retrieve SAP VIM Default Approval from Cost Center
Function Retrieve Default Approval from Cost Center
function ZVIM_GET_DFLT_APPR .
*"----------------------------------------------------------------------
*"*"Local Interface:
*" IMPORTING
*" VALUE(IV_DOCTYPE) TYPE /OPT/DOCTYPE OPTIONAL
*" EXPORTING
*" REFERENCE(ET_DFLT_APPR) TYPE USMD_T_USER
*" TABLES
*" INDEX_ITEM STRUCTURE /OPT/VIM_1ITEM
*"----------------------------------------------------------------------
types: begin of ty_keys,
okey like /ptgwfi/z_keydet-okey,
objattrib like /ptgwfi/z_keydet-objattrib,
sign like /ptgwfi/z_keyrng-sign,
zoption like /ptgwfi/z_keyrng-zoption,
low like /ptgwfi/z_keyrng-low,
high like /ptgwfi/z_keyrng-high,
end of ty_keys.
data: lv_kostl type kostl.
data: lr_doctype type range of /opt/doctype.
data: lr_kostl type range of kostl.
data: lt_keys type table of ty_keys.
data: lv_okey like /ptgwfi/z_keydet-okey.
data: ls_item type /opt/vim_1item.
field-symbols: like line of lt_keys.
field-symbols: like line of lr_doctype.
field-symbols: like line of lr_kostl.
" Get Cost center from Item
read table index_item into ls_item index 1.
if sy-subrc = 0 .
lv_kostl = ls_item-kostl.
endif.
check lv_kostl is not initial .
if iv_doctype is initial and lv_kostl is initial .
return.
endif.
"-----------------------------------------------------------------------"
" Read the Customizing for Doc Type & Cost Center
"-----------------------------------------------------------------------"
select det~okey det~objattrib rng~sign rng~zoption rng~low rng~high
from /ptgwfi/z_keyrng as rng
inner join /ptgwfi/z_keydet as det
on rng~rangeid = det~rangeid
into table lt_keys
where det~okdef = 'XXXX_DFLT_APPR'
and ( det~objattrib = 'DOCUMENTTYPE' or det~objattrib = 'COSTCENTER' ) .
sort lt_keys by okey.
"-----------------------------------------------------------------------"
" Keep only relevant OKEY
"-----------------------------------------------------------------------"
loop at lt_keys assigning .
lv_okey = -okey.
" Check by Okey Id
at new okey.
refresh: lr_doctype, lr_kostl.
endat.
" Fill Selection Option
case -objattrib.
when 'DOCUMENTTYPE'. populate_range_doctype .
when 'COSTCENTER'. populate_range_kostl.
when others.
endcase.
" Check relevant Keys ?
at end of okey.
if not ( iv_doctype in lr_doctype
and lv_kostl in lr_kostl ).
" Not Relevant -> Delete
delete lt_keys where okey = lv_okey.
endif.
endat.
endloop.
" We only need the OKEY id
if lt_keys[] is not initial .
delete adjacent duplicates from lt_keys comparing okey.
endif.
"-----------------------------------------------------------------------"
" Get Users with these OKEY Ids
"-----------------------------------------------------------------------"
select objid from /ptgwfi/w_org into table et_dflt_appr
for all entries in lt_keys
where zrsp = 'XXXX_DFLT_APPR'
and objty = 'US'
and zadky = lt_keys-okey.
if et_dflt_appr[] is initial .
return.
else.
sort et_dflt_appr .
delete adjacent duplicates from et_dflt_appr comparing all fields.
endif.
endfunction.
Defintion of Macro to populate Range
The first need is to create a range for DP DocType (DOCTYPE)
define populate_range_doctype. append initial line to lr_doctype assigning . -sign = -sign. -option = -zoption. -low = -low. -high = -high. end-of-definition.
The Second macro will populate a range for Cost Center ( KOSTL )
define populate_range_kostl. append initial line to lr_kostl assigning . -sign = -sign. -option = -zoption. -low = -low. -high = -high. end-of-definition.