Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2002.05.23;
Скачать: CL | DM;

Вниз

Прошу подсказку   Найти похожие ветки 

 
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;
Скачать: CL | DM;

Наверх




Память: 0.53 MB
Время: 0.037 c
3-73036
VikOS
2002-04-26 09:49
2002.05.23
Paradox


1-73101
IgoX
2002-05-09 19:57
2002.05.23
Проблема с клавишей


1-73266
Sniffer
2002-05-10 01:04
2002.05.23
Классы


3-73007
vopros
2002-04-25 16:47
2002.05.23
Запрос. Помогите.


3-73042
Pokotskiy
2002-04-25 15:15
2002.05.23
Помогите обновить DBgrid при работе с Interbase таблицой!!!!