ITPub博客

首页 > 数字化转型 > ERP > SAP Bar Code 开发(03) – 后台作业任务实现条码编号归零

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

ERP 作者:dicksonjyl560101 时间:2015-11-22 19:08:18 0 删除 编辑
 

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

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

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

只是通常流水号都需要通过日期来生成,后面带出从数字1开始的流水,而对于SAP的number 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)

日期/时间(Date、Time) – 可以定义执行任务的日期、时间

作业之后(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

来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/29829936/viewspace-1843813/ ,如需转载,请注明出处,否则将追究法律责任。

请登录后发表评论 登录
全部评论
行万里路,读万卷书,阅无数人。 吃货一枚,爱吃湘菜,粤菜与杭帮菜,尝遍天下美食。 摄影爱好者,游遍名川大山,江河胡海,赏遍人间春色。 爱看电影,尤其是国产大片,好莱坞大片。英文名:Dickson Jin, 网名:风一样的BOY。精通SAP供应链咨询。2017年开始研习人工智能。

注册时间:2014-08-27

  • 博文量
    2598
  • 访问量
    4671595