1. 程式人生 > >【MM採購定價】怎麼樣實現建立採購訂單的時候,採購價格不可以更改?

【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裡的價格;