coalesce

Программирование на Атлантисе (VIP, FCOM, ARD), FastReport

Модераторы: m0p3e, edward_K, Модераторы

Ответить
novichok
Постоянный гость
Сообщения: 79
Зарегистрирован: 10 апр 2013, 09:24

coalesce

Сообщение novichok »

Подскажите, почему
select schfact.dfact выдаёт дату, а
select coalesce(schfact.dfact,'') какое-то число, хрен знает откуда взятое?
И coalesce(schfact.dfact,0), и coalesce(schfact.dfact,#date(0,0,0000)) тоже выдают это число.

В запросе есть left join, поэтому юзаю coalesce, как же быть в такой ситуации?
RAJAH
Местный житель
Сообщения: 932
Зарегистрирован: 18 фев 2008, 12:49

Re: coalesce

Сообщение RAJAH »

В MS SQL "галактическая" дата хранится в виде числа: '2014-10-07' => '7DE-0A-07' => 7DE0A07 => 131992071. Надо преобразовывать!
novichok
Постоянный гость
Сообщения: 79
Зарегистрирован: 10 апр 2013, 09:24

Re: coalesce

Сообщение novichok »

Во дела! А как преобразовывать?
edward_K
Заслуженный деятель интернет-сообщества
Сообщения: 5188
Зарегистрирован: 29 мар 2005, 17:49
Откуда: SPB galaxy spb

Re: coalesce

Сообщение edward_K »

#date(0,0,0000) плохо пашет. Попробуйте #date(1,1,1900). А вообще да - с пустыми датами есть проблема
novichok
Постоянный гость
Сообщения: 79
Зарегистрирован: 10 апр 2013, 09:24

Re: coalesce

Сообщение novichok »

#date(1,1,1900) тоже число выдаёт :-(
Den
Местный житель
Сообщения: 1844
Зарегистрирован: 29 мар 2005, 17:49
Откуда: Ярославская область ОАО "Часовой завод Чайка" г. Углич
Контактная информация:

Re: coalesce

Сообщение Den »

Вам это запрос нужен чисто аналитический в саппорт/sql ?
novichok
Постоянный гость
Сообщения: 79
Зарегистрирован: 10 апр 2013, 09:24

Re: coalesce

Сообщение novichok »

Den писал(а):Вам это запрос нужен чисто аналитический в саппорт/sql ?
Нет, в vip-е пишу программу с этим запросом
RAJAH
Местный житель
Сообщения: 932
Зарегистрирован: 18 фев 2008, 12:49

Re: coalesce

Сообщение RAJAH »

novichok писал(а):
Den писал(а):Вам это запрос нужен чисто аналитический в саппорт/sql ?
Нет, в vip-е пишу программу с этим запросом
Тогда выведенное значение обработайте какой-нибудь функцией преобразования. Например...
Den
Местный житель
Сообщения: 1844
Зарегистрирован: 29 мар 2005, 17:49
Откуда: Ярославская область ОАО "Часовой завод Чайка" г. Углич
Контактная информация:

Re: coalesce

Сообщение Den »

У меня код :

Код: Выделить всё

Interface ljoin;
 table struct tempdate
 (
   baseddoc :date
  ,nodoc    :string[20]
  ,soprddoc :date
 )
  ;
 create view
   from tempdate
  ;

HandleEvent
 Cminit:{

sql select basedoc.ddoc as baseddoc
          ,basedoc.nodoc  as nodoc
          ,coalesce(katsopr.dsopr,#date(0,0,0)) as soprddoc
          from basedoc inner join stepdoc on basedoc.nrec=stepdoc.cbasedoc and basedoc.viddoc=201
                       left join katsopr on stepdoc.nrec=katsopr.cstepdoc
  into tempdate byname;


            _loop tempdate
             logstrtofile('c:\debug\123.txt',tempdate.baseddoc+'----'+tempdate.nodoc+'----'+tempdate.soprddoc);

        }
end;
end.
кажет то даты намано высчитываются из накладных.

а вот если запустить сей dsql запрос из саппорт/sql то да - выводится как описано топикстартером.
novichok
Постоянный гость
Сообщения: 79
Зарегистрирован: 10 апр 2013, 09:24

Re: coalesce

Сообщение novichok »

Вот такой у меня запрос глючит:

Код: Выделить всё

stmt := sqlAllocStmt;
  sqlAddStr(query,'select katorg.name,grsopr.nsopr,grsopr.dsopr,katsopr.nsopr,katsopr.dsopr,katsopr.summa,katsopr.snalogs,');
  sqlAddStr(query,'coalesce(schfact.num,'#39+''#39+'),coalesce(schfact.dfact,'#39+''#39+'),');
  sqlAddStr(query,'grsopr.nrec,coalesce(gruzopol.name,'#39+''#39+'),');
  sqlAddStr(query,'basedoc.nodoc,basedoc.ddoc,basedoc.total,basedoc.nds,basedoc.nrec,');
  sqlAddStr(query,'coalesce(schfact.nrec,0) from grsopr ');
  sqlAddStr(query,'inner join katorg on grsopr.corg=katorg.nrec ');
  sqlAddStr(query,'left join katorg gruzopol on grsopr.cgruzto=gruzopol.nrec ');
  sqlAddStr(query,'inner join katsopr on katsopr.cgrsopr=grsopr.nrec ');
  sqlAddStr(query,'left join schfact on katsopr.cschfact=schfact.nrec ');
  sqlAddStr(query,'inner join stepdoc on katsopr.cstepdoc=stepdoc.nrec inner join basedoc on stepdoc.cbasedoc=basedoc.nrec ');
  sqlAddStr(query,'where grsopr.vidsopr=201 and katsopr.vidsopr=201 and katsopr.wadoc=0 ');
  sqlAddStr(query,'and (grsopr.dsopr between #date('+day(d_n)+','+month(d_n)+','+year(d_n)+') and #date('+day(d_k)+','+month(d_k)+','+year(d_k)+')) ');
  sqlAddStr(query,'order by katorg.name,coalesce(gruzopol.name,'#39+''#39+'),grsopr.dsopr,grsopr.nsopr,basedoc.ddoc,basedoc.nodoc,katsopr.dsopr,katsopr.nsopr');

  k_osh:=sqlPrepare(stmt,query);    
Буду по совету RAJAH преобразовывать перед выводом в excel.
Den
Местный житель
Сообщения: 1844
Зарегистрирован: 29 мар 2005, 17:49
Откуда: Ярославская область ОАО "Часовой завод Чайка" г. Углич
Контактная информация:

Re: coalesce

Сообщение Den »

Код: Выделить всё

Interface ljoin;
 table struct tempdate
 (
   baseddoc :date
  ,nodoc    :string[20]
  ,soprddoc :date
 )
  ;
 create view
  var query,stmt :longint;

   from tempdate
  ;

HandleEvent
 Cminit:{
              stmt := sqlAllocStmt;
        	  sqlAddStr(query, ' select basedoc.ddoc as baseddoc');
        	  sqlAddStr(query, '       ,basedoc.nodoc  as nodoc');
        	  sqlAddStr(query, '       ,coalesce(katsopr.dsopr,#date(0,0,0)) as soprddoc');
        	  sqlAddStr(query, '   from basedoc inner join stepdoc on basedoc.nrec=stepdoc.cbasedoc and basedoc.viddoc=201');
        	  sqlAddStr(query, '       left join katsopr on stepdoc.nrec=katsopr.cstepdoc');
   			  sqlPrepare(stmt,query);
			  sqlExecute(stmt);
 				  if (sqlFetchInto(stmt,#tempdate) != tsOk)
				        Message('неудача :(');
			  	  sqlFreeStmt(stmt);


            _loop tempdate
             logstrtofile('c:\debug\123.txt',tempdate.baseddoc+'----'+tempdate.nodoc+'----'+tempdate.soprddoc);

        }
end;
end.
все работает
Ответить