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

varchar(max) в X-языке

 
Начать новую тему   Ответить на тему    Список форумов BOSSForum.RU - Форум. БОСС-Кадровик -> X-язык
Предыдущая тема :: Следующая тема  
Автор Сообщение
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 раз(а)
Вернуться к началу
Посмотреть профиль Отправить личное сообщение Отправить e-mail
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 кладутся пустые строки.
Вернуться к началу
Посмотреть профиль Отправить личное сообщение Отправить e-mail
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 без ущерба в работе запроса.
Вернуться к началу
Посмотреть профиль Отправить личное сообщение Отправить e-mail
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    Заголовок сообщения: Ответить с цитатой

Не совсем понимаю смысл предложенного.
Вернуться к началу
Посмотреть профиль Отправить личное сообщение Отправить e-mail
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 символов еще не пробовал. Позже отпишусь о результатах.
Вернуться к началу
Посмотреть профиль Отправить личное сообщение Отправить e-mail
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 соответственно. То есть, это текст процедуры и ее длина.
Вернуться к началу
Посмотреть профиль Отправить личное сообщение Отправить e-mail
tveritin



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

СообщениеДобавлено: Вт Дек 14, 2021 12:39    Заголовок сообщения: Ответить с цитатой

Решено строкой
Код:
    destroy @m_report;
перед
Код:
    sTable @m_report
Вернуться к началу
Посмотреть профиль Отправить личное сообщение Отправить e-mail
tveritin



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

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

tveritin писал(а):
Правда, на строках свыше 8000 символов еще не пробовал. Позже отпишусь о результатах.


В результате всё работает и со строками длиннее 8000 символов. Всем спасибо за помощь.
Вернуться к началу
Посмотреть профиль Отправить личное сообщение Отправить 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