Club Builder - Foros de discusión Club Builder
Foro de C++Builder en español
 
 FAQFAQ   BuscarBuscar   MiembrosMiembros   Grupos de UsuariosGrupos de Usuarios   RegistrarseRegistrarse 
 PerfilPerfil   Entra para ver tus mensajes privadosEntra para ver tus mensajes privados   EntrarEntrar 

Problema en un SELECT

 
Publicar nuevo tema   Responder al tema    Foros de discusión -> Bases de Datos
Ver tema anterior :: Ver tema siguiente  
Autor Mensaje
Mensaje    Asunto: Problema en un SELECT Responder citando

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
Ver perfil de usuario Enviar mensaje privado Enviar email
Mensaje    Asunto: Responder citando

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
Ver perfil de usuario Enviar mensaje privado
Mensaje    Asunto: Responder citando

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
Ver perfil de usuario Enviar mensaje privado Enviar email
Mensaje    Asunto: Responder citando

¡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
Ver perfil de usuario Enviar mensaje privado Enviar email
Mensaje    Asunto: Responder citando

¡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
Ver perfil de usuario Enviar mensaje privado Enviar email
Mensaje    Asunto: Responder citando

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
Ver perfil de usuario Enviar mensaje privado Enviar email
Mensaje    Asunto: Responder citando

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!!
_________________
Cool
Volver arriba
Ver perfil de usuario Enviar mensaje privado Enviar email MSN Messenger
Mensaje    Asunto: Responder citando

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
Ver perfil de usuario Enviar mensaje privado Enviar email
Mensaje    Asunto: Responder citando

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..
_________________
Cool
Volver arriba
Ver perfil de usuario Enviar mensaje privado Enviar email MSN Messenger
Mensaje    Asunto: Responder citando

Gracias César. En cuanto pueda lo pruebo y ya os diré como me ha ido.
_________________
Un saludo

Necesitamos tu ayuda: Envía AI al 27595 (Coste 1,20 euros + IVA)
Volver arriba
Ver perfil de usuario Enviar mensaje privado Enviar email
Mensaje    Asunto: Responder citando

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
Ver perfil de usuario Enviar mensaje privado
Mensaje    Asunto: Responder citando

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. Smile 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
Ver perfil de usuario Enviar mensaje privado Enviar email
Mostrar mensajes de anteriores:   
Cambiar a:  
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


Hosting WordPress Indedmedia desde 3,99 €
© 2002–2026 Club Builder · Funciona con phpBB.