Независимый форум, посвященный системе БОСС-Кадровик и всему, что с ней связано
|
|
Предыдущая тема :: Следующая тема |
Автор |
Сообщение |
tveritin
Зарегистрирован: 26.01.2016 Сообщения: 182 Откуда: Санкт-Петербург
|
Добавлено: Пн Дек 13, 2021 12:07 Заголовок сообщения: varchar(max) в X-языке |
|
|
Как известно, не приветствуется в Х-языке тип данных varchar(max).
К примеру, если поле в таблице этого типа. При выборках явных ошибок не возникает, но как правило, обрезается первая пара символов строки или происходят артефакты в виде помещения не той строки.
Код: | SELECT convert(varchar(10), hrtb_doc.d_from, 104), convert(varchar(10), hrtb_doc.d_to, 104), hrtb_doc.name, convert(varchar(10), hrtb_doc.mdate, 104), hrtb_doc.uname, len(hdp1.text_subj_up), len(hdp2.text_subj_up), len(hdp3.text_subj_up), hdp1.text_subj_up, hdp2.text_subj_up, hdp3.text_subj_up
FROM hrtb_doc
INNER JOIN hrtb_doc_type ON hrtb_doc_type.id_hr_doc_type = hrtb_doc.id_hr_doc_type
INNER JOIN hrtb_status ON hrtb_status.id_hr_status = hrtb_doc.id_hr_status
LEFT JOIN hrtb_docparam hdp1 on hdp1.id_hr_doc = hrtb_doc.id_hr_doc and hdp1.id_hr_doc_fold in (12,39,53,54) and len(hdp1.text_subj_up)>0 /*это цели должности*/
LEFT JOIN hrtb_docparam hdp2 on hdp2.id_hr_doc = hrtb_doc.id_hr_doc and hdp2.id_hr_doc_fold in (40,55) /*это области ответственности (задачи должности)*/
LEFT JOIN hrtb_docparam hdp3 on hdp3.id_hr_doc = hrtb_doc.id_hr_doc and hdp3.id_hr_doc_fold in (50,56) /*это обязанности (функциональные)*/
WHERE hrtb_doc.id_firm = 16
and hrtb_doc.name_table='CELLS' and hrtb_doc.id_hr_rec=42665
and hrtb_doc.id_hr_status = 3 /*только действующие*/
|
Этот запрос в MSSMS выполняется корректно, но если его использовать в Х-языке, например, в конструкции browser {} , то в предпоследние 2 поля попадет значение последнего поля с обрезанными первыми двумя символами.
Вопрос: Кто с этим сталкивался и кто как решал проблему.
Преобразование к varchar(8000) не предлагать, т.к. значения text_subj_up могут быть длиной и 12000 символов.
Последний раз редактировалось: tveritin (Пн Дек 13, 2021 13:03), всего редактировалось 2 раз(а) |
|
Вернуться к началу |
|
|
RVV Большой шоколадный орден
Зарегистрирован: 14.01.2010 Сообщения: 449
|
Добавлено: Пн Дек 13, 2021 12:14 Заголовок сообщения: |
|
|
Такое поле не должно быть последним в SQL запросе Х-языка.
Это не баг, это фича. И так было всегда с полями varchar
SELECT hdp1.text_subj_up, hdp2.text_subj_up, hdp3.text_subj_up
, 1
FROM |
|
Вернуться к началу |
|
|
tveritin
Зарегистрирован: 26.01.2016 Сообщения: 182 Откуда: Санкт-Петербург
|
Добавлено: Пн Дек 13, 2021 12:42 Заголовок сообщения: |
|
|
Спасибо.
В браузере всё отлично, но когда делаю
Код: | SELECT top 1 convert(varchar(10), hrtb_doc.d_from, 104), convert(varchar(10), hrtb_doc.d_to, 104), hrtb_doc.name, convert(varchar(10), hrtb_doc.mdate, 104), hrtb_doc.uname, hdp1.text_subj_up, hdp2.text_subj_up, hdp3.text_subj_up, 1
INTO :_fromd_hrtbdoc, :_tod_hrtbdoc, :_name_hrtbdoc, :_mdate_hrtbdoc, :_uname_hrtbdoc, :_purpose, :_response, :_duties, :_fake
| , в :_purpose, :_response, :_duties кладутся пустые строки. |
|
Вернуться к началу |
|
|
tveritin
Зарегистрирован: 26.01.2016 Сообщения: 182 Откуда: Санкт-Петербург
|
Добавлено: Пн Дек 13, 2021 15:14 Заголовок сообщения: |
|
|
а когда:
Код: | SELECT top 1 convert(varchar(10), hrtb_doc.d_from, 104), convert(varchar(10), hrtb_doc.d_to, 104), hrtb_doc.name, convert(varchar(10), hrtb_doc.mdate, 104), hrtb_doc.uname, convert(varchar(8000),hdp1.text_subj_up), convert(varchar(8000),hdp2.text_subj_up), convert(varchar(8000),hdp3.text_subj_up), 1
INTO :_fromd_hrtbdoc, :_tod_hrtbdoc, :_name_hrtbdoc, :_mdate_hrtbdoc, :_uname_hrtbdoc, :_purpose, :_response, :_duties, :_fake |
в эти переменные попадают нужные значения. Не получается пока убрать ограничение в 8000 без ущерба в работе запроса. |
|
Вернуться к началу |
|
|
RVV Большой шоколадный орден
Зарегистрирован: 14.01.2010 Сообщения: 449
|
Добавлено: Пн Дек 13, 2021 17:05 Заголовок сообщения: |
|
|
Попробуйте через sTable
-- запуск отчета
sTable @m_report
select top 1 exe_sql, LEN(exe_sql) as ln
from pr_exec_for_list where id = @EXECLIST:id['];
Execute {
if @m_report:ln > 0 then
Execute xSql{ :@m_report:exe_sql };
};
destroy @m_report; |
|
Вернуться к началу |
|
|
tveritin
Зарегистрирован: 26.01.2016 Сообщения: 182 Откуда: Санкт-Петербург
|
Добавлено: Пн Дек 13, 2021 22:59 Заголовок сообщения: |
|
|
Не совсем понимаю смысл предложенного. |
|
Вернуться к началу |
|
|
RVV Большой шоколадный орден
Зарегистрирован: 14.01.2010 Сообщения: 449
|
Добавлено: Вт Дек 14, 2021 10:55 Заголовок сообщения: |
|
|
Это был пример получения и использования значения из поля pr_exec_for_list.exe_sql
которое имеет размерность VARCHAR(MAX).
Вы же не объяснили, для чего нужно вытаскивать в переменную такое значение |
|
Вернуться к началу |
|
|
tveritin
Зарегистрирован: 26.01.2016 Сообщения: 182 Откуда: Санкт-Петербург
|
Добавлено: Вт Дек 14, 2021 11:19 Заголовок сообщения: |
|
|
Да, спасибо за мысль, я еще вчера попробовал sTable вместо SELECT INTO.
Получился рабочий код следующий:
Код: | Let _tod_hrtbdoc = ''; Let _fromd_hrtbdoc = ''; Let _name_hrtbdoc = ''; Let _mdate_hrtbdoc = ''; Let _uname_hrtbdoc = '';
Let _purpose = ''; Let _response = ''; Let _duties = ''; Let _measures = '';
Let _education = ''; Let _experience = ''; Let _qual_docs = ''; Let _knowledges = '';
Let _skills = ''; Let _challenges = ''; Let _interactions = ''; Let _rights = '';
Let _regulator_docs = ''; Let _liability = '';
sTable @m_report
SELECT top 1 convert(varchar(10), hrtb_doc.d_from, 104), convert(varchar(10), hrtb_doc.d_to, 104), hrtb_doc.name, convert(varchar(10), hrtb_doc.mdate, 104), hrtb_doc.uname,
hdp1.text_subj_up, hdp2.text_subj_up, hdp3.text_subj_up, hdp4.text_subj_up,
hdp5.text_subj_up, hdp6.text_subj_up, hdp7.text_subj_up, hdp8.text_subj_up,
hdp9.text_subj_up, hdp10.text_subj_up, hdp11.text_subj_up, hdp12.text_subj_up,
hdp13.text_subj_up, hdp14.text_subj_up,
'1' col
FROM hrtb_doc _HINTBROWSER
INNER JOIN hrtb_doc_type _HINTBROWSER ON hrtb_doc_type.id_hr_doc_type = hrtb_doc.id_hr_doc_type
INNER JOIN hrtb_status _HINTBROWSER ON hrtb_status.id_hr_status = hrtb_doc.id_hr_status
LEFT JOIN hrtb_docparam hdp1 _HINTBROWSER on hdp1.id_hr_doc = hrtb_doc.id_hr_doc and hdp1.id_hr_doc_fold in (12,39,53,54) and len(hdp1.text_subj_up)>0 /*это цели должности*/
LEFT JOIN hrtb_docparam hdp2 _HINTBROWSER on hdp2.id_hr_doc = hrtb_doc.id_hr_doc and hdp2.id_hr_doc_fold in (40,55) and len(hdp2.text_subj_up)>0 /*это области ответственности (задачи должности)*/
LEFT JOIN hrtb_docparam hdp3 _HINTBROWSER on hdp3.id_hr_doc = hrtb_doc.id_hr_doc and hdp3.id_hr_doc_fold in (50,56) and len(hdp3.text_subj_up)>0 /*это обязанности (функциональные)*/
LEFT JOIN hrtb_docparam hdp4 _HINTBROWSER on hdp4.id_hr_doc = hrtb_doc.id_hr_doc and hdp4.id_hr_doc_fold in (57) and len(hdp4.text_subj_up)>0 /*это количественные измерения зоны ответственности*/
LEFT JOIN hrtb_docparam hdp5 _HINTBROWSER on hdp5.id_hr_doc = hrtb_doc.id_hr_doc and hdp5.id_hr_doc_fold in (42,59) and len(hdp5.text_subj_up)>0 /*это образование*/
LEFT JOIN hrtb_docparam hdp6 _HINTBROWSER on hdp6.id_hr_doc = hrtb_doc.id_hr_doc and hdp6.id_hr_doc_fold in (44,60) and len(hdp6.text_subj_up)>0 /*это опыт*/
LEFT JOIN hrtb_docparam hdp7 _HINTBROWSER on hdp7.id_hr_doc = hrtb_doc.id_hr_doc and hdp7.id_hr_doc_fold in (43,61) and len(hdp7.text_subj_up)>0 /*это квалификационные документы*/
LEFT JOIN hrtb_docparam hdp8 _HINTBROWSER on hdp8.id_hr_doc = hrtb_doc.id_hr_doc and hdp8.id_hr_doc_fold in (45,62) and len(hdp8.text_subj_up)>0 /*это знания*/
LEFT JOIN hrtb_docparam hdp9 _HINTBROWSER on hdp9.id_hr_doc = hrtb_doc.id_hr_doc and hdp9.id_hr_doc_fold in (46,63) and len(hdp9.text_subj_up)>0 /*это умения, навыки*/
LEFT JOIN hrtb_docparam hdp10 _HINTBROWSER on hdp10.id_hr_doc = hrtb_doc.id_hr_doc and hdp10.id_hr_doc_fold in (65) and len(hdp10.text_subj_up)>0 /*это ключевые вызовы и аспекты*/
LEFT JOIN hrtb_docparam hdp11 _HINTBROWSER on hdp11.id_hr_doc = hrtb_doc.id_hr_doc and hdp11.id_hr_doc_fold in (66) and len(hdp11.text_subj_up)>0 /*это ключевые взаимодействия*/
LEFT JOIN hrtb_docparam hdp12 _HINTBROWSER on hdp12.id_hr_doc = hrtb_doc.id_hr_doc and hdp12.id_hr_doc_fold in (67) and len(hdp12.text_subj_up)>0 /*это полномочия и права*/
LEFT JOIN hrtb_docparam hdp13 _HINTBROWSER on hdp13.id_hr_doc = hrtb_doc.id_hr_doc and hdp13.id_hr_doc_fold in (41,68) and len(hdp13.text_subj_up)>0 /*это регламентирующие документы*/
LEFT JOIN hrtb_docparam hdp14 _HINTBROWSER on hdp14.id_hr_doc = hrtb_doc.id_hr_doc and hdp14.id_hr_doc_fold in (69) and len(hdp14.text_subj_up)>0 /*это материальная ответственность*/
WHERE hrtb_doc.id_firm = @@id_firm
and hrtb_doc.name_table='CELLS' and hrtb_doc.id_hr_rec=@$Cell:cell_item
and hrtb_doc.id_hr_status = 3; /*только действующие*/
EXECUTE
{
Let _fromd_hrtbdoc = @m_report:1[''];
Let _tod_hrtbdoc = @m_report:2[''];
Let _name_hrtbdoc = @m_report:3[''];
Let _mdate_hrtbdoc = @m_report:4[''];
Let _uname_hrtbdoc = @m_report:5[''];
Let _purpose = @m_report:6[''];
Let _response = @m_report:7[''];
Let _duties = @m_report:8[''];
Let _measures = @m_report:9[''];
Let _education = @m_report:10[''];
Let _experience = @m_report:11[''];
Let _qual_docs = @m_report:12[''];
Let _knowledges = @m_report:13[''];
Let _skills = @m_report:14[''];
Let _challenges = @m_report:15[''];
Let _interactions = @m_report:16[''];
Let _rights = @m_report:17[''];
Let _regulator_docs = @m_report:18[''];
Let _liability = @m_report:19['']
};
|
Правда, на строках свыше 8000 символов еще не пробовал. Позже отпишусь о результатах. |
|
Вернуться к началу |
|
|
tveritin
Зарегистрирован: 26.01.2016 Сообщения: 182 Откуда: Санкт-Петербург
|
Добавлено: Вт Дек 14, 2021 12:30 Заголовок сообщения: |
|
|
До строк, свыше 8000, еще не дошел. Проблема с такой конструкцией появилась и без этого.
Если в первой строке выборки даты (hrtb_doc.d_from, hrtb_doc.d_to) пустые, то в соответствующие переменные (_fromd_hrtbdoc, _tod_hrtbdoc) кладутся значения "--execute user_job_dsc_excel_export;Let 1:=1;Pro" и
10490 соответственно. То есть, это текст процедуры и ее длина. |
|
Вернуться к началу |
|
|
tveritin
Зарегистрирован: 26.01.2016 Сообщения: 182 Откуда: Санкт-Петербург
|
Добавлено: Вт Дек 14, 2021 12:39 Заголовок сообщения: |
|
|
Решено строкой
перед
|
|
Вернуться к началу |
|
|
tveritin
Зарегистрирован: 26.01.2016 Сообщения: 182 Откуда: Санкт-Петербург
|
Добавлено: Ср Дек 15, 2021 16:15 Заголовок сообщения: |
|
|
tveritin писал(а): | Правда, на строках свыше 8000 символов еще не пробовал. Позже отпишусь о результатах. |
В результате всё работает и со строками длиннее 8000 символов. Всем спасибо за помощь. |
|
Вернуться к началу |
|
|
|
|
Вы не можете начинать темы Вы не можете отвечать на сообщения Вы не можете редактировать свои сообщения Вы не можете удалять свои сообщения Вы не можете голосовать в опросах
|
|