Vous êtes sur la page 1sur 12

La siguiente es una gran ventaja de definir frmulas: Cuando definimos una frmula, GeneXus puede combinar la consulta en la cual

la frmula est presente el clculo asociado a la frmula y as generar sentencias optimizadas.

Como se explica en esta diapositiva, los atributos definidos como frmula global, no se crean como campos fsicos en tablas, por lo cual decimos que son atributos virtuales. Sin embargo, decimos que tienen una tabla asociada o tabla base, para conocer el contexto en el cual se han definido, y contar con ese contexto al momento de disparar el clculo correspondiente donde sea que se referencien.

En el ejemplo, al definir que el atributo CustomerBalance es frmula, el mismo dejar de existir como campo fsico de la tabla CUSTOMER. Diremos a partir de ese momento CustomerBalance es un atributo virtual y que su tabla base o asociada ser CUSTOMER, ya que de almacenarse dicho atributo nuevamente (ya sea por definir el analista que deja de ser frmula o que es frmula redundante) se creara como atributo fsico en la tabla CUSTOMER. El tipo de clculo de esta frmula definida es horizontal, ya que consiste en una expresin aritmtica. En la definicin de un atributo como frmula horizontal, es posible involucrar atributos pertenecientes a la tabla asociada al atributo que se est definiendo frmula y a su tabla extendida. Por lo tanto los atributos que se pueden referenciar en la definicin de esta frmula son los pertenecientes a la tabla CUSTOMER (tanto almacenados como frmulas) y su tabla extendida.

En este ejemplo el atributo InvoiceDetailAmount ha sido definido como frmula global tambin. Es decir, utilizando el editor de frmulas, se ha asociado un clculo a este atributo y el mismo pasar a ser un atributo virtual. La tabla asociada al atributo InvoiceDetailAmount ser INVOICEDETAIL, ya que de almacenarse dicho atributo nuevamente, se creara en dicha tabla fsica. Como podemos observar la frmula definida cae en la clasificacin de horizontal, ya que consiste en 2 expresiones aritmticas condicionales. Los atributos involucrados en la definicin de la frmula pertenecen o bien a la tabla INVOICEDETAIL o bien a su tabla extendida.

En el ejemplo los atributos InvoiceDetails e InvoiceAmount han sido definidos como frmulas globales, ya que utilizando el editor de frmulas se ha definido una frmula para cada uno de estos atributos (pasando ambos a ser atributos virtuales). Dado que las frmulas definidas son Count y Sum respectivamente, en ambos casos se trata de frmulas Aggregate. La tabla asociada a ambos atributos frmula es INVOICE, ya que de almacenarse estos atributos, se crearan en dicha tabla fsica. Las frmulas Aggregate no solo tienen una tabla base asociada (como todas las formulas), sino que tambin involucran una tabla a ser navegada. Si bien resulta intuitivo, la tabla a ser navegada en una frmula Aggregate, es la tabla que se navegar para realizar el clculo. GeneXus interpretar cul es la tabla a ser navegada por una frmula Aggregate, por los atributos involucrados en la definicin de la frmula. En nuestro ejemplo, la tabla a ser navegada en ambas frmulas Aggregate es INVOICEDETAIL, ya que tanto en la definicin de Sum como Count, hemos referenciado a un nico atributo asociado a INVOICEDETAIL. Cuando definimos una frmula Aggregate, ya tenemos conocimiento de qu tabla pretendemos navegar para efectuar el clculo. Los atibutos que podremos referenciar en la definicin de una frmula Aggregate debern pertenecer a la tabla a ser navegada y su tabla extendida + a la tabla asociada al atributo que se est definiendo como frmula y su tabla extendida. De involucrar en una frmula Aggregate atributos que no pertenezcan a este contexto mencionado, un error se reportar en el listado de navegacin correspondiente.

Por ltimo, de haber atributos en comn (de igual nombre) en las tablas involucradas en la definicin de una frmula, GeneXus aplicar esa relacin (es decir, filtrar automaticamente por igualdad por los atributos de igual nombre). Esto es lo que sucede en estos 2 ejemplos, que GeneXus cuenta y suma las lneas relacionadas a sus cabezales (al sumar y contar, aplica automticamente el filtro INVOICEDETAIL.InvoiceId = INVOICE.InvoiceId ).

Sintaxis completa de Sum, Count, Average: Sum | Count | Average( Expresin, [Condicin Explcita, Valor por Defecto]) [if Condicin Disparo]; En los 2 ejemplos de frmulas Sum y Count que hemos visto, solamente hemos definido el parmetro obligatorio, es decir la expresin a ser sumada o contada (que en un caso consisti en un atributo almacenado y en otro caso en un atributo frmula). Tambin dicha expresin podra haber involucrado constantes y/o funciones. Vimos que GeneXus determina condiciones de filtro implcitas al realizar la suma, cuenta o promedio. Tambin podramos haber definido condiciones de filtro explcitas y en caso de haberlas, GeneXus tendr en cuenta a ambas: implcitas + explcitas. A su vez opcionalmente es posible definir un valor por defecto a ser retornado cuando no se encuentran registros para contar, sumar o promediar. Al igual que todas las frmulas, estas tambin permiten incluir condicin de disparo. Por ltimo, vale mencionar una excepcin y es que en particular en las frmulas Count, el primer parmetro debe corresponder a un atributo y no a una expresin. Puede referenciarse cualquier atributo de la tabla en la cual se quieran contar registros (que cumplan con condiciones explcitas y/o implcitas).

Hemos modificado el diseo de las transacciones para representar que cada producto tiene una lista de precios, de acuerdo a la fecha de cambio de los mismos. Por efectuar este cambio, el atributo ProductPriceListPrice no podr estar presente en el segundo nivel de la transaccin Invoice. Por qu? Porque el nuevo diseo representa que un producto ya no tiene solamente un precio, sino muchos: uno por cada fecha de cambio de precio del mismo. Por lo tanto, para un producto en una lnea de una factura, tendremos que buscar el precio vigente del mismo, teniendo en cuenta la fecha de la factura. Recordemos que los atributos que se pueden inferir en determinado nivel de una transaccin, son los que pertenecen a la tabla extendida de la tabla fsica asociada al nivel en cuestin. En este ejemplo, la tabla extendida de la tabla INVOICEDETAIL, no incluye a la tabla PRODUCTPRICELIST (en la cual se encuentra el atributo ProductPriceListPrice):

por lo tanto en el nivel Detail de la transaccin Invoice (asociado a la tabla INVOICEDETAIL) no es posible inferir al atributo ProductPriceListPrice.

73

Qu ocurre si dejamos al atributo ProductPriceListPrice en el nivel Detail de la transaccin Invoice? Como no se podr inferir, entonces GeneXus no tendr otra opcin que determinar almacenarlo en la tabla INVOICEDETAIL pese a que ya estar este atributo secundario en otra tabla (PRODUCTPRICELIST). Como el resultado de esto es un modelo de datos inadecuado, se reportar el error al querer reorganizar la base de datos. Y cmo hacemos para desplegar en cada lnea de la factura, el precio vigente del producto de la misma? De todos los precios correspondientes al producto de una lnea, cul queremos recuperar? De todos los precios que tengan fecha menor o igual a la fecha de la factura, queremos aquel que tenga fecha mayor. Procedemos entonces a crear en el nivel Detail de la transaccin Invoice, un nuevo atributo de nombre InvoiceDetailProductPrice, al que definiremos como frmula global y por lo tanto ser un atributo virtual. Le asociaremos a dicho atributo la frmula Max:

Condiciones que deben cumplir los registros para ser considerados

Valor de retorno si no se encuentra ningn registro que cumpla con las condiciones

Max(ProductPriceListDate, ProductPriceListDate<= InvoiceDate, 0, ProductPriceListPrice)

Atributo a maximizar de Para el registro entre los registros que encontrado, se retorna cumplan las condiciones este atributo GeneXus entender cul tabla navegar por el ltimo parmetro de la frmula (el atributo de retorno). Los atibutos que podemos referenciar en la definicin de una frmula Aggregate debern pertenecer a la tabla a ser navegada y su tabla extendida + a la tabla asociada al atributo que se est definiendo como frmula y su tabla extendida. De involucrar atributos que no pertenezcan a este contexto mencionado, un error se reportar en el listado de navegacin correspondiente. GeneXus considerar al momento de efectuar la bsqueda, la condicin explcita de filtro + las condiciones mplicitas detactadas. La frmula Min es totalmente anloga a Max, con la nica diferencia de que al encontrar un conjunto de registros que cumplan con las condiciones, se seleccionar aquel registro que tenga valor mnimo para el atributo indicado en el primer parmetro y se retornar el valor de retorno que se haya indicado en el ltimo parmetro. La frmula Find por su parte, tambin permite buscar un registro que cumpla con ciertas condiciones, sin embargo de haber ms de 1 registro que cumpla con ellas, la frmula devolver el atributo de retorno correspondiente al primer registro encontrado (sin maximizar ni minimizar un valor en el conjunto de registros que cumplan con las condiciones). La sintaxis Find es:

Find (Expresin de retorno, [Condicin explcita], [Valor por defecto]) [if Condicin de disparo] Observar que la expresin de retorno en este caso se escribe en el primer parmetro de la frmula.

74

Aqu se muestra un ejemplo de frmula compuesta.

75

Vous aimerez peut-être aussi