|
22.01.2008, 18:10 | #1 |
Участник
|
Кеширование при UPDATE через T-SQL
AX 3.0 SP5 SQL 2005
В коде обновляню запись через T-SQL (UPDATE) и акс не видит изменений в обновленной записи. Есть ли механизм для сброса кеша для обновленной записи. X++: sqlStr = strfmt("UPDATE InventTable SET PrimaryVendorId = '%1' FROM InventTable WHERE ItemId = '%2'", _primaryVendorId, _itemId); connection = new Connection(); statement = connection.createStatement(); statement.executeUpdate(sqlStr); |
|
22.01.2008, 19:07 | #2 |
Banned
|
flush InventTable;
|
|
22.01.2008, 19:21 | #3 |
Участник
|
в этот момент он может получить ошибку, что запись изменилась другим пользователем.
Подожди, Женя. Да, человек спросил "Есть ли механизм для сброса кеша". Но реально он хочет совсем другого. На самом деле он хочет чтобы его запись перечиталась, а не сброса кэша на самом деле тут два вопроса: 1. как заставить форму увидеть обновление? 2. как заставить табличную переменную увидеть обновление? В форме делайте myTable_ds.reload() для обновления текущей записи. В коде открывайте транзакции и прочитайте в транзакции. Может быть, есть другой способ |
|
22.01.2008, 20:26 | #4 |
Участник
|
Имелось ввиду, наверное myTable_ds.reread() ?
|
|
22.01.2008, 23:07 | #5 |
Участник
|
|
|
23.01.2008, 11:00 | #6 |
Участник
|
reread мне не поможет, так как в форме нет того датасоурса, который я update через T-SQL. На InventTable у меня есть display метод, который собственно и выводит старые данные. Может как то закешировался display метод? flush InventTable не помог.
|
|
23.01.2008, 11:10 | #7 |
Участник
|
Если вы сами его не закэшировали (в init датасоурса cacheAddMethod), то сам он не должен автоматически кэшироваться.
|
|
23.01.2008, 11:17 | #8 |
Участник
|
нет канечно специально не кешировал. может это как то связанно с тем что update делается через отдельный connection?
|
|
23.01.2008, 11:22 | #9 |
Участник
|
Ну, с моей точки зрения не должно быть это связанно. У вас дисплей метод на гриде? Попробуйте на какую-нубудь вкладку его перенести после обновления на эту вкладке переходить. Тоже не обновиться значение?
|
|
23.01.2008, 11:23 | #10 |
Участник
|
Подождите, а у вас на той таблице из который данные беруться есть первичный ключ. Вы ее-то пробовали flush ...
|
|
23.01.2008, 11:36 | #11 |
Участник
|
Пробовал flush в init() формы обе таблицы. На InventTable канечно есть первичный индекс.
|
|
23.01.2008, 11:39 | #12 |
Участник
|
Цитата:
Только непонятно - а зачем вы через connection делаете? чем обычный update X++ не подходит? |
|
23.01.2008, 11:51 | #13 |
Участник
|
Напиши свой дисплей метод
|
|
23.01.2008, 11:54 | #14 |
Участник
|
Кроме того, можено вместо flush сделать условие в этом дисплей методе не по первичному ключу, а по нему + какое-нибудь дополнительно условие RecId != 0, чтобы использовался не кэш таблице, а запрос шел на БД. Этот в свое время одни blog bot предлагал, правда для других целей.
|
|
23.01.2008, 11:57 | #15 |
Участник
|
А может попробуй в дисплей методе дописать:
X++: yourTable.disableCache(true); |
|
|
За это сообщение автора поблагодарили: polygris (1). |
23.01.2008, 11:59 | #16 |
Участник
|
обычный update не подходит потому как мне нельзя трогать поля modifiedBy, modifiedDate, modifiedTime
|
|
23.01.2008, 13:31 | #17 |
Administrator
|
Цитата:
Поля modified* не изменятся
__________________
Возможно сделать все. Вопрос времени |
|
|
За это сообщение автора поблагодарили: petr (2). |
23.01.2008, 12:01 | #18 |
Участник
|
disableCache(true) непомогло :-(
|
|
23.01.2008, 12:05 | #19 |
Участник
|
|
|
23.01.2008, 12:31 | #20 |
Участник
|
дико извиняюсь. протупил в реализации display метода. на самом деле disableCache(true) помог.
kashperuk - респект. спасибо! |
|
Теги |
t-sql, кэширование, ax3.0 |
|
|