Vous êtes sur la page 1sur 127

CURSO DE PROGRAMACIN EN DAMGAARD AXAPTA II

Damgaard Espaa, S.A.

ndice
INTRODUCCIN.......................................................................................................4 MTODOS.................................................................................................................8 SENTENCIAS BSICAS DEL LENGUAJE X++....................................................18 INSTRUCCIONES DE ACCESO A REGISTROS...................................................25 ESTNDARES PARA LOS MTODOS DE LAS TABLAS...................................33 MTODOS DISPLAY Y EDIT.................................................................................3 MTODOS BSICOS EN TABLAS........................................................................4! CONTROL DE TRANSACCIONES.........................................................................4" #ERRAMIENTAS DE DESARROLLO....................................................................5! PROGRAMACIN DE $ORMULARIOS.................................................................5 PASO DE PARMETROS ENTRE OBJETOS% LA CLASE &ARGS'...................."4 PROGRAMACIN DE IN$ORMES........................................................................"" PLANTILLAS DE IN$ORMES................................................................................8( CLASES...................................................................................................................(! DESARROLLO CLIENTE ) SER*IDOR.................................................................(8 OTRAS #ERRAMIENTAS DE DESARROLLO....................................................1!! COMUNICACIN CON EL USUARIO..................................................................1!8 LA CLASE RUNBASE..........................................................................................113 MAPS.....................................................................................................................11(

Damgaard Espaa, S.A.

CONTENEDORES Y SUS $UNCIONES..............................................................121 ACCESO A CLA*ES DE $UNCIN DESDE EL CDIGO..................................123 GESTIN DE EXCEPCIONES..............................................................................124 ACCESO A MEN+ ITEMS DESDE EL CDIGO.................................................12 INDICACIN DE OPERACIONES EN EJECUCIN...........................................12"

Damgaard Espaa, S.A.

Introduccin

Introduccin
1.
1.1.

El entorno MorphX
D,-./.0.1/
El entorno de desarrollo en Damgaard Axapta se llama MorphX. Podemos considerarlo un entorno integrado de desarrollo ( Integrated Development Environment IDE), porque integra muchas funciones diferentes, como diseo, edicin, compilacin y depuracin en un entorno comn. En herramientas de desarrollo ms tradicionales, cada una de estas funciones operar a como un programa independiente, cada uno con su propia interfa!. MorphX permite al usuario modificar de un modo sencillo los o"#etos de la interfa! grfica. $l mismo tiempo que ofrece al usuario a%an!ado las herramientas necesarias para modificar fcilmente la funcionalidad de la aplicacin o "ien crear diseos completamente nue%os. El r"ol de o"#etos de la aplicacin ( Application Object Tree AOT) es el elemento central desde el que el programador puede crear nue%os o"#etos o "ien modificar los e&istentes. El desarrollador puede crear nue%os o"#etos utili!ando la t'cnica de arrastre (drag-and-drop) y asignndoles propiedades. Para hacer el tra"a#o del desarrollador ms fcil y rpido, el sistema tiene %alores por defecto para todas las propiedades de los o"#etos de la aplicacin. Dado que se trata de un sistema de desarrollo orientado a o"#etos, el concepto de herencia es fundamental. (a herencia significa que lo que se ha definido en ni%eles inferiores del sistema es automticamente heredado en ni%eles superiores. )n e#emplo claro del concepto de herencia es la posi"ilidad que tiene el desarrollador de modificar y aumentar la funcionalidad del sistema escri"iendo sus propios m'todos. En Damgaard Axapta, la herencia no se limita nicamente a las clases, sino que se e&tiende a todo el sistema. De este modo, los o"#etos heredan no slo %aria"les y m'todos, sino tam"i'n propiedades.

1.2.

C2/0,3425 I632748/4,5 ,/ M2739X


$lgunos t'rminos y mecanismos centrales orientados a o"#etos aparecen repetidamente cuando desarrollamos con MorphX. $ continuacin %amos a dar una "re%e e&plicacin de los conceptos ms importantes.

*.+.*.

,lase de sistema
)na clase de sistema (system class) es una interfa! de funcionalidad definida en MorphX, por e#emplo para crear o e#ecutar un formulario.

*.+.+.

,lase
)na clase (class) define las interfaces de un o"#eto. Ensea o e&plica como construir un o"#eto de un tipo particular.

Damgaard Espaa, S.A.

Pgina 4 de 127

Introduccin )na caracter stica esencial de una clase es que podemos crear nue%as instancias (o"#etos) de la clase. (os formularios, informes e incluso las ta"las son e#emplos de clases- MorphX tiene una definicin de clase que define qu' ocurre e&actamente cuando un o"#eto de cada tipo es creado.

*.+...

,ontroles
)n control es un o"#eto grfico, como una ca#a de te&to ( text box), una casilla de %erificacin (check box) o un "otn de comando ( command b tton) que podemos situar en un formulario o un informe cuando lo diseamos, para que nos muestre informacin, realice una accin o hacer el formulario o informe ms fcil de leer. /ay apro&imadamente +0 controles diferentes y cada uno est definido por alrededor de 10 propiedades.

*.+.2.

3rigen de datos
)n origen de datos (Data !o rce) contiene las %aria"les de datos que utili!an un formulario o una consulta. Estas %aria"les de datos pueden ser una o ms ta"las, o campos indi%iduales de las ta"las.

*.+.1.

Diseos
)n nodo de diseos ( Designs) proporciona acceso al usuario para definir el aspecto de un formulario o de un informe.

*.+.4.

Encapsulacin
(a encapsulacin significa que los datos en el sistema son definidos dentro de los m'todos y solo pueden ser modificados desde los propios m'todos.

*.+.5.

6inal
6inal es un modificador de una clase o un o"#eto que indica que dicha clase o m'todo no puede ser ampliado o so"recargado.

*.+.7.

/erencia
(a herencia es un concepto fundamental en MorphX. 8ignifica que lo que es definido en ni%eles inferiores del sistema es automticamente accesi"le, o lo que es lo mismo, heredado por los ni%eles superiores.

*.+.9.

3"#etos
(os o"#etos son el concepto central de MorphX. ,ualquier formulario y cualquier control es un o"#eto. (a "ase de datos es tam"i'n un o"#eto. En definiti%a, cualquier cosa presente en el sistema es un o"#eto. (os o"#etos son creados a partir de las clases. Decimos por tanto que un o"#eto es una instancia de una clase.

Damgaard Espaa, S.A.

Pgina

de 127

Introduccin (os o"#etos proporcionan una forma lgica y con%eniente de organi!ar los datos y los procedimientos. (os o"#etos estn encapsulados, lo que significa que contienen tanto su cdigo como sus datos. Para utili!ar un o"#eto, de"emos mantener una referencia a 'l mediante una %aria"le del mismo tipo del o"#eto.

*.+.*0. :'todos
(os m'todos son tareas que podemos decir a un o"#eto que realice.

*.+.**. Propiedad
(as propiedades son datos que descri"en un o"#eto. ,ada tipo de o"#eto tiene diferentes tipos de propiedades. )n m'todo t picamente tiene unas pocas propiedades, una de las cuales, por e#emplo, define donde queremos que se e#ecute. Por otra parte, un control tiene acerca de 10 propiedades que definen el color, el tamao, la posicin, etc.

*.+.*+. ,onsulta
)na consulta es un mecanismo de filtrado para recuperar los datos que nos interesa %er a partir de las ta"las de nuestra "ase de datos. (as consultas son utili!adas normalmente como el origen de datos en los formularios e informes.

2.
2.1.

El lenguaje X++
I/472:;00.1/
El lengua#e ;<< es un lengua#e sencillo y fcil de aprender, para que pueda ser utili!ado por la mayor a de desarrolladores. Es un lengua#e orientado a o"#etos, para "eneficiarse de las %enta#as de las metodolog as modernas de desarrollo de soft=are, que se acopla perfectamente en aplicaciones cliente>ser%idor. Por ltimo, es un lengua#e interpretado, al estilo de ?a%a, para o"tener m&imas capacidades dinmicas.

2.2.
)a

C87804,7<54.085
(engua#e simple, orientado a o"#etos y familiar

(as principales caracter sticas de ;<< son que se trata de un lengua#e sencillo que puede ser utili!ado rpidamente, si se conoce la metodolog a de la programacin orientada a o"#etos. (os conceptos fundamentales de ;<< son asimilados rpidamente, por tanto los programadores pueden ser producti%os desde el principio. ;<< ha sido diseado desde su "ase para ser orientado a o"#etos. ;<< proporciona una plataforma de desarrollo orientada a o"#etos limpia y eficiente. El lengua#e ;<< utili!a principios de la programacin orientada a o"#etos como encapsulacin, herencia, clases, o"#etos, m'todos y propiedades.

Damgaard Espaa, S.A.

Pgina ! de 127

Introduccin $ pesar de que ,<< y ?a%a fueron recha!ados como lengua#es para utili!ar con MorphX, el aspecto de ;<< es muy similar al de estos dos lengua#es, aunque se ha eliminado la comple#idad innecesaria de estos lengua#es. $dems, como MorphX es una plataforma para construir comple#os sistemas de gestin empresarial y conta"ilidad, el lengua#e ;<< tam"i'n incluye un gran nmero de comandos comunes de 8@( como parte integrada del lengua#e. El hecho de que ;<< tenga una sinta&is muy similar a lengua#es ya e&istentes como ,<<, ?a%a o 8@( hace que ;<< sea un lengua#e familiar para la mayor a de desarrolladores de soft=are. Esto significa que pueden migrar rpidamente a este nue%o lengua#e. )" (engua#e ro"usto

El lengua#e ;<< ha sido diseado para crear soft=are muy fia"le. Proporciona compro"aciones muy amplias en tiempo de compilacin, seguidas de un segundo ni%el de compro"aciones en tiempo de e#ecucin. (as caracter sticas del lengua#e dirigen a los programadores hacia unos h"itos de programacin fia"le. El modelo de mane#o de la memoria es e&tremadamente simple- los o"#etos son creados mediante un operador ne". Ao e&iste un tipo de datos puntero definido por el programador de forma e&pl cita, lo que implica que no necesitamos aritm'tica de punteros ni tenemos la necesidad de reali!ar limpie!a de punteros en memoria, con lo que resulta innecesarias las llamadas al m'todo #inali$e. Este sencillo modelo de mane#o de memoria elimina gran cantidad de errores de programacin muy comunes entre los programadores de , y ,<<. Podemos desarrollar cdigo en el lengua#e ;<< con la seguridad de que el sistema encontrar la mayor a de los errores rpidamente y con la tranquilidad de que no tendremos pro"lemas latentes no descu"iertos hasta que nuestro cdigo est' en circulacin en el mercado. )c (engua#e de alto rendimiento

El rendimiento es siempre algo a tener en consideracin. El lengua#e ;<< consigue un superior rendimiento adoptando un esquema de tra"a#o en el cual el int'rprete puede tra"a#ar a la m&ima %elocidad sin necesidad de compro"ar el entorno en tiempo de e#ecucin. El li"erador de memoria automtico ( a tomatic garbage collector), se e#ecuta automticamente cuando es necesario, asegurando una pro"a"ilidad muy alta de que la memoria est' disponi"le cuando se necesite, lo que se traduce en un me#or rendimiento. En general, los usuarios perci"en que las aplicaciones interacti%as responden ms rpidamente a pesar de que son interpretadas. )d (engua#e interpretado y dinmico

En una plataforma interpretada como el lengua#e ;<<, la fase de enla!ado de un programa es sencilla, incremental y ligera. De esta forma nos "eneficiamos de unos ciclos de desarrollo y prototipado mucho ms rpidos, comparados con los pesados ciclos de compilacin, enla!ado y prue"as tradicionales.

Damgaard Espaa, S.A.

Pgina 7 de 127

"#todos

Mtodos
3. Introduccin
Bodo o"#eto puede identificarse por el ,548:2 en que se encuentra y por su 026327486.,/42. En programacin, el estado de un o"#eto se define mediante =87.8>?,5, mientras que su comportamiento est definido por 6@42:25. (os m'todos actan so"re las %aria"les del o"#eto haciendo e%olucionar su estado. (as %aria"les de un o"#eto slo son accesi"les directamente por m'todos propios del o"#eto, nunca desde el e&terior. En $&apta podemos encontrar m'todos en todos los o"#etos que componen la aplicacin, es decir, en Ba"las 6ormularios Cnformes ,onsultas ,lases En cada uno de estos o"#etos, los m'todos se crean del mismo modo que los elementos restantes de la aplicacin, es decir, utili!ando el Dr"ol de 3"#etos de la $plicacin.

4.

Estructura de los mtodos


)n m'todo est formado por una ca"ecera y un cuerpo. Este, a su %e!, est compuesto por la declaracin de %aria"les y otras instrucciones. 8eguidamente ilustramos la estructura de los m'todos-

,a"ecera Declaracin de %aria"les ,uerpo Declaracin de m'todos Cnstrucciones

:'todo

Damgaard Espaa, S.A.

Pgina $ de 127

"#todos

4.1.

C8>,0,78
(a ca"ecera de un m'todo tiene el siguiente aspecto (entre FG se muestran los %alores opcionales)-

[Modificador] TipoDatoRetorno NombreMtodo ([ListaParmetros])

(os modificadores y los parmetros se descri"en en apartados posteriores. El 4.32 :, :842 :, 7,427/2 puede tomar los siguientes %alores Bipo de dato =2.: - este t'rmino se utili!a cuando el m'todo no de%uel%e nada. 8/A4A3, % significa que el m'todo puede de%ol%er todos los tipos de datos (mediante distintas instrucciones de retorno en el cuerpo del m'todo) 8iempre que un m'todo de%uel%a algn %alor, se de"e especificar el tipo del %alor de retorno e incluir una instruccin de retorno (7,4;7/ ...).

4.2.
{

C;,732
El cuerpo de un m'todo tendr el siguiente aspecto[Declaracin de [!] "nstr#cciones! $ ariables]

[Declaracin de mtodos]

A n% e no #orma parte de la estr ct ra de n m&todo' es recomendable a(adir siempre na l)nea con n p nto y coma *+, antes del gr po de instr cciones- Esto es debido a % e en alg nas ocasiones' el compilador con# nde na instr cci.n con la declaraci.n de na variable y dev elve n error de sintaxis en n m&todo c yas instr cciones son completamente correctas- El /nico modo de evitar este error es marcar el inicio del blo% e de instr cciones con n p nto y coma- !i revisamos alg nos de los m&todos de la aplicaci.n est0ndar' observaremos % e la mayor)a de ellos tili$an esta t&cnica-

(a declaracin de %aria"les y de m'todos se descri"e a continuacin. (as instrucciones se irn %iendo a lo largo del curso.

Damgaard Espaa, S.A.

Pgina % de 127

"#todos

2.+.*.

Declaracin de %aria"les

)na %aria"le es un puntero a una posicin de memoria donde se almacena informacin de un tipo de datos espec fico. Bodas las %aria"les de"en ser declaradas antes de poder ser usadas. /ay que sealar que ;<< no permite que la declaracin de %aria"les se me!cle con otras instrucciones del lengua#e. En otras pala"ras, el lengua#e ;<< requiere que las %aria"les sean declaradas antes de cualquier otra instruccin. (a sinta&is de la declaracin es la misma, tanto si es una %aria"le simple o una %aria"le de o"#eto. (as %aria"les pueden ser declaradas de tres formas en ;<<- declaracin simple, declaracin con iniciali!acin y declaracin mltiple. )a Declaracin simple

(a declaracin simple de %aria"les es la ms utili!ada, ya que es rpida y la mayor a de %aria"les son simples. (a sinta&is es la siguienteTipoDato "dentificador%ariable

TipoDato es cualquier tipo de datos del lengua#e ;<<. Identi#icador1ariable es "sicamente un nom"re cuyo primer carcter de"e ser una letra que puede estar seguida por letras o nmeros. ,omo letras se consideran los caracteres a..! y el carcter su"rayado (H).

Para los tipos de datos, si se trata de un o"#eto de la aplicacin su nom"re se escri"ir me!clando maysculas y minsculas, de manera que el primer carcter sea una mayscula as como la primera letra de cada pala"ra interna. 8i se trata de un tipo de datos primiti%o se escri"ir en minsculas.

El nom"re de una %aria"le me!clar maysculas y minsculas, siendo la primera letra en minscula y el primer carcter de cada pala"ra interna en maysculas. $ continuacin se muestran algunos e#emplos de declaracin de %aria"les-

int i! &#st"n oice'o#r c#st"n oice'o#r!

(a declaracin de %aria"les de la mayor a de tipos de datos de ;<<, e&ceptuando los o"#etos, tam"i'n reser%a un espacio de memoria para dichas %aria"les. ,uando una %aria"le es declarada adems se iniciali!a con un %alor por defecto. )" Declaracin con iniciali!acin

En ocasiones nos interesa que una determinada %aria"le tenga un %alor distinto al %alor por defecto, en el mismo instante en que la %aria"le se crea. El lengua#e ;<< permite la iniciali!acin de %aria"les en la sentencia de declaracin. (a iniciali!acin se lle%a a ca"o aadiendo una sentencia de asignacin a la declaracin de la %aria"le.

Damgaard Espaa, S.A.

Pgina 1& de 127

"#todos )n e#emplo de este tipo de declaracin ser a el e#emplo siguiente, donde una %aria"le real de nom"re pi, es declarada e iniciali!ada al %alor del nmero Pireal pi ( )*+,+-./0-)-.! E&iste otra sinta&is para iniciali!ar o"#etos, ya que estos son iniciali!ados in%ocando el m'todo ne" de la clase. )n e#emplo de iniciali!acin ser a el siguiente,lass class3"#ect I ne= ,lass()J (o que declarar a un o"#eto llamado classObject de la clase 2lass y lo iniciali!ar a. )c Declaracin mltiple

$ %eces necesitamos %arias %aria"les del mismo tipo. En estos casos puede llegar a ser una p'rdida de tiempo tener que escri"ir el tipo de dato delante de cada %aria"le que %ayamos a declarar. Por este moti%o, ;<< nos permite declarar ms de una %aria"le en la misma sentencia de declaracin. (a sinta&is es la siguienteTipoDato %ariable {1 %ariable$

)n e#emplo ser a de declaracin mltiple ser a el siguientereal a1 b ( +*-! En esta sentencia se declaran dos %aria"les de tipo real llamadas a y ", iniciali!ando la %aria"le " a *.1. Dentro de un m'todo podemos hacer referencia al o"#eto al que pertenece el m'todo mediante la %aria"le this. Esta nos da acceso a todos los m'todos y propiedades de dicho o"#eto. Es utili!ado normalmente como parmetro para los m'todos que necesitan una referencia al o"#eto.

2.+.+.

Declaracin de m'todos

(os pro"lemas comple#os del mundo real son a menudo ms fciles de resol%er si los di%idimos en pro"lemas ms pequeos que puedan ser resueltos independientemente unos de otros. El lengua#e de programacin ;<<, nos permite introducir m'todos dentro de otros m'todos. 3tros lengua#es como ?a%a o ,<< no soportan esta caracter stica. $unque en la realidad no es una prctica comn. (os m'todos incrustados dentro de otros m'todos solo son %isi"les dentro del m"ito en el cual son creados y definidos. EB,63?2 oid m2Met3od() { oid m24mbeddedMet3od() { 5o6(+1 74ste es #n mtodo incr#stado81 +)! $ 5o6(+1 74ste es el mtodo principal81 +)!

Damgaard Espaa, S.A.

Pgina 11 de 127

"#todos m24mbeddedMet3od()! $ El m'todo llamado myEmbeddedMethod, tan solo estar a %isi"le desde el m"ito en el que fue creado, es decir dentro del m'todo llamado myMethod.

2.+...

Dm"ito de las %aria"les en los m'todos

(as reglas relati%as al m"ito de las %aria"les en ;<< son muy sencillas, todos los m'todos tienen su propio m"ito. Para usar datos de un m'todo a otro, o lo que es lo mismo, datos de m"itos diferentes, de"emos trasladar los datos utili!ando parmetros. )n m'todo puede tener uno o ms argumentos. Dentro del m"ito de ese m'todo esos parmetros son tratados como %aria"les locales, iniciali!adas con el %alor que ten a el parmetro en la llamada. Es importante sealar que todos los parmetros son pasados por %alor. Esto significa que no podemos modificar el %alor de la %aria"le original, pero s el de la %aria"le local en el m'todo, la cual es una copia de la original. $ continuacin mostramos un e#emplooid met3od9(int i) { i ( i : +! print i! $ oid met3od5() { int i ( )! print i! t3is*met3od9(i)! print i! $ En este e#emplo el m'todo method3 tiene una %aria"le local llamada i, la cual se utili!a como parmetro para llamar al m'todo methodA. El m'todo methodA utili!a un parmetro llamado i, por lo tanto tiene una %aria"le local llamada i. Esta %aria"le tiene el %alor de la %aria"le i del m'todo method3, ya que ha sido utili!ada como parmetro de la llamada. El resultado de in%ocar el m'todo method3 es la impresin del %alor de la %aria"le i del m'todo method3 antes y despu's de la in%ocacin del m'todo methodA que imprime el %alor de su %aria"le local i. El resultado de la e#ecucin es el siguiente- . 2 . Esto ilustra perfectamente que las dos %aria"les i son distintas en cada m'todo y que el m'todo methodA no puede cam"iar el %alor de los parmetros fuera de su m"ito.

Damgaard Espaa, S.A.

Pgina 12 de 127

"#todos

4.3.

A?C;/25 ,B,63?25
(a forma ms simple que puede tener un m'todo se muestra a continuacinEB,63?2 1 oid met3odName() { $ Este e#emplo muestra un m'todo que no de%uel%e nada ( void) y que no utili!a parmetros (los par'ntesis estn %ac os). $dems, el cuerpo del m'todo (entre lla%es) est %ac o. El e#emplo es una declaracin %lida de un m'todo, pero como no hay instrucciones en el cuerpo, el m'todo no har nada. EB,63?2 2 int met3odName() { ret#rn + $ 8i el m'todo de"e de%ol%er algo, por e#emplo un entero, la declaracin de"e parecerse al e#emplo +. (a pala"ra int antes del nom"re del m'todo, indica que el m'todo de%ol%er un entero y la instruccin ret rn * en el cuerpo de%uel%e el %alor entero * al elemento que ha llamado al m'todo. Esto significa que se puede utili!ar el resultado de la llamada al m'todo en una e&presin, asignacin o incluso como parmetro en una llamada a otro m'todo. )n m'todo un poco ms comple#o (sin argumentos ni modificadores) es por e#emplo, el m'todo delete de la ta"la de pro%eedores. M@42:2 :,?,4, ,/ ?8 48>?8 *,/:T8>?, oid delete() { 9ddress address! ttsbe;in! <<&omien=a la transaccin s#per()! <<Llamada al mtodo delete de la clase s#perior <<>elecciona todas las direcciones para ese pro eedor ?3ile select address ?3ere address*9drTable"d (( t3is*Table"d @@ address*9drRec"d (( t3is*Rec"d { address*delete()! <<Llamada al mtodo delete $ ttscommit! <<9cepta la transaccin

Damgaard Espaa, S.A.

Pgina 1' de 127

"#todos $ En el e#emplo podemos %er la ca"ecera del m'todo sin modificadores ni argumentos. $ continuacin tenemos la declaracin de una %aria"le llamada a ddress. $l lado de cada instruccin se ha descrito su funcin mediante un 026,/487.2. )na l nea de comentario se marca mediante los caracteres )), mientras que un "loque de comentarios de"e enmarcarse entre los caracteres )D y D).

5.
5.1.

ar!metros
D,-./.0.1/
En algunas ocasiones son necesarios datos e&ternos para utili!arlos en un m'todo, y la nica forma de reali!ar esto es definiendo datos de entrada al m'todo conocidos como parmetros. 8i se utili!an parmetros en un m'todo, el m'todo puede escri"irse a menudo de una manera ms general, lo que significa que tendr que escri"irse menos cdigo para lle%ar a ca"o una tarea. ,omo se descri"e en un apartado anterior, los parmetros en los m'todos son declarados en la declaracin del m'todo. Posteriormente son utili!ados cuando se reali!a una llamada al m'todo. (a lista de parmetros que se declara en la ca"ecera de un m'todo estar compuesta por uno o ms parmetros separados por comas. (a declaracin de cada uno de los parmetros tiene la siguiente estructuraTipoDato NombreParmetro [(46presin] Es decir, los parmetros se declaran como si se tratar de una declaracin normal de %aria"les. ,omo e#emplo de un m'todo que de%uel%e algo y utili!a parmetros podemos %er la declaracin del siguiente m'todo de la ta"la 2 stTable-

5oolean c3eADimension(Dimension dimension) { $ El m'todo checkDimension de%uel%e un booleano y utili!a un parmetro del tipo de datos e&tendido Dimension, que es un %ector de cadenas de caracteres.

5.2.

P87E6,4725 230.2/8?,5
Es posi"le iniciali$ar los parmetros en la declaracin. Esto con%ierte al parmetro en un parmetro opcional, de modo que si no es utili!ado en la llamada al m'todo se utili!a el %alor de la iniciali!acin.

Damgaard Espaa, S.A.

Pgina 14 de 127

"#todos Keamos un e#emplo8ea una clase 4 man, cuyo m'todo ne" tiene el siguiente aspecto (cuando %eamos las clases ha"laremos con ms detalle de este m'todo, de momento simplemente indicaremos que permite crear e iniciali!ar las %aria"les de un o"#eto)oid ne? (Date Bbirt3date) { birt3date ( Bbirt3date! $ Es decir, al crear un o"#eto de la clase 4 man, simplemente estamos asignando el %alor del parmetro a la %aria"le birthdate. $ continuacin, definimos un m'todo que calcula la edad en aos a partir de una fecha que se puede especificar como parmetro. Este parmetro es opcional, es decir, si no pasamos una fecha en la llamada al m'todo tomar como fecha de clculo la fecha de hoyreal a;e(date BcalcDate ( toda2()) { ret#rn (BcalcDate C t3is*birt3date)<)0-! $ Keamos las distintas posi"ilidades de llamada al m'todoD#man Aid ( ne? D#man(+<+<.E)! << &rea #n obFeto de tipo D#man print Aid*a;e()! <<"mprime la edad a fec3a de 3o2 print Aid*a;e(+<+<+..+)! <<"mprime la edad a fec3a +<+<.+

".

Modi#icadores
E&isten diferentes modificadores que pueden ser aplicados en la declaracin de m'todos. 8on los siguientes)a 8tatic ,rea un m'todo de clase que no puede operar so"re un o"#eto. )" 6inal ,rea un m'todo que no puede ser so"recargado por su"clases. Ao puede ser aplicado a los m'todos ne" y #inali$e. )c Display (os m'todos de este tipo siempre de%uel%en un %alor. 8e utili!an para asignar un %alor a un campo en un informe o en un formulario. El campo no puede ser modificado.

Damgaard Espaa, S.A.

Pgina 1 de 127

"#todos )d Edit (os m'todos de este tipo siempre de%uel%en un %alor. 8e utili!an para asignar un %alor a un en un formulario, que puede ser modificado. Bal y como se %io en un apartado anterior, los modificadores forman parte de la ca"ecera de un m'todo, y se utili!an #usto antes del tipo de datos de retorno. ,omo e#emplo, %eamos algunas ca"eceras de m'todosstatic oid &lassNo&3an;e() final int Dont9lterMe() displa2 int %al#e() El modificador -./8? se %er ms adelante, en el cap tulo dedicado a clases. (os modificadores :.53?8A y ,:.4 tienen dedicado su propio cap tulo. (os m'todos de tipo 5484.0 se descri"en en el siguiente apartado.

$.

Mtodos est!ticos
(os m'todos estticos nunca operan so"re un o"#eto, es decir so"re una instancia de la clase en e#ecucin. Podemos %er muy fcilmente con un e#emplo el significado de los m'todos estticos. 8upongamos un m'todo exist que reci"e como parmetro un cdigo de cliente y nos indica si el cliente e&iste o no. 8i el m'todo actuara so"re un o"#eto, no tendr a ningn sentido, ya que para e#ecutar el m'todo de"er a e&istir el o"#eto y por lo tanto el resultado ser a siempre s . (a declaracin de este m'todo podr a tener la siguiente ca"ecerastatic 5oolean e6ist (&#st9cco#nt Bc#st9cco#nt) Dado que un m'todo esttico no opera so"re un o"#eto, no podemos utili!ar la %aria"le this. Por otro lado, y dado que se trata de m'todos de clase, nunca pueden ser so"recargados.

2omo regla general de dise(o en n entorno orientado a objetos y cliente5servidor' n m&todo se declarar0 como est0tico c ando no tiene acceso a los miembros *variables y m&todos, de la instancia y' por lo tanto no tili$a el p ntero this' y no va a ser sobrecargado-

,omo los m'todos estticos no operan so"re los o"#etos, no pueden ser llamados como cualquier otro m'todo no esttico. Por lo tanto tenemos que llamarlos utili!ando el 23,78:27 :, E6>.42 (scope-operator) %%, como en el siguiente e#emplo&lassNameGGm2Met3od() Dentro de una clase, es posi"le declarar un m'todo esttico y un m'todo no esttico con el mismo nom"re. ,omo por e#emplooid m2Met3od() { << "nstr#cciones $

Damgaard Espaa, S.A.

Pgina 1! de 127

"#todos static { << "nstr#cciones $ En este caso tendr amos dos m'todos con el mismo nom"re, sin em"argo como uno de ellos es esttico no se in%ocar an de la misma manera. Por e#emplo, className*m2Met3od() in%ocar a el m'todo de la instancia actual de la clase, es decir el m'todo del o"#eto, mientras que , lassNameGGm2Met3od() in%ocar a el m'todo esttico de la clase, con lo que no e&iste confusin posi"le. oid m2Met3od()

En un entorno cliente>ser%idor, es interesante reducir al m&imo el trfico en la red. Desde este punto de %ista, resulta ms L"aratosM llamar a un m'todo esttico de forma remota que instanciar un o"#eto y despu's llamar a uno de sus m'todos.

Damgaard Espaa, S.A.

Pgina 17 de 127

Sentencias (sicas de) )engua*e +,,

Sentencias !sicas de" "en#ua$e X%%


%. Introduccin
El hecho de que ;<< tenga una sinta&is muy similar a lengua#es ya e&istentes como ,<<, ?a%a o 8@( hace que ;<< sea un lengua#e familiar para la mayor a de desarrolladores de soft=are. Esto significa que pueden migrar rpidamente a este nue%o lengua#e y pueden ser producti%os desde el primer momento. En el presente cap tulo %amos a re%isar "re%emente algunas de las instrucciones ms comunes. 8i se considera necesario, esta informacin se puede ampliar consultando la 67 )a de ay da al desarrollador de Axapta8.

&.
(.1.

'entencias condicionales
I/547;00.1/ I$
Aormalmente queremos hacer diferentes cosas con datos distintos. Para hacer esto posi"le, necesitamos decidir en funcin de una condicin. )na instruccin i# e%ala una condicin y e#ecuta un con#unto de instrucciones dependiendo del %alor lgico de esa condicin. (a instruccin i# es la instruccin de "ifurcacin ms simple que ofrece el lengua#e ;<<, y est definida de la siguiente formaif ( e6presin ) instr#cciones [ else instr#cciones ] (a e&presin entre par'ntesis (la condicin), puede ser cualquier e&presin que pueda e%aluarse a %erdadero o falso. /ay que recordar que cualquier nmero diferente de 0 y cualquier cadena de caracteres no %ac a se interpreta como un %alor cierto, mientras que solo %amos a considerar como %alor falso cuando tengamos un nmero igual a 0 o cadena de caracteres %ac a. $ continuacin presentamos dos e#emplo de instruccin i#Sin Else +) /) )) ,) if (aH,) print a! if (Debtor*NameRef (( 8Ipto?n Radio8) print 7Jreat m#sic8! if (banA9cco#ntTrans) { sentencias$ if (Kt3is* alidation()) { t3ro? error(LM>N>+O,,PL)! $

Damgaard Espaa, S.A.

Pgina 1$ de 127

Sentencias (sicas de) )engua*e +,, Con Else +) if (aH,) print a! else print 7, es ma2or Q#e a8! /) if (5anA9cco#ntTableGGRind(9cco#nt"d)*Name) print 7&#enta e6istente8! else print 7No e6iste la c#enta8!

El lengua#e permite anidar sentencias i# unas dentro de otras.

(.2.

I/547;00.1/ SFITC#
(a sentencia s"itch es una sentencia de "ifurcacin mltiple. Eso significa que podemos seguir ms de dos caminos utili!ando esta sentencia, en contraste con la instruccin i#. En una instruccin s"itch, normalmente queremos que ocurra algo por defecto, si no se elige ninguna de las alternati%as correspondientes a los distintos caminos posi"les a seguir. Por tanto, e&iste un camino por defecto que se sigue si no se ha elegido ninguno de los otros posi"les. Dependiendo de una condicin que se e%ala, la e#ecucin del programa salta al camino correcto y contina la e#ecucin desde all . 8i queremos que la e#ecucin se pare en algn lugar determinado dentro de la instruccin s"itch de"emos utili!ar la sentencia break. (a sinta&is es la siguienteswitch (46presin) { case 46presin {1 46presin$G "nstr#cciones! [break!] case *** [defaut "nstr#cciones! ] $

Damgaard Espaa, S.A.

Pgina 1% de 127

Sentencias (sicas de) )engua*e +,, )n e#emplo de una instruccin s"itch, en comparacin con una instruccin if, ser a el siguienteEB,63?2 ./547;00.1/ 5G.409 s?itc3 (i) { case +EG << "nstr#cciones 9! breaA! case /EG << "nstr#cciones 5! breaA! defa#ltG << "nstr#cciones &! breaA! $ EB,63?2 ./547;00.1/ .if (i((+E) << "nstr#cciones 9! else if (i((/E) << "nstr#cciones 5! else <<"nstr#cciones &! ,omo podemos %er, en estos casos la instruccin s"itch es mucho ms intuiti%a y fcil de entender que la instruccin i#. Es importante sealar que si no utili!ramos la instruccin break, la e#ecucin del programa continuar a con las instrucciones correspondientes a los siguientes caminos de e#ecucin definidos en la instruccin s"itch. E#emplos de 8=itch +) s?itc3 (b#d;et*table"d) { case tablen#m(Led;er5#d;et)G ret#rn ne? 5#d;et46pansion(b#d;et)! case tablen#m(Rorecast>ales)1tablen#m(RorecastP#rc3)G ret#rn ne? Rorecast46pand(b#d;et)! case tablen#m(ProF5#d;et4mpl)G ret#rn ne? 5#d;et46pansion(b#d;et)!

Damgaard Espaa, S.A.

Pgina 2& de 127

Sentencias (sicas de) )engua*e +,, case tablen#m(ProF5#d;et&ost)G ret#rn ne? 5#d;et46pansion(b#d;et)! case tablen#m(ProF5#d;etRe en#e)G ret#rn ne? 5#d;et46pansion(b#d;et)! $ /) s?itc3 (f) { case / G label ( rd*looA#pLabel(literal>tr(LM>N>-)0)-L))! breaA! case ) G label ( rd*looA#pLabel(literal>tr(LM>N>)P.,L))! breaA! case , G label ( rd*looA#pLabel(literal>tr(LM>N>-E/-)L))! breaA! case - G label ( rd*looA#pLabel(literal>tr(LM>N>,PPL))! breaA! case 0 G label ( rd*looA#pLabel(literal>tr(LM>N>0,)PL))! breaA! Def#alt G T3ro? error 7&aso desconocido8! $

(.3.

O3,78:27 4,7/87.2% H
$ %eces necesitamos elegir entre dos e&presiones dependiendo de alguna condicin concreta. Eso puede reali!arse utili!ando la instruccin i# estndar antes comentada. Esto nos o"ligar a a reali!ar dos grupos de instrucciones, sin em"argo el operador ternario (N) se puede ahorrrar cdigo. (a sinta&is de este operador se presenta a continuacin46presin ? 46presin : 46presin

8i la primera e&presin es %erdadera, de%ol%er amos la e&presin situada inmediatamente detrs del s m"olo H, por el contrario, si es falsa de%ol%er amos la e&presin situada detrs de los dos puntos ( %). (a funcionalidad es similar a la de la instruccin i#, pero mientras que en 'sta podemos elegir entre dos grupos de instrucciones, con el operador ternario podemos elegir entre dos e&presiones. (as %enta#as del operador ternario con respecto a la instruccin i# se ilustran en el siguiente e#emploO3,78:27 4,7/87.2

Damgaard Espaa, S.A.

Pgina 21 de 127

Sentencias (sicas de) )engua*e +,, int res#lt! int c3oose ( )! ! res#lt ( c3oose H ) S +EE G -E! I/547;00.1/ .int res#lt! int c3oose ( )! if (c3oose H )) res#lt ( +EE! else res#lt ( -E! ,omo podemos %er con el operador ternario el cdigo es ms corto y adems podemos de%ol%er el resultado de una manera directa, lo que hace aconse#a"le su utili!acin en determinadas ocasiones.

1(.

'entencias de repeticin
I/547;00.1/ F#ILE

1!.1.

$ menudo necesitamos repetir algo mientras que una e&presin sea %erdadera. 8i por e#emplo, estamos leyendo un fichero de te&to, de"emos seguir leyendo mientras haya ms te&to en el fichero, es decir, antes de alcan!ar el fin del fichero. )na instruccin "hile slo se e#ecuta si la condicin es %erdadera. Esto significa que una instruccin "hile puede e#ecutarse %arias %eces, una %e! o incluso ninguna, dependiendo de la condicin inicial. (a sinta&is es la siguientewhile ( 46presin ) "nstr#cciones

E#emplos de la instruccin "hile. +) int n ( +E! ?3ile (n H +) { << "nstr#cciones n ( n C +! $ /) ?3ile (Q#er2&#st*ne6t()) { >entencias

Damgaard Espaa, S.A.

Pgina 22 de 127

Sentencias (sicas de) )engua*e +,, $ )) ?3ile select c#st"n oice'o#r (( ?3ere (c#st"n oice'o#r*in oice9cco#nt c#stTable*acco#ntN#m @@ in oice&#stomer)

1!.2.

I/547;00.1/ DO F#ILE

(a instruccin do9"hile tiene la misma funcionalidad "sica que la instruccin "hile, pero se diferencia en que la condicin se comprue"a despu's de las instrucciones. Esto significa que una instruccin do9"hile al menos se e#ecuta una %e!, aunque puede hacerlo %arias %eces dependiendo de la condicin. (a sinta&is es la siguientedo { { "nstr#cciones $ } while ( 46presin ) $ continuacin presentamos un e#emplo de instruccin do9"hile. int n ( +! do { << "nstr#cciones n ( n : +! $ ?3ile (n T +) En este caso el con#unto de instrucciones situadas dentro del cuerpo de la instruccin do9"hile se e#ecutar a una %e!.

1!.3.

I/547;00.1/ $OR

(a instruccin #or es una instruccin "hile e&tendida, que resulta especialmente til cuando estamos tra"a#ando con %ectores ( arrays), ya que la condicin es una %aria"le que se %a incrementando en cada iteracin. Oealmente, la instruccin #or aade funcionalidad a la instruccin "hile, ya que nos da la posi"ilidad de asignar un %alor inicial a la %aria"le de control de la condicin y de definir una instruccin de incremento o decremento de dicha %aria"le. En cualquier otro aspecto, una instruccin #or puede ser considerada de la misma forma que una instruccin "hile. (a sinta&is es la siguientefor ( "niciali=acin! 46presin! 9ct#ali=acin ) "nstr#cciones Es importante sealar que la iniciali!acin y la actuali!acin son dos instrucciones regulares de ;<<, pero el uso normal de esas instrucciones en la sentencia #or es iniciali!ar y actuali!ar la %aria"le de control respecti%amente.

Damgaard Espaa, S.A.

Pgina 2' de 127

Sentencias (sicas de) )engua*e +,, Kamos a mostrar a continuacin un e#emplo que compara el uso de las instrucciones #or con las instrucciones "hile. I/547;00.1/ -27 int i! for (i(+! iT(+EE! i(i:+) { print i! $ I/547;00.1/ G9.?, int i! i ( +! ?3ile (iT(+EE) { print i! i(i:+! $ ,omo podemos apreciar, conseguimos ahorrarnos algo de cdigo en el caso de la instruccin #or, aunque el funcionamiento es totalmente anlogo.

E#emplos de 6or-

*) for (iI0J iPdictEnum.%alues()J i<<) Q sentencias R +) for (iI*J iPIconlen(c)J i<<) Q sentencias R

Damgaard Espaa, S.A.

Pgina 24 de 127

Instrucciones de acceso a registros

Instrucciones de acceso a re#istros


11. Introduccin
El lengua#e ;<< integra comandos comunes de 8@( que facilitan en gran medida el acceso a los datos almacenados en las ta"las de la aplicacin y el mane#o de los mismos. (a sinta&is de estos comandos es muy similar a la del lengua#e 8@(, por lo tanto resultar familiar para la mayor a de desarrolladores de soft=are

12.

Instruccin 'E)E*+
(a mayor a de los procesos que se programan suponen la manipulacin de los datos almacenados en las ta"las y, por lo tanto, el acceso a la "ase de datos. Por esta ra!n, e&iste en ;<< la instruccin select, que es pro"a"lemente la instruccin ms potente y ms ampliamente utili!ada en el lengua#e. (a instruccin select tiene como propsito "uscar y manipular los datos de la "ase de datos. Para ello utili!a una %aria"le de tipo ta"la, que de"e ser declarada antes de que pueda ser e#ecutada la instruccin select. El resultado de la seleccin de registros se de%uel%e en esta %aria"le, que por lo tanto es utili!ada para manipular los datos. :ediante una sentencia select recuperamos un grupo de registros de la "ase de datos, aunque en cada momento slo tenemos acceso a uno de ellos. Para manipular otros registros del grupo, de"emos despla!arnos a tra%'s de 'l mediante la instruccin next. /a"lando t'cnicamente, la instruccin select crea un cursor que puede a%an!ar al siguiente registro mediante la instruccin next. (a sinta&is es la siguiente"nstr#ccin>elect ( select Parmetros

Parmetros ( [ [Upciones5VsQ#eda] [Lista&ampos from] ] %ariableTabla ["nstr#ccin"ndice] [Upciones] ["nstr#ccinW3ere] [instr#ccin'oin] Upciones5VsQ#eda nofetch &ampo &lc#lo ( reverse X findfast X firstonly X forupdate X X X Y X "dentificador&ampo X count minof X ma!of

Lista&ampos ( &ampo {1 &ampo$ ( sum X X av

( 9;re;ar ( "dentificador&ampo)

Upciones ( ( order by [Direccin] "nstr#cciones"ndice Direccin "nstr#ccinW3ere ( asc

roup by ) "dentificador&ampo

{1 "dentificador&ampo [Direccin]$ ( inde! id6 X desc X inde! hint id6

( where 46presin

Damgaard Espaa, S.A.

Pgina 2 de 127

Instrucciones de acceso a registros "nstr#ccin'oin Parmetros ( [ e!ist X not e!ist X outer ] "oin

$ continuacin, %eamos un e#emplo de instruccin select. oid selectRecords() { M2Table m2Table! select Y from m2Table order b2 Table&ode ?3ere Table&ode H +EE! $ En el anterior e#emplo, seleccionamos todos los registros de la ta"la llamada MyTable que tienen un %alor mayor que *00 en el campo Table2ode, y de%ol%emos el primero de ellos en la %aria"le myBable.

2 ando deseamos acceder /nicamente a n n/mero red cido de campos de la tabla es m0s apropiado' desde el p nto de vista de la e#iciencia del sistema' especi#icar la lista de campos % e acceder a registros completos-

Por lo tanto, y segn la nota anterior, en el e#emplo siguiente, el m'todo methodA ser a mucho ms eficiente que el m'todo method3oid met3od9 { &#stTable c#stTable! ! select Y from c#stTable! ?3ile (c#stTable*acco#ntN#m) { print c#stTable*acco#ntN#m! ne6t c#stTable! $ $ oid met3od5 { &#stTable c#stTable! !

Damgaard Espaa, S.A.

Pgina 2! de 127

Instrucciones de acceso a registros select acco#ntN#m from c#stTable! ?3ile (c#stTable*acco#ntN#m) { print c#stTable*acco#ntN#m! ne6t c#stTable! $ $ Bam"i'n podemos utili!ar la sentencia next sin necesidad de tener una instruccin select pre%ia. En estos casos se comporta como si hu"i'ramos reali!ado un select impl cito sin clusula "here. Por e#emploEB,63?2 1 { M2Table m2Table! ne6t m2Table! $ EB,63?2 2 { M2Table m2Table! select Y from m2Table! $ En am"os casos el resultado ser a el mismo. Bendr amos el primer registro de la ta"la MyTable en la %aria"le myBa"le.

12.1.

O30.2/,5 :, >I5J;,:8

$l descri"ir la sentencia select, se han nom"rado una serie de opciones de "squeda que se descri"en a continuacin 7,=,75,- los registros son de%ueltos en orden in%erso -.754-854- esta opcin acelera la captura de los registros. En realidad, de%uel%e la primera fila ms rpidamente, pero el tiempo total de acceso puede ser mayor. Esta opcin suele utili!arse en actuali!aciones de dilogos. -.7542/?A- slo de%uel%e el primer registro que cumple la condicin de seleccin. -27;3:84,- selecciona los registros para ser actuali!ados. Es decir, los registros accedidos son modificados y posteriormente se actuali!a la "ase de datos. Dependiendo del gestor de "ase de datos, los registros pueden quedar "loqueados de forma que otros usuarios no puedan acceder simultneamente.

Damgaard Espaa, S.A.

Pgina 27 de 127

Instrucciones de acceso a registros /2-,409- indica que los registros no %an a ser accedidos por el momento. 8e utili!a cuando el resultado de la seleccin se pasa a otro o"#eto de la aplicacin.

12.2.

O30.2/,5 :, 0E?0;?2

(as posi"les opciones de clculo que presenta la sentencia select se descri"en a continuacin 5;6- suma 8=C- media 6./2-- m nimo 68K2-- m&imo 02;/4- nmero de registros Bodas estas funciones reali!an el clculo so"re las filas agrupadas segn la sentencia gro p by.

!i deseamos reali$ar n c0lc lo sobre n campo de na tabla' es m cho m0s e#iciente tili$ar las opciones de c0lc lo de la instr cci.n select % e seleccionar el gr po de registros' recorrerlos no a no y reali$ar el c0lc lo en n estro c.digo- :a ra$.n de esto es #0cil de entender si tenemos en c enta % e la instr cci.n select la ejec ta el servidor de base de datos-

En 8@( estndar, si ningn registro de la ta"la cumple las condiciones de seleccin, el resultado es una fila, cuya columna co nt %ale 0 y las restantes funciones de clculo de%uel%en A)((. Dado que $&apta no soporta el concepto de %alores A)((, si ningn registro cumple las condiciones de seleccin, no de%uel%e ninguna fila al usuario. 8in em"argo, si la nica funcin de clculo que se ha utili!ado es co nt, se de%ol%er una fila (como indica el lengua#e 8@( estndar) con %alor 0 en el campo utili!ado en la funcin co nt. 8i la instruccin select conten a una lista de campos, 'stos tomarn el %alor A)(( en el sentido en que lo toma $&apta. En $&apta, cada tipo de datos tiene asignado un %alor que se interpreta como %alor A)(( "a#o determinadas circunstancias-

T.32 :, :8425 ,adena Entero Oeal 6echa Damgaard Espaa, S.A.

*8?27 NULL LM (cadena %ac a) 0 0.0 0*>0*>*90* Pgina 2$ de 127

Instrucciones de acceso a registros

/ora Enumerado

00-00-00 primer %alor

12.3.

En la mayor)a de los casos' para saber alg/n registro c mple las condiciones de selecci.n' se cons lta si el valor del campo ;ecId del registro es no n lo-

O7:,/ :, ?25 7,C.54725

,uando el orden de los datos es importante, de"emos utili!ar order by en las instrucciones select. $dems, si creemos que la "ase de datos no %a a ser capa! de decidir que ndice de"e utili!ar para "uscar los datos, de"emos utili!ar la pala"ra index para indicarle el ndice a utili!ar. De"emos com"inar estas dos e&presiones para conseguir que MorphX seleccione los registros en un orden espec fico. )tili!aremos la pala"ra index con#untamente con order by, si queremos asegurarnos que el orden de los registros es el que a nosotros nos interesa. 8in em"argo no utili!aremos order by, si nicamente necesitamos o"tener los registros seleccionados en el orden definido por el ndice. En general, los ndices los utili!aremos para optimi!ar la seleccin de registros. $ continuacin presentamos un e#emplooid selectRecords() { M2Table table! select Y from table inde6 table"d6 order b2 Table&ode ?3ere Table&ode H +EE! $ En este e#emplo seleccionar amos todos los registros de la ta"la que tu%ieran un %alor mayor que *00 en el campo Table2ode, ordenados por ese campo y utili!ando como ndice el definido en la ta"la de nom"re tableIdx.

12.4.

R,?80.2/,5 ,/47, 48>?85

,uando queremos seleccionar datos que pro%ienen de dos ta"las relacionadas, de"emos utili!ar la pala"ra join. Es muy importante que am"as ta"las est'n relacionadas para o"tener los datos correctos. 8in em"argo, las relaciones que se hayan definido en el r"ol de o"#etos no se heredan cuando reali!amos un join, por tanto en la instruccin select hay que hacer una definicin e&pl cita de las igualdades que nos construyen dichas relaciones. $ continuacin presentamos un e#emplo de instruccin select que o"tiene datos de dos ta"las relacionadas mediante un join. EB,63?2 :, ;4.?.L80.1/ :, B2./ M2Table table9!

Damgaard Espaa, S.A.

Pgina 2% de 127

Instrucciones de acceso a registros Ut3erTable table5! select Y from table9 ?3ere Rield%al#e H +EE Foin table5 ?3ere table9*Table&ode (( table5*Table&ode <<>e especifica la relacin entre tablas Esta instruccin o"tendr a todos los registros de la unin de las ta"las tableA y table3, que tu%ieran un %alor mayor de *00 en el campo <ield1al e. (a relacin entre las ta"las se reali!a con la igualdad de la instruccin tableA-Table2ode == table3-Table2ode , siendo estos los campos comunes entre am"as ta"las. Pueden definirse distintos tipos de relaciones entre ta"las, que se corresponden con los tipos de uniones definidos en la creacin de formularios B2./- 8elecciona los registros de la ta"la principal que tienen registros asociados en la ta"la relacionada. Es decir, en el resultado tendremos un registro principal por cada registro relacionado. ,orresponde con la opcin Inner>oin en la construccin de formularios. ,K.54 B2./- 8elecciona un registro de la ta"la principal si e&isten registros relacionados en la ta"la asociada. Este tipo de unin se diferencia del anterior en que slo de%uel%e el primer registro que encuentra en la ta"la relacionada. /24 ,K.54 B2./- 8elecciona los registros de la ta"la principal que no tienen registros asociados en la ta"la relacionada. 2;4,7 B2./- 8elecciona registros de la ta"la principal tengan o no registros asociados en la ta"la relacionada.

13.

Instruccin ,-I)E.'E)E*+
(a instruccin "hileSselect itera so"re un grupo de registros, que cumplen ciertas condiciones de seleccin, de manera que es posi"le reali!ar operaciones so"re cada registro. (a %enta#a de la instruccin "hileSselect, es que es capa! de despla!arse automticamente por todos los registros seleccionados (por tanto no necesitamos la instruccin next) y e#ecuta instrucciones para cada uno de estos registros. Esta %ersin de instruccin de seleccin de registros es la ms utili!ada en MorphX. ,uando estamos manipulando datos utili!ando esta sentencia, normalmente de"emos utili!ar el concepto de transaccin para asegurarnos la integridad de los mismos. (a sinta&is es la siguientewhile { } "nstr#ccin>elect

Damgaard Espaa, S.A.

Pgina '& de 127

Instrucciones de acceso a registros $ continuacin presentamos un e#emplooid selectRecords() { M2Table table! ?3ile select Y from table order b2 Table&ode ?3ere Table&ode H 7+EE8 { print table*Table&ode! $ $ En este e#emplo seleccionar amos todos los registros de la ta"la que tu%ieran un %alor mayor que *00 en el campo table2ode, ordenados por ese campo e imprimir amos su %alor.

14.

Instruccin /E)E+E0123M
Podemos utili!ar la instruccin delete?#rom para "orrar todos los registros que cumplan una determinada condicin. Esta instruccin es equi%alente a e#ecutar una instruccin "hile9select y reali!ar el "orrado en cada uno de los registros. I/547;00.1/ G9.?,M5,?,04 { M2Table m2Table! ?3ile select m2Table ?3ere *** { m2Table*delete()! $ $ I/547;00.1/ :,?,4,N-726 { M2Table m2Table! deleteBfrom m2Table ?3ere ***! $

Damgaard Espaa, S.A.

Pgina '1 de 127

Instrucciones de acceso a registros ,omo se aprecia en el e#emplo, utili!ando la instruccin delete?#rom en lugar de la "hile9select' podemos economi!ar instrucciones de cdigo ;<< y conseguir el mismo efecto.

Damgaard Espaa, S.A.

Pgina '2 de 127

Estndares para )os m#todos de ta()as

Est!ndares &ara "os 'todos de "as ta "as


15. Introduccin
En un cap tulo anterior se indic que en $&apta podemos encontrar m'todos en todos los o"#etos de la aplicacin, y por lo tanto, en las ta"las. Estas disponen de una serie de m'todos que controlan su funcionalidad "sica, y que sern descritos en cap tulos posteriores. $dems de estos m'todos, el programador puede aadir aqu'llos que considere necesarios. 8in em"argo, de"e a#ustarse a unos estndares de desarrollo. En $&apta, e&isten una serie de procedimientos de desarrollo estndar que son muy importantes. Estos nos determinan la forma de tra"a#ar, con el o"#eti%o de facilitar la programacin, la comprensin del cdigo y la re%isin del mismo por parte de personas distintas a las que han reali!ado el desarrollo inicial. Por eso es de %ital importancia que siempre nos a#ustemos lo ms posi"le a los estndares definidos. )n primer punto importante a sealar, es que no de"emos escri"ir cdigo en ;<< para solucionar pro"lemas que pueden ser resueltos mediante las propiedades de los o"#etos, ya que es una p'rdida de tiempo y un esfuer!o de desarrollo intil. Por otro lado, el cdigo escrito en los m'todos de las ta"las de"e estar directamente relacionado con la ta"la. 8i no es as de"emos plantearnos la posi"ilidad de escri"ir el cdigo en otras partes del sistema. Para aquellas ta"las que tengan una cla%e primaria, SIEMPRE de"emos crear los m'todos estndar que se descri"en en los siguientes apartados.

1".

Mtodo 1I4/
El m'todo #ind nos sir%e para encontrar un registro determinado de una ta"la, a partir de un %alor del campo que sea la cla%e principal de la misma. 8e trata de un m'todo esttico y que reci"e los siguientes parmetros de entrada (a cla%e de la ta"la )n "ooleano opcional utili!ado para indicar si se %an a reali!ar una actuali!acin del registro seleccionado El m'todo find de todas las ta"las sigue la misma estructura. Keamos un e#emploEB,63?2 static &#stTable find(&#st9cco#nt boolean { &#stTable c#stTable! ! if (c#st9cco#nt) c#st9cco#nt1 BforIpdate ( false)

Damgaard Espaa, S.A.

Pgina '' de 127

Estndares para )os m#todos de ta()as { c#stTable*selectRorIpdate(BforIpdate)! select firstonl2 c#stTable inde6 3int 9cco#nt"d6 ?3ere c#stTable*acco#ntN#m (( c#st9cco#nt! $ ret#rn c#stTable! $ El hecho de que #ind sea un m'todo esttico nos facilita la tarea de "uscar un registro de la ta"la desde cualquier lugar del sistema, sin necesidad de tener una instancia de la ta"la 2 stTable. (a forma de e#ecutar el m'todo ser a por lo tanto la siguiente-

&#stTableGGfind(c#stomer) Donde c stomer ser a una %aria"le del tipo 2 stAcco nt que contendr a el %alor de la cla%e del registro que queremos "uscar.

1$.

Mtodo EXI'+
El m'todo exist es un m'todo que nos indica si un registro determinado e&iste en la ta"la, a partir de un %alor del campo que sea la cla%e principal de la misma. 8e trata de un m'todo esttico que tiene como parmetro de entrada el siguiente (a cla%e de la ta"la EB,63?2 static boolean e6ist(&#st9cco#nt c#st9cco#nt) { ret#rn (c#st9cco#nt @@ &#stTableGGfind(c#st9cco#nt)*rec"D K( E)! $ En el e#emplo se puede o"ser%ar que se reali!a una llamada al m'todo #ind. Oesulta e%idente que es mucho ms efica! reutili!ar el cdigo e&istente que reescri"ir la instruccin de seleccin.

1%.

Mtodo +X+43+EXI'+
El m'todo Txt@otExist nos de%uel%e un te&to esttico que utili!amos como mensa#e de error. EB,63?2 static str OE t6tNot46ist()

Damgaard Espaa, S.A.

Pgina '4 de 127

Estndares para )os m#todos de ta()as { ret#rn LM>N>.PP.L! $ (a etiqueta del e#emplo corresponde al te&to 6:a c enta AB no existe8.

1&.

8iempre que introdu!camos una cadena de te&to en el cdigo de"eremos utili!ar etiquetas.

Mtodo *-E*5EXI'+
El m'todo checkExist nos indica si un registro determinado e&iste en la ta"la, a partir de un %alor del campo que sea la cla%e principal de la misma. 8i el registro no e&iste, de%uel%e un mensa#e de error. 8e trata de un m'todo esttico que reci"e el siguiente parmetro de entrada (a cla%e de la ta"la EB,63?2 static boolean c3ecA46ist(&#st9cco#nt c#st9cco#nt) { if (c#st9cco#nt ret#rn tr#e! $ ,omo se o"ser%a en el e#emplo, el m'todo checkExist hace uso de los m'todos exist y txt@otExist descritos anteriormente. Bam"i'n hace referencia a un metodo de la clase Tlo"al 09,0O$8.?,: @@ K&#stTableGGe6ist(c#st9cco#nt)) ret#rn c3ecARailed(strfmt(&#stTableGGt6tNot46ist()1c#st9cco#nt))!

Damgaard Espaa, S.A.

Pgina ' de 127

"#todos disp)a- - edit

Mtodos dis&"a( ( edit


(os t'rminos display y edit corresponden a modificadores de los m'todos, que dotan a 'stos de caracter sticas especiales. (os m'todos de este tipo 8CE:POE de"en tener un %alor de retorno. En este cap tulo %amos a %er cmo y cundo se utili!an estos modificadores.

2(.

Mtodos /I' )67


El modificador display se utili!a para indicar que el %alor de retorno del m'todo %a a ser mostrado en un formulario o en un informe. Podemos utili!ar este modificador en los m'todos de Ba"las 6ormularios 3rigen de datos de formularios Cnformes Diseo de informes

2!.1.

8iempre que sea posi"le, es aconse#a"le escri"ir los m'todos display en ta"las, porque de esta forma puede utili!arse el mismo cdigo en %arios formularios o informes.

D,-./.0.1/ :, ;/ 6@42:2 displa8

Para definir un m'todo display, es necesario escri"ir la pala"ra reser%ada display antes del tipo de retorno del m'todo. Por e#emplodispla2 9mo#nt 9mo#nt() E&iste un caso e&cepcional. ,uando definimos un m'todo display en el origen de datos de un formulario, se de"e incluir dicho origen de datos como parmetro. Por e#emplodispla2 "n entZt2 9cc#m#lated("n ent5#d;et"n ent 5#d;et)

2!.2.

U4.?.L80.1/ :, ;/ 6@42:2 displa8

Aormalmente, los m'todos display se utili!an cuando queremos mostrar un campo calculado en un formulario o en un informe. Ao es recomenda"le, y de hecho no es estndar $&apta, almacenar en la "ase de datos %alores calculados que cam"ian con el tiempo, como por e#emplo la deuda de un cliente. En estos casos el clculo de"e reali!arse en un m'todo display.

Damgaard Espaa, S.A.

Pgina '! de 127

"#todos disp)a- - edit /ay que tener en cuenta que al utili!ar un m'todo display en un formulario, 'ste se e#ecuta cada %e! que el formulario se actuali!a. Por lo tanto, el m'todo no de"e reali!ar clculos que supongan un tiempo mayor al de una consulta directa a la "ase de datos. En los casos en que sea necesario reali!ar clculos costosos, es recomenda"le utili!ar otro formulario para mostrar los %alores calculados que se muestre al pulsar un "otn. De este modo, slo se reali!arn los clculos cuando el usuario lo solicite e&pl citamente. Keamos ahora cmo se utili!an los m'todos display. )na %e! que se ha creado el m'todo, 'ste se utili!ar en un control que se muestre en un formulario o en un informe. (a forma de reali!arlo es independiente del lugar donde se haya escrito el m'todo. Es necesario que el tipo de control y el tipo de retorno del m'todo sean id'nticos. Esto significa que si, por e#emplo, tenemos en el formulario un control del tipo ;ealEdit, el m'todo display que estemos utili!ando de"e de%ol%er un %alor de tipo real.

En un formulario, la propiedad Data!o rce indica donde est situado el m'todo, y la propiedad DataMethod indica el nom"re del m'todo. 8i la propiedad Data!o rce no tiene %alor, el sistema asume que el m'todo ha sido definido en el formulario. En la siguiente figura se muestra la %entana de propiedades de un control de tipo real de un formularioEn un informe, la propiedad DataMethod tam"i'n indica el nom"re del m'todo display. 8i la propiedad Table no tiene %alor, el sistema asume que el m'todo ha sido definido en el informe o en la clase de sistema ;eport; n, donde tam"i'n e&isten m'todos display. Por el contrario, cuando la propiedad Table tiene %alor, el sistema "usca el m'todo display en la ta"la correspondiente.

Damgaard Espaa, S.A.

Pgina '7 de 127

"#todos disp)a- - edit 8i la propiedad ExtendedDataType tiene %alor, el formato, el te&to de ayuda, etc., se o"tendrn del tipo de datos correspondiente. 8i el m'todo display de%uel%e un %ector, la propiedad ArrayIndex a 0 indica que todos los elementos del %ector de"en ser mostrados en el informe. 8i, por e#emplo, ponemos la propiedad ArrayIndex a +, solo el elemento nmero + del %ector es mostrado.

21.

Mtodos E/I+
El modificador edit es una e&tensin del modificador display, de forma que los controles que utili!an un m'todo edit' adems de mostrar un %alor aceptan la entrada de datos por parte del usuario. Puede utili!arse en m'todos de los siguientes elementos Ba"las 6ormularios 3r genes de datos de los formularios

21.1.

D,-./.0.1/ :, ;/ 6@42:2 edit

El formato de los parmetros en un m'todo edit es un poco diferente al de los m'todos display. Este es un e#emplo de un m'todo edit en una ta"la4dit RreeT6t T6tDefa#lt(boolean >et1 RreeT6t T6t) )tili!amos am"os parmetros cuando el m'todo est asociado a un control de un formulario. El parmetro "ooleano !et es %erdadero si el usuario ha introducido algn %alor en el control. El parmetro de te&to Txt se utili!a para almacenar los %alores que el usuario ha introducido en el control. El formato de parmetros para los m'todos edit que utili!amos en un formulario es id'ntico al utili!ado en las ta"las. 8in em"argo, cuando utili!amos el m'todo edit como m'todo de un origen de datos de un formulario, dicho origen de datos de"e aparecer tam"i'n como parmetro, por e#emploedit 9mo#nt >ettle(boolean set1 &#stTrans Bc#stTrans1 9mo#nt #)

22.

2esumen del aspecto de los par!metros para los mtodos displa8 8 edit

P87E6,4725 3878 :.53?8A M@42:2 ,/ 48>?8 Ainguno

P87E6,4725 3878 ,:.4 de datosV de datosV de origen de datos

Uoolean 8et PBipo %alor Uoolean 8et PBipo M@42:2 ,/ -276;?87.2 Ainguno %alor M@42:2 ,/ ,? 27.C,/ :, PBipo de origen de datosV Uoolean 8et PBipo :8425 :, ;/ -276;?87.2 3rigen de datos de datosV 3rigen

Damgaard Espaa, S.A.

Pgina '$ de 127

"#todos disp)a- - edit

PBipo de datosV %alor M@42:2 ,/ ;/ ./-276, Ainguno Ao aplica"le Ao aplica"le

M@42:2 ,/ ,? :.5,P2 :, Ainguno ;/ ./-276,

Damgaard Espaa, S.A.

Pgina '% de 127

"#todos disp)a- - edit

Mtodos !sicos en ta "as


23. /e#inicin 8 modi#icacin de mtodos en ta9las
,uando se crea una nue%a ta"la en el $r"ol de 3"#etos de la $plicacin, MorphX automticamente crea una serie de m'todos para ella. $adiendo cdigo ;<< a estos m'todos podemos modificar el comportamiento predeterminado del sistema. $dems, podemos definir nuestros propios m'todos. (os m'todos de sistema y los definidos por el usuario comparten el mismo m"ito, por lo tanto es posi"le aadir nue%os m'todos que pueden ser utili!ados desde los m'todos definidos por el sistema. $s como acceder a los m'todos de sistema desde cualquier nue%o m'todo. Es importante sealar que no podemos modificar el tipo de retorno, la lista de parmetros o el tipo de dichos parmetros en los m'todos definidos por el sistema, aunque podemos aadir parmetros adicionales siempre que declaremos un %alor predeterminado para ellos.

24.

Mtodos de sistema
(os m'todos de sistema son e#ecutados cuando se utili!a la ta"la, por e#emplo, cuando introducimos, actuali!amos o "orramos datos. El cuerpo de estos m'todos inicialmente nicamente contiene una llamada al m'todo s per*,. En cap tulos posteriores se descri"ir con ms detalle este m'todo. De momento nos "asta con sa"er que corresponde al comportamiento predeterminado del sistema. ,uando se aade cdigo ;<< a los m'todos definidos por el sistema, se so"recarga este comportamiento. $ continuacin se presentan la lista de m'todos de sistema de una ta"la. En apartados posteriores se descri"irn con ms detalle los ms importantes. M@42:2 C834.2/ S, ,B,0;48 0;8/:2... se muestra la ca"ecera de un formulario. El te&to se genera a partir de las propiedades de la ta"la. se "orran los campos del registro actual (tienen %alores A)((). se elimina un registro. se muestra en la "arra de estado el te&to de ayuda de un campo, por e#emplo cuando pasamos al campo siguiente en un formulario. Cniciali!a los campos de un registro reci'n creado.

C?,87 D,?,4, #,?3$.,?:

I/.4*8?;,

Damgaard Espaa, S.A.

Pgina 4& de 127

"#todos disp)a- - edit

I/5,74 M,7C, P254L28: R,/86,P7.687AQ,A R,R,8: T22?T.3$.,?: T22?T.3R,027:

se introduce un nue%o registro en la ta"la. se unen o com"inan dos registros. se carga un registro. se renom"ra la cla%e primaria de la ta"la. se relee un registro. el puntero del ratn se sita en un campo de un formulario. se %a a mostrar un conse#o para el campo actual. El m'todo s per*, reali!a una llamada a 2aption. antes de modificar un registro e&istente. se %a a "orrar un registro. se a"andona un campo, por e#emplo cuando saltamos al siguiente campo de un registro. antes de escri"ir un registro en la "ase de datos.

U3:84, *8?.:84,D,?,4, *8?.:84,$.,?:

*8?.:84,F7.4,

24.1.

M@42:25 :, =8?.:80.1/ ,/ 48>?85

(os m'todos de %alidacin permiten al programador compro"ar que se cumplen ciertas condiciones antes de que se e#ecute una accin. En $&apta, se pueden programar m'todos de %alidacin a dos ni%eles Ba"la 3rigen de datos de un formulario En este cap tulo slo %eremos los m'todos de %alidacin en ta"las. 8in em"argo, es importante conocer que los m'todos de %alidacin de las ta"las se e#ecutan siempre que se introducen o "orran registros. :ientras que si la %alidacin se reali!a en el formulario, slo funcionar cuando estemos tra"a#ando con ese formulario.

Damgaard Espaa, S.A.

Pgina 41 de 127

"#todos disp)a- - edit

8iempre que sea posi"le, la %alidacin de datos de"e reali!arse en la ta"la.

+2.*.*. :'todos
(os m'todos de %alidacin en ta"las son los siguientes)a Kalidate6ield 8e e#ecuta cuando mo%emos el cursor desde un campo del formulario a otro, es decir, cuando a"andonamos un campo. De%uel%e un dato de tipo "ooleano. 8i el resultado es falso, el cursor permanecer en el campo. (a llamada al m'todo s per*, comprue"a las relaciones de %alidacin, es decir, relaciones en un campo donde la propiedad 1alidate tiene %alor afirmati%o. Por lo tanto, de"emos respetar la tarea reali!ada por dicho m'todo s per*,.

)"

@o deben codi#icarse validaciones % e p edan reali$arse con alg na propiedad- As)' evitaremos escribir c.digo en el m&todo 1alidate<ield si las condiciones p eden comprobarse con la propiedad 1alidate de na relaci.nKalidateWrite 8e e#ecuta antes de insertar o actuali!ar un registro en la ta"la. De%uel%e un dato de tipo "ooleano. 8i de%uel%e falso, el registro no se inserta o actuali!a. (a llamada al m'todo s per*, e&amina todos los campos para compro"ar el %alor de la propiedad Mandatory. Por lo tanto, de"emos respetar la tarea reali!ada por dicho m'todo s per*,.

)c

Evitaremos introd cir c.digo % e compr ebe si n campo tiene valor' siempre % e podamos tili$ar la propiedad MandatoryKalidateDelete

Ao hay que ol%idar, que a menudo tam"i'n queremos compro"ar ciertas condiciones antes de "orrar un registro de una ta"la. Para hacer esto, utili!amos el m'todo 1alidateDelete*,. 1alidateDelete*, se llama automticamente desde formularios y es utili!ado para compro"ar si el registro actual puede ser "orrado. (a llamada al m'todo s per*, comprue"a si hay registros relacionados en ta"las con DeleteActions del tipo ;estricted. 8i ese es el caso, el m'todo s per*, de%uel%e falso. Por lo tanto, de"emos respetar la tarea reali!ada por dicho m'todo.

!iempre % e podamos m&todo 1alidateDelete-

tili$ar

n DeleteAction' evitaremos introd cir c.digo en el

Damgaard Espaa, S.A.

Pgina 42 de 127

"#todos disp)a- - edit

+2.*.+. Estructura de los m'todos de %alidacin


Para mantener una "uena estructura de programacin, es recomenda"le que el cdigo para las compro"aciones no se site directamente en estos m'todos de %alidacin. Es ms con%eniente que creemos m'todos de compro"acin que sern llamados desde los m'todos de %alidacin anteriormente descritos. EB,63?2 :, 6@42:2 :, =8?.:80.1/ 5oolean { 5oolean ret! ret ( c3ecA>omet3in;() @@ c3ecA>omet3in;4lse()! ret#rn ret! $ ,uando no se cumple alguna de las condiciones, el m'todo de compro"acin de"e reali!ar dos cosas presentar al usuario un mensa#e de error de%ol%er el %alor falso como resultado El m'todo 2heck<ailed*CMensaje de errorD, escri"e la cadena de te&to que reci"e como parmetro en la %entana de informacin (C n#olog, y de%uel%e el %alor falso. Por lo tanto, mediante la utili!acin de este m'todo, conseguimos simultneamente los dos o"#eti%os. EB,63?2 :, ;4.?.L80.1/ :, C9,0O$8.?,: 5oolean c3ecA>omet3in; () { 5oolean ret! if (Ksomet3in;) { ret ( c3ecARailed([>omet3in; is ?ron;\)! $ ret#rn ret! $ Podr amos utili!ar la estructura anterior, pero e&isten casos en los que nos interesa compro"ar la misma condicin !omething, presente en el m'todo 2heck!omething*,, sin presentar ningn mensa#e al usuario. En este caso necesitar amos un m'todo adicional, que compro"ara la condicin pero que no mostrara ningn mensa#e. alidateWrite()

Damgaard Espaa, S.A.

Pgina 4' de 127

"#todos disp)a- - edit 8in em"argo, esto no ser a muy eficiente, porque estar amos duplicando el cdigo de compro"acin, por lo tanto es ms recomenda"le crear un m'todo llamado !omething*,, al que podremos llamar cuando queramos, que se encargar de reali!ar dicha compro"acin. De"eremos, adems, cam"iar el m'todo 2heck!omething*,, para que realice una llamada a este nue%o m'todo. El m'todo 2heck!omething*, lo utili!aremos nicamente cuando queramos mostrar un mensa#e al usuario. EB,63?2 :, =8?.:80.1/ 0263?,48 5oolean somet3in; () { if (Ksomet3in;) { ret#rn false! $ ret#rn tr#e! $ 5oolean c3ecA>omet3in; () { 5oolean ret! if (Ksomet3in;()) { ret ( c3ecARailed([>omet3in; is ?ron;\)! $ ret#rn ret! $

Eodemos considerar n est0ndar de nomenclat ra de Axapta' la tili$aci.n del pre#ijo 2heck' en el nombre de todos a% ellos m&todos % e hagan na llamada al m&todo global 2heck<ailed*,- De esta #orma sabremos % & m&todos presentan mensajes en la ventana In#olog-

24.2.

M@42:25 :, 5.54,68 6E5 ;4.?.L8:25

$ continuacin %amos a descri"ir algunos de los m'todos ms utili!ados en las ta"las, que por su importancia merecen un tratamiento algo ms e&hausti%o. (os e#emplos de los m'todos han sido o"tenidos a partir de la ta"la 2 stTable. )a CnitKalue

Damgaard Espaa, S.A.

Pgina 44 de 127

"#todos disp)a- - edit El m'todo Init1al e se e#ecuta cuando aadimos un nue%o registro. Bam"i'n es llamado automticamente desde los formularios. Por lo tanto, utili!aremos el m'todo para asignar %alores iniciales o por defecto en un nue%o registro. EB,63?2 oid init%al#e() { &#stParameters c#stParameters! s#per()! t3is*lan;#a;e"d ( &#stParametersGGlan;#a;e"d()! t3is*c#rrenc2 ( &ompan2"nfoGGfind()*c#rrenc2&ode! $ /ay que sealar que la llamada al m'todo s per*, no hace nada. )" Cnsert El m'todo Insert se e#ecuta cuando se introduce un nue%o registro en la ta"la. Es muy importante asegurar cualquier transaccin relacionada para asegurar la integridad de la "ase de datos. (as t'cnicas de control de transacciones se %ern en un cap tulo posterior. EB,63?2 oid insert() { t3is*setName9lias()! s#per()! $ 8i el registro no puede ser insertado en la ta"la, la llamada al m'todo s per*, de%uel%e un error. )c )pdate El m'todo Fpdate se e#ecuta antes de modificar un registro e&istente en la ta"la. En este caso, tam"i'n es muy importante controlar cualquier transaccin relacionada para asegurar la integridad de la "ase de datos. EB,63?2 oid #pdate() { &#stTable t3isBUri; ( t3is*ori;()! ttsbe;in! t3is*setName9lias()!

Damgaard Espaa, S.A.

Pgina 4 de 127

"#todos disp)a- - edit s#per()! t3is*set9cco#ntUn%end(t3isBUri;)! if (t3isBUri;*c#stJro#p K( t3is*c#stJro#p) Rorecast>alesGGset&#stJro#p"d(t3is*acco#ntN#m1 t3isBUri;*c#stJro#p1 t3is*c#stJro#p)! ttscommit! $ En el e#emplo se utili!a el m'todo orig*,. Este m'todo nos da acceso al registro antes de la actuali!acin. )d Delete El m'todo delete se e#ecuta cuando se elimina un registro. Es muy importante asegurar cualquier transaccin relacionada para asegurarnos la integridad de la "ase de datos. 8upongamos dos ta"las relacionadas llamadas TableA y Table3. 8i en TableA hemos definido un DeleteAction de tipo cascada (2ascade) con respecto a Table3, cuando se "orre un registro de TableA se "orrarn los registros relacionados en Table3. Por ra!ones de rendimiento, se de"e e%itar escri"ir cdigo en el m'todo Delete de dichas ta"las relacionadas (en el e#emplo, Table3). 8i no se ha aadido cdigo, los "orrados en cascada pueden ser reali!ados rpidamente por el sistema gestor de "ase de datos utili!ando directamente instrucciones de "orrado 8@(. 8in em"argo, si aadimos cdigo en esas ta"las (lo que puede ser necesario en algunas ocasiones), el sistema crea una instruccin "hile select y e#ecuta el m'todo Delete en todas las ta"las hi#as relacionadas. De esta forma el rendimiento es menor que cuando utili!amos directamente instrucciones de "orrado en 8@(.

Damgaard Espaa, S.A.

Pgina 4! de 127

.ontro) de transacciones

Contro" de transacciones
25. Introduccin
)na transaccin es una unidad lgica de tra"a#o. (as transacciones son operaciones de todo o nada, que aseguran la integridad de los datos en las actuali!aciones ms compelas. ,onsideremos el caso en el que queremos actuali!ar un grupo de registros. 8i el sistema se estropea o el proceso es cancelado durante la operacin, algunos registros pueden ha"er sido actuali!ados y otros no. 8i reali!amos la actuali!acin dentro de una transaccin, el sistema nos garanti!a que o "ien se actuali!a completamente la totalidad de los registros o no se reali!a ninguna operacin. Es decir, la actuali!acin nicamente se consigue cuando la transaccin finali!a con '&ito. El uso de transacciones nos asegura, en caso de fallo del sistema, la recuperacin de los datos en su estado inicial, mediante un retroceso ( rollback). 3tro aspecto a tener en cuenta es que podr a darse el caso de que dos procesos estu%ieran accediendo a un mismo registro. 8upongamos que el proceso $ lee un registro y a continuacin un proceso U lee el mismo registro. En un instante posterior, el proceso $ actuali!a el registro y a continuacin el proceso U reali!a la misma operacin. En este caso, los cam"ios reali!ados por el proceso $ se perder an. (a solucin a este pro"lema es "loquear los registros o las ta"las durante las transacciones de actuali!acin (insert, pdate y delete). Esto podemos hacerlo mediante la sentencia select #orFpdate.

2".

Instrucciones ++'
(as instrucciones tts se utili!an para marcar el inicio y el final de una transaccin.

2 .1.

I/547;00.1/ TTSBEGIN

)tili!amos la sentencia ttsbegin para marcar el comien!o de una transaccin. Esto nos asegura la integridad de datos y garanti!a que todas las actuali!aciones reali!adas hasta la finali!acin de la transaccin son consistentes, o por el contrario no se reali!a ninguna. (a instruccin ttsbegin no tiene ningn sentido si no tenemos una instruccin de final de transaccin.

2 .2.

I/547;00.1/ TTSCOMMIT

)tili!amos la sentencia ttscommit para indicar que una transaccin ha finali!ado con '&ito. Esta instruccin termina una transaccin y lle%a a ca"o todas las actuali!aciones reali!adas. MorphX garanti!a que una transaccin terminada con la instruccin ttscommit ser reali!ada por completo.

Damgaard Espaa, S.A.

Pgina 47 de 127

.ontro) de transacciones

2 .3.

I/547;00.1/ TTSABORT

(a sentencia ttsabort nos permite desechar todos los cam"ios reali!ados en la transaccin actual de una manera e&pl cita. Esto trae como consecuencia la finali!acin de la transaccin y la %uelta de la "ase de datos a la situacin inicial, #usto antes de comen!ar la transaccin. Por lo tanto, es como si no hu"i'ramos reali!ado ningn cam"io. Aormalmente, utili!aremos esta sentencia si detectamos que el usuario quiere detener la tarea actual. El uso de la instruccin ttsabort, nos asegura que la "ase de datos ser consistente. $ menudo, la me#or solucin es utili!ar las sentencias de gestin de e&cepciones en lugar de utili!ar la sentencia ttsabort.

2 .4.

A/.:86.,/42 :, 478/5800.2/,5

(as instrucciones entre las sentencias ttsbegin y ttscommit, pueden incluir uno o ms "loques de transacciones, es decir podemos anidar dichas transacciones. $ continuacin presentamos un e#emploEB,63?2 :, 478/5800.2/,5 8/.:8:85 ttsbe;in! << "nstr#cciones ttsbe;in! << "nstr#cciones ttscommit! << "nstr#cciones ttscommit! En estos casos es importante sealar, que la transaccin que realmente importa es la ms e&terna, es decir la que a"rimos en primer lugar. De forma que nada se actuali!a hasta que finali!a con '&ito la ltima instruccin ttscommit.

2$.

*ontrol de la integridad de transacciones


$&apta dispone de t'cnicas internas de control que aseguran la integridad de las transacciones codificadas por los programadores de ;<<.

2".1.

C2/472? :, 5,?,00.1/ 1or:pdate

Este tipo de control asegura que ningn registro puede ser actuali!ado o "orrado si pre%iamente no ha indicado e&pl citamente que se selecciona para ser actuali!ado. )n registro puede ser seleccionado para ser actuali!ado mediante la opcin #orFpdate de la sentencia select o "ien mediante el m'todo select<orFpdate de las ta"las. ,omo e#emplo, $&apta generar a un error ante la siguiente transaccin ya que el registro no se ha seleccionado para su actuali!acin-

Damgaard Espaa, S.A.

Pgina 4$ de 127

.ontro) de transacciones ttsbe;in! select Y from m2Table! m2Table*m2Rield ( [62=\! m2Table*#pdate()! ttscommit!

2".2.

C2/472? 8 /.=,? :, 478/5800.1/ RttsS

Este control asegura que un registro nicamente puede ser actuali!ado o "orrado dentro de la transaccin en la que ha sido seleccionado para actuali!acin. El siguiente e#emplo dar a lugar a un error dado que la seleccin y la actuali!acin se reali!an en transacciones diferentesttsbe;in! select forIpdate Y from m2Table! m2Table*m2Rield ( [62=\! ttscommit! ] ttsbe;in! m2Table*#pdate()!

Damgaard Espaa, S.A.

Pgina 4% de 127

/erramientas de desarro))o

)erra'ientas de desarro""o
2%. El editor
El editor de cdigo se puede a"rir pulsando dos %eces con el ratn so"re el nom"re de un m'todo, o "ien seleccionando la opcin Edit del men conte&tual de dicho m'todo. El nom"re del m'todo seleccionado se muestra dentro de una solapa. El editor facilita el tra"a#o con %arios m'todos a la %e!, ya que cada %e! que editamos un m'todo de la misma clase, se crea una nue%a solapa en la misma %entana. Por otro lado, permite utili!ar las funciones de edicin estndar de Windo=s tales como copiar, cortar y pegar. (a opcin Intelli!ense resulta de gran ayuda al desarrollador, ya que cada %e! que 'ste introduce el nom"re de un o"#eto, le muestra su lista de miem"ros (%aria"les y m'todos). De este modo, el programador no necesita recordarlos. Esta opcin est acti%a por defecto, pero puede desacti%arse desde la %entana de opciones de desarrollo. Esta lista se presenta tam"i'n, si el desarrollador marca el o"#eto con el ratn y selecciona la opcin TB;5087 3723.,:8:,5)6@42:25U del men conte&tual o "ien pulsa el "otn de la "arra de herramientas del editor. El resultado se muestra en la figura *.

6igura *. 3pcin LUuscar propiedades>m'todosM.

8i situamos el cursor so"re un o"#eto que no dispone de miem"ros, el sistema muestra un mensa#e de ayuda emergente con informacin so"re el tipo de o"#eto, tal y como muestra la figura +.

Damgaard Espaa, S.A.

Pgina & de 127

/erramientas de desarro))o

6igura +. 3pcin LUuscar propiedades>m'todos.

Esta informacin tam"i'n puede o"tenerse mediante la com"inacin de teclas CTRL+SPACE. El men conte&tual nos ofrece otras opciones de "squeda, como TB;5087 ,4.J;,48)4,K42U que a"re el generador de etiquetas. Este mismo resultado se o"tiene pulsando so"re el "otn de la "arra de herramientas del editor.

Por ltimo, la opcin TB;5087 :,-./.0.1/U e#ecutada so"re un m'todo, a"re este m'todo en una nue%a %entana del editor. El editor tam"i'n nos ofrece la posi"ilidad de utili!ar la tecla $1 para o"tener ayuda sensi"le al conte&to. 8i marcamos con el ratn un elemento cuya informacin de ayuda se encuentra en la Doc mentaci.n de sistema o "ien en la Doc mentaci.n de la aplicaci.n y pulsamos 6*, se mostrar esta ayuda. $s , por e#emplo si marcamos una %aria"le perteneciente a una clase de sistema y pulsamos 6*, o"tendremos ayuda acerca de esta clase. 8i 6* se pulsa en un elemento del que no se dispone informacin, o"tendremos ayuda acerca del uso del editor de te&to. El men conte&tual nos ofrece otras utilidades como las listas de o"#etos. $s , encontramos las siguientes opciones Enumerar ta"las Enumerar clases Enumerar tipos (istar enumeraciones Enumerar pala"ras reser%adas Enumerar funciones incorporadas

Damgaard Espaa, S.A.

Pgina 1 de 127

/erramientas de desarro))o ,ada una de estas opciones muestra la lista de o"#etos correspondiente, de la cual podemos seleccionar el que nos interese. En la figura siguiente podemos %er el resultado de seleccionar la opcin L(istar enumeracionesM. ,omo %emos, tenemos acceso a los elementos del enumerado seleccionado.

6igura .. 3pcin L(istar enumeracionesM.

Para salir del editor podemos pulsar la tecla ESC. 8i hemos reali!ado cam"ios, el sistema preguntar si queremos guardar dichos cam"ios.

2&.

El generador de eti;uetas
,uando tengamos la necesidad de introducir algn te&to en nuestro cdigo lo haremos utili!ando una etiqueta. (as etiquetas en Axapta son uno de los elementos fundamentales para asegurarnos que las aplicaciones reali!adas sern multiXlengua#e, es decir, podremos elegir el idioma en el que queremos que apare!can nuestros formularios, informes, cuadros de dilogo, etc. Para la creacin de etiquetas disponemos en Axapta de un generador de etiquetas que %a a facilitar nuestro tra"a#o. ,uando pulsamos con el ratn so"re el "otn , nos aparece esta herramienta, que nos permite "uscar, crear e insertar etiquetas. ,omo hemos comentado en el apartado anterior, el generador de herramientas tam"i'n se puede a"rir mediante la opcin LUuscar etiqueta>te&toM del men conte&tual.

Damgaard Espaa, S.A.

Pgina 2 de 127

/erramientas de desarro))o

6igura 2. El generador de etiquetas.

(a lista desplega"le I:.268 5,?,00.2/8:2, muestra el lengua#e que se seleccion al poner en funcionamiento la aplicacin. ,uando comen!amos la "squeda de una cadena de te&to determinada, este parmetro determina el fichero de etiquetas en el cual se reali!ar la "squeda. El cuadro de te&to BI5J;,:8 :, ,4.J;,48, nos permite introducir la cadena de te&to que queramos "uscar en el fichero de etiquetas. (a "squeda encuentra todas las instancias de la cadena de te&to. El "otn de comando B;5087 89278, comien!a la "squeda de la cadena de te&to que se haya introducido en el cuadro de te&to que aca"amos de descri"ir. (a lista en el cuadro de dilogo muestra el resultado de la "squeda de la cadena de te&to. 8e nos muestran los nom"res de todas las etiquetas, por las que nos podemos despla!ar utili!ando los "otones S.C;.,/4, y A/4,7.27. (a casilla de %erificacin M254787 42:25 ?25 .:.2685, muestra las traducciones de la etiqueta actual en todos los lengua#es disponi"les en nuestra instalacin de $&apta. (a lista desplega"le A709.=2 :, ,4.J;,485, nos muestra los caracteres que identifican un archi%o de etiquetas. El nom"re de los archi%os de etiquetas se compone del siguiente modo- $&PidentificadorVPidiomaV.ald, donde ald es el acrnimo de application label data (datos de etiquetas de la aplicacin). En la aplicacin estndar, el identificador del archi%o es 8Y8. En nuestros desarrollos podremos definir un archi%o de etiquetas para el ni%el en el que estemos tra"a#ando o "ien podemos utili!ar otras t'cnicas, tales como crear un archi%o por cada aplicacin desarrollada.

Damgaard Espaa, S.A.

Pgina ' de 127

/erramientas de desarro))o

3(.

El depurador
El depurador es una herramienta de desarrollo presente en el entorno MorphX, como sucede en la mayor a de entornos de programacin. (a utili!acin del depurador %a a ser muy til en tareas relacionadas con la programacin de aplicaciones, como la deteccin de errores, optimi!acin de cdigo, etc. ,on el depurador podemos reali!ar distintas operaciones, que pueden ser e#ecutadas desde los "otones de la "arra de herramientas o "ien mediante una com"inacin de teclas. Estas operaciones son las siguientesE#ecutar cdigo E#ecutar paso a paso las l neas de cdigo Cntroducir puntos de ruptura (breakpoints) $"rir una %entana de %aria"les, donde se muestra una l nea para cada %aria"le con su nom"re, tipo, m"ito y %alor Ker la pila de llamadas Ker el estado del sistema :ostrar los nmeros de l neas en el cdigo ,uando elegimos la opcin de e#ecutar nuestro cdigo con informacin de depuracin, las l neas de cdigo se muestran en la %entana del depurador. Para poder poner en marcha el depurador de cdigo de"emos introducir un punto de ruptura o breakpoint. Podemos introducir un punto de ruptura directamente desde el editor de cdigo situando el cursor en la l nea en la que queremos que se detenga la e#ecucin y pulsando con el ratn en el "otn hacerlo apretando la tecla 69. de la "arra de herramientas. Bam"i'n podemos

,uando e#ecutemos el cdigo, la e#ecucin se detendr en el punto de ruptura y se a"rir el depurador. (a siguiente figura muestra la apariencia del depurador-

6igura 1. El depurador.

Damgaard Espaa, S.A.

Pgina 4 de 127

/erramientas de desarro))o En la %entana de %aria"les podemos %er cmo cam"ia el %alor de las %aria"les a medida que %amos e#ecutando el cdigo paso a paso. Bam"i'n podemos poner una o ms %aria"les a un %alor espec fico, introduciendo 'ste en la columna 1alor.

6igura 4. (a %entana de %aria"les del depurador.

Podemos acti%ar la %entana de %aria"les pulsando so"re el "otn herramientas del depurador.

de la "arra de

,uando una l nea en la %entana de %aria"les contiene un o"#eto compuesto, podemos situar el cursor en esa l nea y apretar la tecla EABEO. 8e a"rir una segunda %entana que mostrar el %alor actual de cada uno de los elementos de dicho o"#eto.

6igura 5. Kentana de elementos de un o"#eto compuesto.

Damgaard Espaa, S.A.

Pgina

de 127

Programacin de 0ormu)arios

Pro#ra'acin de *or'u"arios
31. Introduccin
,omo ya hemos comentado, podemos introducir cdigo en lengua#e ;<< en muchas partes del sistema. (os formularios no son una e&cepcin. E&isten distintos m"itos en los formularios donde podemos aadir cdigo. Estos m"itos son los siguientes 6ormulario propiamente dicho 3rigen de datos del formulario ,ontroles del formulario Dependiendo de la funcionalidad que queramos implementar, escri"iremos el cdigo en un m"ito o en otro. Ao o"stante, normalmente, se siguen las siguientes reglas ,odificamos en los m'todos del propio formulario, cuando queremos controlar la funcionalidad general del mismo. ,odificamos en los m'todos del origen de datos, cuando queremos controlar la funcionalidad de los datos que aparecen en el formulario. ,odificamos en los controles, cuando queremos controlar la funcionalidad de alguno de los controles o elementos espec ficos que aparecen en el formulario.

!e debe tener en c enta % e el c.digo % e se introd ce en n #orm lario ser0 accesible /nicamente desde el #orm lario- 2 al% ier # ncionalidad % e deba ser accesible desde otro elemento' debe codi#icarse # era del #orm lario- :a # ncionalidad relacionada con los datos se codi#icar0 en la tabla siempre % e sea posible- !i se trata de otro tipo de # ncionalidad' p ede implementarse na clase para ello-

32.

<aria9les del sistema


$nteriormente se di#o que todas las %aria"les de"en ser declaradas antes de poder ser utili!adas. 8in em"argo, cuando tra"a#amos con los formularios, algunas %aria"les son declaradas impl citamente por el sistema. $dems de estas %aria"les, es con%eniente recordar que en cualquier momento, la %aria"le this nos da acceso al elemento al que pertenece el m'todo que estamos modificando. $ continuacin se descri"en las %aria"les de sistema de los formularios y los elementos a los que dan acceso-

Damgaard Espaa, S.A.

Pgina ! de 127

Programacin de 0ormu)arios )a 6ormulario

8e trata de una %aria"le de tipo <orm; n, que reci"e el nom"re de ,?,6,/4 y que referencia al o"#eto formulario. Aos permite acceder a los m'todos definidos a ni%el de formulario. (a %aria"le element se utili!a normalmente en asignaciones como la que mostramos a continuacinB". E&iste la %aria"le form notif2Date ( element*desi;n()*control(&ontrolGGNotif2Date)! )" Ba"la

Por cada uno de los or genes de datos del formulario, disponemos de una %aria"le llamada como 'stos, que nos referencia la ta"la que utili!amos en dicho origen de datos. Por e#emplo, suponiendo que el origen de datos del formulario se llamara Datos<orm lario, tendr amos una %aria"le con ese nom"re que har a referencia a la ta"la. En realidad, en un momento dado esta %aria"le nos da acceso al registro acti%o de la ta"la, de manera que podremos*. (lamar a un m'todo definido en la ta"la. Por e#emploDatosRorm#lario*setDefa#lt(ReadWriteGGWrite)! +. /acer referencia a los campos indi%iduales de la ta"la. Por e#emplon#mber ( DatosRorm#lario*acco#ntNo! )c 3rigen de datos

Bendremos tam"i'n una %aria"le llamada como el origen de datos del formulario con el sufi#o T0/'M para hacer referencia a las propiedades y los m'todos de dicho origen de datos. Por e#emplo, en el caso de que nuestro origen de datos se llamara Datos<orm lario, tendr amos una %aria"le llamada Datos<orm lario?D!. 8e trata de una %aria"le de tipo <ormData!o rce que nos da la posi"ilidad de e#ecutar directamente sus m'todos. Por e#emploDatosRorm#larioBD>*re>earc3()! )d ,onsulta E&isten dos %aria"les que nos permiten acceder a la consulta de un formulario )na %aria"le de tipo G ery llamada como el origen de datos del formulario con el sufi#o T0=M para hacer referencia a las propiedades y los m'todos de la consulta (% ery). Por e#emplo, en nuestro caso, tendr amos una %aria"le llamada Datos<orm lario?G- Esto nos da la posi"ilidad de e#ecutar directamente sus m'todos. Por e#emploDatosRorm#larioBZ*le elNo(+)!

Damgaard Espaa, S.A.

Pgina 7 de 127

Programacin de 0ormu)arios )na %aria"le de tipo G ery; n llamada como el origen de datos del formulario con el sufi#o T0=2M para hacer referencia a las propiedades y los m'todos de una instancia en e#ecucin de la consulta de dicho origen de datos ( % ery; n). Por e#emplo, en nuestro caso, tendr amos una %aria"le llamada Datos<orm lario?G;- Esto nos da la posi"ilidad de e#ecutar directamente sus m'todos. Por e#emploDatosRorm#larioBZR*;etNo(+)! Es importante sealar que en %ersiones anteriores de Axapta, no e&ist an las %aria"les declaradas impl citamente para la consulta ( ?G) y para la instancia en e#ecucin de la consulta (?G;). Esto hace que nos podamos encontrar en muchos m'todos toda% a la forma tradicional de acceder a ellas desde cdigo. Para acceder a una consulta, de" amos hacer una declaracin de %aria"le, tras la cual pod amos utili!ar la %aria"le declarada para acceder a los m'todos de dicha consulta. Por e#emplo, dentro de un origen de datos podr amos acceder a su consulta de la siguiente formaEB,63?2 :, :,0?8780.1/ :, ;/8 02/5;?48 Z#er2 ! Q ( t3is*Q#er2()! Q*le elNo(+)! Para acceder a una instancia en e#ecucin de una consulta, tam"i'n de" amos hacer una declaracin de %aria"le. 8iguiendo con el mismo e#emplo lo har amos de la forma siguienteEB,63?2 :, :,0?8780.1/ :, ./548/0.8 ,/ ,B,0;0.1/ :, ;/8 02/5;?48 Z#er2R#n ! Qr ( t3is*Q#er2R#n()! Qr*;etNo(+)! En am"os casos la %aria"le this har a referencia al o"#eto en e#ecucin en ese momento, es decir, al origen de datos. Qr! Q!

33.

!iempre es m0s aconsejable tili$ar las variables impl)citas declaradas por el sistema en l gar de de#inir n evas variables' ya % e de esta #orma evitamos % e existan variables ig ales d plicadas en memoria-

Mtodos del #ormulario


,uando creamos un nue%o formulario el sistema genera automticamente un nodo de m'todos.

Damgaard Espaa, S.A.

Pgina $ de 127

Programacin de 0ormu)arios $dems de modificar los m'todos creados por el sistema, el desarrollador puede aadir nue%os m'todos con el propsito de aadir funcionalidad lgica al formulario.

Es interesante recordar' % e siempre % e sea posible' se debe introd cir el c.digo en la tabla de la % e se obtienen los datos para el #orm lario- :os m&todos escritos en la tabla son accesibles desde c al% ier #orm lario % e tilice dicha tabla- En t&rminos de re tili$aci.n y herencia' a(adir c.digo en los m&todos de n #orm lario es menos e#iciente % e introd cirlo directamente en la tabla-

33.1.

M@42:25 :, 5.54,68

El nodo contiene lo que se llaman m&todos virt ales, que son m'todos implementados en MorphX, pero que pueden ser so"recargados para cam"iar el comportamiento por defecto de los formularios. En estos m'todos la funcin llamada s per*, acti%a la e#ecucin del m'todo implementado por MorphX.

...*.*. (ista de m'todos


(os formularios en :orph; tienen los siguientes m'todos de sistemaM@42:2 C8/C?25, S, ,B,0;48 0;8/:2... se cierra un formulario. )tili!aremos este m'todo, para aadir nuestras propias compro"aciones a las que reali!a el sistema cuando cerramos un formulario. se cierra un formulario. Dependiendo del estado en el cual cierre el formulario, el m'todo 2lose se acti%a desde 2lose2ancel o desde 2loseOH. el usuario pulsa con el ratn so"re el "otn cancelar o cuando pulsamos le techa E!2. ,uando cerramos un formulario mediante el m'todo 2lose2ancel, no gra"amos las modificaciones. el usuario pulsa con el ratn el "otn Aceptar. el usuario cierra un formulario modal. se cierra el formulario. El o"#eti%o de este m'todo es destruir el o"#eto y li"erar la memoria. nos mo%emos al primer campo de un formulario. a"rimos el formulario. nos mo%emos al ltimo campo de un formulario. nos mo%emos al siguiente campo dentro de un formulario. nos mo%emos al siguiente grupo de campos dentro de un formulario.

C?25,

C?25,C8/0,?

C?25,OQ D2A33?A $./8?.L, $.754$.,?: I/.4 L854$.,?: N,K4$.,?: N,K4G72;3

Damgaard Espaa, S.A.

Pgina % de 127

Programacin de 0ormu)arios

P7,=$.,?: P7,=G72;3 R;/ T85O

nos mo%emos al campo anterior dentro de un formulario. nos mo%emos al grupo de campos anterior dentro de un formulario. a"rimos el formulario, inmediatamente despu's del m'todo Init, para mostrar el formulario. el usuario reali!a alguna tarea en el formulario, como por e#emploutili!ar la "arra de herramientas, el men o el teclado.

...*.+. :'todos principales y su funcin


$ continuacin %amos a descri"ir algunos de los m'todos ms utili!ados en los formularios, que por su importancia merecen un tratamiento algo ms e&hausti%o. )a :'todo 2lassDeclaration En este m'todo se definen las %aria"les glo"ales del formulario. Es decir, aqu'llas cuyo m"ito es el formulario en su totalidad y, por lo tanto, pueden ser utili!adas en cualquier m'todo del formulario, de los or genes de datos o de los controles. ,omo e#emplo, %eamos el m'todo 2lassDeclaration del formulario 2 stTable. EB,63?2 :, 6@42:2 C?855D,0?8784.2/ class RormR#n e6tends UbFectR#n { N#mber>eQ &#st9cco#nt Rorm>trin;&ontrol Rorm>trin;&ontrol $ )" :'todo Init 8e e#ecuta cuando a"rimos el formulario. 8e utili!a, "sicamente, para la iniciali!acin de %aria"les. De"emos reali!ar una llamada al m'todo s per*,, ya que 'ste es el encargado de crear una instancia en e#ecucin del formulario. ,rea tam"i'n el origen de datos, mediante una llamada al m'todo Init del origen de datos. $ntes de la llamada al m'todo s per*,, podemos modificar el formulario mediante los m'todos de la clase <orm3 ild. Bras el m'todo s per*, y una %e! creado el formulario, podemos iniciali!ar %aria"les. ,omo e#emplo, tenemos el m'todo Init del formulario 2 stTable. EB,63?2 :, 6@42:2 I/.4 Damgaard Espaa, S.A. Pgina !& de 127 n#mber>eQ! n#m9llocated! contactPerson! contactPerson"d!

Programacin de 0ormu)arios oid init() { s#per()! contactPerson"d ( element*control(controlGG&ontactPerson"d)! Ta6%9TN#mTableGGenableLooA#p%atN#m( atN#m)! $ )c :'todo ; n 8e e#ecuta cuando a"rimos un formulario, inmediatamente despu's del m'todo Init. (a llamada al m'todo s per*, hace que la %entana apare!ca en la pantalla, y reali!a una "squeda en la "ase de datos para o"tener los datos que de"en mostrarse en el formulario. (a consulta la reali!a acti%ando el m'todo Exec teG ery*, del origen de datos. )d :'todo 2lose 8e e#ecuta cuando cerramos un formulario. (a llamada a s per*, cierra la %entana del formulario, reali!a las actuali!aciones en la "ase de datos y acti%a el indicador "ooleano 2losed. Dependiendo del estado en el cual cierre el formulario, el m'todo 2lose se acti%a desde 2lose2ancel o desde 2loseOH. ,omo e#emplo, tenemos el m'todo 2lose del formulario 2 stTable. EB,63?2 :, 6@42:2 C?25, oid close() { if (Kc#stTable*rec"d @@ n#mber>eQ) n#mber>eQ*abort()! s#per()! $

33.2.

A00,52 8 ?25 02/472?,5 :,5:, ,? 01:.C2

Desde cualquier m'todo podemos acceder a las propiedades y m'todos de los controles del formulario. Para ello, necesitamos tener una referencia al control, que se puede o"tener de dos formas :ediante la propiedad A;42:,0?8784.2/ de los controles :ediante m'todos de las clases de sistema

Damgaard Espaa, S.A.

Pgina !1 de 127

Programacin de 0ormu)arios Bodos los controles de un formulario tienen una propiedad llamada A todeclaration. Por defecto, esta propiedad est desacti%ada, pero si la acti%amos, el sistema crea de modo automtico una %aria"le con el mismo nom"re del control que nos da acceso a todas sus propiedades y m'todos. Esta propiedad es una no%edad de la %ersin +.0 de $&apta, por lo tanto nos encontraremos que en muchas ocasiones no se hace uso de ella y se utili!an las clases de sistema para hacer referencia a los controles. 8in em"argo, es recomenda"le hacer uso de las propiedades de los elementos de la aplicacin, ya que nos ahorran cdigo innecesario. Para crear una referencia a un control de un formulario mediante el segundo m'todo de"emos seguir los siguientes pasos*. Declarar una %aria"le de tipo control +. Cniciali!ar la referencia (a %aria"le de referencia de"e ser declarada en el m'todo 2lassDeclaration del formulario. El tipo de datos de la %aria"le depende del tipo de control al que queramos hacer referencia. Por e#emplo, para hacer referencia a un campo de te&to, de"eremos crear una %aria"le de tipo <orm!tring2ontrol, para hacer referencia a un "otn, la %aria"le ser de tipo <orm3 tton2ontrol, etc. Estas clases pueden encontrarse en la documentacin del sistema en el Dr"ol de 3"#etos de la $plicacin. EB,63?2 Rorm5#tton&ontrol b#tton!

(a iniciali!acin de las %aria"les de"e hacerse en el m'todo Init, haciendo uso de los m'todos de la clase de sistema <orm; n. 8uponiendo que en nuestro formulario tu%i'ramos un control de tipo "otn llamado 3 tton@ame, tendr amos el siguiente e#emplo, donde se asignar a dicho "otn a la %aria"le b ttonEB,63?2 b#tton ( element*desi;n()*control(&ontrolGG5#ttonName)! )na %e! iniciali!ada la %aria"le, podemos cam"iar las propiedades del control en cualquier momento utili!ando sus propios m'todos. $ continuacin mostramos un e#emplo de estoEB,63?2 b#tton*enabled(false)! $ continuacin presentamos un e#emplo, donde podemos o"ser%ar la asignacin de controles de un formulario a %aria"les pre%iamente declaradas. EB,63?2 :, :,0?8780.1/ :, 02/472?,5 class RormR#n e6tends UbFectR#n { Rorm&3ecA5o6&ontrol Rorm>trin;&ontrol RormDate&ontrol incl#de9ll! interestNote! interestDate!

Damgaard Espaa, S.A.

Pgina !2 de 127

Programacin de 0ormu)arios $ oid init() { s#per()! incl#de9ll ( element*control(controlGG>3o?Upen)! interestNote ( element*control(controlGG"nterestNote)! interestDate ( element*control(controlGG"nterestDate)! $ Por otra parte, si sa"emos que no %amos a necesitar hacer referencia al control ms de una %e!, podemos eliminar la %aria"le y cam"iar la propiedad de dicho control en una sola sentencia. EB,63?2 element*desi;n()*control(&ontrolGG5#ttonName)*enabled(false)!

34.

Mtodos del origen de datos


,uando creamos un nue%o formulario de"emos definir un origen de datos, que nos da acceso a la informacin almacenada en la "ase de datos. $l definir un origen de datos, se crea automticamente un nodo de m'todos.

34.1.

M@42:25 :, 5.54,68

.2.*.*. (ista de m'todos


(os or genes de datos en los formularios tienen los siguientes m'todos de sistemaM@42:2 A04.=, C7,84, D,?,4, EK,0;4,V;,7A $./:R,027: $./:*8?;, $.754 S, ,B,0;48 0;8/:2... el usuario cam"ia de registro acti%o. el usuario crea un nue%o registro. el usuario "orra un registro. a"rimos el formulario y el sistema accede a la "ase de datos para recuperar la informacin que se %a a mostrar al usuario. se e#ecuta desde el m'todo <ind1al e. el usuario pulsa con el ratn so"re el comando Uuscar ( <ind) en el men conte&tual. nos mo%emos al primer registro.

Damgaard Espaa, S.A.

Pgina !' de 127

Programacin de 0ormu)arios I/.4 I/.4*8?;, L854 L./OA04.=, N,K4 P7,= P7./4 P72634 R,-7,59 R,62=,$.?4,7 R,7,8: R,5,8709 se a"re el formulario. se crea un nue%o registro. 8u propsito es dar %alores iniciales al nue%o registro. nos mo%emos al ltimo registro. el usuario cam"ia de registro en un formulario que tiene su origen de datos enla!ado con otro origen de datos. nos mo%emos al siguiente registro. nos mo%emos al registro anterior. el usuario acti%a el comando Cmprimir (Erint) en el men $rchi%o. el usuario acti%a el comando 6iltrar (<ilter). Oefresca el contenido del registro acti%o sin leerlo desde el disco. Este m'todo no lo acti%a automticamente el sistema. el usuario pulsa con el ratn so"re el comando Eliminar filtro (;emove #ilter) en el men conte&tual. 8e refresca el contenido del registro acti%o leyendolo de la "ase de datos. Este m'todo no lo acti%a automticamente el sistema. Kuel%e a e#ecutar el m'todo Exec teG ery con la e&cepcin de que se preser%a el filtro, el orden de los registros, etc. Este m'todo no lo acti%a automticamente el sistema. %amos a "orrar un registro. %amos a actuali!ar un registro o escri"ir un nue%o registro. el usuario introduce un nue%o registro o actuali!a uno e&istente.

*8?.:84,D,?,4, *8?.:84,F7.4, F7.4,

.2.*.+. :'todos de %alidacin


,omo hemos %isto en la lista anterior, los or genes de datos tienen sus propios m'todos de %alidacin. Estos m'todos son los siguientes,a 1alidateDelete Este m'todo se e#ecuta #usto antes de que un registro %aya a ser "orrado. (a llamada al m'todo s per*, in%oca al m'todo 1alidateDelete de la ta"la asociada. )tili!amos este m'todo cuando queremos aadir nuestras propias compro"aciones de %alidacin antes del "orrado de los registros de la "ase de datos. ,b 1alidateIrite

Damgaard Espaa, S.A.

Pgina !4 de 127

Programacin de 0ormu)arios Este m'todo se e#ecuta #usto antes de que un registro %aya a ser escrito o actuali!ado. (a llamada al m'todo s per*, in%oca al m'todo 1alidateIrite de la ta"la asociada. Bam"i'n utili!amos este m'todo cuando queremos aadir nuestras propias compro"aciones de %alidacin antes de la actuali!acin o escritura de los registros en la "ase de datos. ,omo podemos apreciar, e&iste un paralelismo entre los m'todos de la ta"la y los m'todos del origen de datos de un formulario. En realidad, los m'todos de %alidacin del origen de datos llaman a los de la ta"la asociada. $ partir de esto podemos llegar a la conclusin de que introduciremos los m'todos de %alidacin en un sitio o en otro dependiendo de nuestro o"#eti%o. 8upongamos que tenemos %arios formularios que tra"a#an con los mismos datos. ,ada uno de ellos tendr su propio origen de datos, pero todos esos or genes de datos tendrn asociada la misma ta"la. 8i nosotros queremos %alidar el "orrado o la escritura de los registros en todos los formularios, ser ms con%eniente hacer la compro"acin directamente en los m'todos de %alidacin de la ta"la, ya que solo tendr amos que escri"ir el cdigo una %e!. Esta %alidacin ser a efecti%a en todos los or genes de datos que tu%ieran dicha ta"la asociada. Por el contrario, %amos a considerar que en un formulario espec fico necesitamos reali!ar una %alidacin especial cuando queremos insertar un registro. Esta compro"acin ser ms con%eniente hacerla so"re los m'todos de %alidacin del origen de datos de dicho formulario. Ao ser a %lido hacerlo en los m'todos de la ta"la, porque de esta forma estar amos for!ando a todos los formularios a reali!ar esta %alidacin. $ continuacin, %amos a %er cual es la secuencia de e#ecucin de m'todos cuando intentamos escri"ir o actuali!ar un registro desde un formulario. Podemos %erlo de manera grfica en el siguiente esquema-

6igura 7. Escritura de un registro. 8ecuencia de e#ecucin de m'todos.

(a secuencia de e#ecucin ser a la siguiente*. 8e e#ecutar a el m'todo 1alidateIrite del origen de datos del formulario. Este a su %e! llamar a al m'todo 1alidateIrite de la ta"la asociada. +. 8e e#ecutar a le m'todo Irite del origen de datos del formulario.

Damgaard Espaa, S.A.

Pgina ! de 127

Programacin de 0ormu)arios .. 8e llamar a al m'todo Insert o al m'todo Fpdate de la ta"la asociada al formulario, dependiendo de si la operacin a reali!ar en una insercin o una actuali!acin de registro.

En la programaci.n de los m&todos de validaci.n de los or)genes de datos debemos seg ir la misma estr ct ra est0ndar % e se sig e en los m&todos de validaci.n de las tablas-

.2.*... :'todos principales y su funcin


$ continuacin %amos a descri"ir algunos de los m'todos ms utili!ados en los or genes de datos de los formularios, que por su importancia merecen un tratamiento algo ms e&hausti%o. )a :'todo Init 8e e#ecuta cuando a"rimos un formulario. (a llamada al m'todo s per*, crea la consulta para cargar los datos en el formulario. Bras esta llamada de"en aadirse, en caso de que sea necesario, las sentencias de modificacin de la consulta. ,omo e#emplo, presentamos el m'todo Init del origen de datos del formulario 2 stTrans. EB,63?2 :, 6@42:2 I/.4 oid init() { s#per()! data>o#rce ( t3is*Q#er2()*data>o#rceNo(+)! criteriaUpen ( data>o#rce*addRan;e(fieldn#m(&#stTrans1open))! $ )" :'todo Exec teG ery El m'todo Exec teG ery se e#ecuta cuando a"rimos un formulario para %er sus datos. (a llamada al m'todo s per*, e#ecuta la consulta generada por el m'todo Init y muestra los registros. 8i deseamos modificar los criterios de seleccin, de"emos insertar las sentencias correspondientes antes de la llamada a s per*,. ,omo e#emplo, presentamos el m'todo Exec teG ery del origen de datos del formulario 2 stTrans. EB,63?2 :, 6@42:2 EK,0;4,V;,7A oid e6ec#teZ#er2() { s?itc3 (incl#de9ll* al#e())

Damgaard Espaa, S.A.

Pgina !! de 127

Programacin de 0ormu)arios { case (+) G { criteriaUpen* al#e(^+^)! breaA! $ case (E) G { criteriaUpen* al#e(^E**+^)! breaA! $ $ s#per()! $ En este e#emplo, %emos que el m'todo puede ser%irnos para esta"lecer dos criterios distintos de seleccin en la consulta antes de la llamada al m'todo s per*,. )c :'todo Active 8e e#ecuta cada %e! que cam"ia el registro acti%o. Esto sucede cuando pasamos de un registro a otro y tam"i'n cuando pasamos de un formulario a otro. (a llamada a s per*, hace que el nue%o registro pase a ser el registro actual. ,omo e#emplo, presentamos el m'todo Active del origen de datos del formulario Fnit. EB,63?2 :, 6@42:2 A04.=, int acti e() { int ret! ! ret ( s#per()! InitBInit*allo?4dit(KInit*rec"d)! ret#rn ret! $ )d :'todo :inkActive El m'todo :inkActive se e#ecuta cuando el usuario cam"ia de registro en un formulario que tiene su origen de datos enla!ado con otro origen de datos. Este m'todo solo es utili!ado cuando se ha esta"lecido un enlace entre dos or genes de datos, poniendo la propiedad :inkType a %alor Jes en el origen de datos.

Damgaard Espaa, S.A.

Pgina !7 de 127

Programacin de 0ormu)arios (a llamada al m'todo s per*, acti%a el m'todo Exec teG ery del origen de datos enla!ado con el origen de datos principal. ,omo e#emplo, presentamos el m'todo :inkActive del origen de datos !ales:ine del formulario !alesTable. EB,63?2 :, 6@42:2 L./OA04.=, oid linA9cti e() { s#per()! if (KsalesLine) element*set&aptionTe6t()! $ )e :'todo ;eread (a llamada al m'todo s per*, %uel%e a leer el registro actual de la "ase de datos. El sistema no acti%a este m'todo de forma automtica. )f :'todo ;esearch (a llamada al m'todo s per*, refresca la recuperacin de registros de la "ase de datos, definida por la consulta que se genera automticamente en el m'todo Init. ,orresponde a una llamada al m'todo Exec teG ery con la e&cepcin de que se mantienen ciertas cosas, como los filtros, el orden de los registros, etc. El sistema no acti%a este m'todo de forma automtica. Para comprender "ien el funcionamiento del m'todo ;esearch, %amos a %er las diferencias e&istentes entre dicho m'todo y el m'todo Exec teG ery. 8i queremos refrescar el contenido del formulario con los registros que han sido insertados desde un m'todo al cual hemos llamado, de"emos utili!ar el m'todo ;esearch. Por el contrario, si queremos cam"iar la consulta para mostrar otros registros, qui!s "asados en un filtro modificado, de"emos utili!ar el m'todo Exec teG ery. )g :'todo ;e#resh (a llamada al m'todo s per*, actuali!a la pantalla, refrescando el contenido del registro acti%o sin leerlo desde el disco. El sistema no acti%a este m'todo de forma automtica. Aosotros podemos utili!arlo, por e#emplo, si necesitamos actuali!ar los datos dentro de una operacin ms comple#a. )h :'todo Irite

Damgaard Espaa, S.A.

Pgina !$ de 127

Programacin de 0ormu)arios El m'todo Irite se e#ecuta cuando el usuario introduce un nue%o registro o actuali!a uno ya e&istente. Este m'todo es el equi%alente a los m'todos Insert y Fpdate de las ta"las, reali!ando una u otra operacin dependiendo de que e&ista ya el registro so"re el que %amos a escri"ir o no. (a llamada al m'todo s per*, acti%a el m'todo 1alidateIrite, y en el caso de que 'ste de%uel%a %erdadero, gestiona la accin de escritura so"re la "ase de datos. ,omo e#emplo, presentamos el m'todo Irite del origen de datos del formulario :edger>o rnalTable. EB,63?2 :, 6@42:2 F7.4, oid ?rite() { s#per()! if (ne?'o#rnalN#m) { led;er'o#rnal*#sed%o#c3er()! led;er'o#rnal ( n#ll! ne?'o#rnalN#m ( false! $ $ )i :'todo Delete El m'todo Delete se e#ecuta cuando el usuario "orra un registro en el origen de datos. (a llamada al m'todo s per*, acti%a el m'todo 1alidateDelete y en el caso de que 'ste de%uel%a %erdadero, gestiona la accin de "orrado so"re la "ase de datos, reali!ando una llamada al m'todo Delete de la ta"la. ,omo e#emplo, presentamos el m'todo Delete del origen de datos del formulario :edger>o rnalTable. EB,63?2 :, 6@42:2 D,?,4, oid delete() { t3is*ret#rn'o#rnalN#m()! s#per()! $ Es muy importante destacar que en un formulario los or genes de datos enla!ados son tratados como un nico origen de datos. Es decir, las operaciones de seleccin, actuali!acin y creacin de registros desde el formulario se reali!an so"re todas las ta"las enla!adas. El m'todo Init se e#ecuta tam"i'n en todos los or genes de datos. Por otro lado, los m'todos de notificacin (como el m'todo Active) se e#ecutan tam"i'n en todos los or genes de datos.

Damgaard Espaa, S.A.

Pgina !% de 127

Programacin de 0ormu)arios

34.2.

A00,52 A 62:.-.080.1/ :, ?85 02/5;?485 ,/ ?25 -276;?87.25

Bodos los formularios con un origen de datos tienen una consulta acti%a, generada automticamente en el m'todo Init de dicho origen de datos. ,omo hemos %isto anteriormente, e&iste una %aria"le de sistema que nos da acceso a dicha consulta. En algunos casos es necesario modificar la consulta mediante programacin. Kamos a %er mediante un e#emplo, cmo modificar en tiempo de e#ecucin los criterios de seleccin de la consulta de un formulario. El e#emplo corresponde al formulario 2 stTrans. En primer lugar, se declaran en el m'todo 2lassDeclaration del formulario las %aria"les que consideremos necesarias. (os tipos de datos de estas %aria"les correspondern a clases de sistema. $s , por e#emplo, la clase G ery3 ildData!o rce nos da acceso al origen de datos de una consulta y la clase G ery3 ild;ange nos da acceso al rango de seleccin de registros. (a informacin acerca de los m'todos de estas clases puede encontrarse en la documentacin del sistema, dentro del $r"ol de 3"#etos de la $plicacin. EB,63?2 class RormR#n e6tends UbFectR#n { Z#er25#ildDate>o#rce Z#er25#ildRan;e $ data>o#rce! criteriaUpen!

El nombre de las variables % e corresponden a rangos de selecci.n s ele empe$ar con la palabra 6criteria8-

$ continuacin de"en iniciali!arse las %aria"les de referencia. Para ello de"e aadirse cdigo al m'todo del origen de datos. (as sentencias correspondientes de"en insertarse despu's de la llamada al m'todo s per*,' ya que 'ste es el encargado de crear la consulta. /acer esto es equi%alente a iniciali!ar dichas %aria"les antes de la llamada al m'todo s per*, en el m'todo ; n. EB,63?2 oid init() { s#per()! data>o#rce ( &#stTransBZ*data>o#rceNo(+)! criteriaUpen ( data>o#rce*addRan;e(fieldn#m(&#stTrans1open))! $ )na %e! iniciali!adas las %aria"les, podremos modificar el rango de seleccin de registros. Esto se reali!a antes de la llamada al m'todo s per*, del m'todo Exec teG ery. EB,63?2 oid e6ec#teZ#er2()

Damgaard Espaa, S.A.

Pgina 7& de 127

Programacin de 0ormu)arios { criteriaUpen* al#e(^E**+^)! s#per()! $ ,omo ya mencionamos anteriormente, en %ersiones ms antiguas de Axapta, no e&ist an las %aria"les declaradas impl citamente para las consultas. En ese caso ha"r a que acceder a la consulta mediante m'todos de las clases de sistema, tal y como muestra el e#emploEB,63?2 oid init() { s#per()! data>o#rce ( t3is*Q#er2()*data>o#rceNo(+)! criteriaUpen ( data>o#rce*addRan;e(fieldn#m(&#stTrans1open))! $ ,omo podemos apreciar, sustituir amos la %aria"le 2 stTrans?G por this-% ery*,, donde this har a referencia al origen de datos del formulario y % ery*, ser a el m'todo que nos de%uel%e la consulta de dicho origen de datos.

35.

Mtodos en los controles


En MorphX, adems de introducir cdigo en el propio formulario y en el origen de datos, podemos introducir cdigo en los controles de dicho formulario. Brataremos de codificar lo menos posi"le en los controles, dado que el cdigo que introdu!camos en estos m'todos no podr ser utili!ado para otros elementos. Bodos aquellos procesos generales que queramos reali!ar con el formulario de"eremos codificarlos en los m'todos del propio formulario o en los del origen de datos. Znicamente codificaremos en los controles, cuando queramos controlar su funcionalidad. (a lista de m'todos de los controles es intermina"le, dado que e&isten muchos tipos de controles y cada uno de ellos tiene sus propios m'todos. Podemos o"tener una lista completa de los m'todos en la 7 )a del desarrollador de Axapta. Znicamente %amos a destacar por su importancia dos m'todos)a :'todo 2licked

Este m'todo e&iste en los controles de tipo 2heck3ox, 3 tton, 2ommand3 tton y Men Item3 tton. 8e e#ecuta cuando el usuario LpinchaM so"re el control correspondiente. En los "otones de tipo Men Item3 tton, la llamada al m'todo s per*, e#ecuta el men item correspondiente. En el caso de los "otones 2ommand3 tton, se e#ecuta el comando asociado al "otn. En los "otones de tipo 3 tton, la llamada a s per*, no reali!a ninguna accin. )" :'todo :ook p Pgina 71 de 127

Damgaard Espaa, S.A.

Programacin de 0ormu)arios

Este m'todo e&iste en los controles de tipo !tringEdit, IntEdit, ;ealEdit y DateEdit8e e#ecuta cuando el usuario pulsa el "otn de look p. Aormalmente se aade cdigo a este m'todo cuando el desarrollador desea que se a"ra una %entana de "squeda distinta de la %entana estndar.

3".

'ecuencia de ejecucin de mtodos


,uando reali!amos acciones so"re un formulario, e#ecutamos los m'todos del propio formulario y los de su origen de datos. (a e#ecucin de estos m'todos sigue una secuencia determinada, que nos %a a condicionar el funcionamiento del sistema. Por lo tanto, es muy importante conocer esa secuencia, ya que esto nos permitir poder determinar qu' m'todo de"emos codificar para o"tener los resultados esperados. Por e#emplo, %eamos en el siguiente esquema qu' m'todos se e#ecutan cuando a"rimos un formulario-

6igura 9. $pertura de un formulario. 8ecuencia de e#ecucin de m'todos.

(a secuencia de e#ecucin de m'todos es la siguiente*. +. .. 2. 1. 4. :'todo constructor @e". :'todo Init del formulario. :'todo Init del origen de datos del formulario. :'todo ;un del formulario. :'todo Exec teG ery del origen de datos del formulario. :'todo @ext<ield del formulario.

$ continuacin, %amos a %er la secuencia de e#ecucin que tiene lugar cuando cerramos un formulario. Podemos apreciarla en el siguiente esquema-

6igura *0. ,ierre de un formulario. 8ecuencia de e#ecucin de m'todos.

(a secuencia de e#ecucin de m'todos es la siguiente-

Damgaard Espaa, S.A.

Pgina 72 de 127

Programacin de 0ormu)arios *. :'todo 2lose2ancel del formulario. +. :'todo 2an2lose del formulario. .. :'todo 2lose del formulario. Por ltimo, %amos a %er qu' m'todos se e#ecutan cuando salimos de un control de un formulario-

6igura **. El usuario sale de un control. 8ecuencia de e#ecucin de m'todos.

(a secuencia de e#ecucin de m'todos es la siguiente*. +. .. 2. 1. 4. :'todo :eave del control. :'todo 1alidate del control. :'todo Modi#ied del control. :'todo 1alidate del origen de datos del formulario. :'todo 1alidate<ield de la ta"la. :'todo Modi#ied del origen de datos del formulario.

Damgaard Espaa, S.A.

Pgina 7' de 127

Paso de parmetros entre o(*etos1 2a c)ase Args

Paso de &ar!'etros entre o $etos+ ,a c"ase -Ar#s.


3$. *omunicacin entre o9jetos
Es posi"le esta"lecer comunicacin entre dos o"#etos de la aplicacin cuando uno de ellos se genera a partir de otro. Esto podemos reali!arlo de diferentes maneras*. Desde un men item creamos otro elemento de la aplicacin (formularios, informes, clases). El o"#eto que se crea puede tomar una serie de parmetros del men item. +. Desde un formulario podemos a"rir otro formulario o "ien un lan!ar la e#ecucin de un informe. El formulario y el nue%o o"#eto estarn relacionados y e&istir entre ellos una % a de comunicacin a tra%'s de la cual podremos pasar al nue%o o"#eto informacin acerca del formulario y del registro acti%o. .. Podemos crear un nue%o o"#eto desde cdigo y pasarle una serie de parmetros. 2. Podemos crear un men item desde cdigo y lan!ar con 'l un o"#eto.

3%.

)a clase 6rgs
(a clase Args es una clase de sistema que nos permite pasar argumentos a los o"#etos de la aplicacin. Podemos encontrar ayuda acerca de esta clase en el nodo Doc mentaci.n del sistema del Dr"ol de 3"#etos de la $plicacin. $ continuacin, se presenta la lista de m'todos de la clase Args. Para cada m'todo se descri"e su utili!acin en el o"#eto in%ocante y en el in%ocado.

N26>7, :,? 6@42:2 Koid /,G o"#ect p+) Cnt -./8?.L,() 3"#ect 08??,7 (3"#ect p*) ($nyBype

E/ ,? 2>B,42 ./=208/4, p*, El constructor. El destructor

E/ ,? 2>B,42 ./=208:2

$lmacena informacin so"re )tili!a el %alor de retorno qu' o"#eto ha creado el para determinar desde nue%o o"#eto. donde fue llamado el o"#eto actual. 3"tiene el nom"re del origen de datos del formulario que ha hecho la llamada.

Ba"leCd :8485,4()

Damgaard Espaa, S.A.

Pgina 74 de 127

Paso de parmetros entre o(*etos1 2a c)ase Args

8tr /86, (str +10 p*) 3"#ect 2>B,04 (o"#ect p*)

8lo es usado por la clase 2lass<actory$lmacena una referencia a )sado por la un o"#eto. 2lass<actory para o"#etos nue%os. clase crear

8tr 3876 (8tr +10 p*)

$lmacena un parmetro (una 8e usa para recuperar un cadena). parmetro del o"#eto in%ocante. $lmacena un %alor 8e usa para recuperar un enumerado del tipo %alor enumerado del o"#eto especificado en el m'todo in%ocante. EarmEn mType. Define el tipo de enumerado 8e usa para determinar el que %a a ser pasado en el tipo de enumerado usado m'todo EarmEn m. por el o"#eto in%ocante.

$nyBype 3876E/;6 (int Enum)

Cnt 3876E/;64A3,( int EnumBype)

3"#ect 3876O>B,04 (3"#ect $lmacena un o"#eto que %a a 8e usa para recuperar un p*) ser pasado como parmetro. o"#eto del o"#eto in%ocante. ,ommon 7,027: (common $lmacena un registro. p*) 8e usa este m'todo para recuperar el registro acti%o del o"#eto in%ocante.

Bodos los formularios, informes y consultas utili!an la clase Args como su primer argumento en el constructor. El modo preferido para usar la clase Args es construir un o"#eto de tipo Args, asignarle un nom"re y entonces pasarle el o"#eto Args al formulario o a un m'todo de la clase 2lass<actory. Keamos, a continuacin, un e#emplo de utili!acin de la clase Args para pasar parmetros a un formulario creado desde el cdigo. EB,63?2% oid met3od+() { 9r;s ! ar;s ( ne? 9r;s(7&#stTable8)! fr ( &lassRactor2*formR#n&lass(ar;s)! fr*init()! fr*r#n()! $ $lgunos m'todos de la clase Args corresponden con propiedades de los men items. En la ta"la siguiente se define esta correspondenciaar;s! fr! RormR#n

Damgaard Espaa, S.A.

Pgina 7 de 127

Paso de parmetros entre o(*etos1 2a c)ase Args

M@42:2 0?85, 6rgs parm parmEnum parmEnumBype parm3"#ect

P723.,:8: 6,/I .4,6 Parameters EnumParameter EnumBypeParameter 3"#ect

8upongamos que a"rimos un formulario desde un men item. Keamos cmo recuperar los parmetros de entrada. Para ello, presentamos el m'todo Exec teG ery del origen de datos de un formulario. En este m'todo, se modifica el rango de seleccin de registros de la consulta en funcin de los parmetros especificados en el men item. EB,63?2% oid 46ec#teZ#er2() { s?itc3 (element*9r;s()*Parm4n#m()) { case (PastR#t#reGGPast)G criteriaPastR#t#re* al#e([**\:date/>trDMN(toda2()))! breaA! case (PastR#t#reGGR#t#re)G criteriaPastR#t#re* al#e(date/>trDMN(toda2()):\**\)! breaA! defa#ltG $ $

Damgaard Espaa, S.A.

Pgina 7! de 127

Programacin de in0ormes

Pro#ra'acin de in*or'es
3&. Introduccin
(os informes se utili!an para o"tener copias impresas de la informacin almacenada en la "ase de datos del sistema. ,omo en otros elementos de Axapta, podemos introducir cdigo en los informes para ampliar su funcionalidad. E&isten distintos m"itos en los informes donde podemos aadir cdigo Cnforme propiamente dicho ,onsulta del origen de datos del informe 8ecciones del informe Dependiendo de la funcionalidad que queramos implementar en el informe, escri"iremos el cdigo en un m"ito o en otro. Ao o"stante, normalmente, se siguen las siguientes reglas ,odificamos en los m'todos del propio informe, cuando queremos controlar la funcionalidad general del mismo. ,odificamos en los m'todos de la consulta del origen de datos, cuando queremos controlar la funcionalidad de los datos que aparecen en el informe. ,odificamos en las secciones del informe, cuando queremos controlar la funcionalidad de alguna de las secciones o el comportamiento de alguno de los elementos espec ficos que aparecen en el informe.

4(.

2omo ya se vio en el cap)t lo de programaci.n de #orm larios' se debe tener en c enta % e el c.digo % e se introd ce en n in#orme ser0 accesible /nicamente desde dicho in#orme-

<aria9les del sistema


Bal y como ocurr a con los formularios, cuando tra"a#amos con los informes, algunas %aria"les son declaradas impl citamente por el sistema. $dems de estas %aria"les, es con%eniente recordar que en cualquier momento, la %aria"le this nos da acceso al elemento al que pertenece el m'todo que estamos modificando. $ continuacin se descri"en las %aria"les de sistema de los informes y los elementos a los que dan acceso)a Cnforme

Damgaard Espaa, S.A.

Pgina 77 de 127

Programacin de in0ormes )na %aria"le llamada ,?,6,/4 de tipo ;eport; n referencia al o"#eto informe al completo. )" Ba"la

Por cada uno de los or genes de datos del informe tendremos una %aria"le con el nom"re del origen de datos, que nos referencia la ta"la asociada a dicho origen de datos. En realidad, en un momento dado esta %aria"le nos da acceso al registro acti%o. 8uponiendo que tu%i'ramos un origen de datos que se llamara DatosIn#orme, tendr amos una %aria"le con ese nom"re que har a referencia a la ta"la. Esta %aria"le nos permite hacer dos cosas*. (lamar a un m'todo definido en la ta"la. Por e#emploDatos"nforme*insert()! +. /acer referencia a los campos indi%iduales de la ta"la. Por e#emplon#mber ( Datos"nforme*acco#ntNo! )c ,onsulta E&isten dos %aria"les que nos dan acceso a la consulta de un informe )na %aria"le llamada GFE;J de tipo G ery, que hace referencia a las propiedades y los m'todos de la consulta del informe. Esto nos da la posi"ilidad de e#ecutar directamente sus m'todos. Por e#emploQ#er2*le elNo(+)! )na %aria"le llamada GFE;J;F@ de tipo G ery; n, que hace referencia a las propiedades y m'todos de una instancia en e#ecucin de la consulta del informe. Esto nos da la posi"ilidad de e#ecutar directamente sus m'todos. Por e#emploQ#er2R#n*;etNo(+)! $ pesar de que se e&isten estas %aria"les, declaradas automticamente por el sistema, podemos acceder a los elementos que referencian de la forma tradicional, es decir, desde cdigo haciendo uso de los m'todos de la clase de sistema ;eport; n. $s , por e#emplo, desde un m'todo del informe podemos acceder a la consulta del siguiente modoEB,63?2 :, 800,52 8 ;/8 02/5;?48 Z#er2 ! Q ( t3is*Q#er2()! Q*le elNo(+)! EB,63?2 :, 800,52 8 ?8 ./548/0.8 ,/ ,B,0;0.1/ :, ;/8 02/5;?48 Z#er2R#n ! Qr! Q!

Damgaard Espaa, S.A.

Pgina 7$ de 127

Programacin de in0ormes Qr ( t3is*Q#er2R#n()! Qr*;etNo(+)! En am"os casos la %aria"le this har a referencia al o"#eto en e#ecucin en ese momento, es decir, al informe.

41.

En c al% ier caso' siempre es m0s aconsejable tili$ar las variables impl)citas declaradas por el sistema en l gar de de#inir n evas variables' ya % e de esta #orma evitamos % e existan variables ig ales d plicadas en memoria-

Mtodos del in#orme


,uando creamos un nue%o informe se crea automticamente un nodo de m'todos. El nodo contiene lo que se denomina m&todos virt ales, que son m'todos implementados en MorphX, pero que pueden ser so"recargados para cam"iar el comportamiento por defecto de los formularios. En estos m'todos la funcin llamada s per*, acti%a la e#ecucin del m'todo implementado por MorphX.

41.1.

L.548 :, 6@42:25
En un informe podemos encontrar los siguientes m'todos de sistema-

$./8?.L,

8e e#ecuta cuando ya no se necesita la instancia del informe en e#ecucin. 8e e#ecuta para solicitar al usuario que eli#a el medio (papel, pantalla, archi%o) y otra informacin de impresin. 8e e#ecuta cuando se crea un informe. 8e e#ecuta para poner en funcionamiento el informe. 8e e#ecuta para recuperar registros de la "ase de datos. 8e e#ecuta para imprimir el informe en el medio de impresin seleccionado. 8e e#ecuta para en%iar los registros recuperados por la consulta a las distintas secciones del informe. 8e e#ecuta por el formulario !ysErint<orm cuando

P72634

I/.4 R;/ $,409 P7./4

X X X X

S,/:

S,4T87C,4

Damgaard Espaa, S.A.

Pgina 7% de 127

Programacin de in0ormes cam"iamos de medio de impresin. G,4T87C,4 X 8e e#ecuta por el formulario !ysErint<orm cam"iamos de medio de impresin. cuando

P7./4,7S,44./C5

8e e#ecuta cuando seleccionamos la opciones de impresin en un men o a tra%'s del formulario !ysErint<orm. 8e e#ecuta cuando se pone en marcha el informe y determina el t tulo de la %entana de %isuali!acin preliminar del informe. 8e e#ecuta cuando se crea una %entana que indica el progreso en la construccin del informe. 8e e#ecuta cada %e! que se %a a actuali!ar la %entana de progreso.

C834.2/

C7,84,P72C7,55$276

P72C7,55I/-2

41.2.

M@42:25 37./0.38?,5 A 5; -;/0.1/

$ continuacin %amos a descri"ir algunos de los m'todos ms utili!ados en los informes, que por su importancia merecen un tratamiento algo ms e&hausti%o. )a :'todo 2lassDeclaration En 'ste m'todo se definen las %aria"les glo"ales del informe que son accesi"les desde cualquier m'todo del informe o de cualquier seccin del mismo. (os m'todos de la consulta no tienen acceso a estas %aria"les glo"ales. )" :'todo Init El m'todo Init se e#ecuta cuando a"rimos un informe. (a llamada al m'todo s per*, crea una instancia en e#ecucin del informe. Es automticamente acti%ado despu's de un m'todo ne". En el m'todo Init, se iniciali!an las %aria"les espec ficas de dicho informe. ,omo e#emplo, tenemos el m'todo Init del informe 2 st;even e. EB,63?2 :, 6@42:2 I/.4 p#blic { s#per()! c#stRe en#eReport ( element*ar;s()*caller()! if (Kc#stRe en#eReport) t3ro? error(strfmt(LM>N>//))OL1f#ncname()))! Damgaard Espaa, S.A. Pgina $& de 127 oid init()

Programacin de in0ormes $ )c :'todo Erompt El m'todo Erompt se e#ecuta para solicitar al usuario que eli#a el medio de impresin. 8e muestra un dilogo en pantalla, donde podemos elegir entre las distintas opciones de impresin. 8i el programador no quiere que apare!ca este dilogo, el m'todo Erompt puede so"recargarse, de manera que no realice la llamada a s per*,. Ao hay que confundir este m'todo con el m'todo del mismo nom"re de una consulta. ,omo e#emplo, tenemos el m'todo Erompt del informe 2he% e. EB,63?2 :, 6@42:2 P72634 boolean prompt() { boolean ret! ! if (c3eQ#e&op2) ret ( tr#e! else ret ( s#per()! ret#rn ret! $ )d :'todo ; n El m'todo ; n se e#ecuta cuando a"rimos un informe, inmediatamente despu's del m'todo Init, para poner en funcionamiento el informe. (a %ersin no so"recargada de este m'todo reali!a cinco tareas en la siguiente secuencia*. +. .. 2. 1. (lamar al m'todo Prompt ,rear un diseo "sico para el informe, si an no e&iste 3rgani!ar los campos en el informe (lamar al m'todo <etch (lamar al m'todo Erint

$ntes de la llamada al m'todo s per*, podr amos hacer algunas tareas ha"ituales, como por e#emplo modificar la consulta del informe. ,omo e#emplo, tenemos el m'todo ; n del informe <orecast!alesAct al. EB,63?2 :, 6@42:2 R;/ p#blic { Report>trin;&ontrol Report>trin;&ontrol ctrl5#d;et! ctrl9ct#al! oid r#n()

Damgaard Espaa, S.A.

Pgina $1 de 127

Programacin de in0ormes ! ctrl5#d;et ( element*desi;n()*controlName(^5#d;et"nter al^)! ctrl5#d;et*left%al#e(ctrl5#d;etZt2*left%al#e())! ctrl9ct#al ( element*desi;n()*controlName(^9ct#al"nter al^)! ctrl9ct#al*left%al#e(ctrl9ct#alZt2*left%al#e())! s#per()! $

41.3.

S,0;,/0.8 :, ,B,0;0.1/ :, 6@42:25

En la siguiente figura se muestra la secuencia de e#ecucin de m'todos cuando a"rimos un informe-

6igura *+. 8ecuencia de e#ecucin de m'todos en un informe.

El orden en el que se e#ecutan los m'todos es el siguiente*. 8e acti%a el m'todo Init del informe, para iniciali!arlo. +. 8e acti%a el m'todo ;un del informe. .. 8e acti%a el m'todo Prompt del informe, para permitir al usuario interactuar con 'l. 2. 8e acti%a el m'todo <etch del informe. 1. 8e acti%a el m'todo Erint del informe.

41.4.

S,?,00.1/ :,? :.5,P2 :, ;/ ./-276,

(os informes en MorphX pueden tener ms de un diseo. Podemos utili!ar esto para tener distintas %ersiones del mismo informe. Por e#emplo, podemos tener un informe con dos diseos, donde el primero imprimir a con orientacin %ertical y el segundo con orientacin hori!ontal o apaisada.

Damgaard Espaa, S.A.

Pgina $2 de 127

Programacin de in0ormes ,uando imprimimos un informe, el primer diseo es el utili!ado por defecto. 8in em"argo, en tiempo de e#ecucin podemos a"rir un diseo espec fico en funcin de alguna condicin. Para ello utili!aremos el m'todo design*, de la clase ;epor; n. ,omo e#emplo, %eamos parte correspondiente a las facturas de %entaEB,63?2 oid { s#per()! *** s?itc3(>alesParametersGGfind()*prePrintLe el"n oice) { case(PrePrintLe elGG5lanAPaper)G element*desi;n(^5lanAPaper^)! breaA! case(PrePrintLe elGG>emiPrePrinted)G element*desi;n(^>emiPrePrinted^)! breaA! case(PrePrintLe elGGPrePrinted)G element*desi;n(^PrePrinted^)! breaA! $ *** $ init() del m'todo Init del informe !alesInvoice,

41.5.

M@42:25 1etch A 'end

(a consulta, utili!ada para recuperar registros de la "ase de datos, y el diseo de un informe son dos elementos independientes. Estos dos elementos, slo interaccionan de manera dinmica mediante los m'todos que %amos a definir en este apartado. (a consulta puede hacer referencia al informe utili!ando la %aria"le predefinida element. 8i lo necesitamos, el informe puede acceder a la consulta, utili!ando la %aria"le % ery. (os m'todos <etch y !end son una parte central del motor de los informes en MorphX. El m'todo <etch recoge los registros definidos por la consulta del informe, y el m'todo !end en% a los registros recogidos al diseo del informe. El m'todo <etch es el principal "ucle de un informe. 8i los datos que se %an a mostrar en el informe de"en cumplir restricciones especiales, el programador puede so"recargar el m'todo <etch(a estructura "sica del m'todo <etch es la siguiente-

Damgaard Espaa, S.A.

Pgina $' de 127

Programacin de in0ormes

Z#er2R#n Qr ( ne? Z#er2R#n(report)! << 9brir el dilo;o prompt if (Qr*prompt()) { ?3ile (Qr*ne6t()) { file ( Qr*;et(file)! send(file)G $ $ 8i slo queremos imprimir registros que satisfacen condiciones especiales, que sean dif ciles de e&presar como un rango en la consulta, de"emos escri"ir el cdigo situado arri"a, y solo permitir la llamada al m'todo !end si la restriccin (e&presada como una funcin con el mismo nom"re en el e#emplo de a"a#o) se satisface. ?3ile (Qr*ne6t()) { file ( Qr*;et(file)! if (restriccin()) send(file)! $ $ continuacin presentamos un e#emplo del m'todo <etch del informe 2he% e. EB,63?2 :, 6@42:2 -,409 boolean fetc3() { Z#er2R#n ! Q#er2 ( ne? Z#er2R#n(t3is)! if (Q#er2*prompt() @@ element*prompt()) { Q#er2*setRecord(tmp&3eQ#e)! ?3ile (Q#er2*ne6t()) { tmp&3eQ#ePrinto#t ( Q#er2*;etNo(+)! t3is*send(tmp&3eQ#ePrinto#t)! $ ret#rn tr#e! Q#er2! << Para todos los or_;enes de datos << Para todos los or_;enes de datos << el #s#ario no 3a p#lsado el botn de cancelar

Damgaard Espaa, S.A.

Pgina $4 de 127

Programacin de in0ormes $ ret#rn false! $ El m'todo !end es una cone&in entre la consulta y la parte %isual del informe. El m'todo !end en% a los registros recogidos a las secciones del cuerpo ( body sections) del informe. Podemos %er un esquema del flu#o de informacin en los informes en el di"u#o siguiente-

6igura *.. 6lu#o de informacin en un informe.

En la figura podemos %er cmo los datos se en% an desde la ta"la a la consulta del formulario mediante el m'todo <etch, y despu's como se enla!an esos datos con los controles del diseo del informe mediante el m'todo !end.

42.

Mtodos en la consulta
En la 7 )a del desarrollador de Axapta podemos encontrar la lista completa de m'todos de las consultas. En este apartado %amos a %er nicamente los ms importantes. )a :'todo 2lassDeclaration En 'ste m'todo se definen las %aria"les glo"ales de la consulta, que sern accesi"les nicamente por sus m'todos. )" :'todo Init El m'todo Init inciali!a la consulta del informe cuando 'sta se e#ecuta. )c :'todo Erompt

Damgaard Espaa, S.A.

Pgina $ de 127

Programacin de in0ormes (a e#ecucin de este m'todo presenta un dilogo en pantalla, donde el usuario podr determinar los rangos de seleccin de registros, el orden en que 'stos de"en presentarse, etc. (a llamada al m'todo s per*,, a"re el formulario definido en la propiedad <orm de la consulta. Por defecto, esta propiedad toma el %alor !ysG ery<orm. 8i el programador no quiere que apare!ca este dilogo, el m'todo Erompt puede so"recargarse, de manera que no realice la llamada a s per*,. ,omo e#emplo, tenemos el m'todo Erompt del informe 2he% e. EB,63?2 :, 6@42:2 P72634 boolean prompt() { boolean ret! ! ret ( tr#e! ret#rn ret! $ )d :'todo ; n El m'todo ; n se e#ecuta cuando e#ecutamos la consulta de un informe desde el $r"ol de 3"#etos de la $plicacin. <<No m#estra la entana

43.

Mtodos en secciones de un in#orme


(as secciones determinan la apariencia de un informe en MorphX. Estas secciones, pueden ser definidas por una plantilla o directamente en el diseo particular de un informe. Bodas las secciones pueden ser repetidas un nmero determinado de %eces, segn las necesidades del usuario. En la ta"la siguiente se presentan las diferentes secciones que pueden componer un informeP71?2C2 RP72?2CS X $parece al principio de un informe. 8e utili!a para mostrar elementos, como por e#emplo el logotipo, el t tulo del informe, o la fecha actual. El prlogo se imprime antes que el enca"e!ado de pgina, en la primera pgina del informe. $parece al principio de cualquier pgina de un informe. $parece al principio de un nue%o grupo de registros. 8e utili!a para mostrar elementos, como por e#emplo el nom"re de un grupo.

E/08>,L8:2 :, 3EC./8 RP8C, #,8:,7S E/08>,L8:2 R#,8:,7S

X X

Damgaard Espaa, S.A.

Pgina $! de 127

Programacin de in0ormes S,00.1/ RS,04.2/ G72;3S X X $parece en la parte central de un informe. )na seccin puede contener un enca"e!ado, un cuerpo y un pie. Es importante sealar, que la estructura de los or genes de datos se %e refle#ada en la estructura de las secciones. $parece en la parte central de un informe. )n cuerpo contiene controles o una seccin. (os controles muestran la informacin de los campos de los or genes de datos. $parece al final de un grupo de registros. 8e utili!a para mostrar, por e#emplo, su"totales. $parece al final de cada pgina de un informe. 8e utili!a para mostrar, por e#emplo, nmeros de pgina. $parece al final de un informe. El ep logo se imprime #usto despu's del pie de pgina de la ltima pgina del informe. Podemos utili!ar secciones programa"les para aadir cualquier tipo de informacin personali!ada a nuestros informes. Para acti%ar una seccin programa"le, lo hacemos mediante la llamada e&pl cita al m'todo exec te.

C;,732 RB2:AS

P., R$224,7S P., :, 3EC./8 RP8C, $224,7S E3<?2C2 RE3.?2CS S,00.1/ 372C7868>?, RP72C78668>?, S,04.2/S

Por lo tanto, la estructura de un informe ser a la siguiente[Prolo;] [Pa;e Deader] [>ection Jro#p] [Deader] [5od2] [Rooter] [>ection Jro#p] [Deader] [5od2] [Rooter] ] [Pa;e Rooter] [4pilo;] En cualquier lugar del informe podemos definir S,00.2/,5 372C7868>?,5. De la misma manera, en cualquier seccin del diseo de un informe, podemos crear m'todos de tipo display, que nos permitir an producir la informacin que quisi'ramos mostrar en dicho informe.

Damgaard Espaa, S.A.

Pgina $7 de 127

Programacin de in0ormes En el diseo de un informe, de"a#o de cada seccin, e&iste un m'todo llamado E>ecute'ection. ,uando e#ecutamos el m'todo s per*,, dentro de un m'todo de este tipo, se imprime la informacin de dicho sector. En determinadas situaciones, nos interesa controlar si la informacin de una seccin queremos que se imprima o no, de acuerdo con algn criterio que nosotros mismos definimos. Esto se consigue haciendo que la llamada al m'todo s per*, se realice dentro de una instruccin condicional. Bam"i'n podemos utili!ar el m'todo Exec te!ection para esconder o mostrar controles de un informe en tiempo de e#ecucin. 3tra utilidad comn de los m'todos Exec te!ection es insertar un salto de pgina. Por e#emplo, para insertar un salto de pgina entre el prlogo y las pginas siguientes, de"emos insertar la instruccin element-ne"Eage*, despu's de la llamada al m'todo s per*, en el m'todo Exec te!ection del prlogo.

44.

6cceso a los controles desde el cdigo


En algunas ocasiones puede interesarnos modificar alguna propiedad de un control en tiempo de e#ecucin. Para poder acceder a los controles de un informe, lo primero que tenemos que hacer es declarar una %aria"le del tipo correspondiente en el m'todo 2lassDeclarationEB,63?2 :,0?8780.1/ :, 02/472?,5 p#blic class ReportR#n e6tends UbFectR#n { Report>ection ReportTe6t&ontrol $ $ continuacin de"emos asignar a esa %aria"le de tipo control el control del informe. 8upondremos que tenemos una seccin llamada Erolog?B y dentro de ella un control de tipo te&to llamado ErologTextB. Oeali!ar amos la asignacin con una instruccin como la siguienteEB,63?2 :, 85.C/80.1/ :, 02/472? 8 ;/8 =87.8>?, p#blic { report>ection ( element*desi;n()*sectionName(LProlo;B+L)! te6t&ontrol ( report>ection*controlName(LProlo;Te6t+L)! $ /ay que destacar que en los controles de los informes no tenemos la propiedad de declaracin automtica (A todeclaration), lo que har, que tengamos de declarar %aria"les para todos los controles del informe a los que queramos acceder en tiempo de e#ecucin. oid init() report>ection! te6t&ontrol!

Damgaard Espaa, S.A.

Pgina $$ de 127

P)anti))as de in0ormes

P"anti""as de in*or'es
45. /e#inicin
(a idea "sica de una plantilla es muy simple. Cmaginemos que tenemos +0 informes para una determinada compa a, que comparten el mismo diseo "sico. 8i definimos el diseo "sico en una plantilla slo lo reali!aremos una %e!, y despu's el mismo diseo podr ser compartido por todos los informes de dicha compa a. ,uando creamos un informe utili!ando una plantilla, estamos determinando unas caracter sticas por defecto. (a plantilla contiene informacin so"re las secciones que contiene un nue%o informe y so"re el diseo de cada una de las partes del informe. )na plantilla puede contener un prlogo, una ca"ecera de pgina, un pie de pgina, un ep logo, y secciones programa"les. Estas secciones pueden ser aadidas al diseo que :orph; genera "asndose en nuestro diseo espec fico. Por e#emplo, nuestra plantilla contiene un pie de pgina que aade un nmero de pgina a todas las pginas de nuestro informe. 8i nosotros decidimos hacer una modificacin en el diseo, tan slo lo tendremos que hacer una %e! en la plantilla, y automticamente todos los +0 informes sern modificados. Esto es cierto nicamente cuando utili!amos un informe "asado en un diseo especifico (A toDesign!pecs). 8i nuestro informe utili!a un diseo personali!ado (Design), los cam"ios reali!ados en la plantilla no los %eremos en nuestro informe. ,uando nosotros creamos un diseo personali!ado, :orph; reali!a una copia de la plantilla y la coloca en el nodo diseo de nuestro informe, por esta ra!n no se actuali!a cuando se modifica la plantilla.

4".

*onstruccin de una plantilla


)na plantilla consiste en un nmero de secciones. ,ada seccin define una parte del informe, como por e#emplo, un prlogo, una ca"ecera de pgina, un pie de pgina, un ep logo o una seccin programa"le. ,ada uno de estos componentes del diseo puede contener un nmero de controles para %isuali!ar di%ersos tipos de informacin. Para crear una nue%a plantilla de"emos acceder al nodo ;eport Templates que se encuentra "a#o el nodo ;eports del $3B. En este nodo, simplemente de"eremos elegir la opcin @ evo del men conte&tual. $ continuacin, renom"ramos la plantilla y generamos las secciones que deseemos.

4$.

:tili?acin de una plantilla en un in#orme


Para utili!ar una plantilla en un informe, simplemente de"emos introducir el nom"re de la plantilla elegida en la propiedad ;eportTemplate del nodo ;eportDesign del informe.

Damgaard Espaa, S.A.

Pgina $% de 127

.)ases

C"ases
)na clase es un constructor soft=are que define unos datos (estado) y unas acciones (comportamiento) de los o"#etos concretos que posteriormente son creados en a partir de esa clase. (as propiedades son los datos para la clase y los m'todos son la secuencia de sentencias que operan con los datos. Aormalmente las propiedades son propias de un o"#eto, es decir, todos los o"#etos construidos a partir de la definicin de la clase tendrn su propia copia de las propiedades. Estos distintos o"#etos son conocidas como instancias. )na clase no es un o"#eto. )na clase puede ser considerada como un anteproyecto, que define como un o"#eto podr comportarse cuando el o"#eto sea creado desde las especificaciones dictadas por la clase. Aosotros o"tenemos o"#etos concretos para instanciar una clase definida pre%iamente. $s como nosotros podemos construir muchas casas de un mismo arquitecto, nosotros podemos instanciar muchos o"#etos de una misma clase. $ continuacin podemos %er una declaracin "sica de una clase muy simple llamada Eoint&lass Point { do#ble 6! do#ble 2! $ Esta declaracin simplemente define una plantilla de cmo o"#etos de tipo Point pueden ser instanciados. <<instancia de #na propiedad << instancia de #na propiedad

4%.

Mtodos de la clase
C?855D,0?8784.2/.

48.1.

En este m'todo es donde podemos escri"ir la declaracin de las %aria"les. Por defecto este m'todo est %ac o. Bam"i'n en este m'todo es donde se le asigna un nom"re a la clase. E#emploclass &#stU erd#e46pense { &#stPa2m46pense Led;er9cco#nt Led;er'o#rnalTrans $ c#stPa2m46pense! led;er9cco#nt! led;er'o#rnalTrans!

Damgaard Espaa, S.A.

Pgina %& de 127

.)ases

48.2.

N,G.

Este constructor es llamado automticamente cuando el o"#eto es creado por el operador ne". 8uele ser utili!ado para iniciali!ar las propiedades en el o"#eto nue%o. $ continuacin %emos un e#emplo de la utili!acin del m'todo ne" en la clase Eoint%oid ne?(do#ble a(+E1 do#ble b(+E) {<<&onstr#ctor Q#e iniciali=a a #n 6 ( a! 2 ( b! $ $l m'todo ne" en una clase se llama constructor. ,uando nosotros creamos una instancia de un o"#eto de la clase Eoint, el constructor es in%ocado para e#ecutar cualquier iniciali!acin que sea necesaria. En este caso, modifica la instancia de la %aria"le a un estado inicial. (os m'todos constructores pueden o no reci"ir parmetros, pero nunca de%uel%en un %alor. En el e#emplo de a"a#o podemos %er como podemos crear e iniciali!ar un o"#eto de la clase Eoint, iniciali!ndolo con los %alores por defecto o iniciali!ndolo a unos %alores espec ficos. Point lo?erleft! Point #pperRi;3t! lo?erleft ( ne? Point()! << alores por defecto* #pperRi;3t ( ne? Point(+EE*E1 /EE*E)! << alores espec_ficos* alor por defecto

27.+.*. ,reacin de otros o"#etos desde un constructor


En ocasiones una clase necesita utili!ar instancias de otros o"#etos, y de"e en su constructor crearse instancias de dichos o"#etos. $ continuacin podemos %er un e#emplo de cmo la clase rectangle utili!a dos o"#etos de tipo Eoint. &lass Rectan;le { Point lo?erleft! Point #pperRi;3t! Ne?() { lo?erleft ( ne? Point()! #pperRi;3t ( ne? Point()! $ $

Damgaard Espaa, S.A.

Pgina %1 de 127

.)ases

48.3.

$./8?.L,.

El destructor puede ser utili!ado para e#ecutar sentencias de limpie!a cuando una instancia de una clase no se %a a necesitar ms. (os m'todos de finali!acin en ;<< no son llamados automticamente por el sistema. Aosotros tenemos que hacer e&pl citamente una llamada al m'todo <inali$e para que e#ecute las sentencias que hay en 'l. Aormalmente este m'todo no se suele codificar. En el e#emplo de a"a#o podemos %er como se reali!a una llamada a este m'todo desde cualquier m'todo de la clase. <<Dentro de c#alQ#ier mtodo { * * * * if (condicin) t3is*finali=e() * * * * $

4&.

4ay % e destacar % e en XKK no res lta necesaria la llamada al m&todo #inali$e si este no tiene ning/n c.digo- !implemente c ando na instancia de n objeto no va a volver a ser tili$ada' el sistema libera la memoria % e oc paba *pero no libera los rec rsos % e h biese podido tomar' y % e se deber)an liberar con el m&todo #inali$e,-

Mtodo @mainA
Este m'todo es utili!ado para e#ecutar una clase. Ao es un m'todo de la clase, si no que cuando nosotros queremos e#ecutar una clase a tra%'s de una llamada de menu item, nos crearemos un m'todo main pasndole como parmetro un o"#eto de tipo $rgs. Este m'todo tiene . peculiaridades*.X Es un m'todo esttico. +.X Oeci"e un nico parmetro de tipo args. ..X Ao de%uel%e ningn parmetro, es de tipo %oid. El perfil de este m'todo es el siguiente. oid static main (ar;s Bar;s)! )na clase puede ser e#ecutada a tra%'s de un men item de tipo $ction o so"re la misma clase pulsando 3pen ("otn derecho del ratn o en la "arra de herramientas). Aormalmente este m'todo suele contener la creacin de la instancia de la clase y las llamadas a los m'todos prompt y run de la clase. E#emplostatic oid main(9r;s ar;s)

Damgaard Espaa, S.A.

Pgina %2 de 127

.)ases { &#st"n oice'o#r &#st"n oice ! c#st"n oice'o#r ( ar;s*record()! c#st"n oice ( ne? &#st"n oice(c#st"n oice'o#r1 &#stParametersGGfind()*creditMa6&3ecA)! c#st"n oice*r#n()! $ c#st"n oice'o#r! c#st"n oice!

5(.

-erencia
;<< implementa lo que se conoce como un modelo de herencia simple. )na nue%a clase slo puede ser su"clase de otra clase. 8i nosotros e&tendemos una clase, nosotros heredamos todos los m'todos y %aria"les de la clase madre, la cual se llama superclase. (a sinta&is que denota que una clase es hi#a de una superclase es la siguiente&lass N26>7, :, ?8 0?85, 9.B8 e6tends /26>7, :, ?8 5;3,70?85, (a anterior ser a la definicin que de"er a a parecer en la declaracin de clase de la clase hi#a. $ continuacin presentamos un e#emplo que crea una nue%a clase que es una %ariante de la clase Eoint, esta nue%a clase %amos a llamarla LDEointclass Point { real 6! << instancia de la Real 2! << instancia de la ! Ne?(real B61 real B2) { << el constr#ctor iniciali=a las 6 ( B6! 2 ( B2! $ $ class )DPoint e6tends Point { real =! << la coordinada = del p#nto* Ne?(real B61 real B21 real B=) { s#per(B61 B2)! << iniciali=a las instancias = ( B=! ariables 6 e 2* ariable* ariable*

Damgaard Espaa, S.A.

Pgina %' de 127

.)ases $ $ ,omo podemos o"ser%ar la clase LDEoint ha aadido una nue%a instancia de %aria"le para la coordinada ! del punto. (as instancias & e y son heredadas de la clase Point por lo que no necesitamos declararlas en la clase LDEoint.

5!.1.

S2>7,087C8 :, 6@42:25

,uando nosotros estamos tra"a#ando con m'todos en una su"clase, es decir, una clase que hereda m'todos y propiedades de otras clases, podemos alterar la funcionalidad del m'todo de la clase principal. Para hacer esto de"emos crearnos en la su"clase un m'todo con el mismo nom"re y parmetros que el m'todo de la clase principal. Por e#emplo, supongamos que tenemos dos clases llamadas 2lassA y 2lass3, de forma que la segunda es una su"clase de la primera. Definimos los siguientes m'todosC?855A oid m2Met3od(int i) { << "ntr#cciones clase 9 $ C?855B oid m2Met3od(int i) { << "nstr#cciones clase 5 $ En este caso la clase 2lass3 es una su"clase de la clase 2lassA, por lo tanto hereda el m'todo myMethod. 8in em"argo como en la clase 2lass3 se define un m'todo con el mismo nom"re y el mismo nmero de argumentos, har amos caso omiso del m'todo de la clase principal. 8i se llamara al m'todo myMethod de la clase 2lass3 e#ecutar a su propio m'todo, es decir, las instrucciones de la clase U, en lugar del m'todo de la clase principal. Esto es lo que llamamos so"recargar un m'todo. 8i no estamos interesados en perder por completo la funcionalidad del m'todo de la clase principal, pero nos interesa aadirle funcionalidad, podemos hacer una llamada al m'todo de la clase principal mediante la sentencia s#per()dentro del m'todo de la clase hi#a. Por e#emploC?855B oid m2Met3od(int i) { s#per()! << "nstr#cciones clase 5 $

Damgaard Espaa, S.A.

Pgina %4 de 127

.)ases En este caso cuando reali!ramos una llamada al m'todo myMethod de la clase hi#a se e#ecutar a, mediante la llamada s#per(), el m'todo de la clase principal, con lo que se e#ecutar an las instrucciones de la clase $ y despu's se e#ecutar a el resto del m'todo, es decir, las instrucciones de la clase U. Por otra parte, con este funcionamiento e&iste el peligro de que, al so"recargar un m'todo, alteremos su funcionalidad de manera incorrecta. Por lo tanto, para protegernos de este tipo de situaciones, ;<< proporciona el modificador #inal, que e%ita que un m'todo pueda ser so"recargado. Por e#emplofinal { << "nstr#cciones $ E&isten no o"stante algunos m'todos que no pueden utili!ar el modificador final, como son los que se in%ocan cuando se crea o destruye un o"#eto, y otros que no lo necesitan ya que nunca pueden ser so"recargados, como son los m'todos estticos. oid m2Met3od()

5!.2.

#,7,/0.8 02/472?8:8 327 02/547;0427

Kamos %a e&plicar con un e#emplo como tra"a#a la herencia controlada por constructor. En el siguiente e#emplo tenemos 1 clasesCLASE PBH,onstruct:ain PBH,onstructor PBH,onstructDoAot[no= PBH,onstruct8tudent PBH,onstructBeacher DESCRIPCIN )na clase e#ecuta"le. Esta clase contiene el m'todo constructor. 8i el tipo es desconocido \ clase hi#a de PBH,onstructor 8i el tipo es un estudiante \ clase hi#a de PBH,onstructor 8i el tipo es un profesor \ clase hi#a de PBH,onstructor

PT_ConstructMain Methods: main( ) run( )

PT_Constructor Methods: construct() hello( )

PT_ConstructDoNotKnow Extends: PT_Constructor Methods: hello ( )

PT_ConstructStudent Extends: PT_Construct Methods: hello ( )

PT_ConstructTeacher Extends: PT_Construct Methods: hello ( )

Damgaard Espaa, S.A.

Pgina % de 127

.)ases ,omo podemos %er, todas las clases hi#as contienen el m'todo hello* ,' el cual anula al m'todo hello* , de la clase madre. Esto es importante para %er como tra"a#a la herencia controlada por constructor. En la clase ET?2onstr ctMain, nosotros utili!amos el m'todo r n( ) para llamar al m'todo constr ctor* , de la clase ET?2onstr ct&lass PTB&onstr#ctMain { oid r#n( ) { PTB&onstr#ctor constr#ctor! PTBT2pe t2pe! ! << YY Llama al mtodo PTB&onstr#ctDoNot`no?*3ello() constr#ctor ( PTB&onstr#ctorGGconstr#ct(PTBT2peGGDoNot`no?)! constr#ctor*3ello()! << YY Llama al mtodo PTB&onstr#ct>t#dent*3ello() constr#ctor ( PTB&onstr#ctorGGconstr#ct(PTBT2peGG>t#dent)! constr#ctor*3ello()! << YY Llama al mtodo PTB&onstr#ctTeac3er*3ello() constr#ctor ( PTB&onstr#ctorGGconstr#ct(PTBT2peGGTeac3er)! constr#ctor*3ello()! $ $ 8i o"ser%amos el m'todo PBH,onstructor.construct( ), que a"a#o se detalla, podemos o"ser%ar que dependiendo el parmetro que se le pasa al m'todo, 'l de%uel%e una de las instancias de las clases hi#as. >tatic PTB&onstr#ctor constr#ct(PTBT2pe t2pe) { s?itc3 (T2pe) { case (PTBT2peGGDoNot`no?) G ret#rn ne? PTB&onstr#ctDoNot`no?()! breaA! case (PTBT2peGG>t#dent) G

Damgaard Espaa, S.A.

Pgina %! de 127

.)ases ret#rn ne? PTB&onstr#ct>t#dent()! breaA! case (PTBT2peGGTeac3er) G ret#rn ne? PTB&onstr#ctTeac3er()! breaA! $ $

Damgaard Espaa, S.A.

Pgina %7 de 127

Desarro))o .)iente3Ser4idor

Desarro""o C"iente / Ser0idor


51. Especi#icar el lugar de ejecucin.
C?85,5.
(as clases tiene una propiedad R;/O/ que puede contener estos %alores Cliente (client). n!ocado desde (called "rom). Ser!idor (ser!er).

51.1.

(os o"#etos creados desde la clase residirn donde se haya especificado. 8i se escoge 08??,: -726, el o"#eto residir en el entorno donde se in%oque al constructor (/,G) (cliente o ser%idor). (as clases que heredan de otras tam"i'n heredan la propiedad R;/O/. 8i est esta"lecida a C?.,/4 o S,7=,7 no se puede modificar, pero si se trata de C8??,: -726 s puede modificarse.

51.2.

M@42:25.

(os m'todos estticos de clase as como los m'todos de las ta"las pueden cam"iar su comportamiento aadiendo el modificador 0?.,/4 o 5,7=,7 en su declaracin como se muestra en el siguiente e#emplo. ser er static boolean m2Met3od() { *** $ El m'todo anterior ser siempre e#ecutado en el ser%idor. Por defecto los m'todos estticos de las clases son e#ecutados all donde indique la propiedad R;/ O/ de la clase en la que se ha declarado el m'todo. (os m'todos dinmicos se e#ecutan siempre all donde la clase se ha declarado que resida (a tra%'s de la propiedad R;/ O/). $ los m'todos estticos de clase se les puede especificar comportamiento 08??,: -726 indicando en su declaracin que pueden ser e#ecutados tanto en el cliente como en el ser%idorclient ser er static boolean m2Met3od() { *** $

Damgaard Espaa, S.A.

Pgina %$ de 127

Desarro))o .)iente3Ser4idor (os m'todos de las ta"las, se e#ecutan desde all donde son llamados, aunque por definicin, los m'todos insert > doInsert, pdate > doFpdate y delete > doDelete se e#ecutan en el ser%idor.

52.

+cnicas ptimas de programacin cliente B serCidor.


(os o"#eti%os principales a conseguir a este respecto son# # :inimi!ar el trfico entre 8er%idor y ,liente. Poner la lgica asociada a la interfa! de usuario (T)C) en el ,liente. Por e#emplo# # # # # 3"#etos de tipo 6ormOun, 6ormData8ource, todos los 6orm,ontrols, DialogUo&, y 3perationProgress (asociados a los formularios) de"en residir siempre en el cliente. Elementos asociados a los Cnformes (como o"#etos OeportOun) tam"i'n de"en residir en el cliente. Poner la lgica asociada a la aplicacin en el 8er%idor de la $plicacin. Poner la lgica asociada a la Uase de Datos en el 8er%idor de Uase de Datos. :inimi!ar las llamadas a otros componentes en los "ucles locales de la aplicacin. Esto supone e%itar, por e#emplo, llamadas a cdigo residente en clientes cuando se est e#ecutando un "ucle de un proceso L"atchM en el ser%idor , ya que esto supondr a trfico entre cliente y ser%idor en cada iteracin del "ucle. En general, son acepta"les algunas llamadas a otros componentes en el comien!o de L#o"sM o a su final.

Damgaard Espaa, S.A.

Pgina %% de 127

5tras 6erramientas de desarro))o

Otras 1erra'ientas de desarro""o


53. )as re#erencias cru?adas.
El sistema de referencias cru!adas fue diseado para me#orar nuestra perspecti%a general de los o"#etos de la aplicacin. El sistema de referencias cru!adas puede responder a preguntas como*.X ]Desde dnde se accede a los campos de una ta"laN ]Para escritura o para lecturaN +.X ]Desde dnde se accede a los m'todos de una clase o una ta"laN ..X ]@u' nom"res de tipos son utili!ados en el sistemaN 2.X ]@u' nom"res de %aria"les son utili!ados en el sistemaN (as referencias cru!adas estn "asadas en el cdigo, en las etiquetas, y en la informacin de las propiedades. $ tra%'s de ellas, podemos o"tener una lista de elementos utili!ados en una parte del cdigo o tam"i'n podemos o"tener una lista de componentes donde se haga referencia al componente actual. Para poder tener esta informacin disponi"le, tenemos que seleccionar esta opcin cuando realicemos la configuracin de usuario. Est disponi"le en la pestaa ^Desarrollo_ dentro del grupo ^Teneral_. 8i tenemos la casilla de referencias cru!adas seleccionada, podemos construir una lista de elementos cuando compilemos componentes. Para o"tener una lista completa de referencias, es necesario compilar toda la aplicacin.

Al tener esta opci.n activada' cada ve$ % e compilemos se generaran o act ali$aran las re#erencias cr $adas de a% ellos nodos del AOT % e compilemos' con lo % e siempre dispondremos de las re#erencias cr $adas act ali$adas- Eero al mismo tiempo' la compilaci.n se volver0 m0s costosa- Eor lo tanto' !i se va a desarrollar en Axapta' se recomienda no activar esta casilla y reali$ar na act ali$aci.n de las re#erencias cr $adas de todo el AOT de #orma peri.dica-

(a herramienta para generar las referencias cru!adas de todo el sistema la %amos a encontrar en el men herramientas (tools) > desarrollo (de%elopment) > referencias cru!adas, donde accedemos a un dialogo donde podemos indicar que operacin deseamos reali!ar con las referencias cru!adas. 3tro punto de acceso a la herramienta referencias cru!adas mucho ms utili!ado est en el men conte&tual del $3B a tra%'s de la entrada ^$ddsXCns_ > ^Oeferencia cru!ada_. $ partir de esta entrada es posi"le no solo actuali!ar las referencias cru!adas

Damgaard Espaa, S.A.

Pgina 1&& de 127

5tras 6erramientas de desarro))o para el nodo so"re el que estamos situados, sino tam"i'n consultar dichas referencias cru!adas segn las distintas modalidades que pasamos a detallar. 8i seleccionamos la opcin ^Aom"res_, nos muestra una lista de o"#etos de aplicacin con el nom"re del elemento y la posi"ilidad de %er a que elementos hace referencia el elemento actual.

8i seleccionamos la opcin ^Outa de acceso_ (^Path_), nos muestra la misma lista pero nom"rando la ruta de acceso en el r"ol de o"#etos de la aplicacin del elemento actual.

Y seleccionando el "otn L)tili!ado porM nos muestra una %entana, como la mostrada a continuacin, con informacin de los elementos que hacen referencia al elemento actual.

Damgaard Espaa, S.A.

Pgina 1&1 de 127

5tras 6erramientas de desarro))o

54.

<isual MorphXplorer
)tili!aremos el 1is al MorphXplorer para %isuali!ar el mdulo de datos de Axapta mediante el di"u#o de diagramas de relacin de entidades. Bodos los comandos de %isuali!acin se encuentran disponi"les en el men conte&tual del o"#eto actual. )tili!aremos las fichas Teneral y ,olores para asignar un t tulo a cualquier diagrama y para definir su propia configuracin de color. $ntes de comen!ar a reali!ar un diagrama, ser necesario actuali!ar el sistema de referencias cru!adas, puesto que la informacin para la reali!acin de estos diagramas se o"tiene de esta herramienta. En el 1is al MorphXplorer nosotros podemos representar las relaciones entre ta"las con la siguiente informacin# # # # (as relaciones *-n de la ta"la actual. (as relaciones n-* de la ta"la actual. (as clases que utili!a la ta"la actual. (os maps en que la ta"la actual forma parte. Ejemplo- Diagrama de relacin entre ta"las.

CustTable Tabla de clientes 77

pr2

*
AccountNum

AccountNum

CustTable Tabla de clientes 77

CustTrans Transacciones del cliente

pr2

78

pr2

Bam"i'n podemos representar relaciones entre clases. En un diagrama de clases podemos representar# # # # @ue clases utili!a la clase acti%a. @ue clases utili!an la clase acti%a. @ue clase es la superclase de la clase acti%a. @ue clases son hi#as de la clase acti%a. E#emplo- diagrama de relacin entre clases.
RunBase 512 ChequeDelete DialogField

dialogFromChequeNum
Called
43

Called

115

Client

Damgaard Espaa, S.A.

Pgina 1&2 de 127

5tras 6erramientas de desarro))o

54.1.

N26,/0?84;78 :,? *.5;8? MorphXplorer

$ continuacin %amos a especificar la notacin que utili!a MorphXplorer para reali!ar los diagramas.

12.*.*. 8 m"olos para las ta"las


,ero, uno o %arios registros. E&actamente un registro. ,ero o un registro. Ba"la utili!ada en un map. ` Ba"la que aparece ms de una %e! en el diagrama.

12.*.+. 8 m"olos para las clases


De la clase a la superclase. De la clase a la clase que utili!a. ` ,lase que aparece ms de una %e! en el diagrama.

54.2.

O7C8/.L87 ;/ :.8C7868 ,/ ,? <isual MorphXplorer

*. /acer clic con el "otn derecho del ratn en cualquier parte li"re de la %entana del 1is al MorphXplorer. +. 8eleccionar la opcin ^3rgani!ar_ el men conte&tual. Bodas las ta"las, clases y relaciones son de nue%o organi!adas acorde con el algoritmo de me#or situacin. Podemos situar los distintos elementos del grfico seleccionndolos y arrastrndolos hasta la posicin que deseamos. $l reali!ar esta accin, la herramienta recoloca el resto de o"#etos del grfico segn este algoritmo de me#or situacin.

54.3.

E? L226 ,/ ,? *.5;8? M2739X3?27,7


*. /acer clic con el "otn derecho del ratn en cualquier parte li"re de la %entana del 1is al MorphXplorer. +. 8eleccionar la opcin ^aoom_ y escoger el factor de !oom que deseemos.

/ay que indicar que la opcin de !oom solo es %lida para la %isuali!acin en pantalla del grfico. Para imprimir los diagramas se dispone de una herramienta ms espec fica al seleccionar la opcin de imprimir el grfico. $ tra%'s del "otn ^Diseo de pgina_ es posi"le configurar el tamao de la impresin, impresin multipgina, colores, etc.

Damgaard Espaa, S.A.

Pgina 1&' de 127

5tras 6erramientas de desarro))o

55.

Dr9ol de jerar;uEa
El r"ol de #erarqu a ofrece una %ista diferente de los elementos del r"ol de o"#etos. (a %ista est clasificada por los diferentes tipos de datos. En la imagen de a"a#o podemos %er el r"ol de #erarqu a.

$ continuacin se muestra un e#emplo, donde podemos %er la definicin de una clase, de qu' clase es hi#a, y que m'todos estn reescritos. De la misma forma tam"i'n podemos %er los campos y m'todos de una ta"la.

5".

-erramienta de 9Fs;ueda
El aspecto de la %entana de la herramienta B;5087... es similar a ^Uuscar archi%os y carpetas_ de Windo=s, aunque dispone de algunas optimi!aciones especificas para el entorno $&apta.

(a ficha ^6iltro_, es una me#ora particular de esta herramienta, se utili!a para filtros a%an!ados del resultado de la "squeda. Escri"a el cdigo ;<< en el campo 3rigen. El cdigo se e%ala para cada nodo encontrado y de"e de%ol%er un %alor lgico que ser %erdadero si el nodo se %a a incluir en el resultado de la "squeda y falso si no se %a a incluir.

Damgaard Espaa, S.A.

Pgina 1&4 de 127

5tras 6erramientas de desarro))o 8e puede detener una "squeda haciendo clic en el "otn D,4,/,7 (si se encuentra acti%ado) o pulsando ,trl<Cnterrumpir. El "otn D,4,/,7 se acti%a si se "uscan slo m'todos (predeterminado) que contengan algo de te&to, que utilicen la seleccin y si se han seleccionado algunos de los bnodos ra !b- $3B, Ba"las, ,lases, 6ormularios, Cnformes, ,onsultas, :ens, :enu items.

5$.

3tros
#,7786.,/485 :, 026372>80.1/ :, 01:.C2 RB,54 P7804.0,5S

5".1.

Esta herramienta hace una compro"acin del cdigo desarrollado para %er si se adapta a los estndares de $&apta. (a utili!acin de esta herramienta no garanti!a que todo el cdigo compro"ado cumpla con los estndares de $&apta. Esta herramienta la podemos encontrar en el men conte&tual del r"ol de o"#etos ($3B), seleccionando la opcin ^$ddXins_ > ^3ptimi!acin_ > ^,ompro"ar optimi!acin_. Aosotros podemos e#ecutar la opcin ^,ompro"ar optimi!acin_ en cualquier nodo el entorno de desarrollo. Uasndonos en las directrices descritas en este documento, el resultado nos dar unos conse#os so"re como e#ecutar nuestro cdigo. $ continuacin se detallan una serie de limitaciones de la herramienta# # # # El procedimiento de compro"acin re%isa un m'todo cada %e!. Ao tiene perspecti%a general. Es un anlisis esttico. Ao podemos %er la diferencia entre un m'todo del cliente llamado una %e! y un m'todo del ser%idor llamado *000 %eces. Ao se aprecia como una ta"la temporal reside en el ser%idor como una ta"la ordinaria, aunque no de"e ser el caso. $ctualmente se considera una llamada a queryOun.ne&t() como una llamada al ser%idor, pero de"e considerarse como una llamada al cliente y al ser%idor, si la queryOun es instanciada desde el cliente y est accediendo a una ta"la ordinaria. Bampoco se de"e considerar si la ta"la temporal reside en cualquier otra parte. Ao podemos %er si un o"#eto de una clase llamada es instanciado en un ni%el y en otro ni%el es pasado como parmetro a un m'todo e#ecuta"le, el cual a su %e! llama a m'todos de dicho o"#eto.

5".2.

#,7786.,/485 :, 02638780.1/

Esta herramienta reali!a comparaciones entre o"#etos del r"ol de o"#etos. (a podemos encontrar en el men conte&tual del r"ol de o"#etos ($3B), pinchando en la opcin ^$ddXins_ > ^comparar_.

Para reali!ar la comparacin entre dos o"#etos de"eremos seguir los siguientes pasos-

Damgaard Espaa, S.A.

Pgina 1& de 127

5tras 6erramientas de desarro))o *. 8eleccionar los dos o"#etos que deseamos comparar. Bam"i'n podemos seleccionar un slo o"#eto para reali!ar comparaciones entre dos diseos o ni%eles. +. $"rir el men conte&tual y escoger la opcin ^,omparar_. .. Kerificar que los o"#etos seleccionados, son los que queremos para reali!ar la compro"acin. 2. Pulsar el "otn ^,omparar_. $hora el sistema reali!ar la comparacin, y ampliar el cuadro de dilogo mostrado anteriormente con dos paneles ms, como se puede %er en la imagen siguiente.

El panel de la i!quierda muestra las diferencias entre los dos o"#etos en una estructura de r"ol que puede estar e&pandido. Y en el panel de la derecha muestra el contenido del nodo actual seleccionado. (as diferencias encontradas son indicadas usando colores, tanto en los iconos de la estructura en r"ol como en el contenido del nodo actual. El panel som"reado con las marcas de compro"acin indica que hay diferencias en la hi#a del nodo. ,omo podemos %er en el cuadro de dilogo, un o"#eto est pintado de ro#o y el otro o"#eto est pintado de a!ul. ,uando e&isten diferencias el icono del m'todo, control o propiedad etc. est pintado de los dos colores (ro#o y a!ul), si pinchamos so"re este icono nos aparecern en ro#o las l neas de cdigo, propiedades o controles que son del o"#eto ro#o, en a!ul las l neas, propiedades o controles que son del o"#eto a!ul y en negro las l neas, controles o propiedades que son id'nticos. 8i nos aparece el icono con una marca ro#a, quiere decir que ese m'todo, control o propiedad es del o"#eto ro#o, y si por el contrario aparece con una marca a!ul, significa que es del o"#eto a!ul.

5".3.

S;54.4;0.1/

Esta herramienta nos permite cam"iar un te&to por otro, por e#emplo, cam"iar el nom"re de un tipo de datos, o el nom"re de un campo de una ta"la, etc.

Damgaard Espaa, S.A.

Pgina 1&! de 127

5tras 6erramientas de desarro))o (a podemos encontrar en el men conte&tual del r"ol de o"#etos ($3B), pinchando en la opcin L$ddXinsM, y despu's Lsustituir sintcticamenteM.

5".4.

E? ,K86./8:27 :, 48>?85

)na %e! ya hayamos creado un tipo de interfa! e introducidos datos en una ta"la, podemos utili!ar el e&aminador de ta"las para facilitar una %isin de los datos e&istentes en la "ase de datos.

Para a"rir el e&aminador de ta"las se siguen los siguientes pasos*. 8o"re el o"#eto ta"la que queremos %er los datos, a"rir el men conte&tual del r"ol de o"#etos de la aplicacin. +. $cti%amos la opcin $ddXins_ > ^e&aminador de ta"las_. El e&aminador de ta"las nos mostrar los datos de todos los campos de la ta"la, e&cepto los de tipo container. $ tra%'s de esta herramienta podemos editar y eliminar registros. Podemos utili!ar el e&aminador de ta"las en cualquier sitio donde una ta"la sea utili!ada como origen de datos- en un formulario, en un informe o en una consulta. Bam"i'n podemos utili!ar el e&aminador de ta"las para %er el contenido de las ta"las del sistema.

Damgaard Espaa, S.A.

Pgina 1&7 de 127

.omunicacin con e) usuario

Co'unicacin con e" usuario


5%. Introduccin
$&apta nos ofrece %arias opciones para comunicarnos con el usuario desde la aplicacin. (a forma ms comn de interaccin con el usuario es el formulario. 8in em"argo, algunas tareas requieren otras formas de comunicacin con el usuario. Este cap tulo se ha di%idido en dos "loques. En el primero, se descri"irn las posi"ilidades que nos ofrece el sistema para emitir un mensa#e dirigido al usuario. En el segundo, %eremos cmo podemos solicitar informacin sencilla al usuario.

5&.

In#ormacin de salida
$&apta nos ofrece distintas posi"ilidades a la hora de mostrar mensa#es al usuario.

5(.1.

E? 5.54,68 In#o)og

El sistema In#olog corresponde a la %entana informati%a que utili!a el sistema para mostrar los mensa#es de informacin, a%iso y error que se generan durante el uso de la aplicacin. En realidad, es ms que una %entana. 8e trata de un registro donde se %an gra"ando los diferentes mensa#es.

6igura *2. Kentana de mensa#es del sistema In#o:og.

El programador puede acceder a la %entana de In#o:og y presentar sus propios mensa#es haciendo uso de las siguientes funciones)a E;,EPBC3A ./-2(8tr) Aos permite presentar un mensa#e informati%o. ,omo parmetro de entrada reci"e la cadena correspondiente al mensa#e. ,omo %alor de retorno, de%uel%e una e&cepcin de tipo in#o.

Damgaard Espaa, S.A.

Pgina 1&$ de 127

.omunicacin con e) usuario )" E;,EPBC3A G87/./C(8tr) Aos permite presentar un mensa#e de a%iso. ,omo parmetro de entrada reci"e la cadena correspondiente al mensa#e. ,omo %alor de retorno, de%uel%e una e&cepcin de tipo "arning. )c E;,EPBC3A ,7727(8tr) Aos permite presentar un mensa#e de error. ,omo parmetro de entrada reci"e la cadena correspondiente al mensa#e. ,omo %alor de retorno, de%uel%e una e&cepcin de tipo error. )d "oolean 09,0O$8.?,:(8tr) Presenta un mensa#e de a%iso y de%uel%e como resultado el %alor falso. (a funcin check<ailed es ampliamente utili!ada en el sistema. ,omo e#emplo, la siguiente sentencia generar a la %entana que se muestra a continuacin&3ecARailed(L4specifiQ#e #na fec3aL)!

5(.2.

L8 5,/4,/0.8 throG

Esta sentencia pertenece al sistema de gestin de e&cepciones de $&apta, que se descri"e en un cap tulo posterior. En estos momentos, nos "asta con sa"er que podemos utili!arla para presentar un mensa#e de error al usuario y a"ortar la e#ecucin del cdigo. (a sentencia thro" error muestra al usuario el mensa#e de error especificado en su argumentot3ro? error(LNo e6isten re;istrosL)!

"(.

In#ormacin de entrada
$dems de los formularios, "sicamente $&apta nos ofrece dos posi"ilidades para

solicitar informacin al usuario.

Damgaard Espaa, S.A.

Pgina 1&% de 127

.omunicacin con e) usuario

!.1.

L8 0?85, Ho>

Esta clase se utili!a para mostrar "re%es mensa#es modales al usuario, que consisten de "otones y unas pocas l neas de te&to. (os distintos m'todos de la clase nos permiten presentar distintos tipos de dilogo y corresponden a los diferentes %alores del enumerado de sistema D ialog3oxType.

T.32 :, D.E?2C2 Cnformacin $d%ertencia 8 >Ao 8top

*8?27 E/;6,78:2) C;8/:2 ;4.?.L87?2 N26>7, :,? 6@42:2 I/-2B2K F87/B2K Y,5N2B2K S423B2K El usuario de"e ser informado de algo, y de"e pulsar OO. El usuario de"e ser ad%ertido de algo, y de"e pulsar OO. 8e le presenta una eleccin al usuario y de"e pulsar S< o N2. (a aplicacin se detiene, posi"lemente porque algn error ha ocurrido, o algo serio %a a ocurrir, y el usuario de"e pulsar OO. 8e le presenta una eleccin al usuario y de"e pulsar S<, N2 o C8/0,?87. 8e le presenta una eleccin al usuario y de"e pulsar A0,3487 o C8/0,?87.

8 >Ao>,ancelar $ceptar>,ancelar

Y,5N2C8/0,?B2K OOC8/0,?B2K

(os m'todos descritos en la ta"la son m'todos estticos, por lo tanto, para presentar un mensa#e al usuario, simplemente de"eremos reali!ar una llamada al m'todo correspondiente del siguiente modo5o6GGTnombre mtodoH Bodos estos m'todos de%uel%en el "otn pulsado por el usuario. Este %alor es de tipo Dialog3 tton. Por otro lado, en la llamada al m'todo siempre de"emos especificar un "otn por defecto. (a clase 3ox se encuentra "a#o el nodo 2lases del $3B. En el nodo correspondiente a la clase encontraremos las declaraciones de cada uno de sus m'todos. EB,63?2% oid #pdate&ompan2Prompt() { #pdate&ompan2 ( (bo6GG2esno(LM>N>-0,P,L:^anan^: LM>N>-0,P-L:^an^:

Damgaard Espaa, S.A.

Pgina 11& de 127

.omunicacin con e) usuario LM>N>-0-E+L:^anan^: LM>N>-0,P0L1 Dialo;5#ttonGGNes1 LM>N>-0,PPL) (( Dialo;5#ttonGGNes)! $

!.2.

:a clase 3ox hace so de la clase de sistema Dialog3ox- !in embargo' n nca debemos tili$ar esta /ltima directamente-

L8 0?85, /ialog

(a clase Dialog nos permite presentar al usuario un tipo especial de formulario para que introdu!ca algunos %alores. B picamente se utili!a para o"tener del usuario determinados parmetros necesarios para la e#ecucin de un programa. Esta clase presenta al usuario una %entana estndar. Esta clase se utili!a cuando el dilogo no es muy comple#o. 8i se hace necesario un dilogo comple#o es aconse#a"le disear un nue%o formulario para este propsito. Cnternamente, la clase Dialog construye un formulario en tiempo de e#ecucin. (os m'todos ms comnmente utili!ados de la clase Dialog son)a :'todo add<ield

8e utili!a para aadir un campo al dilogo. ,omo resultado de%uel%e un o"#eto de la clase Dialog<ield. )" :'todo add7ro p 8e utili!a para aadir un grupo de campos al dilogo. )c :'todo r n

Este m'todo di"u#a el dilogo en la pantalla y permite al usuario que introdu!ca los %alores. 8i el usuario pulsa Aceptar el %alor de retorno ser tr e, y si pulsa 2ancelar el resultado ser #alse. De la clase Dialog<ield se utili!a el m'todo val e*, para asignar %alores al campo y recuperar el dato introducido por el usuario. EB,63?2%

Damgaard Espaa, S.A.

Pgina 111 de 127

.omunicacin con e) usuario

Este dilogo puede implementarse como sigue-

boolean m2Dialo;(str from&3eQ#eN#m(L+EEEL1 str n#mUf&3eQ#e(L)EEL) { Dialo; dialo; ( ne? Dialo;(LM>N>//-,EL)! Dialo;Rield Dialo;9cco#nt"d( dialo;*addRield(t2peid(5anA9cco#nt))! Dialo;Rield Dialo;Rrom&3eQ#eN#m( dialo;*addRield(t2peid(5anA&3eQ#e>tartN#m))1LM>N>,EO)L)! Dialo;Rield Dialo;N#mUf&3eQ#e( dialo;*addRield(t2peid(5anA&3eQ#eZt2)1LM>N>+,-POL)! Dialo;9cco#nt"d*%al#e(L,-0L)! Dialo;9cco#nt"d*9cti e(false)! Dialo;Rrom&3eQ#eN#m*%al#e(Rrom&3eQ#eN#m)! Dialo;N#mUf&3eQ#e*%al#e(N#mUf&3eQ#e)! if (dialo;*r#n()) { Rrom&3eQ#eN#m( Dialo;Rrom&3eQ#eN#m*%al#e()! N#mUf&3eQ#e ret#rn tr#e! $ ret#rn false! $ ( Dialo;N#mUf&3eQ#e*%al#e()!

Damgaard Espaa, S.A.

Pgina 112 de 127

2a c)ase 7un8ase

,a c"ase Run2ase
"1. Introduccin
(a clase ; n3ase es una de las clases de sistema ms importantes en Axapta. Aos permite la creacin de clases e#ecuta"les con apenas unas pocas l neas de cdigo. ,uando definimos una clase como hi#a de ; n3ase, automticamente estamos heredando toda su funcionalidad, lo que nos facilita mucho la creacin de dichos procesos e#ecuta"les. El funcionamiento "sico de esta clase es el siguiente*. 8e muestra un dilogo al usuario. :ediante la creacin de una instancia de la clase Dialog; n3ase. +. El usuario introduce una serie de %alores o parmetros. .. 8e anali!an los parmetros. 2. 8e e#ecuta el proceso a reali!ar por la clase. Este ser, por tanto, el comportamiento general de cualquier clase que herede de la clase ; n3ase, las particularidades de cada una de las clases las conseguiremos so"recargando m'todos.

"2.

)a clase 2unHase. Mtodos principales 8 su #uncin


Para conseguir que una clase e#ecuta"le se comporte como nosotros queremos, de"emos so"recargar los siguientes m'todos,a 2lassDeclaration En este m'todo definiremos la clase y de las %aria"le glo"ales que inter%ienen en la misma. EB,63?2 p#blic class m2R#n5ase e6tends R#n5ase { NoNes Dialo;Rield ! bD4R"N4*&#rrent%ersion(+) bLU&9LM9&RU*&#rrentList ans?er b4NDM9&RU $ ans?er! dialo;9ns?er!

Damgaard Espaa, S.A.

Pgina 11' de 127

2a c)ase 7un8ase En este m'todo, se define adems una macro que nos %a a ser%ir para almacenar los %alores que el usuario introduce en el cuadro de dilogo. De este modo, cada %e! que e#ecutemos la clase, aparecern en el cuadro unos %alores predeterminados, que sern los ltimos %alores que introdu#o el usuario. ,b Dialog En este m'todo creamos el dilogo que queremos que se muestre al usuario. (a llamada a este m'todo se reali!a automticamente desde el m'todo p rompt*,EB,63?2 UbFect dialo;() { Dialo;R#nbase ! dialo; ( ne? Dialo;R#nbase(LMM&P/-,L1 t3is)! dialo;&#stRormat ( dialo;*addRield(T2pe"d(&#stRormat))! dialo;&#stRormat* al#e(c#stRormat)! dialo;RileName ( dialo;*addRield(T2pe"d(RileName>a e))! dialo;RileName*looA#p5#tton(/)! dialo;RileName* al#e(fileName)! ret#rn dialo;! $ En este e#emplo, se crear a un cuadro de dilogo con dos controles, uno de tipo 2 st<ormat y otro de tipo <ile@ame!ave. ,c 7et<romDialog En este m'todo o"tendr amos los %alores que el usuario introduce en el cuadro de dilogo para asignarlos a las %aria"les glo"ales definidas en 2lassDeclaration. EB,63?2 pri ate boolean ;etRromDialo;() { ! fileName ( dialo;RileName* al#e()! c#stRormat ( dialo;&#stRormat* al#e()! ret#rn tr#e! $ En este m'todo tomar amos los %alores de los campos del cuadro de dilogo y lo asignar amos a las %aria"les. ,d Eack dialo;!

Damgaard Espaa, S.A.

Pgina 114 de 127

2a c)ase 7un8ase En este m'todo es donde se almacena la informacin del tra"a#o que estamos e#ecutando en ese momento, para su posterior utili!acin en sucesi%as e#ecuciones. EB,63?2 p#blic container pacA() { ret#rn [b&#rrent%ersion1 b&#rrentList]! $ ,e FnEack En este m'todo se proporciona al usuario la informacin guardada en la ltima e#ecucin, para utili!arla como %alores por defecto del cuadro de dilogo. EB,63?2 p#blic boolean #npacA(container pacAed&lass) { "nte;er ! ersion ( conpeeA(pacAed&lass1 +)! s?itc3 ( ersion) { case b&#rrent%ersion G [ ersion1 b&#rrentList] ( pacAed&lass! breaA! defa#lt G ret#rn false! $ ret#rn tr#e! $ ,# Description En este m'todo se reali!a una descripcin de la tarea que reali!a esta clase. Esto es un estndar, por lo que es aconse#a"le que en todas las clases que hereden de ; n3ase e&ista dicho m'todo. EB,63?2 static &lassDescription description() { ret#rn LMM&P/-,L! $ ersion!

Damgaard Espaa, S.A.

Pgina 11 de 127

2a c)ase 7un8ase 8e de"e poner el te&to de descripcin en una etiqueta. De esta forma nos aseguramos que dicha descripcin est' disponi"le en todos los lengua#es soportados por el sistema. ,g ; n Este m'todo es el ms importante dentro de la clase, ya que constituye el cuerpo principal, es decir, el tra"a#o o la tarea que %amos reali!ar. EB,63?2 oid r#n() { if (ans?er) << "nstr#cciones! else << "nstr#cciones! $ Donde e#ecutar amos unas instrucciones u otras en funcin de los %alores introducidos por el usuario en el cuadro de dilogo. ,h Main Este m'todo es el primero que se e#ecuta en cualquier clase e#ecuta"le, y desde 'l se llama a los dems m'todos. Es por tanto, el m'todo que controla la e#ecucin de la clase. 8e trata de un m'todo esttico que siempre presenta la estructura que se muestra en el e#emplo siguiente. EB,63?2 static { M2&lass ! m2&lass ( ne? M2&lass()! if (m2&lass*prompt()) m2&lass*r#n()! $ m2&lass! oid main(9r;s a)

"3.

)a clase 2unHaseHatch
(a clase ; n3ase3atch es una clase que hereda de la clase ; n3ase, cuya principal caracter stica, es que permite la creacin de procesos de e#ecucin por lotes (batch). Por lo tanto, utili!aremos la clase ; n3ase en aquellas tareas que no necesiten procesamiento por lotes y la clase ; n3ase3atch en aquellas tareas que si lo necesiten.

Damgaard Espaa, S.A.

Pgina 11! de 127

2a c)ase 7un8ase (a clase ; n3ase3atch es una clase utili!ada como "ase para la reali!acin de clases que lle%en consigo funcionalidad de alto ni%el. Este tipo de clases tiene normalmente una estrecha relacin con funciones de men y pueden ser acti%adas directamente por el usuario. 8i queremos crear una clase e#ecuta"le por lotes, de"emos crearla de forma que herede de ; n3ase3atch. (os m'todos que de"emos so"recargar en este tipo de clases son los mismos que en el caso de las clases ; n3ase, pero adems de"emos so"recargar el m'todo siguiente,a 2an7o3atch Este m'todo aade un "otn al cuadro de dilogo que permite la e#ecucin de la tarea a reali!ar mediante un proceso por lotes. (a codificacin del m'todo es muy sencilla, simplemente de"emos de%ol%er un %alor %erdadero si queremos permitir que el proceso pueda ser e#ecutado mediante un proceso batch. EB,63?2 protected boolean canJo5atc3() { ret#rn tr#e! $

"4.

)a clase 2unHase2eport
(a clase ; n3ase;eport es una clase que tam"i'n hereda de la clase ; n3ase, cuya principal caracter stica es que permite la creacin de informes personali!ados mediante cdigo. )tili!aremos esta clase cuando necesitemos un informe que presente al usuario un cuadro de dilogo espec fico para la introduccin de datos a dicho informe. Primero de"emos crear en el $r"ol de 3"#etos de la $plicacin ($3B), el diseo del informe. 8eguidamente, de"emos crear la clase ; n3ase;eport que se encargar de dotar de funcionalidad adicional a ese informe. (os m'todos que de"emos so"recargar en esta clase son los mismos que en el caso de las clases ; n3ase, pero adems de"emos so"recargar los m'todos siguientes,a InitEarmDe#a lt Este m'todo iniciali!a los parmetros del informe con %alores por defecto. De"emos so"recargarlo, solamente cuando queramos modificar dichos parmetros por defecto. 8i so"recargamos el m'todo, de"emos reali!ar la llamada al m'todo s per*,. ,omo e#emplo mostramos el m'todo InitEarmDe#a lt de la clase 2 stInvoice1ol me;eport. EB,63?2 oid initParmDefa#lt() { ! report52 ( 9cco#nt%9TN#mGG%9TN#m!

Damgaard Espaa, S.A.

Pgina 117 de 127

2a c)ase 7un8ase fromDate toDate min9mo#nt s#per ()! $ ,b :ast1al eElement@ame Este m'todo se utili!a para enla!ar el diseo del informe creado en el $r"ol de 3"#etos de la $plicacin con la clase ; n3ase;eport. ,omo e#emplo mostramos el m'todo :ast1al eElement@ame de la clase 2 stInvoice1ol me;eport. EB,63?2 pri ate ReportName last%al#e4lementName() { ret#rn report>tr(&#st"n oice%ol#me)! $ ( mAdate(+1 +1 2ear(s2stemdate;et()))! ( s2stemdate;et()! ( -EEEEE!

Damgaard Espaa, S.A.

Pgina 11$ de 127

"aps

Ma&s
"5. /e#inicin
En ocasiones podemos encontrar ta"las en la aplicacin que sean muy similares. Estas pueden tener %arias columnas que contengan el mismo tipo de informacin, pero cuyo nom"re sea diferente. Bam"i'n puede ser usual tener clases que procesen de igual forma datos de distintas ta"las. 8i utili!amos el mismo nom"re para las columnas, podemos reutili!ar el cdigo que procese los datos de distintas ta"las, pero hay que procurar mantener nom"res coherentes a las columnas para hacer la aplicacin ms fcil de mantener. :orph; posee una poderosa caracter stica llamada 683 que permite cu"rir estos dos requerimientos. )n 683 permite acceder a campos de distintas ta"las si los campos son de tipos similares, aunque tengan nom"res distintos. ,ada ta"la puede ser o"#eto de un 683. Aormalmente, si se tiene acceso a una ta"la desde distintos 6835, cada 683 accede a distintos su"grupos de campos de la ta"la. 8upongamos un map $ddress que puede ser utili!ado para acceder a dos ta"las,ompanyCnformation y ,ustomer$ddress. 8upongamos que las ta"las contienen campos similares a los siguientesC8632 C2638/AI/-27684.2/ Aame $ddress* C8632 C2638/AI/-27684.2/ $ddress+ aCP,ode ,/ C8632 C;5426,7A::7,55 ,ustomerAame $ddress ,/ C8632 C;5426,7A::7,55 $ddress* aCP,ode ,/ C8632 ,/ map A::7,55 Aame 8treet ,/ C8632 ,/ map A::7,55 ,ity Postal,ode

Para acceder a las ta"las ,ompanyCnformation y ,ustomer$ddress a tra%'s del 683 tenemos que utili!ar como nom"re del campo los definidos por el map.

"".

*reacin.
El proceso de creacin de un 683 es muy similar al de una ta"la. Desde el men conte&tual T8>?85 pulsamos el "otn N,G y M83.

Damgaard Espaa, S.A.

Pgina 11% de 127

"aps

.1.

C86325.

$l igual que en las ta"las, en los 6835 tenemos una nodo $.,?:5 desde el cual podemos aadir campos al 683, as como un nodo G72;3 para definir grupos de campos.

.2.

M833./C5 02/478 48>?85.

Para definir como redirigir los accesos de los campos al 683, pulsamos "otn derecho so"re el nodo M833./C5 y seleccionamos N,G M833./C. :orph; aadir una l nea de"a#o de dicho nodo %ac a. 8i pulsamos so"re las propiedades del nue%o o"#eto podemos seleccionar la ta"la para la cual %amos a definir el M833./C. (a siguiente ilustracin muestra un el map de direcciones (AddressMap) entre una serie de ta"las-

Para asociar los campos del 683 a los de la ta"la e&pandimos cualquiera de las ta"las. Bendremos una entrada por cada campo definido en el 683. $"rimos las propiedades de cualquiera de ellos y esta"lecemos la asociacin8i repetimos el proceso para cada una de las ta"las ya tenemos definido el 683.

.3.

M@42:25 ,/ 6835

En un 683 podemos encontrar los mismos m'todos que en las ta"las, y tam"i'n es posi"le definir m'todos nue%os. Para utili!ar estos m'todos ser necesario referenciar al 683, al igual que referenciamos a las ta"las, con la particularidad de que un 683 no contiene informacin. Para que el 683 contenga informacin, y por tanto tenga utilidad su uso, primero hay que asignarle la informacin de una ta"la que tenga definido un 6833./C en el 683. Es decir, de alguna forma, se tratar a de reali!ar una con%ersin de los datos de la ta"la al 6833./C (se reali!a con una simple asignacin entre %aria"les), y utili!ar al 683 para tra"a#ar con estos datos.

Damgaard Espaa, S.A.

Pgina 12& de 127

.ontenedores - sus 0unciones

Contenedores ( sus *unciones


"$. /e#inicin
;<< tiene un tipo de datos general llamado 02/4,/,:27 (container), que puede ser considerado como un %ector dinmico indefinido de tipos de datos primiti%os, contenedores y %ectores. (os contenedores pueden ser utili!ados para guardar una lista de elementos de diferentes tipos y son especialmente tiles para situaciones intermedias. (os contenedores son dinmicos y no tienen l mite. Pueden contener elementos de casi todos los tipos de datos- "ooleano, entero, real, fecha, cadena, contenedor, %ector, ta"las y tipos de datos e&tendidos. (as %aria"les de o"#etos y los campos de las ta"las pueden ser declarados como contenedores.

"%.

/eclaracin de Caria9les de tipo contenedor


(os contenedores se declaran utili!ando la pala"ra reser%ada 02/48./,7 seguida de la %aria"le que lo identifica. E#emplos de declaracin de containerscontainer c+! << declaracin de #n container container c/[]! << declaracin de #n ector de containers dinmico container c) ( [ +1 )*+,1 7a8]! << declaracin e iniciali=acin de #n container con ) elementosG #n entero1 #n real1 2 #na cadena*

"&.

1unciones ;ue utili?a un contenedor


En la siguiente ta"la se presentan algunas de las funciones que utili!an los contenedores. En el nodo < nciones de la Doc mentaci.n del sistema podemos encontrar ayuda acerca de estas funciones.

N26>7, C2/D,?( container, int, int)

D,507.30.1/ Eliminacin de un nmero espec fico de elementos de un contenedor. El primer entero especifica la posicin inicial a partir de la que se %an a eliminar elementos. El segundo indica el nmero de elementos a "orrar. De%uel%e un contenedor.

C2/$./: ( container, element, (ocali!a la primera ocurrencia del elemento pasado como S.) parmetro entre los elementos de un contenedor. De%uel%e 0 si no ha encontrado el elemento, o el nc de posicin que 'ste ocupa en el contenedor.

Damgaard Espaa, S.A.

Pgina 121 de 127

.ontenedores - sus 0unciones

C2/I/5 element)

(container,

int, Cnserta un elemento en un contenedor, en la posicin que le pasamos como parmetro. De%uel%e el nue%o contenedor. De%uel%e el nmero de elementos que tiene el contenedor. De%uel%e un contenedor %ac o. De%uel%e el elemento del contenedor que ocupa la posicin que le hemos pasado como parmetro. int, Oeempla!a el>los elemento>s del contenedor a partir de la posicin que se le pasa como parmetro. 8i deseamos reempla!ar %arios elementos los pondremos seguidos de comas. De%uel%e el contenedor con los elementos reempla!ados.

C2/L,/ ( container) C2/N;?? ( ) C2/P,,O (container, int) C2/P2O, element) (container,

Damgaard Espaa, S.A.

Pgina 122 de 127

Acceso a c)a4es de 0uncin desde e) cdigo

Acceso a c"a0es de *uncin desde e" cdi#o


El comportamiento de las cla%es de funcin, est regulado por la clase de sistema Dict<eat reHey. Por lo tanto, si queremos acceder a una cla%e de funcin desde cdigo, de"eremos crearnos una instancia de dicha clase. Para ello utili!aremos el constructor. EB,63?2 DictReat#re`e2 fA! ! fA ( ne? DictReat#re`e2(Reat#reAe2n#m(5UM%ersion))! En el nodo Doc mentaci.n de sistema del $3B encontraremos ms informacin acerca de esta clase. En este cap tulo %amos a descri"ir nicamente los m'todos ms utili!ados)a :'todo enabled*, Este m'todo nos permite compro"ar si la cla%e de funcin est acti%ada a ni%el de sistema. )" :'todo rights() Este m'todo nos permite a%eriguar si el usuario tiene ha"ilitada la cla%e de funcin. EB,63?2% if (fA*ri;3ts() (( 9ccessT2peGGNo9ccess) ]

Damgaard Espaa, S.A.

Pgina 12' de 127

9estin de e:cepciones

Gestin de e3ce&ciones
:orph; tiene construido un sistema de mane#o de e&cepciones. Esto permite LcapturarM errores durante la e#ecucin de un programa, y controlar el comportamiento del sistema ante ellos. Para utili!ar el mane#o de e&cepciones, se tienen que especificar las sentencias a controlar mediante el uso de 47A y 08409. Boda sentencia 47A tiene asociada al menos una sentencia 08409, donde las e&cepciones son capturadas. ,uando es lan!ada una e&cepcin dentro de una transaccin, la transaccin es automticamente a"ortada. Este comportamiento se aplica tanto a las e&cepciones definidas por el usuario como a las propias del sistema.

$(.

'entencia @tr8A B @catchA.


(a descripcin de esta sentencia es la siguienteTr2 { << >entencias* $ &atc3 (7e6cepcin a capt#rar8) { << >entencias a eFec#tar en caso de e6cepcin* $ *** << Utras sentencias de capt#ra de e6cepciones*

8e puede o"tener una descripcin ms amplia del cdigo en la $yuda en l nea de $&pata, en el :anual del Desarrollador de $&apta. Bam"i'n e&iste una sentencia 7,47A que puede incluirse en la seccin 08409. Esta sentencia %uel%e al principio de la seccin 47A. Esto puede ser til cuando alguna precondicin de"a ser cam"iada en la seccin 08409.

$1.

'entencia @4972G'
Bam"i'n es posi"le que nosotros lancemos e&cepciones en nuestro cdigo al detectar algn error en el proceso. Esto es posi"le a tra%'s de la sentencia 4972GT3ro? error (7MensaFe del error8)! 8e puede o"tener una descripcin ms amplia del cdigo en la $yuda en l nea de $&pata, en el :anual del Desarrollador de $&apta.

Damgaard Espaa, S.A.

Pgina 124 de 127

9estin de e:cepciones Esta sentencia puede incluirse en cualquier m'todo de la aplicacin, aunque es usual incluirlo en una seccin 47A, de manera que podamos controlar totalmente el comportamiento del sistema ante la e&cepcin producida. EjemploM tr2 { t3ro? e6ceptionGGerror! << statements $ catc3 (e6ceptionGGerror){ << React on t3e errorCe6ception $

(as e&cepciones definidas por el sistema %ienen recogidas en el enumerado ,K0,34.2/, y pueden serI/-2 F87/./C :uestra un mensa#e de informacin al usuario. Cndica que se ha producido una situacin e&cepcional. El usuario de"er lle%ar a ca"o alguna accin pero las consecuencias no son -848?,5. Cndica que e&iste un "loqueo en la "ase de datos de"ido a que di%ersas transacciones estn esperandose unas a otras. Aormalmente no requieren inter%encin por parte del usuario, y solo ser necesario reintentar la operacin. Cndica que ha ocurrido un error fatal y que la transaccin ha sido a"ortada. Cndica que el usuario ha pulsado UOE$[ o ,BO(<,. /a ocurrido un error en la clase DDEXdernel. (8e ha reci"ido una comunicacin de error de DDE desde el sistema operati%o).

D,8:?20O

E7727 B7,8O D:,,7727

Damgaard Espaa, S.A.

Pgina 12 de 127

Acceso a men; items desde cdigo

Acceso a 'en4 ite's desde e" cdi#o


Para e#ecutar un men item desde cdigo ;<<, tenemos que utili!ar la clase de sistema Men < nction. Esta clase de sistema representa el nodo :enuCtems del r"ol de o"#etos de la aplicacin. )n o"#eto Men < nction representa una interfa! de otro o"#eto de aplicacin $&apta. Este o"#eto proporciona un camino fcil para acceder y e#ecutar cualquier formulario, informe, tra"a#o, clase o consulta. Para hacer referencia a un o"#eto de la aplicacin utili!amos el o"#eto Men < nction. Para crear un o"#eto de este tipo, necesitaremos indicar como parmetros al constructor qu' tipo de menu item es (display, o tp t o action), y el nom"re del o"#eto (nom"re con el que aparece en el $3B (para esto ltimo es interesante utili!ar las clases del sistema que con%ierten nom"res de o"#etos a cadenas como se muestra en el e#emplo). Despu's se crea el o"#eto en cuestin a tra%'s del m'todo create del menu item, que nos de%ol%er el o"#eto, y lo podremos asignar a una %aria"le para mane#arlo. El m'todo create del menu item require que se le pase como parmetro un o"#eto args, que ser%ir para pasar los parmetros al o"#eto reci'n creado. :odificando los %alores de la %aria"le args antes de crear el o"#eto conseguiremos en%iar los parmetros que nos interesen al o"#eto reci'n creado. Por ltimo solo nos queda e#ecutar el o"#eto reci'n creado. E#emplo- )tili!acin de un o"#eto :enu6unction para crear y e#ecutar un informe. { Ta6Report%o#c3er ta6Report%o#c3er! Men#R#nction mf! ReportR#n Report! 9r;s 9 ( ne? 9r;s()! * * * * << >eleccin del re;istro ta6Report%o#c3er * * * * Nom%re del in"orme << &reacin de #n obFeto Men#R#nction mf ( ne? Men#R#nction(Report>tr(Ta6Reportin;)1 Men#"temT2peGGU#tp#t)! <<Ubtener los ar;#mentos Q#e le 9*caller(t3is)! 9*record(ta6Report%o#c3er)! Report ( mf*create(9)! Report*r#n()! $ Ti$o de menu item

amos a pasar al informe*

Damgaard Espaa, S.A.

Pgina 12! de 127

Indicacin de operaciones en e*ecucin

Indicacin de o&eraciones en e$ecucin


$2. In#ormacin de sistema ocupado.
,uando e#ecutamos un o"#eto, un relo# de arena o una "arra de progreso nos indican que la e#ecucin se est reali!ando. 8i sa"emos que la e#ecucin de nuestro proceso %a a tardar un tiempo, de"eremos informrselo al usuario. Para ello utili!aremos el m'todo start:engthyOperation' de la clase 7lobal. Este m'todo cam"iar el cursor de Windo=s al utili!ado para operaciones costosas (relo# de arena). El relo# de arena permanecer en la pantalla hasta que el sistema detecte que el usuario puede reali!ar operaciones o se haga una llamada e&pl cita al m'todo end:engthyOperation de la clase 7lobal.

$3.

In#ormacin del progreso de una operacin.


8i durante la e#ecucin de un proceso queremos mostrar una "arra de progreso, dentro de cualquier m'todo nos creamos una instancia de la clase sysOperationErogress, pasndole el nmero de "arras que queremos que nos muestre. Esta "arra de progreso la podemos personali!ar utili!ando los m'todos que tiene esta clase. Por e#emplo, si al cuadro de dilogo que muestra cuando creamos la "arra de progreso queremos pasarle un t tulo utili!aremos el m'todo caption de dicha clase. 8i queremos aadirle una animacin al cuadro de dilogo, utili!aremos el m'todo setAnimation pasndole como parmetro la ruta de acceso donde %amos a encontrar la animacin. $&apta dispone de un nmero de animaciones estndar para utili!ar en estas propiedades codificadas a tra%'s de macros. Para indicar cual %a a ser el total de cuenta de cada "arra se utili!a en m'todo setTotal, al que se le pasa como primer parmetro el total de incrementos de la "arra, y el segundo a qu' "arra de progreso nos referimos. Este segundo parmetro por defecto %ale *, con lo que si solo tenemos una "arra no ser necesario este segundo parmetro. Bam"i'n le podemos indicar en cuanto de"e incrementar la "arra cada %e!, para ello utili!aremos el m'todo inc2o nt, este m'todo tiene como %alores por defecto *, as que si slo tenemos una "arra de progreso, y queremos que cada %e! incremente en *, tan slo haremos una llamada al m'todo sin pasarle ningn parmetro. $ continuacin se presenta un e#emplo de creacin de una "arra de progreso{ * * * pro;ress ( ne? >2sUperationPro;ress(/)! pro;ress*set&aption(LM>N>/0E-0L)! pro;ress*setTotal(totalTables:+1 +)! pro;ress*set9nimation(b9 iRile&op2)! * * *$

Damgaard Espaa, S.A.

Pgina 127 de 127

Vous aimerez peut-être aussi