опять dsql
-
- заказчик
- Сообщения: 117
- Зарегистрирован: Пт, 26/10/2007 14:16
- Имя Фамилия: Денис Кучин
- Откуда: Геомостпроект НПО
опять dsql
отдаю с помощью sqlAddStr & SqlPrepare & SqlExec след вида запрос
sqlAddStr(stmt_str, 'Select t1.nrec, case when t2.crec is null then 0 else t2.crec end '+
'from t1 left outer join t2 on t1.nrec=t2.crec'
);
Все хорошо, но проблема в вычисляемом последнем поле последнем
Т.е. как бы сказать корректно в случае left outer join t2 шо бы значение нормальное вернулось в приbind-ное поле типа comp...у меня почему то возвращается в переменую странное значение.
пробовал и 'case when t2.crec is null then 0x8001000000000000 else t2.crec end' , но все равно странные значения получаю
sqlAddStr(stmt_str, 'Select t1.nrec, case when t2.crec is null then 0 else t2.crec end '+
'from t1 left outer join t2 on t1.nrec=t2.crec'
);
Все хорошо, но проблема в вычисляемом последнем поле последнем
Т.е. как бы сказать корректно в случае left outer join t2 шо бы значение нормальное вернулось в приbind-ное поле типа comp...у меня почему то возвращается в переменую странное значение.
пробовал и 'case when t2.crec is null then 0x8001000000000000 else t2.crec end' , но все равно странные значения получаю
-
- заказчик
- Сообщения: 117
- Зарегистрирован: Пт, 26/10/2007 14:16
- Имя Фамилия: Денис Кучин
- Откуда: Геомостпроект НПО
В каком смысле зачем ? нужно получить просто нормальный резалтсет в вип от скуля в случае, когда в таблице, имеющий внешний ключ на другую могут отсутствовать записи. Например, в случае, когда к позиции спецификации нет значения некого внешнего атрибута. MSСкуль в таком случае возвращает просто null. Вообщем хочу чтобы если нема такой записи (по Аталантическому not isvalidall) то просто нулевым нреком заместить это дело
(пример шибко упрощен, но суть именно в этом...)
(пример шибко упрощен, но суть именно в этом...)
-
- заказчик
- Сообщения: 117
- Зарегистрирован: Пт, 26/10/2007 14:16
- Имя Фамилия: Денис Кучин
- Откуда: Геомостпроект НПО
Поле здесь не причем - в таком случае (описанным мной) msскуль просто возвращает null.
Думаю,Oracle тоже - если по left join-у ничего не найдется.
Видимо как то че та некорректно преобразуется обратно в атлантисе. Потому как если пихаешь поле nrec-а, с действительн существующим занчением не NUll, то все ок возвращается (т.е. в моем случае 'Select t1.nrec.... t1.nrec приходит тот же.. )
Думаю,Oracle тоже - если по left join-у ничего не найдется.
Видимо как то че та некорректно преобразуется обратно в атлантисе. Потому как если пихаешь поле nrec-а, с действительн существующим занчением не NUll, то все ок возвращается (т.е. в моем случае 'Select t1.nrec.... t1.nrec приходит тот же.. )
-
- заказчик
- Сообщения: 117
- Зарегистрирован: Пт, 26/10/2007 14:16
- Имя Фамилия: Денис Кучин
- Откуда: Геомостпроект НПО
Еще раз ...пример сильно утрирован, но суть именно в этом "нужно получить просто нормальный резалтсет в вип от скуля в случае, когда в таблице, имеющий внешний ключ на другую могут отсутствовать записи." А нужно это для убыстрения времени выборки результата. Так как корневая таблица выборки сильно растет(а нужно выбирать не по индексу, исходя из условий...) и хочется сделать задел на будущее в плане скорости работы. Вообщем я так и не понял как это можно сделать и можно ли вообще. Пришлось несколько упростить и переделать алгоритм получения нужного результата,к сожалению...
-
- заказчик партнера
- Сообщения: 63
- Зарегистрирован: Чт, 05/06/2008 11:09
- Имя Фамилия: Ильшат Фахрисламов
- Откуда: Каустик
Вы сами так толком и не написали какой результат вам нужен.
Вот за такие фразу на серьезных форумах запинают сразу:
Скажите толком сколько вешать в граммах? Что вы хотите то? Вас не устраивает NULL?
Ну тогда пишите так:
Вот за такие фразу на серьезных форумах запинают сразу:
Код: Выделить всё
шо бы значение нормальное вернулось в приbind-ное поле типа comp
Ну тогда пишите так:
Код: Выделить всё
CONVERT(BINARY(8),0+CONVERT(BIGINT,0x8000000000000000))
-
- заказчик
- Сообщения: 117
- Зарегистрирован: Пт, 26/10/2007 14:16
- Имя Фамилия: Денис Кучин
- Откуда: Геомостпроект НПО
читаем Выше :ilshat писал(а):Вы сами так толком и не написали какой результат вам нужен.
"
Вообщем хочу чтобы если нема такой записи (по Аталантическому not isvalidall) то просто нулевым нреком заместить это дело
"
Вообщем не прокатывает никак. Не понимает он похоже никак вот такую штуку 0x8000000000000000. Запрос на субд даже не попадает, по всей видимости, т.к. Атлантис отпинывает обратно запрос собранный. Например :
Вариант 1 :
31.03.2009 10:24:49 [DENIS]:
Select k.dsopr,k.nsopr,p.fio,u.name,k.nrec,sp.nrec,sp.kolfact,sp.price,k.cschfact,isnull(reft.CRECORD2,0x8000000000000000)
from attrval at inner join SPSOPR SP on AT.CREC=SP.NREC and AT.WTABLE=1110 AND AT.CATTRNAM=? AND AT.VCOMP=? inner join PERSONS P on at.vcomp=p.nrec inner join KATSOPR K on SP.CSOPR=K.NREC AND K.DSOPR<? inner join KATUSL U on SP.CMCUSL = U.NREC
left outer join reftable reft on sp.nrec = reft.CRECORD1 and reft.wAccount=97 and reft.WMAIN=98 and reft.WSUB=0 and reft.WTABLE1=1110 and reft.wtable2=9015
31.03.2009 10:24:49 [DENIS]:
Ошибка(1,103): Синтаксическая ошибка в выражении
31.03.2009 10:24:49 [DENIS]:
HY010: [Microsoft][Диспетчер драйверов ODBC] Ошибка последовательности функций
31.03.2009 10:24:49 [DENIS]:
HY010: [Microsoft][Диспетчер драйверов ODBC] Ошибка последовательности функций
Вариант 2 (попробовал передать через параметр comp(0)):
31.03.2009 10:30:56 [DENIS]:
Select k.dsopr,k.nsopr,p.fio,u.name,k.nrec,sp.nrec,sp.kolfact,sp.price,k.cschfact,isnull(reft.CRECORD2,?)
from attrval at inner join SPSOPR SP on AT.CREC=SP.NREC and AT.WTABLE=1110 AND AT.CATTRNAM=? AND AT.VCOMP=? inner join PERSONS P on at.vcomp=p.nrec inner join KATSOPR K on SP.CSOPR=K.NREC AND K.DSOPR<? inner join KATUSL U on SP.CMCUSL = U.NREC
left outer join reftable reft on sp.nrec = reft.CRECORD1 and reft.wAccount=97 and reft.WMAIN=98 and reft.WSUB=0 and reft.WTABLE1=1110 and reft.wtable2=9015
31.03.2009 10:30:56 [DENIS]:
Ошибка(1,104): Параметры в секции SELECT в данный момент не поддерживаются
31.03.2009 10:30:56 [DENIS]:
HY010: [Microsoft][Диспетчер драйверов ODBC] Ошибка последовательности функций
31.03.2009 10:30:56 [DENIS]:
HY010: [Microsoft][Диспетчер драйверов ODBC] Ошибка последовательности функций
Вариант 3 :
31.03.2009 10:39:31 [DENIS]:
Select k.dsopr,k.nsopr,p.fio,u.name,k.nrec,sp.nrec,sp.kolfact,sp.price,k.cschfact,case when reft.CRECORD2 is null then CONVERT(BINARY(8),0+CONVERT(BIGINT,0x8000000000000000)) else reft.CRECORD2 end
from attrval at inner join SPSOPR SP on AT.CREC=SP.NREC and AT.WTABLE=1110 AND AT.CATTRNAM=? AND AT.VCOMP=? inner join PERSONS P on at.vcomp=p.nrec inner join KATSOPR K on SP.CSOPR=K.NREC AND K.DSOPR<? inner join KATUSL U on SP.CMCUSL = U.NREC
left outer join reftable reft on sp.nrec = reft.CRECORD1 and reft.wAccount=97 and reft.WMAIN=98 and reft.WSUB=0 and reft.WTABLE1=1110 and reft.wtable2=9015
31.03.2009 10:39:31 [DENIS]:
Ошибка(1,154): Синтаксическая ошибка в выражении
31.03.2009 10:39:31 [DENIS]:
HY010: [Microsoft][Диспетчер драйверов ODBC] Ошибка последовательности функций
31.03.2009 10:39:31 [DENIS]:
HY010: [Microsoft][Диспетчер драйверов ODBC] Ошибка последовательности функций
Замечу, что если выполнить такие селекты непосредственно через QA один к одному (вместо параметров подставя реальные значения), то все корректно.
-
- заказчик партнера
- Сообщения: 63
- Зарегистрирован: Чт, 05/06/2008 11:09
- Имя Фамилия: Ильшат Фахрисламов
- Откуда: Каустик
Код: Выделить всё
AND AT.CATTRNAM=? AND AT.VCOMP=?
Код: Выделить всё
case when reft.CRECORD2 is null then CONVERT(BINARY(8),0+CONVERT(BIGINT,0x8000000000000000)) else reft.CRECORD2 end
-
- заказчик
- Сообщения: 117
- Зарегистрирован: Пт, 26/10/2007 14:16
- Имя Фамилия: Денис Кучин
- Откуда: Геомостпроект НПО
Параметры не имеют значения. Результат возвращается тот же по набору записей, единственнвенное то, что выражение
case when reft.CRECORD2 is null then CONVERT(BINARY(8),0+CONVERT(BIGINT,0x8000000000000000)) else reft.CRECORD2 end
возвращает какие то странные цифири, когда получается null
Можете попробовать у себя простенький :
select sp.nrec,sps.nrec from spsopr sp left outer join spstep sps on sp.cspstep=sps.nrec
и посмотрите что возвращается в sps.nrec, когда сопроводительный документ создан без ДО (не по ДО...)
case when reft.CRECORD2 is null then CONVERT(BINARY(8),0+CONVERT(BIGINT,0x8000000000000000)) else reft.CRECORD2 end
возвращает какие то странные цифири, когда получается null
Можете попробовать у себя простенький :
select sp.nrec,sps.nrec from spsopr sp left outer join spstep sps on sp.cspstep=sps.nrec
и посмотрите что возвращается в sps.nrec, когда сопроводительный документ создан без ДО (не по ДО...)
-
- топ-софт
- Сообщения: 566
- Зарегистрирован: Пт, 21/09/2007 15:19
- Имя Фамилия: Фёдор Терсин
- Откуда: Галактика Софт
- Контактная информация:
судя по запросам - выполняется это всё на mssql
isnull в dsql не заявлен, заявлен coalesce
тем не менее тут проблема не в этом
в чём - неясно, надо разбираться, обратитесь в тп
тем не менее я бы посоветовал ориентироваться на dsql только для очень сложных запросов
пока я сложности, оправдывающей применение dsql, не вижу
isnull в dsql не заявлен, заявлен coalesce
тем не менее тут проблема не в этом
в чём - неясно, надо разбираться, обратитесь в тп
тем не менее я бы посоветовал ориентироваться на dsql только для очень сложных запросов
пока я сложности, оправдывающей применение dsql, не вижу