¡Hola a todos los amigos programadores de Navision! Hoy os traigo un truco que seguro os será de gran utilidad, especialmente si trabajáis con versiones superiores a 2009.
Como bien sabemos, una de las limitaciones de las últimas versiones de Navision es la falta de la instrucción INPUT, que nos permitía solicitar datos al usuario durante la ejecución del programa. Esta funcionalidad era muy útil en ciertos escenarios, pero lamentablemente quedó obsoleta.
Sin embargo, no todo está perdido. Existe una solución elegante y eficiente para reemplazar esa funcionalidad, y hoy os la voy a mostrar en detalle.
Así que ¡Vamos manos a la obra! 😎
La idea principal es crear una página (Page) que simule el comportamiento de un cuadro de diálogo. En esta página, incluiremos un campo de texto (Field) donde el usuario podrá ingresar la información requerida. Luego, recuperaremos ese valor y lo utilizaremos en nuestro código según sea necesario.
Veamos cómo se implementa paso a paso:
- Creamos una nueva Page y le agregamos una variable global de tipo texto (TextValue).
- Añadimos esa variable como un Field editable en la Page.
- Creamos tres funciones:
- SetTitle: para establecer un título opcional en la Page.
- SetText: para establecer el texto de instrucciones y un valor predeterminado en el Field.
- GetText: para recuperar el valor ingresado por el usuario.
Aquí os dejo el código completo para que lo podáis analizar con calma:
OBJECT Page 62000 Dialog INPUT Sencillo
{
OBJECT-PROPERTIES
{
Date=19/01/22;
Time=[ 8:58:07];
Modified=Yes;
Version List=UTILS;
}
PROPERTIES
{
CaptionML=[ENU=Insert the required data;
ESP=Insertar el dato requerido];
PageType=StandardDialog;
}
CONTROLS
{
{ 1000000154;0;Container;
ContainerType=ContentArea }
{ 1000000153;1;Field ;
SourceExpr=Title;
Visible=booTitle;
Editable=False;
Style=StrongAccent;
StyleExpr=TRUE }
{ 1000000151;1;Group ;
GroupType=Group }
{ 1000000150;2;Group ;
GroupType=GridLayout;
Layout=Rows }
{ 1000000149;3;Group ;
GroupType=Group }
{ 1000000148;4;Field ;
ExtendedDatatype=None;
SourceExpr=Caption;
Editable=FALSE;
MultiLine=Yes;
Style=Strong;
StyleExpr=true }
{ 1000000147;4;Group ;
GroupType=Group }
{ 1000000157;5;Field ;
SourceExpr=TextValue }
}
CODE
{
VAR
Title@1000000162 : Text;
Caption@1000000159 : Text;
TextValue@1000000000 : Text;
booTitle@1000000001 : Boolean;
PROCEDURE SetTitle@1000000008(Titulo@1100225000 : Text);
BEGIN
booTitle := TRUE;
Title := Titulo;
END;
PROCEDURE SetText@1000000001(Titulo@1100225000 : Text;DefaultValue@1000000001 : Text);
BEGIN
TextValue := DefaultValue;
Caption := Titulo;
END;
PROCEDURE GetText@1000000005() : Text;
BEGIN
EXIT(TextValue);
END;
BEGIN
{
#Creado por Esteve Sanpons Carballares.
#https://github.com/Esanpons
#Se da acceso libre a modificar y utilizar este objeto libremente. Siempre y cuando se haga referencia al autor.
}
END.
}
}
Como podéis ver, el código es bastante sencillo y fácil de entender. La clave está en la creación de esta Page personalizada que nos permite simular el cuadro de diálogo.
Ahora, para utilizar esta funcionalidad en nuestro código, simplemente tenemos que crear una instancia de la Page, establecer el texto de instrucciones y el valor predeterminado (si lo deseamos), ejecutar la Page y recuperar el valor ingresado por el usuario.
Por ejemplo:
var
DialogPage: Page "Dialog INPUT Sencillo";
UserInput: Text;
begin
DialogPage.SetText('Ingrese un valor:', ''); // Establecemos el texto de instrucciones y un valor predeterminado vacío
if DialogPage.RunModal() = Action::OK then // Ejecutamos la Page y esperamos la respuesta del usuario
UserInput := DialogPage.GetText(); // Recuperamos el valor ingresado por el usuario
De esta manera, podremos solicitar cualquier tipo de dato al usuario de forma dinámica y utilizarlo en nuestro programa según sea necesario.
Esta solución puede ser especialmente útil en situaciones donde necesitamos personalizar el comportamiento de nuestro programa en función de los requisitos específicos del usuario o cuando debemos solicitar información adicional durante la ejecución.
Recuerda que este es solo un ejemplo básico, pero puedes expandirlo y personalizarlo según tus necesidades. Por ejemplo, podrías agregar validaciones adicionales, diferentes tipos de campos, múltiples líneas de texto, etc.
Os adjunto el código por si lo queréis probar esta en el GitHub
Espero que esta explicación te haya resultado clara y útil. Si tienes alguna duda o sugerencia, no dudes en comentarla. ¡Estaré encantado de ayudarte y seguir aprendiendo juntos!
Un abrazo a todas y ¡Hasta la próxima!