Бизнес процесс и запуск хранимой процедуры с поиском по данных в базе данных
Задача
В БП проверить контрагента в базе по реквизитам и дальше заполнить реквизиты нового заказчика, если такого нет в базе.
(требование клиента)
Через сервис окна в Terrasoft запрашиваются реквизиты у пользователя :
- Наименование;
- Регион;
- Город;
- Телефон;
Создаем форму wnd_name_reg_city_phone унаследуем ее от wnd_BaseEdit, в Невизуальные компоненты добавляем даталинки на справочники датасетов ds_City и ds_State. Добавляем 4 ре контрола два из них LookupControl (для выбора справочников, заметьте НЕ LookupDataControl) и два Edit контрола.
edtName – Edit возвращает значение текст
edtState – LookupControl возращает ID выбранного региона
edtCity – LookupControl возращает ID выбранного города
edtPhone - возвращает значение текст
Получаем следующую форму (сама форма в прикрепленных файлах)
Далее для того что бы считывать логику необходимо подключить (создать) к окну скрипт. Выберете контрол Ok, событие OnClick два раза кликните на колонку Значение, дальше дизайнер предложить вам создать скрипт
На событие Ок, пропишем логику считывания значений, и запись их в атрибуты окна, для последующей передачи их в БП
// wnd_name_reg_city_phoneScript
//-----------------------------------------------------------------------------
function btnOKOnClick(Control) {
var AccountName = edtName.Value;
var AccountStateID = edtState.Value;
var AccountCityID = edtCity.Value;
var AccountPhone = edtPhone.Value
SetAttribute(Control.ParentWindow, 'AccountName',AccountName);
SetAttribute(Control.ParentWindow, 'AccountStateID',AccountStateID);
SetAttribute(Control.ParentWindow, 'AccountCityID',AccountCityID);
SetAttribute(Control.ParentWindow, 'AccountPhone',AccountPhone);
SendNotify(Control.ParentWindow, MSG_OK);
}
function Main() {
var Window = Services.GetNewItemByUSI('wnd_name_reg_city_phone');
Window.IsDesigning = false;
Window.Prepare();
Window.Show();
}
function Main() в данном коде необходима для реализации возможности и вызова окна по нажатию F9
Создаем БП
В БП следует создать параметры
Элемент Открытие окна в следующем варианте с следующими опциями
Каждый из параметров должен быть установлен с следующей опцией
Предварительный вид БП будет следующим видом
Элемент scr это скрипт, в котором мы считаем параметры с Окна, и запустим хранимую процедуру Базы данных, которая реализует выборку из базы по условию:
(требование клиента)
Name содержит N &
StateID содержит P &
CityID содержит G &
(Communication1 содержит T) или (Communication2 содержит T) или (Communication3 содержит T) или (Communication4 содержит T) или (Communication5 содержит T)
Хранимая процедура будет иметь вид:
@AccountName nvarchar(250),
@AccountStateID uniqueidentifier ,
@AccountCityID uniqueidentifier,
@AccountPhone nvarchar(250),
@Result int output
AS
begin
declare @AccountNameLike nvarchar(300)
declare @AccountPhoneLike nvarchar(300)
SET @AccountNameLike = '%'+ @AccountName + '%';
SET @AccountPhoneLike= '%'+ @AccountPhone + '%';
DELETE FROM tbl_Account_b;
INSERT INTO [dbo].[tbl_Account_b]
SELECT [ID]
,[CreatedOn]
,[ModifiedOn]
,[Name]
,[CreatedByID]
,[ModifiedByID]
,[OfficialAccountName]
,[PrimaryContactID]
,[TerritoryID]
,[AnnualRevenue]
,[EmployeesNumber]
,[OwnerID]
,[CampaignID]
,[AddressTypeID]
,[Address]
,[CityID]
,[StateID]
,[ZIP]
,[CountryID]
,[ActivityID]
,[FieldID]
,[Communication1]
,[Communication2]
,[Communication3]
,[Communication4]
,[Communication5]
,[Communication1TypeID]
,[Communication2TypeID]
,[Communication3TypeID]
,[Communication4TypeID]
,[Communication5TypeID]
,[Description]
,[AccountTypeID]
,[Code]
,[TaxRegistrationCode]
,[SettledCredit]
,[PostponementPayment]
FROM [dbo].[tbl_Account]
WHERE [Name] LIKE @AccountNameLike
AND [StateID] = @AccountStateID
AND [CityID] = @AccountCityID
AND (
[Communication1] LIKE @AccountPhoneLike
OR [Communication2] LIKE @AccountPhoneLike
OR [Communication3] LIKE @AccountPhoneLike
OR [Communication4] LIKE @AccountPhoneLike
OR [Communication5] LIKE @AccountPhoneLike
)
SET @Result = (SELECT count(*) FROM [dbo].[tbl_Account_b]);
end
Возращает процедура количество записанных данных.
Причем подразумевается что таблица tbl_Account_b есть, ее можно создать к примеру запросом
Дальше в БП мы должны вызвать данную процедуру.
В элементе scr в БП пишем код (предварительно подключив скрипты scr_DB, scr_WindowUtils,scr_WorkflowUtils)
var vAccountNameBP = WFGetParamValue(ScriptItem.ParentItems.ParentDiagram, 'AccountNameBP');
var vAccountStateIDBP = WFGetParamValue(ScriptItem.ParentItems.ParentDiagram, 'AccountStateIDBP');
var vAccountCityIDBP = WFGetParamValue(ScriptItem.ParentItems.ParentDiagram, 'AccountCityIDBP');
var vAccountPhoneBP = WFGetParamValue(ScriptItem.ParentItems.ParentDiagram, 'AccountPhoneBP');
var Parameters = CreateSPParameters();
CreateSPParameter(Parameters, 'AccountName', pdtString, vAccountNameBP);
CreateSPParameter(Parameters, 'AccountStateID', pdtString, vAccountStateIDBP);
CreateSPParameter(Parameters, 'AccountCityID', pdtString, vAccountCityIDBP);
CreateSPParameter(Parameters, 'AccountPhone', pdtString, vAccountPhoneBP);
CreateSPParameter(Parameters, 'OutTest', pdtInteger, 0);
Parameters.ItemsByName('OutTest').ParamType = 1;
var SQLText =
'exec dbo.tsp_check_name_reg_city_phone :AccountName, :AccountStateID, :AccountCityID,:AccountPhone,:OutTest OUTPUT';
Connector.DBEngine.ExecuteCustomSQL(SQLText, Parameters);
var res = Parameters.ItemsByName('OutTest').ValAsInt;
WFSetParamValue(ScriptItem.ParentItems.ParentDiagram, 'Acc_count', res);
}
В строчках WFSetParamValue(ScriptItem.ParentItems.ParentDiagram, 'Acc_count', res);
Мы записываем полученное значение с процедуры в параметр БП 'Acc_count', после чего в элементе test_res в качестве примера выводим полученное значение.
Дальше по параметру 'Acc_count' можно анализировать значение переменной, и в зависимости от этого создавать нового контрагента
Окончательный вид всех параметров БП
Все сервисы прикреплены к данному сообщению
Алексей, почему вы используете varchar вместо nvarchar? Вы потеряете юникод.
Создавать таблицу tbl_Account_b лучше запросом:
SELECT * INTO tbl_Account_b FROM tbl_Account Where 1 = 0
Таким образом у вас tbl_Account_b будет пустая, а не содержать всех Контрагентов.
Александр, спасибо за замечания, исправил предыдущий пост.