Страница 1 из 1

проблема с recordExists под MSSQL

Добавлено: 12 ноя 2010, 08:28
ahv
жила-была запись к KatSopr. ее удалили.
сделали recordExists по нреку бывшей записи. первасив говорит, что такой нет. mssql говорит, есть.

если искать по нреку несуществовавшей ранее записи, то mssql не находит, все нормально.

если заменить на getfirst, то все всегда правильно.

почему?

Re: проблема с recordExists под MSSQL

Добавлено: 12 ноя 2010, 11:25
galover
Тоже заметил что recordExists не всегда правильно работает, поэтому перестал пользоваться этой конструкцией. getfirst железобетонно

Re: проблема с recordExists под MSSQL

Добавлено: 13 ноя 2010, 06:10
ahv

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

message(string(NA_SchFact.cKatSopr, 0, 0)); // -> 000100000001DCD2h
message(string(NA_SchFact.cKatSopr = 000100000001DCD2h))); // -> true
message(string(recordExists KatSopr where ((000100000001DCD2h == KatSopr.NRec)))); // -> tsNotFound
message(string(recordExists KatSopr where ((NA_SchFact.cKatSopr == KatSopr.NRec)))); // -> tsOk
message(string(recordExists KatSopr where ((comp(NA_SchFact.cKatSopr) == KatSopr.NRec)))); // -> tsNotFound
магия галактики. типы, разумеется, везде comp - проверил и перепроверил.

возможно, при прямом указании в запросе поля NA_SchFact.cKatSopr получается какой-нибудь join. а если приводить к comp, то, наверное, галактика, видя переменную, а не поле, пишет в запросе константу.
почитать бы создаваемые галактикой запросы на sql сервере, но не знаю, как найти нужные.

Re: проблема с recordExists под MSSQL

Добавлено: 13 ноя 2010, 10:36
ahv
нашел получающиеся запросы профайлером.

мое предположение оказалось верным - если писать comp(), то для получающейся временной переменной делается простой запрос с одним ограничением в where. если же писать в условие поле таблицы, то условие добавляется к общему запросу логической таблицы интерфейса - получается кипа left join'ов. неправильный результат дает потому, что процедура почему-то не принимает nrec текущей NA_SchFact в данном случае, соответственно в результате всегда возвращается выборка единиц в количестве равном количеству записей в NA_SchFact, удовлетворяющих другим условиям из вьюшки. однако такое происходит не в каждом случае. возможно, плохо влияют условия "periodFrom <<= NA_SchFact.dDoc and periodTo >>= NA_SchFact.dDoc"?

делаю вывод, что надо создавать временную переменную вызовом функции нужного типа.

но тогда возникает другая проблема. где гарантия, что, например, функция comp принимает параметр типа comp и не обрежет его до longInt? это для примера, на самом деле comp принимает comp нормально. но в date переменную типа date не передашь. специально создавать переменную - замусоривать код. что бы такое делать с полем, чтобы создавалась временная переменная, но не меняя значение...

Re: проблема с recordExists под MSSQL

Добавлено: 13 ноя 2010, 12:40
galover
столько шаманства, нафига? чем getfirst fastfirstrow не устроил?

Re: проблема с recordExists под MSSQL

Добавлено: 15 ноя 2010, 09:49
ahv
нет гарантии, что с getfirst та же беда не случится. да и в длительных алгоритмах хочется оптимизации.
а главное, любопытство.