PDA

Ver la Versión Completa : Error con Key violation


adelaida
02-02-2006, 03:30:41
Hola Buenas noches.

Tengo el siguiente error que se genera al mostrar en un DBGrid la consulta formada por 2 tablas.

En la Tabla pacientes tengo como llave primaria el campo id_paciente y en la tabla sesiones tengo como llave foranea id_paciente.

Este es mi codigo:

SQLDataSet1.CommandText := 'SELECT a.nombre, a.apellidop, b.* FROM
pacientes a, sesiones b WHERE a.id_paciente=b.id_paciente and
a.nombre=:nombre';
SQLDataSet1.Params[0].AsString := tnombre.Text;
SQLDataSet1.Open;
DBgrid1.DataSource.DataSet.Refresh;
SQLDataSet1.Close;


Estoy pasando como parametro con tnombre.tex el nombre del paciente que quiero consultar, cuando yo consulto un paciente que tiene una sola sesion todo funcina muy bien, pero si tengo dos sesiones con un mismo paciente es decir la tabla sesiones contiene lo siguiente:

id_sesion id_paciente fecha
1 1 27/01/2006
2 2 28/01/2006

Automaticamente al hacer DBgrid1.DataSource.DataSet.Refresh;
me marca el error key violation, y necesito esa linea de codigo, por que si no no veo nada en el DBGrid1.

Alguna idea, siento que el problema esta con el Refresh.....?

De antemano muchas gracias por su atención.

marcoszorrilla
02-02-2006, 07:10:47
Lo que no veo claro, es por qué haces un refresco de una consulta que acaba de abrirse?

Yo simplemente quitaría esa línea, además como consulta que es, supongo que quedará estática durante todo su tiempo de vida.

Un Saludo

Scooter
02-02-2006, 08:35:56
Deberías eliminar las 2 últimas líneas:

- La primera de ellas no produce ningún resultado siempre que lo que refrescas sea el mismo SQLDataSet1. En realidad no entiendo por qué siempre lo usas directamente y en esa línea lo llamas a través del Grid y del DataSource. Asegurate de que el grid está realmente conectado a un DataSource que apunte a SQLDataSet1.

- En el caso de la segunda, si cierro el dataset pierdo el cursor y el grid no mostrará nada.

Y por último, asegurate de que tu grid sea de solo lectura para evitar que involutariamente se produzca una inserción que te produzca el Key Violation y de no haber asociado en ningún evento de estos componentes algo que provoque la inserción (usa un punto de ruptura y trazalo con F7)


Salu2.
Scooter

SQLDataSet1.CommandText := 'SELECT a.nombre, a.apellidop, b.* FROM
pacientes a, sesiones b WHERE a.id_paciente=b.id_paciente and
a.nombre=:nombre';
SQLDataSet1.Params[0].AsString := tnombre.Text;
SQLDataSet1.Open;
DBgrid1.DataSource.DataSet.Refresh;
SQLDataSet1.Close;

adelaida
02-02-2006, 18:30:10
De antemano muchas gracias......

Pues bien, estoy usando la linea DBgrid1.DataSource.DataSet.Refresh; para poder ver algo en el bdgrid, ya que si no la coloco no aparece nada, ya he leido a cerca de esto y simplemente con hacer el SQLDataSet1.Open y SQLDataSet1.Close se deberia de ver la información, pero no es asi.


Ahora mis componentes estan bien conectados los tengo de la siguiente manera: SQLConnection ---> SQLDataSet ---> DataSetProvider ---> ClientDataSet ------> DataSource.


A fin de cuentas solo es una consulta, no estoy modificando ni editando, ya corri mi programa con F7 y la linea que causa conflictos o más bien donde marca el error del Key violation es en: DBgrid1.DataSource.DataSet.Refresh.


Gracias por sus comentarios. Si tuvieran alguna otra observación, se los agradeceria

dieleo
20-02-2007, 22:32:43
Hola a todos.

A mi me pasa algo parecido, con algunos ClientDataSet pero al realizar un locate.
Al realizar un Locate sobre un ClientDataSet, esporadicamente da Key Violation, me esta volviendo medio loco esto. Si alguien tiene alguna idea, lo agraderia.

Saludo a todos.

waly2k1
20-02-2007, 22:58:29
No es el Locate la causa de tu error, sino las asociaciones que tengas entre tablas y al no estar bien algo es como que a un campo clave intenta asignarle el valor de otro registro al moverse de registro, entonces salta el error. Fijate combos y otros objetos sobre todo la propiedad Datafield y Datasource.

Seguilo un poco al código y verás que es algo tan sencillo y no te compliques buscando la 5ta. pata del gato

Saludos

dieleo
21-02-2007, 13:35:28
Gracias, voy a intentarlo.

Saludos.

Lepe
21-02-2007, 19:07:12
adelaida, ¿a qué te refieres con que no ves nada en el grid? ¿Tienes definidas las columnas del Grid en tiempo de diseño o no?.

Si no las tienes, porque el sql cambia frecuentemente, usa dbgrid1.columns.RebuildColumns.

Si el nombre no lo escribes exactamente como está en la base de datos, tampoco ofrecerá los resultados deseados, deberías usar "Where nombre like '*pepe*' (creo recordar que en ADO el asterisco es el comodin si no, prueba con '%pepe%')

SQLDataSet1.CommandText := 'SELECT a.nombre, a.apellidop, b.* FROM
pacientes a, sesiones b WHERE a.id_paciente=b.id_paciente and
a.nombre like :nombre';
SQLDataSet1.Params[0].AsString := '*'+ tnombre.Text+ '*';


Saludos

dieleo
21-02-2007, 19:40:40
Hola a todos.

Pude descubrir en mi caso porque daba Key Violation al realizar un Locate o Filtrar la tabla, en el componente ClientDataSet puse la propiedad PacketRecords = -1,

Si quiero traer por cantidad de registros ,trabajo de otra manera, el error lo daba en el procedimiento CheckBrowseMode del ClientDataSet, dentro del componente. La verdad no se si es un bug o funciona asi, no lo investigue mucho mas.

Si eso te puede ayudar en algo, bueno suerte.

Saludos a todos.