Lançar diário utilizando X++
Fala pessoal,
Hoje vamos lançar um diário utilizando o X++, sei que será bem útil pois desde que comecei a trabalhar com o Dynamics AX ja precisei fazer isso várias vezes. Então mãos a obra…
Como todos sabem a tabela que armazena os diários e suas transções são respectivamente a LedgerJournalTable e a LedgerJournalTrans, e para que o exemplo abaixo funcione perfeitamente, é necessário que você tenha preenchido um tableBuffer da LedgerJournalTable (Cabeçalho do diário).
Existem duas classes que é possível fazer isso a LedgerJournalCheckPost e a LedgerJournalPost, que posteriormente chama a LedgerJournalCheckPost, mas faz alguma verificações como tipo de diário e outras. Neste exemplo irei utilizar a LedgerJournalPost:
//Start
static void postJournal(Args _args)
{
LedgerJournalTable ledgerJournalTable;
;
//Pega a primeira linha da JournalTable, independente do tipo de Diário
select firstonly ledgerJournalTable
where ledgerJournalTable.Posted == NoYes::No;
//Lança o diário independento do tipo de diário
//parâmetro1 = tableBuffer da LedgerJournalTalbe
//parâmetro2 = indica se os erros devem ou não ser jogados em um novo diário
LedgerJournalPost::postJournal(ledgerJournalTable, NoYes::No);
}
//End
Se tivessemos usado a classe LedgerJournalCheckPost, seria preciso especificar qual seria o tipo de diário, com a classe LedgerJournalPost ele se encarrega de verificar qual é o tipo de diário e aplicar uma regra para cada tipo.
OBS: Quem quiser saber mais procure a classe LedgerJournalEngine que é a encarregada de definir as regras para cada tipo de diário. Existe um Enum que carrega todos os tipos de diário ele se chama LedgerJournalType.
É isso ai pessoal, caso reste alguma dúvida estou as ordens para responder!!COMENTEM!!!
Abraços,
Peterson Ferreira
Colocar log no “Event Viewer” do windows
Boa tarde pessoal,
Estava navegando nos blogs sobre AX espalhados pela internet, e achei uma solução muito interessante e resolvi colocar aqui pra vocês. Sabe aquelas classes que são feitas para ficar rodadando todas as noites para corrigir ou atualizar algo, e quando você chega no outro dia a classe deu erro e você não sabe porque?
Você pode utilizar este job para colocar em sua classe escrever o erro ou algum aviso no event viewer do windows:
//Start
static void eventViwerLog(Args _args)
{
System.Diagnostics.EventLog eventLog;
LogText nameLog = "Dynamics AX Brasil";
LogText sourceLog = "Log de Teste";
;
if(!System.Diagnostics.EventLog::SourceExists(sourceLog))
{
System.Diagnostics.EventLog::CreateEventSource(sourceLog, nameLog);
}
eventlog = new System.Diagnostics.EventLog();
eventlog.set_Source(sourceLog);
//Colocando uma mensagem no log
eventlog.WriteEntry("Testando log no event viewer!");
//Colocando mensagem de error no log
eventlog.WriteEntry("Erro! Teste de error. \n\n" +
con2str(xSession::xppCallStack()), System.Diagnostics.EventLogEntryType::Error);
//Colocando aviso no log
eventlog.WriteEntry("Fim de teste" , System.Diagnostics.EventLogEntryType::Warning);
info("Olhe no seu event viewer!");
}
//End
É isso pessoal, se restou alguma dúvida sobre a utilidade deste job ou algo técnico.
Abraços, e até a próxima!
Listar objetos de um projeto utilizando “Reflection”
Boa noite pessoal… Depois de quase duas semanas sem postar, hoje vou colocar no post um assunto bem interessante sobre Reflections, que rolou enquanto eu e meus amigos de trampo estavamos tendo treinamento de Ax em julho desse ano.
A cada noite de treinamento tínhamos um desafio, e o desafio dessa noite era: Como listar todos os objetos de um projeto utilizando reflection ? Chegamos muito perto mas não conseguimos, assim o instrutor que no dia era o Leonardo Monteiro nos mandou o .xpo da resolução, que por sinal muito inteligente.
Ai essa semana perguntei para ele se eu poderia colocar o projeto no blog pro pessoal estudar, e ele liberou… Então todos os créditos ao Leonardo Monteiro.
let`s go ! Nesse job foi utilizada um função recursiva, para caso os objetos estejam separados pro grupos, assim como manda as boas práticas de desenvolvimento do AX. Foi utilizado também alguns recursos de reflection do AX, exemplo: TreeNodeIterator…
//Start
static void listAllObjectosFromProject(Args _args)
{
//Pega o nome do Projeto
ProjName projName = "ListProjectNode_MSBS";
//Aonde está seu projeto? Shared ou Private...
ProjectListNode list = infolog.projectRootNode().AOTfindChild("Shared");
//Instância um TreeNodeIterator para percorrer os projetos
TreeNodeIterator ir = list.AOTiterator();
ProjectNode pnProj;
ProjectNode pn = list.AOTfindChild(projName);
void searchAllObj(projectNode rootNode)
{
#TreeNodeSysNodeType
TreeNode childNode;
TreeNodeIterator rootNodeIterator;
;
if (rootNode)
{
rootNodeIterator = rootNode.AOTiterator();
childNode = rootNodeIterator.next();
while (childnode)
{
// Verifica se o elemento possui filhos, se tiver chama novamento o método
if (childNode.AOTgetNodeType() == #NT_PROJECT_GROUP)
searchAllObj(childNode);
// Senão mostra nome do elemento
else
info(strfmt("Grupo:%1 - Objeto: %2", rootNode.AOTname(), childNode.AOTname()));
childNode = rootNodeIterator.next();
}
}
}
;
if (pn)
{
info(strFmt("Projeto %1:", projName));
pnProj = pn.loadForInspection();
searchAllObj(pnProj);
pnproj.treeNodeRelease();
}
else
info("Projeto não encontrado");
}
//End
Para realizar o teste eu seu ambiente de desenvolvimento basta copiar o código mudar o nome do projeto e onde ele está na árvore de projetos (Private ou Shared).
Era isto pessoal, bem simples e muito interessante, queria agradecer a Léo mais uma vez !!! Espero que tenham gostado, qualquer dúvida COMENTEM…E até a próxima !
Adicionando “Ir para o formulário da tabela principal”
Fala galera…vamos a mais um post, hoje vamos falar de um método de substituição chamado jumpRef(); Ele é simplesmente aquela função tão útil que temos em um campo…”Ir para o formulário da tabela principal”.
Essa semana no trampo precisei colocar esse tal “Ir para o formulário da tabela principal” em um campo que não tinha essa funcionalidade. Como eu e um colega do trampo demoramos um pouco para achar, resolvi postar aqui pois pode ser bem útil. Vamos lá…
O exemplo será bem simples, irei implementar esse método e ele irá chamar um formulário, criando um “Ir para o formulário da tabela principal” no campo:
//Start
public void jumpRef()
{
MenuFunction menu = new MenuFunction(menuItemDisplayStr(CustTable), MenuItemType::Display);
;
//super();
menu.run();
}
//End
No exemplo acima, este método chamará no seu campo o formulário “CustTable”.
Caso você queira retirar o “Ir para o formulário da tabela principal” de seu campo basta comentar o super(); como no exemplo abaixo:
//Start
public void jumpRef()
{
;
//super();
}
//End
Bom galera essa foi uma dúvida que surgiu e espero que eu possa ter ajudado.
Abraços,
Peterson Ferreira
Filtrar Datasource de um Formulário
Fala galera… Vamos a mais post espero que todos vocês gostem. Eu e uma amigo no trampo precisamos filtrar o datasource de um formulário ou seja adicionar ranges. Bem simples…
Você pode alterar o código para a sua necessidade, vamos lá:
O código abaixo coloca dois filtros em um formulário.
Sobscreva o método INIT do formulário desejado. E utilize o código abaixo conforme a sua necessidade:
//Start
public void init()
{
;
super();
DataSourcedoFormulario_ds.query().dataSourceTable(tablenum(DataSourcedoFormulario)).addRange(fieldNum(DataSourcedoFormulario, SeuCampo)).value("Valor que será o range");
}
//End
Este método pode ser bastante útil quando é necessário que o mesmo formulário seja chamado de lugares diferentes e que passam valores diferentes.
Espero ter ajudado a todos, e até a próxima !! COMENTEM !!!


