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

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

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

Ответить
ahv
Новичок
Сообщения: 21
Зарегистрирован: 15 дек 2009, 07:52

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

Сообщение ahv »

жила-была запись к KatSopr. ее удалили.
сделали recordExists по нреку бывшей записи. первасив говорит, что такой нет. mssql говорит, есть.

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

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

почему?
galover
Местный житель
Сообщения: 794
Зарегистрирован: 16 ноя 2007, 13:52

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

Сообщение galover »

Тоже заметил что recordExists не всегда правильно работает, поэтому перестал пользоваться этой конструкцией. getfirst железобетонно
ahv
Новичок
Сообщения: 21
Зарегистрирован: 15 дек 2009, 07:52

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

Сообщение 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 сервере, но не знаю, как найти нужные.
ahv
Новичок
Сообщения: 21
Зарегистрирован: 15 дек 2009, 07:52

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

Сообщение 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 не передашь. специально создавать переменную - замусоривать код. что бы такое делать с полем, чтобы создавалась временная переменная, но не меняя значение...
galover
Местный житель
Сообщения: 794
Зарегистрирован: 16 ноя 2007, 13:52

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

Сообщение galover »

столько шаманства, нафига? чем getfirst fastfirstrow не устроил?
ahv
Новичок
Сообщения: 21
Зарегистрирован: 15 дек 2009, 07:52

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

Сообщение ahv »

нет гарантии, что с getfirst та же беда не случится. да и в длительных алгоритмах хочется оптимизации.
а главное, любопытство.
Ответить