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

lunes, 28 de julio de 2014

Error JBO-30003: Fallo del pool de aplicaciones

Descripción: En este artículo vamos a ver cómo resolver un error con el código JBO-30003, así como algunas de sus causas.
En inglés el error aparece como jbo-30003 the application pool failed to checkout an application module

Si se nos presenta un error con un código similar al siguiente:

JBO-30003: Fallo del pool de aplicaciones (model.PlantillaAppModuleLocal) al bloquear un módulo de aplicación debido a la siguiente excepción: oracle.jbo.JboException: JBO-29000: JBO-29000: JBO-29000: JBO-26061: Error al abrir la conexión JDBC. at  oracle.jbo.common.ampool.ApplicationPoolImpl.doCheckout(ApplicationPoolImpl.java:2002)

vista mensaje error
vista mensaje de error




Una de las causas de este error se encuentr en que la aplicación no puede acceder a la base de datos.

Entre las posibles causas se encuentran:

- Datos de conexión (cadena de conexión) incorrectos.

- La base de datos no está funcionando.

- Desconexión entre el lugar donde se encuentra la aplicación, y la base de datos (fallo de la red, puertos cerrados, etc).

Si el problema nos ocurre ejecutando la aplicación desde el JDeveloper podemos comprobar si la conexión que tenemos definida funciona o no, y qué mensaje de error nos muestra.




gestor de conexiones
gestor conexiones (connections navigator)



mensaje error conexión
mensaje error de conexión


Basta con comprobar si la base de datos está en funcionamiento (hablar con el administrador), así como que hay acceso hacia la base de datos.

Documento de Interés
Para más información sobre errores JBO y cómo resolverlos existen unos listados con los mensajes de errores, con sus causas y soluciones.




Puedes seguir el blog por Blogger Twitter

miércoles, 9 de abril de 2014

Operadores de Expression Language

Resumen: En este post veremos un ejemplo en el que algunos operadores (expression language operators) no podremos utilizarlos pues produce errores. Veremos las alternativas que existen, y un cuadro resumen de operadores que se utilizan.

Puedes descargar el ejemplo en el siguiente enlace:

En el ejemplo anterior, pudimos ver cómo se podía poner una condición con Expression Language, de manera que nos ponia un texto u otro dependiendo de un valor:

#{row.Salary.value > 5000?'Alto':'Bajo'}

Supongamos que queramos que la condición fuera al revés:

#{row.Salary.value < 5000?'Alto':'Bajo'}

error expression language fuente
error código fuente


Este marcado en rojo en el texto, nos indica que hay un error sintáctico, también las marcas en la parte derecha en rojo, nos indica las líneas afectadas.

¿Cuál es la causa de este error?
Pues que el símbolo "<" se utiliza como comienzo de etiqueta en xml, y por lo tanto, el analizador sintáctico detecta que lo que viene a continuación de dicho símbolo no es un nombre de etiqueta (tag).

Para resolverlo se utiliza otro operador equivalente. En este caso es el operador gt (greater than).

Nuestro código quedaría:

#{row.Salary.value gt 5000?'Alto':'Bajo'}

o bien

#{row.Salary.value > 5000?'Alto':'Bajo'}

resultados ejecucion
resultados ejecución

Como nota de referencia incluyo un listado de operadores:
Fuente

  • Arithmetic: +, - (binary), *, / and div, % and mod, - (unary)
  • Logical: and, &&, or, ||, not, !
  • Relational: ==, eq, !=, ne, <, lt, >, gt, <=, ge, >=, le. Comparisons can be made against other values or against Boolean, string, integer, or floating-point literals.
  • Empty: The empty operator is a prefix operation that can be used to determine whether a value is null or empty.
  • Conditional: A ? B : C. Evaluate B or C, depending on the result of the evaluation of A.
Estos operadores se irán viendo con la práctica a medida que se van necesitando. También quería mostrar que puede haber operadores alternativos y es éstos está recogidos en las distintas referencias.

Otros artículos relacionados
-
-
-

Puedes estar al tanto de las novedades en twitter @ADFSalvaje. o siguiendo este blog.
Gracias.

miércoles, 5 de marzo de 2014

Guardar datos de una tabla (af:table) 1/2

Resumen: En este ejemplo vamos a crear una página en la cual podamos tener una tabla con datos, y que éstos puedan ser editados sobre ésta.
Hasta ahora, los ejemplos vistos estaban relacionados con consultas, que presentaban los datos. Ahora vamos a ver cómo se comporta el ADF para gestionar modificaciones y guardar los cambios.

Nota sobre este artículo: este post va a tener varias partes, en la primera lo haremos cometiendo algunos errores comunes a la hora de crear una página de este tipo. Así podremos entender mejor los mecanismos que tiene el ADF para guardar los cambios.

Para ello vamos a crear una nueva página.

crear pagina jspx. Applications Navigator
vista de Applications Navigator


Seleccionamos JSF Page, y continuamos el asistente hasta el final, sin cambiar nada de las opciones que nos ofrece, ni crear beans.

galeria componentes
vista Galería Componentes


El nombre que pondremos a nuestra página sera tabla_editable.jspx.

asistente creacion jspx
asistente creacion jspx




asistente creacion jspx




Ya disponemos de nuestra nueva página en blanco.
Nos vamos al DataControl Palette y arrastramos el objeto ViewObject al bloque central donde se encuentra el jspx, y lo soltamos.
De las opciones que nos ofrece en el menú contextual escogeremos ADF Table.

crear la tabla desde dataControlPalette
en el momento de incluir la tabla desde DataControl Palette



En el conjunto de opciones, le damos a guardar sin seleccionar ninguna opción de las que nos ofrece (enable selection o sortable).

Este es el aspecto que presentara nuestra nueva tabla en la página.


vista jspx con aftable




Podemos pensar que nos hace falta un botón para Guardar los cambios. Para ello, arrastramos del dataControl Palette la operación (Operations) commit (o confirmar, según el idioma en que lo tengamos configurado).


datacontrol Palette eligiendo operacion submit


Lo arrastramos desde el DataControl Palette y elegimos que esa operación se muestre como " ADF Command Button".


incluir boton submit




Podemos ver cómo ha quedado nuestro botón en la página.


aspecto de la pagina jspx


Guardamos todos los cambios y podemos ejecutar la aplicación.

Este es el aspecto de nuestra tabla, para que podamos editarla.



aspecto de la pagina en ejecucion

Vamos a coger en en este ejemplo el nombre que aparece en la primera línea y vamos a cambiar “Steven K”, por “Steven”.
Nota: Si en tu base de datos no tienes esto, puedes probar a cambiar otro nombre.

aspecto de la pagina cambiando los datos


Como vemos hemos cambiado el nombre, y aparentemente no sucede nada.
De hecho vamos a avanzar en nuestra tabla, para ver el siguiente bloque de resultados, y luego volver, a ver si nuestro “Steven” contiene los mismos cambios.

aspecto de la pagina cambiando los datos




captura datos sin cambiar


Aparentemente sí contiene los cambios.
También debemos observar que el botón que habíamos puesto para hacer Commit, ha permanecido desactivado en todo momento.
Parece que no hacía falta incluirlo y que nuestra estupenda tabla, ya hace el trabajo de guardar los datos por nosotros.
Podemos pensar que al realizar los cambios en la tabla, éstos cambios se han guardado ya en nuestra base de datos.

Bien llegados a este punto vamos a hacer dos cosas. Una es refrescar la página con el F5 (sí, eso que siempre digo que no se debe hacer para evitar resultados inesperados).

aspecto de la pagina boton submit activo
página tras el refresco (F5)

Curiosamente tras hacer este refresco de la página, observamos que el botón "Submit" se ha activado: Curioso, ¿no?.

Los datos siguen aparentemente correctos, y nuestro “Steven” sigue tal cual lo dejamos.

Bien ahora hagamos lo siguiente.
Vamos a copiar la url que está en el navegador, y la copias completamente al portapapeles.
Cierra el navegador, y vuelve a abrirlo para poner la dirección que acabas de guardar.
(Nota: esto sirve por el tipo de ejemplo que estamos utilizando en otros puede ocasionar problemas).
Lo escribes, y aparece nuestra tabla, pero también vuelve a aparecer “Steven K”.
Qué extraño, ¿no habíamos dicho que estaba guardado?

Podemos pensar que es un efecto (de esos extraños que puede hacer el ADF), por copiar y poner la url.
Vamos a hacer otra prueba: Parar la aplicación y volverla a arrancar con la página que estamos viendo.
(que Sí, tu hazme caso y ya verás).

El resultado es otra vez el mismo:
El cambio que creíamos haber realizado, realmente no ha sido hecho.

La razón la desvelaremos en el próximo artículo.

Puedes descargarte en este enlace el ejemplo Descargar ejemplo


El por qué de este artículo, es para que puedas entender cómo funciona internamente el ADF y también aprender a detectar ciertos errores al desarrollar aplicaciones que no son visibles.

También otra de las razones es que la documentación oficial se explica todo esto, pero al mostrarse muy teórico, no se sabe muy bien de lo que está hablando.
Así que he preferido un caso práctico, para poder hacer "tangible" aquello que nos puede sonar algo nebuloso.

Artículos relacionados:
- Guardar datos de una tabla (af:table) 2/2
Añadir una tabla (listado)
 

miércoles, 26 de febrero de 2014

Ordenar una tabla (af:table) desde la cabecera

Resumen: En este post vamos a ver cómo dar la opción al usuario, para que pueda ordenar los resultados, según el orden y criterio que quiera.

Para ellos nos ayudaremos de las propiedades sortable y sortProperty.

Con sortable, estamos indicando que se ve a permitir a esa columna o a la cabecera, ordenar los resultados de toda la tabla.

Con sortProperty, indicaremos qué propiedad utilizaremos para ello. Puede ordenarse por un valor distinto al que muestra la columna actual.
Para entender esto veamos nuestro ejemplo:


vista del aftable pagina resultados
vista inicial de la tabla af:table

atributos afcolumn
atributos de af:column


 Cambiamos el valor del atributo sortable por "true", así indicamos que Sí, queremos que se use como elemento de ordenación. 

cambio atributo sortable a true
cambio atrituto sortable




Guardamos los cambios y refrescamos la página (aunque ya saben que puede darnos resultados inesperados). 

vista ejecucion pagina
vista ejecución de la página



Como se puede observar ha habido un pequeño cambio en la cabecera de las columnas que hemos cambiado la propiedad sortable.   
Aparece un pequeño borde, y también si pasamos el ratón por ahí, al cabecera parece clickable. 

Si pinchamos en la cabecera de Nombre sucede esto:

tabla ordenada cabecera afcolumn
tabla ordenada por la cabecera
 
Los resultados de "toda" la tabla (no de la columna) se ordenan alfabéticamente por el campo Nombre. 
También nos aparece una flechita que nos indica el orden que se está siguiendo en ese momento (de menor a mayor). 

Si volvemos a pinchar en la cabecera Nombre, lo ordena de forma descendente.

pagina resultados aftable orden descendiente
aftable ordenado de forma descendente

Bien hagamos lo mismo con la columna Salario. 

aftable ordenada columna salario
tabla ordenada por columna salario



Como podemos observar, los resultados de la columna Salario, NO son los esperados. 
¿Qué es lo que ha pasado?

Si miramos el código nuevamente observamos una cosa: 

revision valor sortproperty
revisión valor sortproperty



El atributo sortProperty pone el valor "LastName" en vez de Salary, que era el esperado. 
Esto ha ocurrido porque anteriormente para crear esta columna decidimos copiar la columna de al lado, y cambiar el valor de la columna, pero no nos fijamos en otras propiedades que quedaron pendientes del cambio. 
En otras ocasiones, puede ocurrir que al ser un campo String, y los valores que guarde representen cantidades, la ordenación se haga como String, y no como cantidad (que es como lo vemos nosotros), y nos lleve a darle muchas vueltas del por qué de este fallo cuando todo "parece estar bien". 

domingo, 23 de febrero de 2014

Añadir una nueva columna a una tabla (af:table) II

Resumen: En esta artículo vamos a ver cómo añadir una columna ( af:column) a una tabla ya existente. La forma será muy manual, observando el código. En otro artículo veremos cómo se puede hacer gráficamente ()
En el nos encontramos con que la columna Salary, no mostraba ningún resultado.


vista resultados navegador
vista resultados navegador


Sospechábamos que podría estar relacionado con el attributeValue
que se había creado en la página de definición.


attributeValues page definition
attributeValues en página definición

La solución rápida sería:
Bueno, hemos visto cómo están los demás campos, ¿por qué no poner el código como los demás campos?
Por lo que podemos ir a la página de definición, y poner dentro de la tabla, un nuevo campo que sea Salary.


incluir columna page definition
vista página definición

Y en la página de vista (jspx), la nueva columna corregimos el nombre para que sea similar a lo que hemos añadido a la página de definición.


incluir afcolumn en codigo jspx
vista código jspx



Si probamos la página podemos ver el resultado:

vista resultado aftable nueva columna
vista navegador
Hemos resuelto el problema, aunque de una forma poco ortodoxa (por algo esto es adfsalvaje
y no adfElegante).
Ya veremos más adelante, cómo se debería haber hecho correctamente.
Pero la razón de mostrar esto, es que a veces nos puede tocar "mancharnos" y tocar código, aunque sea para algún detalle. También que existe más de una forma de hacer las cosas, y sobre todo, para empezar a entrenarnos a resolver problemas (cosa que no siempre se suele ver en la documentación que hay en Internet).

Artículos relacionados:
- Añadir una nueva columna a una tabla (af:table) gráficamente I
- Añadir una nueva columna a una tabla (af:table) gráficamente III


Si te ha gustado este artículo, puedes seguir el blog por Blogger o Twitter

Añadir una nueva columna a una table (af:table) gráficamente

Nota importante: este artículo va a llegar en su desarrollo a una situación de error. Habrá que seguirlo paso a paso, para comprender el tipo de error que podemos cometer y que luego no sabemos cómo resolver.
Si se quiere ver correctamente vaya a este artículo "Añadir una nueva coumna un af:table gráficamente II". 

En el artículo anterior se vio cómo se añadió un nuevo campo al viewObject cuyos datos generan la tabla.
En este artículo vamos a añadir la nueva columna de forma visual, más adelante veremos cómo hacerlo a través del código.

En primer lugar vamos a Data Control Palette (parte superior derecha), y despleguemos la view, para localizar el nuevo campo.


data control palette
vista Data Control Palette




Lo seleccionamos y lo arrastramos hasta la columna que tenemos en la página jspx (de vista).

arrastrar elemento data control palette como nueva columna
arrastrar elemento como nueva columna




Este es el resultado de la página:


En el código fuente de la página podemos observar el cambio que se ha añadido:


vista codigo fuente jspx
vista codigo fuente


En la página de definición, también se ha añadido cambios.
A diferencia que en el artículo anterior, no ha añadido una nueva columna, sino que ha añadido un elemento atributevalue
.

vista page definition
vista página definición


Cuando ejecutamos esta página este es el resultado.

vista de resultado
vista de resultado
Nuestra columna Salary aparece en blanco. Evidentemente algo ha salido mal.
El que apareciera el atributeValue en la página de definición es un indicativo, pues si se comporta de manera similar al resto de columnas debería estar en la misma estructura.




Esto que podría ser un traspiés para aprender ADF, lo podemos aprovechar para empezar a desarrollar la búsqueda de fallos. Y es que los errores más difíciles de encontrar no son aquellos que nos devuelve el compilador, o un mensaje de error en tiempo de ejecución, sino aquellos que aparentemente no recibimos ningún tipo de aviso.


En el siguiente artículo veremos como se hace correctamente.

Si te ha gustado este artículo, puedes seguir el blog por Blogger o Twitter

miércoles, 19 de febrero de 2014

Error: Al intentar avanzar en una tabla, ésta no lo hace

En el vimos cómo incluir una tabla, en la página.
Y todo fue perfecto, pero a la hora de probar el componente, éste no avanzaba, ni cambiaba. Siempre mostraba los mismos elementos.


aftable listado
pantalla de la aplicación


La causa, es que no se puede poner los componentes en cualquier sitio.

Si miramos la pestaña de estructura, vemos que dónde se ha colocado el elemento.



structure aftable
pestaña Structure

Las etiquetas verbatim, se usan para añadir etiquetas y componentes pero sin ninguna utilidad en ADF. Es decir, que puedes colocar un trozo de javascript o html, pero un componente ADF no.

Los componentes en ADF se deben colocar dentro de etiquetas form y fuera de verbatim
.
Ya iremos viendo poco a poco estas etiquetas.

Para cambiar el componente de sitio arrastramos éste dentro de la pestaña de Structure, hasta ponerla fuera de las etiquetas verbatim.

Guardamos el proyecto completo. Es completo porque el cambio afecta tanto al .jspx como a la página de definición.

aftable cambio posicion
cambia af:table de posición

Y le damos a F5 a la página.
Importante: lo de usar F5 para actualizar, sólo es para algunos ejemplos. Pero en una aplicación "normal", suele tener unos efectos insospechados.

aftable listado
vista ejecución

Ya podemos probar el componente y ver cómo se comporta.