***INCLUDE MV45AFZZ .
************************************************************************
* *
* This include is reserved for user modifications *
* *
* Forms for sales document processing *
* *
* The name of modification modules should begin with 'ZZ'. *
* *
************************************************************************
*---------------------------------------------------------------------*
* FORM ZZEXAMPLE *
*---------------------------------------------------------------------*
* text...................................... *
*---------------------------------------------------------------------*
*FORM ZZEXAMPLE.
* ...
*ENDFORM.
*eject
*---------------------------------------------------------------------*
* FORM USEREXIT_DELETE_DOCUMENT *
*---------------------------------------------------------------------*
* This userexit can be used to delete data in additional tables *
* when a sales document is deleted. *
* *
* This form is called in dialog at the end of form BELEG_LOESCHEN*
* just before form BELEG_SICHERN is performed to delete the *
* datas on the database. *
* *
*---------------------------------------------------------------------*
FORM USEREXIT_DELETE_DOCUMENT.
ENDFORM. "USEREXIT_DELETE_DOCUMENT
*eject
*---------------------------------------------------------------------*
* FORM USEREXIT_FIELD_MODIFICATION *
*---------------------------------------------------------------------*
* This userexit can be used to modify the attributes of *
* screen fields. *
* This form is processed for each field in the screen. *
* *
* The use of the fields screen-group1 to screen-group4 is: *
* *
* Screen-group1: Automatic modification contolles by transaction*
* MFAW. *
* Screen-group2: Contents 'LOO' for steploop-fields. *
* Screen-group3: Used for modififaction, which are dependent on *
* control tables or other fix information. *
* Screen-group4: Unused *
* *
* For field mofifications, which are dependent on the document *
* status, you can use the status field in the workareas *
* XVBAP for item status and XVBUK for header status. *
* *
* This form is called from module FELDAUSWAHL. *
* *
*---------------------------------------------------------------------*
FORM USEREXIT_FIELD_MODIFICATION.
* CASE SCREEN-GROUP3.
* WHEN '900'.
* IF VBAK-VBTYP NE 'A'.
* SCREEN-ACTIVE = 0.
* ENDIF.
* ENDCASE.
*modify by frank ,
**如果为代开票业务,那么交货工厂不可以修改
* IF VBAK-AUART = 'ZOR2' OR VBAK-AUART = 'ZRE2 ' OR VBAK-AUART = 'ZCR2' OR VBAK-AUART = 'ZDR2'.
* CASE SCREEN-NAME.
* WHEN 'VBAP-WERKS' .
* SCREEN-INPUT = 0 .
* ENDCASE.
* ENDIF.
*
**业绩所属分公司一定不能更改,系统,二级系统等都不能够修改
* CASE SCREEN-NAME.
* WHEN 'VBKD-BZIRK' OR 'VBAK-KVGR3' OR 'VBAK-KVGR2'.
* SCREEN-INPUT = 0 .
* ENDCASE.
*
* endif.
*
* WHEN 'VBAP-WERKS' OR 'VBKD-ZTERM' OR 'VBAK-KVGR3'.
* SCREEN-INPUT = 0 .
* WHEN 'VBKD-INCO1'.
** If VBKD-INCO1 = 'Z10' or VBKD-INCO1 = 'Z30'.
* SCREEN-INPUT = 0 .
** endif.
* CASE SCREEN-NAME.
* WHEN 'VBAK-VBELN'.
* SCREEN-ACTIVE = 0.
* ENDCASE.
*{ INSERT DEVK900239 1
* CUA_EXCLUDE-FUNCTION = 'WABU_T'.
* APPEND CUA_EXCLUDE.
*} INSERT
ENDFORM. "USEREXIT_FIELD_MODIFICATION
*eject
*---------------------------------------------------------------------*
* FORM USEREXIT_MOVE_FIELD_TO_VBAK *
*---------------------------------------------------------------------*
* This userexit can be used to move some fields into the sales *
* dokument header workaerea VBAK. *
* *
* SVBAK-TABIX = 0: Create header *
* SVBAK-TABIX > 0: Change header *
* *
* This form is called at the end of form VBAK_FUELLEN. *
* *
*---------------------------------------------------------------------*
FORM USEREXIT_MOVE_FIELD_TO_VBAK.
* if SVBAK-TABIX >= 0.
*
**增强6: 检查联营客户是否与订单类型匹配;
* IF T180-TRTYP = 'H' OR T180-TRTYP = 'V' ."仅在创建,更改时,做检查""20080814更新
* CASE XVBAK-AUART.
* WHEN 'KB' OR 'KA' OR 'KE' OR 'KR' ."联营专柜
* TABLES: KNA1.
**判断客户是不是联营客户32,如果是联营客户且工厂不为2000时,报错
* IF NOT XVBAK-KUNNR IS INITIAL.
* SELECT SINGLE * FROM KNA1 WHERE KUNNR = XVBAK-KUNNR AND KDKG3 <> '32'.
* IF SY-SUBRC = 0.
* IF VBAK-VKORG <> '2000'.
* MESSAGE S398(00) WITH '订单类型可能选择错误,因为客户性质为非联营散装客户'.
* ENDIF.
** LOOP AT XVBAP WHERE WERKS <> '2000'.
** MESSAGE E398(00) WITH '订单类型可能选择错误,因为客户性质为非联营散装客户'.
** ENDLOOP.
* ENDIF.
* ENDIF.
*
* ENDCASE.
* ENDIF.
* ENDIF.
**增强6结束;
* vbak-zzfield = xxxx-zzfield2.
*******增强16 "如果是订单管控,把销售订单的"交货冻结"直接标识为'04'
*IF XVBKD-BZIRK EQ '6691' OR XVBKD-BZIRK EQ '6693' OR XVBKD-BZIRK EQ '6660' OR
* XVBKD-BZIRK EQ '6310' OR XVBKD-BZIRK EQ '6340' OR XVBKD-BZIRK EQ '6690'.
TABLES ZTSD034.
* IF SY-UNAME EQ '1091159'.
SELECT SINGLE * FROM ZTSD034 WHERE AUGRU EQ VBAK-AUGRU AND ZRECON2 EQ 'X'.
IF SY-SUBRC EQ 0.
DATA: ZTDAT11 LIKE SY-DATUM.
SELECT MIN( ZTDAT ) INTO ZTDAT11 FROM ZTSD032 "得到此客户最早回单日期
WHERE KUNAG EQ VBAK-KUNNR
AND ZREFG NE 'X'
AND ( ZEDAT LT SY-DATUM OR ZEDAT EQ '' ).
"如果找到未回单的单据,并且回单日期小于当天,即锁单
IF SY-SUBRC EQ 0 AND ZTDAT11 LT SY-DATUM AND ZTDAT11 IS NOT INITIAL.
VBAK-LIFSK = '04'.
ENDIF.
ENDIF.
* ENDIF.
*ENDIF.
*******增强16如束
ENDFORM. "USEREXIT_MOVE_FIELD_TO_VBAK
*eject
*---------------------------------------------------------------------*
* FORM USEREXIT_MOVE_FIELD_TO_VBAP *
*---------------------------------------------------------------------*
* This userexit can be used to move some fields into the sales *
* dokument item workaerea VBAP *
* *
* SVBAP-TABIX = 0: Create item *
* SVBAP-TABIX > 0: Change item *
* *
* This form is called at the end of form VBAP_FUELLEN. *
* *
*---------------------------------------------------------------------*
FORM USEREXIT_MOVE_FIELD_TO_VBAP.
*序号30*外销的订单需求类别设置为KE
* TABLES ZTMM018.
CASE VBAK-AUART.
WHEN 'ZOR6'.
VBAP-BEDAE = 'KE'.
VBAP-SOBKZ ='E'.
VBAP-KNTTP = 'M'.
VBAP-KZBWS = 'A'.
VBAP-ABGRS = '000001'.
WHEN 'ZRE6'.
VBAP-BEDAE = 'KE'.
VBAP-SOBKZ ='E'.
VBAP-KNTTP = 'M'.
VBAP-KZBWS = 'A'.
VBAP-ABGRS = '000001'.
*指配客户的订单,默认工厂为'2000',根据仓库地点来确认装运点,主要用于区分河南中转库和总部成品仓发货.
WHEN 'ZOR3' .
VBAP-WERKS = '2000'.
SELECT SINGLE VSTEL INTO VBAP-VSTEL FROM ZTMM018 WHERE LGORT = VBAP-LGORT AND WERKS = VBAP-WERKS.
IF SY-SUBRC NE 0.
vbap-VSTEL = '2000'.
ENDIF.
WHEN 'ZRE3' .
VBAP-WERKS = '2000'.
SELECT SINGLE VSTEL INTO VBAP-VSTEL FROM ZTMM018 WHERE LGORT = VBAP-LGORT AND WERKS = VBAP-WERKS.
IF SY-SUBRC NE 0.
vbap-VSTEL = '2000'.
ENDIF.
WHEN 'ZOR1' .
VBAP-WERKS = VBAK-VKORG.
vbap-VSTEL = VBAK-VKORG.
IF VBAK-KUNNR EQ '0006999999'. "物流客户不做可用性检查
VBAP-MTVFP = 'KP'.
ENDIF.
WHEN 'ZRE1' .
VBAP-WERKS = VBAK-VKORG.
vbap-VSTEL = VBAK-VKORG.
WHEN 'ZOR7' .
VBAP-WERKS = VBAK-VKORG.
vbap-VSTEL = VBAK-VKORG.
WHEN 'ZKB' .
VBAP-WERKS = VBAK-VKORG.
vbap-VSTEL = VBAK-VKORG.
*modify by yangzhiping 2008.11.07
WHEN 'ZCR1' .
VBAP-WERKS = VBAK-VKORG.
vbap-VSTEL = VBAK-VKORG.
WHEN 'ZDR1' .
VBAP-WERKS = VBAK-VKORG.
vbap-VSTEL = VBAK-VKORG.
WHEN 'ZCR4' .
VBAP-WERKS = VBAK-VKORG.
vbap-VSTEL = VBAK-VKORG.
WHEN 'ZDR4' .
VBAP-WERKS = VBAK-VKORG.
vbap-VSTEL = VBAK-VKORG.
WHEN 'ZOR4' .
VBAP-WERKS = VBAK-VKORG.
vbap-VSTEL = VBAK-VKORG.
WHEN 'ZRD4' .
VBAP-WERKS = VBAK-VKORG.
vbap-VSTEL = VBAK-VKORG.
WHEN 'ZFD2' .
VBAP-WERKS = VBAK-VKORG.
vbap-VSTEL = VBAK-VKORG.
WHEN 'ZRD2' .
VBAP-WERKS = VBAK-VKORG.
vbap-VSTEL = VBAK-VKORG.
ENDCASE.
*序号30*
* VBAP-zzfield = xxxx-zzfield2.
ENDFORM. "USEREXIT_MOVE_FIELD_TO_VBAP
*eject
*---------------------------------------------------------------------*
* FORM USEREXIT_MOVE_FIELD_TO_VBEP *
*---------------------------------------------------------------------*
* This userexit can be used to move some fields into the sales *
* dokument schedule line workaerea VBEP *
* *
* SVBEP-TABIX = 0: Create schedule line *
* SVBEP-TABIX > 0: Change schedule line *
* *
* This form is called at the end of form VBEP_FUELLEN. *
* *
*---------------------------------------------------------------------*
FORM USEREXIT_MOVE_FIELD_TO_VBEP.
* VBEP-zzfield = xxxx-zzfield2.
ENDFORM. "USEREXIT_MOVE_FIELD_TO_VBEP
*eject
*---------------------------------------------------------------------*
* FORM USEREXIT_MOVE_FIELD_TO_VBKD *
*---------------------------------------------------------------------*
* This userexit can be used to move some fields into the sales *
* dokument business data workaerea VBKD *
* *
* SVBKD-TABIX = 0: Create data *
* SVBKD-TABIX > 0: Change data *
* *
* This form is called at the end of form VBKD_FUELLEN. *
* *
*---------------------------------------------------------------------*
FORM USEREXIT_MOVE_FIELD_TO_VBKD.
*代开票未上线,此时取售达方的付款条款
IF VBKD-ZTERM IS INITIAL.
SELECT SINGLE ZTERM INTO VBKD-ZTERM FROM KNVV WHERE KUNNR = VBAK-KUNNR.
ENDIF.
****增强14:回购业务控制
****逻辑:1、代开票回购时业绩所属分公司为代开票分公司,否为为客户所属业绩分公司
**** 2、代开票回购差异处理,借贷项凭证类型(ZCR1\ZDR1)并且订单原因为704时,业绩公司等于销售组织
*IF VBAK-AUART = 'ZOR1' AND VBAK-AUGRU = '115'.
IF ( ( VBAK-AUART = 'ZOR1' OR VBAK-AUART = 'ZOR7' ) AND VBAK-AUGRU = '115' ) OR ( VBAK-AUART = 'ZDR1' AND VBAK-AUGRU = '704' )
OR ( VBAK-AUART = 'ZCR1' AND VBAK-AUGRU = '704' ).
DATA ZVKORG LIKE ZTSD011-VKORG.
READ TABLE XVBKD WITH KEY POSNR = '000000'.
IF SY-SUBRC EQ 0.
SELECT SINGLE VKORG INTO ZVKORG FROM ZTSD011 WHERE BZIRK = XVBKD-BZIRK.
IF SY-SUBRC EQ 0 AND ZVKORG NE VBAK-VKORG.
VBKD-BZIRK = VBAK-VKORG.
ENDIF.
ENDIF.
ENDIF.
****增强14结束;
* VBKD-zzfield = xxxx-zzfield2.
ENDFORM. "USEREXIT_MOVE_FIELD_TO_VBKD
*eject
*---------------------------------------------------------------------*
* FORM USEREXIT_NUMBER_RANGE *
*---------------------------------------------------------------------*
* This userexit can be used to determine the numberranges for *
* the internal document number. *
* *
* US_RANGE_INTERN - internal number range *
* *
* This form is called from form BELEG_SICHERN *
* *
*---------------------------------------------------------------------*
FORM USEREXIT_NUMBER_RANGE USING US_RANGE_INTERN.
* Example: Numer range from TVAK like in standard
* US_RANGE_INTERN = TVAK-NUMKI.
ENDFORM. "USEREXIT_NUMBER_RANGE
*eject
*---------------------------------------------------------------------*
* FORM USEREXIT_PRICING_PREPARE_TKOMK *
*---------------------------------------------------------------------*
* This userexit can be used to move additional fields into the *
* communication table which is used for pricing: *
* *
* TKOMK for header fields *
* *
* This form is called from form PREISFINDUNG_VORBEREITEN. *
* *
*---------------------------------------------------------------------*
FORM USEREXIT_PRICING_PREPARE_TKOMK.
* TKOMK-zzfield = xxxx-zzfield2.
*{ INSERT DEVK900239 1
TKOMK-KVGR1 = VBAK-KVGR1.
TKOMK-KVGR2 = VBAK-KVGR2.
TKOMK-KVGR3 = VBAK-KVGR3.
TKOMK-KVGR4 = VBAK-KVGR4.
TKOMK-KVGR5 = VBAK-KVGR5.
*读取配送商信息到表中去
LOOP AT XVBPA WHERE PARVW = 'Z6'.
TKOMK-ZKUNNR = XVBPA-KUNNR.
ENDLOOP.
*} INSERT
ENDFORM. "USEREXIT_PRICING_PREPARE_TKOMK
*eject
*---------------------------------------------------------------------*
* FORM USEREXIT_PRICING_PREPARE_TKOMP *
*---------------------------------------------------------------------*
* This userexit can be used to move additional fields into the *
* communication table which is used for pricing: *
* *
* TKOMP for item fields *
* *
* This form is called from form PREISFINDUNG_VORBEREITEN. *
* *
*---------------------------------------------------------------------*
FORM USEREXIT_PRICING_PREPARE_TKOMP.
* TKOMP-zzfield = xxxx-zzfield2.
*{ INSERT DEVK900239 1
TKOMP-MVGR1 = VBAP-MVGR1.
TKOMP-MVGR2 = VBAP-MVGR2.
TKOMP-MVGR3 = VBAP-MVGR3.
TKOMP-MVGR4 = VBAP-MVGR4.
TKOMP-MVGR5 = VBAP-MVGR5.
DATA:WV_EXTWG LIKE MARA-EXTWG.
IF TKOMP-EXTWG IS INITIAL.
SELECT SINGLE EXTWG INTO WV_EXTWG FROM MARA WHERE MATNR = VBAP-MATNR.
IF SY-SUBRC = 0.
TKOMP-EXTWG = WV_EXTWG.
ENDIF.
CLEAR WV_EXTWG.
ENDIF.
*} INSERT
ENDFORM. "USEREXIT_PRICING_PREPARE_TKOMP
*eject
*---------------------------------------------------------------------*
* FORM USEREXIT_READ_DOCUMENT *
*---------------------------------------------------------------------*
* This userexit can be used to read data in additional tables *
* when the program reads a sales document. *
* *
* This form is called at the end of form BELEG_LESEN. *
* *
*---------------------------------------------------------------------*
FORM USEREXIT_READ_DOCUMENT.
ENDFORM. "USEREXIT_READ_DOCUMENT
*eject
*---------------------------------------------------------------------*
* FORM USEREXIT_SAVE_DOCUMENT *
*---------------------------------------------------------------------*
* This userexit can be used to save data in additional tables *
* when a document is saved. *
* *
* If field T180-TRTYP contents 'H', the document will be *
* created, else it will be changed. *
* *
* This form is called at from form BELEG_SICHERN, before COMMIT *
* *
*---------------------------------------------------------------------*
FORM USEREXIT_SAVE_DOCUMENT.
* Example:
* CALL FUNCTION 'ZZ_EXAMPLE'
* IN UPDATE TASK
* EXPORTING
* ZZTAB = ZZTAB.
ENDFORM. "USEREXIT_SAVE_DOCUMENT
*eject
*---------------------------------------------------------------------*
* FORM USEREXIT_SAVE_DOCUMENT_PREPARE *
*---------------------------------------------------------------------*
* This userexit can be used for changes or checks, before a *
* document is saved. *
* *
* If field T180-TRTYP contents 'H', the document will be *
* created, else it will be changed. *
* *
* This form is called at the beginning of form BELEG_SICHERN *
* *
*---------------------------------------------------------------------*
FORM USEREXIT_SAVE_DOCUMENT_PREPARE.
*{ INSERT DEVK900239 1
****增强1:多品项促销,保证配套物料一定需要存在;
* TABLES:ZTSD009.
* DATA : WV_MENGE LIKE VBAP-ZMENG.
**赠送物料的数量,一定需要使用中间变量,因此存在A+b+C 送D的情况
* DATA : WV_MENGE2 LIKE VBAP-ZMENG.
* DATA: WT_ZTSD009 TYPE TABLE OF ZTSD009 WITH HEADER LINE.
* LOOP AT XVBAP WHERE PSTYV = 'TANN'.
**赠送物料的数量
* WV_MENGE2 = XVBAP-KWMENG .
**找到配套物料
* SELECT * INTO TABLE WT_ZTSD009 FROM ZTSD009 WHERE MATNRA = XVBAP-MATNR AND VALID = 'X' AND KUNNR = VBAK-KUNNR.
* LOOP AT WT_ZTSD009.
* IF SY-SUBRC <> 0.
* EXIT.
* ELSE.
* IF WT_ZTSD009-MENGEA <> 0.
**得到配套物料应该的数量;
* WV_MENGE = WV_MENGE2 * WT_ZTSD009-MENGEB / WT_ZTSD009-MENGEA.
* ENDIF.
**设置主物料的一次性完整交货;
* READ TABLE XVBAP WITH KEY MATNR = WT_ZTSD009-MATNRC .
* XVBAP-KZTLF = 'C'.
* MODIFY XVBAP INDEX SY-TABIX.
* ENDIF.
**找到订单的内表中是否存在配套物料
* READ TABLE XVBAP WITH KEY MATNR = WT_ZTSD009-MATNRB .
**如果不存在,则直接出现错误提示
* IF SY-SUBRC <> 0.
* MESSAGE E398(00)
* WITH '未输入配套物料' WT_ZTSD009-MATNRB .
* ELSE.
**如果找到,但是订单的数量仍然小于配套物料应该的数量,也出现错误提示
**注意这里的XVBAP-KWMENG 为Read的结果,而非where PSTYV = 'TANN'的结果.
**如果符合条件,则设置一次性交货,如果不符合条件,则不设置一次性交货标记,给出错误提示
**20080728更新:增加 MODIFY XVBAP INDEX SY-TABIX.
**20080728更新结束:
* IF XVBAP-KWMENG >= WV_MENGE .
** XVBAK-AUTLF = 'X'.
* VBAK-AUTLF = 'X'.
* XVBAP-KZTLF = 'C'.
* MODIFY XVBAP INDEX SY-TABIX.
* ELSE.
* MESSAGE E398(00)
* WITH '配套物料' WT_ZTSD009-MATNRB '的数量不够,至少为' WV_MENGE .
* ENDIF.
* ENDIF.
**清除配套物料应该的配套数量
* CLEAR WV_MENGE.
* ENDLOOP.
**清除赠送物料的数量
* CLEAR WV_MENGE2.
* ENDLOOP.
****增强1结束:多品项促销,保证配套物料一定需要存在;
*交货组的功能不可用
* XVBAP-GRKOR = 1.
* modify XVBAP.
* read table xvbap with key matnr = wt_ZTSD009-matnrC.
* XVBAP-GRKOR = 1.
* modify XVBAP.
****增强2:当买就送的情况下,设置完成交货;
* LOOP AT XVBAP WHERE KZWI6 <> 0 .
* XVBAP-KZTLF = 'C'.
* MODIFY XVBAP.
* ENDLOOP.
****增强2结束:当买就送的情况下,设置完成交货;
*} INSERT
******增强15 根据仓库地点来确认装运点,主要用于区分河南中转库和总部成品仓发货.
IF VBAK-AUART = 'ZOR3' OR VBAK-AUART = 'ZRE3'.
TABLES ZTMM018.
LOOP AT XVBAP.
SELECT SINGLE * FROM ZTMM018 WHERE LGORT = XVBAP-LGORT AND WERKS = XVBAP-WERKS.
IF SY-SUBRC EQ 0.
XVBAP-VSTEL = ZTMM018-VSTEL.
ELSE.
Xvbap-VSTEL = '2000'.
ENDIF.
MODIFY XVBAP INDEX SY-TABIX.
ENDLOOP.
ENDIF.
******增强15结束
******Client不为200时并且为销售订单业务时,才进行以下程序检查
IF SY-MANDT <> '200' AND VBAK-TRVOG EQ 0 . "TRVOG为0代表销售订单
*******增强12 第三批上线分公司下单权限检查 modify yzp date 2009.05.21
* IF T180-TRTYP = 'H' AND SY-UNAME NE '1091159'.
* TABLES ZTSD025.
* IF VBAK-AUART = 'ZOR1' OR VBAK-AUART = 'ZOR2' OR VBAK-AUART = 'ZRE1' OR VBAK-AUART = 'ZRE2'.
* SELECT SINGLE * FROM ZTSD025 WHERE BZIRK = XVBKD-BZIRK AND VALID NE 'X'.
* IF SY-SUBRC EQ 0.
* MESSAGE E398(00) WITH '由于补单业务未完成,正常业务不能进行 !'.
* ENDIF.
* ENDIF.
* ENDIF.
*******结束增强12
*增强3: 对业绩所属分公司进行权限检查
DATA : WV_ACTVT(2) TYPE C.
CASE T180-TRTYP.
WHEN CHARH. "H 添加
WV_ACTVT = ACTVT_01. "VALUE '01'
WHEN CHARV. "V 修改
WV_ACTVT = ACTVT_02. "VALUE '02'
WHEN CHARA. "A 显示
WV_ACTVT = ACTVT_03. "VALUE '03'
ENDCASE.
*比较保存时的值;
IF T180-TRTYP = 'H'. "AND ( XVBAK-TRVOG EQ 0 OR VBAK-TRVOG EQ 0 ). "TRVOG为0代表销售订单
IF VBAK-AUART = 'ZOR3' OR VBAK-AUART = 'ZRE3'.
AUTHORITY-CHECK OBJECT 'ZSDORDER'
ID 'AUART' FIELD VBAK-AUART
ID 'ZFAKSK' DUMMY
ID 'ZLIFSK' FIELD VBAK-LIFSK
ID 'ZBZIRK' FIELD XVBKD-BZIRK
ID 'ACTVT' FIELD WV_ACTVT.
ELSEIF VBAK-AUART = 'ZCR1' OR VBAK-AUART = 'ZDR1' OR
VBAK-AUART = 'ZCR2' OR VBAK-AUART = 'ZDR2'.
AUTHORITY-CHECK OBJECT 'ZSDORDER'
ID 'AUART' FIELD VBAK-AUART
ID 'ZFAKSK' FIELD VBAK-FAKSK
ID 'ZLIFSK' DUMMY
ID 'ZBZIRK' FIELD XVBKD-BZIRK
ID 'ACTVT' FIELD WV_ACTVT.
ELSE.
AUTHORITY-CHECK OBJECT 'ZSDORDER'
ID 'AUART' FIELD VBAK-AUART
ID 'ZFAKSK' DUMMY
ID 'ZLIFSK' DUMMY
ID 'ZBZIRK' FIELD XVBKD-BZIRK
ID 'ACTVT' FIELD WV_ACTVT.
ENDIF.
IF SY-SUBRC NE 0.
MESSAGE E398(00)
WITH '你没有该权限'.
ENDIF.
IF XVBAK-AUART = 'ZOR3' OR XVBAK-AUART = 'ZRE3'.
AUTHORITY-CHECK OBJECT 'ZSDORDER'
ID 'AUART' FIELD XVBAK-AUART
ID 'ZFAKSK' DUMMY
ID 'ZLIFSK' FIELD XVBAK-LIFSK
ID 'ZBZIRK' FIELD XVBKD-BZIRK
ID 'ACTVT' FIELD WV_ACTVT.
ELSEIF XVBAK-AUART = 'ZCR1' OR XVBAK-AUART = 'ZDR1' OR
XVBAK-AUART = 'ZCR2' OR XVBAK-AUART = 'ZDR2'.
AUTHORITY-CHECK OBJECT 'ZSDORDER'
ID 'AUART' FIELD XVBAK-AUART
ID 'ZFAKSK' FIELD XVBAK-FAKSK
ID 'ZLIFSK' DUMMY
ID 'ZBZIRK' FIELD XVBKD-BZIRK
ID 'ACTVT' FIELD WV_ACTVT.
ELSE.
AUTHORITY-CHECK OBJECT 'ZSDORDER'
ID 'AUART' FIELD XVBAK-AUART
ID 'ZFAKSK' DUMMY
ID 'ZLIFSK' DUMMY
ID 'ZBZIRK' FIELD XVBKD-BZIRK
ID 'ACTVT' FIELD WV_ACTVT.
ENDIF.
IF SY-SUBRC NE 0.
MESSAGE E398(00)
WITH '你没有该权限'.
ENDIF.
ENDIF.
*功能点2:如果修改状态,那么同时判断原来的值进行权限检查
IF T180-TRTYP <> 'H'. "AND ( XVBAK-TRVOG EQ 0 OR VBAK-TRVOG EQ 0 ). "TRVOG为0代表销售订单
IF YVBAK-AUART = 'ZOR3' OR YVBAK-AUART = 'ZRE3'.
AUTHORITY-CHECK OBJECT 'ZSDORDER'
ID 'AUART' FIELD YVBAK-AUART
ID 'ZFAKSK' DUMMY
ID 'ZLIFSK' FIELD YVBAK-LIFSK
ID 'ZBZIRK' FIELD XVBKD-BZIRK
ID 'ACTVT' FIELD WV_ACTVT.
ELSEIF YVBAK-AUART = 'ZCR1' OR YVBAK-AUART = 'ZDR1' OR
YVBAK-AUART = 'ZCR2' OR YVBAK-AUART = 'ZDR2'.
AUTHORITY-CHECK OBJECT 'ZSDORDER'
ID 'AUART' FIELD YVBAK-AUART
ID 'ZFAKSK' FIELD YVBAK-FAKSK
ID 'ZLIFSK' DUMMY
ID 'ZBZIRK' FIELD XVBKD-BZIRK
ID 'ACTVT' FIELD WV_ACTVT.
ELSE.
AUTHORITY-CHECK OBJECT 'ZSDORDER'
ID 'AUART' FIELD YVBAK-AUART
ID 'ZFAKSK' DUMMY
ID 'ZLIFSK' DUMMY
ID 'ZBZIRK' FIELD XVBKD-BZIRK
ID 'ACTVT' FIELD WV_ACTVT.
ENDIF.
IF SY-SUBRC NE 0.
MESSAGE E398(00)
WITH '你没有该权限'.
ENDIF.
IF XVBAK-AUART = 'ZOR3' OR XVBAK-AUART = 'ZRE3'.
AUTHORITY-CHECK OBJECT 'ZSDORDER'
ID 'AUART' FIELD XVBAK-AUART
ID 'ZFAKSK' DUMMY
ID 'ZLIFSK' FIELD XVBAK-LIFSK
ID 'ZBZIRK' FIELD XVBKD-BZIRK
ID 'ACTVT' FIELD WV_ACTVT.
ELSEIF XVBAK-AUART = 'ZCR1' OR XVBAK-AUART = 'ZDR1' OR
XVBAK-AUART = 'ZCR2' OR XVBAK-AUART = 'ZDR2'.
AUTHORITY-CHECK OBJECT 'ZSDORDER'
ID 'AUART' FIELD XVBAK-AUART
ID 'ZFAKSK' FIELD XVBAK-FAKSK
ID 'ZLIFSK' DUMMY
ID 'ZBZIRK' FIELD XVBKD-BZIRK
ID 'ACTVT' FIELD WV_ACTVT.
ELSE.
AUTHORITY-CHECK OBJECT 'ZSDORDER'
ID 'AUART' FIELD XVBAK-AUART
ID 'ZFAKSK' DUMMY
ID 'ZLIFSK' DUMMY
ID 'ZBZIRK' FIELD XVBKD-BZIRK
ID 'ACTVT' FIELD WV_ACTVT.
ENDIF.
IF SY-SUBRC NE 0.
MESSAGE E398(00)
WITH '你没有该权限'.
ENDIF.
IF VBAK-AUART = 'ZOR3' OR VBAK-AUART = 'ZRE3'.
AUTHORITY-CHECK OBJECT 'ZSDORDER'
ID 'AUART' FIELD VBAK-AUART
ID 'ZFAKSK' DUMMY
ID 'ZLIFSK' FIELD VBAK-LIFSK
ID 'ZBZIRK' FIELD XVBKD-BZIRK
ID 'ACTVT' FIELD WV_ACTVT.
ELSEIF VBAK-AUART = 'ZCR1' OR VBAK-AUART = 'ZDR1' OR
VBAK-AUART = 'ZCR2' OR VBAK-AUART = 'ZDR2'.
AUTHORITY-CHECK OBJECT 'ZSDORDER'
ID 'AUART' FIELD VBAK-AUART
ID 'ZFAKSK' FIELD VBAK-FAKSK
ID 'ZLIFSK' DUMMY
ID 'ZBZIRK' FIELD XVBKD-BZIRK
ID 'ACTVT' FIELD WV_ACTVT.
ELSE.
AUTHORITY-CHECK OBJECT 'ZSDORDER'
ID 'AUART' FIELD VBAK-AUART
ID 'ZFAKSK' DUMMY
ID 'ZLIFSK' DUMMY
ID 'ZBZIRK' FIELD XVBKD-BZIRK
ID 'ACTVT' FIELD WV_ACTVT.
ENDIF.
IF SY-SUBRC NE 0.
MESSAGE E398(00)
WITH '你没有该权限'.
ENDIF.
ENDIF.
*增强3结束
TABLES: ZTSD011.
*增强4: 检查订单类型的正确性;
IF T180-TRTYP = 'H'."仅在创建时,做检查""20080814更新
READ TABLE XVBKD WITH KEY POSNR = '000000'.
CASE VBAK-AUART.
WHEN 'ZOR1' OR 'ZRE1 ' OR 'ZFD2' OR 'ZCR1' OR 'ZDR1' OR 'ZFD1' OR 'KA' OR 'KB' OR 'KE' OR 'KR' OR 'ZOR7' OR 'ZKB' ."正常销售 MODIFY BY YZP DATE:2009.03 add ka/kb
*取业绩所属分公司对应的销售组织,取到后,与当前订单的销售组织进行对比
SELECT SINGLE * FROM ZTSD011 WHERE BZIRK = XVBKD-BZIRK.
IF SY-SUBRC = 0.
* IF XVBAK-VKORG <> ZTSD011-VKORG.
IF VBAK-VKORG NE ZTSD011-VKORG AND VBAK-AUGRU NE '115' AND VBAK-VKORG NE '2000'. "MODIFY BY YZP DATE 20090311 标准订单时 代开票回购销售冲115
MESSAGE E398(00)
WITH '订单类型可能选择错误,因为客户性质为代开票性质'.
ENDIF.
ENDIF.
*使用标准的订单类型,交货工厂应该与销售组织一致;
LOOP AT XVBAP WHERE WERKS <> VBAK-VKORG.
MESSAGE E398(00) WITH '订单类型与交货工厂矛盾'.
ENDLOOP.
*年糖备货单据只能由总公司下达,并且必须KA、KB时销售组织为2000,销售渠道99、订单原因为y03、y33 20090922启用
IF ( VBAK-AUART EQ 'KA' OR VBAK-AUART EQ 'KB' ) AND VBAK-VKORG EQ '2000' AND VBAK-VTWEG EQ '99'.
IF NOT ( VBAK-AUGRU EQ 'Y03' OR VBAK-AUGRU EQ 'Y33' ).
MESSAGE E398(00) WITH '此为年糖备货单,订单类型与订单原因不一致'.
ENDIF.
ENDIF.
WHEN 'ZOR2' OR 'ZRE2 ' OR 'ZCR2' OR 'ZDR2' OR 'ZKE2' OR 'ZKR2' OR 'ZOR8'. "代开票的情况 加入联营专柜代票订单类型 modify yzp date 20090311
* WHEN 'ZOR2' OR 'ZRE2 ' OR 'ZCR2' OR 'ZDR2'. "代开票的情况
*取业绩所属分公司对应的销售组织,取到后,与当前订单的销售组织进行对比,如果一致 则 错误 ;
SELECT SINGLE * FROM ZTSD011 WHERE BZIRK = XVBKD-BZIRK.
IF SY-SUBRC = 0.
IF VBAK-VKORG = ZTSD011-VKORG.
MESSAGE E398(00)
WITH '订单类型可能选择错误,因为客户性质并非为代开票性质,代开票客户对应的销售组织应该不等于业绩归属分公司'.
ENDIF.
ENDIF.
*使用带开票的订单类型,交货工厂应该与销售组织不一致;
LOOP AT XVBAP WHERE WERKS = VBAK-VKORG.
MESSAGE E398(00) WITH '行项目' XVBAP-POSNR '订单类型与交货工厂矛盾,销售组织等于了交货工厂'.
ENDLOOP.
WHEN 'ZOR3'. "指配订单的情况
LOOP AT XVBAP WHERE WERKS <> '2000'.
MESSAGE E398(00) WITH '行项目' XVBAP-POSNR '订单的交货工厂应该为2000'.
ENDLOOP.
WHEN 'ZRE3'. "指配订单的情况
LOOP AT XVBAP WHERE WERKS <> '2000'.
MESSAGE E398(00) WITH '行项目' XVBAP-POSNR '订单的交货工厂应该为2000'.
ENDLOOP.
CLEAR:VBAK-LIFSK,XVBAK-LIFSK. "MODIFY YZP 退货不帮交货冻结 20081117
ENDCASE.
ENDIF.
*增强8: 检查订单原因和订单类型的一致性
TABLES: ZTSD012.
SELECT SINGLE * FROM ZTSD012 WHERE AUART = VBAK-AUART AND AUGRU = VBAK-AUGRU .
IF SY-SUBRC <> 0.
MESSAGE E398(00) WITH '订单类型和订单原因不匹配,请重新输入!'.
ENDIF.
*增强8结束;
*增强9:销售订单行项目客户下单数量及行项目失效日期有效性控制;
* 控制点:1、提示客户下单数量、失效日期为必输;
* 2、订单类型为ZOR1、ZOR2、ZOR3
* 3、订单原因为800(销冲单)时不控制
* 4、2000(总部发货给分公司)销售组织的销售订单不控制;
* 5、此作业是基于增强8存在的情况下
* WHEN 'ZOR1' OR 'ZOR2' OR 'ZOR3'.
.
IF SY-UNAME NE '1109347' AND VBAK-ERDAT GE '20090301'. "创建者不为1091159或者大于20090301时才进行失效日期检查
IF VBAK-VKORG NE 2000 AND ZTSD012-ZFLAG EQ 'X'.
DATA ZPOS TYPE I.
LOOP AT XVBUP.
READ TABLE XVBKD WITH KEY POSNR = XVBUP-POSNR.
IF SY-SUBRC EQ 0.
IF XVBKD-BSTDK_E IS INITIAL.
MESSAGE E398(00) WITH '请在行项目' XVBUP-POSNR '栏位Order Date输入失效日期'.
ENDIF.
ELSE.
MESSAGE E398(00) WITH '请在行项目' XVBUP-POSNR '栏位Order Date输入失效日期'.
ENDIF.
ENDLOOP.
ENDIF.
* 判断字段XVBKD-BSTKD_E输入是数字
* DATA:ZLEN TYPE I. "取字符长度
* DATA:ZPOS9 TYPE I VALUE 0.
* DATA:ZCHAR(11).
* ZCHAR = '0123456 78.9'.
* ZLEN = STRLEN( XVBKD-BSTKD_E ).
*
* DO ZLEN TIMES.
* IF NOT XVBKD-BSTKD_E+ZPOS9(1) CO ZCHAR.
* MESSAGE E398(00) WITH '采购订单编号中字符' XVBKD-BSTKD_E+ZPOS9(1) '不是数字'.
* ENDIF.
* ZPOS9 = ZPOS9 + 1.
* ENDDO.
ENDIF.
*增强9结束
IF T180-TRTYP = 'H' OR T180-TRTYP = 'V'."仅在创建,更改时,做检查""20080814更新 ; MODIFY BY YZP 20090416
***对订单类型进行控制
CASE VBAK-AUART.
*增强6: 检查联营客户是否与订单类型匹配;
WHEN 'KB' OR 'KA' OR 'KE' OR 'KR' OR 'ZKE2' OR 'ZKR2' OR 'ZKB' ."联营专柜
TABLES: KNA1.
* 判断客户是不是联营客户32,如果是联营客户且工厂不为2000时,报错
SELECT SINGLE * FROM KNA1 WHERE KUNNR = VBAK-KUNNR AND KDKG3 <> '32'.
IF SY-SUBRC = 0.
IF VBAK-VKORG <> '2000'.
MESSAGE E398(00) WITH '订单类型可能选择错误,因为客户性质为非联营散装客户'.
ENDIF.
ENDIF.
*增强6结束;
*增强11: 代理商退货订单,默认送货方式为Z10;当单据退货为销售冲单时,操作人员可以选择送货方式;
* WHEN 'ZRE1' OR 'ZRE3'.
*增强11结束:
ENDCASE.
***对订单类型进行控制结束
*增强7: 检查行项目是否为空
DATA: LIN TYPE I.
DESCRIBE TABLE XVBAP LINES LIN .
IF LIN <= 0.
MESSAGE E398(00) WITH '行项目不能为空!'.
ENDIF.
*增强7结束;
ENDIF.
***增强10 客户退货控制
***1、退货控制逻辑:
*** 1)、通过维护表ZTSD021、ZTSD022来进行渠道可销售品项、销售类、行销类的控制;
*** 2)、订单原因810、210退货时不受控制;
*** 3)、渠道10、11、12、40在每月的1-4号不能退货;
***2、可退货控制逻辑
*** 1)、通过维护表ZTSD023做分公司、渠道、客户、系统(四选一)和品项、销售类、行项类(三选一)的解除退货控制;\
***用户1091159创建销售订单时权限不受控制
IF ( T180-TRTYP = 'H' OR T180-TRTYP = 'V' ) AND SY-UNAME NE '1109347' AND VBAK-AUGRU NE '810' AND VBAK-AUGRU NE '210' AND VBAK-ERDAT GE '20090601'. "AND SY-UNAME = 'ABAP1' ."仅在创建,更改时,做检查""20080814更新
DATA:YC(2),
YI TYPE I.
YC = VBAK-ERDAT+6(2).
YI = YC.
IF ( VBAK-VTWEG EQ '10' OR VBAK-VTWEG EQ '11' OR VBAK-VTWEG EQ '12' OR VBAK-VTWEG EQ '40' ) AND YI LE 4
AND ( VBAK-AUART EQ 'ZRE1' OR VBAK-AUART EQ 'ZRE2' OR VBAK-AUART EQ 'KA' ).
MESSAGE E398(00) WITH '渠道10、11、12、40在每月1-4号不能退货!!'.
ELSE.
CASE VBAK-AUART.
WHEN 'ZRE1' OR 'ZRE2' OR 'KA'.
TABLES:ZTSD021,ZTSD022,ZTSD023.
DATA:ZKMC(30).
SELECT SINGLE * FROM ZTSD011 WHERE BZIRK = XVBKD-BZIRK.
LOOP AT XVBAP.
"先检查优先级高的可退货表ZTSD023
SELECT SINGLE * FROM ZTSD023
WHERE
( ( KUNNR EQ VBAK-KUNNR ) OR ( KVGR2 EQ VBAK-KVGR2 AND VKORG EQ ZTSD011-VKORG ) OR ( VTWEG EQ VBAK-VTWEG AND VKORG EQ ZTSD011-VKORG )
OR ( KVGR2 EQ VBAK-KVGR2 AND VKORG EQ '' ) OR ( VTWEG EQ VBAK-VTWEG AND VKORG EQ '' ) )
AND ( MATNR EQ XVBAP-MATNR OR KONDM EQ XVBAP-KONDM OR MVGR5 EQ XVBAP-MVGR5 )
AND DATAB LE XVBAP-ERDAT
AND DATBI GE XVBAP-ERDAT
.
IF SY-SUBRC EQ 0. "假如允许销售退货 就进入一下条目
CONTINUE.
ENDIF.
"否则检查此客户不可退货渠道及物料列表
SELECT SINGLE * FROM ZTSD021 WHERE VTWEG EQ VBAK-VTWEG
AND DATAB LE XVBAP-ERDAT
AND DATBI GE XVBAP-ERDAT
.
IF SY-SUBRC EQ 0.
SELECT SINGLE * FROM ZTSD022 WHERE ( MATNR EQ XVBAP-MATNR OR KONDM EQ XVBAP-KONDM OR MVGR5 EQ XVBAP-MVGR5 )
AND DATAB LE XVBAP-ERDAT
AND DATBI GE XVBAP-ERDAT
.
IF SY-SUBRC EQ 0.
READ TABLE XVBUP WITH KEY POSNR = XVBAP-POSNR .
IF SY-SUBRC EQ 0.
CONCATENATE ZKMC XVBAP-POSNR INTO ZKMC SEPARATED BY SPACE.
ENDIF.
ENDIF.
ENDIF.
ENDLOOP.
IF ZKMC IS NOT INITIAL.
MESSAGE E398(00) WITH '行项目' ZKMC '不能退货'.
ENDIF.
* ENDIF.
ENDCASE.
ENDIF.
ENDIF.
***增强10结束
***增强13:代理商、小商品渠道的订单产生交货单后不能再修改送货方式;
***前提关闭所有行项目送货方式的修改(用屏幕变式实现此功能)
IF T180-TRTYP = 'V' AND SY-UNAME NE '1109347'. "SY-TCODE NE 'ZVA02E'.
IF ( VBAK-VTWEG = '20' OR VBAK-VTWEG = '30' ) AND VBUK-LFSTK <> 'A' .
READ TABLE XVBKD WITH KEY POSNR = '000000'.
READ TABLE YVBKD WITH KEY POSNR = '000000'.
IF SY-SUBRC EQ 0 AND XVBKD-INCO1 NE YVBKD-INCO1.
MESSAGE E398(00) WITH '代理商、小商品订单产生交货单后,送货方式不能修改!'.
ENDIF.
ENDIF.
ENDIF.
***增强13结束;
ENDIF.
*******增强16 客户回单帐期超过提示及管控在订单上进行交货冻结
*IF XVBKD-BZIRK EQ '6691' OR XVBKD-BZIRK EQ '6693' OR XVBKD-BZIRK EQ '6660' OR
* XVBKD-BZIRK EQ '6310' OR XVBKD-BZIRK EQ '6340' OR XVBKD-BZIRK EQ '6690'.
READ TABLE XVBKD WITH KEY POSNR = '000000'.
IF SY-SUBRC EQ 0. "AND SY-UNAME EQ '1091159'.
SELECT SINGLE * FROM ZTSD034 WHERE AUGRU EQ VBAK-AUGRU AND ( ZRECON EQ 'X' OR ZRECON2 EQ 'X' ).
IF SY-SUBRC EQ 0.
IF ZTSD034-ZRECON2 EQ 'X'.
CLEAR XVBAK-LIFSK.
CLEAR VBAK-LIFSK.
MODIFY VBAK.
ENDIF.
"不管交货单还是订单回单管控都在销售订单上做提示
DATA: ZTDAT1 LIKE SY-DATUM.
SELECT MIN( ZTDAT ) INTO ZTDAT1 FROM ZTSD032 "得到此客户最早回单日期
WHERE KUNAG EQ VBAK-KUNNR
AND ZREFG NE 'X'
AND ( ZEDAT LT SY-DATUM OR ZEDAT EQ '' ).
"如果找到未回单的单据,并且回单日期小于当天,即提示
IF SY-SUBRC EQ 0 AND ZTDAT1 LT SY-DATUM AND ZTDAT1 IS NOT INITIAL.
MESSAGE I398(00) WITH '超回单帐期锁户'.
"如果是订单管控,把销售订单的"交货冻结"直接标识为'04'
IF ZTSD034-ZRECON2 EQ 'X'.
XVBAK-LIFSK = '04'.
VBAK-LIFSK = '04'.
MODIFY VBAK.
ENDIF.
ENDIF.
ENDIF.
ENDIF.
*ENDIF.
*******增强16如束
*******增强17配送业务送货方式和回单的管控.
*IF ( VBAK-AUART EQ 'ZOR7' OR VBAK-AUART EQ 'ZOR8' OR VBAK-AUART EQ 'ZKB' ) AND ( SY-UNAME NE '1091159' OR SY-UNAME NE 'ABAP2' ).
* MESSAGE E398(00) WITH '你暂时没有权限使用订单类型ZOR7/ZOR8/ZKB'.
*ENDIF.
IF VBAK-AUART EQ 'ZOR7' OR VBAK-AUART EQ 'ZOR8' OR VBAK-AUART EQ 'ZKB'.
READ TABLE XVBKD WITH KEY POSNR = '000000'.
IF SY-SUBRC EQ 0 AND XVBKD-INCO1 NE 'Z31'.
MESSAGE E398(00) WITH '送货方式必须为Z31(配送商配送),确认此客户是否为被配送客户或修改订单送货方式!'.
ENDIF.
ELSEIF VBAK-AUART EQ 'ZOR1' OR VBAK-AUART EQ 'ZOR2' OR VBAK-AUART EQ 'KB' AND VBAK-VKORG NE 2000.
READ TABLE XVBKD WITH KEY POSNR = '000000'.
IF SY-SUBRC EQ 0 AND ( XVBKD-INCO1 EQ 'Z31' OR XVBKD-INCO1 EQ 'Z10' ).
MESSAGE E398(00) WITH '送货方式为Z31(配送商配送)或Z10(总公司直送),销售订单类型或送货方式选择错误!'.
ENDIF.
ELSEIF VBAK-AUART EQ 'ZOR3' OR VBAK-AUART EQ 'ZRE3'.
READ TABLE XVBKD WITH KEY POSNR = '000000'.
IF SY-SUBRC EQ 0 AND XVBKD-INCO1 NE 'Z10'.
MESSAGE E398(00) WITH '送货方式必须为Z10(总公司送货),确认此客户是否为指配客户或修改订单送货方式!'.
ENDIF.
ENDIF.
*******结束增强17配送业务送货方式和回单的管控.
*******增强18 控制销售订单不能修改
LOOP AT XVBAP.
ENDLOOP.
*******结束增强18 控制销售订单不能修改
****结束 Client不为200时并且为销售订单(VBAK-TRVOG EQ 0)业务时,才进行以下程序检查
*IF T180-TRTYP = 'V' AND VBAK-AUDAT LE '20090608' AND SY-UNAME NE '1091159' AND VBAK-ERNAM EQ '1091159'.
* MESSAGE E398(00) WITH '6.1-6.8导入单据分公司不能修改!'.
*ENDIF.
ENDFORM. "USEREXIT_SAVE_DOCUMENT_PREPARE
*eject
来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/7810493/viewspace-621593/ ,如需转载,请注明出处,否则将追究法律责任。