Tclientdataset.locate

отредактировано 22:25 Раздел: FastScript
Добрый день

Необходимо в скрипт передать реальный 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)

Что я делаю не так?

Заранее благодарен.

Комментарии

  • gpigpi
    отредактировано 22:25
    Может быть, не хватает
    fsMain.AddEnumSet('TLocateOptions', 'loCaseInsensitive, loPartialKey');
  • отредактировано 22:25
    Nick N. написал: »
    Добрый день

    Необходимо в скрипт передать реальный 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)

    Что я делаю не так?

    Заранее благодарен.

    \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\
    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.

  • отредактировано 22:25
    Применение Locate:

    with TDataSet(DM1.cdsReport) do
    begin
    ..............
    KodSaveF0 := FieldByName('f0').AsInteger;
    ...........................
    Locate('f0',KodSaveF0,0);
    ...........................
  • Stalker4Stalker4 123
    отредактировано 22:25
    Nick N.

    Используй метод AddVariable, например так:

    fsScript.AddVariable('MyClientDataSet','TClientDataSet', Integer(MainDataModule.MyClientDataSet));

    Только тебе предварительно надо создать модуль-обертку для TClientDataSet. В качестве примера можещь посмотреть rtti модуля от FS (например fs_ibdertti или fs_iadortti) или модуль fs_iSDRTTI из библиотеки frxSDComponents.
  • отредактировано 22:25
    Nick N. написал: »
    offers.locate('NONAKL',1,loCaseInsensitive)

    Оказалось нужно просто сделать вот так:

    TDataSet(offers).locate('NONAKL',1,loCaseInsensitive)

    Всем спасибо за ответы!

Оставить комментарий

Многофункциональный текстовый редактор. Чтобы отредактировать стиль параграфа, нажмите TAB, чтобы перейти к меню абзаца. Там вы можете выбрать стиль. По умолчанию не выбран ни один стиль. Когда вы выберете текст, появится встроенное меню форматирования. Нажмите TAB, чтобы войти в него. Некоторые элементы, такие как многофункциональные вставки ссылок, картинок, индикаторов загрузки и сообщений об ошибок могут быть вставлены в редактор. Вы можете перемещаться по ним, используя стрелки внутри редактора и удалять с помощью клавиш delete или backspace.