quinta-feira, 27 de dezembro de 2007

Blog sobre AX

Alguns blog que frequento, são atualizados com alguma frequência:

http://axaptafreak.blogspot.com/ blog mais antigo que eu frequento
http://axaptabuilder.blogspot.com/ esse blog não é atualizado a 1 ano, mas tem ótimas informações sobre AX + VSS
http://blogs.msdn.com/dpokluda/ ótimos posts sobre Test Units ultimamente
http://blogs.msdn.com/palle_agermark/ também frquento a tempos.

Um recado para quem frequenta o blog: deixem coments nos posts para sabermos quem são vocês!!! - ja que no Brasil não somos muitos.

Abs,
Matiazo

Job para migração de produtos utilizando ADO

Feliz natal a todos (e talvez poucos!) que frequentam o blog. Esse ano completou 4 anos que eu trabalho com Ax (antigo Axapta) e é claro que nesse tempo todo trabalhando com o sistema, a cabeça ferve de ideias e soluções para todos os problemas encontrados no dia dia.

Um dos que mais me incomodavam, era a falta de uma maneira simples de carregar uma tabela de produtos, seja no começo da implantação, ou para uma demo mais aprofundada. A algum tempo escrevi um job que se utiliza das classes .Net para fazer um select num excel e importar os produtos de forma infinitamente mais rápida que a ferramenta de importação de tabelas do Ax.
Essa importação tem a vantagem de poermos trabalhar com tabela simples com todos os campos em colunas, não do conjuntos de tabelas: inventtable + InventItemLocaltion + inventTableModule para Estoque, Compras e Vendas, que são necessárias serem criadas/importadas para que o produto apareça no form de produto, uma conta simples, par aimportar um produto voce precisaria criar um excel contendo essas 3 tabelas e criar:
1. Um linha de produto na pasta InventTable
2. 3 Linhas para o mesmo produto criado na pasta 1 para preços (e todos campos que estão na aba Preço e Quantidade) de compra, venda e estoque na pasta InventTableModule
3. Uma linha ligada ao produto 1 na pasta InventItemLocation.

Para construir o job eu utilizei a classe AxInventTable, ela encapsula toda a logica para criação de produtos, as classes Ax são as classes que devem ser utilizadas quando se deseja criar alguma integração com o Ax ja que esse encapsulamento garante a criação correta das entidades. No caso dos produtos, para cada produto que é gravado, através do .save() ela ja cria os registros respectivos nas tabelas mostradas acima.

Para manter o job simples de ler, acabei trabalhando com comandos de macros definido constantes para cada indice de coluna que eu gostaria de trabalhar, assim o código fica mais legível e facil de manter.

No exemplo, o job cria o produto com as seguintes características:
1. Item id
2. Name
3. Item group
4. Item Type
5. Inventory Model group
6. Dimension group
7. Packing Quantity (quantidade de unidades por embalagem)
8. Net Weight (peso liquido)
9. Tara (o peso bruto é dado pral tara + peso liquido)
10. Classificação fiscal
11. Coluna com % de IPI

Para o IPI eu segui uma lógica simples, para cada porcentagem de IPI, foi criado um grupo correspondente dentro do Ax, no caso do exemplo somente 10%, mas isso poderia ser expandido para os IPI utilizados pelo cliente.

Utilizando deste tipo de importação (e das classes Ax), é possível configurar uma empresa com produtos, clientes e fornecedores para fazer workshops, demos, ou mesmo carga inicial de implantação de uma maneira simples e rápida com um pouco esforço de programação.

Ultimamente, todos os workshops (tanto em pre-venda ou início de implantação) que eu ja faço com meus clientes, ja trabalho com os dados reais, mesmo que básicos, falando a lingua do cliente fazendo com que a comunicação com os usuários e o entendimento do sistema seja feito de uma maneira simples para quem não conhece o sistema fazendo inclusive o usuário ir se acostumando com o sistema desde o início.


O job segue abaixo:

static void migrarProdutos(Args _args)
{
#define.ItemId (0) // A
#define.ItemName (1) // B
#define.ItemGroupId (2) // C
#define.ItemType (3) // D
#define.ModelGroupId (4) // E
#define.DimGroupId (5) // F
#define.TaxPackagingQty (6) // G
#define.NetWeight (7) // H
#define.TaraWeight (8) // I
#define.TaxFiscalClassificationId (9) // J
#define.PctIPI (10)// L


CCADOConnection adoexcel = new CCADOConnection();
CCAdoxCatalog adoCatalog = new CCAdoxCatalog();
COM adoxCatalog = new COM('ADOX.Catalog');
CCADORecordSet adoRecordSet = new CCADORecordSet();
CCADOFields adoFields;
int i;
int j;

// ------ Objetos usados importação
AxInventTable axInventTable;

InventItemGroup inventItemGroup;
TaxFiscalClassification_BR fiscalClassification;

ItemId itemId;
TaxItemGroup salesIaxItemGroup;
// ------ Objetos usados importação
;

adoexcel.connectionString("Provider=Microsoft.Jet.OLEDB.4.0;Data Source="+
"D:\\Documentos\\rm\\Projetos\\\\MigraProdutos.xlsx ;Extended Properties='Excel 8.0;HDR=Yes;IMEX=1'");
adoexcel.open();
adoxCatalog.activeConnection(adoexcel.connection());
adoCatalog.adoxCatalog(adoxCatalog);
adoRecordSet.open(@"SELECT * FROM [Plan1$]", adoexcel);
adoFields = adoRecordSet.fields();

ttsbegin;

while (! adoRecordSet.EOF())
{
if(adoFields.itemIdx(#ItemId).value())
{
itemId = adoFields.itemIdx(#ItemId).value();
if(!InventTable::find(itemId))
{
axInventTable = new AxInventTable();

axInventTable.parmItemId (adoFields.itemIdx(#ItemId) .value());
axInventTable.parmItemName (adoFields.itemIdx(#ItemName) .value());
axInventTable.parmTaxPackagingQty (adoFields.itemIdx(#TaxPackagingQty) .value());
axInventTable.parmNetWeight (adoFields.itemIdx(#NetWeight) .value());
axInventTable.parmTaraWeight (adoFields.itemIdx(#TaraWeight) .value());
axInventTable.parmTaxFiscalClassificationId(adoFields.itemIdx(#TaxFiscalClassificationId).value());

axInventTable.axInventTableModule_Sales().parmPrice(100.00);

if(adoFields.itemIdx(#PctIPI).value() == 10)
{
if(adoFields.itemIdx(#ItemType).value() == 'BOM')
{
salesIaxItemGroup = 'V-PA10'; // Venda produto acabado IPI 10%
}
else if (adoFields.itemIdx(#ItemType).value() == 'Item')
{
salesIaxItemGroup = 'V-MP10'; // Venda materia prima IPI 10%
}
else// if (adoFields.itemIdx(#ItemType).value() == 'Service') ou em branco
{
salesIaxItemGroup = "";
}
}

axInventTable.axInventTableModule_Sales().parmTaxItemGroupId(salesIaxItemGroup);

if(adoFields.itemIdx(#ItemType).value() == 'BOM')
{
axInventTable.parmItemType(ItemType::BOM);
}
else if (adoFields.itemIdx(#ItemType).value() == 'Item')
{
axInventTable.parmItemType(ItemType::Item);
}
else if (adoFields.itemIdx(#ItemType).value() == 'Service')
{
axInventTable.parmItemType(ItemType::Service);
}
else // se nada é especificado, cria o produto como ITEM
{
axInventTable.parmItemType(ItemType::Item);
}

// Cria o grupo de produto caso não exista
inventItemGroup = inventItemGroup::find(adoFields.itemIdx(#ItemGroupId).value());
if(!inventItemGroup)
{
inventItemGroup.ItemGroupId = adoFields.itemIdx(#ItemGroupId).value();
inventItemGroup.insert();
}

// Cria a classificação fiscal caso não exista
select fiscalClassification
where fiscalClassification.FiscalClassificationId == adoFields.itemIdx(#TaxFiscalClassificationId).value();

if(!fiscalClassification)
{
fiscalClassification.FiscalClassificationId = adoFields.itemIdx(#TaxFiscalClassificationId).value();
fiscalClassification.insert();
}

axInventTable.parmItemGroupId(adoFields.itemIdx(#ItemGroupId).value());
axInventTable.parmModelGroupId("CUSMED"); // Grupo de modelo de estoque fixo
axInventTable.parmDimGroupId("Std-Dim"); // Grupo de dimensões de estoque fixo
axInventTable.save();
j++;
}
}
adoRecordSet.moveNext();
}
ttscommit;

info(strfmt('Items criados %1',j));
}


quinta-feira, 20 de dezembro de 2007

X++ - Excel via OleDB direto no AX

Saudações a todos!

O Microsoft Dynamics AX dispõe de várias formas de integração.

Entre elas, existe a opção de utilizar o . NET Framework diretamente no código X++, instanciando objetos dos namespaces desejados para ler os dados diretamente da base através do ADO.Net.

A discussão sobre integração surgiu originalmente no fórum MSDN, onde existe um tópico aberto sobre importação de dados para o DAX pelos variados meios, seja AIF, Excel table (que não é recomendável para Itens, vide tópico).
Vale lembrar que a participação de todos os profissionais do ramo nesse fórum é essencial para que possamos construir uma base de conhecimento, com uma "cara" mais prática, fortalecendo nossas referências no mercado.

Voltando ao assunto principal:

O método de acesso é realizado através do .Net framework.

As referências devem ser adicionadas no node
References do AOT.
Ex. System.Data / System.Data.resources / System.Data.SqlXml e assim por diante.

static
void MeuJob(Args _args)

{

System.Data.OleDb.OleDbConnection connection;
System.Data.OleDb.OleDbCommand command;
System.Data.OleDb.OleDbDataReader dr;
str id;
str nome;
str c;
str strSql;

c = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:\\Dados.xls;Extended Properties=\"Excel 8.0;HDR=Yes;IMEX=1\";";

// O parametro HDR determina se a primeira linha contem os nomes de colunas

// "IMEX=1;" lê os dados como texto.


connection = new System.Data.OleDb.OleDbConnection();
connection.set_ConnectionString(c);
connection.Open();

strSql = "SELECT * FROM [MinhaTabela$]";

//MinhaTabela corresponde ao nome da Planilha seguido por $ e entre []s.

command = new System.Data.OleDb.OleDbCommand(strSql, connection);
dr = command.ExecuteReader();


while (dr.Read())
{
id = dr.get_Item(0);
nome = dr.get_Item(1);
info(strfmt("%1 - %2",id,nome));
}
dr.Close();
}

Caso haja qualquer outra fonte de dados suportada pelos NameSpaces System.Data.* , seja Sql, OleDB ou ODBC, é só procurar o meio de conectar.

Uma fonte interessante é o site www.connectionstrings.com que comporta uma lista com as strings de conexão, bem como suas variações para quase todos os SGBDs disponíveis no mercado.

Aproveitando a época, eu gostaria de deixar um Feliz Natal e um Ótimo 2008 a todos que prestigiam nossa casa e compartilham as idéias.

Um abraço!

Nota Fiscal Eletrônica - função de quebra de nota fiscal por linhas do pedido de venda

A nota fiscal eletrônica traz uma funcionalidade interessante de que faz a quebra dos pedidos de venda por informações contidas nas linhas.

A princípio essa quebra esta apenas disponível quando o parametro de quebra por código de serviço esta ativo.





















Porém, com uma pequena alteração, é possível fazer com que o sistema quebre uma nota fiscal por qualquer campo disponível na linha do pedido de venda mesmo que a empresa não vena serviços.

Basta localizar o grupo chamado InvoiceSplit e adicionar o campo, por exemplo PackingUnit, que é a unidade da embalagem, fazendo isso, o sistema vai quebrar as notas fiscais quando houver diferentes tipos de embalagens para as linhas do pedido de venda.

Até a proxima,

Dynamics AX SP2 para o Brasil

Em novembro foi lançado o SP2 para a localização do AX, esse service pack tras novas funcionalidades localizadas para o AX que não estavam disponíveis anteriormente:

  • Diários de Notas Fiscais (Vendor invoice jourals) agora estão localizados, isto significa que é possivel entrar com notas fiscais e ter os impostos contabilizados e registrados corretamente dentro da lei brasileira.
  • Summary Update agora agrupa corretamente tanto pedidos de compra como pedidos de venda levando em considesções fiscais importantes como CFOP, Tipo de Documento Fiscal, etc..

Também contém 2 novas funcionalidades que cobrem mudanças recentes da lei ou mudanças que estão para entrar em vigor:

  • Nota Fiscal Eletrônica para cidade de São Paulo
  • Campos e formatação da imformatação requeria pelo Ato Cotepe/SPED Fiscal

Sobre a arquitetura de software e como tornar-se um arquiteto.

Recebi uma boa indicação sobre a profissão de arquiteto de software, para que esta nessa área ou gostaria de saber mais, segue o link.

http://www.microsoft.com/brasil/msdn/arquitetura/journal/Profile_Pat_Helland.mspx

quinta-feira, 18 de outubro de 2007

Impostos no AX - Class Tax - Parte 1

Como foi dito no post anterior a classe Tax é o motor de impostos do sistema, sendo uma das mais importantes se tratando de localização brasileira.

Alguns métodos importantes, por ordem de execução (macro) e alguns comentários para cada método:

protected void insertIntersection(TaxGroup _taxGroup,
Neste método, primeiro a ser chamado quando se trata de calcular impostos, nenhum valor é tratado e sim é feita a interseção dos dois grupos de impostos (TaxGroupData e TaxOnItem) e inicializada a tabela temporária tmpTaxWorkTrans, esta tabela tem extrema importancia no manuseio dos impostos no AX, e dela que se deve extrair as imformações enquanto a nota fiscal não é efetivamente registrada, como ela é temporaria e esta dentro da classe tax, deve ser tomado um cuidado especial quando tentar usala em um escopo fora desta classe, sempre acessando o método tmpTaxWorkTrans(), que retorna a tabela.


protected void insertLineInInternal(TaxBase _baseAmount,
Ao meu ver, o melhor lugar para se "trabalhar" com as bases dos impostos, é o primeiro lugar em que se pode alterar de qualquer maneira a base dos impostos sem que haja consequencias para o post dos impostos, da nota fiscal ou que quebre o método de calculo, calculo do limite mínimo ou máximo, etc... do imposto.


TaxAmount calcTax()
Método que efetivamente faz os impostos serem calculados, a principio tem uma maniera um pouco estranha de trabalhar ja que a tabela que é utilizada nesse escopo é a TmpTax e não a TmpTaxWorkTrans, o método organiza a sequencia de calculo, isto é, impostos que tem usa base de cálculo baseada no valor "net" são calculados primeiro que impostos que tem a base baseada no "gross", em outro momento posto sobre meu entendimento de "net" e "gross" aplicado as bases de impostos aqui no Brasil.
Quem efetivamente calcula os impostos é a propria tabela de imposto através do método TaxTable.calcTaxSimple e .calcTax, um ponto importante para a localização brasileira é que regras de negócio importantes estão definidas dentro desses métodos como a redução na ase de impostos e aumento da base de impostos, aplicada a substituição tributária.


public void saveAndPost()
Método que cria as transações de impostos e registra os lançamentos contábeis relativos aos impostos.


protected void post(TaxDirection _taxDirection,
Chamado pelo método saveAndPost, contém a lógica do registro no objeto LedgerVoucher.

Impostos no AX - Visão geral

O termo Imposto é usado em 10 de 10 conversas sobre ERPs no Brasil, e claro, é foco de preocupações quando se fala de ERPs internacionais.

Tecnicamente falando, os impostos no AX são dividos em 2 classes básicas:
1. Tax
2. TaxWithhold

class Tax
A classe Tax é a base do potente motor de impostos do AX ela é responsável por descobrir que impostos devem ser calculados, trabalhar em cima das bases dos impostos até chegar na base final, que vai ser usada para efetivamente o calculo dos impostos e finalmente e registrar-los contabilmente.
Essa classe é utilizada em todos os lugares do sistema onde se vê Impostos sobre Vendas (Sales Tax), isto é, atua no momento que uma nota fiscal (seja ela se vendas, compras, projetos) é postada no sistema.


class TaxWithhold
Esta classe trabalha no famigerado calculo de impostos retidos no pagamento (seja ele de clientes ou fornecedores). Diferente dos impostos sobre vendas, os impostos aqui são calculados com base em um único grupo de impostos e não a interseção (união de 2 grupos) de grupos de impostos. A classe cumpre a tarefa de descobrir a base do imposto, calculá-la e registra-la contabilmente.
Um detalhe importante é que diferente da classe Tax. a classe TaxWithhold não é uma super classe totalmente genérica, criada para a retenção de impostos (ou um único imposto) no pagamento a fornecedores para a Itália, foi estendida para o Brasil para também tratar pagamentos recebidos de clientes, para isso, temos a classe:
TaxWithhold_CustPaym extends TaxWithhold, onde os métodos mais importantes da classe TaxWithhold são sobrescritos para tratar os impostos com base na tabela CustTrans e não VendTrans.

Histórico sobre retenção no pagamento:
Criada pela lei 10.833 de 2003 que diz que para uma serie de serviços, quem contrata o serviço é obrigado a reter, no ato do pagamento (e não do faturamento) o imposto, com o detalhe que ele so começa a ser retido após após o pagamento a partir 5000,00 e pior ainda, cumulativo, isto é, para um pagamento de 3000,00, não há impostos, para outro pagamento, no mesmo mes de 3000,00, deve ser retido os impostos com base em 6000,00 e a partir daí, todos os pagamentos devem ter o imposto retido.

segunda-feira, 8 de outubro de 2007

Job para verificar labels em um arquivo XPO

Para quem desenvolve modificações "localizadas", isto é, em mais de um idioma, eu criei um pequeno job, muito simples na verdade, que verifica, em um arquivo XPO, as propriedades "label", "helptext", "caption" e mostra a linha e o conteúdo caso não encontre o @ necessário para toda etiqueta.

Utilize as constantes para procurar pelas propriedades pré-definidas, esse job pode ser estendido para refinar o review dessas propriedades.

A ideia é facilitar o code review antes de um build para teste ou deploy em um cliente.

Até mais,
Matiazo



static void VerifyLabels(Args _args)
{
#define.label('Label #')
#define.menu('MENU #')
#define.helptext('HelpText #')
#define.caption('Caption #')

AsciiIo f = new AsciiIo('C:\\exported.xpo', 'r');
container line;
int pos;
str a;
int linenum=1;
int arroba;
;

f.inFieldDelimiter('\n');
f.inRecordDelimiter('\n');

while(!f.status())
{
line = f.read();
a = con2str(line);
pos = strscan(a,#label,0,strlen(a));
if(pos)
{
arroba = strscan(a,'@',0,strlen(a));
if(!arroba)
{
info(strfmt('%3 (%1) -> %2',pos, substr(a,pos,50),linenum));
}
}
pos = 0;
linenum++;
}
}




segunda-feira, 27 de agosto de 2007

Relações entre tabelas no Report Wizard

Quando se deseja fazer um relatório utilizando o Report Wizard, após selecionar a tabela desejada no field tree "All Tables" pode ser que o field tree "Tables that are related to the selected tables" não seja preechido corretamente ou mesmo não apareça uma relação recem criada.

Para resolver o problema, é necessário acessar o Cross Reference e atualizar o data model. Para isso, acesse Tools>Development Tools>Cross-Reference>Periodic>Update



Clique em Update Data Model e aperte ok.

O Ax vai então atualizar o data model e as relações aparecerão corretamente tanto no report wizard como nos filtros avançados. Para os que usam a localização do Brasil, as relações também aparecerão corretamente no Cofigurador (feature que ajuda a criar layouts de arquivos para exportação, voltada a usuários avançados ou consultores).


Abs,
Rodrigo

quarta-feira, 1 de agosto de 2007

Dicas e Truques - Pesquisa Global

Olá a todos,

Mais um post, agora visando a utilização de um novo recurso introduzido na versão 4.0 do Dynamics AX chamada Pesquisa Global. Essa pesquisa auxilia o usuário a rastrear informações de maneira simples e rápida, porém para utilizar esse recurso é preciso antes ter em mente quais os tipos de rastreamento que o usuário final poderá executar. Criarei abaixo um cenário para que o entendimento sejá mais fácil.

José trabalha no departamento de compras de uma empresa, e recebe um telefonema de seu gerente perguntando sobre quais pedidos de compra foram feitos para o item MP001 e qual o saldo atual de estoque.

O caminho normal seria abrir o sistema, clicar na guia de contas a pagar e em seguida em ordem de compra. Por final, um procedimento parecido deveria ser feito no item para checar seu saldo em estoque. Por sua vez com a procura global, deveríamos previamente configurar as respectivas tabelas para esse exemplo, que são:

  • purchLine
  • inventTable
Para realizar a configuração e habilitar o uso da pesquisa global, os seguintes passos devem ser seguidos:

1 - Configurar as Tabelas em :
Basico > Rastreamento de Dados : Configuração de Tabela




2 - Iniciar o Rastreador em :
Basico > Rastreamento de Dados : Rastreador de Dados



3 - Realizar a consulta utilizando a pesquisa global. Podemos inciciar a pesquisa clicando em Editar > Localizar ou simplesmente usando as teclas Ctrl + F.



No caso citado utilizei como fonte de pesquisa o item MP001 e a pesquisa como podemos ver, nos retorna a quantidade de registros e suas respectivas categorias e ao invés de se fazer todo o caminho, podemos simplesmente clicar nos link´s e ter acesso diretamente a informação requisitada.

Por hora é só. Até o próximo post.

terça-feira, 31 de julho de 2007

Mercado - Visão geral de recursos disponíveis no sistema.

Bom, começamos o blog tratando de aspectos técnicos e históricos do ERP Microsoft Dynamics AX.

As dicas e tutoriais auxiliam na área técnica, mas se você não pertence a esse contexto, certamente deseja saber o que o Dynamics AX possui que pode agregar valor à sua empresa.

O Dynamics tem sua origem no chão de fábrica. O seu módulo de produção é talvez um dos mais complexos disponíveis no mercado.

Através de uma boa implantação, é possível integrar as inúmeras variáveis existentes no universo da manufatura, gerenciamento de estoques, supply chain management, MRP e MPRII, WMS e CRM, todos eles interligados, gerando impacto na gestão financeira.

Os resultados podem ser analisados através de relatórios comuns, cubos OLAP e balanced scorecards.

Outro ponto forte é a navegabilidade. Para um usuário autorizado, é possível através de uma nota-fiscal, visualizar os movimentos contábeis em dois ou três cliques. Ainda é possível buscar os dados da lista de materiais utilizada no processo e consequentemente visualizar item a item, os custos de produção de determinado bem ou serviço.

Essa visibilidade possibilita que os usuários tenham as informações em mãos sem a necessidade de conhecer caminhos complicados ou códigos de nomes de tela, como é encontrado em outros ERPs no mercado.

Com todas as ferramentas integradas, o Microsoft Dynamics AX, aliado ao Microsoft Office pode se tornar ao mesmo tempo um sistema para controle de operações, utilizando o seu potencial WMS, gerenciar a demanda de materiais, através do MRP, consolidar as operações de custeio e determinação dos preços de venda, através do seu módulo Financeiro/Contábil, e por fim, gerar relatórios de Business Intelligence customizáveis às necessidades.



Componentes COM

Olá.

Hoje eu irei falar sobre a integração do Microsoft Dynamics AX com componentes COM, que não foram construídos sobre o .NET framework. (C++, Visual Basic 6, etc..)

Hoje irei mostrar os primeiros passos, através do COM Class Wrapper Wizard.

Esse assistente já faz todo o trabalho: Importa o arquivo, declara as classes e já faz referência ao seu registro no Windows.

Para acessá-lo, vá ao menu Tools > Development Tools > Wizards > COM Class Wrapper Wizard.



Passo 1: Selecione o componente da lista, como é feito na maioria das IDE's.


Passo 2: Selecione uma máscara a ser adicionada aos nomes das classes, para que você possa futuramente distinguir dos objetos do sistema. EX:


Passo 4: Os elementos são exibidos e estão prontos para utilização.




sexta-feira, 27 de julho de 2007

Dicas e Truques - "Tunando" o Axapta

Olá a todos,

Primeiro post considerado "polêmico" pelo pessoal aqui. Muitos não gostam da ideia de add-ins como os feitos no firefox e já falaram pra eu não ficar fuçando muito nas classes de sistema, mas em alguns casos acho válido, já que uma das caracteristicas principais do Axapta é justamente o fato de você poder modificar uns 90% do sistema em si.
Pois bem, estou fazendo uns testes com 2 ferramentas de desenvolvimento. São elas:

  • TabAX ( Que cria uma nova barra com funções das mais diversas e introduz um conceito de abas para os forms já abertos e diversos atalhos como compare e outros)
  • SysTableBrowser (Que na verdade é uma melhoria da SysTableBrowser tradicional, onde são implementadas novas possibilidades como a seleção dos campos que serão exibidos na grid.)
Abaixo alguns print-screens das 2 ferramentas.

SysTableBrowser

Standard



Tunado



TabAX




Até o próximo post.

fonte: Axaptapedia

download do TabAX
download do SysTableBrowser

Nome da instância na barra de títulos

Olá a todos!

Essa dica é bem simples.
Quando se trabalha com várias instâncias do Dynamics AX simultaneamente, como por exemplo, um application em produção e outro para base de testes, é interessante ter o nome das instâncias à vista, para diferenciá-las de maneira rápida.
Utilizando o código citado abaixo, o application instance configuration name será exibido na barra de títulos, juntamente com as informações de licença. Isso é tratado pela classe Info, conforme exemplo:


void workspaceWindowCreated(int _hWnd)
{
;
// Put workspace window specific initialization here.
WinAPI::SetWindowText(_hWnd, strFmt("%1 - %2",WinAPI::getWindowText(_hWnd), xInfo::configuration()));
}


Na barra de títulos, o caption ficará:
[Título pré-existente] - AX_PRODUCAO.
ou
[Título pré-existente] - AX_BASE_TESTES.

Hope it helps!

Fonte do código: www.axaptapedia.com

quinta-feira, 26 de julho de 2007

Primeiro post.
Criamos este blog para realizar uma troca de idéias sobre o ERP Microsoft® Dynamics AX.
Começarei colocando um link para o histórico do Microsoft Dynamics AX, que já foi Microsoft Business Solutions Axapta, Navision Axapta, Damgaard Axapta e por aí vai.

Link: MBS Advisor - Histórico AX.
(em inglês).