No Dynamics AX 4.0 é possível passar uma série de comandos no startup do client. Um desses comandos inicializa o processamento em lotes (batch) de um determinado grupo de lotes previamente configurado (básico -> configuração -> lotes -> Grupo de lotes):

Exemplo de um comando interpretado pelo client do AX: Iniciar -> executar -> ax32 -startupcmd=batch_GRUPO.

QUem vai lidar com esse comando é a class SysStartupCmd. O método construct é chamado e recebe a instrução depois de “-startupcmd=” retornando a classe especialista, no caso a SysStartupCmdBatchRun. Essa classe deveria passar para o processo (batchrun) em lotes o nome GRUPO (que é o group id que passamos. A classe também faz o parse do que vem depois do “_”).

Porém nos testes que realizei esse comando nunca funcionou. Eis o que descobri:

Função InfoRun() da class SysStartupCmdBatchRun:

1
2
3
4
5
6
7
void infoRun()
{
    BatchRun batchRun = new BatchRun();
;
    batchRun.parmUseForm(true);
    batchRun.run();
}

O grupo de lotes (groupId) nunca foi passado para o objeto, então o correto seria:

1
2
3
4
5
6
7
8
9
10
11
void infoRun()
{
    BatchRun batchRun = new BatchRun();
;
    //
    if(parm)
        batchRun.parmGroupId(parm);
    //
    batchRun.parmUseForm(true);
    batchRun.run();
}

Depois dessa correção o processo em lotes funcionou corretamente. Por favor testem sem a correção e depois com essa correção e postem aqui comentários se funcionou ou não!

UPDATE: Acabei de procurar na NET uma solução para deixar o Dynamics AX rodando batchs via windows service e achei o post do AxaptaBuilder explicando que realmente temos que corrigir a classe em questão.

Vale a pena ler o conteúdo do post do AxaptaBuilder já que ali está tudo bem detalhado. O crédito fica para nosso amigo Yurii Rasskazov!

Abraços e até a próxima