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