Crear Rangos de Números SNUM o SNRO


Escenario: se busca crear un rango de números para usarlo como identificador único en una tabla Z, para numerar un log de registros procesados.

Pasos:
1. Ir a la SNUM o SNRO, para crear un nuevo rango de números. Ejemplo Z_NUMERA.

2. En las opciones, lo importante es definir el dominio para indicar que longitud tendrá el numerador, ver si depende del ejercicio contable y en Ctd.númers.en mem.interm.

3. Agregar ahora un intervalo de números (el 01). Como es un único numerador, va del 1 al 9999999999 empezando del cero. Ustedes pueden usar varios intervalos y luego trabajar con eso desde el código.



4. Ahora que ya está creado el numerador, podemos utilizarlo para obtener el próximo número a usar, para ello va el código.

Nota: Miren que los rangos se pasan mediante orden de transporte y los intervalos mediante la opción que está en el menú Intervalos-transportar (está en la pantalla previa a modificar intervalos), según tengo entendido.

* Implemantar en programa Principal
"Declarar variables
DATA: wobjeto      type tnro-object    value 'Z_NUMERA',
      wnorange     type inri-nrrangenr value '01',        "number range,
      wsubobj      type inri-subobject value space,       "sub object
      w_doc_number type char10.

"Llamar método pasándole el rango, el número de rango y la variable wsubobj
"devolverá el nuevo número en la variable w_doc_number
perform obtener_prox_num using wobjeto wnorange wsubobj
                      changing w_doc_number.

*Definición del método
FORM obtener_prox_num USING p_object     TYPE tnro-object
                                                       p_wnorange   TYPE inri-nrrangenr
                                                       p_wsubobj    TYPE inri-subobject
                                 CHANGING p_doc_number TYPE char10.

  CALL FUNCTION 'NUMBER_RANGE_ENQUEUE'
    EXPORTING
      object = p_object " Crear con la SNUM
    EXCEPTIONS
      foreign_lock = 1
      object_not_found = 2
      system_failure = 3
      OTHERS = 4.

  IF sy-subrc NE 0.
*   message e086 with 'Lock error' sy-subrc.
  ENDIF.

  CALL FUNCTION 'NUMBER_GET_NEXT'
    EXPORTING
      nr_range_nr = p_wnorange
      object      = p_object
      subobject   = p_wsubobj
  IMPORTING
      number      = p_doc_number " Número generado por SAP
    EXCEPTIONS
      interval_not_found = 1
      number_range_not_intern = 2
      object_not_found = 3
      quantity_is_0 = 4
      quantity_is_not_1 = 5
      internal_overflow = 6
      OTHERS = 7.

  IF sy-subrc NE 0.
*   message e086 with 'NumberRange' sy-subrc.
  ENDIF.

  CALL FUNCTION 'NUMBER_RANGE_DEQUEUE'
    EXPORTING
      object = p_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.

Nota: Este post no es original de este blog.
No hay que reinventar la rueda. Los chicos de abapers lo hacen bastante bien.

Comentarios