30.12.2010, 10:45 | #21 |
Участник
|
Для поиска удалённых данных, могу подкинуть один джобик.
X++: // Восстанавливает в таблицу <toTable> записи удеалённые из таблицы <fromTable> // !!! имена полей (и желательно их типы :) должны совпадать static void RestoreToTable(TableId fromTableId, TableId toTableId, date fromDate, date toDate, UserId deletedBy = "")//, createdTransactionId _createdTransactionId) { SysDataBaseLog SysDataBaseLog; list datalist; listEnumerator enumerator; container tmp; int i; dictTable toDictTable = new dictTable(toTableId); dictTable fromDictTable = new dictTable(FromTableId); DictField toDictField; DictField fromDictField; FieldId toFieldId; FieldId fromFieldId; int toCntFields; int arrayCount; int arrayIdx; FieldName fromFieldName; FieldName toFieldName; Common Common; SysOperationProgress DialogProgress; int DialogProgress_cntAll; int DialogProgress_cnt = 0; ; DialogProgress = new SysOperationProgress(); DialogProgress.setCaption("Восстановление удалённых записей"); DialogProgress.setTotal(100); select count(RecId) from SysDataBaseLog where SysDataBaseLog.table == fromTableId && SysDataBaseLog.createdDateTime >= datetimeutil::newDateTime(fromDate, 0) && SysDataBaseLog.createdDateTime < datetimeutil::newDateTime(toDate + 1, 0) && (deletedBy == "" || SysDataBaseLog.createdBy == deletedBy) && SysDataBaseLog.LogType == DatabaseLogType::Delete ;// && SysDataBaseLog.createdTransactionId == _createdTransactionId; DialogProgress_cntAll = SysDataBaseLog.RecId; while select SysDataBaseLog where SysDataBaseLog.table == fromTableId && SysDataBaseLog.createdDateTime >= datetimeutil::newDateTime(fromDate, 0) && SysDataBaseLog.createdDateTime < datetimeutil::newDateTime(toDate + 1, 0) && (deletedBy == "" || SysDataBaseLog.createdBy == deletedBy) && SysDataBaseLog.LogType == DatabaseLogType::Delete // && SysDataBaseLog.createdTransactionId == _createdTransactionId { DialogProgress.setText(strfmt ( "Восстановленно записей: %1 из %2", DialogProgress_cnt, DialogProgress_cntAll )); Common = toDictTable.makeRecord(); datalist = SysDataBaseLog.getDataAslist(); enumerator = dataList.getEnumerator(); while (enumerator.moveNext()) { tmp = enumerator.current(); fromFieldId = conpeek(tmp, 1); fromDictField = new dictField(fromDictTable.id(), fromFieldId); fromFieldName = fromDictField.name(); toCntFields = toDictTable.fieldCnt(); for (I = 1; I <= toCntFields; I++) { toDictField = new dictField(toDictTable.id(), toDictTable.fieldCnt2Id(I)); toFieldId = toDictField.id(); arrayCount = toDictField.arraySize(); for (arrayIdx = 1; arrayIdx <= arrayCount; arrayIdx ++) { toFieldId += 65536; toDictField = new dictField(toDictTable.id(), toFieldId); toFieldName = toDictField.name(); if (toFieldName == fromFieldName) { Common.(toDictField.id()) = conpeek(tmp, 2); } } } } toFieldId = toDictTable.fieldName2Id("DeletedBy"); if (toFieldId > 0) Common.(toFieldId) = SysDataBaseLog.createdBy; toFieldId = toDictTable.fieldName2Id("DeletedDateTime"); if (toFieldId > 0) Common.(toFieldId) = SysDataBaseLog.createdDateTime; toFieldId = toDictTable.fieldName2Id("DeletedTransactionId"); if (toFieldId > 0) Common.(toFieldId) = SysDataBaseLog.createdTransactionId; Common.insert(); DialogProgress_cnt++; DialogProgress.setcount(DialogProgress_cnt*100/DialogProgress_cntAll); } } |
|
30.12.2010, 10:51 | #22 |
Участник
|
Цитата:
Сообщение от pitersky
А вообще изменения InventTrans у вас в лог пишутся? Если да, то попробуйте найти максимально похожий код журнала и накладывать фильтр по нему.
Например - вы ищете журнал "Прих00111". Если у вас явно есть журнал "Прих00110", то попробуйте наложить фильтр "Прих0011?". Если ничего не отфильтруется, то это будет именно проблемой фильтрации лога |
|
30.12.2010, 10:55 | #23 |
Ищущий знания...
|
Цитата:
Сообщение от S.Kuskov
Для поиска удалённых данных, могу подкинуть один джобик.
... Рекомендую сделать дубликат InventTrans (правой кнопке по таблицув, пункт Дублировать) и восстановить данные туда. Также если в CopyOfInventTrans добавить поля DeletedBy, DeletedDateTime и DeletedTransactionId, то они также заполнятся Встаете на нужную запись и нажимаете кнопку.
__________________
"Страх перед возможностью ошибки не должен отвращать нас от поисков истины." (с) С Уважением, Елизаров Артем |
|
|
За это сообщение автора поблагодарили: S.Kuskov (1). |
30.12.2010, 10:56 | #24 |
Ищущий знания...
|
Цитата:
или напрямую в БД никто ничего не делал?
__________________
"Страх перед возможностью ошибки не должен отвращать нас от поисков истины." (с) С Уважением, Елизаров Артем |
|
30.12.2010, 11:07 | #25 |
----------------
|
Люди, ау. Какое логирование inventTrans? У вас много лишнего дискового пространства?
В некоторых случаях (если полная аналитика указывалась в строках журнала) можно восстановить проводки по связанным таблицам (InventJournalTrans, InventTransPosting, InventSettlement)... джобиком |
|
|
За это сообщение автора поблагодарили: dn (1), lev (3), MikeR (3). |
30.12.2010, 11:07 | #26 |
Участник
|
Цитата:
пересчеты никакие никто не запускал... Каждый день формируется физическое наличие (значения с инвенттранса). Вчера не понятно с чего остатки слетели |
|
30.12.2010, 11:30 | #27 |
Участник
|
|
|
30.12.2010, 11:33 | #28 |
----------------
|
так как пропали "приходные проводки в закрытых периодах" и "вдруг поплыли остатки", то можно предложить такой вариант восстановления:
1. поднять рядом бекап от позовчера джобиком, чтобы сделать аксаптовский insert с автоматическим пересчетом InventSum ------------ подумал... остатки 0, есть InventTransPosting, значит скорее всего InventSum и до удаления был 0, значит надо переносить проводки через doInsert (или прям на SQL), как раз чтобы InventSum не пересчитался. Последний раз редактировалось Wamr; 30.12.2010 в 11:38. |
|
30.12.2010, 11:47 | #29 |
Ищущий знания...
|
Вспомнил. Есть такая функция как "Проверка целостности данных компании".
Для начала вопрос знатокам Эта функция восстановит отсутствующие проводки?
__________________
"Страх перед возможностью ошибки не должен отвращать нас от поисков истины." (с) С Уважением, Елизаров Артем |
|
30.12.2010, 11:51 | #30 |
----------------
|
нет.. она правит InventSum под существующие проводки.
|
|
30.12.2010, 11:53 | #31 |
Участник
|
Цитата:
Сообщение от Wamr
так как пропали "приходные проводки в закрытых периодах" и "вдруг поплыли остатки", то можно предложить такой вариант восстановления:
1. поднять рядом бекап от позовчера подумал... остатки 0, есть InventTransPosting, значит скорее всего InventSum и до удаления был 0, значит надо переносить проводки через doInsert (или прям на SQL), как раз чтобы InventSum не пересчитался. Уже начал всерьез задумываться о ресторе реальной... пусчай 2 дня восстанавливают |
|
30.12.2010, 11:55 | #32 |
Участник
|
|
|
30.12.2010, 12:01 | #33 |
Ищущий знания...
|
не понял стеба...
я имел ввиду она только inventSum пересчитает, или проводки тоже как то затрагивает... wamr меня правильно понял, и ответил на интересующий вопрос, спасибо
__________________
"Страх перед возможностью ошибки не должен отвращать нас от поисков истины." (с) С Уважением, Елизаров Артем |
|
30.12.2010, 12:07 | #34 |
----------------
|
Che (простите, Ваш ник пару раз в русской раскладке написал)
сначала определитесь нужно ли пересчитывать InventSum... как говорил lev, выполните "проверку целостности" по складу и выбранной номенклатуре в режиме проверки. Если процедура будет ругаться, то значит надо нести проводки через классический SQL. если не будет, то джобиком. думаю, вам помогут... только скажите, что именно нужно |
|
30.12.2010, 12:17 | #35 |
----------------
|
и еще...
посмотрите все джобики на рабочей, где упоминается inventTrans или delete и вспомните какие модификации делались за последнюю неделю |
|
30.12.2010, 12:44 | #36 |
Участник
|
насторожило: "какие модификации делались за последнюю неделю"
...если, допустим, неделю назад что то запускали, то как тогда объяснить что до вчера остатки нормальные были... получается же что то вчера "случилось" Как я понял, проверка целостности не восстановит недостающие проводки по инвенттрансу - стоит ли тогда ее запускать? |
|
30.12.2010, 12:59 | #37 |
Участник
|
подскажите еще - как правильно в моем случае отловить строки по отсутствующим журналам в инвенттрансе. Пишу:
PHP код:
|
|
30.12.2010, 13:02 | #38 |
Ищущий знания...
|
Цитата:
Сообщение от Che
подскажите еще - как правильно в моем случае отловить строки по отсутствующим журналам в инвенттрансе. Пишу:
PHP код:
т.е. перебираете строки журналов (можно с джойном на журналы) и далее поиск проводки: X++: Select firstonly inventTrans where inventTrans.inventTransId == InventJournalTrans.InventTransId;
__________________
"Страх перед возможностью ошибки не должен отвращать нас от поисков истины." (с) С Уважением, Елизаров Артем |
|
30.12.2010, 13:06 | #39 |
Ищущий знания...
|
Или вообще одним запросом типа:
X++: while select InventJournalTrans where inventJournalTrans.TransDate == 21\07\2010 // и ещё что то там notExists join inventTrans where inventTrans.InventTransId == InventJournalTrans.inventTransId
__________________
"Страх перед возможностью ошибки не должен отвращать нас от поисков истины." (с) С Уважением, Елизаров Артем |
|
30.12.2010, 16:47 | #40 |
Участник
|
Еще один микровопрос, если кто есть трезвый ) Возможно ли в скуле напрямую скопировать табличку (например CustTable, VendTable) с одной бд - тестовой (Ctrl +C - т.е. без кода) и вставить на другую (Ctrl + V)...
Простите если вопрос дилетанта))) Огромаднейшее спасибо за советы! Всех с наступающим!!! |
|