|
02.03.2007, 10:55 | #1 |
Участник
|
Как сделать чтобы изменения поля отображались сразу
Делаю через Делфи обращение к аксапте:
Код: var Axapta, AxaptaQuery, AxaptaDataSource, AxaptaQueryRun, Buffer, MyRecord, CryptedPass: variant; begin Axapta:=CreateOleObject('AxaptaCOMConnector.Axapta2.1'); Axapta.logon2('Admin','','','','','','C:\База для разработки.axc'); MyRecord := Axapta.CreateRecord('WebUser'); MyRecord.InitValue; MyRecord.Field('WebLogin') := 'wer'; MyRecord.Field('UserId') := 'web'; MyRecord.Field('WebPassword') := Axapta.CallStaticRecordMethod('WebUser','makePassword', 'pass', 'wer'); //вставка новой записи в таблицу MyRecord.Insert; Axapta.Logoff; Axapta:=0; Отображается только после перезапуска Аксапты. Как мне сделать чтобы все изменения сразу отображались в запущенной Аксапте? |
|
02.03.2007, 10:59 | #2 |
Участник
|
А перезакрытие формы, не помогает???
__________________
Рабочий день сокращает жизнь на 8 часов |
|
02.03.2007, 11:00 | #3 |
Участник
|
нет
|
|
02.03.2007, 11:08 | #4 |
MCTS
|
myTable_ds.research(); должно помочь. Т.е. необходимо обновить источник данных формы
Refresh: Refreshes the screen (current record), without accessing the database. RefreshEx(int n): To refresh the data according to parameter "n". ReRead: Re read the current record and updates the screen. ReSearch: Uses the current query clear the grid, and reread all records. ExecuteQuery: Builds the query, including resetting user sorting etc, and uses research to show the result. If you want to refresh the form with records that were inserted in a method or job that was called, then you should use research.
__________________
В глухомани, в лесу Несмотря на красу Дни проводит Лиса Патрикевна. Я никак не пойму Отчего, почему Не пускают куму На деревню |
|
02.03.2007, 11:26 | #5 |
MCTS
|
Вдогонку
Даже и обновив источник данных возможна ситуация, что новая строка будет в конце списка грида, в то время как обновление данных устанавливает первую строку текущей. В таком случае, вы можете и не заметить, что добавилась новая строка. Тогда вам надо спозиционировать курсор на текущую строку. Вообще, посмотрите как это делается в \Forms\AddressFormat\Methods\up X++: if (save)
{
addressFormatLines_ds.research();
addressFormatLines_ds.findRecord(save);
}
__________________
В глухомани, в лесу Несмотря на красу Дни проводит Лиса Патрикевна. Я никак не пойму Отчего, почему Не пускают куму На деревню |
|
|
За это сообщение автора поблагодарили: demon46 (1). |
02.03.2007, 11:33 | #6 |
MCTS
|
И ещё вдогонку
Дабы "достучаться" до источника данных формы, необходимо "достучаться" до экземпляра этой открытой формы. Вот. Дерзайте
__________________
В глухомани, в лесу Несмотря на красу Дни проводит Лиса Патрикевна. Я никак не пойму Отчего, почему Не пускают куму На деревню |
|
02.03.2007, 12:37 | #7 |
Участник
|
что-то я не пойму у чего такой метод "research();"? К чему его цеплять?)
|
|
02.03.2007, 12:59 | #8 |
MCTS
|
Когда у вас получится увидеть новую строку в форме, напишите сюда
А я вам расскажу что дальше надо делать
__________________
В глухомани, в лесу Несмотря на красу Дни проводит Лиса Патрикевна. Я никак не пойму Отчего, почему Не пускают куму На деревню |
|
02.03.2007, 12:50 | #9 |
MCTS
|
и соответствующего источника данных открытой формы
|
|
02.03.2007, 12:57 | #10 |
MCTS
|
оххх.....
У вас задача: Дано: форма, отображающая таблицу, внешний процесс (Дельфи) заносящий строку в таблицу Надо: отобразить эту новую строку. Для начала упростите себе задачу. Замените Дельфи на джоб внутри аксапты. Т.е. заносите строку из джоба. Цитата:
что-то я не пойму у чего такой метод "research();"? К чему его цеплять?)
WebUser_ds.research();
__________________
В глухомани, в лесу Несмотря на красу Дни проводит Лиса Патрикевна. Я никак не пойму Отчего, почему Не пускают куму На деревню |
|
02.03.2007, 16:36 | #11 |
Moderator
|
Цитата:
Если закрытие-открытие формы начнет помогать, то Периодическое обновление строк в форме альтернативное решение мгновенного отображения новых записей в форме без выхода из нее. Последний раз редактировалось DreamCreator; 02.03.2007 в 16:38. Причина: открытие-закрытие |
|
02.03.2007, 16:50 | #12 |
MCTS
|
Позволю процитировать себя
Цитата:
Дабы "достучаться" до источника данных формы, необходимо "достучаться" до экземпляра этой открытой формы.
Т.е. необходимо следующее: 1 Открыть форму (на стороне Аксапты) 2 Сохранить переменную formRun, а ещё лучше dataSource этой формы. 3 Заполнить таблицу из внешнего приложения (Lelik111 это уже сделал) 4 прорефрешить источник данных из внешнего приложения используя ранее сохранённую переменную _ds Вот пункты 2 и 4 самые мутные. Как указать внешнему приложению конкретный _ds. На самом деле задача интересная и не совсем стандартная как кажется на первый взгляд.
__________________
В глухомани, в лесу Несмотря на красу Дни проводит Лиса Патрикевна. Я никак не пойму Отчего, почему Не пускают куму На деревню |
|
02.03.2007, 17:01 | #13 |
MCTS
|
Да и вообще эта задача должна не программистскими методами решаться
Вот :-)
__________________
В глухомани, в лесу Несмотря на красу Дни проводит Лиса Патрикевна. Я никак не пойму Отчего, почему Не пускают куму На деревню |
|
03.03.2007, 12:45 | #14 |
Developer
|
Цитата:
Вы не сказали как именно вы получаете записи в Аксапте, поэтому опишу все что пришло в голову... раз уж начал отвечать. Чтобы Вы смогли из Аксапты получить запись таблицы WebUser из БД а не из кеша, можно поступить следующими способами (для Вас, я думаю, актуальным будет пункт 1): 1) Если запись отображается на форме в гриде, то можно нажать F5 (пункт меню "Команда"->"Восстановить") . Текущая запись прочитается из БД и обновится в кеше. Это же действие можно выполнить програмно - см. пункт 2 2) Если запись отображается на форме в гриде, то можно програмно выполнить X++: DataSourse.reread(); // чтение ТЕКУЩЕЙ (одной) записи из БД DataSourse.refresh(); // Обновление контролов на форме // DataSourse - датасоурс таблицы на форме X++: WebUser.disableCache(true); select from WebUser ... X++: flush WebUser; // в 3-х уровневой конфигурации выполнить на СЕРВЕРЕ X++: new Dictionary().tableFlush(); // в 3-х уровневой конфигурации выполнить на СЕРВЕРЕ X++: SysFlushDictionary::doFlush(); // в 3-х уровневой конфигурации выполнить на СЕРВЕРЕ P.S. мда... совсем не в двух словах. Lelik111, в будущем постарайтесь более конкретизировать свои вопросы. Последний раз редактировалось vallys; 03.03.2007 в 17:18. |
|
|
За это сообщение автора поблагодарили: Russland (1), Silphidae (1). |
03.03.2007, 13:40 | #15 |
NavAx
|
7) или у таблицы WebUser свойство CacheLookup установить в Find
|
|
03.03.2007, 14:50 | #16 |
MCTS
|
valys, ведь нужно это из Delphi сделать, а не из X++ кода, как Вы предложили...
|
|
03.03.2007, 15:01 | #17 |
Developer
|
действительно... если это конечно не нарушает какую-нибудь существующую концепцию
Цитата:
Цитата:
|
|
03.03.2007, 17:15 | #18 |
MCTS
|
Вот написал джоб
X++: static void Job30(Args _args) { Args args = new Args(); FormRun formRun; WebUser table; FormObjectSet ds; ; formRun = new MenuFunction(MenuItemDisplayStr(WebUsers), MenuItemType::Display).create(args); if (formRun) { formRun.run(); // Открыли форму ds = formRun.dataSource(); // Сохраняем dataSource // Lelik111 сделал --> table.WebLogin = "Nnn"; table.insert(); // Lelik111 сделал <-- // Обновляем данные --> ds.refresh(); ds.research(); // Обновляем данные <-- } } Проблемы я описал в посте #12 Пост #13 вообще написан под впечатлением следующей умозрительной ситуации: ну открыта на компьютере А пользователем UserA форма WebUsers. А на компьютере В пользователь UserВ тоже открыл эту же форму. Тогда Дельфи должен "разослать" сообщения этим формам (а по-хорошему всем формам, источником данных которых является таблица WebUser) что им (формам) пора обновляться. Или сам обновить эти формы. Ну так же не делается. Я бы просил Lelik111 описать свою задачу. Зачем необходимо обновлять формы?
__________________
В глухомани, в лесу Несмотря на красу Дни проводит Лиса Патрикевна. Я никак не пойму Отчего, почему Не пускают куму На деревню |
|
03.03.2007, 17:25 | #19 |
Developer
|
Вы описали как можно обновить кеш датасоурса. Я описывал как можно обновить кеш таблицы. Можно сказать, что наши советы не пересекаются. Значит автору действительно нужно конкретизировать вопрос
|
|