Domanda

Scenerio:

Voglio aggiungere un campo calcolato alla data (qualsiasi) set di dati durante il runtime. Non conosco nessun altro modo per ottenere una struttura di dati diverso da eseguire metodo DataSet.Open.

Ma il metodo Open fa sì che almeno uno fila di un dati deve essere trasferito dal server al client. Poi ho bisogno di chiudere il DataSet, aggiungere il campo e riaprirlo. Si tratta di un sovraccarico unnecessery a mio parere. C'è un modo migliore di fare questo? Si prega di non che io voglio essere in grado di aggiungere un campo calcuated a qualsiasi insieme di dati e non so la sua struttura prima dell'apertura.

In pseudocodice Sembra che questo:

DataSet.Open;
DataSet.Close;
RecreateFieldsStructure;
AddCalculatedField;
DataSet.Open;

Grazie per il vostro tempo.

È stato utile?

Soluzione

È possibile utilizzare il metodo DataSet.FieldDefs.Update. Questo sarà ancora comporta alcun trasferimento di dati, ma nessuna riga sarà recuperato. È possibile chiamare questo metodo in caso BeforeOpen del TDataSet e anche aggiungere i campi calcolati lì.

Ecco un breve esempio che funziona per me:

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;

Altri suggerimenti

Se ho capito bene la tua domanda; si vuole vedere / conoscere la struttura tabelle prima di chiamare il metodo ADOQuery (aperto). se è ciò che si desidera è possibile utilizzare i metodi ADOConnection come (GetFieldNames) e qui un esempio di come ottenere i nomi dei campi della tabella (EMP):

procedure TForm2.Button1Click(Sender: TObject);
var
  lstFields: TStringList;
begin
  lstFields := TStringList.Create;
  try
    ADOConnection1.GetFieldNames('EMP', lstFields);
  finally
    lstFields.Free;
  end;
end;

quindi tutti i nomi i campi sono ora in poi (lstFields). Spero che questo vi aiuterà.

Saluti.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top