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:
- Redirecciona la referencia de la tabla de una empresa a otra.
[Ok :=] Record.CHANGECOMPANY([CompanyName])
- Parameters
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
- Observaciones
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.
- Importante
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.
- Ejemplo
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.
- Ejemplo
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:
Ejercicio: Informe que muestre el nombre de la empresa, el código del producto, la descripción del producto y las existencias
1. Creamos una estructura sencilla de Report, con la tabla Company como Dataitem principal y la tabla Item como Dataitem dependiente de Item.
2. Para mostrar las existencias creamos una variable de tipo Decimal.
3. Para el cálculo de las existencias creamos una función.
4. Añadimos unas líneas de código.
5. Creamos una estructura sencilla con el asistente.
6. Probamos que está todo correcto.
Jose Carlos Herrero
Dynamics
[contact-form][contact-field label=»Nombre» type=»name» required=»true» /][contact-field label=»Correo electrónico» type=»email» required=»true» /][contact-field label=»Web» type=»url» /][contact-field label=»Mensaje» type=»textarea» /][/contact-form]