Страница 1 из 1
coalesce
Добавлено: 07 окт 2014, 09:34
novichok
Подскажите, почему
select schfact.dfact выдаёт дату, а
select coalesce(schfact.dfact,'') какое-то число, хрен знает откуда взятое?
И coalesce(schfact.dfact,0), и coalesce(schfact.dfact,#date(0,0,0000)) тоже выдают это число.
В запросе есть left join, поэтому юзаю coalesce, как же быть в такой ситуации?
Re: coalesce
Добавлено: 07 окт 2014, 11:06
RAJAH
В MS SQL "галактическая" дата хранится в виде числа: '2014-10-07' => '7DE-0A-07' => 7DE0A07 => 131992071. Надо преобразовывать!
Re: coalesce
Добавлено: 07 окт 2014, 11:23
novichok
Во дела! А как преобразовывать?
Re: coalesce
Добавлено: 07 окт 2014, 11:27
edward_K
#date(0,0,0000) плохо пашет. Попробуйте #date(1,1,1900). А вообще да - с пустыми датами есть проблема
Re: coalesce
Добавлено: 07 окт 2014, 11:43
novichok
#date(1,1,1900) тоже число выдаёт
Re: coalesce
Добавлено: 07 окт 2014, 12:36
Den
Вам это запрос нужен чисто аналитический в саппорт/sql ?
Re: coalesce
Добавлено: 07 окт 2014, 13:22
novichok
Den писал(а):Вам это запрос нужен чисто аналитический в саппорт/sql ?
Нет, в vip-е пишу программу с этим запросом
Re: coalesce
Добавлено: 07 окт 2014, 14:00
RAJAH
novichok писал(а):Den писал(а):Вам это запрос нужен чисто аналитический в саппорт/sql ?
Нет, в vip-е пишу программу с этим запросом
Тогда выведенное значение обработайте какой-нибудь функцией преобразования.
Например...
Re: coalesce
Добавлено: 07 окт 2014, 14:43
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 то да - выводится как описано топикстартером.
Re: coalesce
Добавлено: 07 окт 2014, 15:55
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.
Re: coalesce
Добавлено: 07 окт 2014, 20:38
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.
все работает