取下一个物料号码
FUNCTION ZMMF_GET_NEXT_MATNR
.
*"----------------------------------------------------------------------
*"*"本地接口:
*" IMPORTING
*" VALUE(I_MATKL) TYPE MARA-MATKL
*" VALUE(I_ZPRDA) TYPE MARA-ZPRDA
*" VALUE(I_ZQLTY) TYPE MARA-ZQLTY
*" VALUE(I_TESTRUN) TYPE CHAR1 OPTIONAL
*" EXPORTING
*" VALUE(E_MATNR) TYPE MATNR
*" VALUE(E_RETURN) TYPE BAPIRET2
*" EXCEPTIONS
*" INTERVAL_OVERFLOW
*"----------------------------------------------------------------------
DATA :
* LV_MATNR TYPE I VALUE 13, "物料号长度
LV_MATKL_LEN TYPE I ,
LV_MAXNBR TYPE P ,
LV_LSLEN TYPE I ,
LV_NRLEVEL_LEN TYPE I .
LV_LSLEN = 3 .
LV_MAXNBR = 1 .
DO LV_LSLEN TIMES .
LV_MAXNBR = LV_MAXNBR * 10 .
ENDDO .
LV_MAXNBR = LV_MAXNBR - 1 .
IF I_ZPRDA = '' .
I_ZPRDA = '000' .
ENDIF .
IF I_ZQLTY = '' .
I_ZQLTY = '000' .
ENDIF .
CLEAR :E_RETURN ,ZMMT_MATNR .
SELECT SINGLE FOR UPDATE * FROM ZMMT_MATNR
WHERE MATKL = I_MATKL
AND ZPRDA = I_ZPRDA
AND ZQLTY = I_ZQLTY .
IF SY -SUBRC = 0 .
IF ZMMT_MATNR -NRLEVEL >= LV_MAXNBR .
E_RETURN - TYPE = 'E' .
E_RETURN - MESSAGE = I_MATKL && I_ZPRDA && I_ZQLTY && '号码段已用完' .
MESSAGE E_RETURN - MESSAGE TYPE 'E'
RAISING INTERVAL_OVERFLOW . .
ENDIF .
ADD 1 TO ZMMT_MATNR -NRLEVEL .
UPDATE ZMMT_MATNR .
ELSE .
ZMMT_MATNR -MATKL = I_MATKL .
ZMMT_MATNR -ZPRDA = I_ZPRDA .
ZMMT_MATNR -ZQLTY = I_ZQLTY .
ZMMT_MATNR -NRLEVEL = '00000000000000000001' .
INSERT ZMMT_MATNR .
ENDIF .
LV_NRLEVEL_LEN = 20 - LV_LSLEN .
E_MATNR = I_MATKL && I_ZPRDA && I_ZQLTY && ZMMT_MATNR -NRLEVEL+LV_NRLEVEL_LEN (LV_LSLEN ) .
CALL FUNCTION 'CONVERSION_EXIT_MATN1_INPUT'
EXPORTING
INPUT = E_MATNR
IMPORTING
OUTPUT = E_MATNR
EXCEPTIONS
LENGTH_ERROR = 1
OTHERS = 2 .
SELECT SINGLE @ABAP_TRUE FROM MARA INTO @DATA (ISEXIT )
WHERE MATNR = @E_MATNR .
IF ISEXIT = ABAP_TRUE .
COMMIT WORK AND WAIT .
CALL FUNCTION 'ZMMF_GET_NEXT_MATNR'
EXPORTING
I_MATKL = I_MATKL
I_ZPRDA = I_ZPRDA
I_ZQLTY = I_ZQLTY
I_TESTRUN = I_TESTRUN
IMPORTING
E_MATNR = E_MATNR .
ENDIF .
IF I_TESTRUN = 'X' .
ROLLBACK WORK .
ELSE .
COMMIT WORK AND WAIT .
ENDIF .
ENDFUNCTION .
*"----------------------------------------------------------------------
*"*"本地接口:
*" IMPORTING
*" VALUE(I_MATKL) TYPE MARA-MATKL
*" VALUE(I_ZPRDA) TYPE MARA-ZPRDA
*" VALUE(I_ZQLTY) TYPE MARA-ZQLTY
*" VALUE(I_TESTRUN) TYPE CHAR1 OPTIONAL
*" EXPORTING
*" VALUE(E_MATNR) TYPE MATNR
*" VALUE(E_RETURN) TYPE BAPIRET2
*" EXCEPTIONS
*" INTERVAL_OVERFLOW
*"----------------------------------------------------------------------
DATA :
* LV_MATNR TYPE I VALUE 13, "物料号长度
LV_MATKL_LEN TYPE I ,
LV_MAXNBR TYPE P ,
LV_LSLEN TYPE I ,
LV_NRLEVEL_LEN TYPE I .
LV_LSLEN = 3 .
LV_MAXNBR = 1 .
DO LV_LSLEN TIMES .
LV_MAXNBR = LV_MAXNBR * 10 .
ENDDO .
LV_MAXNBR = LV_MAXNBR - 1 .
IF I_ZPRDA = '' .
I_ZPRDA = '000' .
ENDIF .
IF I_ZQLTY = '' .
I_ZQLTY = '000' .
ENDIF .
CLEAR :E_RETURN ,ZMMT_MATNR .
SELECT SINGLE FOR UPDATE * FROM ZMMT_MATNR
WHERE MATKL = I_MATKL
AND ZPRDA = I_ZPRDA
AND ZQLTY = I_ZQLTY .
IF SY -SUBRC = 0 .
IF ZMMT_MATNR -NRLEVEL >= LV_MAXNBR .
E_RETURN - TYPE = 'E' .
E_RETURN - MESSAGE = I_MATKL && I_ZPRDA && I_ZQLTY && '号码段已用完' .
MESSAGE E_RETURN - MESSAGE TYPE 'E'
RAISING INTERVAL_OVERFLOW . .
ENDIF .
ADD 1 TO ZMMT_MATNR -NRLEVEL .
UPDATE ZMMT_MATNR .
ELSE .
ZMMT_MATNR -MATKL = I_MATKL .
ZMMT_MATNR -ZPRDA = I_ZPRDA .
ZMMT_MATNR -ZQLTY = I_ZQLTY .
ZMMT_MATNR -NRLEVEL = '00000000000000000001' .
INSERT ZMMT_MATNR .
ENDIF .
LV_NRLEVEL_LEN = 20 - LV_LSLEN .
E_MATNR = I_MATKL && I_ZPRDA && I_ZQLTY && ZMMT_MATNR -NRLEVEL+LV_NRLEVEL_LEN (LV_LSLEN ) .
CALL FUNCTION 'CONVERSION_EXIT_MATN1_INPUT'
EXPORTING
INPUT = E_MATNR
IMPORTING
OUTPUT = E_MATNR
EXCEPTIONS
LENGTH_ERROR = 1
OTHERS = 2 .
SELECT SINGLE @ABAP_TRUE FROM MARA INTO @DATA (ISEXIT )
WHERE MATNR = @E_MATNR .
IF ISEXIT = ABAP_TRUE .
COMMIT WORK AND WAIT .
CALL FUNCTION 'ZMMF_GET_NEXT_MATNR'
EXPORTING
I_MATKL = I_MATKL
I_ZPRDA = I_ZPRDA
I_ZQLTY = I_ZQLTY
I_TESTRUN = I_TESTRUN
IMPORTING
E_MATNR = E_MATNR .
ENDIF .
IF I_TESTRUN = 'X' .
ROLLBACK WORK .
ELSE .
COMMIT WORK AND WAIT .
ENDIF .
ENDFUNCTION .
总结
- 上一篇: 使用BAPI_CONTRACT_CREA
- 下一篇: SAP设置信贷控制范围有什么作用?