SAP Bar Code 開發(03) – 後臺作業任務實現條碼編號歸零

dicksonjyl560101發表於2015-11-22
 

SAP Bar Code 開發(03) – 後臺作業任務實現條碼編號歸零

開發中,條碼標籤內容都可以透過客戶自定義編制;

通常情況下,流水號的編碼都可以透過的編碼範圍()生成;

只是通常流水號都需要透過日期來生成,後面帶出從數字1開始的流水,而對於number range來說,只能不斷累加,不能倒退;

因此,要實現每天歸零操作,可以透過錄制 BDC 實現歸零操作,再將實現 BDC 的程式扔向後臺任務,固定每天 00:00 執行任務。

 

1.編碼範圍()

編碼範圍的定義,透過事務碼 SNRO可以直接定義,這裡不細說;

生成編碼範圍的程式如下:

01

02

03

04

05

06

07

08

09

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

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

*&      Form  frm_get_ref_nr

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

*       獲取 Number Range

*----------------------------------------------------------------------*

*      -->pv_object      text

*      -->pv_number      text

*      -->pv_out_nr      text

*----------------------------------------------------------------------*

FORM frm_get_ref_nr USING pv_object pv_number pv_out_nr.

  

DATA: lv_object       TYPE  tnro-object,

      Lv_nr_range_nr  TYPE  inri-nrrangenr.

  

  lv_object      = pv_object.   " 物件

  lv_nr_range_nr = pv_number.   "

  

  "鎖定 Number Range 物件

  CALL FUNCTION 'NUMBER_RANGE_ENQUEUE'

    EXPORTING

      object           = lv_object

    EXCEPTIONS

      foreign_lock     = 1

      object_not_found = 2

      system_failure   = 3

      OTHERS           = 4.

  

  " 產生Number Range

  CALL FUNCTION 'NUMBER_GET_NEXT'

    EXPORTING

      nr_range_nr             = lv_nr_range_nr

      object                  = lv_object

    IMPORTING

      number                  = pv_out_nr

    EXCEPTIONS

      interval_not_found      = 1

      number_range_not_intern = 2

      object_not_found        = 3

      quantity_is_0           = 4

      quantity_is_not_1       = 5

      interval_overflow       = 6

      buffer_overflow         = 7

      OTHERS                  = 8.

  

  " 解鎖 Number Range 物件

  CALL FUNCTION 'NUMBER_RANGE_DEQUEUE'

    EXPORTING

      object = lv_object.

  

  IF sy-subrc <> 0.

* MESSAGE ID SY-MSGID TYPE SY-MSGTY NUMBER SY-MSGNO

*         WITH SY-MSGV1 SY-MSGV2 SY-MSGV3 SY-MSGV4.

  ENDIF.

  

ENDFORM.                    "FRM_GET_NR

 

2.錄製BDC

事務碼 SHDB 錄製將相應編碼範圍狀態值清零:

 

錄製後的BDC程式ZBC_NUMBER_RANGE_ZEROING

01

02

03

04

05

06

07

08

09

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

REPORT  zbc_number_range_zeroing.

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

*                  I N C L U D E                                       *

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

INCLUDE zbdcrecx1.

  

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

*                  S E L E C T I O N  S C R E E N                      *

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

SELECTION-SCREEN BEGIN OF BLOCK block1.

  

PARAMETERS: cb_auto TYPE c AS CHECKBOX.

  

SELECTION-SCREEN END OF BLOCK block1.

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

*                  I N I T I A L I Z A T I O N                         *

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

INITIALIZATION.

  

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

*                  T O P  O F  P A G E                                 *

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

  

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

*                  S T A R T  O F  S E L E C T I O N                   *

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

START-OF-SELECTION.

  

* 條碼歸零

  PERFORM frm_data_process using 'ZBC_CODE'.

  

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

*&      Form  frm_data_process

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

*       Data Process

*----------------------------------------------------------------------*

FORM frm_data_process USING pv_object.

  

  PERFORM bdc_dynpro      USING 'SAPMSNRO' '0150'.

  PERFORM bdc_field       USING 'BDC_CURSOR'

                                'NRIV-OBJECT'.

  PERFORM bdc_field       USING 'BDC_OKCODE'

                                '=IUPD'.

  PERFORM bdc_field       USING 'NRIV-OBJECT'

                                pv_object.    "'ZBC_CODE'. "物件名稱

  PERFORM bdc_dynpro      USING 'SAPMSNUM' '0100'.

  PERFORM bdc_field       USING 'BDC_OKCODE'

                                '=LUPD'.

  PERFORM bdc_dynpro      USING 'SAPLSNR0' '0503'.

  PERFORM bdc_field       USING 'BDC_CURSOR'

                                'INRDP-NRLEVEL(01)'.

  PERFORM bdc_field       USING 'BDC_OKCODE'

                                '=SAVE'.

  PERFORM bdc_field       USING 'INRDP-NRLEVEL(01)'

                                '0'.

  PERFORM bdc_dynpro      USING 'SAPMSSY0' '0120'.

  PERFORM bdc_field       USING 'BDC_OKCODE'

                                '=DBAC'.

  PERFORM bdc_dynpro      USING 'SAPLSNR0' '0503'.

  PERFORM bdc_field       USING 'BDC_CURSOR'

                                'INRDP-FROMNUMBER(01)'.

  PERFORM bdc_field       USING 'BDC_OKCODE'

                                '=ENDA'.

  PERFORM bdc_dynpro      USING 'SAPMSNRO' '0150'.

  PERFORM bdc_field       USING 'BDC_CURSOR'

                                'NRIV-OBJECT'.

  PERFORM bdc_field       USING 'BDC_OKCODE'

                                '=ENDA'.

  PERFORM bdc_field       USING 'NRIV-OBJECT'

                                pv_object. "'ZBC_CODE'. "物件名稱

  PERFORM bdc_transaction USING 'SNRO' 'N'.

*  ENDIF.

  

ENDFORM.                    "frm_data_process

其中,Include檔案自定義了 BDC 用到的相關 Subroutine

01

02

03

04

05

06

07

08

09

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

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

*&  Include                ZBDCRECX1

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

  

*----------------------------------------------------------------------*

*   data definition

*----------------------------------------------------------------------*

*       Batchinputdata of single transaction

DATA:   bdcdata LIKE bdcdata    OCCURS 0 WITH HEADER LINE.

*       messages of call transaction

DATA:   messtab LIKE bdcmsgcoll OCCURS 0 WITH HEADER LINE.

*       error session opened (' ' or 'X')

DATA:   e_group_opened.

*       message texts

TABLES: t100.

  

*----------------------------------------------------------------------*

*        Start new transaction according to parameters                 *

*----------------------------------------------------------------------*

FORM bdc_transaction USING tcode ctumode.

  DATA: l_mstring(480).

  DATA: l_subrc LIKE sy-subrc.

  

  REFRESH messtab.

  CALL TRANSACTION tcode USING bdcdata

                   MODE   ctumode  " 跟蹤顯示 N不顯示 E僅顯示錯誤

                   UPDATE 'A'      " A非同步    B同步   L本地更新

                   MESSAGES INTO messtab.

  l_subrc = sy-subrc.

  WRITE: / 'CALL_TRANSACTION',

           tcode,

           'returncode:'(i05),

           l_subrc,

           'RECORD:',

           sy-index.

  LOOP AT messtab.

    SELECT SINGLE * FROM t100 WHERE sprsl = messtab-msgspra

                              AND   arbgb = messtab-msgid

                              AND   msgnr = messtab-msgnr.

    IF sy-subrc = 0.

      l_mstring = t100-text.

      IF l_mstring CS '&1'.

        REPLACE '&1' WITH messtab-msgv1 INTO l_mstring.

        REPLACE '&2' WITH messtab-msgv2 INTO l_mstring.

        REPLACE '&3' WITH messtab-msgv3 INTO l_mstring.

        REPLACE '&4' WITH messtab-msgv4 INTO l_mstring.

      ELSE.

        REPLACE '&' WITH messtab-msgv1 INTO l_mstring.

        REPLACE '&' WITH messtab-msgv2 INTO l_mstring.

        REPLACE '&' WITH messtab-msgv3 INTO l_mstring.

        REPLACE '&' WITH messtab-msgv4 INTO l_mstring.

      ENDIF.

      CONDENSE l_mstring.

      WRITE: / messtab-msgtyp, l_mstring(250).

    ELSE.

      WRITE: / messtab.

    ENDIF.

  ENDLOOP.

  REFRESH bdcdata.

ENDFORM.                    "BDC_TRANSACTION

  

*----------------------------------------------------------------------*

*        Start new screen                                              *

*----------------------------------------------------------------------*

FORM bdc_dynpro USING program dynpro.

  CLEAR bdcdata.

  bdcdata-program  = program.

  bdcdata-dynpro   = dynpro.

  bdcdata-dynbegin = 'X'.

  APPEND bdcdata.

ENDFORM.                    "BDC_DYNPRO

  

*----------------------------------------------------------------------*

*        Insert field                                                  *

*----------------------------------------------------------------------*

FORM bdc_field USING fnam fval.

  CLEAR bdcdata.

  bdcdata-fnam = fnam.

  bdcdata-fval = fval.

  APPEND bdcdata.

ENDFORM.                    "BDC_FIELD

 

3. 後臺作業任務

後臺作業任務,透過事務碼SM36定義,SM37管理。

 

1) 任務啟動條件

包括以下幾項:

立即執行(Immediate)

日期/時間(DateTime) – 可以定義執行任務的日期、時間

作業之後(After ) – 某個作業任務執行之後執行

事件之後(After event) SAP事件處理之後執行

 

這裡需要每天都執行,因此,選擇Date/Time,輸入日期和時間;

然後在期間值(Period Values)內選擇每天執行:

 

2) 作業步驟

作業步驟可以透過三種方式執行:

透過程式執行;

透過外部作業系統命令執行,透過SM69定義好命令後,輸入命令名稱;

透過外部程式執行;

 

通常情況下,都是透過程式執行作業,在 Program中輸入相應的程式名稱:

 

3) 作業選擇

其中,在SM37中,包括以下幾個管理狀態:

已計劃(Sched: 後臺作業的步驟(Step)已經定義,但是作業的開始條件(Start condition)沒有定義。

已釋放(Released: 後臺作業的步驟(Step)和開始條件(Start condition)都已經定義好了,並且相關的作業也經過有相關作業許可權的人Release

已取消(Canceled: 作業非正常結束,包括兩種情況:

1)、管理員透過SM37去主動Cancel相關作業;

2)、後臺作業對應的程式有錯誤。

就緒(Ready: 一個Released 的開始條件(Start condition)已經滿足,但是需要等待後臺作業機制給這個作業分配工作程式。

啟用的(Active: 執行中的作業。執行中的作業不能被修改或者刪除。

已完成(Finished: 後臺作業中預設的每個步驟(Step)都全部成功完成。

 

儲存成功後,點選執行,即可。

 

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/29829936/viewspace-1843813/,如需轉載,請註明出處,否則將追究法律責任。

相關文章