Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Conexión con bases de datos (https://www.clubdelphi.com/foros/forumdisplay.php?f=2)
-   -   Guardar en base de datos desde controles creados en tiempo de ejecucion (https://www.clubdelphi.com/foros/showthread.php?t=85493)

camiz 24-03-2014 22:57:18

Guardar en base de datos desde controles creados en tiempo de ejecucion
 
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.

Código Delphi [-]
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:
Código Delphi [-]
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
Código Delphi [-]
f:= 0;
por
Código Delphi [-]
f:= 1;
porque me botaba error a la hora de guardar y quedo asi...
Código Delphi [-]
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 :)


La franja horaria es GMT +2. Ahora son las 07:04:42.

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