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