Cómo saber si un cambio de valor lo hace un usuario o el sistema

featuredRecuerdo haber visto esto hace un tiempo en algún lugar de NAV y una compañera me lo recordó hace poco y pensé que sería buen material para un post :-)

Vamos a ello!

Pues sí, hay una manera de conseguir esto por el estándar.

Como todos sabemos, existen algunas variables dentro de un objeto que están predefinidas por el sistema. Algunas de estas variables son “CurrPage”, “Rec” o “xRec”.

Pues bien, existe otra variable que muchos de nosotros no tenemos en mente todo el tiempo. Esta variable es: CurrFieldNo

Cómo funciona CurrFieldNo?

Esta variable almacena el número de campo con el que el usuario ha interactuado desde una tabla. Un ejemplo de esto se puede ver en la tabla 14 – (Location) – Campo 5714 (“Post Code”).

Post Code – OnValidate()

Postcode.ValidatePostCode(City,"Post Code",County,"Country/Region Code",(CurrFieldNo <> 0) AND GUIALLOWED);

Ahí podemos ver como CurrFieldNo es usado como parámetro y comparado con 0. Si es distinto (es decir, que el usuario ha interactuado con la tabla directamente utilizando una página/form) esta condición devolverá TRUE. De lo contrario devolverá FALSE. Simple verdad? :-)

Vamos a probar!

En la tabla 14 (Location) he creado una función que crea un mensaje con el valor de CurrFieldNo del siguiente modo:

ShowCurrFieldNo()

MESSAGE(MsgTxt,FORMAT(CurrFieldNo));

// MsgTxt is a TextConstant with the value "The value of CurrFieldNo is %1"

Y llamo a esta función desde el OnValidate del campo “Name” de la tabla “Location” del siguiente modo:

Name – OnValidate()

//MSNAV.es.begin
ShowCurrFieldNo;
//MSNAV.es.end

Así que cuando entro un valor en el campo “Name” directamente desde la ficha de almacén el sistema me devuelve este mensaje:

TestWhse

El campo número 2 es el campo “Name” de la tabla. Genial! De momento funciona como esperábamos.

Qué pasa ahora si creo una acción/botón en la misma página (ficha almacén) que valide el campo “Name” con cualquier valor del siguiente modo?

ActionLocationCard

Test CurrFieldNo – OnAction()

VALIDATE("Name","Name");

Y cuando ejecuto el botón ocurre lo siguiente:
ActionOnCard

Así que a pesar de que estamos validando el mismo campo desde la misma página que utilizamos para hacerlo manualmente, el CurrFieldNo no devuelve el mismo valor. Esto demuestra que esta variable claramente diferencia entre la entrada de información por parte del usuario y la entrada por parte del sistema de manera estándar.

Y por supuesto lo mismo ocurre cuando validamos un campo desde un objeto distinto (pongamos por ejemplo una codeunit). CurrFieldNo se mantiene a 0.

Y último pero no por ello menos importante… Si miramos el enlace de la MSDN sobre esta variable CurrFieldNo, claramente comenta lo siguiente:

CurrFieldNo – This variable specifies the field number of the current field in the current form. Retained for compatibility reasons.

Lo cual me hace pensar que es cuestión de tiempo antes de que esta variable se quite completamente. Esto puede ser un motivo para abstenerse de usarla. Pero hasta que no llegue ese día sabemos que está ahí y podemos utilizarla :-)









This entry was posted in NAV2009, NAV2013, NAV2013R2, NAV2015, Navision, Tips&Tricks and tagged , , , , , . Bookmark the permalink.

Leave a Reply

Your email address will not be published. Required fields are marked *

*