guÍa rÁpida lenguaje c/al

67
Lenguaje C/AL

Upload: makac0-makac0

Post on 20-Jan-2015

6.587 views

Category:

Technology


15 download

DESCRIPTION

 

TRANSCRIPT

Page 1: GUÍA RÁPIDA LENGUAJE C/AL

Lenguaje C/AL

Page 2: GUÍA RÁPIDA 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

Page 3: GUÍA RÁPIDA LENGUAJE C/AL

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

Page 4: GUÍA RÁPIDA LENGUAJE C/AL

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

Page 5: GUÍA RÁPIDA LENGUAJE C/AL

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

Page 6: GUÍA RÁPIDA LENGUAJE C/AL

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.

Page 7: GUÍA RÁPIDA LENGUAJE C/AL

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

Page 8: GUÍA RÁPIDA LENGUAJE C/AL

Tipos de Datos - Complejos

• BLOB• Record• Form• Codeunit• File• Dialog

• Report• Dataport• OCX• Automation• InStream• OutSream

Page 9: GUÍA RÁPIDA LENGUAJE C/AL

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

Page 10: GUÍA RÁPIDA LENGUAJE C/AL

Tipos de Datos - Valores constantes

• De Cadena– Text

‘Huesca’ Valor Nulo: ‘’

– Code ‘HUESCA’ Valor Nulo: ‘’

Page 11: GUÍA RÁPIDA LENGUAJE C/AL

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

Page 12: GUÍA RÁPIDA LENGUAJE C/AL

Símbolos

• Los símbolos pueden ser:– Variables– Constantes de texto– Funciones

Page 13: GUÍA RÁPIDA LENGUAJE C/AL

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.

Page 14: GUÍA RÁPIDA LENGUAJE C/AL

Símbolos - Variables

• ¿Cómo se definen?

– Globales Ver, C/AL Globals,

Variables

– Locales Ver, C/AL Locals, Variables

Page 15: GUÍA RÁPIDA LENGUAJE C/AL

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

Page 16: GUÍA RÁPIDA LENGUAJE C/AL

Símbolos - Variables

• Array de variables

– Se definen con la propiedad Dimensions de la variable

– Se las referencia con corchetes.

Ej: VtasClieDL[2]

Page 17: GUÍA RÁPIDA LENGUAJE C/AL

Símbolos - Variables

• Manipulación de objetos.– A través de variables de tipos complejos

Table (Record) Form Codeunit Report Dataport

Page 18: GUÍA RÁPIDA LENGUAJE C/AL

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.

Page 19: GUÍA RÁPIDA LENGUAJE C/AL

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

Page 20: GUÍA RÁPIDA LENGUAJE C/AL

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

Page 21: GUÍA RÁPIDA LENGUAJE C/AL

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)

Page 22: GUÍA RÁPIDA LENGUAJE C/AL

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

Page 23: GUÍA RÁPIDA LENGUAJE C/AL

Expresiones

• Qué son.• Tipos de expresión

– Numéricas– Logicas– Relacionales

Page 24: GUÍA RÁPIDA LENGUAJE C/AL

Operadores

• Operador de C/AL Significado. Referencia

( ) paréntesis

[ ] indización

:: ámbito

+ suma

- resta

* multiplicación

/ división

DIV división entera

MOD resto

Page 25: GUÍA RÁPIDA LENGUAJE C/AL

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

Page 26: GUÍA RÁPIDA LENGUAJE C/AL

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

Page 27: GUÍA RÁPIDA LENGUAJE C/AL

Estructuras de controlInstrucciones compuestas

• Begin – EndBEGIN

<sentencia1>;

<sentencia2>;

···

<sentencian>;

END

Page 28: GUÍA RÁPIDA LENGUAJE C/AL

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;

Page 29: GUÍA RÁPIDA LENGUAJE C/AL

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

Page 30: GUÍA RÁPIDA LENGUAJE C/AL

Estructuras de control - Otras

• With - DoWITH <Record> DO

<sentencia>;

Page 31: GUÍA RÁPIDA LENGUAJE C/AL

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

Page 32: GUÍA RÁPIDA LENGUAJE C/AL

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

Page 33: GUÍA RÁPIDA LENGUAJE C/AL

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

Page 34: GUÍA RÁPIDA LENGUAJE C/AL

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

Page 35: GUÍA RÁPIDA LENGUAJE C/AL

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)

Page 36: GUÍA RÁPIDA LENGUAJE C/AL

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

Page 37: GUÍA RÁPIDA LENGUAJE C/AL

Funciones - Acceso a tablas

• Barrido de un rango de registros de una tabla (4)– Código necesario

Page 38: GUÍA RÁPIDA LENGUAJE C/AL

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

Page 39: GUÍA RÁPIDA LENGUAJE C/AL

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

Page 40: GUÍA RÁPIDA LENGUAJE C/AL

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.

Page 41: GUÍA RÁPIDA LENGUAJE C/AL

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

Page 42: GUÍA RÁPIDA LENGUAJE C/AL

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:

Page 43: GUÍA RÁPIDA LENGUAJE C/AL

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

Page 44: GUÍA RÁPIDA LENGUAJE C/AL

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.

Page 45: GUÍA RÁPIDA LENGUAJE C/AL

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.

Page 46: GUÍA RÁPIDA LENGUAJE C/AL

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

Page 47: GUÍA RÁPIDA LENGUAJE C/AL

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

Page 48: GUÍA RÁPIDA LENGUAJE C/AL

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

Page 49: GUÍA RÁPIDA LENGUAJE C/AL

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>,...])

Page 50: GUÍA RÁPIDA LENGUAJE C/AL

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

Page 51: GUÍA RÁPIDA LENGUAJE C/AL

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>,...])

Page 52: GUÍA RÁPIDA LENGUAJE C/AL

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

Page 53: GUÍA RÁPIDA LENGUAJE C/AL

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.

Page 54: GUÍA RÁPIDA LENGUAJE C/AL

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

Page 55: GUÍA RÁPIDA LENGUAJE C/AL

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

Page 56: GUÍA RÁPIDA LENGUAJE C/AL

Funciones - Diálogos

• Diálogos complejos (1)– Acceso a través de una variable de tipo Dialog

Page 57: GUÍA RÁPIDA LENGUAJE C/AL

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

Page 58: GUÍA RÁPIDA LENGUAJE C/AL

Funciones - Diálogos

• Diálogos complejos (3)– Ejemplo:

Page 59: GUÍA RÁPIDA LENGUAJE C/AL

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.

Page 60: GUÍA RÁPIDA LENGUAJE C/AL

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

Page 61: GUÍA RÁPIDA LENGUAJE C/AL

FuncionesAcceso a formularios con variable de usuario

• Acceso a formularios (2)– Ejemplo: Simulación de un proceso de LookUp (1)

Page 62: GUÍA RÁPIDA LENGUAJE C/AL

FuncionesAcceso a formularios con variable de usuario

• Acceso a formularios (3)– Ejemplo: Simulación de un proceso de LookUp (2)

Page 63: GUÍA RÁPIDA LENGUAJE C/AL

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

Page 64: GUÍA RÁPIDA LENGUAJE C/AL

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

Page 65: GUÍA RÁPIDA LENGUAJE C/AL

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

Page 66: GUÍA RÁPIDA LENGUAJE C/AL

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

Page 67: GUÍA RÁPIDA LENGUAJE C/AL

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