PDA

Ver la Versión Completa : Seleccionar valor para modificar


The Cid James
18-10-2017, 05:48:04
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

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:

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
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:

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:

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
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:

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

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:

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


Algunos enlaces como para ampliar:

Capturar Errores con Try, Finally, End (https://www.clubdelphi.com/foros/showthread.php?t=73448)
Try/except/finally (https://www.clubdelphi.com/foros/showthread.php?t=75680)
try (http://www.delphibasics.co.uk/RTL.asp?Name=try)
finally (http://www.delphibasics.co.uk/RTL.asp?Name=finally)

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 (http://terawiki.clubdelphi.com/Delphi/Manuales/?download=La_Cara_Oculta_De_Delphi_4_pdf_.zip)

Saludos :)