【MM采购定价】怎么样实现创建采购订单的时候,采购价格不可以更改?

由于某些业务要求,要求在创建采购订单的时候采购价格不能手工输入,实现方法有:

第一个方法:

缺点:这个方法一刀切,会把所有类型的采购订单设置为采购价格不能修改。

1.使用field selection把价格字段设置为显示(路径:IMG-->物料管理-->采购-->采购订单-->定义凭证层的屏幕格式 价格/数量屏幕)

2.将条件类型中的 人工输入项设置为 D。

第二个方法:

增强,增强代码如下:(虽然现在自己看不懂,还是先收藏了吧)

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

65

66

67

68

69

70

71

72

73

74

75

76

77

78

79

80

81

82

83

84

85

86

87

88

89

90

91

92

93

94

95

96

97

98

99

100

101

102

103

104

105

106

107

108

109

110

111

112

113

114

115

116

117

118

119

120

121

122

123

124

125

126

127

128

129

130

131

132

133

134

135

136

137

138

139

140

141

142

143

144

145

146

147

148

149

150

151

152

153

154

155

156

157

158

159

160

161

162

163

164

165

166

167

168

169

170

171

172

173

174

175

176

177

178

179

180

181

182

183

184

185

186

187

188

189

190

191

192

193

194

195

196

197

198

199

200

201

202

203

204

205

206

207

208

209

210

211

212

213

214

215

216

217

218

219

220

221

222

223

224

225

226

227

228

229

230

231

232

233

234

235

236

237

238

239

240

241

242

243

244

245

246

247

248

249

250

251

252

253

254

255

256

257

ZXM06U4*SMOD ----->Enhancement name :MM06E005---->EXIT_SAPMM06E_017

*&---------------------------------------------------------------------*

*&  包括                ZXM06U42

*&---------------------------------------------------------------------*

 

************************************************************************************************************************

**控制NB采购订单必须有采购信息记录

**对“NB”标准PO创建进行检查控制:1000

**      1>采购物料必须具有采购信息记录;

**      2>不允许手工直接修改采购价格;

*************************************************************************************************************************

 

*******  变量定义  Start************

DATA:BEGIN OF it_a017 OCCURS 0,

       lifnr LIKE a017-lifnr,

       matnr LIKE a017-matnr,

       ekorg LIKE a017-ekorg,

       werks LIKE a017-werks,

       esokz LIKE a017-esokz,

       knumh LIKE a017-knumh, " (条件号码)头

       datbi LIKE a017-datbi,

       datab LIKE a017-datbi,  " (生效\失效日期)

       END OF it_a017.

 

 

DATA:l_kbetr   LIKE konp-kbetr,       "信息记录净价

     l_mxwrt   LIKE konp-mxwrt,       "信息记录下限值

     l_gkwrt   LIKE konp-gkwrt,       "信息记录上限值

     min_kbetr LIKE konp-kbetr,

     max_kbetr LIKE konp-kbetr,

     l_netpr   LIKE i_ekpo-netpr,

     l_preis   LIKE eban-preis,

     l_infnr   LIKE eina-infnr,

     l_kbetr1  LIKE konp-kbetr.

 

DATA:it_eine TYPE STANDARD TABLE OF eine,

     it_eina TYPE STANDARD TABLE OF eina,

     it_konm TYPE TABLE OF konm WITH HEADER LINE.

*******  变量定义  End************

 

 

CHECK sy-tcode = 'ME21N' OR sy-tcode = 'ME22N' OR sy-tcode = 'ME23N'.   "因为用ME21N或ME23N进去更改,而事务代码不会变成ME22N.

 

*判断采购信息记录是否一般完整数据”删除“标识

SELECT SINGLE infnr INTO l_infnr

 FROM  eina

 WHERE    lifnr = i_ekko-lifnr

    AND   matnr = i_ekpo-ematn

    AND   loekz = ''.

 

*判断采购信息记录是否采购组织数据”删除“标识

SELECT *

 INTO CORRESPONDING FIELDS OF TABLE it_eine

 FROM eine

 WHERE    ekorg = i_ekko-ekorg

    AND   werks = i_ekpo-werks

    AND   esokz = i_ekpo-pstyp

    AND   loekz = ''

    AND   infnr = l_infnr.

 

*取采购信息相关有效期间净价价格条件数据

CLEAR: it_a017,it_a017[].

SELECT  lifnr

        matnr

        ekorg

        werks

        esokz

        knumh

        datbi

        datab

  INTO TABLE it_a017

  FROM a017

  WHERE kappl = 'M'   " (采购标记)

  AND   kschl = 'PB00'" (标准采购订单)

  AND   lifnr = i_ekko-lifnr

*  AND   MATNR = I_EKPO-MATNR

  AND   matnr = i_ekpo-ematn

  AND   ekorg = i_ekko-ekorg

  AND   werks = i_ekpo-werks

  AND   esokz = i_ekpo-pstyp.

 

SORT it_a017 BY lifnr.

 

LOOP AT it_a017 .

  IF i_ekko-bedat NOT BETWEEN it_a017-datab AND it_a017-datbi.

    DELETE it_a017  .

  ELSE.

    SELECT SINGLE kbetr mxwrt gkwrt

      INTO (l_kbetr,l_mxwrt,l_gkwrt)

      FROM konp

      WHERE knumh = it_a017-knumh AND loevm_ko <> 'X'." (删除码标示);

 

**********************************************************************

*&1、对于存在阶梯价格的采购信息记录,根据数量阶梯在表KONM中存在不同价格;

*&2、获取采购订单数量大于阶梯价格表中的价格数据,并根据倒序排序获取价格;

**********************************************************************

    SELECT *

      INTO TABLE it_konm

      FROM konm

      WHERE knumh = it_a017-knumh

      AND kstbm <= i_ekpo-menge.

 

    SORT it_konm BY kstbm DESCENDING.

 

    READ TABLE it_konm INDEX 1.

  ENDIF.

ENDLOOP.

 

FREE: it_a017.

 

l_netpr = i_ekpo-netpr.                            "采购订单净价

 

READ TABLE tekpo WITH KEY ebeln = i_ekpo-ebeln ebelp = i_ekpo-ebelp.

IF sy-subrc = 0.

  IF i_ekko-bstyp = 'F' AND i_ekko-bsart = 'NB' AND i_ekpo-retpo = '' AND i_ekpo-repos = 'X' AND

     i_ekpo-knttp <> 'F' AND i_ekpo-knttp <> 'A' AND i_ekpo-knttp <> 'K'  AND i_ekpo-loekz = '' AND i_ekko-unsez = ''.

 

    IF i_ekpo-werks = '1000' AND i_ekpo-satnr = ''. "排除可配置物料不需要检查

 

*      IF L_KBETR = 0 OR L_NETPR = 0.

      IF it_konm IS NOT INITIAL AND it_konm-kbetr <> l_netpr.

        MESSAGE '物料采购订单价格不与信息记录阶梯有效价格一致!(ZXM06U42)' TYPE 'E'.

      ENDIF.

 

      IF it_konm IS INITIAL AND l_kbetr <> l_netpr.

        MESSAGE '物料必须要有有效日期采购价格,不允许手工维护价格!(ZXM06U42)' TYPE 'E'.

      ENDIF.

 

      IF l_infnr = '' OR it_eine IS INITIAL. "采购信息记录删除标识

        MESSAGE '物料采购信息记录标志"删除",不允许手工维护价格!(ZXM06U42)' TYPE 'E'.

      ENDIF.

    ENDIF.

 

  ENDIF.

ENDIF.

 

******************************

DATA:l_bstrf TYPE marc-bstrf.

 

SELECT SINGLE bstrf

  INTO l_bstrf

  FROM marc

  WHERE matnr = i_ekpo-matnr

  AND   werks = i_ekpo-werks.

 

*    IF l_bstrf <> 0.

*      MESSAGE E001(00) WITH '物料' i_ekpo-matnr '设置了最小包装数量' l_bstrf DISPLAY LIKE 'I'.

*    ENDIF.

 

 

*************************************************************************************************************************

*&采购订单下达数量不能超过采购申请未清数量;

*&采购订单必须参考采购申请下达;

*************************************************************************************************************************

 

IF i_ekko-bstyp = 'F' AND i_ekko-bsart = 'NB' AND i_ekpo-retpo = '' AND i_ekpo-repos = 'X' AND i_ekpo-knttp <> 'F'

   AND i_ekpo-knttp <> 'A' AND i_ekpo-knttp <> 'K' AND i_ekpo-werks = '1000'  AND i_ekpo-loekz = '' AND i_ekko-unsez = ''.

 

  DATA:it_eban TYPE STANDARD TABLE OF eban,

       wa_eban LIKE LINE OF it_eban,

       it_ekpo TYPE STANDARD TABLE OF ekpo,

       wa_ekpo LIKE LINE OF it_ekpo.

 

  DATA:l_tabix TYPE sy-tabix.

 

 

  LOOP AT tekpo WHERE loekz IS INITIAL

                   AND banfn IS INITIAL.

    MESSAGE '采购订单必须参考采购申请下达!(ZXM06U42)' TYPE 'E'.

  ENDLOOP.

 

 

*   采购申请数量

  SELECT *

    INTO CORRESPONDING FIELDS OF TABLE it_eban

    FROM eban

    WHERE banfn = i_ekpo-banfn

    AND   bnfpo = i_ekpo-bnfpo

    .

*    采购订单已使用数量

  SELECT *

    INTO CORRESPONDING FIELDS OF TABLE it_ekpo

    FROM ekpo

    WHERE banfn = i_ekpo-banfn

    AND   bnfpo = i_ekpo-bnfpo

    AND   loekz = space

    .

 

  "排除本次修改的pr转po的数量

  DELETE it_ekpo WHERE ebeln = i_ekpo-ebeln.

 

*    计算采购申请剩余数量

  IF it_ekpo IS NOT INITIAL.

    LOOP AT it_eban INTO wa_eban.

      l_tabix = sy-tabix.

      LOOP AT it_ekpo INTO wa_ekpo WHERE banfn = wa_eban-banfn

                                    AND bnfpo = wa_eban-bnfpo.

 

 

***********************************************************

*    由于采购订单的单位和采购申请的单位存在不一致的情况,故而要增加单位的转换

*    采购订单数量 = 采购订单数据 * 分子 / 分母

*        wa_eban-menge = wa_eban-menge - wa_ekpo-menge.

        IF wa_ekpo-umren EQ 0.

          wa_eban-menge = wa_eban-menge - wa_ekpo-menge.

        ELSE.

          wa_eban-menge = wa_eban-menge - wa_ekpo-menge * wa_ekpo-umrez / wa_ekpo-umren.

        ENDIF.

***********************************************************

 

      ENDLOOP.

 

      MODIFY it_eban FROM wa_eban INDEX l_tabix.

 

    ENDLOOP.

  ENDIF.

 

 

 

*   判断创建PO时,数量是否超过

  DATA:l_menge TYPE i,  "采购订单数量

       l_xd    TYPE i.  "下达数量

 

 

 

  LOOP AT it_eban INTO wa_eban WHERE banfn = i_ekpo-banfn

                                 AND   bnfpo = i_ekpo-bnfpo.

    l_menge = wa_eban-menge.

***********************************************************

*    BEGIN:

*    由于采购订单的单位和采购申请的单位存在不一致的情况,故而要增加单位的转换

*    采购订单数量 = 采购订单数据 * 分子 / 分母

*    WA_EBAN-MENGE = WA_EBAN-MENGE - I_EKPO-MENGE.

    IF i_ekpo-umren EQ 0.

      wa_eban-menge = wa_eban-menge - i_ekpo-menge.

    ELSE.

      wa_eban-menge = wa_eban-menge - i_ekpo-menge * i_ekpo-umrez / i_ekpo-umren.

    ENDIF.

*   END

***********************************************************

    l_xd = i_ekpo-menge.

    LOOP AT tekpo WHERE banfn = wa_eban-banfn

                    AND bnfpo = wa_eban-bnfpo

                    AND ebelp <> i_ekpo-ebelp       "排除返回再次修改行项目数据(已存入内表数据),避免重复累计

                    AND loekz = space.

      wa_eban-menge = wa_eban-menge - tekpo-menge.

      l_xd = l_xd + tekpo-menge.

    ENDLOOP.

 

    IF wa_eban-menge < 0 AND i_ekpo-loekz = ''.

      MESSAGE e001(00) WITH 'PO下达数量' l_xd  ',超过PR剩余可下达数量:' l_menge.

    ENDIF.

 

  ENDLOOP.

ENDIF.

 第三种方法:使用采购员参数控制一些字段  EVO EFB

  1.维护采购员参数

    事务码:OMFI (路径:IMG-->物料管理-->采购-->环境数据-->定义采购员的缺省值)

2.分配给采购员

  事务码:SU01 SU3 

      当存在采购信息记录,但采购信息记录中不存在有效的价格时,系统则可以复制才采购信息记录中的上一张采购订单中的采购价格到当前采购订单,系统复制时,不仅复制上一张采购订单的采购单价(一版为条件类型PBXX),如果有其他条件类型(如运费),系统也会复制上一张采购订单的运费到当前采购订单。

  系统复制采购价格的优先级为:

  1.存在有效价格的采购信息记录(创建PO的时候设置信息记录不更新);

  2.不存在有效价格的PIR,会复制这个PIR里的上一张PO里的价格(包括PBXX或者运费之类的,设置信息记录更新);

  3.存在有有效价格的PIR,设置信息记录更新,再次创建相同供应商相同物料的PO时,因为存在有效价格的信息记录,系统不会复制上一张PO里的价格,会建议PIR里的价格;

  • 1
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值