Независимый форум, посвященный системе БОСС-Кадровик и всему, что с ней связано
|
|
Предыдущая тема :: Следующая тема |
Автор |
Сообщение |
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];
но приходишь к этому чисто эмпирически  |
|
Вернуться к началу |
|
 |
|
|
Вы не можете начинать темы Вы не можете отвечать на сообщения Вы не можете редактировать свои сообщения Вы не можете удалять свои сообщения Вы не можете голосовать в опросах
|
|