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] ENABLENUMBER= 0 = SXE e SXF Importante Observaciones IMPORTANTES:
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:
En la rutina APCFG110, la numeración debe estar de acuerdo con la siguiente imagen:
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: |