Ajuste del control de numeración automática

Producto:

Microsiga Protheus

Ocurrencia:

Procedimientos para ajustar el Control de numeración automática de formularios (Tablas / ALIAS) diversos en el Protheus

Entorno:

SIGAFAT - Facturación

El control de numeración del Protheus utiliza la Tabla ASCII para definición de secuencia.

Antiguamente se utilizaba el Hard Lock conectado al servidor. Posteriormente este control se migró a las Tablas SXE / SXF físicas en el directorio del entorno.

A partir del Protheus V12 el controle de numeración debe ser exclusivamente vía License Server (Release 25 inclusive ya valida en el momento del Upgrade para no permitir el cierre del release sin uso del License - DFRM1-16558).

Además del hecho de que el desempeño es muy superior en este modelo con relación al modelo en las tablas SXE/SXF, también las tablas SXE/SXF son administradas por el FileSystem, por causa de esto pueden corromperse en caso de cierres inesperados, como caídas de energía.

La numeración de las tablas en License Server se almacena en la memoria, mientras el License Server está activo. Cuando se para el servicio do License Server, se crea un archivo llamado LSNumber.val en la carpeta del Application Server. En este archivo se graban las últimas secuencias de las claves en uso en el License, de las tablas que tienen numeración automática. Cuando se reinicia el License, estos datos son leídos de este archivo y cargados en la memoria nuevamente, para dar continuidad en la secuencia de la numeración automática.

Vea todos los detalles en: Numeración automática por el License Server

Vídeo How To

¿Quiere saber más sobre el Control de numeración automática? Vea nuestro vídeo sobre el asunto en el enlace: Ajuste de numeración automática de las tablas

    Validar que su control de numeración está debidamente configurado para utilizar el License Server:

    Verifique en el archivo appserver.ini cómo está completada la clave (ENABLENUMER) de la sesión [licenseserver]. Debe estar configurado: Enablenumber=1 lo cual indica control en el License Server (Enablenumber=0 indica control por las antiguas tablas SXE/SXF):

    Ejemplo

    [LICENSESERVER]
    Enable=1
    Port=5555
    ShowStatus=1
    ENABLENUMBER= 0 ou 1

    ENABLENUMBER= 0 = SXE e SXF
    ENABLENUMBER= 1 = License Server

    Importante

    Observaciones IMPORTANTES:
    • Si no existiera la línea Enablenumber en la sección [LicenseServer], se asume el estándar, que es numeración en el License Server.

    • Si identifica que aún está configurado como SXE/SXF se recomienda que realice una copia de seguridad de las tablas SXE y SXF antes de modificar, pues al modificar el modo de numeración al modo License Server (Enablenumber=0 para Enablenumber=1) las tablas SXE y SXF se borrarán en el momento en el que acceda a la primera rutina que utilice numeración automática, y en este momento, el License Server buscará la última numeración de cada tabla con numeración automática y cargarla en la memoria. Después de la modificación, si la numeración estuviera en el orden incorrecto, utilice la rutina APCFG110 para ajustar (abordada a continuación).

    • El usuario que inicializa el servicio del Protheus Server (que utiliza License Server) debe ser el ADMINISTRADOR.

    • Asegúrese de estar con BUILD, LIB y versión del LS - License Server actualizados (LS debe ser igual o superior a 1.03.014). Detalles en: Se habilitó la generación del archivo LSNumber.val
    • Con esta actualización vuelve a grabarse el archivo LSNumber.val (cuando se encierra correctamente el servidor de licencias, vía consola o al final del servicio).
      Este archivo graba la última secuencia disponible para las claves en uso en el License, cuando se reinicia el servidor de licencias estos datos se cargan a la aplicación y en el momento de obtener la próxima secuencia ser considerarán los datos que estuvieran en este archivo.
      La funcionalidad es recomendada, pues una vez que la secuencia estuviera corregida, el License grabará el contenido y continuará siempre a partir de este; en lugar de buscar en la tabla del sistema la próxima secuencia para la chave a partir de la última numeración grabada.

      Si estuviera con el License Server anterior a la versión 1.03.014 y con builds superior a 7.00.131227A - 1.0.3 entonces, en este caso, el sistema no grabará el archivo LSNumber.val y buscará en la Tabla la mayor numeración grabada para dar secuencia. Detalles en: Creación del LSNumber.val / Numeración automática por el License Server

      Es decir, el License Server realizará un barrido en la referida Tabla (ejemplo SC5) en la Base de datos y se basará en la mayor numeración que tiene grabada e incrementar en +1
      Ejemplo: La secuencia del campo está en la numeración 000096 , 000097 , 000098 , 000099 , 000100 .... Pero, por algún motivo, esta tabla tiene un registro grabado con la numeración 142535. Al reiniciar el LS, realizará un barrido en la tabla para encontrar la última numeración y como el número 142535 es mayor que 000100, seguirá la numeración a partir de 142535 respetando la regla de la mayor numeración que tiene grabada e incrementar en +1
      Observación: Para entornos que tengan lagunas en la numeración automática como se ejemplificó anteriormente, es posible utilizar el punto de entrada CRIASXE, que consigue realizar un barrido en la tabla y marcar la numeración. Más información: ADVPL - Punto de entrada CRIASXE.

    • Múltiples entornos utilizando el mismo License Server:

      Si su estructura tuviera más de un Appserver / más de una carpeta System apuntando al mismo License Server, la numeración de una base puede influir en la otra. Por eso, es necesario configurar la clave SpecialKey en el archivo appserver.ini de cada base, para que cada entorno tenga una clave diferente en el License Server. Este escenario se encuentra por ejemplo cuando se tiene más de un entorno (ejemplo entorno de Producción y entorno de Prueba) apuntando a la misma base de datos y el mismo License Server (configuración en el ini del server).

      Vea cómo configurar la clave SpecialKey

      Entorno DBF: Si los entornos fueran DBF/CDX estos deben apuntar a direcciones en el X2_PATH, obligatoriamente diferentes.

      Entorno TOP: Si los entornos fueran TOPConnect/TOTVSDBAcess, los alias de los entornos, obligatoriamente deben ser diferentes.

    Validar que el referido Formulario (la tabla / rutina) tiene realmente la función de numeración automática:

    No todas las Tablas / Rutinas del Protheus tienen por estándar la función de sugerir numeración automática.

    Para que, por ejemplo, el registro de clientes traiga en la inclusión automáticamente el próximo número disponible, se utiliza la siguiente sintaxis en el inicializador estándar (SX3) del campo A1_COD: GetSx8Num("SA1","A1_COD")

    ¡Es necesario verificar si el X3 del campo que desea está con esta información en el inicializador estándar! En la mayoría de las veces el inicializador estándar del campo está registrado como: GetSx8Num("SA1")

    Los inicializadores GetSx8Num y GetSxeNum tienen el mismo funcionamiento y objetivo, sin embargo, si fuera necesario incluir en algún campo que no sea estándar,  el más utilizado a partir de la release 12.125 es GetSx8Num, pues las tablas  SXE/SXF no están disponibles para acceso directo en el Lobo Guará.


    Observación

    Particularmente si el caso fuera referente al Registro de cliente SA1 es importante verificar también si la configuración no es Nativa del módulo SIGALOJA:SIGALOJA Generación del código de cliente a partir del RCPF/RCPJ)

    Con relación al uso de la función A030INICPD() en el Inicializador estándar de A1_COD, es un tratamiento para el código del cliente si existiera integración con RM Sistemas, lo cual depende de la configuración del parámetro MV_RMCLASS, si no tiene esta integración, la función no tendrá efecto en su proceso.

    Importante

    Esta configuración en el SX3 para generación automática de numeración secuencial debe ser utilizada solamente por campos en los cuales consta la definición en el nativo del Protheus. No debe incluirse manualmente en campos que no tienen este control automático por estándar (como por ejemplo en el campo C5_NUM). Porque este tratamiento por sí solamente no trata abandono de numeración reservada no utilizada (este tratamiento se realiza en el código fuente de las rutinas). Es decir, al reservar la próxima numeración haciendo clic en "Incluir"(registro 000010 por ejemplo) pero no hacer efectiva la grabación, abandonando el registro, después de haberse realizado la numeración siguiente (después que otra instancia grabó la 000011 por ejemplo) se provocarán lagunas haciendo que se pierda el control automático. De esta manera, sería necesario verificar la posibilidad de uso de punto de entrada en la rutina que desea implementar el uso de numeración automática para el fiel comportamiento de la herramienta para tratar abandonos de reserva de numeración.

    En el Portal de Gestión de ventas debido a la utilización de threads, donde permanece activa la utilización GetSx8Num() esperando nuevas ejecuciones, no es posible la utilización de esta función, pues no se encierran las threads manteniendo la misma numeración u ocurriendo abandono de numeraciones.

    En este caso, para capturar el próximo número para el campo A1_COD, es posible realizar una personalización utilizando la función de usuario (User Function) en la activación del campo del Inicializador estándar (X3_RELACAO). Esto permitirá controlar el momento en el que la acción está viniendo del Portal de Gestión de ventas, permitiendo el tratamiento y la validación de la devolución para la presentación correcta de la numeración en el PGV.

    A continuación, indicamos un ejemplo de función, pero recordemos que solamente es un ejemplo, si fuera necesario personalizar, solicite el acompañamiento de su analista programador:


    Ejemplo de User Function
    #Include 'TOTVS.ch'
    
    User Function NextSA1Cod()
    Local cNum := GETSXENUM("SA1","A1_COD")
    
    DbSelectArea("SA1")
    SA1->(DbSetOrder(1))
    While (DbSeek(xFilial("SA1")+cNum))
    ConfirmSX8()
    
    cNum := GETSXENUM("SA1","A1_COD")
    Enddo
    
    DbCloseArea()
    RollbackSx8()
    Return cNum

    Ajuste de la numeración automática:

    Para ajustar la numeración automática, cuando esta sale del orden por algún motivo, debe ejecutarse la rutina APCFG110 por el Configurador.

    Primero verifique el último/mayor número grabado en la Tabla (registro "000004" por ejemplo) a partir de la cual desea dar secuencia (Tenga en cuenta la numeración de acuerdo con la Sucursal).


    Observación

    Supongamos que el License Server pare de forma inesperada, como una caída de energía o cierre inadecuado, el archivo no se genera, y en la reinicialización del License, las informaciones de la última numeración son leídas directamente de las tablas en la base y cargadas en la memoria.

    Es decir, si hubiera una numeración discrepante en la secuencia de la tabla, como por ejemplo, alguna numeración iniciada con una letra, en medio a una secuencia de números (en la base de datos, las letras vienen después de los números, entonces el código iniciado con letra va a considerarse el último número de la secuencia, después de cualquier número), toda vez que se reinicia el servidor sin ejecución del proceso correcto (vía consola o al final del servicio), este código se cargará con base en esta numeración "incorrecta" de la base.


    Vamos a tomar, como ejemplo, la numeración automática en el campo A1_COD de la tabla de Clientes (SA1).

    En la siguiente imagen, observe que existen 4 clientes registrados, por lo tanto, la última numeración es 000004:

    2019-04-10_1001.png

    En la rutina APCFG110, la numeración debe estar de acuerdo con la siguiente imagen:
    2019-04-10_1002.png

    • En la sección inferior (antigua SXF) - Números en uso/ Números liberados: Muestra la última numeración sugerida / por sugerir (aún no grabada) → en este ejemplo, 000005.
    • En la sección superior (antigua SXE) - Próximos números: Muestra la numeración siguiente, es decir (última numeración sugerida / por sugerir (aún no grabada)) + 1 → en este ejemplo, 000006.
    • Al incluir un Nuevo cliente en la rutina de Clientes, si por algún motivo la próxima numeración no fuera 000005, entonces debe hacer clic 2 veces en el número que está en Números en uso, modificar para el que sería el próximo, y en el área Próximos números incluir el subsiguiente correcto. Con esto se redefine el orden que el sistema de numeración automática debe seguir.

    Observación

    Asegúrese de que, tanto en la sección inferior como en la superior, exista solamente una línea (un registro) de sugerencia de la numeración para el ALIAS. Si hubiera registro duplicado, con ALIAS y Clave idénticos, reinicie el License Server y valide si se ajustó para tener solamente una línea (Dudas o dificultades en este procedimiento, active al Soporte Framework Protheus).

    Puede ser de su interés:

    Numeración automática por el License Server

    CFG - Numeración automática

    FRAME - Ajuste de numeración