Mostrando entradas con la etiqueta bindings. Mostrar todas las entradas
Mostrando entradas con la etiqueta bindings. Mostrar todas las entradas

miércoles, 17 de septiembre de 2014

Obtener un valor de la tabla en un bean 11g

Descripción: En este artículo veremos cómo obtener un valor de una fila (row) de una tabla (aftable) a través de un bean. Tomaremos el valor de un atributo (attribute) y lo mostraremos en pantalla.

Nota: Puedes Descargar el ejemplo para que puedas hacer pruebas.

En este ejemplo veremos cómo mostrar un valor de una fila seleccionada en un aftable.

En primer lugar tenemos que haber creado la tabla en nuestra página.
En el ejemplo arrastraremos una view a la página de diseño (design) y se cree la tabla que muestre los datos.

vista diseño aftable
vista diseño aftable



Podemos mirar en la Page Data Binding Definition (lo que en 10g se llamaba Página de definición), cómo es la estructura de datos que se carga en la página y que contiene la tabla.

vista Page data binding definition
vista page Data Binding Definition
vista codigo Page Data Binding Definition
vista código de Page Data Binding Definition


 
Nota: La utilidad de esta información es que si en algún momento no sabemos cómo se llaman los atributos (campos) de una tabla, podamos ir a consultarlo.
Esto a veces es necesario cuando los datos no se muestran correctamente, y pueden tener como origen, en que no se ha incluido los atributos necesarios.



Tomar el valor del Page Data Binding Definition en un bean


El siguiente código devuelve el valor que se encuentra en un binding.

método para recoger un valor del binding

Vamos a explicar el código parte por parte:


        BindingContext bindingContext = BindingContext.getCurrent();
        BindingContainer bindings = bindingContext.getCurrentBindingsEntry();



En esta parte del código estamos haciendo referencia al binding vigente en este momento.
Es decir, de la página actual que se esté mostrando.
Si este código se utiliza en otras páginas será el page data definition correspondiente.


DCIteratorBinding iteratorBinding = (DCIteratorBinding) bindings.get("DepartmentsViewIterator");


Se recoge con esta instrucción el iterator que se encuentra en el binding. Este iteratorBinding, corresponde con el iterator que vimos en la página de definición.
Se recoge este iteratorBinding pues es el que gobierna el aftable, y el que nos va a indicar qué dato se encuentra seleccionado en ese momento.


        if (iteratorBinding != null)
        {
            Row currentRow = iteratorBinding.getCurrentRow();
            if (currentRow != null)
            {
                resultado = (String) currentRow.getAttribute("DepartmentName");   
            }
        }

Primero se pregunta si el itertorBinding es null.
Es importante esto porque puede que el valor que contiene la variable iteratorBinding lo sea.
Algunas de las causas por las que puede ser null:
- Que se haya escrito mal el nombre del iterator.

- Que en el momento en que se llama al iterator, éste no exista.



Es muy típico encontrarse con un nullPointerException por estas causas, por lo que se recomienda hacer siempre esta comprobación.

Una vez comprobado esto con el if , lo que se hace es obtener la fila actual. 
Para ello recurrimos al método getCurrentRow().

Otra vez, volvemos s hacer la consulta de si el valor obtenido con el getCurrentRow() es null o no.
Puede ser que no hubiera ningún elemento seleccionado.


 resultado = (String) currentRow.getAttribute("DepartmentName");   

Con esta estructura, tomamos el valor (attribute), de la fila (row) actual y que hemos guardado en currentRow.

Con esto ya tendremos en el bean el valor, y podemos utilizarlo como queramos.
En este ejemplo, lo que se hizo fue mostrar en pantalla dicho valor, y para ello, se creó un método get, con el fin de poner el valor dentro de un outputText.





Al ejecutar el ejemplo, se nos muestra la tabla con los distintos campos (attributes), y al seleccionar una fila, y luego, pulsar el botón "Actualizar", aparece al lado de éste el nombre del Departamento seleccionado.

Puedes descargar el ejemplo en este enlace: Descargar Ejemplo obtener Valor tabla
La página del ejemplo es vistaDepartamentos.jspx.

Artículos relacionados:
- Crear una tabla de Datos con aftable en 11g

sábado, 16 de agosto de 2014

Pasar un valor del binding al bean

Descripción: En este artículo veremos cómo pasar un valor del binding hacia el bean.

Este tipo de operaciones se suelen utilizar para recoger un valor que se encuentra en el binding, por ejemplo un campo cuyo atribute value esté asignado al binding, así como otros componentes. Habitualmente, este valor se suele encontrar en el binding como atributeValue.

Para ello hacemos lo siguiente:

FacesContext fc = FacesContext.getCurrentInstance();
ValueBinding expr;
expr = fc.getApplication().createValueBinding("#{bindings.NombreCampo.inputValue}");
if (expr != null)
        variable =  expr.getValue(fc);


Como podemos observar la estructura es muy similar a la vista en el artículo pasar un valor del bean al binding.

Debemos tener en cuenta el tipo de la variable donde vamos a guardar el valor que estamos recogiendo. No nos va a llegar con el mismo tipo con el que está definido en el viewObject, sino que muy probablemente tendremos que hacer un cast para convertir al tipo de datos que nos interesa. 

En el caso de que no se recoja el valor del binding, habría que comprobar que hemos escrito correctamente la variable, o bien si el valor se encuentra definido como AtributeValue o con otra estructura que permita recoger el valor.

Artículos relacionados:
- Acceder a otro bean desde un bean
- Pasar valores de un bean a un binding
- Pasar un valor de un bean al procesScope

Pasar valores de un bean a un binding

Descripción: En este artículo veremos cómo pasar un valor de un bean al binding en oracle ADF 10g. 

Es bastante común encontrarse que no todo puede conseguirse con un formulario y un commit, sino que es necesario hacer operaciones en un bean antes de guardarlo.

Para pasar ese resultado de nuestras operaciones al binding, para que pueda luego ser guardado con el commit del Application Module haremos lo siguiente:

FacesContext fc = FacesContext.getCurrentInstance();
ValueBinding expr;
expr = fc.getApplication().createValueBinding("#{bindings.NombreCampo.inputValue}");
if (expr != null)
        expr.setValue(fc, valor);

La condición expr != null, viene de que podemos encontrarnos con que el valor no esté definido, o que en el momento de consultarse el bean, el binding de la página actual todavía no existe.
Esto ocurre cuando estamo llamando desde un método del bean, en un momento en el cual todavía no se ha terminado de construir la página.

Errores comunes

También debemos tener en cuenta que el nombreCampo donde queremos poner el valor en el binding, debe existir en la página de definición de la página que estamos trabajando en ese momento. Normalmente, será un elemento de tipo atributeValue, aunque puede haber otros tipos.

Puede darse el caso de que estemos reutilizando un método en un bean, que ha sido escrito pensando en una página, y ahora la estemos utilizando en otra que no contiene el mismo campo en el binding. Esto puede hacer que expr = null.

Artículos relacionados:
-
-

lunes, 4 de agosto de 2014

Mostrar el valor seleccionado en un aftable

Descripción: En este artículo veremos cómo tomar el valor seleccionado en una tabla (aftable) y mostrarlo en pantalla. Para ello usaremos bindings.

Partimos de una página donde hay un buscador, y un aftable que muestra los resultados de la búsqueda.





Para mostrar el elemento seleccionado utilizaremos un OutputText.

incluir outputText para mostrar valor seleccionado
incluir outputText para mostrar valor seleccionado


Pero claro para poder mostrar el valor seleccionado en una tabla, no podemos tomar el valor directamente de ésta, sino a través del binding.
Para ello, debemos ir a la página de definición y crear un atributeValue.

crear attributeValue en pagina definicion
se crea un attributeValue




Dentro del bloque bindings, se selecciona con el botón derecho y en el menú contextual seleccionamos Insert inside bindings, y luego atributeValues.

Al hacerlo se nos muestra la siguiente ventana.

attribute binding editor
attribute binding editor



Seleccionamos el campo que queremos mostrar. En este caso el apellido (LastName).

En el outputText, solo tenemos que indicar que en el atribute Value, vamos a tomar el valor del binding.
#{bindings.LastName}

Lo podemos hacer pulsando la opción "bind to data" que está justo encima, y que nos abrirá un cuadro para crear la expresión del lenguaje que irá.

asistente expresiones para tomar el valor del binding
asistente Expresiones


Nota: Es posible que en la parte izquierda no aparezca el valor que hemos creado con el atributeValue. En ese caso puedes probar a guardarlo todo, comprobar que se ha creado el atributeValue correctamente. Si está creado y no aparece en el cuadro, bastará con cerrar la página y volverla a abrir.

Podemos añadir, si queremos, un texto que acompañe al valor que seleccionamos.

atributo value
añadimos un texto en el atributo Value



Ya podemos ejecutar la página y ver el resultado:



vista resultado



Como comprobamos, podemos seleccionar varios elementos, y no cambiar el texto inferior. Sólo cuando se pulsa el botón "Seleccionar", se produce el refresco de la pantalla, y en ese momento, también se refresca con el valor que ha pasado al binding.

En el próximo artículo veremos cómo refrescar el valor, sin necesidad de estar pulsando el botón seleccionar, a través del atributo autosubmit, partialsubmit y con el atributo Partialtriggers.


Artículos relacionados:
- Añadir una tabla (listado)
- Mostrar todos los elementos de una tabla (aftable)
- Refrescar componente con PartialSubmit y PartialTriggers 

martes, 18 de marzo de 2014

ADF Bindings 3/3

Resumen: En esta entrada se mostrará la estructura y el papel que tiene ADF Bindings dentro de la arquitectura ADF.

Para terminar con esta introducción a ADF Bindings, podemos ir a la documentación oficial de ADF, para ver lo que nos dice.

Nota: Se podría haber empezado por aquí, pero he preferido ver los ADF Bindings
en acción en vez de presentarlo como algo abstracto.

Como habíamos visto en otro post dedicado a la arquitectura de ADF, ésta se separa en distintas áreas: Vista Modelo y Controlador (view, model y controller, MVC).

arquitectura ADF
Arquitectura de ADF


Como hemos visto en el ejemplo de estos artículos dedicados a ADF Bindings (artículo 1, artículo), los Bindings gestionan la información que muestra la página, y por lo tanto, estaría colocado dentro de la capa : Model (si seguimos el modelo MVC).
En la imagen que tenemos, ADF Bindings se encontraría dentro de la capa ADF Model.

En el artículo del manual de referencia de 10g (en el de 11g también hay un texto similar encontramos lo siguiente) declarative Data Binding with Oracle ADF Model Layer donde se habla de dos mecanismos data controls y declarative bindings:

Data controls abstract the implementation technology of a business service by using standard metadata interfaces to describe the service’s operations and data collections, including information about the properties, methods, and types involved. At design time, visual tools like JDeveloper can leverage the standard service metadata to simplify binding UI components to any datacontrol operation or data collection.

Si miramos a nuestro DataControl Palette, y vemos lo que nos ofrece, podemos ver con claridad, que nos está proporcionando una forma de acceder a los datos, propiedades, métodos, de elementos que fueron creados ( ADF Business Components, en el esquema anterior de la arquitectura ADF).


Al arrastrar un elemento del Data Control Palette, se nos mostraba un menú contextual en el que se nos solicitaba la forma en que se iba a mostrar los datos.
Esta “forma de mostrar” los datos, es lo que se refiere con UI Components (User Interface Components), y por lo tanto, a la parte visual de la página.

incluir componente desde datacontrol palette
añadiendo un componente desde DataControlPalette

En este mismo artículo se habla de sus ventajas:

- Escribir menos código
- Trabajar de la misma manera que cualquier otro elemento de UI o de Business service (homongeneidad)
- Disponer de características que sería difíciles de obtener si las tuviéramos que codificar.

Estas características las hemos visto en los ejemplos que hemos utilizado en este blog, por lo que nos suena todo ello.

La otra parte que se refiere dicho artículo es a lo que estábamos hablando comúnmente como Bindings,

Declarative bindings abstract the details of accessing data from data collections in a
data control and of invoking its operations.

Es decir, que nos permite manejar colecciones de datos de un data control, e invocar sus operaciones.

vista pagina definicion
página de Definición

Existen tres tipos de objetos que manejan esta parte:
Iterator bindings to bind to an iterator that tracks the current row in a data
collection
Value bindings to connect UI components to attributes in a data collection
Action bindings to invoke custom or built-it operations on a data control or its
data collections
De estos tres tipos de objetos, en el ejemplo podemos ver dos de ellos, el iterator (iterador), y el Action (acción, método, función).

Veremos más adelante cada uno de estos tres elementos, su papel y cómo funcionan con ejemplos prácticos.

La idea de este post es:
- Tener una imagen clara de dónde está el ADF Bindings en la arquitectura ADF
- Saber lo que nos permite hacer y no hacer
- Familiarizarse con algunos términos para que cuando vayamos a leer otros blogs o bibliografía podamos entenderlo con cierta claridad.

Otros artículos relacionados:
- ADF Bindings 2/3
- ADF Bindings (1/3)
- Arquitectura ADF

viernes, 14 de marzo de 2014

ADF Bindings 2/3

Descripción: Este post es continuación del anterior en el que hacíamos una introducción a los ADF Bindings.
En esta ocasión vamos a responder a la pregunta: ¿De dónde salen los objetos del bindings?

Si miramos en nuestro ejemplo, hemos visto que al arrastrar una tabla desde el DataControl Palette a la página, se creaba tanto la tabla, como su contraparte en la página de definición.

View en el DataControl Palette
View en el DataControl Palette



tabla en la pagina definicion
tabla en la página de definición.




Lo mismo ocurre con el commit que arrastramos desde el apartado Operations dentro de PlantillaAppModuleDataControl.

Como podemos observar, tanto las operaciones (action), como la tabla (table), como otros elementos que se encuentran en la página de definición, provienen del Appmodule,y por lo tanto de la capa de datos.
Por eso se dice que los Bindings está relacionado con la parte del Modelo (model).

Ahora bien, como vimos en el post anterior, no todo está definido de forma explícita, es decir, que se ha tenido que hacer arrastrando elementos o escribiéndolos a mano, sino que existen acciones o propiedades de estos objetos que existen implícitamente, y por lo tanto, puede ser útil conocerlos por encima para ver lo que nos ofrece.

Vamos ver un poquito lo que nos ofrece el ADF, y así vamos conociendo ciertas interioridades.

Seleccionemos el botón que dice “Commit”, y vayamos al inspector de propiedades (property inspector).
Pulsamos dos veces para que se nos abra la pestaña a pantalla completa y observemos.

propiedades boton commit
propiedades del bottón Commit


Miremos en la propiedad “Disabled”, y vayamos a la parte derecha, haciendo click sobre la expresión que se encuentra ahí.
Nota: Este tipo de expresión se llama Expresión del lenguaje (Expression Language), y ya lo veremos más adelante. Lo adelanto sólo para abrir boca :-)

Si nos fijamos nos aparece un boton con unos puntos suspensivos, pulsemos ese botón.
expression builder
expression builder



Este cuadro es una especie de asistente (Expression builder) que nos muestra datos o propiedades que se encuentran en objetos de la aplicación, y que nos puede ayudar a buscarla y escribirla de forma correcta.
En este proyecto de pocas páginas, no es difícil saber dónde está cada cosa, o cómo se llama una variable, pero cuando el proyecto empieza a crecer, puede ser útil contar con una herramienta así.

Despleguemos el apartado que dice “ADF Bindings”
expresión resultante
expresión resultante


Bueno ahí esta nuestra propiedad “enabled” que nos puso el Jdeveloper cuando arrastramos la operación “Commit”.
También podemos ver otras propiedades, tanto para el Commit, como para EmpleadosView o del EmpleadosViewIterator.
Son propiedades que están disponibles para ser utilizadas si es necesario.
Ya iremos viendo algunas de éstas a medida que vayamos avanzando.
También me gustaría que se quedara con la idea de que en Bindings están los objetos que hemos utilizado en la página, y no otros que pueden existir en la aplicación pero que no hemos utilizado.

Seguiremos ahondando sobre el ADF Bindings en el siguiente post.

Puedes estar al tanto de las novedades en twitter @ADFSalvaje.

Otros artículos relacionados:
-
- ADF Bindings 3/3
-

 

ADF Bindings (1/3)

Descripción: En esta serie de artículos vamos a ver lo que son los ADF Bindings, y su papel en ADF como parte de la capa del Modelo (Model).
Nos apoyaremos para su estudio en el ejemplo que hemos visto en el artículo anterior por lo que puedes descargarte el fichero zip que contiene el ejemplo para verlo mejor con el JDeveloper.

Descarga del ejemplo Descargar

ADF Bindings o como se suele decir muchas veces “bindings”, es la parte de la página que va a contener los datos que vamos a mostrar en la página.
Esta definición, es un poco simple, pero nos servirá para ir aproximándonos a este aspecto tan importante en ADF.

Como hemos visto la página tiene una parte de vista(visual), que es el fichero jspx que los ejemplos que hemos visto.
Aparte de lo visual, también incluiremos datos. Estos datos los hemos arrastrado desde el DataControl Palette hasta nuestra página, para crear una tabla, un listado, poner un botón, etc.
Cada vez que hemos hecho esto, hemos visto que se ha añadido algo a la página de definición (pagedef).

Pues bien, esta página de definición se puede decir que es eso que llamamos "bindings". Es decir, que se puede ver como un receptáculo para los datos que contiene la página o que va a mostrar la página, así como las acciones y variables.

¿Todo se encuentra en la página de definición?
La respuesta es NO.

Vayamos al botón Commit de nuestro ejemplo y observemos sus propiedades:

commandbutton property inspector
commandbutton property inspector




Si observamos la propiedad “disabled”, nos encontraremos con la expresión
#{bindings.Commit.enabled}

Este valor, no se encuentra en nuestra página de definición. Entonces ¿dónde se encuentra?

Son propiedades que ya vienen dentro del objeto (built-in) por lo que podemos usarlos sin tener que declararlos.



Lo que se ha visto en este primer artículo es sólo un primer paso, y es necesario seguir los siguientes artículos para tener una imagen más completa.

Artículos relacionados:
- ADF Bindings 2/3
- ADF Bindings 3/3