Список форумов BOSSForum.RU - Форум. БОСС-Кадровик
Независимый форум, посвященный системе БОСС-Кадровик
и всему, что с ней связано
 FAQFAQ   ПоискПоиск   ПользователиПользователи   ГруппыГруппы   РегистрацияРегистрация 
 ПрофильПрофиль   Войти и проверить личные сообщенияВойти и проверить личные сообщения   ВходВход 

передача нескольких параметров

 
Начать новую тему   Ответить на тему    Список форумов BOSSForum.RU - Форум. БОСС-Кадровик -> X-язык
Предыдущая тема :: Следующая тема  
Автор Сообщение
tveritin



Зарегистрирован: 26.01.2016
Сообщения: 182
Откуда: Санкт-Петербург

СообщениеДобавлено: Ср Дек 14, 2022 15:54    Заголовок сообщения: передача нескольких параметров Ответить с цитатой

Как правильно передать 2 параметра в блок T-SQL ?
Такая конструкция выдает ошибку

Код:
execute{
   local x = @leave_sched_main_dlg:cur_year['];
   local t = _Table[""];
   Execute xSql
   {$(:x); (:t);
      declare @ListData AS [dbo].[LeaveSchedCrossType]
      delete from @ListData
      insert into @ListData ([Num_Tab],[Full_Name],[Name_appoint],[Struct_Name],[type],[Name_Leave],[d_from],[d_to],[pid])
         select Num_Tab, Full_Name, Name_appoint, Struct_Name, type, Name_Leave, d_from, d_to, pid from #result
      select * into @t from user_leave_sched_calend (@ListData, @x)    };
};
Вернуться к началу
Посмотреть профиль Отправить личное сообщение Отправить e-mail
superjek



Зарегистрирован: 04.04.2022
Сообщения: 28

СообщениеДобавлено: Ср Дек 14, 2022 16:27    Заголовок сообщения: Ответить с цитатой

Код:
execute{
   local x = @leave_sched_main_dlg:cur_year['];
   local t = _Table[""];
   Execute xSql
   {$(:x, :t);
      declare @ListData AS [dbo].[LeaveSchedCrossType]
      delete from @ListData
      insert into @ListData ([Num_Tab],[Full_Name],[Name_appoint],[Struct_Name],[type],[Name_Leave],[d_from],[d_to],[pid])
         select Num_Tab, Full_Name, Name_appoint, Struct_Name, type, Name_Leave, d_from, d_to, pid from #result
      select * into @t from user_leave_sched_calend (@ListData, @x)    };
};
Вернуться к началу
Посмотреть профиль Отправить личное сообщение
tveritin



Зарегистрирован: 26.01.2016
Сообщения: 182
Откуда: Санкт-Петербург

СообщениеДобавлено: Ср Дек 14, 2022 16:41    Заголовок сообщения: Ответить с цитатой

Принцип верный, но теперь интерпретатор считает @t переменной, а не алиасом таблицы. И говорит, что ошибка типов. Не могу мол запихать в одну переменную целую таблицу.
Вернуться к началу
Посмотреть профиль Отправить личное сообщение Отправить e-mail
tveritin



Зарегистрирован: 26.01.2016
Сообщения: 182
Откуда: Санкт-Петербург

СообщениеДобавлено: Ср Дек 14, 2022 16:52    Заголовок сообщения: Ответить с цитатой

Вообще, изначально делал так:

Код:
execute{
   local x = @leave_sched_main_dlg:cur_year['];
   local t = _Table[""];
   Execute xSql
   {$(:x, :t);
      declare @ListData AS [dbo].[LeaveSchedCrossType]
      delete from @ListData
      insert into @ListData ([Num_Tab],[Full_Name],[Name_appoint],[Struct_Name],[type],[Name_Leave],[d_from],[d_to],[pid])
         select Num_Tab, Full_Name, Name_appoint, Struct_Name, type, Name_Leave, d_from, d_to, pid from #result
      select * into ##result2 from user_leave_sched_calend (@ListData, @x)    };
};


Так работает, но имя таблицы не уникально, при работе одновременно нескольких пользователей будет каша.
Если использовать #result2 вместо ##result2, то дальше этой конструкции таблица #result2 не видна.
Вернуться к началу
Посмотреть профиль Отправить личное сообщение Отправить e-mail
superjek



Зарегистрирован: 04.04.2022
Сообщения: 28

СообщениеДобавлено: Чт Дек 15, 2022 09:28    Заголовок сообщения: Ответить с цитатой

Попробуйте создать #result2 с нужной структурой столбцов перед Execute xSql.

А вместо select * into #result2
сделать
insert into #result2
select * from user_leave_sched_calend (@ListData, @x)

либо динамический SQL, что-то вида:

Код:
execute{
   local x = @leave_sched_main_dlg:cur_year['];
   local t = _Table[""];
   Execute xSql
   {$(:x, :t);
      declare @ListData AS [dbo].[LeaveSchedCrossType]
      declare @s varchar(1000)

      delete from @ListData
      insert into @ListData ([Num_Tab],[Full_Name],[Name_appoint],[Struct_Name],[type],[Name_Leave],[d_from],[d_to],[pid])
         select Num_Tab, Full_Name, Name_appoint, Struct_Name, type, Name_Leave, d_from, d_to, pid from #result
      set @s= 'select * into '+@t+' from user_leave_sched_calend (@ListData, @x)'
       exec(@s)
};
};
Вернуться к началу
Посмотреть профиль Отправить личное сообщение
tveritin



Зарегистрирован: 26.01.2016
Сообщения: 182
Откуда: Санкт-Петербург

СообщениеДобавлено: Чт Дек 15, 2022 12:20    Заголовок сообщения: Ответить с цитатой

Спасибо, так пробовал, но с помощью `EXEC sp_executesql`, не пошло из-за видимости переменных @ListData, @x.
Решил другим способом

Код:
if object_id('tempdb..##result2') IS NOT NULL THEN delete from "##result2" where st=CURSTATION;
...
execute{
   local x = @leave_sched_main_dlg:cur_year['];
   local st = CURSTATION;
   Execute xSql
   {$(:x, :st);
      declare @ListData AS [dbo].[LeaveSchedCrossType]
      delete from @ListData
      insert into @ListData ([Num_Tab],[Full_Name],[Name_appoint],[Struct_Name],[type],[Name_Leave],[d_from],[d_to],[pid])
         select Num_Tab, Full_Name, Name_appoint, Struct_Name, type, Name_Leave, d_from, d_to, pid from #result
      if object_id('tempdb..##result2') is not null
         insert into ##result2 select *, @st st from user_leave_sched_calend (@ListData, @x)
      else
         select *, @st st into ##result2 from user_leave_sched_calend (@ListData, @x)
   };
};
...
if object_id('tempdb..##result2') IS NOT NULL THEN delete from "##result2" where st=CURSTATION;
Вернуться к началу
Посмотреть профиль Отправить личное сообщение Отправить e-mail
tveritin



Зарегистрирован: 26.01.2016
Сообщения: 182
Откуда: Санкт-Петербург

СообщениеДобавлено: Чт Дек 15, 2022 12:46    Заголовок сообщения: Ответить с цитатой

superjek писал(а):
Попробуйте создать #result2 с нужной структурой столбцов перед Execute xSql.


Такой вариант, но с ##result2, обдумывался изначально, но отвергнут мной по причине громоздкости кода (370 полей в таблице).
А "совсем" временная таблица #result2 не подошла тоже по причине видимости самой этой временной таблицы, об этом писал выше.

superjek, спасибо за идеи.
Вернуться к началу
Посмотреть профиль Отправить личное сообщение Отправить e-mail
tveritin



Зарегистрирован: 26.01.2016
Сообщения: 182
Откуда: Санкт-Петербург

СообщениеДобавлено: Чт Дек 15, 2022 16:20    Заголовок сообщения: Ответить с цитатой

До сих пор для меня остается загадкой видимость временных таблиц в моем случае.
Код:

execute{
   local x = @leave_sched_main_dlg:cur_year['];
   Execute xSql
   {$(:x);
      declare @ListData AS [dbo].[LeaveSchedCrossType]
      delete from @ListData
      insert into @ListData ([Num_Tab],[Full_Name],[Name_appoint],[Struct_Name],[type],[Name_Leave],[d_from],[d_to],[pid])
         select Num_Tab, Full_Name, Name_appoint, Struct_Name, type, Name_Leave, d_from, d_to, pid from #result
      select * into #result2 from user_leave_sched_calend (@ListData, @x)
   };
};


Изначально использовал этот код. Таблица #result была создана до этого блока, её было видно в этом блоке.
Но, таблица #result2 была создана в этом блоке и сразу после этого блока запрос к таблице #result2 сообщал, что такой таблицы нет.
Но, собственно говоря, даже если б этой проблемы не возникло, пришлось наткнуться на эти грабли чуть дальше, когда результат запроса `select * from #result2` вставлялся в Excel с помощью @@xUtil{connect} и ExcelApp.ActiveWorkBook.Sheets(1).QueryTables.Add, для этого используется другое соединение к базе и в любом случае пришлось бы использовать глобальную временную таблицу.
Вернуться к началу
Посмотреть профиль Отправить личное сообщение Отправить e-mail
superjek



Зарегистрирован: 04.04.2022
Сообщения: 28

СообщениеДобавлено: Чт Дек 15, 2022 17:12    Заголовок сообщения: Ответить с цитатой

Странно, почему у вас не видно временную таблицу после блока
У меня тестовый пример отрабатывает без ошибок)

Код:
execute xSQL {$
   if object_id('tempdb..#t','U') is not null drop table #t
   select  top 100 * into #t from card
};

browser {
    select * from #t
};
Вернуться к началу
Посмотреть профиль Отправить личное сообщение
tveritin



Зарегистрирован: 26.01.2016
Сообщения: 182
Откуда: Санкт-Петербург

СообщениеДобавлено: Пт Дек 16, 2022 16:47    Заголовок сообщения: Ответить с цитатой

Наверное, отличие в том, что я выполнил блок внутри операторного блока execute {}, пример я взял из документации по RPDesigner. Видать при выходе из блока освобождаются не только переменные, но и временные таблицы.
Однако, вариант с глобальной временной таблицей в моём случае неизбежен, поэтому оставляю как есть.
Вернуться к началу
Посмотреть профиль Отправить личное сообщение Отправить e-mail
Показать сообщения:   
Начать новую тему   Ответить на тему    Список форумов BOSSForum.RU - Форум. БОСС-Кадровик -> X-язык Часовой пояс: GMT + 4
Страница 1 из 1

 
Перейти:  
Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете голосовать в опросах


Pоwerеd by рhpВB © 2001, 2005 рhpВB Grouр
Русская поддержка phрВB
Rambler's Top100 Рейтинг@Mail.ru Список форумов BOSSForum.RU