PDA

Ver la Versión Completa : Guardar columna dbgrid en un solo campo de una bd


exequielmatias1
24-08-2013, 01:38:20
Holaa! Queria saber si se puede guardar una columna de un dbgrid en un solo campo de una base de datos.

Tengo un dbgrid que me muestra el resultado de una consulta anterior en una sola columna ej "Nombres"
todos esos Nombres que me muestra el dbgrid quiero guardarlos en un solo campo (deudores) de una base de datos.
por ej el dbgrid me muestra lo siguiente:

Nombres
--------
Pablo
Pedro
Lucas

y en el campo Deudores de mi base de datos quiero que se guarden estos nombres ej
Pablo, Pedro, Lucas

ecfisa
24-08-2013, 02:06:35
Hola.


procedure SaveCol(aGrid: TDBGrid; const ColNro: Integer;
aDataSet: TDataSet; const aFieldName: string);
var
BM: Pointer;
s : string;
begin
with aGrid.DataSource.DataSet do
begin
DisableControls;
BM := GetBookmark;
try
First;
while not Eof do
begin
s := s + aGrid.Columns[ColNro].Field.AsString + ',';
Next;
end;
SetLength(s,Length(s)-1);
finally
GotoBookmark(BM);
FreeBookmark(BM);
EnableControls;
end;
end;
with aDataSet do
begin
Append;
FieldByName(aFieldName).AsString := s;
Post;
end;
end;


Ejemplo de uso:

// Se supone a DataSet1 abierto
SaveCol(DBGrid1, 1, DataSet1, 'Campo');


Saludos :)

exequielmatias1
24-08-2013, 17:55:48
Holaaa!! gracias por tu rapida contestación! lo probe y me aparece este error: 'list index out of bounds (1)' probe con 0 y corrio sin errores pero no se guarda nada en la bd, sinceramente no tengo mucho conocimiento en delphi, no sabria como solucionar este error..
otra consulta.. entiendo que en DataSet1 debo poner mi ADOQuery donde tengo enlazada a la tabla destino...

ecfisa
24-08-2013, 19:13:44
Hola.

lo probe y me aparece este error: 'list index out of bounds (1)' probe con 0 y corrio sin errores

Si tu DBGrid tiene una sola columna es un error lógico y esperable, la primer columna tiene índice 0.


pero no se guarda nada en la bd, sinceramente no tengo mucho conocimiento en delphi, no sabria como solucionar este error..

En el ejemplo supongo que existe un componente data aware que, TDataSource mediante, está asociado al TDBGrid y otro que, en tu caso puede ser un TADOTable, TADODataSet o un TADOQuery.

No sé cuál de ellos te decidas a usar para guardar los datos en la otra tabla de acuerdo a eso será la sintáxis a usar. La del ejemplo funcionaría bién para un TADOTable o un TADODataSet.

Saludos. :)

ecfisa
24-08-2013, 19:37:33
Hola de nuevo.

Para no dejar las tareas a medias, un ejemplo usando un TDBGrid con una sola columna, asociado a un TADOQuery y un TADODataSet asociado a la tabla destino.


procedure SaveCol(aGrid: TDBGrid; const ColNro: Integer;
aDataSet: TADODataSet; const TargetFieldName: string);
var
BM: Pointer;
s : string;
begin
// Armar cadena desde la tabla destino
with aGrid.DataSource.DataSet do
begin
DisableControls;
BM := GetBookmark;
try
First;
while not Eof do
begin
s := s + aGrid.Columns[ColNro].Field.AsString + ',';
Next;
end;
SetLength(s,Length(s)-1);
finally
GotoBookmark(BM);
FreeBookmark(BM);
EnableControls;
end;
end;
// Guardar resultado en campo de tabla destino
with aDataSet do
begin
Append;
FieldByName(TargetFieldName).AsString := s;
Post;
end;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
SaveCol(DBGrid1, 0, ADODataSet1, 'NAME');
end;

El ejemplo está probado y funcionando.


Saludos. :)