Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Varios (https://www.clubdelphi.com/foros/forumdisplay.php?f=11)
-   -   Validar Dato DBGRID en tiempo de ejecución!! (https://www.clubdelphi.com/foros/showthread.php?t=77417)

juliannemiro 24-01-2012 15:32:16

Validar Dato DBGRID en tiempo de ejecución!!
 
Hola a todos!

- Tengo una DBGrid de la tabla ASISTENCIAS en la que cargo una lista de alumnos de una fecha determinada.
La grilla muertra alumno, ID de tipo de asistencia y descripción entre otras cosas.

Lo que yo necesito es que cuando la persona completa en tiempo de ejecucion me valide lo que ingresa, por ejemplo:

El usuario pone sobre un alumno X, id_asistencia: 'P' y la descripcion automaticamente tiene que decir PRESENTE. Si cambió la 'P', por una 'A', debe refrescar la descripción a AUSENTE. Esto para cada uno de los alumnos que aparece en la grilla.

Esta modificacion de datos la hago dentro de una transacción.

Trabajo con SQLserver2000, y tengo el DATASOURCE, ADOTABLE Y ADOQUERY de la tabla ASISTENCIAS

Espero se entienda, agradezco su tiempo!

ecfisa 26-01-2012 02:18:22

Hola juliannemiro.

Si no te entendí mal, estás ingresando los datos desde el mismo DBGrid. De ser así, podés aprovechar el evento OnKeyPress del TDBGrid:
Código Delphi [-]
procedure TForm1.DBGridKeyPress(Sender: TObject; var Key: Char);
begin
  with Sender as TDBGrid do
   if SelectedField.FieldName = 'id_asistencia' then
   begin
     DataSource.DataSet.Edit;
     if Upcase(Key) = 'P' then
       SelectedField.Value:= 'PRESENTE';
     if Upcase(Key) = 'A' then
       SelectedField.Value:= 'AUSENTE';
     Key:= #0;
   end;
end;

Saludos.

juliannemiro 27-01-2012 02:29:55

Perdon en la tardanza en contestar!

Si, eso me sirve y muchisimo. Pero tengo el siguiente problema:
El campo que tiene que cambiar la descripción no debe ser id_asistencias, sino x_descripcion que también lo muestra la grilla ya que esta dentro del mismo adoquery.

ecfisa 27-01-2012 05:14:10

Cita:

Empezado por juliannemiro (Mensaje 423804)
Perdon en la tardanza en contestar!

Si, eso me sirve y muchisimo. Pero tengo el siguiente problema:
El campo que tiene que cambiar la descripción no debe ser id_asistencias, sino x_descripcion que también lo muestra la grilla ya que esta dentro del mismo adoquery.

Hola Julián.

Basta con que cambies el nombre de campo 'id_asistencias' por 'x_descripción' en el código que te puse anteriormente.

Un saludo.

juliannemiro 27-01-2012 14:38:09

Hola!

Pido disculpas, porque me expresé mal

En mi dbgird tengo campo id_asistencia_tipo y x_asistencia entre otros. Cuando el usuario pone en id_asistencia_tipo la letra 'P', el campo x_asistencia debe ponerse 'Presente'. Pero se mantiene en id_asistencia_tipo la letra 'P'. Digamos que es el Codigo y Descrpicion

Osea el registro quedaria asi:
Alumno.....id_asistencia.....tipo x_asistencia
Juan...............P................Presente

En sintesis lo que me falta es la sintaxis para agregar la linea que seleccione otro campo del mismo registro al cual le voy a asignar un valor.

Gracias!

ecfisa 27-01-2012 14:55:40

Hola.

Creo que ahora te entendí :)

Código Delphi [-]
procedure TForm1.DBGridKeyPress(Sender: TObject; var Key: Char);
begin
  with Sender as TDBGrid do
  if SelectedField.FieldName = 'id_asistencia' then
  begin
    DataSource.DataSet.Edit;
    if Upcase(Key) = 'P' then
      DataSource.DataSet.FieldByName('x_descripción').AsString:= 'PRESENTE';
    if Upcase(Key) = 'A' then
      DataSource.DataSet.FieldByName('x_descripción').AsString:= 'AUSENTE';
    Key:= #0; // (Quitá esta línea si deseas conservar los caracteres tecleados )
  end;
end;

Saludos.

juliannemiro 27-01-2012 15:32:08

Excelente ecfisa!!

Eso es exactamente lo que quería. Pero sigo teniendo un problema para poder realizarlo con exito.

Lo que pasa es lo siguiente:
Cambio un registro, actualiza perfecto el x_asistencia
Cambio el segundo registro, actualiza perfecto el x_asistencia. Pero ni bien quiero pasar a un tercer registro el programa falla y me dice 'No puede encontrar la fila para su actualizacion: algunos valores han cambiado desde la ultima vez que se leyó'


ecfisa 27-01-2012 16:00:26

Hola Julián.

Revisá estos enlaces donde se trata ese error:
Un saludo.

juliannemiro 30-01-2012 01:33:34

Hola.
Estuve leyendo y creo que el problema es con la consulta del adoquery. Porque si yo solo trabajo en la dbgrid con los campos de la tabla asistencias, funciona todo correctamente.
Ahora si a la consulta de la dbgrid le agrego los joins con las otras tablas, me falla con el mensaje antes detallado.

Voy a probar de solucionarlo, lo que se me viene a la cabeza es que trata de editar campos de las tablas que trae con el JOIN y solamente deberian usarlo para mostrarlos. Será ese el problema?

No se si corresponde seguir tratandolo acá o crear un nuevo thread.

ecfisa 30-01-2012 01:53:17

Cita:

Empezado por juliannemiro (Mensaje 423900)
No se si corresponde seguir tratandolo acá o crear un nuevo thread.

Hola Julián.

Si creás un nuevo hilo exponiendo caso y el error, con seguridad incrementás las posibilidades de recibir una respuesta más concreta.

Un saludo.

juliannemiro 15-02-2012 14:49:49

Hola. Estoy de nuevo!

Te cuento que he solucionado el problema creando una VISTA en el SQLServer:

Código SQL [-]
SELECT     b.id_asistencias, c.apellido AS Apellido, c.nombre AS Nombre, b.id_asistencias_tipo, 
    b.computa, b.valor, b.obs AS Observación, f.id_estado, f.id_alumno, d .id_curso, b.fecha,
            CASE b.id_asistencias_tipo
              WHEN 1 THEN 'Presente'
              WHEN 2 THEN 'Ausente'
              WHEN 3 THEN 'Tarde'
            ELSE 'retiro' END AS x_asistencia                   
FROM         asistencias b LEFT JOIN
                      alumnos_cursos a ON a.id_alumno = b.id_alumno INNER JOIN
                      personas c ON c.id_persona = a.id_alumno LEFT JOIN
                      cursos d ON a.id_curso = d .id_curso AND b.n_anioLectivo = d .n_anio LEFT JOIN
                      asistencias_tipos e ON b.id_asistencias_tipo = e.id_asistencias_tipo LEFT JOIN
                      alumnos f ON c.id_persona = f.id_alumno




Asique ese error ya no esta mas. El problema es el siguiente.

Cuando cambio el valor del ID_ASISTENCIA_TIPO en la DBGRID, me cambia la X_ASISTENCIA correctamente. Pero cuando salgo del campo(me cambio de registro), el ID_ASISTENCIA_TIPO se mantiene con el cambio, pero la X_ASISTENCIA vuelve a tomar el valor que tenía antes.

El código que estoy usando es el siguiente


Código Delphi [-]
procedure TFormAsistencia.DBGridMateriasCursoKeyPress(Sender: TObject;
  var Key: Char);
begin

  with Sender as TDBGrid do
   if SelectedField.FieldName = 'id_asistencias_tipo' then
   begin
     DataSourceAsistenciasGrid.DataSet.Edit;
     DBGridMateriasCurso.Columns[4].ReadOnly := false;
     Key := UpCase(Key);
     if Upcase(Key) = '1' then
     DataSourceAsistenciasGrid.DataSet.FieldByName('x_asistencia').AsString:= 'Presente';
     if Upcase(Key) = '2' then
     DataSourceAsistenciasGrid.DataSet.FieldByName('x_asistencia').AsString:= 'Ausente';
     if Upcase(Key) = '3' then
     DataSourceAsistenciasGrid.DataSet.FieldByName('x_asistencia').AsString:= 'Tarde';
     if Upcase(Key) = '4' then
     DataSourceAsistenciasGrid.DataSet.FieldByName('x_asistencia').AsString:= 'Retiro Anticipado';
     DBGridMateriasCurso.Columns[4].ReadOnly := true;
   end;


Cual puede ser el problema?

Gracias como siempre por la buena predisposición!


La franja horaria es GMT +2. Ahora son las 04:47:20.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi