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

Чудеса диалогов и формата времени

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



Зарегистрирован: 08.11.2013
Сообщения: 77
Откуда: Moscow

СообщениеДобавлено: Чт Июн 29, 2017 18:38    Заголовок сообщения: Чудеса диалогов и формата времени Ответить с цитатой

Есть диалог в котором прописано по блокам:

LET Инициализация:
Let @ddd:d_from = getdate();

SQL блок:
@ddd
select
d_from
from table1


Так вот, при таком написании при нажатии в диалоге кнопки "Добавить" в таблице table1 в колонку пропишется не только дата, но и время.

При этом, в диалоге в любом типе полей будет отображаться только дата, причем в формате yyyy-mm-dd, даже если в самом блоке инициализации написать return @ddd:d_from - вернет значение без времени.
Преобразовывать @ddd:d_from в блоке инициализации бесполезно,
но для нормального добавления значения в таблицу table1 с отсечкой по времени достаточно в блоке инициализации в самом конце прописать:
Alias @ddd:d_from=@ddd:d_from;

И, о чудо, теперь при нажатии "Добавить" в таблицу table1 пропишется значение даты, но уже с нулевым временем, т.е. время отсекается на этапе Alias @ddd:d_from=@ddd:d_from;
Вернуться к началу
Посмотреть профиль Отправить личное сообщение
RVV
Большой шоколадный орден
Большой шоколадный орден


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

СообщениеДобавлено: Чт Июн 29, 2017 18:50    Заголовок сообщения: Ответить с цитатой

В Let инициализации достаточно написать:
d_from = @@d_from;

а такая строка
Let @ddd:d_from = getdate();
означает не присвоение значения полю запроса, а объявление переменной с именем @ddd:d_from
Вернуться к началу
Посмотреть профиль Отправить личное сообщение
Joenka



Зарегистрирован: 08.11.2013
Сообщения: 77
Откуда: Moscow

СообщениеДобавлено: Пт Июн 30, 2017 12:42    Заголовок сообщения: Ответить с цитатой

Пускай так, но тем не менее остается непонятным:
а) Почему return @ddd:d_from возвращает данные без времени в формате yyyy-mm-dd ?
б) insert into table1 select @ddd:d_from запишет в sql таблицу данные без времени (точнее нулевое время) ?
в) А вот при нажатии на "Добавить" в окне диалога в таблицу table1 пропишутся данные, которые содержат и дату и время, причем не нулевое ?

И да, если это переменная, а не поле запроса, то чего эта переменная в таблицу лезет при нажатии на "Добавить"?

Конечно можно написать d_from = @@d_from; Но пример упрощенный, а в реальной ситуации как раз с этого начинается инициализация d_from = @@d_from; , а дальше много условий и в одном из условий Let @ddd:d_from = getdate();
И найти причину почему во всех диалогах добавление идет с нулевым временем, а тут нет бывает не так просто, к тому же банальный return и даже insert отрабатывают скажем так "нормально" (т.е. с нулевым временем)
Вернуться к началу
Посмотреть профиль Отправить личное сообщение
Green



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

СообщениеДобавлено: Сб Июл 01, 2017 14:38    Заголовок сообщения: Ответить с цитатой

Пишу инициализацию d_from = cast(getdate() as date), тогда в поля datetime пропишется с нулевым временем. Я понимаю так: при ретёрне и инсерте отрабатывает х-язык, обрабатывая переменную по умолчанию как date, то есть без времени, если специально не указать маску. А в диалоге отрабатывает tsql, который расценивает getdate() как datetime, то есть с указанным временем. Ведь то, что указано в коде инициализации фактически подставляется в исполняемый tsql скрипт.

Для проверки поля запроса обработайте переменную dlgname:fromd[yyyy-mm-dd HH:MM:SS], для проверки переменной тоже самое, или посмотреть в окне трассировки, как она хранится.

Обратите внимание, что в базовых диалогах используется инициализация вида:
d_from = @@d_from;
d_to = '2099-01-01';
, то есть обрабатывается переменная @@d_from по правилам х-языка, подставляется значение вида '2017-01-01', то есть без указания времени. Если же поставить getdate(), то обработка будет по правилам tsql, тогда getdate() вернёт дату со временем.

Будьте внимательны к таким полям, я когда первый раз столкнулся с этим, долго не мог разобраться, почему в выборку у меня не попадает один день - в where был between, в таблице поле с нулевым временем, а у меня с больше нулевого.

Для примера:
Переменная:
let dd_ = getdate();
return dd_ || dd_[yyyy-mm-dd HH:MM:SS];

диалог:
--------диалог: период - с даты по дату
alias _dlgresource = (
/*Dialog(rect,options), menu, sline, {help}*/
(0, 0, 460, 60, 0x8c80),,,{};

/*Lookup(pFilter,options),field,{sql},link,draw,data,'hint'*/
e, (20, 20, 80, 20, 0x0), "С даты", (20, 40, 80, 20, 0x104), 1, {@}, 0,2,1;
e, (140, 20, 80, 20, 0x0), "По дату", (140, 40, 80, 20, 0x104), 2, {@}, 0,2,1;

1, { --триггер Update
let dlg_fromd_ = @new:fromd as date;
let dlg_tod_ = @new:tod as date;
}; --триггер Update

5, { --let инициализация
fromd = getdate(); --указано время
-- fromd = cast(getdate() as date); --нулевое время
}; --let инициализация

); --_dlgresource


dialog {
/*init procedure*/
free dlg_fromd_, dlg_tod_;

/*tab procedure*/
tab {
if idfield = 0 then {
return @dlg:fromd || @dlg:fromd[yyyy-mm-dd HH:MM:SS];
};
}; --tab

/* sql */
@dlg
select
cast(@@xdate(1, 1, @@tyear) as date) as fromd
, cast(@@xdate(curdate) as date) as tod
; --select
}, 0x20, "~Выбор периода"

; --dialog

if _result == 11 then error;
--return dlg_fromd_, dlg_tod_;
--error;
--------диалог: период - с даты по дату
Вернуться к началу
Посмотреть профиль Отправить личное сообщение
Joenka



Зарегистрирован: 08.11.2013
Сообщения: 77
Откуда: Moscow

СообщениеДобавлено: Пн Июл 03, 2017 12:37    Заголовок сообщения: Ответить с цитатой

Так в том то и суть, что

let dd_ = getdate();

insert into table1
select dd_;

В таблицу попадет только дата!

А вот в диалоге при таком объявлении в таблицу при нажатии на "Добавить" (и нигде не задается никаких дополнительных условий) попадает и дата и время, т.е. получается что в диалоге это срабатывает как:

insert into table1
select dd_[yyyy-mm-dd HH:MM:SS];

но приходишь к этому чисто эмпирически Smile
Вернуться к началу
Посмотреть профиль Отправить личное сообщение
Показать сообщения:   
Начать новую тему   Ответить на тему    Список форумов 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