 |
Club Builder Foro de C++Builder en español
|
| Ver tema anterior :: Ver tema siguiente |
| Autor |
Mensaje |
Angel Master


Registrado: 15 Abr 2003Mensajes: 2311Ubicación: Toledo (España)
|
Publicado: Jue 04 Oct, 2007 4:03 pm Asunto: Problema en un SELECT |
|
|
Estoy trabajando con Firebird. Quiero hacer un SELECT como este:
| Código: | SELECT Fecha, RefInt, COUNT(*) Recibos, SUM(Importe) Importe FROM Recibos WHERE TRIM(Cuenta) <> '' GROUP BY Fecha, RefInt
UNION
SELECT Fecha, RefInt, COUNT(*) Recibos, SUM(Importe) Importe FROM Recibos WHERE TRIM(Cuenta) = '' GROUP BY Fecha, RefInt
ORDER BY Fecha |
Sin embargo, al ejecutarlo me da un error:
| Cita: | Invalid token.
Dynamic SQL Error.
SQL error code = -104.
Invalid command.
Invalid ORDER BY clause. |
¿No se puede poner un ORDER en ese tipo de SELECT? _________________ Un saludo
Necesitamos tu ayuda: Envía AI al 27595 (Coste 1,20 euros + IVA) |
|
| Volver arriba |
|
 |
rivo Lt JG

Registrado: 13 Mar 2004Mensajes: 72Ubicación: Asturias (España)
|
Publicado: Dom 07 Oct, 2007 11:36 am Asunto: |
|
|
en los group by no te falta poner el importe tambien, es que me parece que en el group by hay que poner todos los campos del select.
¿y que quiers organizar por fecha la consulta entera? no podrias hacer un create view de esta forma :
| Código: | CREATE VIEW consulta AS
SELECT Fecha, RefInt, COUNT(*) Recibos, SUM(Importe) Importe FROM Recibos WHERE TRIM(Cuenta) <> '' GROUP BY Fecha, RefInt,importe
UNION
SELECT Fecha, RefInt, COUNT(*) Recibos, SUM(Importe) Importe FROM Recibos WHERE TRIM(Cuenta) = '' GROUP BY Fecha, RefInt,importe ; |
y luego
| Código: |
SELECT * FROM consulta ORDER BY fecha; |
a ver si asi...
un saludo!! |
|
| Volver arriba |
|
 |
Angel Master


Registrado: 15 Abr 2003Mensajes: 2311Ubicación: Toledo (España)
|
Publicado: Lun 08 Oct, 2007 12:35 pm Asunto: |
|
|
Ok. Gracias. No se me había ocurrido lo de la vista. Lo voy a probar.
| rivo escribió: | | en los group by no te falta poner el importe tambien, |
No porque el campo importe es un campo de agrupación y en el GROUP BY se ponen los campos individuales. _________________ Un saludo
Necesitamos tu ayuda: Envía AI al 27595 (Coste 1,20 euros + IVA) |
|
| Volver arriba |
|
 |
Angel Master


Registrado: 15 Abr 2003Mensajes: 2311Ubicación: Toledo (España)
|
Publicado: Lun 08 Oct, 2007 1:07 pm Asunto: |
|
|
¡No va! Claro, que es la primera vez que uso este comando CREATE VIEW y seguro que lo hago mal.
| Código: | CREATE VIEW Consulta AS SELECT Fecha, RefInt, COUNT(*) Recibos, SUM(Importe) Importe FROM Recibos WHERE TRIM(Cuenta) <> '' GROUP BY Fecha, RefInt UNION SELECT Fecha, RefInt, COUNT(*) Recibos, SUM(Importe) Importe FROM Recibos WHERE TRIM(Cuenta) = '' GROUP BY Fecha, RefInt |
Me da este error literal:
| Cita: | This operation is not defined for system tables.Dynamic SQL Error.
SQL error code = -607.
Invalid command.
Must specify column name for view select expression. |
Las vistas, ¿hay que definirlas previamente? _________________ Un saludo
Necesitamos tu ayuda: Envía AI al 27595 (Coste 1,20 euros + IVA) |
|
| Volver arriba |
|
 |
Angel Master


Registrado: 15 Abr 2003Mensajes: 2311Ubicación: Toledo (España)
|
Publicado: Lun 08 Oct, 2007 1:13 pm Asunto: |
|
|
¡Arreglado! Resulta que hay que definir las columnas de la vista, al menos en Firebrid:
| Código: | CREATE VIEW Consulta (Fecha, RefInt, Recuibos, Importe) AS SELECT Fecha, RefInt, COUNT(*) Recibos, SUM(Importe) Importe FROM Recibos WHERE TRIM(Cuenta) <> '' GROUP BY Fecha, RefInt UNION SELECT Fecha, RefInt, COUNT(*) Recibos, SUM(Importe) Importe FROM Recibos WHERE TRIM(Cuenta) = '' GROUP BY Fecha, RefInt |
_________________ Un saludo
Necesitamos tu ayuda: Envía AI al 27595 (Coste 1,20 euros + IVA) |
|
| Volver arriba |
|
 |
Angel Master


Registrado: 15 Abr 2003Mensajes: 2311Ubicación: Toledo (España)
|
Publicado: Lun 08 Oct, 2007 1:46 pm Asunto: |
|
|
Lo siento. ¡4 respuestas en media hora! Se crea la vista pero no me deja hacer la SELECT de la misma:
| Código: | TIBQuery *qVista = new TIBQuery(this);
qVista->Database = Query->Database;
qVista->Transaction = Query->Transaction;
qVista->SQL->Text = "CREATE VIEW Consulta (Fecha, RefInt, Recibos, Importe) AS SELECT Fecha, RefInt, COUNT(*) Recibos, SUM(Importe) Importe FROM Recibos WHERE TRIM(Cuenta) <> '' GROUP BY Fecha, RefInt UNION SELECT Fecha, RefInt, COUNT(*) Recibos, SUM(Importe) Importe FROM Recibos WHERE TRIM(Cuenta) = '' GROUP BY Fecha, RefInt";
qVista->Prepare();
qVista->Open();
Query->Close();
Query->UnPrepare();
Query->SQL->Text = "SELECT * FROM Consulta ORDER BY Fecha DESC";
Query->Prepare();
Query->Open();
(Proceso de los datos)
qVista->Close();
qVista->UnPrepare();
qVista->SQL->Text = "DROP VIEW Consulta";
qVista->Prepare();
qVista->ExecSQL();
delete qVista; |
Me da un SQL error code -204 (Table unknow CONSULTA) ¿Me falta algo? He estado buscando y no veo que puedo estar haciendo mal. _________________ Un saludo
Necesitamos tu ayuda: Envía AI al 27595 (Coste 1,20 euros + IVA) |
|
| Volver arriba |
|
 |
Cesar C. Salazar Gonzalez Master


Registrado: 01 Oct 2002Mensajes: 2155Ubicación: San Cristóbal de Las Casas, Chiapas
|
Publicado: Mar 09 Oct, 2007 6:38 am Asunto: |
|
|
Debes crear la Vista dentro del servidor de base de datos, ayudate del programa que te sirve para crear las tablas dentro de la base de datos y posteriormente, jalas a la vista con otro IBDataSet, DataSource correspondiente, las vistas creadas dentro del servidor son solo eso, Vistas, NO cotienen registros si no una combinación de ellos, por lo tanto debes cargarla como si fuera otra tabla, agregando a tu modulo de datos los componetes anteriores y el select que usas para traer los datos de la vista dentro de la Sentencia SelectSQL del IBDataSet.
Saludos!! _________________
 |
|
| Volver arriba |
|
 |
Angel Master


Registrado: 15 Abr 2003Mensajes: 2311Ubicación: Toledo (España)
|
Publicado: Mar 09 Oct, 2007 10:09 am Asunto: |
|
|
| César C. Salazar González escribió: | | Debes crear la Vista dentro del servidor de base de datos |
Gracias César. Eso lo entiendo porque si las pruebas las hago con IBManager me funciona perfectamente, pero hay un problema: la aplicación, donde va a estar instalada, no va a tener el IBManager ni nada similar y entonces necesitaría poder crear las vistas de forma dinámica. No me importa si la creación de las vistas la he de hacer cuando creo la base de datos o en el momento de usarla, pero ¿puedo hacerlo de forma dinámica? _________________ Un saludo
Necesitamos tu ayuda: Envía AI al 27595 (Coste 1,20 euros + IVA) |
|
| Volver arriba |
|
 |
Cesar C. Salazar Gonzalez Master


Registrado: 01 Oct 2002Mensajes: 2155Ubicación: San Cristóbal de Las Casas, Chiapas
|
Publicado: Mar 09 Oct, 2007 10:43 am Asunto: |
|
|
si deseas crear las vistas de manera Dinámica dentro de tu base de datos y desde tu Aplicación, puedes usar el componente TIBSQL que viene en la paleta de Interbase, pues es el componente que sirve para crear "comandos" sql dentro del servidor y posteriormente usas un TIBDataSet de la misma paleta para jalar la información dentro de un Select algo asi
componente IBSQL - propiedades
DataBase - Nombre de tu Base de datos
| Código: | this->IBSQL1->SQL->Clear();
this->IBSQL1->SQL->Add(" tu sentencia para crear la vista ....");
this->IBSQL1->ExecQuery(;
// y en un componete TIBDataSet hace algo como esto
this->IBDataSet1->SelectSQL->Add("Select * from <nombre de tu vista>");
this->IBDataSet1->Open();
this->IBDataSet1->FieldByName("nombre del campo de la vista")->Value; |
De esta manera creas la Vista con el IBSQL y la usas como otra tabla de tu base con el IBDataSet
aun que lo recomendable es que la crees en tiempo de diseño y no de manera dinamica, pues tendrias que realizar una rutina para "detectar" si tu vista ya esta creada o si hay que crearse de nuevo.
puesto que al realizar por segunda vez las lineas arriba, te va a saltar una excepción pues la vista ya existe.
entonces lo recomendable es que la crees antes en tiempo de diseño de tu base de datos y posteriormente la uses como una tabla con el IBDataSet
Saludos.. _________________
 |
|
| Volver arriba |
|
 |
Angel Master


Registrado: 15 Abr 2003Mensajes: 2311Ubicación: Toledo (España)
|
|
| Volver arriba |
|
 |
rivo Lt JG

Registrado: 13 Mar 2004Mensajes: 72Ubicación: Asturias (España)
|
Publicado: Mar 09 Oct, 2007 2:01 pm Asunto: |
|
|
Angel a ver si con lo que te dijo cesar te funciona, es que yo lo expuse teoricamente, practimamente nunca lo he probado :p
un saludo! |
|
| Volver arriba |
|
 |
Angel Master


Registrado: 15 Abr 2003Mensajes: 2311Ubicación: Toledo (España)
|
Publicado: Lun 15 Oct, 2007 7:38 am Asunto: |
|
|
| César C. Salazar González escribió: | | puesto que al realizar por segunda vez las lineas arriba, te va a saltar una excepción pues la vista ya existe. |
Como siempre, tienes razón. Además se da otra circunstancia: Ejecuto el IBSql la primera vez y crea la vista (lo sé porque con IBManager aparece en el listado) pero en esa primera pasada, a ejecutar el IBDataSet da un error de tabla desconocida y me indica el nombre de la vista.
Dado que al arrancar por primera vez la aplicación las tablas las creo sobre la marcha, haré lo mismo con las vistas que me hagan falta. Muchas gracias por la ayuda César _________________ Un saludo
Necesitamos tu ayuda: Envía AI al 27595 (Coste 1,20 euros + IVA) |
|
| Volver arriba |
|
 |
|
|
No puedes publicar temas nuevos en este foro No puedes responder a temas en este foro No puedes editar tus mensajes en este foro No puedes borrar tus mensajes en este foro No puedes votar en las encuestas de este foro
|
© 2002–2026 Club Builder · Funciona con phpBB.
|