AXForum  
Вернуться   AXForum > Microsoft Dynamics AX > DAX: Программирование
All
Забыли пароль?
Зарегистрироваться Правила Справка Пользователи Сообщения за день Поиск

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 30.12.2010, 10:45   #21  
S.Kuskov is offline
S.Kuskov
Участник
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
 
3,440 / 1775 (66) ++++++++
Регистрация: 28.04.2007
Адрес: Калуга
Для поиска удалённых данных, могу подкинуть один джобик.
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);
    }
}
Рекомендую сделать дубликат InventTrans (правой кнопке по таблицув, пункт Дублировать) и восстановить данные туда. Также если в CopyOfInventTrans добавить поля DeletedBy, DeletedDateTime и DeletedTransactionId, то они также заполнятся
Старый 30.12.2010, 10:51   #22  
Che is offline
Che
Участник
 
92 / 12 (1) ++
Регистрация: 25.01.2010
Цитата:
Сообщение от pitersky Посмотреть сообщение
А вообще изменения InventTrans у вас в лог пишутся? Если да, то попробуйте найти максимально похожий код журнала и накладывать фильтр по нему.
Например - вы ищете журнал "Прих00111". Если у вас явно есть журнал "Прих00110", то попробуйте наложить фильтр "Прих0011?". Если ничего не отфильтруется, то это будет именно проблемой фильтрации лога
Блин ничего понять не могу - что в тестовой что в реальной - по этому журналу ничего нет... тип изменения - delete стоит (насколько я помню это настраивается). но все же, получается что этот журнал из инвенттранса не удалял никто (т.к. в логе увидел другие удаленные журналы)
Старый 30.12.2010, 10:55   #23  
lev is offline
lev
Ищущий знания...
Аватар для lev
Oracle
MCBMSS
Axapta Retail User
 
1,723 / 491 (20) +++++++
Регистрация: 18.01.2005
Адрес: Москва
Цитата:
Сообщение от S.Kuskov Посмотреть сообщение
Для поиска удалённых данных, могу подкинуть один джобик.
...
Рекомендую сделать дубликат InventTrans (правой кнопке по таблицув, пункт Дублировать) и восстановить данные туда. Также если в CopyOfInventTrans добавить поля DeletedBy, DeletedDateTime и DeletedTransactionId, то они также заполнятся
можно проще на форме "Журнал базы данных" есть кнопка "Вставка заново".
Встаете на нужную запись и нажимаете кнопку.
__________________
"Страх перед возможностью ошибки не должен отвращать нас от поисков истины." (с)
С Уважением,
Елизаров Артем
За это сообщение автора поблагодарили: S.Kuskov (1).
Старый 30.12.2010, 10:56   #24  
lev is offline
lev
Ищущий знания...
Аватар для lev
Oracle
MCBMSS
Axapta Retail User
 
1,723 / 491 (20) +++++++
Регистрация: 18.01.2005
Адрес: Москва
Цитата:
Сообщение от Che Посмотреть сообщение
Блин ничего понять не могу - что в тестовой что в реальной - по этому журналу ничего нет... тип изменения - delete стоит (насколько я помню это настраивается). но все же, получается что этот журнал из инвенттранса не удалял никто (т.к. в логе увидел другие удаленные журналы)
точно никто не делал doDelete() (может в какой функции вызывается) со скипами?
или напрямую в БД никто ничего не делал?
__________________
"Страх перед возможностью ошибки не должен отвращать нас от поисков истины." (с)
С Уважением,
Елизаров Артем
Старый 30.12.2010, 11:07   #25  
Wamr is offline
Wamr
----------------
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
 
1,737 / 858 (32) +++++++
Регистрация: 15.01.2002
Адрес: Москва
Записей в блоге: 7
Люди, ау. Какое логирование inventTrans? У вас много лишнего дискового пространства?
В некоторых случаях (если полная аналитика указывалась в строках журнала) можно восстановить проводки по связанным таблицам (InventJournalTrans, InventTransPosting, InventSettlement)... джобиком
За это сообщение автора поблагодарили: dn (1), lev (3), MikeR (3).
Старый 30.12.2010, 11:07   #26  
Che is offline
Che
Участник
 
92 / 12 (1) ++
Регистрация: 25.01.2010
Цитата:
Сообщение от lev Посмотреть сообщение
точно никто не делал doDelete() (может в какой функции вызывается) со скипами?
или напрямую в БД никто ничего не делал?
напрямую - точно
пересчеты никакие никто не запускал... Каждый день формируется физическое наличие (значения с инвенттранса). Вчера не понятно с чего остатки слетели
Старый 30.12.2010, 11:30   #27  
S.Kuskov is offline
S.Kuskov
Участник
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
 
3,440 / 1775 (66) ++++++++
Регистрация: 28.04.2007
Адрес: Калуга
Цитата:
Сообщение от lev Посмотреть сообщение
можно проще
Согласен. Этот джоб я использовал не столько ради самого восстановления данных сколько ради поиска кем и когда они были удалены (не всегда описния записи хватает для её идентификации).
Старый 30.12.2010, 11:33   #28  
Wamr is offline
Wamr
----------------
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
 
1,737 / 858 (32) +++++++
Регистрация: 15.01.2002
Адрес: Москва
Записей в блоге: 7
так как пропали "приходные проводки в закрытых периодах" и "вдруг поплыли остатки", то можно предложить такой вариант восстановления:
1. поднять рядом бекап от позовчера
2. джобиком скопировать недостающие проводки из восстановленной базы в рабочую

джобиком, чтобы сделать аксаптовский insert с автоматическим пересчетом InventSum


------------
подумал...
остатки 0, есть InventTransPosting, значит скорее всего InventSum и до удаления был 0, значит надо переносить проводки через doInsert (или прям на SQL), как раз чтобы InventSum не пересчитался.

Последний раз редактировалось Wamr; 30.12.2010 в 11:38.
Старый 30.12.2010, 11:47   #29  
lev is offline
lev
Ищущий знания...
Аватар для lev
Oracle
MCBMSS
Axapta Retail User
 
1,723 / 491 (20) +++++++
Регистрация: 18.01.2005
Адрес: Москва
Вспомнил. Есть такая функция как "Проверка целостности данных компании".
Для начала вопрос знатокам
Эта функция восстановит отсутствующие проводки?
__________________
"Страх перед возможностью ошибки не должен отвращать нас от поисков истины." (с)
С Уважением,
Елизаров Артем
Старый 30.12.2010, 11:51   #30  
Wamr is offline
Wamr
----------------
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
 
1,737 / 858 (32) +++++++
Регистрация: 15.01.2002
Адрес: Москва
Записей в блоге: 7
нет.. она правит InventSum под существующие проводки.
Старый 30.12.2010, 11:53   #31  
Che is offline
Che
Участник
 
92 / 12 (1) ++
Регистрация: 25.01.2010
Цитата:
Сообщение от Wamr Посмотреть сообщение
так как пропали "приходные проводки в закрытых периодах" и "вдруг поплыли остатки", то можно предложить такой вариант восстановления:
1. поднять рядом бекап от позовчера

подумал...
остатки 0, есть InventTransPosting, значит скорее всего InventSum и до удаления был 0, значит надо переносить проводки через doInsert (или прям на SQL), как раз чтобы InventSum не пересчитался.
инвентсум пересчитать смогу, отресторить тестовую за позавчера смогу.... но вот как с отресторенной тестовой строки с инвенттранса перекинуть - ума не приложу
Уже начал всерьез задумываться о ресторе реальной... пусчай 2 дня восстанавливают
Старый 30.12.2010, 11:55   #32  
S.Kuskov is offline
S.Kuskov
Участник
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
 
3,440 / 1775 (66) ++++++++
Регистрация: 28.04.2007
Адрес: Калуга
Цитата:
Сообщение от lev Посмотреть сообщение
Эта функция восстановит отсутствующие проводки?
Ага и ещё все орфаграфические ошибки исправит.
Старый 30.12.2010, 12:01   #33  
lev is offline
lev
Ищущий знания...
Аватар для lev
Oracle
MCBMSS
Axapta Retail User
 
1,723 / 491 (20) +++++++
Регистрация: 18.01.2005
Адрес: Москва
Цитата:
Сообщение от S.Kuskov Посмотреть сообщение
Ага и ещё все орфаграфические ошибки исправит.
не понял стеба...

я имел ввиду она только inventSum пересчитает, или проводки тоже как то затрагивает...

wamr меня правильно понял, и ответил на интересующий вопрос, спасибо
__________________
"Страх перед возможностью ошибки не должен отвращать нас от поисков истины." (с)
С Уважением,
Елизаров Артем
Старый 30.12.2010, 12:07   #34  
Wamr is offline
Wamr
----------------
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
 
1,737 / 858 (32) +++++++
Регистрация: 15.01.2002
Адрес: Москва
Записей в блоге: 7
Che (простите, Ваш ник пару раз в русской раскладке написал)
сначала определитесь нужно ли пересчитывать InventSum... как говорил lev, выполните "проверку целостности" по складу и выбранной номенклатуре в режиме проверки.
Если процедура будет ругаться, то значит надо нести проводки через классический SQL.
если не будет, то джобиком.

думаю, вам помогут... только скажите, что именно нужно
Старый 30.12.2010, 12:17   #35  
Wamr is offline
Wamr
----------------
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
 
1,737 / 858 (32) +++++++
Регистрация: 15.01.2002
Адрес: Москва
Записей в блоге: 7
и еще...
посмотрите все джобики на рабочей, где упоминается inventTrans или delete
и вспомните какие модификации делались за последнюю неделю
Старый 30.12.2010, 12:44   #36  
Che is offline
Che
Участник
 
92 / 12 (1) ++
Регистрация: 25.01.2010
насторожило: "какие модификации делались за последнюю неделю"
...если, допустим, неделю назад что то запускали, то как тогда объяснить что до вчера остатки нормальные были... получается же что то вчера "случилось"
Как я понял, проверка целостности не восстановит недостающие проводки по инвенттрансу - стоит ли тогда ее запускать?
Старый 30.12.2010, 12:59   #37  
Che is offline
Che
Участник
 
92 / 12 (1) ++
Регистрация: 25.01.2010
подскажите еще - как правильно в моем случае отловить строки по отсутствующим журналам в инвенттрансе. Пишу:
PHP код:
static void Job71(Args _args)
{
inventjournaltable      jTb;
Inventtrans             iTrans;

while 
select jTb where jTb.PostedDate && jTb.PostedDate >= mkDate(21,07,2010) && jTb.Posted
{
 
select firstonly iTrans where iTrans.TransRefId == jTb.JournalId;
 if (!
iTrans)
 {
 
info(jTb.JournalId);
 }
}

но отрабатывает очень долго... Видимо что то не учел
Старый 30.12.2010, 13:02   #38  
lev is offline
lev
Ищущий знания...
Аватар для lev
Oracle
MCBMSS
Axapta Retail User
 
1,723 / 491 (20) +++++++
Регистрация: 18.01.2005
Адрес: Москва
Цитата:
Сообщение от Che Посмотреть сообщение
подскажите еще - как правильно в моем случае отловить строки по отсутствующим журналам в инвенттрансе. Пишу:
PHP код:
static void Job71(Args _args)
{
inventjournaltable      jTb;
Inventtrans             iTrans;

while 
select jTb where jTb.PostedDate && jTb.PostedDate >= mkDate(21,07,2010) && jTb.Posted
{
 
select firstonly iTrans where iTrans.TransRefId == jTb.JournalId;
 if (!
iTrans)
 {
 
info(jTb.JournalId);
 }
}

но отрабатывает очень долго... Видимо что то не учел
лучше по inventTransId.
т.е. перебираете строки журналов (можно с джойном на журналы) и далее поиск проводки:
X++:
Select firstonly inventTrans
where inventTrans.inventTransId == InventJournalTrans.InventTransId;
__________________
"Страх перед возможностью ошибки не должен отвращать нас от поисков истины." (с)
С Уважением,
Елизаров Артем
Старый 30.12.2010, 13:06   #39  
lev is offline
lev
Ищущий знания...
Аватар для lev
Oracle
MCBMSS
Axapta Retail User
 
1,723 / 491 (20) +++++++
Регистрация: 18.01.2005
Адрес: Москва
Или вообще одним запросом типа:
X++:
while select InventJournalTrans
where inventJournalTrans.TransDate == 21\07\2010 
// и ещё что то там
notExists join inventTrans
where inventTrans.InventTransId == InventJournalTrans.inventTransId
__________________
"Страх перед возможностью ошибки не должен отвращать нас от поисков истины." (с)
С Уважением,
Елизаров Артем
Старый 30.12.2010, 16:47   #40  
Che is offline
Che
Участник
 
92 / 12 (1) ++
Регистрация: 25.01.2010
Еще один микровопрос, если кто есть трезвый ) Возможно ли в скуле напрямую скопировать табличку (например CustTable, VendTable) с одной бд - тестовой (Ctrl +C - т.е. без кода) и вставить на другую (Ctrl + V)...
Простите если вопрос дилетанта)))

Огромаднейшее спасибо за советы! Всех с наступающим!!!
 

Похожие темы
Тема Автор Раздел Ответов Посл. сообщение
DynamicsAxSCM: The InventTrans table. Explore various field usages. Blog bot DAX Blogs 0 09.11.2010 19:10
Связь CustInvoiceJour и InventTrans Silphidae DAX: Программирование 19 29.10.2009 15:18
Query из 7 таблиц Cornflower DAX: Программирование 29 15.03.2007 11:27
aEremenko: Ресурс заблокирован, ждите... Blog bot DAX Blogs 0 28.10.2006 16:01
Связь таблиц InventTrans и PurchLine Pustik DAX: Программирование 2 25.11.2004 12:23

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход

Рейтинг@Mail.ru
Часовой пояс GMT +3, время: 21:15.