29
2012
Resolver error ora-01008 not all variables bound | frm-41380

Error ORA-01008 FRM-41380
En este artículo explicamos como resolver los errores “ora-01008 not all variables bound” y “frm-41380 Cannot set the blocks query data source”. Para resolver este problema vamos a modificar la cláusula From de la pantalla en modo ejecución.
Modificar la cláusula From en modo de ejecución
Cuando necesitamos recuperar valores que vengan de un agrupamiento de otras tablas sugerimos hacer una cláusula From, el problema que nos podemos encontrar es que cuando necesitamos que esa subselect realice un filtro con variables de la aplicación nos aparece el error “ora-01008 not all variables bound” ya que durante la consulta no es capaz de darle un valor a esas variables.
Para poder solucionar esto deberemos modificar la subselect de forma manual y en tiempo de ejecución. Por otro lado en las propiedades del bloque deberemos poner lo siguiente:
Consultar Tipo de Origen de Datos: Consulta de cláusula FROM.
Nombre de Origen de Datos de Consulta: (Aunque luego se sustituya el valor en ejecución es necesario introducir algún contenido para que no nos de error).
Alias: El nombre de la tabla de la que consultamos.
Para modificar la consulta en tiempo de ejecución tendremos que utilizar el trigger Pre-query, donde escribiremos la Subselect necesaria y modificaremos la propiedad del bloque (QUERY_DATA_SOURCE_NAME ) que corresponde a “Nombre de Origen de Datos de Consulta de Datos” de la siguiente manera:
1 2 3 4 5 6 7 8 9 | DECLARE cadena_from VARCHAR(2000); BEGIN cadena_from := '(SELECT NOMBRE,APELLIDO,DIRECCION, SUM(PTIMPORTE) PTIMPORTE FROM PEDIDOS WHERE CDHABIL = '''|| :VARB_COMN.HABIL || ''' AND TO_DATE(FENOMDES,''J'') >= TO_DATE('''|| :B0.MD ||''',''MM/YYYY'') AND TO_DATE(FENOMDES,''J'')'; set_block_property('B1',QUERY_DATA_SOURCE_NAME,cadena_from); |
Si necesitáis realizar dos veces la consulta es necesario limpiar el bloque, se puede hacer de dos formas dependiendo del problema que os surja.
Uno de ellos es limpiar el bloque antes de realizar el execute query:
go_block (‘bloque_de_datos’);
clear_block (no_validate);
Y otro es si el problema que os da es que os monta un where después de la consulta, podéis limpiarlo así:
set_Block_Property(‘B1′,DEFAULT_WHERE,’ ‘);
De estas dos maneras podemos resolver tanto el error “ora-01008 not all variables bound” como el error “frm-41380 Cannot set the blocks query data source”.
ORACLE FORMS
Artículos relacionados
Related Posts
2 Comments + Add Comment
Leave a comment
Encuéntralo aquí
Entradas recientes
- Suma de números de una lista en Java
- Instalar Ubuntu utilizando Wibu
- Expresiones Regulares. Ejemplos
- Operadores en Google | Busquedas personalizadas
- Oracle REGEXP Funciones
- Cómo conectarse por SSH al servidor web
- Programación en Lenguaje ensamblador | Dividir dos números
- Secuencias Oracle.
- Cómo crear 20 subredes | Red tipo B | Ejemplos
- Colores en el diseño de las redes sociales
- Mejora la velocidad de tu web
- Problemas de conexión con SMF
- Diversidad funcional | Interacción de las personas con los ordenadores
- Tecnicas de Black hat SEO
- Tutorial posicionamiento Web SEO II – Diseño y SEO
Recientes
- admin: Hola, He añadido una linea al código, que creo que se tuvo que quedar en el olvido… Respecto a tu...
- Bernardo: Gracias por la explicación, sin embargo no entiendo algunas cosas: El código que muestran me imagino va en...
- admin: Ok, prueba. No obstante, si no lo consigues muestrame o envíame el código y te echo una mano. Suerte!
- Anselmo: Gracias por la respuesta, hoy voy a intentar modificar el código. De hecho tengo una lista con muchos links,...
- admin: Hola, Lo que quieres hacer no parece complicado, prueba esto: Modifica la función initialize para que le...
Gracias por la explicación, sin embargo no entiendo algunas cosas: El código que muestran me imagino va en el pre-query verdad? y en query_data_source_name escribimos: cadena_from??
En el alias que nombre de tabla coloco si de hecho en mi consulta cruzo varias tablas??..
Gracias.
Hola,
He añadido una linea al código, que creo que se tuvo que quedar en el olvido…
Respecto a tu pregunta, el código va en el pre-query del bloque en el que necesitas usar una clausula from, y si, en el query_data_sorce_name tendremos que poner lo que contienen cadena_from de la siguiente forma (se pone también en el pre_query después de formar la cadena_from):
set_block_property(‘B1′,QUERY_DATA_SOURCE_NAME,cadena_from);
Para el alias puedes poner el nombre de una de las tablas he hecho este ejemplo para la cadena_from, en el se obtiene el campo CDTIPOP de otra tabla.
SELECT DISTINCT . HRETAPRE.CDSECCIO, HRETAPRE.CDORGAN,
HRETAPRE.CDSERVI, HRETAPRE.CDPROG,
HRETAPRE.CDCLASEC,HRETCOAP.CDTIPOP
FROM HRETAPRE , HRETCOAP
WHERE HRETAPRE.CDHABIL = ‘DEM’
AND HRETAPRE.CDCLASNM = ’02′
AND TO_DATE(HRETAPRE.FENOMDES,’J') >= TO_DATE(’01/2010′,’MM/YYYY’)
AND TO_DATE(HRETAPRE.FENOMDES,’J') < = TO_DATE('12/2010','MM/YYYY')
AND HRETAPRE.CDHABIL = HRETCOAP.CDHABIL
AND HRETAPRE.CDCLASNM = HRETCOAP.CDCLASNM
and HRETAPRE.CDSECCIO = HRETCOAP.CDSECCIO
and HRETAPRE.CDSERVI = HRETCOAP.CDSERVI
and HRETAPRE.CDORGAN = HRETCOAP.CDORGAN
and HRETAPRE.CDPROG = HRETCOAP.CDPROG
and HRETAPRE.CDCLASEC = HRETCOAP.CDCLASEC
El alias que hemos puesto en el bloque es HRETAPRE, y se tomará para todos los campos que pertenecen al bloque. Una vez que se realiza la consulta nos quedará así:
SELECT HRETAPRE.CDSECCIO, HRETAPRE.CDSERVI, HRETAPRE.CDORGAN, HRETAPRE.CDPROG, HRETAPRE.CDCLASEC, HRETAPRE.CDTIPOP FROM (SELECT DISTINCT HRETAPRE.CDSECCIO, HRETAPRE.CDORGAN,
HRETAPRE.CDSERVI, HRETAPRE.CDPROG,
HRETAPRE.CDCLASEC,HRETCOAP.CDTIPOP
FROM HRETAPRE , HRETCOAP
WHERE HRETAPRE.CDHABIL = 'DEM'
AND HRETAPRE.CDCLASNM = '02'
AND TO_DATE(HRETAPRE.FENOMDES,'J') >= TO_DATE(’01/2010′,’MM/YYYY’)
AND TO_DATE(HRETAPRE.FENOMDES,’J') <= TO_DATE(’12/2010′,’MM/YYYY’)
AND HRETAPRE.CDHABIL = HRETCOAP.CDHABIL
AND HRETAPRE.CDCLASNM = HRETCOAP.CDCLASNM
and HRETAPRE.CDSECCIO = HRETCOAP.CDSECCIO
and HRETAPRE.CDSERVI = HRETCOAP.CDSERVI
and HRETAPRE.CDORGAN = HRETCOAP.CDORGAN
and HRETAPRE.CDPROG = HRETCOAP.CDPROG
and HRETAPRE.CDCLASEC = HRETCOAP.CDCLASEC) HRETAPRE
El alias es HRETAPRE y CDTIPOP aunque es de otra tabla lo recogemos así “HRETAPRE.CDTIPOP” con el alias que le hemos puesto al bloque, es decir, puedes hacer la calusula from con todas las tablas que quieras pero para el alias debe ser solo una de ellas para todos los campos del bloque.