детали
обновление
таблица
Скрипты
Разработка

Обращение к таблицам при обновлении вкладок деталей

Здравствуйте!
Имеется две схемы Террасофт. Проблема с обновлением вкладок деталей. Скрипты все одинаковые. Все сравнила. В момент перехода на вкладку Детали запустила SQL Monitor. В правильной конфигурации идет обращение к таблице tbl_НовыйРаздел, а в неправильной - tbl_Files. Речь идет об обновении вкладок деталей с разными типами файлов. Пробовала отлаживать по шагам в Visual Studio. Нигде не нашла обращение к какой-либо из этих таблиц. Скажите, пожалуйста, в чем может быть ошибка?

Нравится

28 комментариев

Здравствуйте!
Трудно что либо ответить, нужны примеры сервисов и скриптов, где по Вы думаете, что присутствует ошибка.

Здравствуйте!
Спасибо за ответ!
Проблема была связана с дополнительным обновлением деталей http://community.terrasoft.ua/forum/topic/2076 .
В тестовой базе все получилось, в рабочей со скриптами сделала то же самое, но в итоге с помощью SQL Monitor нашла отличие в том, что обращение происходит к разным таблицам, поэтому и не работает. В чем может быть причина?

Трудно сказать, необходимо более точно описание.

Суть проблемы. Существует в деталях нового раздела 3 вкладки с файлами: Файлы1, Файлы2, Файлы3. Добавляем новый файл на определенную вкладку. Переходим на другую вкладку и видим этот же файл, т. е. фильтр по типу файла не отработал. Относительно фильтров в файле прописано такое.

// wnd_FilesDetailGridAreaScript
function RefreshAllFileDetailRecord(){
var ParentID = FilesDetailGridArea.ParentItemID;
var ChildDataset = FilesDetailGridArea.Dataset;
var ChildFilterName = BaseGridArea.ParentItemFieldName;
if (Self.Attributes('TableUSI') == 'tbl_FileInRequest') { // имя таблицы интересующей детали Файлы
ChildDataset.Close();
ApplyDatasetFilter(ChildDataset, ChildFilterName, ParentID, true);
// <здесь накладываем дополнительные фильтры>
ChildDataset.Open();
} else {
RefreshDetailDataByParentID(ParentID, ChildDataset, ChildFilterName);
}
}

// scr_DB
function ApplyDatasetFilter(Dataset, FilterName, ParamValue, Enabled) {
var SelectQuery = Dataset.SelectQuery;
ApplySelectQueryFilter(SelectQuery, FilterName, ParamValue, Enabled);
}

Ну пока ничего "криминального" не видно :)
Хотелось бы увидеть "// <здесь накладываем дополнительные фильтры>"
и как построен запрос.

Я же для этого и написала функцию ApplyDatasetFilter. А то просто комментарий к предыдущей строке.

Непонятно тогда как вы фильтруете по типу файла?

Вот запрос. sq_FileInItem
Добавила выключенный фильтр сравнения
tbl_FileInRequest"."FileTypeID" = :pFileTypeID (параметр Строка Unicode)

А где Вы указываете значение параметра и включаете этот фильтр?

//wnd_МойРазделScript

function InitializeFilesDetail() {
WWCWorkspace.FileWindow = wndFilesDetail.Window;
SetAttribute(WWCWorkspace.FileWindow, 'DatasetUSI',
'ds_FileInItem');
SetAttribute(WWCWorkspace.FileWindow, 'TableUSI',
'tbl_FileInRequest');
SetAttribute(WWCWorkspace.FileWindow, 'InsertLinkUSI',
'iq_FileInRequest');
SetAttribute(WWCWorkspace.FileWindow, 'ParentItemFieldName',
'RequestID');

//-----Установить атрибут типа файла-------------
WWCWorkspace.FileWindow.Attributes('FileTypeID') = rft_File;

WWCWorkspace.FileWindow.Prepare();
WWCWorkspace.FileDataset =
WWCWorkspace.FileWindow.ComponentsByName('dlData').Dataset;

//-----Включить фильтр по типам файлов
ApplyDatasetFilter(WWCWorkspace.FileDataset ,'FileTypeID', '{CF1AEBB6-9E3D-4303-B036-40EBD1E47A91}', true);
}

function RefreshFilesDetail() {
InitializeFilesDetail();
WWCWorkspace.InitializeFileFlag = true;
var RequestID =
BaseWorkspace.GridDataset.ValAsGUID('ID');
if (RequestID == WWCWorkspace.FilesOldRequestID) {
return;
} else {
WWCWorkspace.FilesOldRequestID = RequestID;
}

SetAttribute(WWCWorkspace.FileWindow, 'ParentItemID',
RequestID);

RefreshDetailData(BaseWorkspace.GridDataset, 'ID',
WWCWorkspace.FileDataset, 'ItemID', 1); // Не выключать включенные фильтры
}

И Вы этот код продублировали для всех трех деталей с разным указанием значения FileTypeID:
[javascript]
...
ApplyDatasetFilter(WWCWorkspace.FileDataset ,'FileTypeID', '{CF1AEBB6-9E3D-4303-B036-40EBD1E47A91}', true);
...
[/javascript]?

Да, с разным значеним. И аттрибут в строке
WWCWorkspace.FileWindow.Attributes('FileTypeID') = rft_File;
тоже 3 раза разный устанавливала.

А что показывает SQL Server Profiler? Параметр меняется?

У нас Oracle. По шагам отлаживала. Параметр меняется. Фильтр применяется. Но в итоге в деталях неправильно отображены файлы.

Кажется я понял... У Вас WWCWorkspace.FileDataset перетирается при инициализации новой детали. Вам надо для каждой детали свою переменную завести.

В функции InitializeFilesDetail я же каждый раз переопределяю Dataset.
[javascript]
WWCWorkspace.FileDataset =
WWCWorkspace.FileWindow.ComponentsByName('dlData').Dataset;
[/javascript]

А... я почему-то подумал, что Вы флаг InitializeFileFlag проверяете... Ну это очень не оптимально... У Вас каждый раз при переходе по записям выполняется очень много лишнего кода.
Какой запрос идет на сервер когда Вы нажимаете F5(Refresh) в детали? Приведите пример из трех деталей.

С помощью SQL Monitor в момент нажатия кнопки "Обновить" в деталях находим запрос:

[sql]
SELECT * FROM (
SELECT
"tbl_Files"."ID" "ID",
"FileInInvoice"."ID" "FileInItemID",
"FileInInvoice"."RequestID" "ItemID",
"tbl_Files"."ItemTypeID" "ItemTypeID",
"tbl_Files"."Link" "Link",
"tbl_Files"."Description" "Description",
"tbl_Files"."Revision" "Revision",
"tbl_Files"."LockedByID" "LockedByID",
"Contact"."Name" "LockedByName",
"tbl_Files"."IsArchive" "IsArchive",
"tbl_Files"."ModifiedByID" "ModifiedByID",
"Modifier"."Name" "ModifiedByName"
FROM
"tbl_Files" "tbl_Files",
"tbl_FileInRequest" "FileInInvoice",
"tbl_Contact" "Contact",
"tbl_Contact" "Modifier"
WHERE
"tbl_Files"."ID" = "FileInInvoice"."FileID"(+)
AND
"tbl_Files"."LockedByID" = "Contact"."ID"(+)
AND
"tbl_Files"."ModifiedByID" = "Modifier"."ID"(+)
AND
("tbl_Files"."ID" = :pID)
) WHERE ROWNUM <= 1
pID = '{9E10BE43-256C-46B3-9F5E-4E390B119BAA}'
[/sql]

Хм... Это Вы карточку открываете?

Это я нажимаю кнопку Обновить в деталях.

Но фильтр у Вас не по типу файла, как Вы писали, а по ID. Опубликуйте xml сервиса запроса детали.

В правильной версии тоже этот запрос отрабатывает при нажатии кнопки Обновить в деталях.

Сервис запроса с файлами.
[sql]
<?xml version="1.0" encoding="UTF-8" ?>
-
-

-
-
-

-

-
-

-
-

-
-

-
-

-
-

-
-

-

-

-

-
-

-

-

-

[/sql]

"В правильной версии тоже этот запрос отрабатывает при нажатии кнопки Обновить в деталях. " - значит Вы приводите не тот запрос. Их наверное несколько, а Вы берете последний. Потому как нет фильтрации по типу.

Должен применяться фильтр по значению конкретной закладки в деталях, т. е. "FileTypeID". В скрипте раздела это прописано (см. выше). Скажите, пожалуйста, может еще где-то надо прописать такое обновление?

Как выглядит функция RefreshDetailData и RefreshDetailDataByParentID?

// scr_DB

Эти функции я не меняла.

[javascript]
function RefreshDetailDataByParentID(ParentID, ChildDataset, ChildFilterName) {
if (ParentID == EmptyStr) {
ParentID = GUID_NULL;
}
if (ChildDataset.State != dstInactive) {
ChildDataset.Close();
}
EnableDatasetFilters(ChildDataset, false);
ApplyDatasetFilter(ChildDataset, ChildFilterName, ParentID, true);
ChildDataset.Open();
}
[/javascript]

[javascript]
function RefreshDetailData(ParentDataset, ParentFieldName, ChildDataset,
ChildFilterName) {
var ParentFieldValue = ParentDataset.ValAsStr(ParentFieldName);
RefreshDetailDataByParentID(ParentFieldValue, ChildDataset,
ChildFilterName);
}
[/javascript]

Тогда как работает эта реализация?
[javascript]
...
RefreshDetailData(BaseWorkspace.GridDataset, 'ID',
WWCWorkspace.FileDataset, 'ItemID', 1); // Не выключать включенные фильтры
...
[/javascript]
Судя по scr_DB то фильтры отключаются...

Большое спасибо!

Показать все комментарии