Tclientdataset.locate
Добрый день
Необходимо в скрипт передать реальный TClientDataSet и выполнять операции с ним.
Передаю в скрипт:
fsMAIN.AddClass(TClientDataSet,'TClientDataSet');
fsMAIN.AddObject('offers',dm.Offers);
Из скрипта:
offers.locate('NONAKL',1,loCaseInsensitive)
И в ответ:
Error
Stack overflow 24:21
OK
offers.locate[24:21]('NONAKL',1,loCaseInsensitive)
Что я делаю не так?
Заранее благодарен.
Необходимо в скрипт передать реальный TClientDataSet и выполнять операции с ним.
Передаю в скрипт:
fsMAIN.AddClass(TClientDataSet,'TClientDataSet');
fsMAIN.AddObject('offers',dm.Offers);
Из скрипта:
offers.locate('NONAKL',1,loCaseInsensitive)
И в ответ:
Error
Stack overflow 24:21
OK
offers.locate[24:21]('NONAKL',1,loCaseInsensitive)
Что я делаю не так?
Заранее благодарен.
Комментарии
fsMain.AddEnumSet('TLocateOptions', 'loCaseInsensitive, loPartialKey');
\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\
1. У меня cdsReport (TClientDataSet) расположен в DataModule (DM1)
2. При открытии формы со fsScript в Delphi:
procedure TfFastScriptEdit.FormCreate(Sender: TObject);
begin
fsScript1.Parent := fsGlobalUnit;
fsGlobalUnit.AddForm(DM1);
......
3. В скрипте:
begin
//ShowMessage('Ok');
with TDataSet(DM1.cdsReport) do
begin
DisableControls;
try
First;
while not EOF do
begin
Edit;
try
FieldByName('f41').AsFloat := FieldByName('f17').AsFloat * 34;
FieldByName('f37').AsString := FormatDateTime('yyyy',StrToDate(FieldByName('f10').AsString));
FieldByName('f38').AsString := FormatDateTime('mm',StrToDate(FieldByName('f10').AsString));
FieldByName('f43').AsString := FormatDateTime('dd',StrToDate(FieldByName('f9').AsString));
except
// FieldByName('f41').AsString := 'Error';
end;
Post;
Next;
end;
finally
EnableControls;
end;
//ShowMessage('Ok');
end;
end.
with TDataSet(DM1.cdsReport) do
begin
..............
KodSaveF0 := FieldByName('f0').AsInteger;
...........................
Locate('f0',KodSaveF0,0);
...........................
Используй метод AddVariable, например так:
fsScript.AddVariable('MyClientDataSet','TClientDataSet', Integer(MainDataModule.MyClientDataSet));
Только тебе предварительно надо создать модуль-обертку для TClientDataSet. В качестве примера можещь посмотреть rtti модуля от FS (например fs_ibdertti или fs_iadortti) или модуль fs_iSDRTTI из библиотеки frxSDComponents.
Оказалось нужно просто сделать вот так:
TDataSet(offers).locate('NONAKL',1,loCaseInsensitive)
Всем спасибо за ответы!