Бизнес процесс и запуск хранимой процедуры с поиском по данных в базе данных

Задача
В БП проверить контрагента в базе по реквизитам и дальше заполнить реквизиты нового заказчика, если такого нет в базе.

(требование клиента)
Через сервис окна в 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 - возвращает значение текст

Получаем следующую форму (сама форма в прикрепленных файлах)
1
Далее для того что бы считывать логику необходимо подключить (создать) к окну скрипт. Выберете контрол 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
Создаем БП
В БП следует создать параметры
2
Элемент Открытие окна в следующем варианте с следующими опциями
3

4
Каждый из параметров должен быть установлен с следующей опцией
5
6
Предварительный вид БП будет следующим видом
7
Элемент scr это скрипт, в котором мы считаем параметры с Окна, и запустим хранимую процедуру Базы данных, которая реализует выборку из базы по условию:

(требование клиента)
Name содержит N &
StateID содержит P &
CityID содержит G &
(Communication1 содержит T) или (Communication2 содержит T) или (Communication3 содержит T) или (Communication4 содержит T) или (Communication5 содержит T)

Хранимая процедура будет иметь вид:

CREATE  procedure [dbo].[tsp_check_name_reg_city_phone]
      @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 есть, ее можно создать к примеру запросом

SELECT * INTO tbl_Account_b FROM tbl_Account WHERE 1 = 0

Дальше в БП мы должны вызвать данную процедуру.

В элементе scr в БП пишем код (предварительно подключив скрипты scr_DB, scr_WindowUtils,scr_WorkflowUtils)
9

function Item3OnExecute(ScriptItem, IsComplete) {
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' можно анализировать значение переменной, и в зависимости от этого создавать нового контрагента

Окончательный вид всех параметров БП
9
Все сервисы прикреплены к данному сообщению

Нравится

Поделиться

2 комментария

Алексей, почему вы используете varchar вместо nvarchar? Вы потеряете юникод.
Создавать таблицу tbl_Account_b лучше запросом:

SELECT * INTO tbl_Account_b FROM tbl_Account Where 1 = 0

Таким образом у вас tbl_Account_b будет пустая, а не содержать всех Контрагентов.

Александр, спасибо за замечания, исправил предыдущий пост.

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