опять dsql

Приемы и подходы, обмен опытом

Модераторы: Screw, larin

den
заказчик
Сообщения: 117
Зарегистрирован: Пт, 26/10/2007 14:16
Имя Фамилия: Денис Кучин
Откуда: Геомостпроект НПО

опять dsql

Сообщение den »

отдаю с помощью 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' , но все равно странные значения получаю
cruger
топ-софт
Сообщения: 566
Зарегистрирован: Пт, 21/09/2007 15:19
Имя Фамилия: Фёдор Терсин
Откуда: Галактика Софт
Контактная информация:

Сообщение cruger »

а зачем тут вообще dsql?
den
заказчик
Сообщения: 117
Зарегистрирован: Пт, 26/10/2007 14:16
Имя Фамилия: Денис Кучин
Откуда: Геомостпроект НПО

Сообщение den »

В каком смысле зачем ? нужно получить просто нормальный резалтсет в вип от скуля в случае, когда в таблице, имеющий внешний ключ на другую могут отсутствовать записи. Например, в случае, когда к позиции спецификации нет значения некого внешнего атрибута. MSСкуль в таком случае возвращает просто null. Вообщем хочу чтобы если нема такой записи (по Аталантическому not isvalidall) то просто нулевым нреком заместить это дело
(пример шибко упрощен, но суть именно в этом...)
sds

Сообщение sds »

А вы уверены, что там поле именно is null ?
В случае Oracle там хранится значение 8000000000000000
den
заказчик
Сообщения: 117
Зарегистрирован: Пт, 26/10/2007 14:16
Имя Фамилия: Денис Кучин
Откуда: Геомостпроект НПО

Сообщение den »

Поле здесь не причем - в таком случае (описанным мной) msскуль просто возвращает null.
Думаю,Oracle тоже - если по left join-у ничего не найдется.
Видимо как то че та некорректно преобразуется обратно в атлантисе. Потому как если пихаешь поле nrec-а, с действительн существующим занчением не NUll, то все ок возвращается (т.е. в моем случае 'Select t1.nrec.... t1.nrec приходит тот же.. )
cruger
топ-софт
Сообщения: 566
Зарегистрирован: Пт, 21/09/2007 15:19
Имя Фамилия: Фёдор Терсин
Откуда: Галактика Софт
Контактная информация:

Сообщение cruger »

Ну так а зачем в этом случае dsql применять? Чем обычный lot не устраивает?
den
заказчик
Сообщения: 117
Зарегистрирован: Пт, 26/10/2007 14:16
Имя Фамилия: Денис Кучин
Откуда: Геомостпроект НПО

Сообщение den »

Еще раз ...пример сильно утрирован, но суть именно в этом "нужно получить просто нормальный резалтсет в вип от скуля в случае, когда в таблице, имеющий внешний ключ на другую могут отсутствовать записи." А нужно это для убыстрения времени выборки результата. Так как корневая таблица выборки сильно растет(а нужно выбирать не по индексу, исходя из условий...) и хочется сделать задел на будущее в плане скорости работы. Вообщем я так и не понял как это можно сделать и можно ли вообще. Пришлось несколько упростить и переделать алгоритм получения нужного результата,к сожалению...
ilshat
заказчик партнера
Сообщения: 63
Зарегистрирован: Чт, 05/06/2008 11:09
Имя Фамилия: Ильшат Фахрисламов
Откуда: Каустик

Сообщение ilshat »

Вы сами так толком и не написали какой результат вам нужен.
Вот за такие фразу на серьезных форумах запинают сразу:

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

шо бы значение нормальное вернулось в приbind-ное поле типа comp
Скажите толком сколько вешать в граммах? Что вы хотите то? Вас не устраивает NULL?
Ну тогда пишите так:

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

CONVERT(BINARY(8),0+CONVERT(BIGINT,0x8000000000000000))
den
заказчик
Сообщения: 117
Зарегистрирован: Пт, 26/10/2007 14:16
Имя Фамилия: Денис Кучин
Откуда: Геомостпроект НПО

Сообщение den »

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 один к одному (вместо параметров подставя реальные значения), то все корректно.
ilshat
заказчик партнера
Сообщения: 63
Зарегистрирован: Чт, 05/06/2008 11:09
Имя Фамилия: Ильшат Фахрисламов
Откуда: Каустик

Сообщение ilshat »

Погодите, дык вы параметры суете ему. А вопрос, я как понял, был про нулевой нрек.
Простой запрос киньте без параметров.
den
заказчик
Сообщения: 117
Зарегистрирован: Пт, 26/10/2007 14:16
Имя Фамилия: Денис Кучин
Откуда: Геомостпроект НПО

Сообщение den »

А при чем тут параметры и нулевой нрек )
Если Вы о варианте 2, то да...попробовал ради интереса через параметр, но получил как ,видите 'Параметры в секции SELECT в данный момент не поддерживаются.
ilshat
заказчик партнера
Сообщения: 63
Зарегистрирован: Чт, 05/06/2008 11:09
Имя Фамилия: Ильшат Фахрисламов
Откуда: Каустик

Сообщение ilshat »

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

 AND AT.CATTRNAM=? AND AT.VCOMP=? 
везде же у вас запрос с параметрами... в секции where

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

case when reft.CRECORD2 is null then CONVERT(BINARY(8),0+CONVERT(BIGINT,0x8000000000000000)) else reft.CRECORD2 end
вот без этого пашет ?
den
заказчик
Сообщения: 117
Зарегистрирован: Пт, 26/10/2007 14:16
Имя Фамилия: Денис Кучин
Откуда: Геомостпроект НПО

Сообщение den »

Параметры не имеют значения. Результат возвращается тот же по набору записей, единственнвенное то, что выражение

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, когда сопроводительный документ создан без ДО (не по ДО...)
cruger
топ-софт
Сообщения: 566
Зарегистрирован: Пт, 21/09/2007 15:19
Имя Фамилия: Фёдор Терсин
Откуда: Галактика Софт
Контактная информация:

Сообщение cruger »

судя по запросам - выполняется это всё на mssql
isnull в dsql не заявлен, заявлен coalesce
тем не менее тут проблема не в этом
в чём - неясно, надо разбираться, обратитесь в тп

тем не менее я бы посоветовал ориентироваться на dsql только для очень сложных запросов
пока я сложности, оправдывающей применение dsql, не вижу
den
заказчик
Сообщения: 117
Зарегистрирован: Пт, 26/10/2007 14:16
Имя Фамилия: Денис Кучин
Откуда: Геомостпроект НПО

Сообщение den »

cruger писал(а): ...
тем не менее я бы посоветовал ориентироваться на dsql только для очень сложных запросов
пока я сложности, оправдывающей применение dsql, не вижу
Интересно было бы знать каковы критерии Ваши сложного запроса
Ответить