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 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 LimiteMax
Nº 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
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 de
IN pertenencia a un rango (conjunto)
AND Y lógico
OR O lógico
NOT negación lógica
XOR O excluyente lógico
.. Rango
Operadores - Precedencia
1. . campo de un registro
[ ] indexación
()paréntesis
::ámbito
2.NOTnegación lógica
- signo negativo
+ signo positivo
3.* multiplicación
/ división decimal
DIVdivisión entera
MODresto
ANDY lógico
XORO excluyente lógico
4. + suma
- resta
ORO lógico
5.> mayor que
< menor que
>=mayor o igual que
<=menor o igual que
= igual que
<>distinto de
INpertenencia a
conjunto
6...rango
Estructuras de control
Instrucciones compuestas
• Begin – End
BEGIN
<sentencia1>;
<sentencia2>;
· · ·
<sentencian>;
END
Estructuras de control
Instrucciones condicionales
• If - Then - Else
IF <ExprLógica> THEN
<sentencia1>
[ELSE
<sentencia2>];
• Case
CASE <Expresión> OF
<Valor1>:
<sentencia1>;
<Valor2>:
<sentencia2>;
· · ·
<ValorN>:
<sentenciaN>;
[ELSE
<sentenciaAlt>]
END;
Estructuras de control
Instrucciones repetitivas
• For - To/Downto
FOR <VarControl> := <ValInicio> {TO|DOWNTO} <ValFin>
<sentencia>;
• While - Do
WHILE <ExprLógica> DO
<sentencia>;
• Repeat - Until
REPEAT
<sentencia1>;
· · ·
<sentenciaN>;
UNTIL <ExprLógica>
• Exit
Estructuras de control - Otras
• With - Do
WITH <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. Amount
Posting
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(Am
ount)
CustLedgEntry.SETRANGE(“Posting
Date”,020195D,040195D)
-8.0003-1-9558
-4.0001-1-9554
2.0003-1-9557
3.0004-1-9559
5.0003-1-9556
6.0008-1-9560
7.0002-1-9555
10.0001-1-9553
12.0008-1-9561
Amount
Posting
Date
Entry No.
1-1-9510.00053
1-1-95-4.00054
2-1-95 7.00055
3-1-95 5.00056
3-1-95 2.00057
3-1-95-8.00058
4-1-95 3.00059
8-1-95 6.00060
8-1-9512.00061
Posting
Date
Amount
Entry No.
CustLedgEntry.N
EXT
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ón
0Std Es el grupo por defecto. Es usado para establecer los filtros por el
usuario en tiempo de ejecución.
1GlobalNo usado.
2Form Usado para filtros resultantes de la función SETTABLEVIEW, de la
propiedad SourceTableView; y de la propiedad DataItemTableView.
3Exec Usado para filtros resultantes de las propiedades SubFormView y
RunFormView.
4Link Usado para filtros resultantes de las propiedades DataItemLink y
SubFormLink.
5Temp 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])
Funciones
SumIndexFields 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:
Funciones
SumIndexFields 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
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(<· · · >,TRU
E)
Bloquea RegistroBloquea TablaLOCKTABLE
SQL ServerNavision ServerInstrucción
Funciones - Transacciones
• Bloqueos (3)
– Modos de actuación al realizar bloqueos
OK
Bloqueo de tabla
con control de
versión
Produce ERROR. Para
evitarlo uso de
RECORDLEVELLOC
KING y FIND
No se puede.
Comprueba la
versión y bloque
la tabla o
produce error
LOCKTABLE(<· · · >,TR
UE)
Bloqueo de
registro con
control de
versión
Uso de
RECORDLEVELLOC
KING y FIND
OkBloqueo de tabla
Ok
No se puede. Se
bloque toda la
tabla
LOCKTABLE
Bloqueo de
registro
SQL ServerNavision
Server
InstrucciónIntención
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 - 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.
Funciones
Acceso 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>)
Funciones
Acceso a formularios con variable de usuario
• Acceso a formularios (2)
– Ejemplo: Simulación de un proceso de LookUp (1)
Funciones
Acceso a formularios con variable de usuario
• Acceso a formularios (3)
– Ejemplo: Simulación de un proceso de LookUp (2)
Funciones
Acceso 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>)
Funciones
Acceso 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>)
Funciones
Acceso 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>])
Funciones
Acceso 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>])