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.
- public class AXImport extends RunBaseBatch
- {
- LoginProperty loginProperty;
- ODBCConnection connection;
- }
- void connect()
- {
- ;
- loginProperty = new LoginProperty();
- loginProperty.setServer('localhost');//Endereço do server, no caso era local
- loginProperty.setDatabase('DATABASE');//Nome da base, na dúvida, cheque no SQL
- connection = new ODBCConnection(loginProperty);
- }
- public container pack()
- {
- container ret;
- return ret;
- }
- public boolean unpack(container packedClass)
- {
- boolean ret = true;
- return ret;
- }
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.
- 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, não 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 está 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();
- }
- public void run()
- {
- this.connect();
- this.TransferData();
- }
- static void main(Args args)
- {
- AXImport axImport = new AXImport();
- ;
- if (axImport.prompt())
- {
- axImport.run();
- info("Importação concluída");
- }
- }
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