procedure TfrmCaiGouShouLiouRuKuXuanZe.FormShow(Sender: TObject);
begin
// FieldDefs.Add('ID', ftInteger, 0, False);
// FieldDefs.Add('Status', ftString, 10, False);
// FieldDefs.Add('Created', ftDate, 0, False);
// FieldDefs.Add('Volume', ftFloat, 0, False);
// 创建数据集
FDMemTable1.Close();
FDMemTable1.FieldDefs.Clear();
FDMemTable1.FieldDefs.Add('XZ', ftString, 20, false);
FDMemTable1.FieldDefs.Add('mat_no', ftString, 50, false);
FDMemTable1.FieldDefs.Add('sup_no', ftString, 50, false);
FDMemTable1.FieldDefs.Add('mat_nm', ftString, 200, false);
FDMemTable1.FieldDefs.Add('mat_remark', ftString, 200, false);
FDMemTable1.FieldDefs.Add('unit', ftString, 50, false);
FDMemTable1.FieldDefs.Add('pur_qty', ftSingle, 0, False);
FDMemTable1.FieldDefs.Add('chin_qty', ftSingle, 0, False);
FDMemTable1.FieldDefs.Add('jianyi_tqty', ftSingle, 0, False);
FDMemTable1.FieldDefs.Add('chk_qty', ftSingle, 0, False);
FDMemTable1.FieldDefs.Add('vou_no', ftString, 20, false);
FDMemTable1.CreateDataSet();
//循环添加数据
with DST_CAILIAO do
begin
Close;
ParamByName('vou_no').AsString := Self.vou_no;
Open;
First;
while NOT EOF do BEGIN
edit;
FieldByName('jianyi').AsString := '' ;
FDMemTable1.AppendRecord([FieldByName('XZ').AsString,
FieldByName('mat_no').AsString,
FieldByName('sup_no').AsString,FieldByName('mat_nm').AsString,
FieldByName('mat_remark').AsString,FieldByName('unit').AsString,
FieldByName('pur_qty').assingle,FieldByName('chin_qty').assingle,
FieldByName('chk_qty').assingle,FieldByName('chk_qty').assingle,
FieldByName('vou_no').AsString ]);
Next;
END;
end;
// FDMemTable1.AppendRecord([101,101,101, 'aaa']);
cxGrid2DBTableView1.DataController.DataSource := DataSource2;
cxGrid2DBTableView1.OptionsView.ColumnAutoWidth := true;
{以下属性不能启用,否则CellClick和onEditValueChange事件不会生效}
//实现按方向左右键跳到前一个单元格或后一个单元格 , 启用这个属性,oncellClick事件会失效!
// cxGrid1DBTableView1.OptionsBehavior.ImmediateEditor := False; //(立即编辑)把这个属性关闭之后
// 实现按方向左右键跳到前一个单元格或后一个单元格
cxGrid1DBTableView1.OptionsBehavior.AlwaysShowEditor := True;
cxGrid2DBTableView1.OptionsBehavior.AlwaysShowEditor := True;
end;
//在原有数据集上是加不进去的。可以再做一个FDMemtable,然后
FDMemTable_新数据集.FieldDefs.Assign(DataSet_原数据集.FieldDefs);
FDMemTable_新数据集.FieldDefs.Add('新加字段', ftFloat);
FDMemTable_新数据集.CreateDataSet; //建立数据集
//将数据转移过来
FDMemTable_新数据集.CopyDataSet(DataSet_原数据集[coAppend]);
//
while not FDMemTable_新数据集.eof do
begin
FDMemTable_新数据集.edit;
//给新字段赋值 或者用计算字段显示赋值。
FDMemTable_新数据集.Post;
FDMemTable_新数据集.next;
end;
————————————————
其他人写的代码:
procedure TForm1.AddFieldTest;
var
DataFN : String;
TempMemTable : TFDMemTable;
begin
// Added, to avoid relative path for data file name
DataFN := ExtractFilePath(Application.ExeName) + 'Data.Xml';
FDMemTable1.FieldDefs.Add('ID', ftInteger, 0, false);
FDMemTable1.FieldDefs.Add('name', ftString, 30, false);
FDMemTable1.FieldDefs.Add('QualityID', ftInteger, 0, false);
FDMemTable1.CreateDataSet;
// i fill the the table with some value
FDMemTable1.Open;
FDMemTable1.AppendRecord([1, 'Movie1', 1]);
FDMemTable1.AppendRecord([2, 'Movie2', 2]);
FDMemTable1.AppendRecord([3, 'Movie3', 1]);
// after seeing the value on the grid, i push a button and save the table as XML
FDMemTable1.saveToFile(DataFN);
// Added, close the dataset and clear the FieldDefs
// Without the FieldDefs.Clear call, your code produces a "Duplicate field ID" error
FDMemTable1.Close;
FDMemTable1.FieldDefs.Clear;
// now after closing the program and running it again, i want to load the data with a new FieldDef Called Episode with a default value 0
// the table is connected to cxGrid, and the moment i try to load, i get the error i mentioned.
FDMemTable1.FieldDefs.Add('ID', ftInteger, 0, false);
FDMemTable1.FieldDefs.Add('name', ftString, 30, false);
// this line is NEW
FDMemTable1.FieldDefs.Add('Episode', ftInteger, 0, false);
FDMemTable1.FieldDefs.Add('QualityID', ftInteger, 0, false);
FDMemTable1.CreateDataSet;
// check the FieldCount and existence of the Episode field
Caption := IntToStr(FDMemTable1.FieldCount);
Assert(FDMemTable1.FindField('Episode') <> Nil);
// Create a temporary TFDMemTable
TempMemTable := TFDMemTable.Create(Nil);
try
// load the data into the temporary TFDMemTable
TempMemTable.loadFromFile(DataFN);
// copy the data from the temporary TFDMemTable into FDMemTable1
FDMemTable1.CopyDataSet(TempMemTable, [coAppend]);
// check the FieldCount and existence of the Episode field
Caption := IntToStr(FDMemTable1.FieldCount);
Assert(FDMemTable1.FindField('Episode') <> Nil);
finally
TempMemTable.Free;
end;
end;