GUÍA RÁPIDA LENGUAJE C/AL

10,006 views

Published on

Published in: Technology
0 Comments
3 Likes
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total views
10,006
On SlideShare
0
From Embeds
0
Number of Embeds
37
Actions
Shares
0
Downloads
378
Comments
0
Likes
3
Embeds 0
No embeds

No notes for slide

GUÍA RÁPIDA LENGUAJE C/AL

  1. 1. Lenguaje C/AL
  2. 2. Lenguaje C/AL <ul><li>¿Qué es? </li></ul><ul><ul><li>Client Application Lenguage </li></ul></ul><ul><li>Uso </li></ul><ul><ul><li>Diseño de funciones propias </li></ul></ul><ul><ul><li>Control de la ejecución de los objetos en Navision Financials </li></ul></ul><ul><ul><li>Manipulación de los datos </li></ul></ul><ul><ul><ul><li>Creación de reglas de negocio que permiten asegurar el propósito y consistencias de los datos </li></ul></ul></ul><ul><ul><ul><li>Leer, escribir y modificar los datos de las tablas </li></ul></ul></ul>
  3. 3. Lenguaje C/AL - Herramientas <ul><li>Editor de C/AL </li></ul><ul><ul><li>Ver, C/AL Code ó F9 </li></ul></ul><ul><li>C/AL Symbol Menu </li></ul><ul><ul><li>Ver, C/AL Symbol Menu ó F5 </li></ul></ul><ul><ul><li>Uso: </li></ul></ul><ul><ul><ul><li>Permite ver y facilita la edición de variables, campos, funciones, controles y propiedades </li></ul></ul></ul><ul><ul><ul><li>accesibles desde C/AL </li></ul></ul></ul><ul><ul><ul><li>dependiendo del entorno </li></ul></ul></ul>
  4. 4. Lenguaje C/AL - Herramientas <ul><li>Debugger </li></ul><ul><ul><li>Funciones </li></ul></ul><ul><ul><li>Herramientas, Debugger </li></ul></ul><ul><ul><ul><li>Activación y desactivación del depurador </li></ul></ul></ul><ul><ul><ul><li>Rastreo de instrucciones: Modos de rastreo </li></ul></ul></ul><ul><ul><ul><li>Visualizar variables </li></ul></ul></ul><ul><ul><ul><li>Code Coverage </li></ul></ul></ul>
  5. 5. Elementos C/AL <ul><li>Tipos de datos </li></ul><ul><ul><li>Simples </li></ul></ul><ul><ul><li>Complejos </li></ul></ul><ul><li>Símbolos </li></ul><ul><ul><li>Variables </li></ul></ul><ul><ul><li>Funciones de usuario </li></ul></ul><ul><ul><li>Constantes de texto </li></ul></ul><ul><li>Expresiones </li></ul><ul><ul><li>Numéricas </li></ul></ul><ul><ul><li>Lógicas </li></ul></ul><ul><ul><li>Relacionales </li></ul></ul><ul><li>Operadores </li></ul><ul><ul><li>Unarios </li></ul></ul><ul><ul><li>Aritméticos </li></ul></ul><ul><ul><li>Relacionales </li></ul></ul><ul><ul><li>Lógicos </li></ul></ul><ul><li>Estructuras de control </li></ul><ul><ul><li>Compuestas </li></ul></ul><ul><ul><li>Condicionales </li></ul></ul><ul><ul><li>Repetitivas </li></ul></ul><ul><ul><li>Otras </li></ul></ul><ul><li>Funciones </li></ul>
  6. 6. Tipos de Datos - Simples <ul><li>Numéricas </li></ul><ul><ul><li>Integer </li></ul></ul><ul><ul><ul><li>Números entre -2.147.483.647 y 2.147.483.647 </li></ul></ul></ul><ul><ul><li>Decimal </li></ul></ul><ul><ul><ul><li>Números entre -10E63 y 10E63. </li></ul></ul></ul><ul><ul><ul><li>18 Dígitos significativos. </li></ul></ul></ul><ul><ul><li>Char </li></ul></ul><ul><ul><ul><li>Números de 0 a 255 </li></ul></ul></ul><ul><ul><ul><li>Convertible libremente de entero a carácter. </li></ul></ul></ul><ul><ul><ul><li>Operable tanto como un entero como un carácter. </li></ul></ul></ul><ul><ul><li>Option </li></ul></ul><ul><ul><ul><li>Números entre -2.147.483.647 y 2.147.483.647. </li></ul></ul></ul><ul><ul><ul><li>Convertibles libremente de entero a opción. </li></ul></ul></ul>
  7. 7. Tipos de Datos - Simples <ul><li>De Cadena </li></ul><ul><ul><li>Text </li></ul></ul><ul><ul><ul><li>Cadenas de texto de hasta 1024 caracteres. </li></ul></ul></ul><ul><ul><ul><li>Sus caracteres son indexables. Ej: Nombre[3] </li></ul></ul></ul><ul><ul><li>Code </li></ul></ul><ul><ul><ul><li>Cadenas de texto de hasta 1024 caracteres en mayúsculas. </li></ul></ul></ul><ul><ul><ul><li>El sistema hace automáticamente la conversión y quita los espacios iniciales y finales. </li></ul></ul></ul><ul><ul><ul><li>Sus caracteres son indexables. Ej: CodFormaPago[3] </li></ul></ul></ul><ul><li>Otros </li></ul><ul><ul><li>Date </li></ul></ul><ul><ul><li>Time </li></ul></ul><ul><ul><li>Boolean </li></ul></ul><ul><ul><li>Variant </li></ul></ul>
  8. 8. Tipos de Datos - Complejos <ul><li>BLOB </li></ul><ul><li>Record </li></ul><ul><li>Form </li></ul><ul><li>Codeunit </li></ul><ul><li>File </li></ul><ul><li>Dialog </li></ul><ul><li>Report </li></ul><ul><li>Dataport </li></ul><ul><li>OCX </li></ul><ul><li>Automation </li></ul><ul><li>InStream </li></ul><ul><li>OutSream </li></ul>
  9. 9. Tipos de Datos - Valores constantes <ul><li>Numéricas </li></ul><ul><ul><li>Integer </li></ul></ul><ul><ul><ul><li>-2760 </li></ul></ul></ul><ul><ul><ul><li>Valor Nulo: 0 </li></ul></ul></ul><ul><ul><li>Decimal </li></ul></ul><ul><ul><ul><li>1234,56 </li></ul></ul></ul><ul><ul><ul><li>Valor Nulo: 0 </li></ul></ul></ul><ul><ul><li>Char </li></ul></ul><ul><ul><ul><li>‘ A’ </li></ul></ul></ul><ul><ul><ul><li>65 </li></ul></ul></ul><ul><ul><ul><li>Valor Nulo: ‘’ ó 0 </li></ul></ul></ul><ul><ul><li>Option (Cuenta,Producto,Recurso) </li></ul></ul><ul><ul><ul><li>NomVariable::Producto </li></ul></ul></ul><ul><ul><ul><li>1 </li></ul></ul></ul><ul><ul><ul><li>Valor nulo: 0 ó la opción correspondiente </li></ul></ul></ul>
  10. 10. Tipos de Datos - Valores constantes <ul><li>De Cadena </li></ul><ul><ul><li>Text </li></ul></ul><ul><ul><ul><li>‘ Huesca’ </li></ul></ul></ul><ul><ul><ul><li>Valor Nulo: ‘’ </li></ul></ul></ul><ul><ul><li>Code </li></ul></ul><ul><ul><ul><li>‘ HUESCA’ </li></ul></ul></ul><ul><ul><ul><li>Valor Nulo: ‘’ </li></ul></ul></ul>
  11. 11. Tipos de Datos - Valores constantes <ul><li>Otros </li></ul><ul><ul><li>Date (DDMMAA ó DDMMAAAA) </li></ul></ul><ul><ul><ul><li>140201D </li></ul></ul></ul><ul><ul><ul><li>Valor Nulo: 0D </li></ul></ul></ul><ul><ul><li>Time (HHMMSS[.XXX]) </li></ul></ul><ul><ul><ul><li>193432.345T </li></ul></ul></ul><ul><ul><ul><li>Valor Nulo: 0T </li></ul></ul></ul><ul><ul><li>Boolean </li></ul></ul><ul><ul><ul><li>TRUE ó FALSE </li></ul></ul></ul><ul><ul><ul><li>Valor Nulo: FALSE </li></ul></ul></ul>
  12. 12. Símbolos <ul><li>Los símbolos pueden ser: </li></ul><ul><ul><li>Variables </li></ul></ul><ul><ul><li>Constantes de texto </li></ul></ul><ul><ul><li>Funciones </li></ul></ul>
  13. 13. Símbolos - Variables <ul><li>Las variables son usadas para el almacenamiento de datos de diferentes tipos. </li></ul><ul><li>Pueden ser: </li></ul><ul><ul><li>Locales: Están visibles desde el trigger o función donde son definidas. </li></ul></ul><ul><ul><li>Globales: Están visibles desde todos los triggers y funciones del objeto donde son definidas. </li></ul></ul><ul><ul><li>Nota: No existen variables globales a todos los objetos de la base de datos, es decir, visibles desde todos los objetos. </li></ul></ul>
  14. 14. Símbolos - Variables <ul><li>¿Cómo se definen? </li></ul><ul><ul><li>Globales </li></ul></ul><ul><ul><ul><li>Ver, C/AL Globals, Variables </li></ul></ul></ul><ul><ul><li>Locales </li></ul></ul><ul><ul><ul><li>Ver, C/AL Locals, Variables </li></ul></ul></ul>
  15. 15. Símbolos - Variables <ul><li>¿Cómo se nombran? </li></ul><ul><ul><li>Máximo 30 caracteres. </li></ul></ul><ul><ul><li>El nombre no es sensible a mayúsculas. </li></ul></ul><ul><ul><li>No debe coincidir con el de otra variable o función perteneciente al mismo objeto </li></ul></ul><ul><ul><li>Recomendable que empiece por letra mayúscula o por subrayado. </li></ul></ul><ul><ul><li>Es posible, pero no recomendable: </li></ul></ul><ul><ul><ul><li>Usar espacios y caracteres especiales (º, %,...) </li></ul></ul></ul><ul><ul><ul><li>Usar vocales acentuadas </li></ul></ul></ul><ul><ul><ul><li>Empezar el nombre con un dígito o con algo distinto de: </li></ul></ul></ul><ul><ul><ul><ul><li>Un carácter alfabético </li></ul></ul></ul></ul><ul><ul><ul><ul><li>Un subrayado </li></ul></ul></ul></ul><ul><ul><ul><ul><li>NO RECOMENDABLE: RECOMENDABLE: </li></ul></ul></ul></ul><ul><ul><ul><ul><li>Límite Máximo LimiteMax </li></ul></ul></ul></ul><ul><ul><ul><ul><li>Nº Lote NoLote </li></ul></ul></ul></ul><ul><ul><ul><ul><li>% Terminado PctTerminado </li></ul></ul></ul></ul>
  16. 16. Símbolos - Variables <ul><li>Array de variables </li></ul><ul><ul><li>Se definen con la propiedad Dimensions de la variable </li></ul></ul><ul><ul><li>Se las referencia con corchetes. </li></ul></ul><ul><ul><li>Ej: VtasClieDL[2] </li></ul></ul>
  17. 17. Símbolos - Variables <ul><li>Manipulación de objetos. </li></ul><ul><ul><li>A través de variables de tipos complejos </li></ul></ul><ul><ul><ul><li>Table (Record) </li></ul></ul></ul><ul><ul><ul><li>Form </li></ul></ul></ul><ul><ul><ul><li>Codeunit </li></ul></ul></ul><ul><ul><ul><li>Report </li></ul></ul></ul><ul><ul><ul><li>Dataport </li></ul></ul></ul>
  18. 18. Símbolos - Variables <ul><li>Variables de usuario (user-defined variables) el programador las declara expresamente </li></ul><ul><li>Variables del sistema (system-defined variables) </li></ul><ul><ul><li>C/SIDE las crea y deja disponibles para el programador en ciertos contextos </li></ul></ul><ul><ul><li>Rec: cuando se modifica un registro, Rec contiene el registro en su estado modificado. </li></ul></ul><ul><ul><li>xRec: cuando se modifica un registro, xRec contiene el registro antes de la modificación. </li></ul></ul><ul><ul><li>CurrForm: variable que representa el objeto Form actual. </li></ul></ul><ul><ul><li>CurrReport: variable que representa el objeto Report actual. </li></ul></ul><ul><ul><li>RequestOptionsForm: variable que representa el formulario de diálogo de entrada al objeto Report actual. </li></ul></ul><ul><ul><li>CurrFieldNo: el número de campo del campo actual desde el que se llamó al disparador. </li></ul></ul>
  19. 19. Símbolos - Variables <ul><li>Inicialización de variables </li></ul><ul><ul><li>C/SIDE las inicializa automáticamente </li></ul></ul><ul><ul><ul><li>Boolean: FALSE </li></ul></ul></ul><ul><ul><ul><li>Numéricas: 0 </li></ul></ul></ul><ul><ul><ul><li>De cadena: '' </li></ul></ul></ul><ul><ul><ul><li>Date: 0D </li></ul></ul></ul><ul><ul><ul><li>Time: 0T </li></ul></ul></ul><ul><ul><li>Las variables de sistema se inicializarán a un valor adecuado según el contexto </li></ul></ul>
  20. 20. Símbolos - Variables <ul><li>Asignación de valores a variables. </li></ul><ul><ul><li>Con operador de asignación (:=) </li></ul></ul><ul><ul><ul><li>Ej: MiTexto := 'Almería'; </li></ul></ul></ul><ul><ul><ul><li>MiFecha := 010385D; </li></ul></ul></ul><ul><ul><ul><li>Acabado := TRUE; </li></ul></ul></ul><ul><ul><li>En el momento de invocar a una función con parámetros </li></ul></ul><ul><ul><ul><li>Ej: IncrementarFecha(030195D); </li></ul></ul></ul><ul><ul><ul><li>function IncrementarFecha(FechaInicial) </li></ul></ul></ul><ul><ul><ul><li>BEGIN </li></ul></ul></ul><ul><ul><ul><li> ... </li></ul></ul></ul><ul><ul><ul><li>END </li></ul></ul></ul><ul><ul><ul><li>Se asigna el valor 030195D al parámetro FechaInicial </li></ul></ul></ul>
  21. 21. Símbolos - Funciones de usuario <ul><li>Cómo se definen </li></ul><ul><ul><li>Ver, C/AL Globals, Functions </li></ul></ul><ul><li>Cómo se nombran </li></ul><ul><ul><li>Siguen las mismas reglas que las variables </li></ul></ul><ul><li>Parámetros de entrada </li></ul><ul><ul><li>Por referencia </li></ul></ul><ul><ul><li>Por valor </li></ul></ul><ul><li>Parámetro de salida </li></ul><ul><ul><li>Instrucción EXIT </li></ul></ul><ul><ul><li>Ej: EXIT(TRUE); </li></ul></ul><ul><li>Invocación de función </li></ul><ul><ul><li>Ok := AsistEdic(Rec,TRUE) </li></ul></ul>
  22. 22. Símbolos - Constantes de texto <ul><li>Pueden ser: </li></ul><ul><ul><li>Locales: Están visibles desde el trigger o función donde son definidas. </li></ul></ul><ul><ul><li>Globales: Están visibles desde todos los triggers y funciones del objeto donde son definidas. </li></ul></ul><ul><li>Cómo se definen </li></ul><ul><ul><li>Globales: Ver, C/AL Globals, Text Constant </li></ul></ul><ul><ul><li>Locales: Ver, C/AL Locals, Text Constant </li></ul></ul>
  23. 23. Expresiones <ul><li>Qué son. </li></ul><ul><li>Tipos de expresión </li></ul><ul><ul><li>Numéricas </li></ul></ul><ul><ul><li>Logicas </li></ul></ul><ul><ul><li>Relacionales </li></ul></ul>
  24. 24. Operadores <ul><li>Operador de C/AL Significado </li></ul><ul><li>. Referencia </li></ul><ul><li>( ) paréntesis </li></ul><ul><li>[ ] indización </li></ul><ul><li>:: ámbito </li></ul><ul><li>+ suma </li></ul><ul><li>- resta </li></ul><ul><li>* multiplicación </li></ul><ul><li>/ división </li></ul><ul><li>DIV división entera </li></ul><ul><li>MOD resto </li></ul>
  25. 25. Operadores <ul><li>Operador de C/AL Significado </li></ul><ul><li>> mayor que </li></ul><ul><li>>= mayor o igual que </li></ul><ul><li>< menor que </li></ul><ul><li><= menor o igual que </li></ul><ul><li>= igual a </li></ul><ul><li><> diferente de </li></ul><ul><li>IN pertenencia a un rango (conjunto) </li></ul><ul><li>AND Y lógico </li></ul><ul><li>OR O lógico </li></ul><ul><li>NOT negación lógica </li></ul><ul><li>XOR O excluyente lógico </li></ul><ul><li>.. Rango </li></ul>
  26. 26. Operadores - Precedencia <ul><li>1. . campo de un registro </li></ul><ul><li>[ ] indexación </li></ul><ul><li>() paréntesis </li></ul><ul><li>:: ámbito </li></ul><ul><li>2. NOT negación lógica </li></ul><ul><li>- signo negativo </li></ul><ul><li>+ signo positivo </li></ul><ul><li>3. * multiplicación </li></ul><ul><li>/ división decimal </li></ul><ul><li>DIV división entera </li></ul><ul><li>MOD resto </li></ul><ul><li>AND Y lógico </li></ul><ul><li>XOR O excluyente lógico </li></ul><ul><li>4. + suma </li></ul><ul><li>- resta </li></ul><ul><li>OR O lógico </li></ul><ul><li>5. > mayor que </li></ul><ul><li>< menor que </li></ul><ul><li>>= mayor o igual que </li></ul><ul><li><= menor o igual que </li></ul><ul><li>= igual que </li></ul><ul><li><> distinto de </li></ul><ul><li>IN pertenencia a conjunto </li></ul><ul><li>6. .. rango </li></ul>
  27. 27. Estructuras de control Instrucciones compuestas <ul><li>Begin – End </li></ul><ul><ul><li>BEGIN </li></ul></ul><ul><ul><li><sentencia1>; </li></ul></ul><ul><ul><li><sentencia2>; </li></ul></ul><ul><ul><li>··· </li></ul></ul><ul><ul><li><sentencian>; </li></ul></ul><ul><ul><li>END </li></ul></ul>
  28. 28. Estructuras de control Instrucciones condicionales <ul><li>If - Then - Else </li></ul><ul><ul><li>IF <ExprLógica> THEN </li></ul></ul><ul><ul><li><sentencia1> </li></ul></ul><ul><ul><li>[ELSE </li></ul></ul><ul><ul><li><sentencia2>]; </li></ul></ul><ul><li>Case </li></ul><ul><ul><li>CASE <Expresión> OF </li></ul></ul><ul><ul><li><Valor1>: </li></ul></ul><ul><ul><li><sentencia1>; </li></ul></ul><ul><ul><li><Valor2>: </li></ul></ul><ul><ul><li><sentencia2>; </li></ul></ul><ul><ul><li>··· </li></ul></ul><ul><ul><li><ValorN>: </li></ul></ul><ul><ul><li><sentenciaN>; </li></ul></ul><ul><ul><li>[ELSE </li></ul></ul><ul><ul><li><sentenciaAlt>] </li></ul></ul><ul><ul><li>END; </li></ul></ul>
  29. 29. Estructuras de control Instrucciones repetitivas <ul><li>For - To/Downto </li></ul><ul><ul><li>FOR <VarControl> := <ValInicio> {TO|DOWNTO} <ValFin> </li></ul></ul><ul><ul><li><sentencia>; </li></ul></ul><ul><li>While - Do </li></ul><ul><ul><li>WHILE <ExprLógica> DO </li></ul></ul><ul><ul><li><sentencia>; </li></ul></ul><ul><li>Repeat - Until </li></ul><ul><ul><li>REPEAT </li></ul></ul><ul><ul><li><sentencia1>; </li></ul></ul><ul><ul><li>··· </li></ul></ul><ul><ul><li><sentenciaN>; </li></ul></ul><ul><ul><li>UNTIL <ExprLógica> </li></ul></ul><ul><li>Exit </li></ul>
  30. 30. Estructuras de control - Otras <ul><li>With - Do </li></ul><ul><ul><li>WITH <Record> DO </li></ul></ul><ul><ul><li><sentencia>; </li></ul></ul>
  31. 31. Editando C/AL <ul><li>Aspectos a tener en cuenta </li></ul><ul><ul><li>C/AL no distingue entre mayusculas y minusculas </li></ul></ul><ul><ul><li>Comentarios </li></ul></ul><ul><ul><ul><li>Sección Documentation </li></ul></ul></ul><ul><ul><ul><li>Línea comentario // </li></ul></ul></ul><ul><ul><ul><li>Bloque comentado { } </li></ul></ul></ul><ul><ul><li>C/AL Symbol Menu sólo funciona en el editor de código. No funciona en la ventana de propiedades </li></ul></ul>
  32. 32. Funciones - Acceso a tablas <ul><li>Acceso </li></ul><ul><ul><li>Variable de tipo Record que apunta a la tabla </li></ul></ul><ul><ul><li>El registro suele declararse explícitamente </li></ul></ul><ul><ul><li>A veces, el registro se crea implícitamente </li></ul></ul><ul><ul><ul><li>en disparadores de tabla: registros actual (Rec) y anterior (xRec) </li></ul></ul></ul><ul><ul><ul><li>en disparadores de informes: una variable por cada DataItem que se barre </li></ul></ul></ul>
  33. 33. Funciones - Acceso a tablas <ul><li>Acceso a un registro conociendo su clave primaria </li></ul><ul><ul><li>Función GET </li></ul></ul><ul><ul><ul><li>Uso: localiza un registro con un valor específico de su clave primaria </li></ul></ul></ul><ul><ul><ul><li>Sintaxis: [<Ok> :=] <Record>.GET([<Value>],...) </li></ul></ul></ul><ul><ul><ul><li>Ejemplo: CustLedgEntry.GET(59); </li></ul></ul></ul>53 1-1-95 10.000 54 1-1-95 -4.000 55 2-1-95 7.000 56 3-1-95 5.000 57 3-1-95 2.000 58 3-1-95 -8.000 59 4-1-95 3.000 60 8-1-95 6.000 61 8-1-95 12.000 Entry No. Amount Posting Date
  34. 34. Funciones - Acceso a tablas <ul><li>Barrido de un rango de registros de una tabla (1) </li></ul><ul><ul><li>Pasos </li></ul></ul><ul><ul><ul><li>Activación de una clave adecuada. </li></ul></ul></ul><ul><ul><ul><li>Establecimiento de los filtros necesarios para definir el rango de registros. </li></ul></ul></ul><ul><ul><ul><li>Posicionamiento en un “primer” registro. </li></ul></ul></ul><ul><ul><ul><li>Barrido de los registros del rango. </li></ul></ul></ul><ul><ul><li>Funciones </li></ul></ul><ul><ul><ul><li>SETCURRENTKEY. </li></ul></ul></ul><ul><ul><ul><li>SETRANGE y SETFILTER </li></ul></ul></ul><ul><ul><ul><li>FIND </li></ul></ul></ul><ul><ul><ul><li>NEXT </li></ul></ul></ul>
  35. 35. Funciones - Acceso a tablas <ul><li>Barrido de un rango de registros de una tabla (2) </li></ul>CustLedgEntry.SETCURRENTKEY( “ Posting Date ” ) CustLedgEntry.SETCURRENTKEY(Amount) CustLedgEntry .SETRANGE(“Posting Date”,020195D,040195D) Entry No. -8.000 3-1-95 58 -4.000 1-1-95 54 2.000 3-1-95 57 3.000 4-1-95 59 5.000 3-1-95 56 6.000 8-1-95 60 7.000 2-1-95 55 10.000 1-1-95 53 12.000 8-1-95 61 Amount Posting Date Entry No. 1-1-95 10.000 53 1-1-95 -4.000 54 2-1-95 7.000 55 3-1-95 5.000 56 3-1-95 2.000 57 3-1-95 -8.000 58 4-1-95 3.000 59 8-1-95 6.000 60 8-1-95 12.000 61 Posting Date Amount CustLedgEntry .NEXT CustLedgEntry .FIND('-') CustLedgEntry .FIND('+') CustLedgEntry .NEXT(-1)
  36. 36. Funciones - Acceso a tablas <ul><li>Barrido de un rango de registros de una tabla (3) </li></ul><ul><ul><li>Función SETCURRENTKEY </li></ul></ul><ul><ul><ul><li>Uso: Activa una clave de la tabla. </li></ul></ul></ul><ul><ul><ul><li>Sintaxis: [<Ok> :=] <Record>.SETCURRENTKEY(<Field1>, [<Field2>,...]) </li></ul></ul></ul><ul><ul><li>Función SETRANGE </li></ul></ul><ul><ul><ul><li>Uso: Establece un filtro simple sobre un campo para definir un rango de registros. </li></ul></ul></ul><ul><ul><ul><li>Sintaxis: <Record>.SETRANGE(<Field> [,<FromValue>[,<ToValue>]]) </li></ul></ul></ul><ul><ul><li>Función SETFILTER </li></ul></ul><ul><ul><ul><li>Uso: Establece un filtro complejo sobre un campo para definir un rango de registros. </li></ul></ul></ul><ul><ul><ul><li>Sintaxis: <Record>.SETFILTER(<Field>,<String>,[<Value>,...]) </li></ul></ul></ul><ul><ul><li>Función FIND </li></ul></ul><ul><ul><ul><li>Uso: Hace a la variable apuntar a un registro del rango. </li></ul></ul></ul><ul><ul><ul><li>Sintaxis: [<Ok> :=] <Record>.FIND([<Which>]) </li></ul></ul></ul><ul><ul><li>Función NEXT </li></ul></ul><ul><ul><ul><li>Uso: Hace a la variable avanzar “Steps” registros adelante y apuntar a uno nuevo. </li></ul></ul></ul><ul><ul><ul><li>Sintaxis: <Steps> := Record.NEXT([<Steps>]) </li></ul></ul></ul>
  37. 37. Funciones - Acceso a tablas <ul><li>Barrido de un rango de registros de una tabla (4) </li></ul><ul><ul><li>Código necesario </li></ul></ul>
  38. 38. Funciones - Filtros <ul><li>Examinar filtros </li></ul><ul><ul><li>Función GETFILTER </li></ul></ul><ul><ul><ul><li>Uso: devuelve en forma de cadena el filtro que esté activo para el campo </li></ul></ul></ul><ul><ul><ul><li>Sintáxis: <String> := <Record>.GETFILTER(<Field>) </li></ul></ul></ul><ul><ul><li>Función GETFILTERS </li></ul></ul><ul><ul><ul><li>Uso: devuelve en forma de cadena todos los filtros que estén activos para cualquier campo </li></ul></ul></ul><ul><ul><ul><li>Sintáxis: <String> := <Record>.GETFILTERS </li></ul></ul></ul><ul><ul><li>Función GETRANGEMIN </li></ul></ul><ul><ul><ul><li>Uso: devuelve el valor mínimo de un filtro (da error si el filtro no tiene forma de intervalo continuo) </li></ul></ul></ul><ul><ul><ul><li>Sintáxis: <Value> := <Record>.GETRANGEMIN(<Field>) </li></ul></ul></ul><ul><ul><li>Función GETRANGEMAX </li></ul></ul><ul><ul><ul><li>Uso: devuelve el valor máximo de un filtro (da error si el filtro no tiene forma de intervalo continuo) </li></ul></ul></ul><ul><ul><ul><li>Sintáxis: <Value> := <Record>.GETRANGEMAX(<Field>) </li></ul></ul></ul>
  39. 39. Funciones - Filtros <ul><li>Copiar filtros </li></ul><ul><ul><li>Función COPYFILTER </li></ul></ul><ul><ul><ul><li>Uso: Aplica a un campo de un registro el filtro que esté definido en el mismo campo de otro registro </li></ul></ul></ul><ul><ul><ul><li>Sintaxis: <Record>.COPYFILTER(<FromField>,<ToRecord>.<ToField>) </li></ul></ul></ul><ul><ul><li>Función COPYFILTERS </li></ul></ul><ul><ul><ul><li>Uso: aplica a los campos de un registro los filtros que estén definidos para otro registro </li></ul></ul></ul><ul><ul><ul><li>Sintaxis: <Record>.COPYFILTERS(<FromRecord>) </li></ul></ul></ul>
  40. 40. Funciones - Filtros <ul><li>Grupos de filtros </li></ul><ul><ul><li>Hay grupos de filtros desde 0 a 255 </li></ul></ul><ul><ul><ul><li>Nº Nomb. Descripción </li></ul></ul></ul><ul><ul><ul><li>0 Std Es el grupo por defecto. Es usado para establecer los filtros por el usuario en tiempo de ejecución. </li></ul></ul></ul><ul><ul><ul><li>1 Global No usado. </li></ul></ul></ul><ul><ul><ul><li>2 Form Usado para filtros resultantes de la función SETTABLEVIEW, de la propiedad SourceTableView; y de la propiedad DataItemTableView. </li></ul></ul></ul><ul><ul><ul><li>3 Exec Usado para filtros resultantes de las propiedades SubFormView y RunFormView. </li></ul></ul></ul><ul><ul><ul><li>4 Link Usado para filtros resultantes de las propiedades DataItemLink y SubFormLink. </li></ul></ul></ul><ul><ul><ul><li>5 Temp No usado. </li></ul></ul></ul><ul><ul><ul><li>6 - Para uso del programador </li></ul></ul></ul><ul><ul><li>Función FILTERGROUP </li></ul></ul><ul><ul><ul><li>Uso: Selecciona o informa del grupo actual </li></ul></ul></ul><ul><ul><ul><li>Sintaxis: [<CurrGroup>] := <Record>.FILTERGROUP([<NewGroup>]) </li></ul></ul></ul><ul><ul><li>Una vez seleccionado un grupo de filtro para una variable de tipo Record, los filtros que se apliquen sobre esa variable van aplicados en ese grupo. </li></ul></ul>
  41. 41. Funciones - Filtros <ul><li>Registros marcados </li></ul><ul><ul><li>Función MARKEDONLY </li></ul></ul><ul><ul><ul><li>Uso: para seleccionar sólo los registros que estén marcados por el usuario o por el progama </li></ul></ul></ul><ul><ul><ul><li>Sintaxis: [<IsMarkedOnly>] := <Record>.MARKEDONLY([<SetMarkedOnly>]) </li></ul></ul></ul><ul><ul><ul><li>Observaciones: </li></ul></ul></ul><ul><ul><ul><ul><li>Las marcas se almacenan en una tabla temporal en el cliente, ordenadas por la clave primaria. </li></ul></ul></ul></ul><ul><ul><ul><ul><li>IMPORTANTE: para no penalizar el rendimiento, deber usarse en conjunción con la clave primaria. </li></ul></ul></ul></ul><ul><ul><li>Función MARK </li></ul></ul><ul><ul><ul><li>Uso: Para marcar/desmarcar un registro o saber si un registro determinado está marcado </li></ul></ul></ul><ul><ul><ul><li>Sintaxis: [IsMarked] := Record.MARK([SetMarked]) </li></ul></ul></ul>
  42. 42. Funciones SumIndexFields y FlowFields <ul><li>SumIndexFields </li></ul><ul><ul><li>Función CALCSUMS </li></ul></ul><ul><ul><ul><li>Uso: Devuelve la suma para uno (o varios) SumIndexField </li></ul></ul></ul><ul><ul><ul><li>Sintaxis: [<Ok> :=] <Record>.CALCSUMS (<Field1>, [<Field2>,…]) </li></ul></ul></ul><ul><ul><ul><li>Observaciones: </li></ul></ul></ul><ul><ul><ul><ul><li>Debe estar activa una clave para la que se haya definido el campo </li></ul></ul></ul></ul><ul><ul><ul><ul><li>No debe haber filtros en campos fuera de la clave </li></ul></ul></ul></ul><ul><ul><ul><ul><li>Si no se cumplen las condiciones anteriores, se devuelve FALSE (o se lanza un mensaje de error) </li></ul></ul></ul></ul><ul><ul><ul><li>Ejemplo: </li></ul></ul></ul>
  43. 43. Funciones SumIndexFields y FlowFields <ul><li>FlowFields </li></ul><ul><ul><li>Función CALCFIELDS </li></ul></ul><ul><ul><ul><li>Uso: calcula uno o más FlowFields </li></ul></ul></ul><ul><ul><ul><li>Sintaxis: [<Ok> :=] <Record>.CALCFIELDS(<Field1>, [<Field2>,…]) </li></ul></ul></ul><ul><ul><ul><li>Ejemplo: </li></ul></ul></ul><ul><ul><ul><ul><li>Cliente.SETRANGE(&quot;Filtro fechas&quot;,010199D,123102D); </li></ul></ul></ul></ul><ul><ul><ul><ul><li>Cliente.CALCFIELDS(Saldo,&quot;Saldo periodo&quot;); </li></ul></ul></ul></ul><ul><li>Contando registros </li></ul><ul><ul><li>Función COUNT </li></ul></ul><ul><ul><ul><li>Uso: cuenta los registros existentes dentro de un rango </li></ul></ul></ul><ul><ul><ul><li>Sintaxis: <Number> := <Record>.COUNT </li></ul></ul></ul><ul><ul><ul><li>Ejemplo: </li></ul></ul></ul><ul><ul><ul><ul><li>MovCli.SETRANGE(&quot;Nº cliente&quot;, 'AAA 1050'); </li></ul></ul></ul></ul><ul><ul><ul><ul><li>MovCli.SETRANGE(&quot;Fecha registro&quot;, 010199D, 123102D); </li></ul></ul></ul></ul><ul><ul><ul><ul><li>Numero := MovCli.COUNT; </li></ul></ul></ul></ul><ul><ul><ul><li>Observaciones: No se beneficia de la tecnología SIFT </li></ul></ul></ul>
  44. 44. Funciones - Acceso a tablas <ul><li>Inicialización de registros </li></ul><ul><ul><li>Función INIT </li></ul></ul><ul><ul><ul><li>Uso: Inicializa un variable de tipo record </li></ul></ul></ul><ul><ul><ul><li>Sintaxis: <Record>.INIT </li></ul></ul></ul><ul><ul><ul><li>Observaciones: El sistema no inicializa los campos de la clave primaria. </li></ul></ul></ul><ul><li>Inserción de registros </li></ul><ul><ul><li>Función INSERT </li></ul></ul><ul><ul><ul><li>Uso : Inserta el registro en la tabla </li></ul></ul></ul><ul><ul><ul><li>Sintaxis: [<Ok> :=] <Record>.INSERT([<RunTrigger>]) </li></ul></ul></ul><ul><ul><ul><li>Observaciones: </li></ul></ul></ul><ul><ul><ul><ul><li>La ejecución del trigger OnInsert de la tablas es opcional. Por defecto NO se ejecuta. </li></ul></ul></ul></ul><ul><ul><ul><ul><li>Si existe un registro con la misma clave primaria devuelve FALSE o lanza un error. </li></ul></ul></ul></ul>
  45. 45. Funciones - Acceso a tablas <ul><li>Borrado de registros </li></ul><ul><ul><li>Función DELETE </li></ul></ul><ul><ul><ul><li>Uso : Borra el registro al que apunta la variable de la tabla </li></ul></ul></ul><ul><ul><ul><li>Sintaxis: [<Ok> :=] <Record>.DELETE([<RunTrigger>]) </li></ul></ul></ul><ul><ul><ul><li>Observaciones: </li></ul></ul></ul><ul><ul><ul><ul><li>La ejecución del trigger OnDelete de la tablas es opcional. Por defecto NO se ejecuta. </li></ul></ul></ul></ul><ul><ul><ul><ul><li>Devuelve FALSE o lanza un error si no consigue borrar el registro. </li></ul></ul></ul></ul><ul><ul><li>Función DELETEALL </li></ul></ul><ul><ul><ul><li>Uso : Borra los registros del rango seleccionado a través de la variable. </li></ul></ul></ul><ul><ul><ul><li>Sintaxis: Record.DELETEALL([RunTrigger]) </li></ul></ul></ul><ul><ul><ul><li>Observaciones: La ejecución del trigger OnDelete de la tablas es opcional. Por defecto NO se ejecuta. </li></ul></ul></ul>
  46. 46. Funciones - Acceso a tablas <ul><li>Modificación de registros (1) </li></ul><ul><ul><li>Copia de registros </li></ul></ul><ul><ul><ul><li>Sentencia de asignación: </li></ul></ul></ul><ul><ul><ul><ul><li>Uso: Copia el valor de los campos. </li></ul></ul></ul></ul><ul><ul><ul><ul><li>Sintaxis: <Record> := <FromRecord> </li></ul></ul></ul></ul><ul><ul><ul><li>Función COPY </li></ul></ul></ul><ul><ul><ul><ul><li>Uso: Copia el valor de los campos y los filtros asignados sobre ellos. </li></ul></ul></ul></ul><ul><ul><ul><ul><li>Sintaxis: <Record>.COPY(<FromRecord>) </li></ul></ul></ul></ul><ul><ul><ul><li>Función TRANSFERFIELDS </li></ul></ul></ul><ul><ul><ul><ul><li>Uso: Copia el valor de los campos con mismo número de campo y tipo de dato. </li></ul></ul></ul></ul><ul><ul><ul><ul><li>Sintaxis: <Record>.TRANSFERFIELDS(<FromRecord> ) </li></ul></ul></ul></ul>
  47. 47. Funciones - Acceso a tablas <ul><li>Modificación de registros (2) </li></ul><ul><ul><li>Asignación de valores a campos normales </li></ul></ul><ul><ul><ul><li>Sentencia de asignación: </li></ul></ul></ul><ul><ul><ul><ul><li>Uso: Asigna un valor a un campo. </li></ul></ul></ul></ul><ul><ul><ul><ul><li>Sintaxis: <Field> := <Value> </li></ul></ul></ul></ul><ul><ul><ul><li>Función VALIDATE </li></ul></ul></ul><ul><ul><ul><ul><li>Uso: Ejecuta el trigger OnValidate del campo y opcionalmente le asigna un valor. </li></ul></ul></ul></ul><ul><ul><ul><ul><li>Sintaxis: <Record>.VALIDATE(<Field> [,<NewValue>]) </li></ul></ul></ul></ul><ul><ul><li>Asignación de valores a campos FlowFilter </li></ul></ul><ul><ul><ul><li>Uso de las funciones SETRANGE y SETFILTER </li></ul></ul></ul><ul><ul><ul><li>NO usar la sentecia de asignación ni la función VALIDATE </li></ul></ul></ul>
  48. 48. Funciones - Acceso a tablas <ul><li>Modificación de registros (3) </li></ul><ul><ul><li>Asignación de valores a campos BLOB </li></ul></ul><ul><ul><ul><li>Sentencia IMPORT </li></ul></ul></ul><ul><ul><ul><ul><li>Uso: Importa un valor binario a un campo BLOB. </li></ul></ul></ul></ul><ul><ul><ul><ul><li>Sintaxis: [<ImportName> :=] <Blob>.IMPORT([<Name>[,<CommonDialog>]]) </li></ul></ul></ul></ul><ul><ul><ul><li>Otras funciones relacionadas: </li></ul></ul></ul><ul><ul><ul><ul><li>Función EXPORT </li></ul></ul></ul></ul><ul><ul><ul><ul><li>Función HASVALUE </li></ul></ul></ul></ul><ul><ul><ul><li>Ejemplo </li></ul></ul></ul>
  49. 49. Funciones - Acceso a tablas <ul><li>Modificación de registros (4) </li></ul><ul><ul><li>Grabación de las modificaciones </li></ul></ul><ul><ul><ul><li>Sentencia MODIFY </li></ul></ul></ul><ul><ul><ul><ul><li>Uso: Graba en la base de datos las modificaciones hechas en los campos (no pertenecientes a la clave primaria) de un registro. </li></ul></ul></ul></ul><ul><ul><ul><ul><li>Sintaxis: [<Ok> :=] <Record>.MODIFY([<RunTrigger>]) </li></ul></ul></ul></ul><ul><ul><ul><li>Sentencia MODIFYALL </li></ul></ul></ul><ul><ul><ul><ul><li>Uso: Modifica el valor de un campo en todo los regitros seleccionados a través de la variable. </li></ul></ul></ul></ul><ul><ul><ul><ul><li>Sintaxis: <Record>.MODIFYALL(<Field>,<NewValue> [,<RunTrigger>]) </li></ul></ul></ul></ul><ul><ul><ul><li>Sentencia RENAME </li></ul></ul></ul><ul><ul><ul><ul><li>Uso: Cambia el valor de los campos que forman la clave primaria de una tabla </li></ul></ul></ul></ul><ul><ul><ul><ul><li>Sintaxis: [<Ok>:= ]<Record>.RENAME(<Value1>, [<Value2>,...]) </li></ul></ul></ul></ul>
  50. 50. Funciones - Transacciones <ul><li>Commit </li></ul><ul><ul><li>Una transacción es una serie de operaciones, de tal manera que se deben ejecutan todas ellas o ninguna </li></ul></ul><ul><ul><li>Por omisión, una transacción dura desde que el usuario pierde del control hasta que lo recobra. </li></ul></ul><ul><ul><li>Al concluir la transacción, se produce un COMMIT implícito </li></ul></ul><ul><ul><li>El programador puede forzar un COMMIT para concluir una transacción </li></ul></ul><ul><ul><li>Al acabar la transacción por cualquier sistema, se liberan todos los bloqueos que puedan haberse creado en las tablas implicadas en la transacción </li></ul></ul><ul><ul><li>Función COMMIT </li></ul></ul><ul><ul><ul><li>Uso: Fuerza la finalización de la transacción actual. </li></ul></ul></ul><ul><ul><ul><li>Sintaxis: COMMIT </li></ul></ul></ul>
  51. 51. Funciones - Transacciones <ul><li>Rollback </li></ul><ul><ul><li>Rollback implícito cuando la ejecución se interrumpe: </li></ul></ul><ul><ul><ul><li>por causas físicas (caída de tensión) </li></ul></ul></ul><ul><ul><ul><li>por causas lógicas (error en ejecución) </li></ul></ul></ul><ul><ul><ul><ul><li>división por cero </li></ul></ul></ul></ul><ul><ul><ul><ul><li>imposibilidad de insertar registro </li></ul></ul></ul></ul><ul><ul><ul><ul><li>... </li></ul></ul></ul></ul><ul><ul><ul><li>por acción del usuario (interrupción de proceso) </li></ul></ul></ul><ul><ul><li>Rollback explícito </li></ul></ul><ul><ul><ul><li>Función ERROR </li></ul></ul></ul><ul><ul><ul><ul><li>Uso: Muestra un mensaje de error y fuerza un rollback </li></ul></ul></ul></ul><ul><ul><ul><ul><li>Sintaxis: ERROR(<String> [,<Value1>,...]) </li></ul></ul></ul></ul>
  52. 52. Funciones - Transacciones <ul><li>Bloqueos (1) </li></ul><ul><ul><li>Bloqueo implícito desde que se produce una escritura hasta que finaliza la transacción. </li></ul></ul><ul><ul><li>Bloqueo explícito </li></ul></ul><ul><ul><ul><li>Función LOCKTABLE </li></ul></ul></ul><ul><ul><ul><ul><li>Uso: Bloque una tabla hasta el final de la transacción actual </li></ul></ul></ul></ul><ul><ul><ul><ul><li>Sintaxis: <Record>.LOCKTABLE([<Wait>][,<VersionCheck>]) </li></ul></ul></ul></ul><ul><ul><ul><li>Función RECORDLEVELLOCKING </li></ul></ul></ul><ul><ul><ul><ul><li>Uso: Informa si se bloque a nivel de tabla (Navision Server) o a nivel de registro (SQL Server) </li></ul></ul></ul></ul><ul><ul><ul><ul><li>Sintaxis: Ok := Record.RECORDLEVELLOCKING </li></ul></ul></ul></ul>
  53. 53. Funciones - Transacciones <ul><li>Bloqueos (2) </li></ul><ul><ul><li>Bloqueo Navision Server VS Navision con opción SQL Server </li></ul></ul>Error, opción no posible. Comprueba la versión del dato, si no ha sido modificado bloquea la tabla. En caso contrario produce error. LOCKTABLE(<···>,TRUE) Bloquea Registro Bloquea Tabla LOCKTABLE SQL Server Navision Server Instrucción
  54. 54. Funciones - Transacciones <ul><li>Bloqueos (3) </li></ul><ul><ul><li>Modos de actuación al realizar bloqueos </li></ul></ul>OK Bloqueo de tabla con control de versión Produce ERROR. Para evitarlo uso de RECORDLEVELLOCKING y FIND No se puede. Comprueba la versión y bloque la tabla o produce error LOCKTABLE(<···>,TRUE) Bloqueo de registro con control de versión Uso de RECORDLEVELLOCKING y FIND Ok Bloqueo de tabla Ok No se puede. Se bloque toda la tabla LOCKTABLE Bloqueo de registro SQL Server Navision Server Instrucción Intención
  55. 55. Funciones - Diálogos <ul><li>Función MESSAGE </li></ul><ul><ul><li>Uso: Muestra un mensaje en pantalla. </li></ul></ul><ul><ul><li>Sintaxis: MESSAGE(String [, Value1, ...]) </li></ul></ul><ul><li>Función CONFIRM </li></ul><ul><ul><li>Uso: Muestra un mensaje en pantalla con opciones Ok y Cancel. </li></ul></ul><ul><ul><li>Sintaxis: <Ok> := CONFIRM(<String>[,<Default>][,<Value1>,…]) </li></ul></ul><ul><li>Función STRMENU </li></ul><ul><ul><li>Uso: Muestra una ventana de opciones. </li></ul></ul><ul><ul><li>Sintaxis: <OptNum ber > := STRMENU(<OptStr>[,<DefNumber>]) </li></ul></ul>
  56. 56. Funciones - Diálogos <ul><li>Diálogos complejos (1) </li></ul><ul><ul><li>Acceso a través de una variable de tipo Dialog </li></ul></ul>
  57. 57. Funciones - Diálogos <ul><li>Diálogos complejos (2) </li></ul><ul><ul><li>Función OPEN </li></ul></ul><ul><ul><ul><li>Uso: Abre una ventana de diálogo </li></ul></ul></ul><ul><ul><ul><li>Sintaxis: <Dialog>.OPEN(<String>[,<Variable1>,…]) </li></ul></ul></ul><ul><ul><li>Función UPDATE </li></ul></ul><ul><ul><ul><li>Uso: Actualiza el valor mostrado en un campo de una ventana de diálogo </li></ul></ul></ul><ul><ul><ul><li>Sintaxis: <Dialog>.UPDATE([<Number>][,<Value>]) </li></ul></ul></ul><ul><ul><li>Función INPUT </li></ul></ul><ul><ul><ul><li>Uso: Permite introducir un valor en un campo de una ventana de diálogo </li></ul></ul></ul><ul><ul><ul><li>Sintaxis: <NewControlID> := <Dialog>.INPUT([<ControlID>][,<Variable>]) </li></ul></ul></ul><ul><ul><li>Función CLOSE </li></ul></ul><ul><ul><ul><li>Uso: Cierra una ventana de dialogo </li></ul></ul></ul><ul><ul><ul><li>Sintaxis: <Dialog>.CLOSE </li></ul></ul></ul>
  58. 58. Funciones - Diálogos <ul><li>Diálogos complejos (3) </li></ul><ul><ul><li>Ejemplo: </li></ul></ul>
  59. 59. Funciones - Acceso a objetos <ul><li>Acceso a objetos </li></ul><ul><ul><li>Acceso a través de una variable de usuario (creando una instancia) </li></ul></ul><ul><ul><ul><li>Se debe definir una variable del tipo de objeto al que se quiere acceder. </li></ul></ul></ul><ul><ul><ul><li>El objeto a ejecutar se define en tiempo de diseño. </li></ul></ul></ul><ul><ul><li>Acceso a través de una variable genérica (llamando al objeto de manera directa) </li></ul></ul><ul><ul><ul><li>No hay que definir una variable de usuario. </li></ul></ul></ul><ul><ul><ul><li>El objeto a ejecutar se puede definir en tiempo de ejecución. </li></ul></ul></ul>
  60. 60. Funciones Acceso a formularios con variable de usuario <ul><li>Acceso a formularios (1) </li></ul><ul><ul><li>Ejecución </li></ul></ul><ul><ul><ul><li>Función RUN </li></ul></ul></ul><ul><ul><ul><ul><li>Uso: Ejecuta un formulario en modo normal </li></ul></ul></ul></ul><ul><ul><ul><ul><li>Sintaxis: <form>.RUN </li></ul></ul></ul></ul><ul><ul><ul><li>Función RUNMODAL </li></ul></ul></ul><ul><ul><ul><ul><li>Uso: Ejecuta un formulario en modo Modal </li></ul></ul></ul></ul><ul><ul><ul><ul><li>Sintaxis: [<Action>] := <form>.RUNMODAL </li></ul></ul></ul></ul><ul><ul><li>Acceso a controles, funciones y propiedades </li></ul></ul><ul><ul><ul><li>Referenciándolos a partir de la variable </li></ul></ul></ul><ul><ul><ul><li>Controles: Sólo aquellos que tienen definido un nombre en su propiedad Name </li></ul></ul></ul><ul><ul><ul><li>Funciones de usuario: Sólo aquellas cuya propiedad Local=No </li></ul></ul></ul><ul><ul><ul><li>Propiedades: Sólo algunas son accesibles desde C/AL (en tiempo de ejecución) </li></ul></ul></ul><ul><ul><li>Re-inicialización de variable </li></ul></ul><ul><ul><ul><li>Función CLEAR </li></ul></ul></ul><ul><ul><ul><ul><li>Uso: Inicializa una variable </li></ul></ul></ul></ul><ul><ul><ul><ul><li>Sintaxis: CLEAR(<Variable>) </li></ul></ul></ul></ul>
  61. 61. Funciones Acceso a formularios con variable de usuario <ul><li>Acceso a formularios (2) </li></ul><ul><ul><li>Ejemplo: Simulación de un proceso de LookUp (1) </li></ul></ul>
  62. 62. Funciones Acceso a formularios con variable de usuario <ul><li>Acceso a formularios (3) </li></ul><ul><ul><li>Ejemplo: Simulación de un proceso de LookUp (2) </li></ul></ul>
  63. 63. Funciones Acceso a Codeunits con variable de usuario <ul><li>Acceso a Codeunits </li></ul><ul><ul><li>Propiedad TableNo </li></ul></ul><ul><ul><li>Propiedad SingleInstance </li></ul></ul><ul><ul><li>Ejecución </li></ul></ul><ul><ul><ul><li>Función RUN </li></ul></ul></ul><ul><ul><ul><ul><li>Uso: Ejecuta una formulario en modo normal </li></ul></ul></ul></ul><ul><ul><ul><ul><li>Sintaxis: </li></ul></ul></ul></ul><ul><ul><ul><ul><li>[<Ok> :=]<Codeunit>.RUN([VAR <Record>]) </li></ul></ul></ul></ul><ul><ul><li>Acceso a funciones </li></ul></ul><ul><ul><ul><li>Referenciándolas a partir de la variable </li></ul></ul></ul><ul><ul><ul><li>Funciones de usuario: Sólo aquellas cuya propiedad Local=No </li></ul></ul></ul><ul><ul><li>Re-inicialización de variable </li></ul></ul><ul><ul><ul><li>Función CLEAR </li></ul></ul></ul><ul><ul><ul><ul><li>Uso: Inicializa una variable </li></ul></ul></ul></ul><ul><ul><ul><ul><li>Sintaxis: CLEAR(<Variable>) </li></ul></ul></ul></ul>
  64. 64. Funciones Acceso a Reports con variable de usuario <ul><li>Acceso a reports </li></ul><ul><ul><li>Ejecución </li></ul></ul><ul><ul><ul><li>Función RUN </li></ul></ul></ul><ul><ul><ul><ul><li>Uso: Ejecuta un report en modo normal </li></ul></ul></ul></ul><ul><ul><ul><ul><li>Sintaxis: <report>.RUN </li></ul></ul></ul></ul><ul><ul><ul><li>Función RUNMODAL </li></ul></ul></ul><ul><ul><ul><ul><li>Uso: Ejecuta un report en modo Modal </li></ul></ul></ul></ul><ul><ul><ul><ul><li>Sintaxis: <report>.RUNMODAL </li></ul></ul></ul></ul><ul><ul><li>Acceso a funciones y propiedades </li></ul></ul><ul><ul><ul><li>Referenciándolos a partir de la variable </li></ul></ul></ul><ul><ul><ul><li>Funciones de usuario: Sólo aquellas cuya propiedad Local=No </li></ul></ul></ul><ul><ul><ul><li>Propiedades: Sólo algunas son accesibles desde C/AL (en tiempo de ejecución) </li></ul></ul></ul><ul><ul><li>Re-inicialización de variable </li></ul></ul><ul><ul><ul><li>Función CLEAR </li></ul></ul></ul><ul><ul><ul><ul><li>Uso: Inicializa una variable </li></ul></ul></ul></ul><ul><ul><ul><ul><li>Sintaxis: CLEAR(<Variable>) </li></ul></ul></ul></ul>
  65. 65. Funciones Acceso a objetos con variable genérica <ul><li>Acceso a formularios </li></ul><ul><ul><li>Función RUN </li></ul></ul><ul><ul><ul><li>Uso: Ejecuta un formulario en modo normal </li></ul></ul></ul><ul><ul><ul><li>Sintaxis: FORM.RUN(<Number> [,<Record>] [,<Field>]) </li></ul></ul></ul><ul><ul><li>Función RUNMODAL </li></ul></ul><ul><ul><ul><li>Uso: Ejecuta un formulario en modo modal </li></ul></ul></ul><ul><ul><ul><li>Sintaxis: [<Action>] := FORM.RUNMODAL(<Number>[,<Record>] [,<Field>]) </li></ul></ul></ul><ul><li>Acceso a Codeunit </li></ul><ul><ul><li>Función RUN </li></ul></ul><ul><ul><ul><li>Uso: Ejecuta una codeunit </li></ul></ul></ul><ul><ul><ul><li>Sintaxis: FORM.RUN(<Number> [,<Record>] [,<Field>]) </li></ul></ul></ul>
  66. 66. Funciones Acceso a objetos con variable genérica <ul><li>Acceso a reports </li></ul><ul><ul><li>Función RUN </li></ul></ul><ul><ul><ul><li>Uso: Ejecuta un report en modo normal </li></ul></ul></ul><ul><ul><ul><li>Sintaxis: REPORT.RUN(<Number>[,<ReqWindow>][,<SystemPrinter>][,<Record>]) </li></ul></ul></ul><ul><ul><li>Función RUNMODAL </li></ul></ul><ul><ul><ul><li>Uso: Ejecuta un report en modo modal </li></ul></ul></ul><ul><ul><ul><li>Sintaxis: </li></ul></ul></ul><ul><ul><ul><ul><li>REPORT.RUNMODAL(<Number>[,<ReqWindow>][,<SystemPrinter>][,<Record>]) </li></ul></ul></ul></ul>
  67. 67. Funciones - Acceso a ficheros <ul><li>Acceso a ficheros </li></ul><ul><ul><li>Función CREATE </li></ul></ul><ul><ul><ul><li>Uso: Crea y abre un fichero </li></ul></ul></ul><ul><ul><ul><li>Sintaxis: [<Ok> := ]<file>.CREATE(<Name>) </li></ul></ul></ul><ul><ul><li>Función OPEN </li></ul></ul><ul><ul><ul><li>Uso: Abre un fichero existente </li></ul></ul></ul><ul><ul><ul><li>Sintaxis: [Ok := ]<file>.OPEN </li></ul></ul></ul><ul><ul><li>Función READ </li></ul></ul><ul><ul><ul><li>Uso: Abre un fichero existente </li></ul></ul></ul><ul><ul><ul><li>Sintaxis: [<Read> := ]<file>.READ(<Variable>) </li></ul></ul></ul><ul><ul><li>Función WRITE </li></ul></ul><ul><ul><ul><li>Uso: Abre un fichero existente </li></ul></ul></ul><ul><ul><ul><li>Sintaxis: <file>.WRITE(<Value>) </li></ul></ul></ul><ul><ul><li>Función TEXTMODE </li></ul></ul><ul><ul><ul><li>Uso: Informa de o establece el modo de apertura del fichero </li></ul></ul></ul><ul><ul><ul><li>Sintaxis: [<IsTextmode> := ]<file>.TEXTMODE([<SetTextmode>]) </li></ul></ul></ul>

×