Application Development 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: 

Interface validation

former_member529475
Active Contributor
0 Kudos

Hi

This is my existing interface ,I need to do a validation on Unique id,which i need to add to custom table ZBACKS_GIPD.

Check if there is same unique id within the upload file.

Check from table ZBACKS_GIPD if the same Unique ID already exists ,

Update log file with error message :"Duplicate record"

Please let me know where I need to add this validation in the below code.

REPORT ZBAB005 LINE-SIZE 255

LINE-COUNT 58(2)

NO STANDARD PAGE HEADING

MESSAGE-ID 00.

TABLES: MARA, "Material master

MARC, "Plant Data for Material

MBEW, "Material Valuation

T001K, "Valuation area

t100, "Messages

kna1, "Customer master

SKB1, "G/L account

BKPF, "FIN doc

zprdordhdr, "production order header

ZSTDLOADING, "BACKS-SAP Interface - Generic ProdOrd costing data

ZBACKS_GIPD. "BACKS-SAP Interface - Material Consumption

  • Short name of the interface name

DATA: INTFNAME(4) value 'GIPD'. "Good Issues for Prod. Order

include zbab000. "Common procedures for files handling

SELECTION-SCREEN BEGIN OF BLOCK 6 WITH FRAME TITLE TEXT-006.

parameters: p_usafl obligatory default 'E'. "Usgae indicator

parameters: p_chk_ui as checkbox "check invalid usage ind "UATK922842

default space. "UATK922842

parameters: p_chk_pd as checkbox "check period of the posting date

default 'X'. "UATK923027

SELECTION-SCREEN END OF BLOCK 6.

SELECTION-SCREEN BEGIN OF BLOCK 7 WITH FRAME TITLE TEXT-007.

parameters: fb70mode default 'N'.

parameters: fb50mode default 'N'.

SELECTION-SCREEN END OF BLOCK 7.

SELECTION-SCREEN BEGIN OF BLOCK 8 WITH FRAME TITLE TEXT-008.

parameters:

p_nor radiobutton group rad1, "new posting

p_rep2 radiobutton group rad1. "report (flag '2')

select-options:

recno for zbacks_gipd-recno "record number

default '1' obligatory.

SELECTION-SCREEN END OF BLOCK 8.

DATA: BEGIN OF TAB OCCURS 1000,

WERKS(04), "plant

AUFNR(25), "production order number

MATNR(18), "material

ERDAT(10), "BACKS tx date

MENGE_as_string(17), "qty

USAFL(01), "consumption/usage indicator

SAKNR(10), "G/L account number (this is from user's data file,

"use SAKNR_FOR_POSTING to post mat. doc instead)

  • EXPCD(02), "expenses code

IDNUM(35), "BACKS Identification number

kunnr(10), "customer number

  • The below 3 fields have no use in SAP transactions

  • however they are included in the data file from BACKS.

  • Just store them in ZBACKS_GIPD for future use if required

USACD(10), "usage code

ORDCD(10), "order code

LOSTY(03), "loss type

COTAX(13), " like zbacks_gipd-cotax, "consumption tax

MWSKZ(02), " like zbacks_gipd-MWSKZ, "tax code

  • The below fields are not included in the BACKS incoming data file

  • They are only for the processing of this program

RECNO(10), "record number in the uploaded data file

FAILF(01), "Status flag (0=OK, see documentation for details)

MSGNR(01), "message number

MSGTX(200), "message text

menge(13) type p decimals 3, "qty as numeric

BUKRS like t001-bukrs, "company code

PRCTR like marc-prctr, "profit center

matkl like mara-matkl, "material group

unitstdcost type p decimals 3,"standard cost (per 1 EA)

matloading type i, "material loading

runum like zprdordhdr-runum,"prod. order running number

  • SAKNR like zexpense-saknr, "account no.

KOSTL like zexpense-kostl, "cost center

saknr_for_posting like bseg-saknr,"G/L acct after validation

erdat_raw(10), "BACKS tx date (MM/DD/YYYY)

**>>1104

  • post_seq_ORIG like DATATYPE-INTEGER4,

  • "(5) type n, "random number: posting order

  • post_seq_RAND like DATATYPE-INTEGER4,

  • "(5) type n, "random number: posting order

**>>1104

MATDOC(10), "material document

MATDOCITEM(4), "material document item number

Direction(1), "I=Issue, R=Reverse (based on the +/- of MENGE)

ladra like zbacks_gipd-ladra, "material loading rate

hdr_SUBPR like zprdordhdr-SUBPR, "Sub-con Prodorder "UATK922842

  • the below 2 fields are added to resolve 1-yen issue "DEVK914235

STOCKQTY like ZBACKS_GIPD-STOCKQTY, "total stock (from MBEW)

SALK3 like ZBACKS_GIPD-SALK3, "total value before issue

ISSUESTPRS like ZBACKS_GIPD-ISSUESTPRS,"unit std cost

END OF TAB.

data: START_RECNO like ZBACKS_GIPD-recno.

DATA: BEGIN OF BDCDATA OCCURS 100.

INCLUDE STRUCTURE BDCDATA.

DATA: END OF BDCDATA.

data: begin of msgtab occurs 0.

INCLUDE STRUCTURE BDCMSGCOLL.

data: end of msgtab.

----


  • Constants used in A/C & Inv postings *

----


  • for JV posting

CONSTANTS:

CONST_SAKNR_WIP_LABOUR_OH like BSEG-SAKNR "G/L act: WIP-Labour & O/H

value '0000141000',

CONST_SAKNR_WIP_MAT_LOAD like BSEG-SAKNR "G/L act: WIP Matl. Loading

value '0000543004',

CONST_SAKNR_WIP_MAT like BSEG-SAKNR "G/L act: WIP matl

value '0000140000',

CONST_SAKNR_OTHER_INCOME like BSEG-SAKNR "G/L act: Other income

value '0000725000', "was: '0000400310',

CONST_SAKNR_WIP_MAT_SUB_CON like BSEG-SAKNR "G/L act: Mat supplied

value '0000126001'. "to subcontractor

  • for material movement (inventory posting)

CONSTANTS:

CONST_LGORT like mseg-LGORT "storage location

value 'STR1',

CONST_CHARG like mseg-charg "batch number

value 'BACKS'.

  • for AR customer invoice for sub-contractor

CONSTANTS:

CONST_TAX_RATE type p decimals 2 value '0.05', "i.e. 5%

CONST_PENALTY_RATE type p decimals 2 value '0.2'. "i.e. 20%

----


  • Structures & internal tables for BAPI - Material movement *

----


  • Header segment with control information

DATA: BEGIN OF GOODSMVT_HEADER OCCURS 0.

INCLUDE STRUCTURE BAPI2017_GM_HEAD_01.

DATA: END OF GOODSMVT_HEADER.

DATA: BEGIN OF GOODSMVT_CODE OCCURS 0.

INCLUDE STRUCTURE BAPI2017_GM_CODE.

DATA: END OF GOODSMVT_CODE.

DATA: BEGIN OF GOODSMVT_ITEM OCCURS 0.

INCLUDE STRUCTURE BAPI2017_GM_ITEM_CREATE.

DATA: END OF GOODSMVT_ITEM.

DATA: BEGIN OF REMSG OCCURS 0.

INCLUDE STRUCTURE BAPIRET2.

DATA: END OF REMSG.

DATA: BEGIN OF GOODSMVT_HEADRET OCCURS 0.

INCLUDE STRUCTURE BAPI2017_GM_HEAD_RET.

DATA: END OF GOODSMVT_HEADRET.

*DATA: MATDOC LIKE BAPI2017_GM_HEAD_RET-MAT_DOC.

DATA: DOCYEAR LIKE BAPI2017_GM_HEAD_RET-DOC_YEAR.

----


  • Structures & internal tables for BAPI - Account Doc Posting *

----


DATA: DOCUMENTHEADER like BAPIACHE08.

DATA: BEGIN OF ACCOUNTGL occurs 0.

include structure BAPIACGL08.

DATA: END OF ACCOUNTGL.

DATA: BEGIN OF CURRENCYAMOUNT occurs 0.

include structure BAPIACCR08.

DATA: END OF CURRENCYAMOUNT.

DATA: BEGIN OF RETURN occurs 0.

include structure BAPIRET2.

DATA: END OF RETURN.

----


  • Misc. internal tables and variable for error logging *

----


DATA: BEGIN OF ERRTX OCCURS 0,

MSGTX(110).

DATA: END OF ERRTX.

DATA: ERR(1) TYPE C.

  • TTLQTY(12) TYPE P,

  • SUCQTY(12) TYPE P,

  • FALQTY(12) TYPE P.

----


  • Calculation variables for sub-contractor *

----


data: ar_amt_vendor type p decimals 0.

data: ar_amt_penalty type p decimals 0.

data: ar_amt_total type p decimals 0.

data: ar_amt_tax type p decimals 0.

data: ar_amt_vendor_as_text(13).

data: ar_amt_penalty_as_text(13).

data: ar_amt_total_as_text(13).

data: ar_amt_tax_as_text(13).

data: last_werks like tab-werks. "plant

data: last_matnr like tab-matnr. "to avoid locking problem -> Sleep if

"the current p/n is the same as the last one

data: last_direction.

DATA: FI_DOC_TEXT(50). "contains: 1-35: BACKS ID

" 36-50: Quantity

data: begin of tab_by_matnr occurs 0.

include structure tab.

data: end of tab_by_matnr.

data: MATDOC_AND_ITEM(16). "to put in reference fields

----


  • Data for mat doc item rearrangement *

----


*Max. no. of items in a single material doc.

*This number must be less than the half of the FI doc. item limit (999)

constants:

c_max_mat_doc_items type i value '400'.

  • last flag to indicate if a break is required

data: l_last_matnr like tab-matnr. "last material

data: l_last_direction like tab-direction. "last direction (+ or -)

data: l_last_werks like tab-werks. "last plant

  • count the no. of items (to check against the max. no. of item limit)

data: l_matnr_counter type i.

----


  • Start and End date of the allowed posting priod *

----


data: g_period_start_date like sy-datum. "first date of current period

data: g_period_end_date like sy-datum. "end date of current period

----


  • Stock info before Goods issue (to solve 1-yen issue) *

----


data: G_SALK3(16) type p decimals 0. "total stock value

data: G_LBKUM like mbew-lbkum. "total stock qty

*----


  • T O P O F P A G E

*----


TOP-OF-PAGE.

CALL FUNCTION 'Z_PRINT_REPORT_HEADING'

EXPORTING

I_WERKS = 'IHK1'

I_LINSZ = SY-LINSZ

I_CPROG = SY-CPROG

I_TITLE = SY-TITLE.

WRITE: /1(006) 'Plant' color 1,

(025) 'Production Order No' color 1,

(018) 'Material' color 1,

(010) 'CreDate' color 1,

(015) 'Qty' color 1,

(010) 'Usage Ind.' color 1,

(010) 'G/L Acct.' color 1,

(025) 'BACKS ID' color 1,

(010) 'Cust.No.' color 1,

(001) 'Fail Flag' color 1,

(100) 'Message' color 1.

ULINE.

----


  • START - OF - SELECTION *

----


START-OF-SELECTION.

if p_chk_pd = 'X'. "check preiod is needed "UATK923027

perform start_end_date_of_period. "calculate period start/end date

if g_period_start_date is initial "if the start/end date is not

or g_period_end_date is initial. "determined, stop the program

write: / 'Period start/end date not determined, program stopped.'.

stop.

endif.

endif.

if p_nor = 'X'.

PERFORM COMMON_SETUP_FILENAMES. "auto setup filenames by current date

PERFORM COMMON_UPLOAD_FILES. "upload input files: TXT and FLG

PERFORM CONVERSION_DATA.

elseif p_rep2 = 'X'.

perform read_data_from_GIPD.

endif.

PERFORM CHECK_DATA.

PERFORM MAIN_UPDATE.

PERFORM PRINT_OUTPUT.

PERFORM COMMON_DOWNLOAD_FILES. "download the log & status file

----


  • FORM READ_DATA_FROM_GIPD *

----


form read_data_from_GIPD.

select * from zbacks_gipd

where failf = '2'

and recno in recno.

clear tab.

clear result_total. "reset the record counter

tab-werks = zbacks_gipd-WERKS. "plant

tab-aufnr = zbacks_gipd-AUFNR. "production order no.

tab-matnr = zbacks_gipd-MATNR. "material

tab-erdat = zbacks_gipd-BUDAT. "transaction date

tab-recno = zbacks_gipd-recno.

TAB-MENGE = zbacks_gipd-menge. "qty

TAB-USAFL = zbacks_gipd-usafl. "usage/consumption ind.

  • TAB-EXPCD "Expenses code

TAB-SAKNR = zbacks_gipd-saknr. "G/L account number

TAB-IDNUM = zbacks_gipd-idnum. "BACKS identification no.

TAB-KUNNR = zbacks_gipd-kunnr. "Customer Number

TAB-USACD = zbacks_gipd-usacd. "usage code

TAB-ORDCD = zbacks_gipd-ordcd. "order code

TAB-LOSTY = zbacks_gipd-losty. "loss type

TAB-COTAX = zbacks_gipd-cotax. "consumption tax

TAB-MWSKZ = zbacks_gipd-mwskz. "tax code

tab-runum = zbacks_gipd-runum. "running number

tab-failf = zbacks_gipd-failf. "failure flag

tab-msgnr = zbacks_gipd-failf. "failure flag

tab-matdoc = zbacks_gipd-docm1. "material doc

tab-msgtx = 'Repost 2nd step'.

  • tab-erdat_raw = tab-erdat. "keep the MM/DD/YYYY format

  • CONCATENATE TAB-ERDAT6(4) TAB-ERDAT0(2) TAB-ERDAT+3(2)

  • INTO TAB-ERDAT.

concatenate tab-erdat+4(2) '/'

tab-erdat+6(2) '/'

tab-erdat+0(4)

into tab-erdat_raw.

*Process only a particular set of usage indicator first

if tab-usafl = p_usafl.

APPEND TAB.

result_total = result_total + 1. "Increase the record counter

endif.

endselect.

write: / 'Re-processing records for usage indicator', p_usafl.

endform.

----


  • FORM CONVERSION_DATA *

----


FORM CONVERSION_DATA.

data: saknr_len type i. "field length of GL acct

data: kunnr_len type i. "field length of cust no.

describe field tab-saknr length saknr_len.

describe field tab-kunnr length kunnr_len.

clear result_total. "reset the record counter

LOOP AT STR_TXT.

CLEAR TAB.

SPLIT STR_TXT-SLINE AT '|'

INTO TAB-WERKS "plant

TAB-AUFNR "production order no.

TAB-MATNR "material

TAB-ERDAT "transaction date

TAB-MENGE_as_string "qty

TAB-USAFL "usage/consumption ind.

  • TAB-EXPCD "Expenses code

TAB-SAKNR "G/L account number

TAB-IDNUM "BACKS identification no.

TAB-KUNNR "Customer Number

TAB-USACD "usage code

TAB-ORDCD "order code

TAB-LOSTY "loss type

TAB-COTAX "consumption tax

TAB-MWSKZ "tax code

.

tab-erdat_raw = tab-erdat. "keep the MM/DD/YYYY format

CONCATENATE TAB-ERDAT6(4) TAB-ERDAT0(2) TAB-ERDAT+3(2)

INTO TAB-ERDAT.

tab-menge = tab-menge_as_string. "convert to numeric field

*set tab-msgnr to 1 for invalid usage indicator

*so that the error records will be included in the error log

if p_chk_ui = 'X'.

perform check_usage_indicator.

endif.

*Process only a particular set of usage indicator first

*{Gary Tang 02/10/2003 UATK922842 also include MSGNR=1 (invalid usage

*incicator records

if tab-usafl = p_usafl "this is the target usage indicator

or tab-msgnr = '1'. "this is 1 because of invalid usage ind.

*}Gary Tang 02/10/2003 UATK922842

  • add leading zero to numeric GL acct no.

  • e.g. data file: 230330 --> convert to: 0000230330

CALL FUNCTION 'Z_PURE_NUMERIC_ADD_LEADING_0'

EXPORTING

INPUT_FIELD = tab-saknr

TARGET_LEN = saknr_len

IMPORTING

OUTPUT_FIELD = tab-saknr

.

  • add leading zero to numeric cust num

  • e.g. data file: 3100001 --> convert to: 0003100001

  • e.g. data file: NEC-JP --> no conversion: NEC-JP

CALL FUNCTION 'Z_PURE_NUMERIC_ADD_LEADING_0'

EXPORTING

INPUT_FIELD = tab-kunnr

TARGET_LEN = kunnr_len

IMPORTING

OUTPUT_FIELD = tab-kunnr

.

APPEND TAB.

result_total = result_total + 1. "Increase the record counter

endif.

ENDLOOP.

write: / 'Processing records for usage indicator', p_usafl.

ENDFORM.

----


  • FORM CHECK_DATA *

----


FORM CHECK_DATA.

if p_nor = 'X'.

PERFORM GET_NEXT_RECNO.

endif.

LOOP AT TAB.

perform check_data_on_period."record date must in current period

perform check_data_on_zprdordhdr. "production order header

perform check_data_on_mara. "material master (general)

perform check_data_on_marc. "material master (plant)

perform check_data_on_t001k. "company code vs plant

perform check_data_on_mbew. "Material Valuation

perform check_usage_indicator. "usage indicator

perform check_sub_contract. "must have customer number

perform check_data_on_kna1. "customer number

perform check_data_on_skb1. "G/L account

perform check_menge. "quantity

  • perform check_expense. "for eXpenses

perform calculate_materail_loading.

  • perform gen_random_posting_sequence.

if p_nor = 'X'.

PERFORM INSERT_TABLE_ZBACKS_GIPD.

endif.

MODIFY TAB.

endloop.

if p_nor = 'X'.

  • print the last record number for reference

write: / 'ZBACKS_GIPD record number (RECNO) to :',

ZBACKS_GIPD-RECNO.

skip 1.

endif.

endform.

----


  • FOMR Gen_random_posting_sequence *

----


*form gen_random_posting_sequence.

*

  • tab-post_seq_ORIG = SY-TABIX.

*

  • if tab-msgnr = '1'. "no need to go further if already rejected

  • tab-post_seq_RAND = 0.

  • else.

*

  • CALL FUNCTION 'RANDOM_I4'

  • EXPORTING

  • RND_MIN = 1

  • RND_MAX = 50000

  • IMPORTING

  • RND_VALUE = tab-Post_seq_RAND

  • .

  • endif.

*

*

*endform.

----


  • FOMR CHECH_MENGE *

----


form check_MENGE.

if tab-menge > 0. "Issue qty > 0

tab-direction = 'I'. "Issue (i.e. decrease the inventory)

elseif tab-menge < 0. "Issue qty < 0

tab-direction = 'R'. "Reverse (i.e. increase the inventory

elseif tab-menge = 0. "Issue qty = 0 ==> Strange case, error!

TAB-MSGNR = '1'.

tab-msgtx = 'Qty is 0. Nothing to post!'.

endif.

endform.

----


  • FOMR CHECH_USAGE_INDICATOR *

----


form check_usage_indicator.

case tab-usafl.

when 'I'. "Inhouse production

when 'E'. "External procurement

when 'X'. "Expense

when 'T'. "transfer to sub-contractor

when 'S'. "sale to sub-contractor

when 'C'. "consign to sub-contractor

  • when '?'. "add new usage indicator here if needed!

when others. "illegal value! reject the record

TAB-MSGNR = '1'.

  • concatenate 'Invalid usage indicator'

  • into tab-msgtx separated by space.

tab-msgtx = 'Invalid usage indicator'.

endcase.

endform.

*form check_expense.

*

  • check not tab-msgnr = '1'. "no need to go further if already rejected*

*

  • check tab-usafl = 'X'. "only for expense

*

*

  • SELECT SINGLE ZEXPENSE~SAKNR

  • ZEXPENSE~KOSTL

  • into (TAB-SAKNR,

  • TAB-KOSTL)

  • FROM ZEXPENSE

  • WHERE ZEXPENSE~WERKS = TAB-WERKS

  • AND ZEXPENSE~EXPCD = TAB-EXPCD.

  • IF SY-SUBRC <> 0.

  • TAB-MSGNR = '1'.

  • TAB-MSGTX = 'Expense code not found (ZEXPENSE)'.

  • endif.

*

*endform.

----


  • FOMR CALCULATE_MATERIAL_LOADING *

----


form calculate_materail_loading.

check not tab-msgnr = '1'. "no need to go further if already rejected

*Material loading is calculated for all records

*Though posting only required for usage 'E'

  • check tab-usafl = 'E'. "only for External procurement need to post

select single ZSTDLOADING~LADRA "loading %

into ZSTDLOADING-LADRA "loading %

from ZSTDLOADING "standard loading info.

where WERKS = tab-werks "plant

and MATGP = tab-matkl+0(2) "customer code

  • and LADTY = tab-usafl. "usage code

and LADTY = 'P'. "material loading

if ( sy-subrc <> 0 ).

  • or ( zstdloading-LADRA is initial ). "DEVK909574

TAB-MSGNR = '1'.

TAB-MSGTX = 'Mat. loading % not found or = 0% (ZSTDLOADING)'.

else.

tab-ladra = zstdloading-ladra. "store the loading rate into table

*{Gary Tang 02/10/2003 "UATK922842

  • round the qty*stdcost to integer before multiplying the loading rate

tab-matloading "type is integer (result will be rounded off)

= tab-menge "qty

  • tab-unitstdcost. "std cost (of 1 EA)

  • * ZSTDLOADING-LADRA "material loading percentage (%)

  • / 100. "because material loading is in %

tab-matloading "type is integer (result will be rounded off)

= tab-matloading

  • ZSTDLOADING-LADRA "material loading percentage (%)

/ 100. "because material loading is in %

*}Gary Tang 02/10/2003 "UATK922842

endif.

endform.

----


  • FORM CHECK_DATA_ON_SKB1 *

----


form check_data_on_SKB1.

data: saknr_as_numeric(10) type n. "for leading zero

check not tab-msgnr = '1'. "no need to go further if already rejected

case tab-usafl.

when 'I' or 'E' or 'C'.

if not tab-saknr is initial.

TAB-MSGNR = '1'.

concatenate 'G/L Account no. should be blank for usage indicator'

tab-usafl into tab-msgtx separated by space.

else.

tab-saknr_for_posting = CONST_SAKNR_WIP_MAT.

endif.

when 'T' or 'S'.

if not tab-saknr is initial.

TAB-MSGNR = '1'.

concatenate 'G/L Account no. should be blank for usage indicator'

tab-usafl into tab-msgtx separated by space.

else.

tab-saknr_for_posting = CONST_SAKNR_WIP_MAT_SUB_CON.

endif.

when 'X'. "G/L acct is required for eXpense

if tab-saknr is initial.

TAB-MSGNR = '1'.

concatenate 'G/L Account no. is REQUIRED for usage indicator'

tab-usafl into tab-msgtx separated by space.

else.

CATCH SYSTEM-EXCEPTIONS CONVT_NO_NUMBER = 4.

SAKNR_AS_NUMERIC = TAB-SAKNR.

endcatch.

if sy-subrc = 4.

TAB-MSGNR = '1'.

TAB-MSGTX = 'Invild G/L acct no. (should be numeric)'.

endif.

select single skb1~saknr

into skb1-saknr

from skb1

where skb1~bukrs = tab-bukrs

and skb1~saknr = saknr_as_numeric. " tab-saknr.

if sy-subrc = 0.

tab-saknr_for_posting = saknr_as_numeric. " tab-saknr.

else.

TAB-MSGNR = '1'.

TAB-MSGTX = 'G/L Account no. not found (SKB1)'.

endif.

endif.

endcase.

endform.

----


  • FORM CHECK_DATA_ON_PREIOD *

----


form check_data_on_period.

check p_chk_pd = 'X'. "check period option is selected

check not tab-msgnr = '1'. "no need to go further if already rejected

if tab-erdat < g_period_start_date "record in past period, reject!

or tab-erdat > g_period_end_date. "record in future period, reject!

TAB-MSGNR = '1'.

TAB-MSGTX = 'Record date is not in open period.'.

endif.

endform.

----


  • FORM CHECK_DATA_ON_MBEW *

----


form check_data_on_mbew.

data: local_stprs like mbew-stprs. "std price

data: local_peinh like mbew-peinh. "price unit

check not tab-msgnr = '1'. "no need to go further if already rejected

*Standard cost is checked for all records

*Though calculation is only required for usage 'E'

  • check tab-usafl = 'E' "for External procurement

  • or tab-usafl = 'T' "for Transfer to sub-contractor

  • or tab-usafl = 'S'."for Sale to sub-contractor

select single stprs "std price

peinh "price unit

into (local_stprs, "std price

local_peinh) "price unit

from mbew "material valuation

where matnr = tab-matnr "material

and bwkey = tab-werks. "plant

if ( sy-subrc <> 0 ) "record not round

or ( local_stprs = 0 ). "std cost = 0 (should not happen)

TAB-MSGNR = '1'.

TAB-MSGTX = 'Standard cost not found or = 0 (MBEW)'.

else. "calculate the cost of 1 EA

tab-unitstdcost = local_stprs / local_peinh * 100.

endif.

endform.

----


  • FORM CHECK_DATA_ON_ZPRDORDHDR *

----


form check_data_on_zprdordhdr.

check not tab-msgnr = '1'. "no need to go further if already rejected

  • Production order is not required for usage indicator 'T' or 'S'

  • Even the number is provided, it may or may not exist in ZPRDORDHDR

  • Therefore, all checking on production order can be skipped for T & S

  • (11/11/2002, confirmation from Stephen Chung, Miura-san, Sato-san)

check tab-usafl <> 'T' "Transfer to sub-contract

and tab-usafl <> 'S' "Sales to sub-contract

  • Confirmed by Miura-san on 11/30/2002

  • Production order no. is also not required for 'X' (Expense)

and tab-usafl <> 'X'. "Expenses

if tab-aufnr is initial.

TAB-MSGNR = '1'.

TAB-MSGTX = 'Production order number is missing'.

exit.

endif.

select single zprdordhdr~aufnr

into zprdordhdr-aufnr

from zprdordhdr

where zprdordhdr~werks = tab-werks

and zprdordhdr~aufnr = tab-aufnr.

if sy-subrc <> 0.

TAB-MSGNR = '1'.

TAB-MSGTX = 'Production order number not found (ZPRDORDHDR)'.

else.

select max( zprdordhdr~runum )

into tab-runum

from zprdordhdr

where zprdordhdr~werks = tab-werks

and zprdordhdr~aufnr = tab-aufnr.

  • if tab-runum is initial.

  • TAB-MSGNR = '1'.

  • TAB-MSGTX = 'Production order number not found (ZPRDORDHDR)'.

  • else.

select single

stats "production order status

SUBPR "Sub-contracting Production Order

into (zprdordhdr-stats,

tab-hdr_SUBPR) "save into internal table TAB directly!

from zprdordhdr

where zprdordhdr~werks = tab-werks

and zprdordhdr~aufnr = tab-aufnr

and zprdordhdr~runum = tab-runum.

if ( zprdordhdr-stats <> 'O' )

and ( zprdordhdr-stats <> 'C' ).

TAB-MSGNR = '1'.

concatenate 'No tx is allowed, production order in status'

zprdordhdr-stats into tab-msgtx separated by space.

endif.

  • endif.

endif.

endform.

----


  • FORM CHECK_DATA_ON_MARA *

----


form check_data_on_mara.

check not tab-msgnr = '1'. "no need to go further if already rejected

  • get cost center that is from profit center in MARC

SELECT SINGLE MARA~MATKL "material group

into MARA-MATKL "material group

FROM MARA "Material master

WHERE MATNR = TAB-MATNR. "material

IF SY-SUBRC = 0.

TAB-MATKL = MARA-MATKL. "material group

ELSE.

TAB-MSGNR = '1'.

TAB-MSGTX = 'Material not found (mat.gp./cust code missing) (MARA)'.

ENDIF.

ENDFORM.

----


  • FORM CHECK_DATA_ON_MARC *

----


form check_data_on_marc.

check not tab-msgnr = '1'. "no need to go further if already rejected

  • get cost center that is from profit center in MARC

SELECT SINGLE PRCTR

into MARC-PRCTR

FROM MARC "Plant Data for Material

WHERE MATNR = TAB-MATNR "material

AND WERKS = TAB-WERKS. "plant

IF SY-SUBRC EQ 0.

TAB-PRCTR = MARC-PRCTR. "profit center

ELSE.

TAB-MSGNR = '1'.

TAB-MSGTX =

'Mat. not found in plant. (Profit center missing) (MARC)'.

ENDIF.

ENDFORM.

----


  • FORM CHECK_DATA_ON_KNA1 *

----


form check_data_on_kna1. "customer number

  • data: kunnr_as_numeric(10) type n.

  • data: kunnr_as_string(10).

check not tab-msgnr = '1'. "no need to go further if already rejected

check not tab-kunnr is initial.

  • IF NOT TAB-KUNNR CA 'ABCDEFGHIJKLMNOPQRSTUVWXYZ.,-_#'.

  • kunnr_as_numeric = tab-kunnr.

  • kunnr_as_string = kunnr_as_numeric.

  • else.

  • kunnr_as_string = tab-kunnr.

  • ENDIF.

select single kna1~kunnr

into kna1-kunnr

from kna1

  • where kunnr = kunnr_as_string. " tab-kunnr.

where kunnr = tab-kunnr. "customer no. (w/ leading zero if numeric)

if sy-subrc <> 0.

TAB-MSGNR = '1'.

concatenate 'Customer number' tab-kunnr 'not found (KNA1)'

into tab-msgtx separated by space.

ENDIF.

endform.

----


  • FORM CHECK_Sub_contract *

----


form check_sub_contract.

check not tab-msgnr = '1'. "no need to go further if already rejected

if tab-kunnr is initial.

if ( tab-usafl = 'T' )

or ( tab-usafl = 'S' ).

TAB-MSGNR = '1'.

concatenate 'Cust number should not be blank for usage indicator'

tab-usafl into tab-msgtx separated by space.

endif.

else.

if ( tab-usafl <> 'T' )

and ( tab-usafl <> 'S' ).

TAB-MSGNR = '1'.

concatenate 'Cust. number should be blank for usage indicator'

tab-usafl into tab-msgtx separated by space.

endif.

endif.

endform.

----


  • FORM CHECK_DATA_ON_t001k *

----


form check_data_on_t001k.

check not tab-msgnr = '1'. "no need to go further if already rejected

select single * from t001k "Valuation area

where bwkey = tab-werks. "plant

if sy-subrc = 0.

tab-bukrs = t001k-bukrs. "company code

else.

TAB-MSGNR = '1'.

concatenate 'Company code not found for plant'

tab-werks '(T001K)'

into tab-msgtx separated by space.

endif.

endform.

----


  • FORM POST_GOODS_ISSUE *

----


form post_goods_issue.

perform UPDATE_GI_FOR_COST_CTR.

  • clear FI_DOC_TEXT.

  • FI_DOC_TEXT+0(35) = tab-idnum.

  • write: tab-menge to FI_DOC_TEXT+35(15) right-justified.

  • write: / '**', tab-matdoc, '**'.

endform.

----


  • FORM MAIN_UPDATE *

----


FORM MAIN_UPDATE.

data: current_lock_matnr like mara-matnr.

*>>1104

  • sort tab by post_seq_RAND ascending.

*>>1104

  • Direction: I=Issue, R=Reverse

  • Do reverse first since it will increase invenotry

sort tab by direction descending "R first, then I

werks ascending

matnr ascending. "Sort by plant and then material

if p_nor = 'X'. "new posting first step

  • read the first record into the last flag to avoid problem when

  • processing the 1st record

loop at tab where msgnr <> '1'. "skip the rejected records

last_matnr = tab-matnr.

last_direction = tab-direction.

last_werks = tab-werks.

exit.

endloop.

loop at tab where msgnr <> '1'. "skip the rejected records

if ( tab-werks <> last_werks )

or ( tab-matnr <> last_matnr )

or ( tab-direction <> last_direction )

  • check if the no. of material i.e.items reach the limit "DE1K901698

or ( l_matnr_counter >= c_max_mat_doc_items ). "DE1K901698

  • if sy-tabix <> '1'. "not needed! "DE1K901698

  • sleep for 5 seconds before different plant and Issues/Reversal tx

if ( tab-werks <> last_werks )

or ( tab-direction <> last_direction )

  • or ( tab-matnr = last_matnr ). "DE1K901698

or ( tab_by_matnr-matnr = current_lock_matnr ). "DE1K901698

  • write: / tab-matnr, last_matnr.

write: / tab-recno.

perform sleep_5_seconds.

endif.

  • describe table tab_by_matnr lines sy-tfill.

  • write: / tab_by_matnr-werks, tab_by_matnr-matnr, sy-tfill.

perform post_goods_issue.

current_lock_matnr = tab_by_matnr-matnr.

clear l_matnr_counter.

last_werks = tab-werks.

last_matnr = tab-matnr.

last_direction = tab-direction.

refresh tab_by_matnr.

endif.

clear tab_by_matnr. "DE1K901698 record for the same material

tab_by_matnr = tab. "DE1K901698 put into a temp table

append tab_by_matnr. "DE1K901698 will be posted to 1 mat doc

l_matnr_counter = l_matnr_counter + 1. "DE1K901698 count the mat.

  • clear tab_by_matnr. "DE1K901698 moved to the start of the loop

  • tab_by_matnr = tab. "DE1K901698 moved to the start of the loop

  • append tab_by_matnr. "DE1K901698 moved to the start of the loop

endloop.

  • check if the temp item table still contains record

describe table tab_by_matnr lines sy-tfill.

  • sleep for 5 seconds before different plant and Issues/Reversal tx

if sy-tfill > 0. "still need to post the last batch

write: / 'last'.

perform sleep_5_seconds.

  • Post goods issues for the last batch of records (after ENDLOOP)

perform post_goods_issue.

endif.

endif. "new posting step 1 done

  • perform UPDATE_GI_FOR_COST_CTR.

  • clear FI_DOC_TEXT.

  • FI_DOC_TEXT+0(35) = tab-idnum.

  • write: tab-menge to FI_DOC_TEXT+35(15) right-justified.

  • loop at TAB where msgnr <> '1'. "skip the rejected records

  • msgnr = 2 ==> ready for step 2. (Mat doc. already posted)

loop at TAB where msgnr = '2'. "skip the rejected records

*>>1104

  • if tab-matnr = last_matnr.

*

  • write: / 'Sleep 1 sec', tab-matnr, tab-post_seq_rand.

  • CALL FUNCTION 'RZL_SLEEP'

  • EXPORTING

  • SECONDS = 1

  • EXCEPTIONS

  • ARGUMENT_ERROR = 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.

*

  • else.

  • last_matnr = tab-matnr.

  • endif.

*****>>1104

  • perform UPDATE_GI_FOR_COST_CTR.

  • clear FI_DOC_TEXT.

  • FI_DOC_TEXT+0(35) = tab-idnum.

  • write: tab-menge to FI_DOC_TEXT+35(15) right-justified.

*>>1104

  • post JV for different usage indicator

if ( tab-usafl = 'E' "external procurement

and tab-hdr_SUBPR = space ) "not sub-contract "UATK922842

or tab-usafl = 'C'. "consignment "UATK922842

if tab-msgnr = '2'. "ready for step 2

"mat. loading amount = 0, no need to create doc

if tab-matloading = 0.

TAB-MSGNR = '0'.

CONCATENATE tab-msgtx ', JV (Mat.Load.) Not needed (0)'

INTO TAB-MSGTX separated by space.

MODIFY TAB TRANSPORTING MSGNR MSGTX.

result_ok = result_ok + 1.

"Increase record counter (Successful)

perform update_zbacks_gipd

using tab-werks

tab-aufnr

tab-matnr

tab-erdat

tab-recno

tab-msgnr

space "parameter not needed for mat doc

  • msgtab-msgv1. "FI DOC for material loading

'N/A'. "FI DOC N/A

else. "post a JV for material loading

perform UPDATE_MATERIAL_LOADING_JV.

endif.

endif.

endif.

if ( tab-usafl = 'T' ) "transfer to subcon

or ( tab-usafl = 'S' ). "sales to subcon

if tab-msgnr = '2'. "ready for step 2

perform update_sub_contractor.

endif.

endif.

*no JV posting is needed for inhouse production

  • if tab-usafl = 'I'. "inhouse production

  • if tab-msgnr = '0'.

  • perform update_???

  • endif.

  • endif.

*no JV posting is needed for expenses

  • if tab-usafl = 'X'. "expenses

  • if tab-msgnr = '0'.

  • perform update_???

  • endif.

  • endif.

*no JV posting is needed for consign to sub-contractor

  • if ( tab-usafl = 'C' ). "consign to subcon

  • if tab-msgnr = '0'.

  • perform update_???.

  • endif.

  • endif.

endloop.

ENDFORM.

----


  • FORM UPDATE_SUB_CONTRACTOR *

----


form update_sub_contractor.

perform sub_con_fb70_prepare.

perform sub_con_fb70_fillscreen.

perform sub_con_fb70_calltx.

endform.

----


  • FORM SUB_CON_FB70_PREPARE *

----


form sub_con_fb70_prepare.

clear ar_amt_vendor. "material amount (std price * qty)

clear ar_amt_penalty. "penalty amount

clear ar_amt_total. "total amount (with tax)

clear ar_amt_tax. "tax amount

ar_amt_vendor

= tab-menge "qty

  • tab-unitstdcost. "std cost (of 1 EA)

if tab-usafl = 'T'. "Transfer to sub-contractor

ar_amt_penalty "Add the amount for penalty

= ar_amt_vendor

  • CONST_PENALTY_RATE.

endif.

*>>1104

  • ar_amt_tax = ( ar_amt_vendor + ar_amt_penalty ) * CONST_TAX_RATE.

ar_amt_tax = tab-cotax.

*>>1104

ar_amt_total "Total amonut (with tax)

= ar_amt_vendor

+ ar_amt_penalty

+ ar_amt_tax.

  • * ( '1.0' + CONST_TAX_RATE ).

ar_amt_total_as_text = abs( ar_amt_total ).

ar_amt_vendor_as_text = abs( ar_amt_vendor ).

ar_amt_penalty_as_text = abs( ar_amt_penalty ).

ar_amt_tax_as_text = abs( ar_amt_tax ).

endform.

----


  • FORM SUB_CON_FB70_FILLSCREEN *

----


form sub_con_fb70_fillscreen.

  • DATA: FI_DOC_TEXT(50).

  • clear FI_DOC_TEXT.

  • FI_DOC_TEXT+0(35) = tab-idnum.

  • write: tab-menge to FI_DOC_TEXT+35(15) right-justified.

clear MATDOC_AND_ITEM.

concatenate TAB-MATDOC '-' TAB-MATDOCITEM into MATDOC_AND_ITEM.

condense MATDOC_AND_ITEM.

clear FI_DOC_TEXT.

FI_DOC_TEXT+0(35) = tab-idnum.

write: tab-menge to FI_DOC_TEXT+35(15) right-justified.

refresh bdcdata.

PERFORM BDC_DYNPRO USING 'SAPMF05A' '1200'.

    • PERFORM BDC_FIELD USING 'BDC_OKCODE' '=DUMM'.

PERFORM BDC_FIELD USING 'BDC_OKCODE' '=MORE'. "goto Details tab

IF TAB-MENGE > 0.

PERFORM BDC_FIELD USING 'RF05A-BUSCS' 'R'. "Invoice

ELSE.

PERFORM BDC_FIELD USING 'RF05A-BUSCS' 'G'. "Credit memo

ENDIF.

  • PERFORM BDC_FIELD USING 'BDC_CURSOR' 'ACGL_ITEM-HKONT(01)'.

PERFORM BDC_FIELD USING 'INVFO-ACCNT' TAB-KUNNR. "customer number

PERFORM BDC_FIELD USING 'INVFO-BLDAT' TAB-ERDAT_RAW. "invoice date

PERFORM BDC_FIELD USING 'INVFO-BUDAT' TAB-ERDAT_RAW. "posting date

PERFORM BDC_FIELD USING 'INVFO-XBLNR' MATDOC_AND_ITEM. "Material Doc.

PERFORM BDC_FIELD USING 'INVFO-SGTXT' FI_DOC_TEXT. "tab-idnum.

"BACKS ID No.

PERFORM BDC_FIELD USING 'INVFO-WAERS' 'JPY'. "Currency

PERFORM BDC_FIELD USING 'INVFO-WRBTR' ar_amt_total_as_text. "Amount

PERFORM BDC_FIELD USING 'INVFO-MWSKZ' TAB-MWSKZ. "tax code

PERFORM BDC_FIELD USING 'INVFO-WMWST' ar_amt_tax_as_text. "Tax amount

  • PERFORM BDC_FIELD USING 'INVFO-XMWST' 'X'. "auto cal. tax

  • CLEAR AUFNR.

  • CONCATENATE TAB-AUFNR '-' TAB-RUNUM INTO AUFNR.

  • PERFORM BDC_FIELD USING 'INVFO-SGTXT' AUFNR. "PO no.

PERFORM BDC_DYNPRO USING 'SAPMF05A' '1200'.

PERFORM BDC_FIELD USING 'BDC_OKCODE' '/00'.

PERFORM BDC_FIELD USING 'INVFO-BKTXT' tab-aufnr. "Productioin order

PERFORM BDC_FIELD USING 'INVFO-ZUONR' TAB-MATNR. "material no.

PERFORM BDC_FIELD USING 'ACGL_ITEM-HKONT(01)'

CONST_SAKNR_WIP_MAT_SUB_CON.

PERFORM BDC_FIELD USING 'ACGL_ITEM-WRBTR(01)' ar_amt_vendor_as_text.

PERFORM BDC_FIELD USING 'ACGL_ITEM-KOSTL(01)' TAB-PRCTR.

PERFORM BDC_FIELD USING 'ACGL_ITEM-SGTXT(01)' FI_DOC_TEXT."TAB-IDNUM.

PERFORM BDC_FIELD USING 'ACGL_ITEM-ZUONR(01)' TAB-MATNR.

PERFORM BDC_FIELD USING 'ACGL_ITEM-MWSKZ(01)' TAB-MWSKZ. "Tax code

if tab-usafl = 'T'. "Transfer: add the penalty!

PERFORM BDC_FIELD USING 'ACGL_ITEM-HKONT(02)' "other income

CONST_SAKNR_OTHER_INCOME.

PERFORM BDC_FIELD USING 'ACGL_ITEM-WRBTR(02)'

ar_amt_penalty_as_text.

PERFORM BDC_FIELD USING 'ACGL_ITEM-KOSTL(02)' TAB-PRCTR.

PERFORM BDC_FIELD USING 'ACGL_ITEM-SGTXT(02)' FI_DOC_TEXT.

"TAB-IDNUM.

PERFORM BDC_FIELD USING 'ACGL_ITEM-ZUONR(02)' TAB-MATNR.

endif.

  • PERFORM BDC_DYNPRO USING 'SAPMF05A' '1200'.

  • PERFORM BDC_FIELD USING 'BDC_OKCODE' '=TEXT'.

*

  • PERFORM BDC_DYNPRO USING 'SAPLFTXT' '0100'.

  • PERFORM BDC_FIELD USING 'BDC_CURSOR' 'RTEXT-SPRAS(01)'.

  • PERFORM BDC_FIELD USING 'BDC_OKCODE' '=TEDE'.

  • PERFORM BDC_FIELD USING 'RTEXT-SPRAS(01)' 'JA'.

*

  • PERFORM BDC_DYNPRO USING 'SAPLSTXX' '1100'.

  • PERFORM BDC_FIELD USING 'BDC_CURSOR' 'RSTXT-TXLINE(02)'.

  • PERFORM BDC_FIELD USING 'BDC_OKCODE' '=EDNL'.

  • CLEAR TEXT.

  • CONCATENATE ' QUANTITY : ' TAB-MENGE INTO TEXT.

  • PERFORM BDC_FIELD USING 'RSTXT-TXLINE(02)' TEXT.

  • PERFORM BDC_DYNPRO USING 'SAPLSTXX' '1100'.

  • PERFORM BDC_FIELD USING 'BDC_OKCODE' '=TXBA'.

  • PERFORM BDC_DYNPRO USING 'SAPLFTXT' '0100'.

  • PERFORM BDC_FIELD USING 'BDC_OKCODE' '=BACK'.

  • PERFORM BDC_DYNPRO USING 'SAPMF05A' '1200'.

  • PERFORM BDC_FIELD USING 'BDC_OKCODE' '=MORE'.

  • PERFORM BDC_DYNPRO USING 'SAPMF05A' '1200'.

  • PERFORM BDC_FIELD USING 'BDC_OKCODE' '/00'.

  • PERFORM BDC_FIELD USING 'INVFO-BKTXT' TAB-VBELN.

PERFORM BDC_DYNPRO USING 'SAPMF05A' '1200'.

PERFORM BDC_FIELD USING 'BDC_OKCODE' '=BU'.

endform.

----


  • FORM SUB_CON_FB70_CALLTX *

----


form sub_con_fb70_calltx.

refresh msgtab.

if ar_amt_total = 0. "Amount = 0, no need to post AR

TAB-MSGNR = '0'.

CONCATENATE TAB-MSGTX

', AR invoice not needed (Amount=0)'

INTO TAB-MSGTX separated by space.

result_ok = result_ok + 1.

else. "Amount <> 0, post AR

call transaction 'FB70'

using bdcdata

update 'S'

mode fb70mode

messages into msgtab.

if sy-subrc <> 0.

  • TAB-MSGNR = '3'. "no need to change, this is remain in 2

read table msgtab with key MSGTYP = 'E'.

if sy-subrc = 0.

select single t100~text

into t100-text

from t100

where t100~sprsl = sy-langu

and arbgb = msgtab-msgid

and msgnr = msgtab-msgnr.

if sy-subrc = 0.

CONCATENATE TAB-MSGTX ', AR invoice error:' t100-text

INTO TAB-MSGTX separated by space.

else.

CONCATENATE TAB-MSGTX

', AR invoice error:' '(error message not found)'

INTO TAB-MSGTX separated by space.

endif.

endif.

  • result_err = result_err + 1.

else.

read table msgtab with key msgid = 'F5' msgnr = '312'.

if sy-subrc = 0.

TAB-MSGNR = '0'.

CONCATENATE TAB-MSGTX

', AR invoice posted:' msgtab-msgv1

INTO TAB-MSGTX separated by space.

result_ok = result_ok + 1.

perform update_zbacks_gipd

using tab-werks

tab-aufnr

tab-matnr

tab-erdat

tab-recno

tab-msgnr

space "parameter not needed for mat doc

MSGTAB-MSGV1. "Customer invoice

else.

TAB-MSGNR = '0'.

CONCATENATE TAB-MSGTX

'AR invoice problem:' '(Cannot display invoice no.)'

INTO TAB-MSGTX separated by space.

  • result_err = result_err + 1.

endif.

endif.

endif.

MODIFY TAB TRANSPORTING MSGNR MSGTX.

endform.

----


  • FORM UPDATE_GI_FOR_COST_CTR *

----


form UPDATE_GI_FOR_COST_CTR.

REFRESH: GOODSMVT_HEADER, GOODSMVT_CODE, GOODSMVT_ITEM, REMSG.

CLEAR: GOODSMVT_HEADER, GOODSMVT_CODE, GOODSMVT_ITEM, REMSG.

CLEAR: ERR, TAB-MATDOC, DOCYEAR.

PERFORM MAINTAIN_GOODSMVT_HEADER.

PERFORM MAINTAIN_GOODSMVT_CODE.

PERFORM MAINTAIN_GOODSMVT_ITEM.

CALL FUNCTION 'BAPI_GOODSMVT_CREATE'

EXPORTING

GOODSMVT_HEADER = GOODSMVT_HEADER

GOODSMVT_CODE = GOODSMVT_CODE

  • TESTRUN = ' '

IMPORTING

  • GOODSMVT_HEADRET =

MATERIALDOCUMENT = TAB-MATDOC

MATDOCUMENTYEAR = DOCYEAR

TABLES

GOODSMVT_ITEM = GOODSMVT_ITEM

  • GOODSMVT_SERIALNUMBER =

RETURN = REMSG

.

CALL FUNCTION 'BAPI_TRANSACTION_COMMIT'

  • EXPORTING

  • WAIT =

  • IMPORTING

  • RETURN =

.

*>>>

commit work.

*>>>

IF REMSG-TYPE = 'E'.

ERR = 'X'.

CONCATENATE REMSG-NUMBER REMSG-MESSAGE INTO

ERRTX-MSGTX SEPARATED BY SPACE.

ENDIF.

LOOP AT REMSG.

IF REMSG-TYPE = 'E'.

ERR = 'X'.

CONCATENATE REMSG-NUMBER REMSG-MESSAGE

INTO ERRTX-MSGTX SEPARATED BY SPACE.

APPEND ERRTX.

ENDIF.

ENDLOOP.

  • ENDIF.

IF ERR EQ 'X'.

TAB-MSGNR = '1'.

  • TAB-MSGTX = 'Update failed for Goods Issue'.

concatenate 'Update failed for Goods Issue:'

errtx-msgtx(68) into tab-msgtx

separated by space.

loop at tab_by_matnr.

TAB-STOCKQTY = TAB_BY_MATNR-STOCKQTY. "DEVK914235

TAB-ISSUESTPRS = TAB_BY_MATNR-ISSUESTPRS. "DEVK914235

MODIFY TAB TRANSPORTING MSGNR MSGTX MATDOC

STOCKQTY "DEVK914235

ISSUESTPRS "DEVK914235

WHERE " MSGNR EQ ' '

WERKS = TAB_BY_MATNR-werks

and matnr = tab_by_matnr-matnr

and recno = tab_by_matnr-recno.

perform update_zbacks_gipd

using tab_by_matnr-werks

tab_by_matnr-aufnr

tab_by_matnr-matnr

tab_by_matnr-erdat

tab_by_matnr-recno

TAB-MSGNR "must be '1' failed

space "no mat doc since posting failed

space. "parameter not needed for FI doc

endloop.

  • result_err = result_err + 1.

ELSEIF ERR EQ ' '.

  • TAB-MSGNR = '0'.

CONCATENATE 'Mat. doc.:' TAB-MATDOC

INTO TAB-MSGTX.

loop at tab_by_matnr.

TAB-MATDOCITEM = SY-TABIX.

if tab-usafl = 'I' "Inhouse production

or tab-usafl = 'X' "Expenses

*{Gary Tang 02/10/2003 "UATK922842

  • Usage ind. 'C' should be 2 tx in fact, mat loading is REQUIRED

  • or tab-usafl = 'C'. "Consignment "UATK922842

  • Usage ind. 'E' and ZPRDORDHDR-SUBPR = 'X', mat loading NOT required

or ( tab-usafl = 'E' and tab_by_matnr-hdr_SUBPR = 'X' ).

*}Gary Tang 02/10/2003 "UATK922842

*Only 1 tx (MvT 201/202) is needed for the above usage ind.

*Therefore, update the no. of OK record now

result_ok = result_ok + 1.

TAB-MSGNR = '0'. "all work is done!

else.

TAB-MSGNR = '2'. "first step (mvt 201/202) is done, but

"next step (mat loading JV or cust AR is needed

endif.

TAB-STOCKQTY = TAB_BY_MATNR-STOCKQTY. "DEVK914235

TAB-ISSUESTPRS = TAB_BY_MATNR-ISSUESTPRS. "DEVK914235

MODIFY TAB TRANSPORTING MSGNR MSGTX MATDOC MATDOCITEM

STOCKQTY "DEVK914235

ISSUESTPRS "DEVK914235

WHERE " MSGNR EQ ' '

WERKS = TAB_BY_MATNR-werks

and matnr = tab_by_matnr-matnr

and recno = tab_by_matnr-recno.

perform update_zbacks_gipd

using tab_by_matnr-werks

tab_by_matnr-aufnr

tab_by_matnr-matnr

tab_by_matnr-erdat

tab_by_matnr-recno

TAB-MSGNR "0 (all done) or 2 (first step done)

tab-matdoc

space. "parameter not needed for FI doc

endloop.

**>> MODIFY TAB TRANSPORTING MSGNR MSGTX.

  • WHERE MSGNR EQ ' '.

ENDIF.

endform.

----


  • UPDATE MATERIALLOADING_JV *

----


form UPDATE_MATERIAL_LOADING_JV.

  • perform prepare_jv_DOCUMENTHEADER.

  • perform prepare_jv_ACCOUNTGL.

  • perform prepare_jv_currencyamount.

  • perform perpare_jv_return.

  • perform call_bapi_jv.

perform FB50_FILL_SCREEN.

CALL TRANSACTION 'FB50'

USING BDCDATA

MODE fb50mode

MESSAGES INTO Msgtab.

read table msgtab with key

MSGTYP = 'S'

MSGID = 'F5'

MSGNR = '312'.

if sy-subrc = 0.

TAB-MSGNR = '0'.

CONCATENATE tab-msgtx ', JV (Mat.Load.) Posted:' msgtab-msgv1

INTO TAB-MSGTX separated by space.

MODIFY TAB TRANSPORTING MSGNR MSGTX.

result_ok = result_ok + 1. "Increase record counter (Successful)

perform update_zbacks_gipd

using tab-werks

tab-aufnr

tab-matnr

tab-erdat

tab-recno

tab-msgnr

space "parameter not needed for mat doc

msgtab-msgv1. "FI DOC for material loading

else.

  • TAB-MSGNR = '3'. "no need to change, it is remain in 2

concatenate tab-msgtx 'JV (Mat.Load.) failed:'

into tab-msgtx separated by space.

loop at msgtab where MSGTYP = 'E'.

concatenate tab-msgtx msgtab-msgid msgtab-msgnr

into tab-msgtx separated by space.

MODIFY TAB TRANSPORTING MSGNR MSGTX.

endloop.

endif.

endform.

----


  • FORM FB50_FILL_SCREEN *

----


FORM FB50_FILL_SCREEN.

DATA: MATLOADINg_AS_STRING(12).

CLEAR: BDCDATA, MSGTAB.

REFRESH: BDCDATA, MSGTAB.

clear MATDOC_AND_ITEM.

concatenate TAB-MATDOC '-' TAB-MATDOCITEM into MATDOC_AND_ITEM.

condense MATDOC_AND_ITEM.

matloading_as_string = abs( tab-matloading ).

clear FI_DOC_TEXT.

FI_DOC_TEXT+0(35) = tab-idnum.

write: tab-menge to FI_DOC_TEXT+35(15) right-justified.

PERFORM BDC_DYNPRO USING 'SAPMF05A' '1001'.

PERFORM BDC_FIELD USING 'BDC_OKCODE' '/00'.

PERFORM BDC_FIELD USING 'ACGL_HEAD-BLDAT' tab-erdat_raw.

PERFORM BDC_FIELD USING 'ACGL_HEAD-BUDAT' tab-erdat_raw.

PERFORM BDC_FIELD USING 'ACGL_HEAD-WAERS' 'JPY'.

PERFORM BDC_FIELD USING 'ACGL_HEAD-BKTXT' tab-aufnr.

PERFORM BDC_FIELD USING 'ACGL_HEAD-XBLNR' MATDOC_AND_ITEM.

PERFORM BDC_DYNPRO USING 'SAPMF05A' '1001'.

PERFORM BDC_FIELD USING 'BDC_OKCODE' '=BU'.

  • 1st item

PERFORM BDC_FIELD USING 'ACGL_ITEM-HKONT(01)'

CONST_SAKNR_WIP_LABOUR_OH.

If tab-matloading > 0.

PERFORM BDC_FIELD USING 'ACGL_ITEM-SHKZG(01)' 'S'.

else.

PERFORM BDC_FIELD USING 'ACGL_ITEM-SHKZG(01)' 'H'.

endif.

PERFORM BDC_FIELD USING 'ACGL_ITEM-WRBTR(01)'

matloading_as_string.

PERFORM BDC_FIELD USING 'ACGL_ITEM-KOSTL(01)' TAB-prctr.

PERFORM BDC_FIELD USING 'ACGL_ITEM-MARKSP(01)' 'X'.

PERFORM BDC_FIELD USING 'ACGL_ITEM-SGTXT(01)' FI_DOC_TEXT.

PERFORM BDC_FIELD USING 'ACGL_ITEM-ZUONR(01)' TAB-MATNR.

  • 2nd item

PERFORM BDC_FIELD USING 'ACGL_ITEM-HKONT(02)' "Mat. loading

CONST_SAKNR_WIP_MAT_LOAD.

If tab-matloading > 0.

PERFORM BDC_FIELD USING 'ACGL_ITEM-SHKZG(02)' 'H'.

else.

PERFORM BDC_FIELD USING 'ACGL_ITEM-SHKZG(02)' 'S'.

endif.

PERFORM BDC_FIELD USING 'ACGL_ITEM-WRBTR(02)'

matloading_as_string.

PERFORM BDC_FIELD USING 'ACGL_ITEM-KOSTL(02)' TAB-prctr.

PERFORM BDC_FIELD USING 'ACGL_ITEM-MARKSP(02)' 'X'.

PERFORM BDC_FIELD USING 'ACGL_ITEM-SGTXT(02)' FI_DOC_TEXT.

PERFORM BDC_FIELD USING 'ACGL_ITEM-ZUONR(02)' TAB-MATNR.

PERFORM BDC_DYNPRO USING 'SAPMF05A' '1001'.

PERFORM BDC_FIELD USING 'BDC_OKCODE' '=BU'.

endform.

1 REPLY 1

former_member529475
Active Contributor
0 Kudos

Yes I had solved this