Форум: "Базы";
Текущий архив: 2002.05.23;
Скачать: [xml.tar.bz2];
ВнизПрошу подсказку Найти похожие ветки
← →
Timka (2002-04-22 17:38) [0]Подскажите пожалуйста. В таблице сделал поле просмотра, при входе в него выпадает весь список возможных значений, изменяется (при выборе)связанное с ним поле в текущей таблице, но изменения не сохраняются. Выдаёт ошибку "index is read only".Пробовал ввести режим Edit принудительно, не помогло. Набор данных всё одно переводится в режим browse. Как можно сделать, чтобы данные сохранялись?
← →
Johnmen (2002-04-22 17:42) [1]Lookup"ное поле...
← →
IrenFD (2002-04-22 18:44) [2]Если твоя таблица берет данные из запроса на основе нескольких исходных таблиц, то нужно добавить компонент UpdateSQL и в нем определить запросы на измененение данных. Тогда таблица станет редактируемой.
← →
VAleksey (2002-04-23 06:24) [3]У тебя есть обработчики смены состояния НД ?
← →
Timka (2002-04-23 12:39) [4]у меня к сожалению, Table, я не в курсе, как это сделать для SQL. Обработчики состояния есть, но вероятно. не те , что нужны.
и в обработчике я пытался задать принудительно Edit, в разны местах и разными способами, но что-то не получается, всё одно бровзе.
← →
VAleksey (2002-04-23 14:23) [5]
> Timka ©
1) Как у тебя реализован обработчик отслеживающий смену состояния НД ? В DataSource ?
2) Вообще пена. Я сталкивался с таким сообщением когда индексный файл на диске был помечен "Только для чтения"
← →
VAleksey (2002-04-23 14:25) [6]Попробуй с места, где задаешь Table.Edit; пошагово отследить то место в коде, где ее состояние переходит в dsBrowse
ЗЫ
Это совет такой. А там сам поймешь куда копать !
← →
Timka (2002-04-23 18:29) [7]Обработчик такой(для наглядного пошагового отслеживания)
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-24 08:27) [8]Сноси нафиг обработчики
> на 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;
← →
VAleksey (2002-04-24 08:28) [9]
> onDataChange и onStateChange ?
← →
Timka (2002-04-24 11:25) [10]> onDataChange и onStateChange ?
да, именно. И не только там. Что касается обработчика индикации состояния НД - если бы ты увидел, как выглядит форма, на которой я обкатываю эту методу - ужаснулся бы :) , но пошагово - отслеживает всё наглядно и постадийно ,на форме видны одновременно результаты прохода постадийно. Конечно, я могу поставить индикаторы цветом, или тот же DBGreed подцвечивать, или мессагу выдавать,но словами мне проще. или имеется в виду что-то ещё? свойство State имеет тип TDataSetState, перечислимый. как его перевести в например,в строковый,без IF ... THEN либо CASE.. DO я не нашёл. Если кто-нибудь подскажет, это было бы здорово.
← →
Севостьянов Игорь (2002-04-24 12:50) [11]Вариантов для перевода нет - только массивом
-----------
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)
← →
VAleksey (2002-04-24 14:19) [12]Timka © блин, ты вообще сейчас о чем ? Я тебя правильно понимаю:
1) Запись не хочет сохранятся
2) Ввод значения в поле ч/з лукап
3) НД из состояния редактирования переходит в состояние просмотра(причем переходит необосновано (без вызова соответстующих методов))
4) Есть обработчики событий смены состояния НД
5) Частично эти обработчики вызываются в событиях
> onDataChange и onStateChange
Я все правильно излагаю ?
Твоя проблема: сделать доступным редактирование таблицы используя лукап поле ?
← →
VAleksey (2002-04-24 14:24) [13]
>
> Timka © (23.04.02 18:29)
> Обработчик такой(для наглядного пошагового отслеживания)
Я имел ввиду использование в коде точки останова при переводе НД в состояние редактирования и затем при помощи трассировки отследить то место в коде программы где таблица переходит в состояние просмотра.
ЗЫ
Просто была у меня похожая ситуация, так что разберемся !
← →
VAleksey (2002-04-24 14:26) [14]все сюда тянет :)
> Севостьянов Игорь © (24.04.02 12:50)
> А насчет принудительного Edit - не получится, если ты в
> TTable определил поле FieldKind = fkLookUp, то прийдется
> воспользоваться TUpdateSQL как тебе посоветовал IrenFD ©
> (22.04.02 18:44)
Объясните причины подобного заявления.
← →
Timka (2002-04-24 15:42) [15]>Севостьянов Игорь © большое спасибо за пример.
TUpdateSQL работает, но тогда при повторном открытии таблицы (у меня парадоксовская,связанная) выдаёт сообщение
index is out of date, т.е. ещё каким-то образом надо обновлять индекс, у Table я такой процедуры не нашёл, только AddIndex и DeleteIndex. Следовательно, каждый раз придётся при отключать таблицу, создавать индекс заново и подключать? или есть ещё методы?
← →
Timka (2002-04-24 16:05) [16]>to VAleksey ©
>Timka © блин, ты вообще сейчас о чем ? Я тебя правильно понимаю:
абсолютно верно. Ещё деталь: кроме всего прочего, изменяемая таблица связанная, по индексированному полю(единственному)
>Я имел ввиду ...
>...при помощи трассировки отследить то место...
я так и делал с самого начала. вставлять Labeli стал уже от полной безысходности. Подумал, может так будет наглядней.(что-то типа дубоватого лога на панели :) )
>все сюда тянет :)
ВСЕГДА РАД ТЕБЯ УВИДЕТЬ!!! (до сих пор как вспомню про
var MyTable: TTable , тянет к зеркалу, прикинуть длину своих ушей... :))) )
← →
Севостьянов Игорь (2002-04-24 17:17) [17]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.
← →
IrenFD (2002-04-24 18:02) [18]Не спорьте, TTable.Edit with FieldKind = fkLookup отлично работает, только у парня кешируемое обновление и ему нужно либо TUpdateSQL, либо он не сбрасывает кеш в базу типа CommitUpdates и ApplyUpdates.
Попробуй не кешировать таблицу, что получится?
← →
Севостьянов Игорь (2002-04-24 18:42) [19]IrenFD © (24.04.02 18:02)
Вообще-то я с тобой согласен
← →
Timka (2002-04-25 09:58) [20]попробовал. те же ... в профиль.Выдаёт ошибку "index is read only". пробовал ещё один табле завести - говорит после изменения , что индекс либо устаревшиой, либо out of range. уточняя стуациЮ , может поможет: три таблицы, блюдо, состав, продукты. у состав - мастер таблица блюдо, в составе выбираю продукты из третей таблицы. пробовал блюдо.mastersource.enabled:=false, отключать мастер-поля и брать другой индекс, (перед Post),всё одно Выдаёт ошибку "index is read only"
← →
Timka (2002-04-25 11:33) [21]ещё раз проверил, если только таблицы состав и продукты, прекрасно работает, пока кэширование выключено. при включенном - выдаёт "index is read only",а если изменить при выключенном кэшриовании, при попытке открыть базу потом повторно в кэшированном режиме выдаёт "Table is not indexed", получается, всё упирается в индексы? их можно как-то ещё обновлять,кроме как уничтожить - создать?
← →
VAleksey (2002-04-25 13:56) [22]
> их можно как-то ещё обновлять,кроме как уничтожить - создать?
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 17:35) [23]to VAleksey ©
dbiRegenIndexis
procedure TForm1.ReIndexes(TblName: TTable);
а из какого модуля эта функция? что надо подключить? у меня выдаёт undeclared identifier "DbiRegenIndexes"... в справке
← →
Timka (2002-04-25 17:37) [24]> в смысле, смотрел в справке, непонятно...
← →
Timka (2002-04-26 16:59) [25]>to VAleksey ©
всё...спасибо, ф-цию нашёл, разобрался... буду думать дальше...
Страницы: 1 вся ветка
Форум: "Базы";
Текущий архив: 2002.05.23;
Скачать: [xml.tar.bz2];
Память: 0.51 MB
Время: 0.011 c