SAP Bar Code 开发(03) – 后台作业任务实现条码编号归零

 

SAP Bar Code 开发(03) – 后台作业任务实现条码编号归零

Barcode开发中,条码标签内容都可以通过客户自定义编制;

通常情况下,流水号的编码都可以通过SAP的编码范围(Number Range)生成;

只是通常流水号都需要通过日期来生成,后面带出从数字1开始的流水,而对于SAPnumber range来说,只能不断累加,不能倒退;

因此,要实现每天归零操作,可以通过录制 BDC 实现归零操作,再将实现 BDC 的程序扔向后台任务,固定每天 00:00 执行任务。

 

1.编码范围(Number Range)

编码范围的定义,通过事务码 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 Job) – 某个作业任务执行之后执行

事件之后(After event) SAP事件处理之后执行

 

这里需要每天都执行,因此,选择Date/Time,输入日期和时间;

然后在期间值(Period Values)内选择每天执行:

 

2) 作业步骤

作业步骤可以通过三种方式执行:

通过ABAP程序执行;

通过外部操作系统命令执行,通过SM69定义好命令后,输入命令名称;

通过外部程序执行;

 

通常情况下,都是通过程序执行作业,在ABAP Program中输入相应的程序名称:

 

3) 作业选择

其中,在SM37中,包括以下几个管理状态:

已计划(Sched: 后台作业的步骤(Step)已经定义,但是作业的开始条件(Start condition)没有定义。

已释放(Released: 后台作业的步骤(Step)和开始条件(Start condition)都已经定义好了,并且相关的作业也经过有相关作业权限的人Release

已取消(Canceled: 作业非正常结束,包括两种情况:

1)、管理员通过SM37去主动Cancel相关作业;

2)、后台作业对应的程序有错误。

就绪(Ready: 一个Released Job的开始条件(Start condition)已经满足,但是需要等待后台作业机制给这个作业分配工作进程。

激活的(Active: 运行中的作业。运行中的作业不能被修改或者删除。

已完成(Finished: 后台作业中预设的每个步骤(Step)都全部成功完成。

 

保存成功后,点击执行,即可。

 

http://www.sapjx.com/zeroing_scheduled_job.html

请使用浏览器的分享功能分享到微信等