Lectura de la estructura del conjunto de datos sin leer sus datos
-
22-09-2019 - |
Pregunta
Scenerio:
Quiero agregar un campo calculado al conjunto de datos dado (cualquier) durante el tiempo de ejecución. No conozco ninguna otra forma de obtener una estructura de conjunto de datos que no sea realizar DataSet.Open
método.
Pero el Open
El método hace que al menos una fila de datos debe transferirse de servidor a cliente. Luego necesito cerrar el conjunto de datos, agregar el campo y volver a abrirlo. Esta es una sobrecarga innecesaria en mi opinión. ¿Hay una mejor manera de hacer esto? No es que quiera poder agregar un campo calcado a cualquier conjunto de datos y no conozco su estructura antes de abrir.
En seudocódigo se ve así:
DataSet.Open;
DataSet.Close;
RecreateFieldsStructure;
AddCalculatedField;
DataSet.Open;
Gracias por tu tiempo.
Solución
Puede usar el método DataSet.fielddefs.update. Esto aún implicará alguna transferencia de datos, pero no se obtendrán filas. Puede llamar a este método en el evento BerePen del TDATASET y también agregar los campos calculados allí.
Aquí hay un breve ejemplo que funciona para mí:
procedure TDataModule.cdsExampleBeforeOpen(DataSet: TDataSet);
var I: Integer;
TmpField: TDateTimeField;
begin
// Get field definitions from the server
DataSet.FieldDefs.Update;
// Add calculated field
TmpField := TDateTimeField.Create(DataSet);
with TmpField do
begin
Name := 'Date';
FieldName := 'Date';
DisplayLabel := 'Date';
DisplayFormat := 'ddd ddddd';
Calculated := True;
end;
TmpField.DataSet := DataSet;
// Create fields from field definitions
for I := 0 to DataSet.FieldDefs.Count - 1 do
DataSet.FieldDefs[I].CreateField(DataSet);
end;
Otros consejos
Si entiendo bien tu pregunta; Desea ver/conocer la estructura de las tablas antes de llamar al método Adoquery (Open). Si eso es lo que desea, puede usar los métodos Adoconnection como (GetFieldNames) y aquí un ejemplo de cómo obtener los nombres de campo de la tabla (EMP):
procedure TForm2.Button1Click(Sender: TObject);
var
lstFields: TStringList;
begin
lstFields := TStringList.Create;
try
ADOConnection1.GetFieldNames('EMP', lstFields);
finally
lstFields.Free;
end;
end;
Entonces todos los nombres de los campos están ahora (LSTFIELDS). Espero que esto sea de ayuda.
Saludos.