Sunteți pe pagina 1din 11

Rangos de nmeros en ABAP

Rangos de nmeros en ABAP


Introduccin
Gestin
Creacin
Modificacin y borrado
Modo de empleo en programacin ABAP
Transporte de rangos de nmeros

Introduccin
Los rangos de nmeros es una forma que tiene el sistema SAP para asignar un nmero consecutivo de
manera automtica (Autoincremental), se suele usar cuando se quiere que el nmero generado no se repita
para otro usuario. Los rangos de nmeros 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 nmeros para tomar un nmero consecutivo de manera
automtica para poder trabajar con l, su uso bsicamente permite insertar registros nicos dentro de tablas,
donde por lo general el nmero obtenido del rango de nmeros se usa como llave nica o compuesta de las
tablas.

Gestin
Los rangos de nmeros se gestionan a travs de la transaccin SNUM o SNRO, a travs de estas
transacciones podemos crear, eliminar y modificar tanto los rangos como sus intervalos.
A continuacin se va a mostrar como se hace la gestin de los rangos de nmeros, para lo cual nos vamos a
basar en el siguiente escenario, "se quiere crear una tabla z que permita almacenar un
nmero nico asociado a otro documento de SAP que permita identificar si el
documento ha sido impreso y cuantas veces se ha realizado esta impresin", ya sea a
manera de visualizacin o por que se genere orden de spool.
La tabla z a usar tiene la siguiente definicin:

En la tabla observamos la columna NUM_NOTA la cual vamos a usar para insertar nuestro nmero del rango
de nmeros.

Creacin
1.

2.

Ingresamos a la transaccin SNUM o SNRO e ingresamos el nombre que le vamos a dar al

rango de nmeros.
Despus de dar clic en el botn crear diligenciamos el formulario segn corresponda. En
el campo Dominio longitud nmero 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 nmero que indica que el sistema comienza a generar
alertas cuando el nmero que se genera ya forma parte del porcentaje que resta para abarcar el
rango de nmeros, por ejemplo si el dominio es de 3 nmeros, en este caso el nmero mximo
es de 999, si el porcentaje que colocamos es 10%, entonces cuando el rango de nmeros llegue
a 900 se van a comenzar a generar advertencias indicando que quedan pocos nmeros o se
lleg al porcentaje lmite. En cuanto al campo Ctd.nms.en mem.iterm. Indica cuantos nmeros
del rango de nmeros se almacenan en memoria intermedia, cabe aclarar que en nuestro
ejemplo con un valor de 10 indica que en memoria hasta 10 nmeros pueden ser almacenados
en la memoria intermedia, lo cual hace que si la transaccin no termina completamente ese
nmero 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 nmeros
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 nmero. El formulario diligenciado para el ejemplo quedara

3.

4.

de la siguiente forma:
Damos clic en el botn Grabar (Ctrl+S) y despus de guardar nuestro rango de nmeros
procedemos a la creacin de los intervalos. Para hacer esto desde la pantalla donde nos
encontramos damos clic en el botn Rangos nmeros (F7).

Luego damos clic en el botn de modificacin 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 botn Intervalo y colocamos nuestro intervalo.

6.

7.

Damos clic en el botn Save y con esto hemos creado nuestro intervalo.

Con esto ya terminamos de crear nuestro rango de nmeros. Ahora podemos hacer uso
de l dentro de nuestro programa ABAP.

Modificacin y borrado
Para modificar los rangos de nmeros 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 algn motivo queremos modificar el campo Dominio longitud nmero, debemos
tener claro que para esto hay que eliminar primero todos los intervalos y grupos que tenga nuestro rango de
nmeros.
Para el borrado debemos eliminar primero los intervalos y grupos, cuando hacemos esto podemos ingresar
por la SNUM o a la SNRO con el nmero de nuestro rango y damos clic en el botn Modificar, dentro de esta
pantalla vamos al men principal Objeto rango nmeros Borrar, si no eliminamos los intervalos y grupos la
opcin de borrado no estar disponible.

Modo de empleo en programacin ABAP

1.

2.

Para hacer uso de los rangos de nmeros disponemos de mdulos de funcin, los siguientes son los mdulos
de funcin mas utilizados para la gestin de rangos de nmeros:
NUMBER_RANGE_ENQUEUE: Este mdulo de funcin coloca un bloqueo del rango de
nmeros, lo usamos cuando queremos bloquearlo para hacer modificaciones sobre l, en cuanto
a gestin de intervalos y grupos relacionados con el rango de nmeros, esto se hace para evitar
que otras rutinas intenten modificar el rango de nmeros al mismo tiempo.
NUMBER_RANGE_INTERVAL_UPDATE: Est funcin hace modificaciones en los
intervalos de un rango de nmeros, ya sea crear uno nuevo o modificar uno existente, esta

3.

4.

5.
6.

funcin coloca el rango de nmeros 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
nmeros quedara con 2 intervalos menos, es una eliminacin implcita. Siempre antes de usar
esta funcin se debe llamar la funcin que efecta el bloque.
NUMBER_RANGE_GROUP_UPDATE: Esta funcin modifica los grupos del rango de
nmeros, al igual que la anterior debemos bloquear el rango de nmeros a modificar antes de
llamarla.
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 funcin, prcticamente lo que hace es ejecutar un COMMIT.
NUMBER_RANGE_DEQUEUE: Despus de modificar los rangos de nmeros se debe
eliminar el bloqueo para permitir que los rangos puedan modificarse posteriormente.
NUMBER_GET_NEXT: Este mdulo de funcin retorna el siguiente nmero libre de un
rango de nmeros, se indica el intervalo del rango de nmeros que deseamos tomar, para
nuestro ejemplo basta con usar esta funcin en nuestro programa.
Despus 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
inters, pero si quisieramos que en nuestro programa se creara el intervalo de manera automtica en caso de
que no exista, para este caso debemos hacer uso de los otros mdulos de funcin para crear el intervalo y
con esto nuestro programa no presentara errores al intentar llamar un rango de nmeros para el que no
existen intervalos, permitiendo crear los intervalos de manera dinmica, esta parte no la abarcaremos en
nuestro ejemplo.

1.

SELECT SINGLE *

2.

INTO wa_ztfi_debcred

3.

FROM ztfi_debcred

4.

WHERE bukrs = wa_cabecera-bukrs

5.

AND belnr = wa_cabecera-belnr

6.

AND gjahr = wa_cabecera-gjahr.

7.

IF sy-subrc = 0.

8.

" El nmero existe

9.

l_number = wa_ztfi_debcred-num_nota.

10. ELSE.
11. " Debe crear el nmero de la nota

12.

CALL FUNCTION 'NUMBER_GET_NEXT'

13. EXPORTING
14. nr_range_nr
15. object

= '01'
= 'ZFI_NOTA'

16. * QUANTITY

= '1'

17. * SUBOBJECT
18. * TOYEAR

=''
= '0000'

19. * IGNORE_BUFFER

=''

20. IMPORTING
21. number = l_number
22. * QUANTITY

23. * RETURNCODE

24. EXCEPTIONS
25. interval_not_found

=1

26. number_range_not_intern = 2
27. object_not_found
28. quantity_is_0
29. quantity_is_not_1

=3
=4
=5

30. interval_overflow

=6

31. buffer_overflow

=7

32. OTHERS = 8.
33. IF sy-subrc <> 0.
34. MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno
35. WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.

36. ELSE.
37. wa_cabecera-num_nota = l_number.
38. wa_ztfi_debcred-bukrs = wa_cabecera-bukrs.
39. wa_ztfi_debcred-belnr = wa_cabecera-belnr.
40. wa_ztfi_debcred-gjahr = wa_cabecera-gjahr.
41. wa_ztfi_debcred-num_nota = wa_cabecera-num_nota.
42. INSERT INTO ztfi_debcred VALUES wa_ztfi_debcred.
43. IF sy-subrc <> 0.
44. CLEAR: l_number.
45. ENDIF.
46. ENDIF.
47. ENDIF.

En el programa se valida que se debe hacer la insercin del registro cuando la combinacin de sociedad,
nmero de documento y ejercicio no se encuentren en la tabla ZTFI_DEBCRED, si el dato no est entonces
hacemos uso del mdulo de funcin NUMBER_GET_NEXT para traer el siguiente nmero, con lo cual se
asegura que el nmero va a ser nico as muchos usuarios ingresen al mismo tiempo.

Transporte de rangos de nmeros

1.

Debemos tener en cuenta que los rangos de nmeros no nos obliga a generar orden de transporte, para
poderlos transportar debemos hacer uso de una funcionalidad que se encuentra dentro de la transaccin
SNRO o SNUM, para hacerlo seguimos los siguientes pasos:
Ingresamos a la transaccin SNRO o SNUM damos el nombre del rango de nmeros que

queremos transportar.

2.

Damos clic en el botn Rangos nmeros y en la pantalla que se muestra a continucin 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 nmeros 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 nmeros en una orden de
transporte de tipo customazing, al finalizar la orden generada queda de la siguiente forma.

S-ar putea să vă placă și