16.02.2006, 16:48 | #1 |
Участник
|
Синхронизация при создании новых типов
Многие наверное сталкивались, что при создании новых строковых типов данных, Аксапта запускает синхронизацию БД, хотя очевидно, что новый тип еще нигде не используется.
Предложу некий обходной путь решения этой проблемы. После создания нового EDT и запуска синхронизации, можно ее прервать нажав CTRL+Break. Чтобы синхронизация в дальнейшем не запускалась, можно выполнить нижепреведенный job. Код: static void TRUD_SyncDisable(Args _args) { new SQLSyncPending().databaseTouched(false); } |
|
03.04.2009, 15:58 | #3 |
Участник
|
Тоже надоела ненужная синхронизация.
В результате переписал метод вот так: X++: boolean dbSynchronize(tableId tableId = 0, // 0 = all tables, non-zero is a valid table handle boolean syncAsNeeded = true, // true = objects touched in the AOT, false = unconditional synchronize boolean continueOnError = true, boolean showProgress = true ) // true = report all problems, but throw only after all tables are synchronized, false = stop synchronize after first error/problem { SqlSyncPending sqlSyncPending = new SqlSyncPending(); boolean ok; ; setPrefix("@SYS22807"); if (SQLSyncPending.databaseTouched() && Box::yesNo("Синхронизировать?", DialogButton::Yes) == DialogButton::Yes) ok = super(tableId, syncAsNeeded, continueOnError, showProgress); else { new SQLSyncPending().databaseTouched(false); ok = true; } if (ok && this.isRunningMode()) { SysApplicationSetup::saveApplicationVersion(SysApplicationSetupMode::Synhronize); // HansBred - SP4 - PS #5544 SysSQLInitDbTriggers::CheckExistsDBTriggers(); } return ok; } Может кто знает как довести до ума?
__________________
Энергия молодых и неравнодушных способна изменить мир к лучшему. |
|
03.04.2009, 17:50 | #4 |
Участник
|
А если без программирования: выключите галочку Автосохранение в параметрах, закладка Разработка.
Не забывайте сохранять вручную после того, как создадите несколько типов. Синхронизация будет, но только после того, как вы сами нажмете Сохранить. |
|
03.04.2009, 23:51 | #5 |
MCITP
|
Цитата:
Сообщение от miklenew
Тоже надоела ненужная синхронизация.
В результате переписал метод вот так: X++: boolean dbSynchronize(tableId tableId = 0, // 0 = all tables, non-zero is a valid table handle boolean syncAsNeeded = true, // true = objects touched in the AOT, false = unconditional synchronize boolean continueOnError = true, boolean showProgress = true ) // true = report all problems, but throw only after all tables are synchronized, false = stop synchronize after first error/problem { SqlSyncPending sqlSyncPending = new SqlSyncPending(); boolean ok; ; setPrefix("@SYS22807"); if (SQLSyncPending.databaseTouched() && Box::yesNo("Синхронизировать?", DialogButton::Yes) == DialogButton::Yes) ok = super(tableId, syncAsNeeded, continueOnError, showProgress); else { new SQLSyncPending().databaseTouched(false); ok = true; } if (ok && this.isRunningMode()) { SysApplicationSetup::saveApplicationVersion(SysApplicationSetupMode::Synhronize); // HansBred - SP4 - PS #5544 SysSQLInitDbTriggers::CheckExistsDBTriggers(); } return ok; } Может кто знает как довести до ума? Когда просто синхронизиться таблица "по требованию" то "точед"==false и у вас синхронизация никогда не выполняется. В случае же изменения EDT там будет true. Т.е. надо спрашивать только тогда когда SQLSyncPending.databaseTouched()==true (ну или вообще всегда )
__________________
Zhirenkov Vitaly |
|
06.04.2009, 08:59 | #6 |
Участник
|
Цитата:
Я хочу чтоб у меня был механизм с помощью которого, я бы мог дать базе понять, что всё ок синхронизировать ничего не надо. Т.е. я знаю что с я изменил длину расширенного типа и знаю что полей ещё не создавал, зачем мне синхронизация. А при сохранении система всё равно начнёт полную синхронизацию (не важно с галочкой или без).
__________________
Энергия молодых и неравнодушных способна изменить мир к лучшему. Последний раз редактировалось miklenew; 06.04.2009 в 09:03. |
|
06.04.2009, 09:03 | #7 |
Участник
|
Цитата:
Сообщение от ZVV
Это из-за вот этого if (SQLSyncPending.databaseTouched() &&
Когда просто синхронизиться таблица "по требованию" то "точед"==false и у вас синхронизация никогда не выполняется. В случае же изменения EDT там будет true. Т.е. надо спрашивать только тогда когда SQLSyncPending.databaseTouched()==true (ну или вообще всегда ) Без неё у меня при каждом сохранении, даже если вообще ничего не делал, будет вылетать: "Синхронизировать?". А когда я принудительно хочу что -то синхронизировать, естественно она говорит, что изменений нет и ничего не пытается синхронизировать. В этом то и засада.
__________________
Энергия молодых и неравнодушных способна изменить мир к лучшему. |
|
06.04.2009, 09:31 | #8 |
Moderator
|
To miklenew:
Сделайте так, как написано в ссылке в начале темы, и не изобретайте велосипед...
__________________
Андрей. |
|
06.04.2009, 09:37 | #9 |
Участник
|
Цитата:
Даже если сделать кнопку на Tabax всё равно как-то не айс. Во вторых CTRL+Break мне не помогает. Там всё равно похоже ждать надо. Обычно просто заваливаю Ax32.exe и захожу заново. А хотелось бы нормально чтоб это было.
__________________
Энергия молодых и неравнодушных способна изменить мир к лучшему. |
|
06.04.2009, 09:47 | #10 |
Moderator
|
Лана, отвечу по существу:
X++: if (SQLSyncPending.databaseTouched()) { if (Box::okCancel("Синхронизировать БД ?",DialogButton::Cancel) == DialogButton::Cancel) { new SQLSyncPending().databaseTouched(false); // из 2-х примеров скомпоновал один return false; } }
__________________
Андрей. |
|
|
За это сообщение автора поблагодарили: miklenew (5). |
06.04.2009, 09:57 | #11 |
Участник
|
А ларчик просто открывался.
Спасибо.
__________________
Энергия молодых и неравнодушных способна изменить мир к лучшему. |
|
06.04.2009, 10:05 | #12 |
Moderator
|
Кстати, для Oracle советую заглянуть в эту тему. Полезно иногда все же соглашаться и проводить-таки синхронизацию
__________________
Андрей. |
|