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.

¿Fue útil?

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.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top