В каких случаях GetFirst возвращает tsNotFound?

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

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

Ответить
SergZol
заказчик
Сообщения: 83
Зарегистрирован: Пн, 10/12/2007 13:24
Имя Фамилия: Сергей Золотухин
Откуда: Северо-Западные Магистральные Нефтепроводы
Контактная информация:

В каких случаях GetFirst возвращает tsNotFound?

Сообщение SergZol »

Перестал обрабатываться в программе(vip) GetFirst KatOrg!
В таблице 6000 записей, а GetFirst KatOrg возвращает tsNotFound.

В чем проблема? Очень надо!!!

PS . Есть какие-то ограничения использования GetFirst при наличии в таблице записей с разными номерами офисов
vadim
топ-софт
Сообщения: 197
Зарегистрирован: Чт, 06/09/2007 17:38
Имя Фамилия: Вадим Володько
Откуда: ТопСофт
Контактная информация:

Сообщение vadim »

Неплохо было бы указать, какая у Вас СУБД, включена ли филиальность по проблемной таблице, да и просто фрагмент кода в конце концов :-? .
А то наши штатные телепаты в отпуске :lol: .

Некоторые из наиболее распространенных вариантов:

1. Прежде всего, tsNotFound может выдаваться, когда по заданному ключу не найдено записей.
Например, результат вот такого фрагмента будет всегда tsNotFound вне зависимости от количества записей в таблице:

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

GetFirst Table where ((0 == Table.NRec))
2. Если по таблице включена филиальность, а права у пользователя, выполняющего GetFirst, распространены только на определенный офис (и записей в данной таблицы по данному офису нет) - результат tsNotFound также неудивителен.

3. В случае с СУБД Oracle не выполняется регламентное администрирование (сбор статистики). Без этого Oracle не просто катастрофически теряет производительность, но даже не гарантирует поиск записей. См. руководство администратора Oracle :shuffle:
SergZol
заказчик
Сообщения: 83
Зарегистрирован: Пн, 10/12/2007 13:24
Имя Фамилия: Сергей Золотухин
Откуда: Северо-Западные Магистральные Нефтепроводы
Контактная информация:

Сообщение SergZol »

1. СУБД Oracle 10g
2. филиальности нет, присутствуют записи с разыми номерами офиса.
3.

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

        pCustomer:=comp(0);
        if RunInterface('L_KATORG::GETKATOR', pCustomer, comp(0),false,comp(0),comp(0)) <> cmCancel
        {
          if(GetFirst Katorg where ((pCustomer == Katorg.NREC)) = tsOK)
          {
// Сюда не попадает, хотя pCustomer имеет значение которое присутствует в таблице
           sKontragent:=katorg.name;
          }
4.
регламентное администрирование (сбор статистики).
См. руководство администратора Oracle
подскажите какой это именно документ(название), я у себя найти не могу.
Ged
топ-софт
Сообщения: 76
Зарегистрирован: Вс, 16/09/2007 10:23
Имя Фамилия: Леонид Поликутин
Откуда: Галактика СПб
Контактная информация:

Сообщение Ged »

подскажите какой это именно документ(название), я у себя найти не могу.
Так как корпорация не может (по сути и не должна) выпускать документацию на сторонний програмный продукт, в т.ч. и Oracle, надо искать самому.

Например, см. www.sql.ru
или
http://download.oracle.com/docs/cd/B193 ... PFGRF30102
п.п. 14.3.1 Gathering Statistics with DBMS_STATS Procedures
SergZol
заказчик
Сообщения: 83
Зарегистрирован: Пн, 10/12/2007 13:24
Имя Фамилия: Сергей Золотухин
Откуда: Северо-Западные Магистральные Нефтепроводы
Контактная информация:

Сообщение SergZol »

То что есть sql.ru и документация по функциям самой СУБД, я в курсе.
Я спрашивал продокумент в котором написано следующее:
Без этого Oracle не просто катастрофически теряет производительность, но даже не гарантирует поиск записей.
В документации самого оракла написано про производительность, а то что не гарантирован поиск записей я что-то там такого не встречал.
vadim
топ-софт
Сообщения: 197
Зарегистрирован: Чт, 06/09/2007 17:38
Имя Фамилия: Вадим Володько
Откуда: ТопСофт
Контактная информация:

Сообщение vadim »

Сергей, это из опыта.
Мы не можем цитировать чужие документации и давать гарантии за наличие чего-то в документации на Oracle.

Но можем настоятельно рекомендовать и даже требовать: используйте все регламентные процедуры, к которым обязывает Oracle.
В противном случае - при неадекватном поведении СУБД - Галактика это никак не исправит.
SergZol
заказчик
Сообщения: 83
Зарегистрирован: Пн, 10/12/2007 13:24
Имя Фамилия: Сергей Золотухин
Откуда: Северо-Западные Магистральные Нефтепроводы
Контактная информация:

Сообщение SergZol »

СУБД адекватно.
Создал временный интерфейс где из всего кода оставил только выбор контрагента и код стал отрабатывать.
Весть код очень большой, может есть соображения об возможных причинах когда getfirst возвращает notfound.
cruger
топ-софт
Сообщения: 566
Зарегистрирован: Пт, 21/09/2007 15:19
Имя Фамилия: Фёдор Терсин
Откуда: Галактика Софт
Контактная информация:

Сообщение cruger »

Сергей, причин - полно. Например - наличие жёсткой подцепки к Katorg какой-то таблицы, в которой для pCustomer == Katorg.NREC записей нет. Перечислить все причины никакой возможности нет. Поэтому попробуйте сами разобраться в своём коде, почему он перестал работать. Может быть что-то меняли в последнее время. Или пробуйте понемногу упрощать интерфейс. А можно ещё посмотреть ораклёвым трэйсом, какие запросы идут. Так же их можно посмотреть с помощью драйвера с протоколом, распостраняемым с Атлантисом, и кроме того высылаемым техподдержкой в подобных случаях.
SergZol
заказчик
Сообщения: 83
Зарегистрирован: Пн, 10/12/2007 13:24
Имя Фамилия: Сергей Золотухин
Откуда: Северо-Западные Магистральные Нефтепроводы
Контактная информация:

Сообщение SergZol »

:( Буду копать. Я просто надеялся, что у кого-то было и задача решается просто.
vadim
топ-софт
Сообщения: 197
Зарегистрирован: Чт, 06/09/2007 17:38
Имя Фамилия: Вадим Володько
Откуда: ТопСофт
Контактная информация:

Сообщение vadim »

Чтобы быстро понять, не установлено ли жестких подцепок, достаточно сделать GetFirst не по KatOrg, а по синониму, объявив его в select рядом с katorg:

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

select 
  * 
from
   ...
, Katorg
, KatOrg KatOrg001
   ...
Да и вообще, синонимы обычно лучше использовать для временных целей: гарантированно не испортится буфер текущей записи, не поплывет отображение или работа каких-либо из встроенных алгоритмов Галактики, базирующихся на текущем буфере.

Большинство ведь ленится делать pushpos и poppos до и после вставки своего фрагмента кода (или вообще не понимает, когда и зачем это нужно) ;-)
Ответить