PDA

Ver la Versión Completa : DBGrid - Actualizar valor de la tabla detalle.


juliannemiro
09-02-2012, 00:14:43
Hola a todos!

Algunos me habrán leido, pero sigo teniendo problemas con un tema. Voy a tratar de ser mas claro a ver si me pueden ayudar.

Estoy manejando una dbgrid, asociada a un adoquery y un datasource.

El Adoquery trae la información de la tabla ASISTENCIAS, y tiene un JOIN con la tabla TIPO_ASISTENCIA, que contiene el detalle de la asistencia justamente.

Sobre la DBGrid, el cliente debe editar los registros. Lo que necesito, es que cuando la persona edita el ID_ASISTENCIA, de la tabla ASISTENCIAS, se refresque la descripcion que esta en la tabla qe traigo con el join, osea TIPO_ASISTENCIAS.
No tiene que editar la tabla detalle ni nada, solamente actualizar el valor.

Imagino que debe ser una simple linea en algún evento de la grilla, pero hace tiempo que vengo probando y no puedo solucionarlo.

Muchas gracias, espero puedan ayudarme.

Caral
09-02-2012, 01:02:27
Hola
No entiendo, para que actualizar el Id_asistencias, este deberia ser clave.
Ademas no entiendo como actualizar la union de dos tablas de esa forma ya que al actualizar un dato se tendria que refrescar el query y si no se hace un filtro quedara en en el principio de la consulta.
Por otro lado, es una mala practica hacer cambios al vuelo.
No entiendo.
Saludos

juliannemiro
09-02-2012, 03:26:09
Hola.
Explico un poco mas. Yo tengo un DBgrid. Que tiene todo un curso y por cada día aparece una lista con los siguientes datos:

Alumnos - Id_asistencia - x_asistencia. - etc-
JUAN - 1 - Presente.
Carlos - 1 - Presente.
Pepe - 2 - Tarde
...


Por defecto cada día propongo en todos los alumnos 1: Presente. Pero el preceptor debe cambiar en caso de ser necesario ese nro'1', por 2 en caso de que el alumno llegue tarde, 3 en caso de que el alumno este ausente.
Entonces el x_asistencia, debe actualizarse.

Las tablas son asi

ASISTENCIAS
id_asistencia
id_alumno
fecha
...

TIPO_ASISTENCIA (la traigo con un join en el query)
Id_asistencia
x_asistencia (la descripcion, osea presente, ausente...)

Entonces cuando en la grilla cambio el valor del id_asistencia, deberia refrescar por el valor que corresponde.

Caral
09-02-2012, 03:31:36
Hola
Bien:
Codigo amigo, codigo habla.:D
Muéstrame la consulta del query y la modifico para que te actualice el dato.
Saludos

Caral
09-02-2012, 03:36:29
Hola
Por curiosidad que BD usas ?.
Saludos
Me auto respondo: SQL Server 2000 usando ADO.

Caral
09-02-2012, 03:54:12
Hola
Mas o menos:

var
dato: Integer;
tipo: String;
begin
Dato:= ADOQuery1.FieldByName('id_asistencia').asinteger;
If Dato = 1 then
tipo:= 'Presente';
If Dato = 2 then
tipo:= 'Tarde';
If Dato = 3 then
tipo:= 'Ausente';
AdoQuery2.SQL.Text := 'Update ASISTENCIAS set id_asistencia = '+IntToStr(Dato)+', x_asistencia = '+QuotedStr(Tipo);
AdoQuery2.ExecSQL;
ADOQuery1.Close,
ADOQuery1.open;
Saludos

juliannemiro
09-02-2012, 04:07:52
El código del query es este:
El código del query es este:

with self.ADOQueryAsistenciasGrid do
begin
close;
SQL.Add(' select b.id_asistencias, c.apellido as Apellido, c.nombre as Nombre, ');
SQL.Add(' b.id_asistencias_tipo, e.x_asistencia, b.computa, b.valor, b.obs as Observación, f.id_estado, f.id_alumno, e.id_asistencias_tipo ');
SQL.Add(' from asistencias b ');
SQL.Add(' left outer join alumnos_cursos a ');
SQL.Add(' on a.id_alumno = b.id_alumno ');
SQL.Add(' inner join personas c ');
SQL.Add(' on c.id_persona = a.id_alumno ');
SQL.Add(' left outer join cursos d ');
SQL.Add(' on a.id_curso = d.id_curso ');
SQL.Add(' and b.n_anioLectivo = d.n_anio ');
SQL.Add(' left outer join asistencias_tipos e ');
SQL.Add(' on b.id_asistencias_tipo = e.id_asistencias_tipo ');
SQL.Add(' left outer join alumnos f ');
SQL.Add(' on c.id_persona = f.id_alumno ');
SQL.Add('where a.id_curso = ''' + EditCursoId.text +''' and b.fecha = '''+ DateToStr(DateTimePicker1.DateTime) + ''' ');
SQL.Add(' order by b.n_anioLectivo, b.fecha, c.apellido, c.nombre ');
Open;
Active:= True;
end;


Lo que vos propones es trabajar con un segundo query que haga el update, verdad? En que evento se dispararía?

Caral
10-02-2012, 02:34:36
Hola
Si, lo que se me ocurre es tener un segundo query.
El evento depende de tu interes, puede ser el onchage, el ondobleclick etc.
Es algo muy particular.
Saludos

juliannemiro
10-02-2012, 02:45:11
Hola de vuelta.

La x_asistencia no debe modificarla. Solamente debe refrescar el valor cuando cambia el ID_ASISTENCIA.

He probado algo similar a lo que me describiste arriba, pero lamentablente no me funciona. Me dice 'No puede encontrar la fila para su actualizacion: algunos valores han cambiado desde la ultima vez que se leyó'.

Este es el código


procedure TFormAsistencia.DBGridMateriasCursoExit(Sender: TObject);
var
dato, Id: integer;
begin
Id:= ADOQueryAsistenciasGrid.FieldByName('id_asistencias').asinteger; // Es el id de la asistencia
Dato:= ADOQueryAsistenciasGrid.FieldByName('id_asistencias_tipo').asinteger; // Este es el id del TIPO de asistencia (1,2,3,4..)

AdoQuery2.SQL.Text := 'Update ASISTENCIAS set id_asistencias_tipo = '+ IntToStr(Dato) +' where id_asistencias= '+IntToStr(id);
AdoQuery2.ExecSQL;
ADOQueryAsistenciasGrid.Close;
ADOQueryAsistenciasGrid.open;
end;
end.

Caral
10-02-2012, 02:55:19
Hola
Estas usando el mismo query para el update, como pretendes que muestre la misma consulta ?
Logicamente te dice que los datos cambiaron.
Saludos
Perdon, me corrijo, no estas usando el mismo query.
El problema esta en que cierras el primer query despues del update, hazlo antes y coloca un mensaje para que te muestre el dato a ver si es el correcto.

juliannemiro
10-02-2012, 03:36:09
Bueno finalmente funciona!! Gracias!!

Pero el problema es que es "incomodo" en la forma que lo hace. Lo estoy poniendo en el afterPost del dataset y el inconveniente es que una vez que actualiza el dato, pero pierde foco de la grilla.

En esta misma grilla, en el evento keypress hago que si cambia el id_asistencia_tipo de 1 a 2 o 3 cambia de color todo el registro y lo hace fenomeno. Pero ahi no funciona mi código.

Caral
10-02-2012, 03:45:12
Hola
Envia el codigo de cambio de un evento a otro.
Si lo hace bien en el AfterPost entonces en el evento OnKeypress haz que se ejecute el evento Afterpost.
O puedes crear un procedimiento para ese fin.
De todos modos, creo que lo dije en mi primera intervención (perderás el foco, el grid al actualizarse se va al inicio).
Por eso también dije, no me gusta el cambio al vuelo.
Saludos

juliannemiro
10-02-2012, 04:04:54
Entiendo. Entonces no me es práctico esto que estoy haciendo y debo buscar otra opcion.

Debe ser algo muy dinamico. De manera que el preceptor solo tenga que apretar un numero y enter y asi tomar asistencia del curso en forma rapida.