Como criar uma conexão entre o SQL e o Dynamics AX
Autor: Leandro | Publicado: 2011-02-11T19:18:00-02:00

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&nbsp;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
{
&nbsp;&nbsp;&nbsp; LoginProperty&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;loginProperty;
&nbsp;&nbsp;&nbsp; ODBCConnection&nbsp; connection;
}&nbsp;
Depois crie um método connect()&nbsp;que faça a conexão com o banco:
void connect()
{
&nbsp;&nbsp;&nbsp; ;
&nbsp;&nbsp;&nbsp; loginProperty = new LoginProperty();
&nbsp;&nbsp;&nbsp; loginProperty.setServer('localhost');//Endereço do server, no caso era local
&nbsp;&nbsp;&nbsp; loginProperty.setDatabase('DATABASE');//Nome da base, na dúvida, cheque no SQL
&nbsp;
&nbsp;&nbsp;&nbsp; connection = new ODBCConnection(loginProperty);
}
Crie&nbsp;os métodos&nbsp;pack() e unpack():
public container pack()
{
&nbsp;&nbsp;&nbsp; container ret;
&nbsp;&nbsp;&nbsp; return ret;
}

public boolean unpack(container packedClass)
{
&nbsp;&nbsp;&nbsp; boolean ret = true;
&nbsp;&nbsp;&nbsp; return ret;
}
Agora crie um método&nbsp;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()
{
&nbsp;&nbsp;&nbsp; Statement statement;
&nbsp;&nbsp;&nbsp; ResultSet&nbsp; resultSet;
&nbsp;&nbsp;&nbsp; str&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; sql;
&nbsp;&nbsp;&nbsp; str&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;description;
&nbsp;&nbsp;&nbsp; SqlStatementExecutePermission perm;

&nbsp;&nbsp;&nbsp; VendTable&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; vendTable;
&nbsp;&nbsp;&nbsp; AxVendTable&nbsp;axVendTable;

&nbsp;&nbsp;&nbsp; VendGroupId&nbsp;vendGroup;
&nbsp;&nbsp;&nbsp; VendAccount vendAccount;
&nbsp;&nbsp;&nbsp; VendName&nbsp;&nbsp;&nbsp;&nbsp;vendName;
&nbsp;&nbsp;&nbsp; ;

&nbsp;&nbsp;&nbsp; //Deve ser utilizado a sintaxe do SQL, não a do AX.
&nbsp;&nbsp;&nbsp; sql = "SELECT NANUM, NANAME, NAVENDG FROM TABELA_EXEMPLO"; 

&nbsp;&nbsp;&nbsp; perm = new SqlStatementExecutePermission(sql);
&nbsp;&nbsp;&nbsp; perm.assert();
&nbsp;
&nbsp;&nbsp;&nbsp; statement = connection.createStatement();
&nbsp;&nbsp;&nbsp; resultSet&nbsp; = statement.executeQuery(sql);
&nbsp;
&nbsp;&nbsp;&nbsp; while (resultSet.next())
&nbsp;&nbsp;&nbsp; {
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //Na mesma ordem do select ou, se usado o select * from, na que está no SQL
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; vendAccount = strrtrim(resultSet.getString(1));
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; vendName = strrtrim(resultSet.getString(2));
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; vendGroup = strrtrim(resultSet.getString(3));

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; vendTable = VendTable::find(vendAccount);
&nbsp;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (!vendTable)
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; axVendTable = new AxVendTable();
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; axVendTable.parmAccountNum(vendAccount);
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; axVendTable.parmVendGroup(vendGroup);
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; axVendTable.parmName(vendName);
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; axVendTable.save();
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; info("Inserido Fornecedor: " + vendAccount);
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }
&nbsp;&nbsp;&nbsp; }
&nbsp;&nbsp;&nbsp; resultSet.close();
&nbsp;&nbsp;&nbsp; statement.close();
}
Crie o método run() que vai chamar primeiro o método da conexão e depois&nbsp;o da transferência de dados.
public void run()
{
&nbsp;&nbsp;&nbsp; this.connect();
&nbsp;&nbsp;&nbsp; this.TransferData();
}
Crie&nbsp;o método&nbsp;main():
static void main(Args args)
{
&nbsp;&nbsp;&nbsp; AXImport axImport = new AXImport();
&nbsp;&nbsp;&nbsp; ;
&nbsp;&nbsp;&nbsp; if (axImport.prompt())
&nbsp;&nbsp;&nbsp; {
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; axImport.run();
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; info("Importação concluída");
&nbsp;&nbsp;&nbsp; }
}
Bom, essa é a classe de exemplo, qualquer sugestão de melhoria ou críticas são bem-vindas.