BW:ZBRD01-03问题:SAP配置编号流 SNRO、SNUM

来源:互联网 发布:iphone备份在哪里mac 编辑:程序博客网 时间:2024/05/06 06:56

出错数据:

10003556、40013273、2010、06

ZXS0066、40013111

   

问题原因1:下付的项目,会在合同终止时出具发票

问题原因2:两个通知单抢了同一个通知单号,杯具。。。一点点的额debug加断点调试

   

另外,ZBRDK~DEFLG和ZBRDK-DEFLG

不一样,一个是内表,一个是数据库表,前者是数据库表与列名

   

解决办法:

   

SNUM配置编号流

   

调用方法:

 

    CALL FUNCTION 'NUMBER_GET_NEXT'

      EXPORTING

        NR_RANGE_NR = '01'

        OBJECT      = 'ZP9PS001'

      IMPORTING

        NUMBER      = DE_MAX.

   

   

  CALL FUNCTION 'NUMBER_RANGE_ENQUEUE'

      EXPORTING

        object           = 'ZPT'

      EXCEPTIONS

        foreign_lock     = 1

        object_not_found = 2

        system_failure   = 3

        OTHERS           = 4.

    IF sy-subrc EQ 0.

      CALL FUNCTION 'NUMBER_GET_NEXT'

        EXPORTING

          nr_range_nr   = '01'

          object        = 'ZPT'

          ignore_buffer = 'X'

        IMPORTING

          number        = w_zhk05-mblnr.

      CALL FUNCTION 'NUMBER_RANGE_DEQUEUE'

        EXPORTING

          object           = 'ZPT'

        EXCEPTIONS

          object_not_found = 1

          OTHERS           = 2.

    ENDIF.

摘自《老白的ABAP博客》

   

关于SAP的号码范围(number range)

   

1.Number Range的通用Tcode:SNRO

   

2.Number Range的通用读取函数:NUMBER_GET_NEXT

   

3.如有跳号现象,可以禁用对象的Buffer试试

   

4.几个关于Number Range的函数组:

SNR0  Online maint. of number ranges & groups

SNR1  Interface for number ranges and groups

SNR2  Maintenance of number range objects

SNR3  Number range checks, assignment & info.

SNR4  Number ranges utility

   

5.使用自定义的number range objects

1).Create number range object using OYSN (或者SNRO).

2).Then call the following function modules.

FORM. get_next_id CHANGING p_discrep.

 DATA: last_id LIKE zrecaudit-discrep,

        quant   LIKE inri-quantity,    "dummy

        code    LIKE inri-returncode. "returncode

 CALL FUNCTION 'NUMBER_RANGE_ENQUEUE'

       EXPORTING

            object           = 'ZRECAUDIT'

       EXCEPTIONS

            foreign_lock     = 1

            object_not_found = 2

            system_failure   = 3

            OTHERS           = 4.

 IF sy-subrc = 0.

    CALL FUNCTION 'NUMBER_GET_NEXT'

         EXPORTING

              nr_range_nr             = '01'

              object                  = 'ZRECAUDIT'

         IMPORTING

              number                  = last_id

              quantity                = quant

              returncode              = code

         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.

    CALL FUNCTION 'NUMBER_RANGE_DEQUEUE'

         EXPORTING

              object           = 'ZRECAUDIT'

         EXCEPTIONS

              object_not_found = 1

              OTHERS           = 2.

 ENDIF.

ENDFORM.                    " get_next_id

 

   

Pasted from <http://space.itpub.net/12287/viewspace-617809>

   

如有转载请注明出处:http://blog.csdn.net/donkey2004112103/archive/2009/04/13/4070996.aspx

   

1.sap numbe range在标准程序中使用

   

之前一直不明白会计凭证编号sap是怎么做到连续编号,还以为是简单的做个全局变量,虽然形式差不多,但是sap有专门的TCODE和方法,可以保证号码不重复且可以做到只在某一个区间。甚至每年都会重新编号,像会计凭证编号,当达到某一程度的时候还会提醒。

   

2.如何自己创建

   

TCODE:SNRO。可以自己创建。如图:

 

   

短文本和长文本用来说明这个编号范围对象,输入任意描述即可。

   

   

子对象数据元素我们这里不填。这里需要说明一下,所谓子对象,多数指一个组织结构,比如公司代码、销售组织、工厂等,这样编号就在对应的每个组织下面独立编号,最典型的例子是财务凭证,每个公司代码下的财务凭证都是独立编号的(其对应的数据表 BKPF,也必定把公司代码做为一个键字段)。而我们这个调度单对应于销售订单,销售订单没有按照组织级别分别编号,因此相应的调度单也就不需要了。

   

   

到期年标记是指编号按年度归零,每当开始一个新年度时,相应的编号也需要从头开始,比如财务凭证和物料凭证都是这样(比如表BKPF 和MKPF,都把年度做为一个键字段) ,而我们的调度单不需要对应年度,因此这里也不打勾。

   

编号长度域就填创建的域,但是一定要先激活。指定这个编号范围对象 ZDIAODUDAN 的长度,我们定义域长度为 10,因此这个编号范围对象生成的编号长度也是 10 位。

   

无翻滚间隔是指如果编号达到最大,是否自动从头开始,勾上就不从头开始,而在获取编号的时候提示出错。我们这里应该打勾。

   

   

编号范围处理,属于翻译问题,实际就是编号范围的事务码,如果指定这个事务码,就可以不需要通过 SNUM 或者 SNRO 的主屏幕然后输入编号范围对象的名字来维护这个编号范围,而可以输入事务码直接进入它的号码范围维护屏幕。

   

   

警告百分比是指如果编号使用到一定比例,就发出系统警告,提示管理人员增大范围或者进行历史数据归档,避免编号全部用完后影响正常业务,这里我们填写 95,就是95%的时候提示。

   

 

主内存缓冲是指系统为了提高性能而预先取出一些编号放在应用服务器上,当程序取用编号时直接从应用服务器获取,而无需再读取数据库了。通常,如果对号码的连续性要求不高的情况下可以使用这种方式,而如果是财务凭证等要求连续的编号,则应该把主内存缓冲关闭,方法是通过菜单"编辑-设置缓存-无缓存"。

   

接着就可以在如图:

 

   

间隔中添加编号范围。

   

3.程序中如何使用

   

程序中我们也可以使用number range。使用三个函数即可。下面做以说明。

   

CALL FUNCTION 'NUMBER_RANGE_ENQUEUE'

EXPORTING

object = 'ZSDDNR'

EXCEPTIONS

foreign_lock = 1

object_not_found = 2

system_failure = 3

OTHERS = 4.

* **如果号码范围存在

if sy-subrc eq 0 .

* ****得到一个号码,

CALL FUNCTION 'NUMBER_GET_NEXT'

EXPORTING

nr_range_nr = '01'

object = 'ZSDDNR'

IMPORTING

number = L_SEQNO

* quantity = quant

* returncode = code

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.

* ***将号码累加

CALL FUNCTION 'NUMBER_RANGE_DEQUEUE'

EXPORTING

object = 'ZSDDNR'

EXCEPTIONS

object_not_found = 1

OTHERS = 2.

else .

raise NUM_RANGE_ERROR .

endif .

   

很容易理解,首先判断是否有这个number range,如果存在的话,就获得下个序号,最后一个函数我估计意思是释放这个全局变量的内存。'ZSDDNR'就是我们创建的number range。如此就可以像会计凭证编号那样每次都可以自动生成流水号了!流水号可以在自建表中用作主键,它的产生就靠上面的函数。

   

   

本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/donkey2004112103/archive/2009/04/13/4070996.aspx

   

   

原创粉丝点击