Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Conexión con bases de datos (https://www.clubdelphi.com/foros/forumdisplay.php?f=2)
-   -   Autoguardado en Firedac (https://www.clubdelphi.com/foros/showthread.php?t=94099)

juank1971 31-07-2019 18:50:39

Autoguardado en Firedac
 
Hola amigos, tengo una duda muy sencilla pero no recuerdo cómo hacerlo, y parece que ya me estoy poniendo viejo, porque no encuentro nada al respecto en el foro ni Google.
Alguien me puede decir como hacer que un componente dbcheckbox al marcarlo se actualice directamente en la base de datos, o sea no tener que poner un botón para que se guarden los cambios, que si el usuario lo marca que haga automático el post en la base de datos.

Utilizo Delphi 10.3 rio , base de datos mysql y la conexión en con FDConnection y tengo enlazado el dbcheckbox con una FDQuery. Que tiene en el sql select * from tabla1

gracias

Casimiro Notevi 31-07-2019 20:56:58

No he usado firedac, pero supongo que el dataset tendrá las distintas sql para insertar, editar, borrar y actualizar, no solament el select.

juank1971 31-07-2019 21:06:15

lo que quiero hacer es conectar el componente DBCheckBox a la tabla y que se actualize segun el usuario lo marque solo eso

me da lo mismo como lo hago lo que no encuentro la manera sencilla de hacerlo pense que marcando una propiedad del query que dice autoupdate resolveria pero no funciona ni con el fdtable tampoco .

movorack 31-07-2019 21:21:34

Firedac no tiene una propiedad que haga eso - y no se si algún otro dataset lo haga -, Necesariamente deberás añadir unas cuantas líneas a tu código para que guarde cada vez que haces click en el control.

juank1971 31-07-2019 21:24:15

ok gracias

juank1971 31-07-2019 21:43:45

Ya resolví poniendo esto en el onclick del DBCheckBox
Código Delphi [-]
  procedure TForm1.scDBCheckBox13Click(Sender: TObject);
begin
  FDQuery1.ApplyUpdates(0)
end;


y en el FDQuery le puse la propiedad ApplayUpdate a true, hasta ahora creo que hace lo que necesito que es que abro la aplicación, modifico un DBCheckBox y cierro la aplicación sin hacer más nada cuando la abro de nuevo ya está modificado, eso me sirve para que el usuario no tenga que guardar ningún cambio con eso solo con tocar los controles se guarda automáticamente.

Gracias a todos de todas formas si alguien da alguna idea que no requiera escribir código en los control, porque es una aplicación de Unidad de cuidados intensivos y cada tabla tiene alrededor de 50 campos para marcar y son como 100 tablas asi que tengo que asociar a muchísimos controles ese onclick , no es difícil pero es una solución poco impia, pues si se me quedan onclick sin enlazar en tiempo de diseño luego no hace nada el control en run time.
A lo mejor me encuentran algo que sea solamente a nivel de la capa de datos Firedac u otro componente no me importa mucho pues soy todo ojos.

salud y pesetas gracias a todos por su tiempo.

juniorSoft 01-08-2019 00:53:45

Cita:

pues si se me quedan onclick sin enlazar en tiempo de diseño luego no hace nada el control en run time.
Puedes hacerlo en runtime definiendo un método con un parámetro sender y colocar tu código en dicho método y luego en el evento show del formulario recorrer todos los controles del form con un ciclo preguntando si el control es un dbcheckbox asignarle al evento click el método previamente mencionado.

Saludos,

juniorSoft 01-08-2019 01:06:06

Quizás Otra alternativa mas exótica seria utilizar un Helper para redefinir el evento onclick del componente si este lo permite definiendo tu código de la manera siguiente:

Código:

TFDQuery(TDBCheckBox(Sender).datasource.dataset).ApplyUpdates(0);

juank1971 02-08-2019 14:53:05

Si esa idea del helper esta buena. pero todavía esto que hice no está funcionando muy eficiente, porque que sucede realmente :
Para que no esté mandando la consulta de update constantemente a MySQL con cada click , porque a lo mejor el usuario marca y desmarca y vuelve a marcar y vuelve a desmarcar, debo comprobar primero que si esta modify el FDQuery y creo que lo mejor es hacer el update en el onmouselive cuando el mause abandona el control,
Porque también sucede otra cosa que nunca había comprobado en Delphi, si das un solo click arriba de un control DB conectado a datos cuando chequeas en el fdquery si esta modify no lo está todavía, al parecer en el evento onclick de un control conectado a datos el dataset no se ha refrescado aun cuando ocurre el evento onclick del DBCheckbox.

Si das click en varios DBCheckbox si se cambia la propiedad Modify del FDQuery pero si das click en un solo DBCheckbox no se cambia Modify, entonces creo que voy a hacerlo en el onmouselive y lo que hago es poner una variable global que me guarde el nombre del componente DBCheckbox donde fue hecho el click y en el onmouselive chequeo primero que este el mouse saliendo del control que previmente di clcik para mandar a hacer el Update porque de lo contrario se ejecutaría el update en cada onmouselive de cada control , entonces con esa variable global voy a forzar a hacer un update correctoen el click que se ejecuto previo, no se si me explique. el problema nuevo que me encontre que no sabia que existia es ese que explique antes que cuando tocas con un solo click un control conectado a datos y chequeas el dataset este no ha refrescado los cambios, no encontre ninguna propiedad que cambiara, ni en el datasourse tampoco. pruebenlo y me dicen si les sucede igual.

juank1971 02-08-2019 17:30:43

Amigos esto es lo mas funcional pero cochino que he encontrado, funciona muy bien y hace lo que quiero que en resumen es que el usuario cada vez que toque algun control conectado a datos este se actualiza sin preguntar ni interactuar con el usuario me quedo asi, lo veo on poco feo pero no encuentro otra manera de hacerlo.


este esta ya hecho para varios controles DB cada uno tiene asociado el evento onclick o de lo contrario el evento OnChange a el procedimiento onClickControl y estan conectados a FDQuery 's cada FDQuery hay que ponerle la propiedad CachedUpdates a true:



Código Delphi [-]
procedure TForm1.onClickControl(Sender: TObject);
begin
 if Sender is TDBCheckBox then
    ControlClicked :=  (Sender as TDBCheckBox).Name;
  if Sender is TDBRadioGroup then
    ControlClicked :=  (Sender as TDBRadioGroup).Name;
   if Sender is TDBedit then
    ControlClicked :=  (Sender as TDBedit).Name;
end;

procedure TForm1.onMouseLeaveControl(Sender: TObject);
begin
  if Sender is TDBCheckBox then
  if (sender as TDBCheckBox).Name = ControlClicked then
   begin
    ControlClicked := '';
    TFDQuery(TDBCheckBox(Sender).datasource.dataset).ApplyUpdates(0);
   end;

  if Sender is TDBRadioGroup then
  if (sender as TDBRadioGroup).Name = ControlClicked then
   begin
    ControlClicked := '';
    TFDQuery(TDBRadioGroup(Sender).datasource.dataset).ApplyUpdates(0);
   end;

   if Sender is TDBedit then
  if (sender as TDBedit).Name = ControlClicked then
   begin
    ControlClicked := '';
    TFDQuery(TDBedit(Sender).datasource.dataset).ApplyUpdates(0);
   end;
end;


La franja horaria es GMT +2. Ahora son las 23:39:44.

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