20.1. TssNetDataSet

TssNetDataSet использует данные, полученные от сервера приложений Tillypad. Он возвращает несколько наборов, если в запросе имеется несколько предложений SELECT. Эти наборы так же называют потоками. Также, отправка изменений на сервер формируется сразу для нескольких таблиц и применяется в одной транзакции. В поле Streams описываются имена потоков через точку с запятой(;) с указанием ключевого поля в скобках. По имени потока с данными связываются дочерние датасеты и определяется имя таблицы, в которой сохраняются изменения.

Его основной инструмент – редактор свойства Query:

Как уже говорилось, здесь задаётся описание Streams и SQL. Скрипты Modify SQL Before

и Modify SQL After исполняются до и после применения изменений в той же транзакции.

Набор самого датасета возвращается из потока, указанного в свойстве StreamName в Object Inspector (OI), или по умолчанию из первого потока.

Сервер приложений Tillypad расширяет язык запросов использованием параметров. Они передаются в запрос с помощью свойства TssNetDataSet.Params. В запросе они начинаются с символа % и имеют следующие типы:

В DelphiНа сервере
AsBoolean: BooleanBIT
AsInteger: Int64INT
AsGUID: TGUIDUNIQUEIDENTIFIER
AsFloat: DoubleNUMERIC
AsDateTime: TDateTimeDATETIME
AsAnsiString: AnsiStringVARCHAR
AsString: StringNVARCHAR
AsBLOB: RawByteStringBINARY
AsTable: TssDataStorageТаблица

То есть, параметр заданный в коде Delphi как AsTable можно использовать в запросе как обычную таблицу:

procedure TfmForm.dsItemsBeforeOpen(DataSet: TssDataSet);
  begin
    dsItems.Params.ParamByName('%Filter').AsTable := FFilterTable;
  end;
      

SQL:

SELECT *
  FROM SomeTable T
  JOIN %Filter F ON F.item_ID = T.item_ID
      

Отладка запросов с параметрами доступна в отладчике запросов Менеджера.

Сохранение изменений на сервер вызывается методом ApplyUpdates. TssNetDataSet формирует параметры Inserted, Updated и Deleted для каждого потока и отправляет их на сервер приложений, который формирует и запускает соответствующие скрипты SQL. Параметры можно предварительно обрабатывать на клиенте в событии OnApplyUpdates.

Допустим, наш датасет возвращает два потока, описанных в Streams:

InputDocuments(idoc_ID);InputDocumentItems(idit_ID)
    

Мы хотим изменить данные перед отправкой на сервер:

procedure TfmInputDocumentsEditor.EditDataSetOnApplyUpdates(Sender: TssNetDataSet;
  Params: TssParams);
  var
    P: TssParam;
    i: Integer;
  begin
    with Params do begin
      P := FindParamByName('InputDocumentItems.Inserted');
      if Assigned(P) then
        with P.AsTable do
          for i := 0 to RecordCount – 1 do
            FieldByName('idit_Volume').AsFloat[i] := 1;
    end;
  end;
      

Возможно создание новых параметров в этом событии. Сервер приложений будет использовать их по такому же принципу, <имя таблицы без tp_>.<операция>.