Ver Mensaje Individual
  #1  
Antiguo 14-04-2007
leanfreue leanfreue is offline
Miembro
 
Registrado: mar 2007
Posts: 19
Reputación: 0
leanfreue Va por buen camino
Evitar el "Refresh" del ClientDataSet

Hola amigos del foro.
Hace poco comenzé a programar (bue... en realidad, a probar) con Delphi 7 y MySQL.
Estoy haciendo algunas pruebas para ver cuál es la forma más rápida de acceder a los datos, modificarlos, ordenarlos, etc.
Estoy utilizando dbExpress y ClientDataSet para acceder y actualizar datos.
Noté que a medida que aumenta la cantidad de registros de una tabla, el refresh del ClientDataSet tarda cada vez más (ya se, no descubrí la pólvora )

Estoy probando una solución para este problema, y consiste en lo siguiente:

Al agregar un nuevo registro, lo agrego a la base de datos mediante una instrucción SQL en un SQLDataSet (para mí es una opción muy cómoda) y luego, en lugar de hacer un refresh del ClientDataSet, le agrego (mediante insert - post) el nuevo registro.

A continuación les muestro el código que utilizo.

Código Delphi [-]
  // Agregar un cliente.
  self.SQLDataSet2.Close;
  self.DataSource1.Enabled := False;
  self.SQLDataSet2.CommandText :=
  'insert into tbClientes (codCliente, Nombre, apellido, empresa, mostrar)' +
  ' values (' +
  IntToStr(self.cmpCodCliente) + ', ' +
  '"' + self.cmpNomCliente + '", ' +
  '"' + self.cmpApeCliente + '", ' +
  '"' + self.cmpEmpCliente + '", ' +
  '"' + self.cmpMosCliente + '")';
  self.SQLDataSet2.ExecSQL();

  self.SQLDataSet2.Close;
  self.SQLDataSet2.CommandText := 'select last_insert_id()';
  self.SQLDataSet2.Open;
  NewId := self.SQLDataSet2.Fields[0].AsInteger;

// Esto es lo que tarda
// self.ClientDataSet1.Refresh;

  self.DataSource1.Enabled := True;
  with self.ClientDataSet1 do
    begin
      ReadOnly := false;
      Insert;
      FieldByName('idCliente').Value := NewId;
      FieldByName('CodCliente').Value := self.cmpCodCliente;
      FieldByName('Nombre').Value := self.cmpNomCliente;
      FieldByName('Apellido').Value := self.cmpApeCliente;
      FieldByName('Empresa').Value := self.cmpEmpCliente;
      FieldByName('Mostrar').Value := self.cmpMosCliente;
      Post;
      ReadOnly := true;
    end;


Por las pruebas que estuve haciendo, todo funciona perfectamente. Por lo que Uds. se preguntarán: ¿Y qué es lo que querés saber entonces?

El tema es que como no tengo experiencia en esto, no sé si lo que estoy haciendo puede traer algún problema o riesgo, o si hay alguna mejor forma de hacerlo. Por lo que me gustaría que me den su opinión de expertos.

Les pido disculpas si la pregunta es muy ambigua o demasiado amplia.

Desde ya les agradezco su tiempo.

Leandro

Última edición por leanfreue fecha: 14-04-2007 a las 07:00:45.
Responder Con Cita