PDA

Ver la Versión Completa : Error en DBGrid


Tecnofacil
10-07-2017, 14:31:07
No sabia como poner el titulo, básicamente lo que hago es poner dbcheck en dos columnas de un dbgrid, lo que necesito es que al hacer clic en el check de la segunda columna verifique, que si la primer columna esta tildada permita tildar sino que me avise, el problema es que luego del aviso, intento tildar la primer columna y me sigue tirando el mismo mensaje, revise el código y esta bien, en un paso a paso me di cuenta que cuando le doy clic a la columna "autorizado" ( o sea la primera), me sigue tomando como que clique la segunda.
https://goo.gl/photos/jpHHPQQBpk337Um5A

oscarac
10-07-2017, 15:52:44
pon algo de código, lamentablemente la imagen que has colocado al menos yo, no la puedo ver

Tecnofacil
10-07-2017, 16:48:46
en la primer columna tengo un tilde "autorizado" al darle clic se ejecuta este codigo
if Column.FieldName='auto' then // Se le doy clic al check que se encuentra en la columna 'Autorizado'
begin
if fdq_maestroauto.value = 1 then //Si esta tildado pregunto
begin
if Application.MessageBox('El pedido aún no esta autorizado, Confirma?','Atención',MB_YESNO)=id_yes then
begin
fdq_maestroauto.value := 0; // si responde 'Si' destildo
fdq_maestro.Post;
Dbgrid1.Repaint;
end;
end
else //Si no esta tildado pregunto
begin
if Application.MessageBox('El pedido ya esta autorizado o no requiere CAI, Confirma?','Atención',MB_YESNO)=id_yes then
begin
fdq_maestroauto.value := 1; //Si responde si Tildo
fdq_maestro.Post;
Dbgrid1.Repaint;
end;
end;
end;



Hasta ahí todo bien, la idea es que al darle clic al segundo check, de la segunda columna sería, verifique si el primer check esta tildado, o mejor dicho, si el valor del campo "auto" es 1.
if Column.FieldName='armado' then
begin
if fdq_maestroarmado.value = 1 then
begin
if Application.MessageBox('El pedido aún no esta armado, Confirma?','Atención',MB_YESNO)=id_yes then
begin
fdq_maestroarmado.value := 0;
fdq_maestro.Post;
Dbgrid1.Repaint;
end;
end
else
begin
if fdq_maestroauto.Value = 1 then // verifico si el campo anterior esta tildado
begin
if Application.MessageBox('El pedido ya esta armado, Confirma?','Atención',MB_YESNO)=id_yes then
begin
fdq_maestroarmado.value := 1;
fdq_maestro.Post;
Dbgrid1.Repaint;
end;
end
else
begin
MessageBox(0, 'El pedido figura como "No autorizado"', 'ATENCIÓN', MB_ICONWARNING or MB_OK);
DBGrid1.Refresh;
end;
end;
end;


Tambien funciona de mil maravillas, pero... si luego de que se ejecute este código le doy de nuevo a la primer columna, (FieldName = 'auto'), me vuelve a mostrar el mensaje de que no esta autorizado, y en el paso a paso corrobore que en esta linea de código
if Column.FieldName='auto' then
El valor de FieldName es = 'armado' en lugar de ser 'auto' que es la columna que estoy dándole clic. Es como si la variable FieldName no se actualizara.

oscarac
10-07-2017, 16:54:30
en que evento se esta ejecutando ese código?

olbeup
11-07-2017, 08:15:08
Hola Tecnofacil (http://www.clubdelphi.com/foros/member.php?u=85159),

Esto posible que tengas que hacer un "fdq_maestro.Edit" antes de asignar ningún valor y después hacer un "fdq_maestro.Post", no veo que estes editando el registro.

Un Saludo.

Tecnofacil
11-07-2017, 13:10:32
Oscarac; en el evento OnCellClick (DBGrid1CellClick), pero me parece Olbeup (Pueblo) tiene razón, el edit esta al principio del código y el Post al final, pero dependiendo de la situación la verificación se lleva a cabo antes de que se haga el Post, de allí el problema, no puse el código entero porque es bastante extenso todo ese evento, (de allí que se me cruzan los cables).

Casimiro Notevi
11-07-2017, 13:28:02
no puse el código entero porque es bastante extenso Pues no podemos adivinar :p, así que tendrás que ponerlo, y si es muuuuuuy grande, comprímelo a zip y lo adjuntas :)

oscarac
11-07-2017, 15:46:31
Oscarac; en el evento OnCellClick (DBGrid1CellClick), pero me parece Olbeup (Pueblo) tiene razón, el edit esta al principio del código y el Post al final, pero dependiendo de la situación la verificación se lleva a cabo antes de que se haga el Post, de allí el problema, no puse el código entero porque es bastante extenso todo ese evento, (de allí que se me cruzan los cables).

ahhhh pues.....

Tecnofacil
12-07-2017, 13:52:53
Les dejo el código a ver si pueden detectar algun error que se me pase. Cada columna tiene un checkbox, si le doy clic a la segunda columna verifica si la primera no esta tildad me impide tildar la segunda, el problema es que luego al intentar tildar la primera me sigue mostrando el mensaje y al depurar veo que me sigue tomando como si el clic se hizo en la segunda columna. (Hago clic en 'auto' y me dice que se hizo clic en 'armado'


procedure TF_Pedidosproceso.DBGrid1CellClick(Column: TColumn);
begin
fdq_maestro.Edit;
if Column.FieldName='auto' then // Si le doy clic al check que se encuentra en la columna 'Autorizado'
begin
if fdq_maestroauto.value = 1 then //Si esta tildado pregunto
begin
if Application.MessageBox('El pedido aún no esta autorizado, Confirma?','Atención',MB_YESNO)=id_yes then
begin
fdq_maestroauto.value := 0; // si responde 'Si' destildo
fdq_maestro.Post; //Grabo
Dbgrid1.Repaint;
end;
end
else //Si no esta tildado pregunto
begin
if Application.MessageBox('El pedido ya esta autorizado o no requiere CAI, Confirma?','Atención',MB_YESNO)=id_yes then
begin
fdq_maestroauto.value := 1; //Si responde si Tildo
fdq_maestro.Post;
Dbgrid1.Repaint;
end;
end;
end;

if Column.FieldName='armado' then
begin
if fdq_maestroarmado.value = 1 then
begin
if Application.MessageBox('El pedido aún no esta armado, Confirma?','Atención',MB_YESNO)=id_yes then
begin
fdq_maestroarmado.value := 0;
fdq_maestro.Post;
Dbgrid1.Repaint;
end;
end
else
begin
if fdq_maestroauto.Value = 1 then // verifico si el campo anterior esta tildado
begin
if Application.MessageBox('El pedido ya esta armado, Confirma?','Atención',MB_YESNO)=id_yes then
begin
fdq_maestroarmado.value := 1;
fdq_maestro.Post;
Dbgrid1.Repaint;
end;
end
else
begin
MessageBox(0, 'El pedido figura como "No autorizado"', 'ATENCIÓN', MB_ICONWARNING or MB_OK);
close;
end;
end;
end;

if Column.FieldName='original' then
begin
if fdq_maestrooriginal.value = 1 then
begin
if Application.MessageBox('Original aún no esta listo, Confirma?','Atención',MB_YESNO)=id_yes then
begin
fdq_maestrooriginal.value := 0;
fdq_maestro.Post;
Dbgrid1.Repaint;
end;
end
else
begin
if Application.MessageBox('Original listo, Confirma?','Atención',MB_YESNO)=id_yes then
begin
fdq_maestrooriginal.value := 1;
fdq_maestro.Post;
Dbgrid1.Repaint;
end;
end;
end;

if Column.FieldName='chapa' then
begin
if fdq_maestrochapa.value = 1 then
begin
if Application.MessageBox('Chapa aún no esta lista, Confirma?','Atención',MB_YESNO)=id_yes then
begin
fdq_maestrochapa.value := 0;
fdq_maestro.Post;
Dbgrid1.Repaint;
end;
end
else
begin
if Application.MessageBox('Chapa lista, Confirma?','Atención',MB_YESNO)=id_yes then
begin
fdq_maestrochapa.value := 1;
fdq_maestro.Post;
Dbgrid1.Repaint;
end;
end;
end;
if Column.FieldName='impreso' then
begin
if fdq_maestroimpreso.value = 1 then
begin
if Application.MessageBox('El pedido aún no esta Impreso, Confirma?','Atención',MB_YESNO)=id_yes then
begin
fdq_maestroimpreso.value := 0;
fdq_maestro.Post;
Dbgrid1.Repaint;
end;
end
else
begin
if Application.MessageBox('Pedido listo, Confirma?','Atención',MB_YESNO)=id_yes then
begin
fdq_maestroimpreso.value := 1;
fdq_maestro.Post;
Dbgrid1.Repaint;
end;
end;
end;
if Column.FieldName='armado2' then
begin
if fdq_maestroarmado2.value = 1 then
begin
if Application.MessageBox('El pedido aún no fue armado, Confirma?','Atención',MB_YESNO)=id_yes then
begin
fdq_maestroarmado2.value := 0;
fdq_maestro.Post;
Dbgrid1.Repaint;
end;
end
else
begin
if Application.MessageBox('Armado final listo, Confirma?','Atención',MB_YESNO)=id_yes then
begin
fdq_maestroarmado2.value := 1;
fdq_maestro.Post;
Dbgrid1.Repaint;
end;
end;
end;
end;
Por lo pronto lo que hago es cerrar el form y forzar la liberación de esas variables