GUÍA RÁPIDA LENGUAJE C/AL

Preview:

DESCRIPTION

 

Citation preview

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