Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Providers (https://www.clubdelphi.com/foros/forumdisplay.php?f=10)
-   -   Actualizar ClientDataSet usando TADOQuery y DataSetProvider (https://www.clubdelphi.com/foros/showthread.php?t=81582)

Walterio 27-11-2012 16:45:52

Actualizar ClientDataSet usando TADOQuery y DataSetProvider
 
Hola a todos...
Estoy haciendo mis primeros pasos con clientdatasets, providers y esas cosas y me atacó una duda:
Escenario de trabajo : MySQL y Delphi 6.
Tengo un TADOQuery con una consulta, un DataSetProvider, un DataSource y un ClientDataSet, todos con su debida conexión que me muestra el resultado de una consulta en una grilla.Hasta aquí todo funciona perfecto, pero lo que necesito es modificar la consulta para obtener otros datos y en base al resultado de esa consulta actualizar el ClientDataSet y mostrar los nuevos datos en la grilla.
Es decir, mediante un TEdit escribo una consulta, lo ejecuta el TADOQuery bien, pero no se reflejan los cambios en el ClientDataSet, por ende, tampoco en la grilla, ¿de que forma puedo hacer que al actualizar la consulta se reflejen los datos en el clientdataset y la grilla?.
Desde ya, muchas gracias.

Al González 27-11-2012 17:35:58

Para que todos los cambios hechos sobre el ClientDataSet se guarden en la base de datos, debes llamar a su método ApplyUpdates. En cuanto al DataSetProvider, conviene que mantengas su propiedad ResolveToDataSet en False; así cada alta, baja o cambio de registro lo traducirá en la respectiva instrucción SQL que emitirá al servidor usando de forma directa el componente conexión (en tu caso el ADOConnection).

No olvides revisar también las propiedades UpdateMode y ProviderFlags. En la ayuda y en este foro hay bastante material sobre el tema.

Saludos. :)

Walterio 27-11-2012 18:02:43

Muchas gracias por la pronta respuesta Al, me imaginaba que recibiria alguna respuesta de tu parte, ya te tengo catalogado como el "Master of TClientDataSet".
Perdón por no ser mas explícito (de todas formas tu correo me sacó otras dudas), pero lo que yo hago son consultas de Select, no tengo que actualizar datos de la base de datos, simplemente hago un Select con determinadas características y listo, el problema pasa porque la primer consulta me trae bien los datos, pero cuando le cambio la sentencia por otro, se ejecuta bien, pero no me actualiza los datos del clientdataset.Por ahora lo que hago cada vez que realizo una nueva consulta es esto :

Código Delphi [-]
     cdsLookUp.EmptyDataSet ;

     TDBO.buscoReg('Select * from ' + Trim(sNomTablaLookup.Text) + ' where ' + sWhere, sqlDatos);

     sqlDatos.First;

      While (not sqlDatos.Eof) do
      Begin
        cdsLookUp.Append;
        CopyDataSetRecord(sqlDatos, cdsLookUp);
        cdsLookUp.Post;
        sqlDatos.Next;
      End; 

//TDBO.buscoReg es una función mia que se encarga de todo lo que es la ejecución de la misma y funciona perfecto.

No me parece la manera mas correcta, pero al menos actualizo el clientdataset y por ende, la grilla, pero seguramente debe haber otra forma.
Saludos y gracias.

Al González 27-11-2012 19:00:35

Cita:

Empezado por Walterio (Mensaje 450655)
[...] te tengo catalogado como el "Master of TClientDataSet".

Antes de que se haga un rumor de eso, he de decir que hay muchas cosas de TClientDataSet que todavía no he utilizado, como el almacenamiento en XML, los campos de sumario (aggregate fields) o la propiedad CommandText, con la cual podrías resolver el problema que planteas.

Cita:

Empezado por Ayuda de Delphi 7 (la más completa y accesible)
Specifies an SQL command to be executed by the database server.

property CommandText: string;

CommandText specifies what data the client dataset wants to receive from its (internal or external) provider. It is either
  • An SQL statement (query) for the database server to execute.
  • The name of a table or stored procedure.

If the client dataset uses an internal provider, CommandText is required.

If the client dataset uses an external provider component, CommandText represents a replacement for the property that the source dataset uses to identify its data (the SQL of a query, or the name of a table or stored procedure). If the provider’s Options property does not include poAllowCommandText (which, by default, it does not), then CommandText has no effect.

When CommandText is a non-empty string, its value is sent to the provider when the client dataset opens or when you call the Execute method. The specified SQL command, table, or stored procedure overrides the current value of the provider’s associated dataset.

If the SQL statement takes parameters, be sure that they are in the correct order, as the provider performs parameter binding on CommandText statements by index only.

Saludos. :)

Walterio 27-11-2012 20:01:00

Nuevamente Al, dándole en el clavo.El commandtext es lo que necesitaba.Has revalidado el título, y aunque digas que te falta, para mí sos un gurú del ClientDataSet.

Muchísimas gracias.

Saludos.


La franja horaria es GMT +2. Ahora son las 00:01: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