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

Entradas populares de este blog

Direcciones en SAP

Determinación de puestos de expedición en SD