Los rangos de números es una forma que tiene el sistema SAP para asignar un número consecutivo de manera automática (Autoincremental), se suele usar cuando se quiere que el número generado no se repita para otro usuario. Los rangos de números hacen referencia a objetos que pertenecen a una clase determinada, por ejemplo, cuentas de mayor, ordenes, solicitudes de pedido, documentos contables, materiales, entre otros.
En los programas ABAP se hace uso de los rangos de números para tomar un número consecutivo de manera automática para poder trabajar con él, su uso básicamente permite insertar registros únicos dentro de tablas, donde por lo general el número obtenido del rango de números se usa como llave única o compuesta de las tablas.
Los rangos de números se gestionan a través de la transacción SNUM o SNRO, a través de estas transacciones podemos crear, eliminar y modificar tanto los rangos como sus intervalos.
A continuación se va a mostrar como se hace la gestión de los rangos de números, para lo cual nos vamos a basar en el siguiente escenario, "se quiere crear una tabla z que permita almacenar un número único asociado a otro documento de SAP que permita identificar si el documento ha sido impreso y cuantas veces se ha realizado esta impresión", ya sea a manera de visualización o por que se genere orden de spool.
La tabla z a usar tiene la siguiente definición:
En la tabla observamos la columna NUM_NOTA la cual vamos a usar para insertar nuestro número del rango de números.
Para modificar los rangos de números se puede hacer usando las transacciones SNUM o SNRO, en el caso que queramos modificar los intervalos vamos directamente a ellos y hacemos las modificaciones que queramos sin problema, si por algún motivo queremos modificar el campo Dominio longitud número, debemos tener claro que para esto hay que eliminar primero todos los intervalos y grupos que tenga nuestro rango de números.
Para el borrado debemos eliminar primero los intervalos y grupos, cuando hacemos esto podemos ingresar por la SNUM o a la SNRO con el número de nuestro rango y damos clic en el botón Modificar, dentro de esta pantalla vamos al menú principal Objeto rango números → Borrar, si no eliminamos los intervalos y grupos la opción de borrado no estará disponible.
Para hacer uso de los rangos de números disponemos de módulos de función, los siguientes son los módulos de función mas utilizados para la gestión de rangos de números:
Después de tener claro las funciones que se usan, ahora vamos a utilizar en el programa la que interesa en nuestro caso, la cual es NUMBER_GET_NEXT, las otras funciones para el ejemplo expuesto no son de interés, pero si quisieramos que en nuestro programa se creara el intervalo de manera automática en caso de que no exista, para este caso debemos hacer uso de los otros módulos de función para crear el intervalo y con esto nuestro programa no presentaría errores al intentar llamar un rango de números para el que no existen intervalos, permitiendo crear los intervalos de manera dinámica, esta parte no la abarcaremos en nuestro ejemplo.
SELECT SINGLE *
INTO wa_ztfi_debcred
FROM ztfi_debcred
WHERE bukrs = wa_cabecera-bukrs
AND belnr = wa_cabecera-belnr
AND gjahr = wa_cabecera-gjahr.
IF sy-subrc = 0.
" El número existe
l_number = wa_ztfi_debcred-num_nota.
ELSE.
" Debe crear el número de la nota
CALL FUNCTION 'NUMBER_GET_NEXT'
EXPORTING
nr_range_nr = '01'
object = 'ZFI_NOTA'
* QUANTITY = '1'
* SUBOBJECT = ' '
* TOYEAR = '0000'
* IGNORE_BUFFER = ' '
IMPORTING
number = l_number
* QUANTITY =
* RETURNCODE =
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.
IF sy-subrc <> 0.
MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno
WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
ELSE.
wa_cabecera-num_nota = l_number.
wa_ztfi_debcred-bukrs = wa_cabecera-bukrs.
wa_ztfi_debcred-belnr = wa_cabecera-belnr.
wa_ztfi_debcred-gjahr = wa_cabecera-gjahr.
wa_ztfi_debcred-num_nota = wa_cabecera-num_nota.
INSERT INTO ztfi_debcred VALUES wa_ztfi_debcred.
IF sy-subrc <> 0.
CLEAR: l_number.
ENDIF.
ENDIF.
ENDIF.
En el programa se valida que se debe hacer la inserción del registro cuando la combinación de sociedad, número de documento y ejercicio no se encuentren en la tabla ZTFI_DEBCRED, si el dato no está entonces hacemos uso del módulo de función NUMBER_GET_NEXT para traer el siguiente número, con lo cual se asegura que el número va a ser único así muchos usuarios ingresen al mismo tiempo.
Debemos tener en cuenta que los rangos de números no nos obliga a generar orden de transporte, para poderlos transportar debemos hacer uso de una funcionalidad que se encuentra dentro de la transacción SNRO o SNUM, para hacerlo seguimos los siguientes pasos:
User | Count |
---|---|
1 | |
1 | |
1 | |
1 |