Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > Conexión con bases de datos
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Conexión con bases de datos

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 31-07-2019
juank1971 juank1971 is offline
Miembro
 
Registrado: feb 2008
Posts: 230
Poder: 17
juank1971 Va por buen camino
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
Responder Con Cita
  #2  
Antiguo 31-07-2019
Avatar de Casimiro Notevi
Casimiro Notevi Casimiro Notevi is offline
Moderador
 
Registrado: sep 2004
Ubicación: En algún lugar.
Posts: 32.040
Poder: 10
Casimiro Notevi Tiene un aura espectacularCasimiro Notevi Tiene un aura espectacular
No he usado firedac, pero supongo que el dataset tendrá las distintas sql para insertar, editar, borrar y actualizar, no solament el select.
Responder Con Cita
  #3  
Antiguo 31-07-2019
juank1971 juank1971 is offline
Miembro
 
Registrado: feb 2008
Posts: 230
Poder: 17
juank1971 Va por buen camino
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 .
Responder Con Cita
  #4  
Antiguo 31-07-2019
Avatar de movorack
[movorack] movorack is offline
Miguel A. Valero
 
Registrado: feb 2007
Ubicación: Bogotá - Colombia
Posts: 1.346
Poder: 20
movorack Va camino a la famamovorack Va camino a la fama
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.
__________________
Buena caza y buen remar... http://mivaler.blogspot.com
Responder Con Cita
  #5  
Antiguo 31-07-2019
juank1971 juank1971 is offline
Miembro
 
Registrado: feb 2008
Posts: 230
Poder: 17
juank1971 Va por buen camino
ok gracias
Responder Con Cita
  #6  
Antiguo 31-07-2019
juank1971 juank1971 is offline
Miembro
 
Registrado: feb 2008
Posts: 230
Poder: 17
juank1971 Va por buen camino
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.
Responder Con Cita
  #7  
Antiguo 01-08-2019
juniorSoft juniorSoft is offline
Miembro
 
Registrado: abr 2005
Posts: 178
Poder: 20
juniorSoft Va por buen camino
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,
Responder Con Cita
  #8  
Antiguo 01-08-2019
juniorSoft juniorSoft is offline
Miembro
 
Registrado: abr 2005
Posts: 178
Poder: 20
juniorSoft Va por buen camino
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);
Responder Con Cita
  #9  
Antiguo 02-08-2019
juank1971 juank1971 is offline
Miembro
 
Registrado: feb 2008
Posts: 230
Poder: 17
juank1971 Va por buen camino
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.
Responder Con Cita
  #10  
Antiguo 02-08-2019
juank1971 juank1971 is offline
Miembro
 
Registrado: feb 2008
Posts: 230
Poder: 17
juank1971 Va por buen camino
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;
Responder Con Cita
Respuesta



Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro

Temas Similares
Tema Autor Foro Respuestas Último mensaje
MySQL con Firedac muli Desarrollo en Delphi para Android 4 17-05-2018 19:35:19
FireDac+OldValue Luis M. Conexión con bases de datos 3 15-02-2016 02:07:24
Uso de Firedac jafera Conexión con bases de datos 2 12-11-2014 12:46:25
Problema con FireDac darkamerico Conexión con bases de datos 2 04-11-2014 14:05:16
Firedac Aldo Conexión con bases de datos 2 16-12-2013 22:26:07


La franja horaria es GMT +2. Ahora son las 17:28:57.


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
Copyright 1996-2007 Club Delphi