Delphi 6 App. появляется сообщение об ошибке: таблица не проиндексирована - PullRequest
0 голосов
/ 08 октября 2009

Я получил приложение, разработанное в Delphi 6 с конструкцией master / detail. И мастер, и детализация требуют TQuery, чтобы открыть источник данных. Он работает нормально, когда мастер открывается первым, но после этого появляется сообщение об ошибке «Таблица не проиндексирована», когда деталь открывает источник данных.

Рабочий аккаунт для приложения. это SCHEMA_USER, который имеет триггер после входа в систему для переключения на SCHEMA_OWNER, это выглядит так:

CREATE OR REPLACE TRIGGER AFTER_LOGON_TRG
AFTER LOGON ON SCHEME_USER.SCHEMA
BEGIN
  --switch to  SCHEMA_OWNER schema
  DBMS_APPLICATION_INFO.set_module(USER,'Inilialized');
  EXECUTE IMMEDIATE 'ALTER SESSION SET current_schema=SCHEMA_OWNER';

END;

Я использую SCHEMA_USER для входа в БД и выполнения SQL deltail, и все работает нормально. Я не знаю, что происходит.

Итак, любая идея приветствуется.

Спасибо. !!

Давид, Привет

Ответы [ 2 ]

1 голос
/ 08 октября 2009

Сообщение об ошибке точно говорит вам, в чем проблема, я думаю.

Индекс в поле связывания таблицы подробностей необходим для того, чтобы при перемещении указателя записи основной таблицы можно было найти соответствующие строки в таблице подробностей. Сообщение об ошибке указывает на отсутствие индекса по необходимому столбцу в таблице сведений.

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

РЕДАКТИРОВАТЬ: после третьего комментария, описывающего детали схемы.

Ваша проблема здесь: «SQL подробного запроса: ... WHERE order_no =: order_no», а вы говорите: «4) order_no & custID - индекс двух столбцов». Вы используете только половину значения индекса, а таблица сведений не может понять, что делать.

Вам нужно либо:

1) Создать новый индекс только для order_no (что кажется плохой идеей)

или

2) (предпочтительно) Добавьте custID к SQL-запросу подробного запроса:

WHERE order_no = :order_no AND custID = :custID
0 голосов
/ 11 ноября 2009

Наконец мы выясняем, почему Delphi показывает сообщение об ошибке во время работы приложения. входит в систему как другой пользователь, установив CURRENT_SCHEMA в триггер AFTER LOGON.

Ниже приведены шаги, чтобы избежать ошибки:

  1. Использование TTable вместо TQuery для DETAIL (Master по-прежнему TQuery).
  2. Настройка Свойство IndexFieldNames вместо IndeName .

Тогда это работает.

Мы предполагаем, что Delphi, возможно, использует представление USER_INDEXES для запроса индексов, к которым оно может получить доступ, а не представление ALL_INDEXES, так что Delphi не может "правильно" получить индексы, которые должны быть рассмотрены. И это!

Спасибо, ребята!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...