PDA

Ver la Versión Completa : Error en consulta mysql


GUN10
18-03-2016, 07:25:15
Hola buenas noches!

Les comento que tengo el siguiente problema.
Estoy trabajando en Delphi 7 con mysql.

Realizo esta primera consulta, la cual me arroja resultados positivos, me devuelve todos los campos que necesito.

Datos.Qconsultas.Close;
Datos.Qconsultas.SQL.Clear;
Datos.Qconsultas.SQL.Add('SELECT orden_reparacion.cod_ordenreparacion ,orden_reparacion.fecha_ingreso, clientes.dni_cliente, clientes.nombre as nombre_cliente, clientes.apellido as apellido_cliente,usuarios.nombre, categoria_equipo.nombre, '+
'orden_reparacion.marca, orden_reparacion.modelo, detalle_ordenreparacion.dni_usuario, detalle_ordenreparacion.estado, detalle_ordenreparacion.fecha_terminado, detalle_ordenreparacion.precio '+
'FROM orden_reparacion, categoria_equipo, clientes, usuarios, detalle_ordenreparacion '+
'WHERE orden_reparacion.dni_usuario=usuarios.dni_usuario AND categoria_equipo.cod_categoria=orden_reparacion.cod_categoria and orden_reparacion.cod_ordenreparacion=detalle_ordenreparacion.cod_ordenreparacion '+
'AND orden_reparacion.dni_cliente=clientes.dni_cliente AND detalle_ordenreparacion.estado=''5'' AND orden_reparacion.cod_ordenreparacion='+Enumeroorden.text);

Datos.Qconsultas.Open;

Luego en otro formulario realizo una consulta muy similar. Si se fija, en las ultimas dos condiciones del where solo cambio 2 campos. Que filtre por el 'dni_numero' y con respecto a la anterior quito que el 'estado' de la orden sea = 5.

Datos.Qconsultas.Close;
Datos.Qconsultas.SQL.Clear;
Datos.Qconsultas.SQL.Add('SELECT orden_reparacion.cod_ordenreparacion ,orden_reparacion.fecha_ingreso, clientes.dni_cliente, clientes.nombre as nombre_cliente, clientes.apellido as apellido_cliente,usuarios.nombre, categoria_equipo.nombre, '+
'orden_reparacion.marca, orden_reparacion.modelo, detalle_ordenreparacion.dni_usuario, detalle_ordenreparacion.estado, detalle_ordenreparacion.fecha_terminado, detalle_ordenreparacion.precio '+
'FROM orden_reparacion, categoria_equipo, clientes, usuarios, detalle_ordenreparacion '+
'WHERE orden_reparacion.dni_usuario=usuarios.dni_usuario AND categoria_equipo.cod_categoria=orden_reparacion.cod_categoria and orden_reparacion.cod_ordenreparacion=detalle_ordenreparacion.cod_ordenreparacion '+
'AND orden_reparacion.dni_cliente=clientes.dni_cliente AND clientes.dni_cliente='+Edni.Text);
Datos.Qconsultas.Open;

El problema de esta segunda consulta es que en el Tedit. Tengo que colocar el "numero de dni" completo y sin equivocarme, sino me da el siguiente error.

"List index out of bounds (1)"

-------------------------------------------------------------

Aclaro que en los dos formularios, agrego el siguiente codigo para que no me agreguen espacios vacios ni letras ya que el campo es de tipo INT

if (Enumeroorden.Text=' ') then

y tambien en ambos casos, antes de conectar el Query con el DBGrid, realizo la siguiente comprobacion

if (Datos.Qconsultas.RecordCount>0) then

En estas dos comprobaciones, emito un mensaje al no cumplirse la condicion.

Y remarco nuevamente, que en el primer caso, en la pimer consulta, cuando no cumplo la condicion, me emite los mensajes correctamente o me filtra correctamente.

La duda que me queda, es que será lo que esta pasando con la segunda consulta.
--------------------------------------------------------

Hice una prueba por medio de phpmyadmin, utilizando la misma consulta y con valores variados para el campo "dni_cliente" y me filtra correctamente.


Gracias por su tiempo. Saludos !!

Casimiro Notevi
18-03-2016, 10:00:08
Ese mensaje, en teoría, no tiene nada que ver con la consulta, sigue el código paso a paso (debug) y encontrarás exactamente la línea del problema.

GUN10
18-03-2016, 10:16:57
Hola Casimiro Notevi!

El error surge en la segunda consulta cuando ésta no me devuelve nada, es decir cuando las condiciones que pongo en el where no se cumplen.

Lo raro es que cuando en la primera consulta, las condiciones no se cumplen, ese error lo "filtro" por asi decirlo con la pregunta


if (Datos.Qconsultas.RecordCount>0) then


Y esto es lo que está pasando en la segunda consulta, donde utilizo el mismo procedimiento.

Por eso hasta al momento no encuentro otro error mas que ese.

Como podria verificar si esa consulta esta vacia o para filtrar y evitar ese error cuando la consulta no me devuelve nada?

Saludos !!

Casimiro Notevi
18-03-2016, 10:26:35
Te entiendo, pero si no pones el código fuente ¿cómo ayudamos?

GUN10
18-03-2016, 11:53:10
Perdon! Aqui esta el codigo !

El error me lo da cuando pongo un dni que no esta en la tabla. Si pongo uno que sea exactamente igual, me devuelve la consulta sin ningun problema.

El error que me da es ""List index out of bounds (1)"

Obviamente la consulta viene vacia cuando pongo un numero de dni que no existe en la tabla, pero no entiendo porque no pasa por la condicion "Datos.Qconsultas.RecordCount>0"


procedure TFEquiposporcliente.BfiltrarpordniClick(Sender: TObject);
begin
if (Edni.Text='') then
begin
messagedlg('Debe ingresar un N° de DNI', mtinformation, [mbok], 0);
Edni.SetFocus;
end
else
begin
Datos.Qconsultas.Close;
Datos.Qconsultas.SQL.Clear;
Datos.Qconsultas.SQL.Add('SELECT orden_reparacion.cod_ordenreparacion ,orden_reparacion.fecha_ingreso, clientes.dni_cliente, clientes.nombre as nombre_cliente, clientes.apellido as apellido_cliente,usuarios.nombre, categoria_equipo.nombre, '+
'orden_reparacion.marca, orden_reparacion.modelo, detalle_ordenreparacion.dni_usuario, detalle_ordenreparacion.estado, detalle_ordenreparacion.fecha_terminado, detalle_ordenreparacion.precio '+
'FROM orden_reparacion, categoria_equipo, clientes, usuarios, detalle_ordenreparacion '+
'WHERE orden_reparacion.dni_usuario=usuarios.dni_usuario AND categoria_equipo.cod_categoria=orden_reparacion.cod_categoria and orden_reparacion.cod_ordenreparacion=detalle_ordenreparacion.cod_ordenreparacion '+
'AND orden_reparacion.dni_cliente=clientes.dni_cliente AND clientes.dni_cliente='+Edni.Text);
Datos.Qconsultas.Open;

if (Datos.Qconsultas.RecordCount>0) then
begin
DBGordenesporcliente.DataSource:= Datos.DSconsultas;

DBGordenesporcliente.Columns[0].Title.Caption:= 'N° Orden';
DBGordenesporcliente.Columns[0].Width:= 60;
DBGordenesporcliente.Columns[1].Title.Caption:= 'Fecha Ingreso';
DBGordenesporcliente.Columns[2].Title.Caption:= 'Dni Cliente';
DBGordenesporcliente.Columns[3].Title.Caption:= 'Nombre Cliente';
DBGordenesporcliente.Columns[3].Width:= 100;
DBGordenesporcliente.Columns[4].Title.Caption:= 'Apellido Cliente';
DBGordenesporcliente.Columns[4].Width:= 100;
DBGordenesporcliente.Columns[5].Title.Caption:= 'Recepcionista';
DBGordenesporcliente.Columns[5].Width:= 100;
DBGordenesporcliente.Columns[6].Title.Caption:= 'Categoria';
DBGordenesporcliente.Columns[6].Width:= 80;
DBGordenesporcliente.Columns[7].Title.Caption:= 'Marca';
DBGordenesporcliente.Columns[7].Width:= 80;
DBGordenesporcliente.Columns[8].Title.Caption:= 'Modelo';
DBGordenesporcliente.Columns[8].Width:= 120;
DBGordenesporcliente.Columns[9].Title.Caption:= 'Técnico';
DBGordenesporcliente.Columns[9].Width:= 100;
DBGordenesporcliente.Columns[10].Title.Caption:= 'Estado';
DBGordenesporcliente.Columns[10].Width:= 50;
DBGordenesporcliente.Columns[11].Title.Caption:= 'Fecha Terminado';
DBGordenesporcliente.Columns[12].Title.Caption:= 'Precio';
DBGordenesporcliente.Columns[12].Width:= 80;

CBclientes.KeyValue:= unassigned;
end
else
begin
DBGordenesporcliente.Columns[0].Title.Caption:= 'N° Orden';
DBGordenesporcliente.Columns[0].Width:= 60;
DBGordenesporcliente.Columns[1].Title.Caption:= 'Fecha Ingreso';
DBGordenesporcliente.Columns[2].Title.Caption:= 'Dni Cliente';
DBGordenesporcliente.Columns[3].Title.Caption:= 'Nombre Cliente';
DBGordenesporcliente.Columns[3].Width:= 100;
DBGordenesporcliente.Columns[4].Title.Caption:= 'Apellido Cliente';
DBGordenesporcliente.Columns[4].Width:= 100;
DBGordenesporcliente.Columns[5].Title.Caption:= 'Recepcionista';
DBGordenesporcliente.Columns[5].Width:= 100;
DBGordenesporcliente.Columns[6].Title.Caption:= 'Categoria';
DBGordenesporcliente.Columns[6].Width:= 80;
DBGordenesporcliente.Columns[7].Title.Caption:= 'Marca';
DBGordenesporcliente.Columns[7].Width:= 80;
DBGordenesporcliente.Columns[8].Title.Caption:= 'Modelo';
DBGordenesporcliente.Columns[8].Width:= 120;
DBGordenesporcliente.Columns[9].Title.Caption:= 'Técnico';
DBGordenesporcliente.Columns[9].Width:= 100;
DBGordenesporcliente.Columns[10].Title.Caption:= 'Estado';
DBGordenesporcliente.Columns[10].Width:= 50;
DBGordenesporcliente.Columns[11].Title.Caption:= 'Fecha Terminado';
DBGordenesporcliente.Columns[12].Title.Caption:= 'Precio';
DBGordenesporcliente.Columns[12].Width:= 80;

messagedlg('El cliente seleccionado no tiene Equipos en el sistema', mtinformation, [mbok], 0);

Edni.setfocus;
end;
end;


Lcantidad.Caption:= inttostr(Datos.Qconsultas.recordcount);
end;



Saludos !!

Casimiro Notevi
18-03-2016, 12:18:50
Está ese código muy raro :confused:

Haces un Datos.Qconsultas.Open y luego asignas un datasource que no se sabe de dónde viene y trabajas con lo que parece ser el datasource asignado a algún tipo de grid :confused::confused::confused:
¿Para qué sirve entonces el Qconsultas si no lo usas para nada?

GUN10
18-03-2016, 12:36:49
El datasource que le asino al DBGrid, esta conectado con el Query y a la base de datos!

Es por eso que primero hago la consulta y dependiendo si es que me arroja o no resultados, se lo asigno al dbgrid.

Qconsultas, mi dataset
DSconsultas, mi datasource

y Datos, donde tengo todos los dataset y datasource!

Espero que me hayas entendido!

fredo
18-03-2016, 14:04:59
sera que dni_cliente es un string y no le estas ponindo als comillas?????

GUN10
18-03-2016, 18:49:18
Hola fredo!

El campo "dni" es tipo INT, aun no logro encontrar la solucion!

Casimiro Notevi
18-03-2016, 18:56:48
Pero sigue el código paso a paso con el depurador, ahí encontrarás el problema.

Casi seguro que está en
else
begin
DBGordenesporcliente.Columns[0].Title.Caption:= 'N° Orden'; pero es difícil de entender ese código tan extraño que usas sin tener una visión más amplia del mismo.

fredo
19-03-2016, 02:43:12
coloca un try copn un except y postea el mensaje de error... aca te ayudamos!

GUN10
21-03-2016, 13:10:14
Hola buen dia !

Les comento que solucione el problema de la siguiente manera.

Cuando hago la comparacion

if (Datos.Qconsultas.RecordCount>0) then

Yo antes tenia que en cualquiera de las dos opciones, que se cumpla o no la condicion, me dibuje el DBGrid, mas que todo que le ponga los titulos a las columnas, para que quede mas vistoso cuando la consulta no arroja resultados.
Bueno lo que hice fue que solo me lo dibuje cuando se cumpla la condicion y funciona correctamente.

Ya no me tira el error