4 de junho de 2009

Automatizando a DI API com scripts

A DI API - Data Interface API - é o mecanismo disponibilizado pela SAP para acesso aos objetos de negócio do Business One, pemitindo a criação de extensões ao ERP que agem nos dados exatamente como o próprio Business One.

Como esta API foi desenvolvida na plataforma COM da Microsoft, é possível automatizar tarefas relativas ao SAP Business One usando scripts que, por sua vez, podem ser agendados no Windows ou utilizados numa aplicação HTML.

O ponto de entrada para o Business One é o objeto Company. É com ele que se faz login no sistema e é ele que dá acesso aos demais objetos de negócio do ERP. Então, o script deve ser iniciado com a obtenção desse objeto. Veja um exemplo em VBScript:
Dim Company
Set Company = CreateObject ("SAPbobsCOM.Company")

Para fazer a conexão, informe o endereço do servidor de licenças, o Company DB, e o nome e senha do usuário. No exemplo abaixo, estou considerando que o servidor é o próprio computador que está executando o script. Os demais dados são os padrões para a base de demonstração que vem com o ERP.
Company.CompanyDB = "SBODemo_Brazil"
Company.Password = "manager"
Company.UserName = "manager"
Company.Server = "(local)"

ret = Company.Connect
if (ret <> 0) then
MsgBox Company.GetLastErrorDescription(), 0, "Erro"
end if

Como segurança sempre é uma questão importante, é uma boa ideia arrumar uma forma de passar para o script informações sensíveis como a senha do usuário. Montar uma aplicação HTML pode ser uma opção mas, se quiser agendar a execução do script, provavelmente terá que criar outro mecanismo - um arquivo encriptado, por exemplo.

Agora que o Company está conectado, podemos obter qualquer objeto publicado pelo Business One. No trecho de código que segue, obtenho um RecordSet e navego por todos os registros existentes:
const BoRecordset = 300
Dim oRs
Set oRs = Company.GetBusinessObject (BoRecordset)

oRs.DoQuery "SELECT * FROM OITM"
oRs.MoveFirst
while (oRs.EoF = False)
' Incluir aqui tratamento p/ cada item
' Exemplo: exportar p/ uma planilha
oRs.MoveNext
wend

Set oRs = nothing
Company.Disconnect
Set oCompany = nothing

Atribuir nothing ao RecordSet se não formos mais usuá-lo é imprescindível para liberar os recursos de máquina que ele consome. Só depois disso é que podemos desconectar o Company sem problemas.

Outro tipo de objeto que pode ser usado são aqueles relacionados às regras de negócio propriamente ditas. Por exemplo, o trecho de script abaixo recupera o código de item trazido no RecordSet do exemplo anterior. Com esse código, posiciona o objeto de negócio Items do Business One, alimenta a descrição em outra língua com a própria descrição do item, sinaliza que o item pode ser movimentado e manda gravar essas alterações no banco de dados, segundo as próprias regras do ERP.
const oItems = 4
Dim oItem, cProd
Set oItem = Company.GetBusinessObject (oItems)
c_prod = oRs.Fields.Item("ItemCode").Value

if ( oItem.GetByKey (c_prod) ) Then
oItem.ForeignName = oItem.ItemName
oItem.Frozen = 0

if (oItem.Update <> 0) then
MsgBox Company.GetLastErrorDescription(), 0, "Erro"
end if
End If

' Avisa que não vai mais usar
Set oItem = nothing

O objeto Company disponibiliza também funções para controlar transações no banco de dados - StartTransaction e EndTransaction - caso seja necessário. Apenas tenha em mente que o Business One aborta sozinho as transações caso aconteça algum erro. Use o método InTransaction para saber se ainda há uma transação ativa.

Observação: Para executar esses exemplos é preciso ter a DI API instalada. Consulte a documentação do Business One para saber como fazer isso.

Nenhum comentário :

Postar um comentário

OBS: Os comentários enviados a este Blog são submetidos a moderação. Por isso, eles serão publicados somente após aprovação.

Observação: somente um membro deste blog pode postar um comentário.