Una de las peticiones más habituales entre nuestros clientes de Dynamics NAV es poder ver información de otras empresas desde aquélla en la que estamos accediendo. Se suele dar el caso de un grupo de empresas en el que se necesita la información del stock de todas ellas, o una empresa que compra a otra del grupo y se requiere ver en la venta si tiene stock disponible en la asociada.
Este requerimiento se puede resolver mediante programación haciendo uso de la función CHANGECOMPANY. Los parámetros y las indicaciones de uso son las siguientes:
[Ok :=] Record.CHANGECOMPANY([CompanyName])
Record
Type: Record
La tabla a la que quieres acceder desde otra empresa.
CompanyName
Type: Text or code
El nombre de la empresa a la que quieres apuntar. Si omites este parámetro vuelves a posicionarte en la empresa desde la que se ejecuta el código.
Property Value/Return Value
Type: Boolean
Verdadero si encuentra la empresa a donde reposicionarse.
Si se omite el resultado de la llamada y no puede encontrar la empresa se da un error en tiempo de ejecución
Cuando se ejecuta la función el usuario tiene que tener permisos para acceder a los datos. La función CHANGECOMPNAY no está afectada por la función RESET. La función RESET se aplica a filtros y CHANGECOMPANY no es un filtro.
Incluso si has ejecutado la función CHANGECOMPNY los desencadenadores (triggers) se ejecutan en la empresa desde la que se lanza, no en la empresa especificada en la función CHANGECOMPANY.
Si tenemos la empresa TEST_A y la empresa TEST_B y ejecutamos el siguiente código desde la empresa TEST_A.
Item.CHANGECOMPANY(TEST_B);
Item.INIT;
Item.»No.» := ‘’;
Item.INSERT(TRUE);
El código del insert:
OnInsert()
IF «No.» = » THEN BEGIN
GetInvtSetup;
InvtSetup.TESTFIELD(«Item Nos.»);
NoSeriesMgt.InitSeries(InvtSetup.»Item Nos.»,xRec.»No. Series»,0D,»No.»,»No. Series»);
END;
Se ejecuta en la empresa TEST_A a todos los efectos. Es decir, la serie la va a buscar en la empresa TEST_A y las funciones y registros que mire serán todos de la empresa TEST_A y no de la empresa TEST_B.
Los campos calculados hacen referencia a otras tablas por lo que se aplica la anterior limitación. Cuando llamamos a CALCFIELDS se va a aplicar siempre a la empresa desde la que se lanza el código, no a la empresa indicada en la función CHANGECOMPANY.
La limitación de los disparadores cómo el INSERT requiere mucho código para hacer una redirección a la empresa a la que queremos reposicionarnos, por lo que vamos a dejar cómo solucionar ese punto para otro artículo. La limitación de los CALCFIELDS es más fácil de solventar. Vamos a ver un ejemplo de función que con un par de parámetros nos va a dar las existencias de la empresa que queramos.
GetInvCompany(ItemNo : Code[20];CompName : Text[30]) : Decimal
ItemLedgEntry.CHANGECOMPANY(CompName);
ItemLedgEntry.SETCURRENTKEY(«Item No.»,Open,»Variant Code»,Positive,»Location Code»,»Posting Date»);
ItemLedgEntry.SETRANGE(«Item No.»,ItemNo);
ItemLedgEntry.CALCSUMS(Quantity);
EXIT(ItemLedgEntry.Quantity);
Vamos a hacer un ejercicio con toda esta información para entender mejor el funcionamiento. El ejercicio va a ser lo siguiente:
Jose Carlos Herrero
Dynamics