![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Прошу подсказку [D6, Paradox]
Timka © (2002-04-22 17:38:00)Подскажите пожалуйста. В таблице сделал поле просмотра, при входе в него выпадает весь список возможных значений, изменяется (при выборе)связанное с ним поле в текущей таблице, но изменения не сохраняются. Выдаёт ошибку "index is read only".Пробовал ввести режим Edit принудительно, не помогло. Набор данных всё одно переводится в режим browse. Как можно сделать, чтобы данные сохранялись?
Timka (2002-04-26 16:59:00) [1]>to VAleksey ©
всё...спасибо, ф-цию нашёл, разобрался... буду думать дальше...
Timka (2002-04-25 17:37:00) [2]> в смысле, смотрел в справке, непонятно...
Timka (2002-04-25 17:35:00) [3]to VAleksey ©
dbiRegenIndexis
procedure TForm1.ReIndexes(TblName: TTable);
а из какого модуля эта функция? что надо подключить? у меня выдаёт undeclared identifier "DbiRegenIndexes"... в справке
VAleksey (2002-04-25 13:56:00) [4]
> их можно как-то ещё обновлять,кроме как уничтожить - создать?
dbiRegenIndexis
procedure TForm1.ReIndexes(TblName: TTable);
Var Table:TTable;
begin
Table:=TTable.Create(Self);
TblName.Close;
Table.DataBaseName:=TblName.DataBaseName;
Table.TableName:=TblName.TableName;
Table.Exclusive:=true;
Table.Open;
Check(DbiRegenIndexes(Table.Handle));
Table.Close;
Table.Free;
TblName.Open;
end;
Timka (2002-04-25 11:33:00) [5]ещё раз проверил, если только таблицы состав и продукты, прекрасно работает, пока кэширование выключено. при включенном - выдаёт "index is read only",а если изменить при выключенном кэшриовании, при попытке открыть базу потом повторно в кэшированном режиме выдаёт "Table is not indexed", получается, всё упирается в индексы? их можно как-то ещё обновлять,кроме как уничтожить - создать?
Timka (2002-04-25 09:58:00) [6]попробовал. те же ... в профиль.Выдаёт ошибку "index is read only". пробовал ещё один табле завести - говорит после изменения , что индекс либо устаревшиой, либо out of range. уточняя стуациЮ , может поможет: три таблицы, блюдо, состав, продукты. у состав - мастер таблица блюдо, в составе выбираю продукты из третей таблицы. пробовал блюдо.mastersource.enabled:=false, отключать мастер-поля и брать другой индекс, (перед Post),всё одно Выдаёт ошибку "index is read only"
Севостьянов Игорь (2002-04-24 18:42:00) [7]IrenFD © (24.04.02 18:02)
Вообще-то я с тобой согласен
IrenFD (2002-04-24 18:02:00) [8]Не спорьте, TTable.Edit with FieldKind = fkLookup отлично работает, только у парня кешируемое обновление и ему нужно либо TUpdateSQL, либо он не сбрасывает кеш в базу типа CommitUpdates и ApplyUpdates.
Попробуй не кешировать таблицу, что получится?
Севостьянов Игорь (2002-04-24 17:17:00) [9]VAleksey © (24.04.02 14:26)
Объясните причины подобного заявления.
А ты попробуй TTable.Edit with FieldKind = fkLookup
Determines whether the field is specified as a lookup field.
property Lookup: Boolean;
Description
Lookup is provided for backward compatibility. To determine if a field is a lookup field, use the FieldKind property instead.
If the field is a lookup field, the KeyFields property indicates which fields in the dataset must match the LookupKeyFields in the LookupDataSet, to identify a record in the LookupDataSet. The value of the LookupResultField for that record becomes the Value of the field component.
Timka (2002-04-24 16:05:00) [10]>to VAleksey ©
>Timka © блин, ты вообще сейчас о чем ? Я тебя правильно понимаю:
абсолютно верно. Ещё деталь: кроме всего прочего, изменяемая таблица связанная, по индексированному полю(единственному)
>Я имел ввиду ...
>...при помощи трассировки отследить то место...
я так и делал с самого начала. вставлять Labeli стал уже от полной безысходности. Подумал, может так будет наглядней.(что-то типа дубоватого лога на панели :) )
>все сюда тянет :)
ВСЕГДА РАД ТЕБЯ УВИДЕТЬ!!! (до сих пор как вспомню про
var MyTable: TTable , тянет к зеркалу, прикинуть длину своих ушей... :))) )
Timka (2002-04-24 15:42:00) [11]>Севостьянов Игорь © большое спасибо за пример.
TUpdateSQL работает, но тогда при повторном открытии таблицы (у меня парадоксовская,связанная) выдаёт сообщение
index is out of date, т.е. ещё каким-то образом надо обновлять индекс, у Table я такой процедуры не нашёл, только AddIndex и DeleteIndex. Следовательно, каждый раз придётся при отключать таблицу, создавать индекс заново и подключать? или есть ещё методы?
VAleksey (2002-04-24 14:26:00) [12]все сюда тянет :)
> Севостьянов Игорь © (24.04.02 12:50)
> А насчет принудительного Edit - не получится, если ты в
> TTable определил поле FieldKind = fkLookUp, то прийдется
> воспользоваться TUpdateSQL как тебе посоветовал IrenFD ©
> (22.04.02 18:44)
Объясните причины подобного заявления.
VAleksey (2002-04-24 14:24:00) [13]
>
> Timka © (23.04.02 18:29)
> Обработчик такой(для наглядного пошагового отслеживания)
Я имел ввиду использование в коде точки останова при переводе НД в состояние редактирования и затем при помощи трассировки отследить то место в коде программыгде таблица переходит в состояние просмотра.
ЗЫ
Просто была у меня похожая ситуация, так что разберемся !
VAleksey (2002-04-24 14:19:00) [14]Timka © блин, ты вообще сейчас о чем ? Я тебя правильно понимаю:
1) Запись не хочет сохранятся
2) Ввод значения в поле ч/з лукап
3) НД из состояния редактирования переходит в состояние просмотра(причем переходит необосновано (без вызова соответстующих методов))
4) Есть обработчики событий смены состояния НД
5) Частично эти обработчики вызываются в событиях
> onDataChange и onStateChange
Я все правильно излагаю ?
Твоя проблема: сделать доступным редактирование таблицы используя лукап поле ?
Севостьянов Игорь (2002-04-24 12:50:00) [15]Вариантов для перевода нет - только массивом
-----------
SA_DataSetState: array [TDataSetState] of Integer = ("dsInactive", "dsBrowse", "dsEdit", "dsInsert", "dsSetKey", "dsCalcFields", "dsFilter", "dsNewValue", "dsOldValue", "dsCurValue","dsBlockRead", "dsInternalCalc", "dsOpening");
-----------
State: TDataSetState;
-----------
Label1.Caption := SA_DataSetState[State]
-----------
А насчет принудительного Edit - не получится, если ты в TTable определил поле FieldKind = fkLookUp, то прийдется воспользоваться TUpdateSQL как тебе посоветовал IrenFD © (22.04.02 18:44)
Timka (2002-04-24 11:25:00) [16]> onDataChange и onStateChange ?
да, именно. И не только там. Что касается обработчика индикации состояния НД - если бы ты увидел, как выглядит форма, на которой я обкатываю эту методу - ужаснулся бы :) , но пошагово - отслеживает всё наглядно и постадийно ,на форме видны одновременно результаты прохода постадийно. Конечно, я могу поставить индикаторы цветом, или тот же DBGreed подцвечивать, или мессагу выдавать,но словами мне проще. или имеется в виду что-то ещё? свойство State имеет тип TDataSetState, перечислимый. как его перевести в например,в строковый,без IF ... THEN либо CASE.. DO я не нашёл. Если кто-нибудь подскажет, это было бы здорово.
VAleksey (2002-04-24 08:28:00) [17]
> onDataChange и onStateChange ?
VAleksey (2002-04-24 08:27:00) [18]Сноси нафиг обработчики
> на onDataChange и onStateChange
Придумывай другие способы отслеживания смены состояния НД. (Это тоже совет)
<I>Этот код стоит в
> with DataModule1.Table1 do
> begin
> if State = dsBrowse then Form1.label3.Caption := "dsBrowse";
> if State = dsEdit then Form1.label3.Caption := "dsEdit";
> if State = dsInsert then Form1.label3.Caption := "dsInsert";
> if State = dsSetKey then Form1.label3.Caption := "dsSetKey";
> end;
Timka (2002-04-23 18:29:00) [19]Обработчик такой(для наглядного пошагового отслеживания)
with DataModule1.Table1 do
begin
if State = dsBrowse then Form1.label3.Caption := "dsBrowse";
if State = dsEdit then Form1.label3.Caption := "dsEdit";
if State = dsInsert then Form1.label3.Caption := "dsInsert";
if State = dsSetKey then Form1.label3.Caption := "dsSetKey";
end;
таблица кэшируется, поэтому видно, что до момента ApplyUpdates состояние набора данных либо dsInsert, либо dsEdit, а потом сообщение об ошибке и потом бровзе. Файлы посмотрел, указано лишь, что архивный.даже после снятия результат тот-же.
обработчик поставил в нескольких местах, в том числе и в датасоурсе,на onDataChange и onStateChange, лабели, естественно, задавал разные. Счастья так и нет. Ж:(
VAleksey (2002-04-23 14:25:00) [20]Попробуй с места, где задаешь Table.Edit; пошагово отследить то место в коде, где ее состояние переходит в dsBrowse
ЗЫ
Это совет такой. А там сам поймешь куда копать !