Бизнес-процессы
Разработка

Получение ID записи, созданной действием "Чтение/запись данных"

Как можно получить ID записи, созданной действием "Чтение/запись данных"? Действие настроено следующим образом:

После выполнения действия запись в таблице создается, но значение параметра диаграммы "Приход на склад продаж поставщика" остается null.
Версия 3.4.0.117.

Нравится

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

Олег, попробуйте получить ID записи, созданной действием "Чтение/запись данных" таким образом:
1. Добавьте в функцию function ReadWriteData(Action) сервиса wa_ReadWriteDataScript строку кода, как отображено на скриншоте:

[javascript]
WFSetParamValue(Action, ParameterName, DataField.Value);
[/javascript]

http://www.community.terrasoft.ru/system/files/_1_0.png

2. Создайте для действия "Чтение/запись данных" БП обработчик события OnAfterExecute. В тело функции обработки события поместите код:

[javascript]
function Action1OnAfterExecute(ActionItem, IsComplete) {
if (IsComplete) {
var IDValue = WFGetParamValue(ActionItem, 'Field_ID');
}
}
[/javascript]

Переменная IDValue будет содержать идентификатор созданной записи.

Здравствуйте!
Наталья, подскажите пожалуйста как реализовать тоже самое но без необходимости настройки события OnAfterExecute().
Хочу сделать так:
1. Получить ID параметра диаграммы (не разобрался каким образом и где у вас сохраняются значение для поля "=");

2. В случае если успешно выполнен метод Post()

то выполняем следующий код.
[javascript]
var Parameters = ActionItem.ParentItems.ParentDiagram.Parameters;
Parameters.CoreItemsByUID(ParameterID).Value = Dataset.Values('ID');
[/javascript]
где ParameterID - это полученный на шаге 1 параметр диаграммы.
Естественно вставляем этот кусок кода сразу же после Dataset.Post().

P.S. Я попробовал сделать все, то что описал создав свой параметр (в действии)... но столкнулся с некоторыми проблемами.
1. Почему-то не всегда удается получить значение из "последнего" (добавленного мною) параметра действия. (причину возникновения ошибки я пока не понял, но после добавления еще одного параметра ошибка получения значения переходит на него))) );
2. Несмотря на использование вот такой записи
[javascript]
Parameters.CoreItemsByUID(ParameterID).Value = Dataset.Values('ID');
[/javascript]
Следующее действие - "Script" не видит изменений производимых действием в параметре диаграммы. Более того режим отладки показывает, что параметр пуст (хотя до этого, после сохранения записи, в том же режиме отладки было очевидно, что значение имеется).

Геннадий, реализовать описанную задачу у меня получилось таким образом:
1. Добавила в параметры элемента "Чтение/запись данных" (сервис wa_ReadWriteData) еще один параметр под названием FilterName:
http://www.community.terrasoft.ua/system/files/1_52.png
2. Реализовала сохранение значения в параметр FilterName, добавив в функцию function SaveParameters(DiagramItem) сервиса wnd_ReadWriteDataEditScript строку кода:

[javascript]
WFSetParamsMapItemValue(DiagramItem, 'FilterName', edtDiagramParameter.Value.ID);
[/javascript]

http://www.community.terrasoft.ua/system/files/2_35.png

3. Получение ID параметра диаграммы.
Изначально объявила переменную FilterName в функции function ReadWriteData(Action) сервиса wa_ReadWriteDataScript:

[javascript]
var FilterName = WFGetParamValue(Action, 'FilterName');
[/javascript]

http://www.community.terrasoft.ua/system/files/3_20.png

Затем записываю в параметр диаграммы ID:

[javascript]
if ((Source == rwsDataset) && (Direction == rwdParamsToDataset)) {
Dataset.Post();

var Param = Action.ParentItems.ParentDiagram.Parameters;
Param.ItemsByName(FilterName).Value = Dataset.Values('ID');
}
[/javascript]

Спасибо, Наталия!
Но я сделал немного по другому.
Достаточно после выполнения метода Post() добавить следующие строки:
[javascript]
var Parameters = Action.ParentItems.ParentDiagram.Parameters;
var ParamNameRecord = WFGetParamsMapItem(Action, 'FilterValue').DiagramParameterName;
Parameters.ItemsByName(ParamNameRecord).Value = Dataset.Values('ID');
[/javascript]
но...
Несмотря на то что создается видимость записи в параметр диаграммы... в следующем действии параметр диаграммы оказывается пуст.
Прикрепляю вам тестовый процесс и модифицированный скрипт действия:test.rar

Не могли бы вы объяснить причину возникновения проблемы и указать на возможные пути ее решения?

Кроме этого не могли бы вы подсказать каким образом можно "вытащить" xml диаграммы из параметра действия?

Геннадий, причина возникновения описанной ситуации заключается в том, что все параметры, которые «задизайнены» в WorkflowDiagram – не являются глобальными. Происходит копирование всех параметров из Action’а в диаграмму. И во время копирования параметр Action’а перезаписывает параметр диаграммы (схема возникновения событий отображена во вложенном изображении)

В Вашем случае необходимо изменить код в функции function ReadWriteData(Action) на:
[javascript]
var Parameters = Action.ParentItems.ParentDiagram.Parameters;
var ParamNameRecord = WFGetParamsMapItem(Action, 'FilterValue').DiagramParameterName;
WFConnectParams(Action, ParamNameRecord, ParamNameRecord, wptString, wpmitInOut);
Action.Parameters.ItemsByName(ParamNameRecord).Value = Dataset.Values('ID');
Parameters.ItemsByName(ParamNameRecord).Value = Dataset.Values('ID');
[/javascript]

Что касается вопроса:

"Березкин Геннадий" написал:Кроме этого не могли бы вы подсказать каким образом можно "вытащить" xml диаграммы из параметра действия?

Какую задачу необходимо реализовать?

Спасибо теперь все работает.
Только немного поправлю вас, Наталия.
[csharp]
if ((Source == rwsDataset) && (Direction == rwdParamsToDataset)) {
Dataset.Post();
// Set value parameter diagram
var ParamNameRecord = WFGetParamsMapItem(Action, 'FilterValue').DiagramParameterName;
WFConnectParams(Action, ParamNameRecord, ParamNameRecord, wptString, wpmitInOut);
Action.Parameters.ItemsByName(ParamNameRecord).Value = Dataset.Values('ID');
}
[/csharp]

Насколько я понял, то значение действительно записывалось в параметр, но после выполнения действия снова изменялось на 'null'. Получается, что такой код в рамках действия не имеет смысла:
[csharp]
var Parameters = Action.ParentItems.ParentDiagram.Parameters;
Parameters.ItemsByName(ParamNameRecord).Value = Dataset.Values('ID');
[/csharp]

По поводу xml!
Иногда существует необходимость знать промежуточное состояние процесса, которое хранится в поле Parameters таблицы tbl_WorkflowItem. Как мне по данным в этом поле получить текст xml, чтобы просматривать значениям присвоенные параметрам диаграммы и действий?

Получить текст XML можно такой записью:
[javascript]
var XMLStorage = GetNewXMLStorage();
XMLStorage.LoadFromDataset(Dataset, XMLDFName);
[/javascript]

При необходимости выгрузить XML в файл, используйте запись:

[javascript]
XMLStorage.SaveToFile(FileName, 'UTF-8');
[/javascript]

Спасибо, Наталия!

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