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

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 20.04.2007, 13:50   #21  
Logger is offline
Logger
Участник
Лучший по профессии 2015
Лучший по профессии 2014
 
3,952 / 3230 (115) ++++++++++
Регистрация: 12.10.2004
Адрес: Москва
Записей в блоге: 2
Цитата:
Сообщение от slava Посмотреть сообщение
Мое предположение, у меня и было. Ситуация: создание нескольких сотен заказов, создание закупки по ним (это все в компании 1), и создание продажи по ним (в компании 2). Обработка по продажам и закупкам счетов на оплату. Для перехода между компаниями - changecompany. Дык вот через раз Аксапта "путалась" в какой компании она разносит. Причем путалась на ровном месте (то есть в различных частях кода). Пока не "отключил" прогресс в классах обработки именно для этой операции. После этого - ни одной ошибки. Так что претензии не к самому прогрессу, а к связке его работы в рамках нескольких компаний.
Именно так !

У нас тоже была такая фигня. Причем глюк вносил прогресс в SalesFormLetter - PurchFormletter

Пришлось добавлять параметр, который позволял его отключать.
Старый 20.04.2007, 14:01   #22  
kashperuk is offline
kashperuk
Участник
Аватар для kashperuk
MCBMSS
Соотечественники
Сотрудники Microsoft Dynamics
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии 2011
Лучший по профессии 2009
 
4,361 / 2084 (78) +++++++++
Регистрация: 30.05.2004
Адрес: Atlanta, GA, USA
Да-да. В тему вот эта тема: (простите тавтологию )
Глюки при обработке отборочной накладной
Старый 22.04.2007, 12:11   #23  
Maxim Gorbunov is offline
Maxim Gorbunov
Administrator
Соотечественники
Лучший по профессии 2009
 
2,483 / 645 (26) +++++++
Регистрация: 27.11.2001
Адрес: Dubai, UAE
Есть предположение (проверить не смог, так как не смог смоделировать ситуацию пока), что проблему решит изменение свойства SetCompany дизайна формы SysOperationProgress (SetCompany = No).
__________________
Not registered yet? Register here!
Have comments, questions, suggestions or anything else regarding our web site? Don't hesitate, send them to me
Старый 23.04.2007, 09:17   #24  
Logger is offline
Logger
Участник
Лучший по профессии 2015
Лучший по профессии 2014
 
3,952 / 3230 (115) ++++++++++
Регистрация: 12.10.2004
Адрес: Москва
Записей в блоге: 2
Цитата:
Сообщение от Maxim Gorbunov Посмотреть сообщение
Есть предположение (проверить не смог, так как не смог смоделировать ситуацию пока), что проблему решит изменение свойства SetCompany дизайна формы SysOperationProgress (SetCompany = No).
Знать бы еще как проверять.
А то у нас глюк воспоизводился, но от раза к разу (и что самое обидное - как правило на боевой ).
Не нашел подходящей последовательности действий для его гарантированного воспроизведения.
Старый 23.04.2007, 10:30   #25  
sukhanchik is offline
sukhanchik
Administrator
Аватар для sukhanchik
MCBMSS
Злыдни
Лучший по профессии 2015
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
3,323 / 3547 (125) ++++++++++
Регистрация: 13.06.2004
Адрес: Москва
Чисто теоретически - можно предположить - как можно проверить.
Откуда получается глюк? Начинается код, инициализируется форма SysOperationProgress (в компании aaa). Потом делается changecompany (bbb), потом исполняется долгий код, в котором происходит обновление "градусника". Это не каждая строка с вызовом incCount(). В этот момент активизируется форма. Аксапта (т.к. форма была вызвана в компании aaa) тут же переключает компанию с bbb на aaa. В это время продолжает исполняться код, который предназначен для компании bbb. Когда этот код завершается - то мы оказываемся в компании aaa и код продолжает работать правильно.

Т.е. по сути - что нужно сделать - это написать джоб, в котором:
1. Форма SysOperationProgress открывается до changecompany
2. В changecompany после incCount(), который перерисовывает форму нужно создать к примеру запись в таблице, у которой SaveDataPerCompany=Yes

А вообще - исходя из этой идеи - действительно стоит проверить версию Максима Горбунова
__________________
Возможно сделать все. Вопрос времени
Старый 23.04.2007, 13:16   #26  
AndyD is offline
AndyD
Участник
КОРУС Консалтинг
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
 
2,560 / 2479 (88) +++++++++
Регистрация: 20.08.2005
Проблема не в форме, на которой бегут гаджики.
Проблема - в форме, которая активируется после закрытия формы прогресса (а в методе SalesFormLetter.progressKill() как раз происходит удаление формы гаджика).
Если на ней есть хоть один датасоурс и установлено свойство SetCompany=true, то при ее активации произойдет вызов Application.setDefaultCompany().

Помимо отказа от использования метода SysOperationProgress.reset() (который в конце концов вызывается в progressKill()), можно так же модифицировать его таким образом:
X++:
public void reset()
{
    ...
    // D.Andy -->
    DataAreaId  curDataArea = curExt();
    int         line;
    // D.Andy <--
    ;
    ...
    if (id == ownerId)
    // D.Andy -->
    {
        line = infolog.line();
    // D.Andy <--
        infolog.operationProgressClear();
    // D.Andy -->
        if (curDataArea != curExt())
        {
            appl.setDefaultCompany(curDataArea, false);
            infolog.cut(line, infolog.line());
        }
    }
    // D.Andy <--
}
Т.е. если произошло переключение компании в процессе удаления формы прогресса - то восстановить ее обратно (компанию).
После изменения необходимо будет сделать инкрементную компиляцию

PS По поводу формы SysOperationProgress.
А вы уверены, что она используется при работе класса SysOperationProgress?
Во всяком случае, если посмотреть метод setupForm() класса SysOperationProgressForm, то видно, что форма там создается на лету, без использования каких-либо объектов AOT.
PPS Если на форме нет датасорсов, то преключение компаний при ее активации не произойдет
__________________
Axapta v.3.0 sp5 kr2
За это сообщение автора поблагодарили: fed (5), glibs (7), belugin (5), sukhanchik (5), Logger (10).
Старый 23.04.2007, 14:51   #27  
konopello is offline
konopello
SAP
SAP
 
628 / 76 (4) ++++
Регистрация: 08.11.2005
Адрес: Минск
Цитата:
Если на ней есть хоть один датасоурс и установлено свойство SetCompany=true, то при ее активации произойдет вызов Application.setDefaultCompany().
даааа... я в свое врямя этот глюк ели отловил.
Старый 23.04.2007, 16:08   #28  
sukhanchik is offline
sukhanchik
Administrator
Аватар для sukhanchik
MCBMSS
Злыдни
Лучший по профессии 2015
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
3,323 / 3547 (125) ++++++++++
Регистрация: 13.06.2004
Адрес: Москва
Цитата:
Сообщение от AndyD Посмотреть сообщение
Проблема - в форме, которая активируется после закрытия формы прогресса
Дааа... Как говорится век живи - век учись...
__________________
Возможно сделать все. Вопрос времени
Старый 22.10.2009, 18:30   #29  
Logger is offline
Logger
Участник
Лучший по профессии 2015
Лучший по профессии 2014
 
3,952 / 3230 (115) ++++++++++
Регистрация: 12.10.2004
Адрес: Москва
Записей в блоге: 2
AndyD, спасибо вам аз еще одно содержательное сообщение. Я например долго время считал что проблема именно в форме прогресс бара.

Цитата:
Сообщение от AndyD Посмотреть сообщение
Помимо отказа от использования метода SysOperationProgress.reset() (который в конце концов вызывается в progressKill()), можно так же модифицировать его таким образом: ...
К сожалению, данный баг может быть вызван не только прогресс баром. Я сталкивался с проблемами которые вызывают формы SysPrintPrinterProgress и SysPrintProgress

Например у нас есть форма salesTable на ней по кнопке запускается обработка в компании 1, которая делает changeCompany в компанию 2 и печатает там несколько документов. В момент печати первого документа отображается форма печати (какая-то из двух SysPrintPrinterProgress, SysPrintProgress) и после её закрытия фокус попадает в на форму salesTable (вызываются методы SysSetupFormRun.activate() и salesTable.activate() ) происходит переключение в исходную компанию 1 и последующие документы уже печатаются неправильно.

Т.е. надо исправлять не только форму прогресс бара, а вообще любую форму которая может быть вызвана, например изменив SysSetupFormRun.

Вообще, мне кажется что данный баг определяется ошибкой в управлении окнами в аксапте. Пока не отработала функция вызванная из формы, не нужно передавать фокус в вызывающую форму, и вообще ни в какую форму. Т.е. не надо дергать SysSetupFormRun.activate() пока функция вызванная кнопкой не отработала до конца.

Либо ядро должно как-то связывать контекст выполнения кода и текущую компанию, так что если даже фокус перешел на вызвавшую форму (salesTable в моем примере) и произошло переключение в компанию 1, то при передаче управления обратно в функцию вызванную с формы, нужно переключать и текущую компанию обратно в компанию 2.

P.S.
Ax 3.0 KR3
Старый 25.10.2009, 00:35   #30  
Logger is offline
Logger
Участник
Лучший по профессии 2015
Лучший по профессии 2014
 
3,952 / 3230 (115) ++++++++++
Регистрация: 12.10.2004
Адрес: Москва
Записей в блоге: 2
Попробовал сделать более универсальную защиту от переключения компаний.

Для этого делаем такие изменения :
1. Заводим где-нибудь статический метод
X++:
// pkoz 24.10.2009
static 
//client
server 
boolean GRD_changeCompanyForbidden(boolean _parm = false, boolean _flush = false)
{
//    SysGlobalCache      SysGlobalCache = infolog.globalCache();
    SysGlobalCache      SysGlobalCache = appl.globalCache();
    boolean             ret;
    int                 retI;
    ;
    retI = SysGlobalCache.get(funcName(), 0, 0);
    if (!prmIsDefault(_parm)) // пишем
    {
        if (_parm)
        {
            retI++;
        }
        else
        {
            retI--;
        }
        SysGlobalCache.set(funcName(), 0, retI);
    }

    if (retI < 0 || _flush)
    {
        SysGlobalCache.set(funcName(), 0, 0);
        return false;
    }

    if(retI > 0)
        return true;

    return false;

}
у себя я добавил его на класс SysSetupFormRun

2. Создаем класс для сброса настроек состоящий из одного метода main
X++:
// GRD_changeCompanyFix_pkoz // pkoz 24.10.2009
static void main(args _args)
{
    ;
    SysSetupFormRun::GRD_changeCompanyForbidden(false, true);
}
ставим его вызов в меню, например в "Сервис - Разрешить смену компаний". Вызов этого пункта будет отменять все запреты по переключению компаний.

3. Вносим изменение в метод \Classes\Application\setDefaultCompany
X++:
    SysGlobalCache cache = appl.globalCache();
    container   GRD_stack = xSession::xppCallStack(); // pkoz 24.10.2009
    if (//GRD_isPkoz() &&
        (
           conPeek(GRD_Stack, 3) == @"(C) \Classes\FormRun\activate" // в трехзвенке
        || conPeek(GRD_Stack, 3) ==     @"\Classes\FormRun\activate" // в двухзвенке
        )
        && SysSetupFormRun::GRD_changeCompanyForbidden()
       )
    {
        warning("Запрещено переключение между компаниями. Для исправления выберите Меню Сервис - Разрешить смену компаний");
        return false;
    }

    ret = super(_selectableDataArea);
далее перед запуском какой либо обработки, успешному выполнению которой мешало спонтанное переключение между компаниями, ставим вызов
X++:
SysSetupFormRun::GRD_changeCompanyForbidden(true);
после выполнения
X++:
SysSetupFormRun::GRD_changeCompanyForbidden(false);
теперь не будет переключения между компаниями. Можно не отключать окна прогресс бара, принтера и т.п.

Пункт 2 нужен если обработка прервалась и отмена запрета переключения не была вызвана (например по ошибке).
Старый 16.05.2013, 11:53   #31  
ivas is offline
ivas
Участник
Аватар для ivas
 
252 / 68 (3) ++++
Регистрация: 22.12.2005
баг в прогрессбаре АХ 2012
В АХ2012 появился баг: при обновлении прогрессбара спомощью incCount(), в случае если не задан тотал для первого ползунка, он падает в ошибку..

Пример:
X++:
static void Job_1(Args _args)
{
    SysOperationProgress pBar;
    
    int i;
    ;
    
    pBar = new SysOperationProgress();
    
    for (i = 1; i <= 100; i++)
    {
        pBar.setText(int2str(i));
        pBar.incCount();
        
        sleep(1000);
    }
}
ошибка живет тут:
\Classes\SysOperationProgressBase\updateTime
X++:
...
            r3 = totalValue.lookup(1)-progress;
...
необходимо добавить проверку на существование 1ого элемента
X++:
            if (totalValue.exists(1)) //fix
                r3 = totalValue.lookup(1)-progress;
__________________
aLL woRk aNd nO JoY MAKes jAck a dULL Boy
За это сообщение автора поблагодарили: gl00mie (2), Antonuch (1).
Старый 08.10.2013, 20:44   #32  
DTD is offline
DTD
Участник
 
183 / 18 (1) ++
Регистрация: 09.08.2005
После in place upgrade на AX2012 CU6 перестали заканчиваться прогрессбары.

Сами задачи заканчиваются а окно прогресбара остается со случайными показателями (но чаще все таки в конце, например 97/100).
Это на всех машинах, в разных приложениях, везде где есть прогресбары, включая tutorial_progress форму.

Дебаггером не ловится, окно живет само по себе, остальной аксаптой можно пользоваться. При закрытии окна прогрессбара с таскбара падает весь клиент.
Есть идеи в каком направлении копать ?
__________________
_databaseTransDelete ... bl@$ !
Старый 08.10.2013, 23:59   #33  
gl00mie is offline
gl00mie
Участник
MCBMSS
Most Valuable Professional
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
3,684 / 5798 (201) ++++++++++
Регистрация: 28.11.2005
Адрес: Москва
Записей в блоге: 3
Если отладчиком не ловится, то что показывает трассировка? Если сравнить классы SysOperationProgress* из старого и нового приложения, есть какие-нить различия? Эти классы используют classFactory.globalCache() для хранения ссылки на SysOperationProgress - может, кэш перестал вычищаться? Хотя там вроде используется ObjectIdent. А выполнение бизнес-логики, показывающей градусник, идет в CIL? Если отключить выполнение в CIL, проблема остаётся?
Старый 09.10.2013, 03:48   #34  
DTD is offline
DTD
Участник
 
183 / 18 (1) ++
Регистрация: 09.08.2005
Отладчиком проходит все на ура, причем в методе где меняет текст, показывает все шаги от начала до конца, потом благополучно завершается. Окно в это время зависает на каком-то промежуточный тексте (но анимацию играет), как бы само по себе, отдельным тредом.

Сравнивал, SYP на этих классах не поменялся в CU6. CIL отключен, eсли включить ничего не меняется.

Кэш - один из главных кандидатов, но я не знаю как эту версию проверить.
//Были проблемы с ним перед этим, например каким-то образом продолжало тянуть из кэша классы в SourceDocumentExtensionFactory после очистки кеша из меню (там вроде все возможные методы очистки обоих кэшев вызывает внутри)

Вторая предпологаемая причина - при апгрейде инсталлятор/чеклист поменял какие-то настройки в конфиг файлах/удалил длл или что-то в этом роде, но опять же как это систематически определить непонятно.

Трассировщик не запускал, попробую как доберусь до клиента.
__________________
_databaseTransDelete ... bl@$ !
Старый 09.10.2013, 13:39   #35  
DTD is offline
DTD
Участник
 
183 / 18 (1) ++
Регистрация: 09.08.2005
Профайлером нашел, - похоже человеческий фактор. По неизвестной причине в процессе апгрейда был закомментирован вызов очистки формы прогрессбара.
__________________
_databaseTransDelete ... bl@$ !
Теги
progress bar, sysoperationprogress, баг, бегунок, законченный пример, полезное, смена компании

 

Похожие темы
Тема Автор Раздел Ответов Посл. сообщение
Проблемы с Exists Join Logger DAX: Программирование 28 28.04.2010 02:54
Enterprise Portal: какие могут быть проблемы? sminex_ax DAX: Администрирование 0 16.05.2008 12:37
Проблемы быстродействия Axapta 3.0 Alexandr A. Osipkin DAX: Администрирование 37 16.02.2007 22:43
Проблемы работы ERP в многофилиальной и территориально разнесённой компании СНГ. SlavaK DAX: Прочие вопросы 18 02.03.2004 15:25

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

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

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