Eu estou trabalhando em uma migracao de dados um tanto extensa, mas ao inves de trabalhar exportando dados do antigo sistema para um arquivo e importando o mesmo para o AX, decidimos criar uma conexao direta com o SQL, ler as informacoes e importa-las para o AX. Meu amigo ucraniano que trabalha comigo Kirill Val me deu as instrucoes e depois da primeira classe o resto e brincadeira de crianca. Gostaria de que caso alguem tenha alguma sugestao de melhoria, por favor envie.Criei uma classe chamada AXImport e no metodo classDeclaration() eu declaro duas variaveis, uma do tipo LoginProperty e outra do tipo ODBCConnection. Essa classe especifica e usada tambem para update, por isso, para executa-la em batch, eu a fiz extendendo a classe RunBaseBatch, mas nao e uma regra.public class AXImport extends RunBaseBatch{ LoginProperty loginProperty; ODBCConnection connection;} Depois crie um metodo connect() que faca a conexao com o banco:void connect(){ ; loginProperty = new LoginProperty(); loginProperty.setServer('localhost');//Endereco do server, no caso era local loginProperty.setDatabase('DATABASE');//Nome da base, na duvida, cheque no SQL connection = new ODBCConnection(loginProperty);}Crie os metodos pack() e unpack():public container pack(){ container ret; return ret;}public boolean unpack(container packedClass){ boolean ret = true; return ret;}Agora crie um metodo que leia os dados do banco e os insira no AX. So vamos criar um metodo que vai inserir alguns fornecedores. Como e um exemplo, so vou mandar buscar o id, nome e grupo de fornecedores. Voce pode colocar quais campos voce quer no select, ou usar o SELECT * FROM, mas neste caso, voce vai precisar ver no SQL qual vai ser a ordem em que os campos aparecem, enquanto na primeira opcao voce escolhe a ordem dos campos. Saber a ordem dos campos e importante na hora de determinar qual campo do banco preenchera o campo da tabela no AX.void TransferData(){ Statement statement; ResultSet resultSet; str sql; str description; SqlStatementExecutePermission perm; VendTable vendTable; AxVendTable axVendTable; VendGroupId vendGroup; VendAccount vendAccount; VendName vendName; ; //Deve ser utilizado a sintaxe do SQL, nao a do AX. sql = "SELECT NANUM, NANAME, NAVENDG FROM TABELA_EXEMPLO"; perm = new SqlStatementExecutePermission(sql); perm.assert(); statement = connection.createStatement(); resultSet = statement.executeQuery(sql); while (resultSet.next()) { //Na mesma ordem do select ou, se usado o select * from, na que esta no SQL vendAccount = strrtrim(resultSet.getString(1)); vendName = strrtrim(resultSet.getString(2)); vendGroup = strrtrim(resultSet.getString(3)); vendTable = VendTable::find(vendAccount); if (!vendTable) { axVendTable = new AxVendTable(); axVendTable.parmAccountNum(vendAccount); axVendTable.parmVendGroup(vendGroup); axVendTable.parmName(vendName); axVendTable.save(); info("Inserido Fornecedor: " + vendAccount); } } resultSet.close(); statement.close();}Crie o metodo run() que vai chamar primeiro o metodo da conexao e depois o da transferencia de dados.public void run(){ this.connect(); this.TransferData();}Crie o metodo main():static void main(Args args){ AXImport axImport = new AXImport(); ; if (axImport.prompt()) { axImport.run(); info("Importacao concluida"); }}Bom, essa e a classe de exemplo, qualquer sugestao de melhoria ou criticas sao bem-vindas. Essa semana precisei fazer o AX enviar e-mails direto, sem precisar configurar o Outlook.Para isso verifiquei em alguns blogs de referencia e no final criei um codigo simples e com algumas configuracoes do sistema fiz o envio diretamente pelo AX.Antes de alterar qualquer codigo, vamos parametrizar a conta que o AX utiliza para