PDA

Ver la Versión Completa : Guardar en base de datos desde controles creados en tiempo de ejecucion


camiz
24-03-2014, 22:57:18
hola amigos necesito su ayuda, estoy realizando una aplicación que el usuario diseña su propio formulario y luego lo carga su diseño hasta hay todo bien el problema que tengo es para guardar los datos ingresados en los Edit y Memos he creado este código pero hay un problema que solo me guarda los datos del ultimo control en todos los campos de la tabla, a ver si alguien me da una manito Gracias.

var
Field: TField;
Lista: TList;
f, I: Integer;
Edit: TEdit;
Memo: TMemo;
begin
frmConeccion.Guardar.SQL.Clear;
frmConeccion.Guardar.SQL.Text := 'select * from tabla where idtabla=:id';
frmConeccion.Guardar.Active := True;
frmConeccion.Guardar.Open;
frmConeccion.Guardar.insert;
for f := 1 to frmConeccion.Guardar.FieldCount-1 do
begin
if frmConeccion.Guardar.Fields[f] is TField then
begin
Field := frmConeccion.Guardar.Fields[f] as TField;

Lista := TList.Create;
try
frmPlantilla.ScrollB.GetTabOrderList(Lista);
for I := 0 to Lista.Count - 1 do

if TWinControl(Lista[i]) is TEdit then
Field.AsString := TEdit(Lista[i]).Text
else
if TWinControl(Lista[i]) is TMemo then
Field.AsString := TMemo(Lista[i]).Lines.Text
else
finally
Lista.Free;
end;
end;
end;
frmConeccion.Guardar.Post;
frmConeccion.Guardar.Close;
Application.MessageBox('Registros Guardados correctamente','Mensaje',MB_ICONINFORMATION or MB_OK);
frmConeccion.Guardar.Active := False;

ecfisa
25-03-2014, 01:53:05
Hola camiz.

No estoy seguro de haber interpretado correctamente el planteo..., pero me parece que lo que buscas sería:

var
Lista: TList;
f,i: Integer;
begin
...
Guardar.Open;
Guardar.Insert;
Lista:= TList.Create;
try
GetTabOrderList(Lista);
f:= 0;
for i:= 0 to Lista.Count-1 do
begin
if TControl(Lista[i]) is TCustomEdit then
begin
if TCustomEdit(Lista[i]) is TEdit then
begin
Guardar.Fields[f].AsString:= TEdit(TCustomEdit(Lista[i])).Text;
Inc(f);
end;
if TCustomEdit(Lista[i]) is TMemo then
begin
Guardar.Fields[f].AsString:= TMemo(TCustomEdit(Lista[i])).Lines.Text;
Inc(f);
end;
end;
end;
finally
Lista.Free;
end;
Guardar.Post;
Guardar.Close;
MessageBox(0, 'Registros Guardados correctamente', 'Mensaje', MB_ICONINFORMATION + MB_OK);
end;

Es claro que la tabla deberá poseer una cantidad de campos suficiente para albergar a la suma de edits y memos existentes en el form...

Me surge una pregunta, ¿ Por que no usar TDBEdit y TDBMemo ?

Saludos :)

camiz
25-03-2014, 04:37:20
ecfisa, eres un genio un grandicimo gracias por tu ayuda. Tu código funciona perfecto...

solo tuve que cambiarle
f:= 0;
por
f:= 1;
porque me botaba error a la hora de guardar y quedo asi...
var
Lista: TList;
f,i: Integer;
begin
with frmConeccion do
begin
Guardar.SQL.Clear;
Guardar.SQL.Text := 'select * from tabla where idtabla=:id';
Guardar.Active := True;
Guardar.Open;
Guardar.Insert;
Lista:= TList.Create;
try
frmPlantilla.ScrollB.GetTabOrderList(Lista);
f:= 1;
for i:= 0 to Lista.Count-1 do
begin
if TControl(Lista[i]) is TCustomEdit then
begin
if TCustomEdit(Lista[i]) is TEdit then
begin
Guardar.Fields[f].AsString:= TEdit(TCustomEdit(Lista[i])).Text;
Inc(f);
end;
if TCustomEdit(Lista[i]) is TMemo then
begin
Guardar.Fields[f].AsString:= TMemo(TCustomEdit(Lista[i])).Lines.Text;
Inc(f);
end;
end;
end;
finally
Lista.Free;
end;
Guardar.Post;
Guardar.Close;
Guardar.Active := False;
MessageBox(0, 'Registros Guardados correctamente', 'Mensaje', MB_ICONINFORMATION + MB_OK);
end;

con respecto a tu pegunta : ¿ Por que no usar TDBEdit y TDBMemo ?
uso TEdit y TMemo, porque todos los datos ingresados en estos se va ha guardar encriptado en la base de datos y para modificarlos se va ha desencriptar los datos y mostrar en Los Edit y Memo, y al usar TDBEdit y TDBMemo se me complica la vida.

ecfisa
25-03-2014, 05:00:13
Hola camiz.

Me alegra que te haya servido.^\||/

Gracias por publicar el código final y aclarar mi duda.

Saludos :)