![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Как из Table с вычисляемыми полями сделать новую таблицу? [D6, dBase, FoxPro]
Zn © (2003-04-04 10:09:00)Работаю с dbf. Есть таблица Table1 с несколькими вычисляемыми полями. Данные нужно сохранить в виде физической таблицы. Я создал Table2, в которой в FieldsDefs описаны все поля, такие же как и в Table1. Потом делаю Table2.CreateTable и Table2.BatchMove(Table1, batCopy). Table2.CreateTable таблицу создаёт, а Table2.BatchMove выдаёт ошибку "Invalid record structure" и удаляет физическую таблицу (Table2.TableName).
В чём ошибка? Или такая задача решается как-то по-другому?
Соловьев (2003-04-04 11:03:00) [21]
> создал Table2, в которой в FieldsDefs описаны все поля
где это ты описал?
У тебе надо создать таблицу с полями такими как в той что с вычисляемыми, только в ней не должно быть вычисляемых. И в BatchMove прописать в свойстве Mappings соответсвие полей.
Zn (2003-04-04 10:58:00) [22]Код такой:
unit Unit7;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, ComCtrls, StdCtrls,Unit4, Grids, DBGrids, DB, ADODB,DateUtils,
Buttons, Func, ExtCtrls, DBCtrls, Mask, DBTables, ActnList;
type
TForm7 = class(TForm)
BitBtn1: TBitBtn;
Penia: TTable;
Peniakod: TStringField;
Peniavb: TStringField;
Peniard: TStringField;
Peniapg: TStringField;
Peniast: TStringField;
Peniazn: TFloatField;
Peniadateup: TDateField;
Peniavid: TStringField;
PeniaNedoim: TFloatField;
PeniaStruct: TTable;
StringField1: TStringField;
StringField2: TStringField;
StringField3: TStringField;
StringField4: TStringField;
StringField5: TStringField;
FloatField1: TFloatField;
FloatField2: TFloatField;
DateField1: TDateField;
StringField6: TStringField;
procedure BitBtn1Click(Sender: TObject);
procedure PeniaCalcFields(DataSet: TDataSet);
private
{ Private declarations }
public
Dt1, Dt2: string;
{ Public declarations }
end;
var
Form7: TForm7;
implementation
{$R *.dfm}
procedure TForm7.BitBtn1Click(Sender: TObject);
begin
if not PeniaStruct.Exists then PeniaStruct.CreateTable;
PeniaStruct.BatchMove(Penia,batCopy);
end;
procedure TForm7.PeniaCalcFields(DataSet: TDataSet);
begin
PeniaNedoim.AsFloat:=NedoimForSht(Peniavid.AsString,Peniazn.AsFloat);
end;
function NedoimForSht(Vid1: string; Shts: Single): Real;
begin
case StrToInt(Vid1) of
280 : Result:=Shts/0.1;
281 : Result:=Shts/0.2;
282 : Result:=Shts/0.5;
else Result:=0
end;
end;
end.
Соловьев (2003-04-04 10:19:00) [23]поробуй просто в цыкле сохранять. Хотя судя по всему ты что-то со структурой намудрил. Код?