GUÍA RÁPIDA LENGUAJE C/AL

12,955 views 67 slides May 20, 2009
Slide 1
Slide 1 of 67
Slide 1
1
Slide 2
2
Slide 3
3
Slide 4
4
Slide 5
5
Slide 6
6
Slide 7
7
Slide 8
8
Slide 9
9
Slide 10
10
Slide 11
11
Slide 12
12
Slide 13
13
Slide 14
14
Slide 15
15
Slide 16
16
Slide 17
17
Slide 18
18
Slide 19
19
Slide 20
20
Slide 21
21
Slide 22
22
Slide 23
23
Slide 24
24
Slide 25
25
Slide 26
26
Slide 27
27
Slide 28
28
Slide 29
29
Slide 30
30
Slide 31
31
Slide 32
32
Slide 33
33
Slide 34
34
Slide 35
35
Slide 36
36
Slide 37
37
Slide 38
38
Slide 39
39
Slide 40
40
Slide 41
41
Slide 42
42
Slide 43
43
Slide 44
44
Slide 45
45
Slide 46
46
Slide 47
47
Slide 48
48
Slide 49
49
Slide 50
50
Slide 51
51
Slide 52
52
Slide 53
53
Slide 54
54
Slide 55
55
Slide 56
56
Slide 57
57
Slide 58
58
Slide 59
59
Slide 60
60
Slide 61
61
Slide 62
62
Slide 63
63
Slide 64
64
Slide 65
65
Slide 66
66
Slide 67
67

About This Presentation

No description available for this slideshow.


Slide Content

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 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

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 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 - 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.

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>])
Tags