Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Базы";
Текущий архив: 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.006 c
1-73278
mrProgrammer
2002-05-11 13:43
2002.05.23
Перевод чисел в битовые последовательности и наоборот


3-73071
Дремучий
2002-04-25 12:25
2002.05.23
Типчики... Создание BLOB поля в Парадоксе через SQL ?


3-73005
sergey32
2002-04-25 10:55
2002.05.23
Как в Interbase числовое поле с атрибутами NOT NULL


1-73208
Durak
2002-05-14 16:38
2002.05.23
DrawGrid and StringGrid


3-73031
AFROLOV
2002-04-26 13:43
2002.05.23
Как указать в запросе что логическое поле = false?





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский