Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Базы";
Текущий архив: 2003.03.24;
Скачать: [xml.tar.bz2];

Вниз

И дернул меня черт связаться с Access-овской базой...   Найти похожие ветки 

 
Lancelot   (2003-03-03 18:48) [0]

...на старости лет-то. Понасоздавал я в ней ключей, индексов всяких, связал их, как надо, условия целостности наложил и пробую, значит. Одна табличка, как водится, основная, другая - справочник. По идее, если в справочнике запись удаляется, то в основной таблице все связанные записи тоже должны убиться, так условие целостности - каскадное удаление. И оно удаляет... вроде бы... Но в рантайме ни хрена этого не видно, в дбгриде сволочь так торчит, даже на редактирование её можно вызвать, и никакие рефреши не помогают. Првда, при post-е ругается, что запись была кем-то изменена в ходе работы. А как базу закроешь, в самом Accesse в нее зайдешь, глядь - а запись-то удалена, родимая.
Товарищи! Господа! Друзья! НУ КАК МНЕ ЭТУ ЗАРАЗУ ПОБЕДИТЬ?!

PS. Извините за излишнюю эмоциональность, но за два дня я с этим делом просто уже рехнулся.


 
Reindeer Moss Eater   (2003-03-03 18:50) [1]

А при чем здесь "нехороший" Access???


 
Lancelot   (2003-03-03 18:54) [2]

Access-то хороший, только почему-то в приложении на Delphi результаты работы правил ссылочной целостности не отражаются, пока не закроешь базу, не выйдешь из программы и назад не зайдешь. Не отражаются, но выполняются :(


 
Anatoly Podgoretsky   (2003-03-03 18:55) [3]

Тогда одназначно, что Акцесс ни причем.


 
sniknik   (2003-03-03 19:01) [4]

см. Хелп особенно предупреждения

Refetches data from the database to update a dataset’s view of data.

procedure Refresh;

Description

Call Refresh to ensure that an application has the latest data from a database. For example, when an application turns off filtering for a dataset, it should immediately call Refresh to display all records in the dataset, not just those that used to meet the filter condition.

Note: The Refresh method does not work for all TDataSet descendants. In particular, TQuery components do not support the Refresh method if the query is not “live”. To refresh a static TQuery, close and reopen the dataset.
//заметьте не все могут, вместо закрывайте и открывайте

TDataSet generates a BeforeRefresh event before refreshing the records and an AfterRefresh event afterwards.

Note: Most datasets try to maintain the current record position when you call refresh. However, this is not always possible. For example, the current record may have been deleted from the server by another user. Unidirectional datasets have no mechanism for locating the current record after a refresh, and always move back to the first record.

Warning: Unidirectional datasets refresh the data by closing and reopening the cursor. This can have unintended side effects if, for example, you have code in the OnClose or OnOpen event handlers.
//однонаправленые сами заррывают и открывают сравните для примера


 
Lancelot   (2003-03-03 19:14) [5]

1) Используется ADOTable.
2) Необязательно, что эта запись была текущей.
2) Извините, я не в курсе, является ли Access однонаправленной базой. По-моему, после рефреша указатель оставался на прежнем месте...
3) То есть, получается надо полностью закрыть и открыть базу, т.е. сделать close ВСЕМ Table, подключенным к данной базе?!


 
Lancelot   (2003-03-03 19:21) [6]

Похоже, остается одно: убить все связи м обрабатывать целостность ручками... :((


 
Leran2002   (2003-03-03 19:31) [7]

ADOTable.Requery; - после удаления в таблице да и все...


 
Lancelot   (2003-03-03 19:35) [8]

Щас попробую...


 
sniknik   (2003-03-03 19:43) [9]

> 3)
По моему проще переоткрыть запросы. Или тайблы в вашем случае, только не всем а тем какие предположительно изменяются (не думаю
что много), т.к. у вас связи и запрос вряд “live”. Отключить вывод и переоткрыть (DisableControls/EnableControls).

> Используется ADOTable.
то же самое что запрос SELECT * FROM Table
т.е. все записи копируются в рекордсет в памяти.

> 2)(2) не база курсор, это смотря как открыт. можно поиграть своством DirectTable возможно и рефреш станет срабатывать (если нет др. ограничений) но еще лутше перейти на ADODataSet там возможностей побольше.

> Щас попробую...
переоткрыть значит лень. а то же самое 1-й процедурой, попробую?

Description

Call Requery to refresh the recordset. Requery updates the dataset by re-executing the original command or SQL statement that produced the recordset.

The effects of Requery are the same as calling the dataset’s Close method and then its Open method.


 
Lancelot   (2003-03-03 23:09) [10]

В том то все и дело, что я пробовал все, о чем тут говорили, кроме REQUERY. И свойствами игрался, и открывал/закрывал и т.п.
Ну, пожалуй, можно попробовать перейти еще на ADODataSet или ADOQuery.


 
BorisUK   (2003-03-04 07:20) [11]


> По идее, если в справочнике запись удаляется, то в основной
> таблице все связанные записи тоже должны убиться, так условие
> целостности - каскадное удаление.

Я тут уточнить хотел...
Тоесть получается если я насоздавал в основной табице записи с важной инфой, а потом какойто пень удалил в справочнике запись... то что?? Все удалитня нафиг??? Да если так и действует каскадное удаление то это в корне не верноь в данном аспекте..
Логичным может быть тока каскадный Апдейт! Тут понятно да? - я изменил в справочнике код.. он заменился в связанных записях везде где уже когдато существовал..
В случае попытки удалить из справочника запись - логичен тригер не позволяющий удалить запись, пока существует связь с записями в другой табле.
Другое дело каскадное удаление в таблицах со связью мастер- деталь. Когда удаляя мастер запись, логично что детали уже тоже никогда не понадобятся.

Подумайте откуда ветер дует. Может это в корне не верно, а вы это пытаетесь сделать!


 
sniknik   (2003-03-04 08:31) [12]

Lancelot © (03.03.03 23:09)
a Requery помогло? лутше ADODataSet, ADOQuery как и ADOTable потомок от него с ограничениями. Кстати посмотри на пример дельфи ADO\ShapeDemo может это тебе больше подойдет. (в таком случае все изменения в таблицах обновления/удаления отслеживаются провайдером, надстройка над Jet получается, (но сам не пробовал :-(())

BorisUK © (04.03.03 07:20)
это верно, (в корне) иначе не было бы подобных конструкций
CREATE TABLE Заказы (КодЗаказа INTEGER PRIMARY KEY, ИндексКлиента INTEGER, ПримечанияЗаказа NCHAR VARYING (255), CONSTRAINT ВнКлЗаказыИндексКлиента FOREIGN KEY (ИндексКлиента) REFERENCES Клиенты ON UPDATE SET NULL ON DELETE SET NULL
таже мастер- деталь только на уровне базы (а по другому может быть?) .


 
Lancelot   (2003-03-04 09:06) [13]

1) Тут есть свои тонкости... Такое удаление по условию тоже может понадобиться. Дело не в этом. Отражение базы не обновляется как при каскадном удалении, так и при каскадном обновлении :)
2) Кстати, requery тоже не помогло.


 
sniknik   (2003-03-04 10:34) [14]

Lancelot © (04.03.03 09:06)
т.е. получается Close Open не обновляет рекордсет? осталось последнее коннект закрыть. (хотя чтото тут не то, кажется)

попробуй
ADODataSet1.DisableControls;
ADOConnect1.Close; //закрываются и все присоедененные
ADODataSet1.Open;
ADODataSet1.EnableControls;
так сработает ????


 
Lancelot   (2003-03-04 15:58) [15]

РАБОТАЕТ!!!
Вот так:

ADOConnection1.Close; //закрываются и все присоедененные
ADOConnection1.Open;
ADOQuery1.Open;
ADOQuery2.Open;


Однако, ADOConnection молодец! Еще бы гриды при реконнекте не моргали, да указатели таблиц в начало не прыгали... Но это, похоже, зло неизбежное.

В общем, спасибо! :)


 
sniknik   (2003-03-04 16:05) [16]

избежное. :-))

ADODataSet1.DisableControls; //отключает связь с визуальными компонентами (теоретически должно). с указателями таблиц посложнее нужно запомнить позицию (ключь) после перемещатся на нее.
в конце
ADODataSet1.EnableControls; //востанавливает связь


 
sniknik   (2003-03-04 16:08) [17]

хотя, если курсор стоял на удаленной записи? то всетаки прыгать куданибудь должно.


 
Lancelot   (2003-03-04 23:09) [18]


> sniknik © (04.03.03 16:05)
> избежное. :-))
>
> ADODataSet1.DisableControls;

Все равно моргают, т.к. в этом случае сразу теряют информацию из датасета. Но это уже фигня, что-нибудь придумаем.


 
sniknik   (2003-03-05 00:06) [19]

что то у тебя не то. делаю также как написал в sniknik © (04.03.03 10:34).
ничего не моргает (в случае если курсор на первой записи вообще нет изменений, картинка мертво стоит).
продолжение основного глюка?



Страницы: 1 вся ветка

Форум: "Базы";
Текущий архив: 2003.03.24;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.5 MB
Время: 0.009 c
1-76471
Chlavik
2003-03-12 02:12
2003.03.24
Sleep Mode и прога


3-76329
Сереня
2003-02-27 11:03
2003.03.24
DOA


3-76371
polecat79
2003-03-06 16:48
2003.03.24
Не допустимое символьное значение для спецификации броска


7-76705
Le!
2003-01-18 08:50
2003.03.24
LPT под XP!


3-76348
Dim!S
2003-03-04 03:41
2003.03.24
Поиск части строки





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский