Gracias a sergio por "postear" en el foro de Tips dBits.
Para enviar pulsaciones de teclado desde Navision y mediante código C/AL podemos utilizar este sencillo truco:
Definimos una variable
WShell
de tipo
Automation
y subtipo
'Windows Script Host Object Model'.WshShell
y utilizamos el siguiente codigo para enviar la pulsación de la tecla Enter
IF ISCLEAR(WShell) THEN IF NOT CREATE(WShell) THEN EXIT;
WShell.SendKeys('{ENTER}');
que evidentemente podemos cambiar por la tecla que más nos convenga.
Tips dBits es una comunidad de usuarios y profesionales que utilizan y trabajan con elERP Microsoft Dynamics NAV Navision, aplicativos relacionados y otras tecnologías afines. En esta web encontrará todo tipo de información y recursos, tales como noticias, documentos de interés, trucos, descargas, empleos, foro, tutoriales y enlaces a otras webs de interés.
jueves, octubre 12, 2006
viernes, septiembre 01, 2006
Ordenar un array
Codigo C/AL para ordenar un array.
OnRun()
myText[1] := 'Z8754';
myText[2] := 'M2532';
myText[3] := 'D1992';
myText[4] := 'A9900';
SortArrayOfText(myText);
FOR i := 1 TO ARRAYLEN(myText) DO BEGIN
IF myText[i] <> '' THEN
MESSAGE(myText[i]);
END;
SortArrayOfText(VAR ParamArray : ARRAY [999] OF Text[30])
COMPRESSARRAY(ParamArray);
FOR i := 1 TO ARRAYLEN(ParamArray) DO BEGIN
IF ParamArray[i] = '' THEN
Finish := i;
END;
REPEAT
ToExit := TRUE;
FOR i := 1 TO (Finish - 1) DO BEGIN
IF ParamArray[i] > ParamArray[i + 1] THEN BEGIN
Swap(ParamArray[i], ParamArray[i + 1]);
ToExit := FALSE;
END;
END;
Finish -= 1;
UNTIL ToExit;
Swap(VAR Param1 : Text[30];VAR Param2 : Text[30])
temp := Param2;
Param2 := Param1;
Param1 := temp;
OnRun()
myText[1] := 'Z8754';
myText[2] := 'M2532';
myText[3] := 'D1992';
myText[4] := 'A9900';
SortArrayOfText(myText);
FOR i := 1 TO ARRAYLEN(myText) DO BEGIN
IF myText[i] <> '' THEN
MESSAGE(myText[i]);
END;
SortArrayOfText(VAR ParamArray : ARRAY [999] OF Text[30])
COMPRESSARRAY(ParamArray);
FOR i := 1 TO ARRAYLEN(ParamArray) DO BEGIN
IF ParamArray[i] = '' THEN
Finish := i;
END;
REPEAT
ToExit := TRUE;
FOR i := 1 TO (Finish - 1) DO BEGIN
IF ParamArray[i] > ParamArray[i + 1] THEN BEGIN
Swap(ParamArray[i], ParamArray[i + 1]);
ToExit := FALSE;
END;
END;
Finish -= 1;
UNTIL ToExit;
Swap(VAR Param1 : Text[30];VAR Param2 : Text[30])
temp := Param2;
Param2 := Param1;
Param1 := temp;
viernes, agosto 18, 2006
Evitar caracteres extraños al importar / exportar
Cuando realizamos importaciones o exportaciones, mediante un dataport por ejemplo, podemos tener el problema de ver caracteres extraños en sustitución a los acentos, dieresis, eñes, u otros signos como el primero, primera, cedilla, etc.
Esto es debido a que el sistema utilizado por Navision y Windows son distintos, es decir, Navision utiliza el sistema ASCII y Windows utiliza el sistema ANSI, más completo. Aunque los caracteres "normales" como A, B, C, etc. utilizan el mismo código, no lo hacen los caracteres especiales mencionados anteriormente. Con lo que la conversión entre uno y otro sistema es errónea.
Para solventar este inconveniente, Microsoft puso a disposición de los usuarios y técnicos una CodeUnit que realiza la conversión entre el sistema ANSI al ASCII y vicevesa. La CodeUnit se puede descargar pulsando aquí.
La CodeUnit ofrece dos métodos. En función de si estamos importando o exportando utilizaremos un método u otro.
Para importar:
NewText := Ansi2Ascii( myText )
Para exportar:
NewText := Ascii2Ansi( myText )
Importante. No utilizar ninguno de estos métodos si lo que se pretende es exportar e importar de nuevo al mismo u otro Navision.
Esto es debido a que el sistema utilizado por Navision y Windows son distintos, es decir, Navision utiliza el sistema ASCII y Windows utiliza el sistema ANSI, más completo. Aunque los caracteres "normales" como A, B, C, etc. utilizan el mismo código, no lo hacen los caracteres especiales mencionados anteriormente. Con lo que la conversión entre uno y otro sistema es errónea.
Para solventar este inconveniente, Microsoft puso a disposición de los usuarios y técnicos una CodeUnit que realiza la conversión entre el sistema ANSI al ASCII y vicevesa. La CodeUnit se puede descargar pulsando aquí.
La CodeUnit ofrece dos métodos. En función de si estamos importando o exportando utilizaremos un método u otro.
Para importar:
NewText := Ansi2Ascii( myText )
Para exportar:
NewText := Ascii2Ansi( myText )
Importante. No utilizar ninguno de estos métodos si lo que se pretende es exportar e importar de nuevo al mismo u otro Navision.
viernes, julio 21, 2006
Abrir formulario por defecto
¿Sabes que desde C/AL se puede abrir el formulario por defecto asociado a una tabla? Eso es, sin necesidad de conocer su ID. Tan solo hay que indicar como parámetro de la función FORM.RUNMODAL(Number [, Record] [, Field]) un cero y la variable del record a tratar.
Por ejemplo:
recItem.SETFILTER("Gen. Prod. Posting Group", 'MERCADERIA');
FORM.RUNMODAL(0,recItem);
Utilizando la variable recItem de tipo record y subtipo Item y pasándola como parámetro lograremos que se abra su formulario asociado con los datos seleccionados.
Por ejemplo:
recItem.SETFILTER("Gen. Prod. Posting Group", 'MERCADERIA');
FORM.RUNMODAL(0,recItem);
Utilizando la variable recItem de tipo record y subtipo Item y pasándola como parámetro lograremos que se abra su formulario asociado con los datos seleccionados.
martes, mayo 30, 2006
Enviar email desde Navision
Para enviar un email desde Navision mediante CAL, utilizaremos el siguiente código:
Hay que definir la variable objApp como Atomation asignándola a 'Microsoft Outlook 11.0 Object Library'.Application y la variable objMail como Atomation asignándola a 'Microsoft Outlook 11.0 Object Library'.MailItem
//Create application
IF ISCLEAR(objApp) THEN CREATE(objApp);
//Create mail item
objMail := objApp.CreateItem(0);
//Set properties
objMail."To"('joseppages@hotmail.com');
objMail.Subject('Mail from Navision');
objMail.Body('This is a mail send from Navision.');
//Uncomment for display email
//objMail.Display();
//Send mail
objMail.Send();
Evidentemente que a través del objeto objMail tenemos otras propiedades que podemos utilizar a nuestra conveniencia, como CC o Importance.
Hay que definir la variable objApp como Atomation asignándola a 'Microsoft Outlook 11.0 Object Library'.Application y la variable objMail como Atomation asignándola a 'Microsoft Outlook 11.0 Object Library'.MailItem
//Create application
IF ISCLEAR(objApp) THEN CREATE(objApp);
//Create mail item
objMail := objApp.CreateItem(0);
//Set properties
objMail."To"('joseppages@hotmail.com');
objMail.Subject('Mail from Navision');
objMail.Body('This is a mail send from Navision.');
//Uncomment for display email
//objMail.Display();
//Send mail
objMail.Send();
Evidentemente que a través del objeto objMail tenemos otras propiedades que podemos utilizar a nuestra conveniencia, como CC o Importance.
lunes, marzo 20, 2006
Pasar parámetros entre objetos
En ocasiones es necesario comunicarse entre objetos de Navision con el fin de trasladar información adicional o complementaria al objeto llamado. La opción más utilizada para ello es mediante el pase de parámetros, o sea, desde un objeto ejecutamos a otro pero antes llamamos a una función definida por nosotros.
Por ejemplo: Desde el formulario A ejecutamos el formulario B pasándole algunos parámetros con información adicional.
Primero, en el formulario B deberemos añadir una función con los parámetros a recibir:
SetMisParametros(Param1 : Integer; Param2 : Integer)
MiParametro1 := Param1;
MiParametro2 := Param2;
MiParametro1 y MiParametro2 deben ser definidas como Globales, para que conserven el valor hasta que el objeto sea destruido.
Añadimos código en el evento OnOpenForm del formulario B para comprobar que las variables tienen el valor asignado mediante el pase de parámetros:
Form - OnOpenForm()
MESSAGE('MiParametro1 = %1', miParametro1);
MESSAGE('MiParametro2 = %1', miParametro2);
Segundo, en el formulario A, y antes de ejecutar al formulario B, pasar los parámetros:
control1000000000 - OnPush()
myFormB.SetMisParametros(1, 2); //Pase de parámetros a formulario B
myFormB.RUNMODAL; //Las var. MiParametro1 y MiParametro2 ya tienen valor
CLEAR(myFormB); //Las var. MiParametro1 y MiParametro2 NO tienen valor
Al ejecutar la linea myFormB.RUNMODAL mostrarán 2 mensajes informando del valor de las variables globales del formulario B.
Por ejemplo: Desde el formulario A ejecutamos el formulario B pasándole algunos parámetros con información adicional.
Primero, en el formulario B deberemos añadir una función con los parámetros a recibir:
SetMisParametros(Param1 : Integer; Param2 : Integer)
MiParametro1 := Param1;
MiParametro2 := Param2;
MiParametro1 y MiParametro2 deben ser definidas como Globales, para que conserven el valor hasta que el objeto sea destruido.
Añadimos código en el evento OnOpenForm del formulario B para comprobar que las variables tienen el valor asignado mediante el pase de parámetros:
Form - OnOpenForm()
MESSAGE('MiParametro1 = %1', miParametro1);
MESSAGE('MiParametro2 = %1', miParametro2);
Segundo, en el formulario A, y antes de ejecutar al formulario B, pasar los parámetros:
control1000000000 - OnPush()
myFormB.SetMisParametros(1, 2); //Pase de parámetros a formulario B
myFormB.RUNMODAL; //Las var. MiParametro1 y MiParametro2 ya tienen valor
CLEAR(myFormB); //Las var. MiParametro1 y MiParametro2 NO tienen valor
Al ejecutar la linea myFormB.RUNMODAL mostrarán 2 mensajes informando del valor de las variables globales del formulario B.
lunes, febrero 27, 2006
Métodos de acceso a Navision
Debido a la persecución de la obtención de la excelencia en la cadena de valor de las organizaciones mediante la optimización de procesos de negocio (BPM), cada vez existe más necesidad de conectar aplicaciones distribuidas, con el fin de construir una infraestructura de software basada en servicios (SOA), y de esta manera, ganar en competitividad, haciendo sus procesos más eficientes, más flexibles y menos costosos y facilitar, así también, la toma de decisiones (BI).
Navision, como parte fundamental de dicha infraestructura (ERP), dispone de distintos métodos para facilitar su integración en los procesos.
Pulse aquí para acceder a un archivo powerpoint que muestra estos métodos.
Navision, como parte fundamental de dicha infraestructura (ERP), dispone de distintos métodos para facilitar su integración en los procesos.
Pulse aquí para acceder a un archivo powerpoint que muestra estos métodos.
domingo, febrero 12, 2006
Eliminar sesiones
Gracias a rvalls por "postear" en el foro de Tips dBits.
A partir de la version 4.0 de Microsoft Business Navision, es posible eliminar sesiones, tanto en la BBDD nativa como en SQL Server.
Para ello se accederá a la ventana de "Sesiones de la base de datos", mediante el menu Archivo-Base de datos-Informacion y en la pestaña "Sesiones" se accederá al LookUp de "Sesiones actuales". Simplemente pulsando la tecla F4 se podrá eliminar cualquier sesión, excepto la actual.
A partir de la version 4.0 de Microsoft Business Navision, es posible eliminar sesiones, tanto en la BBDD nativa como en SQL Server.
Para ello se accederá a la ventana de "Sesiones de la base de datos", mediante el menu Archivo-Base de datos-Informacion y en la pestaña "Sesiones" se accederá al LookUp de "Sesiones actuales". Simplemente pulsando la tecla F4 se podrá eliminar cualquier sesión, excepto la actual.
martes, noviembre 01, 2005
Reportar en Excel
Existe una manera fácil de exportar información desde Navision a Excel y es mediante la tabla Excel Buffer. La manera es insertar un registro en dicha tabla para cada celda, indicando las coordenadas y el valor.
El siguiente código inserta el valor 35 en la celda A1:
ExclBuffer.INIT;
ExclBuffer.VALIDATE("Row No.", 1);
ExclBuffer.VALIDATE("Column No.", 1);
ExclBuffer."Cell Value as Text" := FORMAT(35);
ExclBuffer.INSERT;
Finalmente, cuando se haya rellenado todas las celdas deseadas, ejecutar las siguientes funciones:
ExclBuffer.CreateBook;
ExclBuffer.CreateSheet('Mi hoja','Mi titulo',COMPANYNAME,USERID);
ExclBuffer.GiveUserControl;
Es importante que la declaración de la variable, en el ejemplo ExclBuffer, se defina como temporal, de esta manera no interferimos con otros usuarios Navision que puedieran estar utilizando la tabla Excel Buffer mediante el mismo u otros procesos de exportación a Excel.
El siguiente código inserta el valor 35 en la celda A1:
ExclBuffer.INIT;
ExclBuffer.VALIDATE("Row No.", 1);
ExclBuffer.VALIDATE("Column No.", 1);
ExclBuffer."Cell Value as Text" := FORMAT(35);
ExclBuffer.INSERT;
Finalmente, cuando se haya rellenado todas las celdas deseadas, ejecutar las siguientes funciones:
ExclBuffer.CreateBook;
ExclBuffer.CreateSheet('Mi hoja','Mi titulo',COMPANYNAME,USERID);
ExclBuffer.GiveUserControl;
Es importante que la declaración de la variable, en el ejemplo ExclBuffer, se defina como temporal, de esta manera no interferimos con otros usuarios Navision que puedieran estar utilizando la tabla Excel Buffer mediante el mismo u otros procesos de exportación a Excel.
lunes, octubre 24, 2005
Variables globales y variables locales
Todo programador de Navision sabe la diferencia entre las variables globales y las variables locales, pero aún y así vamos a repasar sus diferencias:
Variables globales:
Son accesibles desde todo el objeto. Eventos, funciones, etc.
Variables locales:
Son accesibles sólo desde el procedimiento en las que han sido declaradas.
Pero hay que tener especial cuidado con las variables globales cuando un objeto es llamado repetidamente (parte de su código se ejecuta 2 ó más veces), ya que las variables globales, a diferencia de las locales, guardan su valor entre las llamadas. Por el contrario, las variables locales son inicializadas cada vez.
Ejemplo mediante un CommandButton en un Form:
myBoton - OnPush()
varGlobal := varGlobal + 1;
varLocal := varLocal + 1;
MESSAGE('Global = %1\Local = %2', varGlobal, varLocal);
La variable global irá aumentando su valor tantas veces como se pulse el botón, no así la local que siempre será 1.
Esta casuística cobra especial importancia cuando se llaman objetos desde otros objetos, ya que esta regla se cumple en todos los casos, o sea, las variables globales del objeto llamado permanecen mientras permanezca el objeto.
Son accesibles desde todo el objeto. Eventos, funciones, etc.
Son accesibles sólo desde el procedimiento en las que han sido declaradas.
Pero hay que tener especial cuidado con las variables globales cuando un objeto es llamado repetidamente (parte de su código se ejecuta 2 ó más veces), ya que las variables globales, a diferencia de las locales, guardan su valor entre las llamadas. Por el contrario, las variables locales son inicializadas cada vez.
Ejemplo mediante un CommandButton en un Form:
myBoton - OnPush()
varGlobal := varGlobal + 1;
varLocal := varLocal + 1;
MESSAGE('Global = %1\Local = %2', varGlobal, varLocal);
La variable global irá aumentando su valor tantas veces como se pulse el botón, no así la local que siempre será 1.
Esta casuística cobra especial importancia cuando se llaman objetos desde otros objetos, ya que esta regla se cumple en todos los casos, o sea, las variables globales del objeto llamado permanecen mientras permanezca el objeto.
jueves, octubre 13, 2005
Asiento de apertura inexistente
Navision, al contrario de la contabilidad "tradicional", no cierra ni abre los ejercicios, es decir, no existe ningún asiento de cierre a fin de ejercicio fiscal ni de apertura al inicio del próximo. ¿Qué pasa con los diarios oficiales? Navision "simula" el asiento de apertura, ya que es obligado en estos informes, utilizando los saldos de las cuentas de balance a final del ejercicio anterior.
Lo que sí existe es el asiento de regularización, lo que es el cuadre de las cuentas del grupo 6 y 7 (comerciales) con la cuenta 129. A este asiento, Navision le asigna una fecha de fin de ejercicio precedida por la letra U (U31/12/05 p.e.). Es una fecha ficticia entre el fin de ejercicio y el inicio del siguiente, con el fin de mantener los saldos correctos durante el ejercicio fiscal completo.
Es por ello que en el esquema de cuentas, el balance utiliza un formato de columnas que muestra el saldo a la fecha (.."HastaFecha") y la cuenta de resultados utiliza un formato de columnas que muestra el saldo del periodo ("DesdeFecha".."HastaFecha").
Lo que sí existe es el asiento de regularización, lo que es el cuadre de las cuentas del grupo 6 y 7 (comerciales) con la cuenta 129. A este asiento, Navision le asigna una fecha de fin de ejercicio precedida por la letra U (U31/12/05 p.e.). Es una fecha ficticia entre el fin de ejercicio y el inicio del siguiente, con el fin de mantener los saldos correctos durante el ejercicio fiscal completo.
Es por ello que en el esquema de cuentas, el balance utiliza un formato de columnas que muestra el saldo a la fecha (.."HastaFecha") y la cuenta de resultados utiliza un formato de columnas que muestra el saldo del periodo ("DesdeFecha".."HastaFecha").
sábado, octubre 08, 2005
Acceder a Navision sin contraseña
Existe una manera de acceder a una BBDD de Navision sin que pida contraseña, aunque para ello deberemos tener una copia de seguridad.
El truco consiste en crear una BBDD nueva, restaurar la copia de seguridad y... ya está, estaremos dentro de la BBDD sin que nos haya pedido usuario y contraseña. Evidentemente, si la cerramos y volvemos a abrir, ya nos volverá a pedir la contraseña.
El truco consiste en crear una BBDD nueva, restaurar la copia de seguridad y... ya está, estaremos dentro de la BBDD sin que nos haya pedido usuario y contraseña. Evidentemente, si la cerramos y volvemos a abrir, ya nos volverá a pedir la contraseña.
sábado, octubre 01, 2005
Enlace con varios subforms simultaneamente
Navision permite tener dentro de un form un subform y hacer un link entre ellos, de manera que al cambiar el registro del form cambie la información relacionada en el subform.
Pero no permite, de manera automática, enlazar un segundo subform. Esto se consigue con el evento OnTimer del form, el cual se ejecuta cada cierto tiempo programado (TimerInterval = 100, es un valor adecuado). Es en este evento donde podemos añadir codigo y verificar si hay que actualizar la información del segundo subform. Por ejemplo:
Form - OnTimer()
CurrForm.sbfItems.FORM.GETRECORD(ItemVendor); //Coge el registro actual
IF Key <> "No." + ItemVendor."Item No." THEN BEGIN //Si la info ha variado...
CurrForm.sbfPrices.FORM.myFilter("No.",ItemVendor."Item No."); //Actualiza el 2do subform
Key := "No." + ItemVendor."Item No."; //Coge nueva clave
END;
Teneis un ejemplo en la sección de downloads
Pero no permite, de manera automática, enlazar un segundo subform. Esto se consigue con el evento OnTimer del form, el cual se ejecuta cada cierto tiempo programado (TimerInterval = 100, es un valor adecuado). Es en este evento donde podemos añadir codigo y verificar si hay que actualizar la información del segundo subform. Por ejemplo:
Form - OnTimer()
CurrForm.sbfItems.FORM.GETRECORD(ItemVendor); //Coge el registro actual
IF Key <> "No." + ItemVendor."Item No." THEN BEGIN //Si la info ha variado...
CurrForm.sbfPrices.FORM.myFilter("No.",ItemVendor."Item No."); //Actualiza el 2do subform
Key := "No." + ItemVendor."Item No."; //Coge nueva clave
END;
Teneis un ejemplo en la sección de downloads
jueves, septiembre 29, 2005
Nº de movimiento - Igual entre distintas tablas
¿Sabías que... ?
Cuando Navision registra una transacción relacionada con un cliente, proveedor o banco asigna el mismo "Nº de movimiento" en todas las tablas.
Por ejemplo, al registrar una factura de un cliente, si examinamos el número de movimiento asignado al registro de la tabla de movimientos de cliente y hacemos "Navegar" y mostramos los movimientos de contabilidad, el apunte perteneciente a la cuenta 430xxxx tendrá el mismo número de movimiento que el de la tabla de movimientos de cliente.
Cuando Navision registra una transacción relacionada con un cliente, proveedor o banco asigna el mismo "Nº de movimiento" en todas las tablas.
Por ejemplo, al registrar una factura de un cliente, si examinamos el número de movimiento asignado al registro de la tabla de movimientos de cliente y hacemos "Navegar" y mostramos los movimientos de contabilidad, el apunte perteneciente a la cuenta 430xxxx tendrá el mismo número de movimiento que el de la tabla de movimientos de cliente.
viernes, septiembre 23, 2005
Omitir IRPF de profesionales en 347
Al introducir facturas de profesionales, se suele introducir la cantidad de IRPF retenida como una linea de factura y asignándola directamente a una cuenta 475xxx. En este caso hay que prestar especial atención a la configuración de la cuenta: el campo "Omite en informe 347" de la pestaña "Informes" debe estar activado, ya que el importe (negativo) en la linea de la factura NO debe restar del total de la factura al imprimir el informe "Proveedor - Declaración anual".
jueves, septiembre 15, 2005
Pérdida del control para ficheros en RequestForm del DataPort
Al poner controles en el "Request Form" de un "Dataport" se pierde el control por defecto que abre el asistente para la localización del fichero a importar o exportar.
Se puede solucionar incorporando un "Textbox" y estableciendo el valor de la propiedad "ID" a 1 y la propiedad "Assistedit" a Sí. A partir de este instante automáticamente aparecerá el "Assistbutton" que actuará exactamente igual que el control por defecto, tan sólo queda indicar el nombre del fichero al "Dataport", en el evento "OnPreDataport", estableciendo la propiedad "CurrDataport.FILENAME" := "varConElNombreDelFichero"
Se puede solucionar incorporando un "Textbox" y estableciendo el valor de la propiedad "ID" a 1 y la propiedad "Assistedit" a Sí. A partir de este instante automáticamente aparecerá el "Assistbutton" que actuará exactamente igual que el control por defecto, tan sólo queda indicar el nombre del fichero al "Dataport", en el evento "OnPreDataport", estableciendo la propiedad "CurrDataport.FILENAME" := "varConElNombreDelFichero"
Suscribirse a:
Entradas (Atom)