Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Varios (https://www.clubdelphi.com/foros/forumdisplay.php?f=11)
-   -   Seleccionar valor para modificar (https://www.clubdelphi.com/foros/showthread.php?t=92389)

The Cid James 18-10-2017 05:48:04

Seleccionar valor para modificar
 
Bueno tengo dbgrid con una lista (en este caso muestra los datos de clientes) ahora mi problema es el siguiente.
Quiero que el cliente seleccionado me abra un nuevo form en modo de edición, para cambiar los datos si es que fuera necesario llamando a otro form creado para tal fin ahora el problema que tengo es que solo toma el valor del primer cliente no importa cual sea el cliente que haya marcado en el dbgrid.

Este es el codigo que estoy usando en el boton

Código Delphi [-]
procedure TfListadoCliente.bModificarClick(Sender: TObject);
begin
  fmodulo.tCliente.Active := true;
    if fmodulo.qCliente.Locate('id_cliente', fmodulo.qCliente['id_cliente'], []) = true
  then
    begin
      fmodulo.tCliente.Edit;
      tfcliente.Create(self).ShowModal;
    end;
        fmodulo.tCliente.Active := false;
        fmodulo.qCliente.Refresh;
end;

Lo que en teoría hace es si encuentra el id del cliente me muestra los datos del cliente para poder editarlos, pero como dije solo me busca el valor del primero en la lista no importa cual haya seleccionado.
Desde ya muchas gracias por su tiempo

ecfisa 18-10-2017 14:03:59

Hola.

Si el TDBGrid estuviese enlazado con la tabla cliente (qCliente), sería innecesario todo ese código de posicionamiento, ya que al moverte de fila en el DBGrid lo estas haciendo en la tabla. Se podría decir que el componente DBGrid es una representación visual de los datos de la tabla.

Ahora, si el DBGrid está representando los datos de una consulta en la que intervienen mas de una tabla, por favor explica mas detalladamente la relación DBGrid/Tabla y los campos que intervienen conformando las columnas.

Saludos :)

The Cid James 18-10-2017 20:51:05

De echo efectivamente esta directamente enlazado a la tabla qClientes pero no toma ningún otro valor que no sea el primero del DBGrid

ecfisa 18-10-2017 22:08:46

Hola.

Ahora creo entender... ¿ Estas usando un Query (qCliente) para alimentar el DBGrid y un DataSet (tCliente) para realizar los cambios no ?

Entonces el problema es el siguiente:
Código Delphi [-]
  fmodulo.tCliente.Active := true;
    if fmodulo.qCliente.Locate('id_cliente', fmodulo.qCliente['id_cliente'], []) = true // <== (1)
  then
    begin
      fmodulo.tCliente.Edit;
      tfcliente.Create(self).ShowModal;
    end;
        fmodulo.tCliente.Active := false;  // <=== ¡¡¡  (2) !!!
        fmodulo.qCliente.Refresh;
(1) ¿ El Locate no deberías aplicarlo al DataSet ?
(2) Esa línea elimina el posicionamiento anterior del Locate y el DataSet (tCliente), siempre queda apuntando al primer registro del DataSet.

Saludos :)

The Cid James 19-10-2017 00:12:03

Cita:

Empezado por ecfisa (Mensaje 521815)
Hola.

Ahora creo entender... ¿ Estas usando un Query (qCliente) para alimentar el DBGrid y un DataSet (tCliente) para realizar los cambios no ?

Entonces el problema es el siguiente:
Código Delphi [-]
  fmodulo.tCliente.Active := true;
    if fmodulo.qCliente.Locate('id_cliente', fmodulo.qCliente['id_cliente'], []) = true // <== (1)
  then
    begin
      fmodulo.tCliente.Edit;
      tfcliente.Create(self).ShowModal;
    end;
        fmodulo.tCliente.Active := false;  // <=== ¡¡¡  (2) !!!
        fmodulo.qCliente.Refresh;
(1) ¿ El Locate no deberías aplicarlo al DataSet ?
(2) Esa línea elimina el posicionamiento anterior del Locate y el DataSet (tCliente), siempre queda apuntando al primer registro del DataSet.

Saludos :)

1-Como lo aplico al dataset?
2-entonces como cerraría la consulta para que no quede activa?

Gracias por la ayuda

ecfisa 19-10-2017 04:14:52

Hola.

No puedo saber con seguridad la lógica que has implementado, pero suponiendo que fListadoClientes es el form que tiene el DBGrid y el Button, fcliente el form donde se editan los datos y fmodulo el DataModule donde residen qCliente y tCliente, creo que podrías hacer:
Código Delphi [-]
procedure TfListadoCliente.bModificarClick(Sender: TObject);
begin
  fmodulo.tCliente.Active := true;
  if fmodulo.tCliente.Locate('id_cliente', fmodulo.qCliente['id_cliente'], []) then
  begin
    fmodulo.tCliente.Edit;
    fcliente := Tfcliente.Create(Self);
    try
      fcliente.ShowModal;
    finally
      fcliente.Free;
    end;
  end;
  fmodulo.tCliente.Active := false;
  fmodulo.qCliente.Refresh;
end;
Eso tratando de respetar lo mas posible el código original y suponiendo que esa es tu organización...

Saludos :)

The Cid James 19-10-2017 22:55:48

Muchas gracias por tu tiempo, hoy se me complico un poco el día mañana lo pruebo con tiempo y calma

The Cid James 20-10-2017 16:28:55

Cita:

Empezado por ecfisa (Mensaje 521820)
Hola.

No puedo saber con seguridad la lógica que has implementado, pero suponiendo que fListadoClientes es el form que tiene el DBGrid y el Button, fcliente el form donde se editan los datos y fmodulo el DataModule donde residen qCliente y tCliente, creo que podrías hacer:
Código Delphi [-]
procedure TfListadoCliente.bModificarClick(Sender: TObject);
begin
  fmodulo.tCliente.Active := true;
  if fmodulo.tCliente.Locate('id_cliente', fmodulo.qCliente['id_cliente'], []) then
  begin
    fmodulo.tCliente.Edit;
    fcliente := Tfcliente.Create(Self);
    try
      fcliente.ShowModal;
    finally
      fcliente.Free;
    end;
  end;
  fmodulo.tCliente.Active := false;
  fmodulo.qCliente.Refresh;
end;
Eso tratando de respetar lo mas posible el código original y suponiendo que esa es tu organización...

Saludos :)

Funciona de maravilla, ahora es muy distinto a que entienda lo que hace, por lo cual te voy a preguntar que quieren decir estas declaraciones, asi aprendo que hiciste xD y de paso aprendo

Código Delphi [-]
  try 
      fcliente.ShowModal; => esta si entiendo
    finally
      fcliente.Free;
    end;

ecfisa 20-10-2017 17:41:31

Hola.

Se utilizan para garantizar que cuando solicitamos un recurso este sea devuelto, evitando así perdidas de memoria.

Básicamente:
Código:

  pedir un recurso
  intentar usarlo (try)
    usarlo
  finalmente (finally)
    devolver el recurso
  fin

Algunos enlaces como para ampliar:También te recomiendo leer el capítulo 11 de la Cara oculta de Delphi 4 que trata muy bien el tema y que podes descargar desde el FTP de Club Delphi

Saludos :)


La franja horaria es GMT +2. Ahora son las 18:12:33.

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