| 
| 
 | Вопрос # 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 запросов (структуру запрашивает, типы полей).
 Галочка "подтверждения прочтения" - вселенское зло. |  Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте. |