|
Вопрос # 837/ вопрос открыт / |
|
Здравствуйте!
Работаю в D7c FB 2.0 используя компоненты Interbase (IBX).
Вопрос: Есть связка таблиц МАСТЕР-ПОДЧИНЕННАЯ. В Подчиненной таблице создаю поле типа fkCalculated или fkInternalCalc (вычисляемое, в общем). Теперь ПОДЧИНЕННУЮ таблицу необходимо сортировать по индексу, связанному с вычисляемым полем (допустим CALCFIELD). Так как в свойстве IndexFieldName стоит имя основного ключа для связи таблиц (допустим, KEYFIELD), то я создаю составной индекс командой
IBMyTable.AddIndex(\'NEW_IDX\', \'KEYFIELD;CALCFIELD\', []);
IBMyTable.IndexFieldNames:=\'KEYFIELD;CALCFIELD\';
Но тут прога стопорится, и выдает, что поля типа CALCFIELD не существует, причем это сообщение продолжает выдавать и после того, как удаляю строку по созданию индекса, приходится полностью удалять вычисляемое поле и вставлять его заново.
Подскажите, как можно организовать сортировку в ПОДЧИНЕННОЙ таблице по вычисляемому полю.
 |
Вопрос задал: Ed (статус: 1-ый класс)
Вопрос отправлен: 7 августа 2007, 16:49
Состояние вопроса: открыт, ответов: 0.
|
Мини-форум вопроса
Всего сообщений: 5; последнее сообщение — 8 августа 2007, 12:21; участников в обсуждении: 2.
|
Ed (статус: 1-ый класс), 8 августа 2007, 11:43 [#1]:
Пояснение по ошибке: класс EIBInterBaseError \'Dynamic SQL ERROR. SQL Error Code=-206. Column unknown. DSA at line ... column...\'.
Т.е., прога пытается (как я поняд) провести индексацию на стороне сервера, который и не знает, что к таблице было добавлено вычисляемое поле.
|
|
Ed (статус: 1-ый класс), 8 августа 2007, 11:48 [#2]:
Дополнительно: IBQuery в данном случае не использую, т.к. данные связанных таблиц необходимо редактировать.
|
|
Вадим К (статус: Академик), 8 августа 2007, 11:51 [#3]:
Индексы хранятся в базе, вычисляемые поля - существуют только в памяти. Причём fkCalculated вычисляется по мере надобности, fkInternalCalc - перед отображением всей таблицы.
Строить индексы для вычисляемых полей умеет кажеться только ClientDataSet, но он не для интербейза.
Решений я вижу два
первое - вычислять поля на сервере. сиквел достаточно сильный язык.
вариант два - для сортировки использовать тот же сиквел (конструкция ORDER BY)
Галочка "подтверждения прочтения" - вселенское зло.
|
|
Ed (статус: 1-ый класс), 8 августа 2007, 12:10 [#4]:
Уважаемый Вадим К!
<Решений я вижу два
первое - вычислять поля на сервере. сиквел достаточно сильный язык.
вариант два - для сортировки использовать тот же сиквел (конструкция ORDER BY)>
По первому: это, конечно, самый простой вариант, добавить дополнительное поле в DETAIL таблицу, но при этом иду на нарушение реляционности БД - завожу избыточность информации.
По второму: мне таблу надо редактировать, а SQL, даже самый простой по несвязанным таблам, запрещает это делать.
|
|
Вадим К (статус: Академик), 8 августа 2007, 12:21 [#5]:
Цитата:
нарушение реляционности БД - завожу избыточность информации
Очень часто приходиться жертвовать правилами, что бы сделать "по-людски".
Но я не говорил о том, что бы добавить поле в таблицу, я говорю о добавлении записи в результирующую выборку.
Цитата:
мне таблу надо редактировать, а SQL, даже самый простой по несвязанным таблам, запрещает это делать.
Можно, всё можно. Нужно только сломать немного своё мышление и возможно сменить компоненты.
Для того, что бы запрос можно было редактировать, он должен быть "живой" (Live-query).
Для этого есть компонент IBUpdate (Кажеться так называется)
В нём нужно прописать как обновлять запросы вашей таблицы, тоесть что куда пхать. там нужно указать запросы для вставки, для удаления, редактирования.
потом компоненты связываются. IBTable вообще не будет использоваться.
Я вообще не рекомендую его использовать, так как он очень "плохо" относиться к серверу. Когда то проводил тесты, так оказалось, что он на обновление таблицы делает до 5 запросов (структуру запрашивает, типы полей).
Галочка "подтверждения прочтения" - вселенское зло.
|
Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте.
|