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