Páginas

Como criar uma conexão entre o SQL e o Dynamics AX

Eu estou trabalhando em uma migração de dados um tanto extensa, mas ao invés de trabalhar exportando dados do antigo sistema para um arquivo e importando o mesmo para o AX, decidimos criar uma conexão direta com o SQL, ler as informações e importá-las para o AX. Meu amigo ucraniano que trabalha comigo Kirill Val me deu as instruções e depois da primeira classe o resto é brincadeira de criança. Gostaria de que caso alguém tenha alguma sugestão de melhoria, por favor envie.

Criei uma classe chamada AXImport e no método classDeclaration() eu declaro duas variáveis, uma do tipo LoginProperty e outra do tipo ODBCConnection. Essa classe específica é usada também para update, por isso, para executá-la em batch, eu a fiz extendendo a classe RunBaseBatch, mas não é uma regra.
  1. public class AXImport extends RunBaseBatch
  2. {
  3.     LoginProperty         loginProperty;
  4.     ODBCConnection  connection;
Depois crie um método connect() que faça a conexão com o banco:
  1. void connect()
  2. {
  3.     ;
  4.     loginProperty = new LoginProperty();
  5.     loginProperty.setServer('localhost');//Endereço do server, no caso era local
  6.     loginProperty.setDatabase('DATABASE');//Nome da base, na dúvida, cheque no SQL
  7.  
  8.     connection = new ODBCConnection(loginProperty);
  9. }
Crie os métodos pack() e unpack():
  1. public container pack()
  2. {
  3.     container ret;
  4.     return ret;
  5. }

  1. public boolean unpack(container packedClass)
  2. {
  3.     boolean ret = true;
  4.     return ret;
  5. }
Agora crie um método que leia os dados do banco e os insira no AX. Só vamos criar um método que vai inserir alguns fornecedores. Como é um exemplo, só vou mandar buscar o id, nome e grupo de fornecedores. Você pode colocar quais campos você quer no select, ou usar o SELECT * FROM, mas neste caso, você vai precisar ver no SQL qual vai ser a ordem em que os campos aparecem, enquanto na primeira opção você escolhe a ordem dos campos. Saber a ordem dos campos é importante na hora de determinar qual campo do banco preencherá o campo da tabela no AX.
  1. void TransferData()
  2. {
  3.     Statement statement;
  4.     ResultSet  resultSet;
  5.     str            sql;
  6.     str            description;
  7.     SqlStatementExecutePermission perm;
  8.     VendTable      vendTable;
  9.     AxVendTable axVendTable;
  10.     VendGroupId vendGroup;
  11.     VendAccount vendAccount;
  12.     VendName    vendName;
  13.     ;
  14.     //Deve ser utilizado a sintaxe do SQL, não a do AX.
  15.     sql = "SELECT NANUM, NANAME, NAVENDG FROM TABELA_EXEMPLO";
  16.     perm = new SqlStatementExecutePermission(sql);
  17.     perm.assert();
  18.  
  19.     statement = connection.createStatement();
  20.     resultSet  = statement.executeQuery(sql);
  21.  
  22.     while (resultSet.next())
  23.     {
  24.         //Na mesma ordem do select ou, se usado o select * from, na que está no SQL
  25.         vendAccount = strrtrim(resultSet.getString(1));
  26.         vendName = strrtrim(resultSet.getString(2));
  27.         vendGroup = strrtrim(resultSet.getString(3));
  28.         vendTable = VendTable::find(vendAccount);
  29.  
  30.         if (!vendTable)
  31.         {
  32.             axVendTable = new AxVendTable();
  33.             axVendTable.parmAccountNum(vendAccount);
  34.             axVendTable.parmVendGroup(vendGroup);
  35.             axVendTable.parmName(vendName);
  36.             axVendTable.save();
  37.             info("Inserido Fornecedor: " + vendAccount);
  38.         }
  39.     }
  40.     resultSet.close();
  41.     statement.close();
  42. }
Crie o método run() que vai chamar primeiro o método da conexão e depois o da transferência de dados.
  1. public void run()
  2. {
  3.     this.connect();
  4.     this.TransferData();
  5. }
Crie o método main():
  1. static void main(Args args)
  2. {
  3.     AXImport axImport = new AXImport();
  4.     ;
  5.     if (axImport.prompt())
  6.     {
  7.         axImport.run();
  8.         info("Importação concluída");
  9.     }
  10. }
Bom, essa é a classe de exemplo, qualquer sugestão de melhoria ou críticas são bem-vindas.

Um comentário:

  1. Muito interessante Leandro, aqui no projeto que estou participando fazemos cargas através de planilhas, mas é uma ótima sugestão. Já testei o código e funcionou muito bem, resta agora ter um tempo para implementar essa solução, já que o projeto está bem corrido!

    ResponderExcluir