Additional Blogs by Members
cancel
Showing results for 
Search instead for 
Did you mean: 
fmunozb
Active Participant

Rangos de números en ABAP

Introducción

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.

Gestión

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.

Creación

  1. Ingresamos a la transacción SNUM o SNRO e ingresamos el nombre que le vamos a dar al rango de números.
  2. Después de dar clic en el botón crear diligenciamos el formulario según corresponda. En el campo Dominio longitud número colocar el dominio que corresponda al mismo tipo que colocamos en nuestro elemento de datos de la columna NUM_NOTA.Para el campo Porcentaje advertencia se coloca un número que indica que el sistema comienza a generar alertas cuando el número que se genera ya forma parte del porcentaje que resta para abarcar el rango de números, por ejemplo si el dominio es de 3 números, en este caso el número máximo es de 999, si el porcentaje que colocamos es 10%, entonces cuando el rango de números llegue a 900 se van a comenzar a generar advertencias indicando que quedan pocos números o se llegó al porcentaje límite. En cuanto al campo Ctd.núms.en mem.iterm. Indica cuantos números del rango de números se almacenan en memoria intermedia, cabe aclarar que en nuestro ejemplo con un valor de 10 indica que en memoria hasta 10 números pueden ser almacenados en la memoria intermedia, lo cual hace que si la transacción no termina completamente ese número se pierde, es decir, no se almacena en la tabla, pero como se hizo uso de él no lo podemos usar nuevamente por intermedio del programa; cuando llamemos el rango de números este continuará con el siguiente, así en la tabla no lo almacenemos; si lo ponemos en 0 esto garantiza que no se pierda ni un solo número. El formulario diligenciado para el ejemplo quedaría de la siguiente forma:
  3. Damos clic en el botón Grabar  (Ctrl+S) y después de guardar nuestro rango de números procedemos a la creación de los intervalos. Para hacer esto desde la pantalla donde nos encontramos damos clic en el botón Rangos números (F7).
  4. Luego damos clic en el botón de modificación Intervalos lo cual nos lleva a la siguiente pantalla donde podemos crear diferentes rangos que se encuentren en el dominio que colocamos al crearlo.
  5. En la anterior pantalla damos clic en el botón Intervalo y colocamos nuestro intervalo.
  6. Damos clic en el botón Save y con esto hemos creado nuestro intervalo.
  7. Con esto ya terminamos de crear nuestro rango de números. Ahora podemos hacer uso de él dentro de nuestro programa ABAP.

Modificación y borrado

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.

Modo de empleo en programación ABAP

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:

  1. NUMBER_RANGE_ENQUEUE: Este módulo de función coloca un bloqueo del rango de números, lo usamos cuando queremos bloquearlo para hacer modificaciones sobre él, en cuanto a gestión de intervalos y grupos relacionados con el rango de números, esto se hace para evitar que otras rutinas intenten modificar el rango de números al mismo tiempo.
  2. NUMBER_RANGE_INTERVAL_UPDATE: Está función hace modificaciones en los intervalos de un rango de números, ya sea  crear uno nuevo o modificar uno existente, esta función coloca el rango de números tal como se indica en la tabla interna, es decir si el rango actualmente tiene 10 intervalos y la tabla interna que se llama tiene 8 al finalizar el rango de números quedaría con 2 intervalos menos, es una eliminación implícita. Siempre antes de usar esta función se debe llamar la función que efectúa el bloque.
  3. NUMBER_RANGE_GROUP_UPDATE: Esta función modifica los grupos del rango de números, al igual que la anterior debemos bloquear el rango de números a modificar antes de llamarla.
  4. NUMBER_RANGE_UPDATE_CLOSE: Las funciones NUMBER_RANGE_INTERVAL_UPDATE y NUMBER_RANGE_GROUP_UPDATE cuando se ejecutan y si todo es correcto se almacenan los cambios en la memoria intermedia, para que estos se vean reflejados en la base de datos debemos hacer uso de esta función, prácticamente lo que hace es ejecutar un COMMIT.
  5. NUMBER_RANGE_DEQUEUE: Después de modificar los rangos de números se debe eliminar el bloqueo para permitir que los rangos puedan modificarse posteriormente.
  6. NUMBER_GET_NEXT: Este módulo de función retorna el siguiente número libre de un rango de números, se indica el intervalo del rango de números que deseamos tomar, para nuestro ejemplo basta con usar esta función en nuestro programa.

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.

Transporte de rangos de números

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:

  1. Ingresamos a la transacción SNRO o SNUM damos el nombre del rango de números que queremos transportar.
  2. Damos clic en el botón Rangos números y en la pantalla que se muestra a continución en el menú pricipal seleccionamos Intervalo → Transportar.
  3. El sistema nos da la siguiente advertencia, por lo cual debemos estar seguros que si transportamos esto nos actualiza en la siguiente instancia los contadores en cero, dejando el rango de números original y quitando las modificaciones que se hubiesen hecho en el sistema destino, por lo tanto hay que tener cuidado al crear hacer estos transportes.
  4. Al continuar nos abre las ventanas para ingresar el rango de números en una orden de transporte de tipo customazing, al finalizar la orden generada queda de la siguiente forma.
1 Comment