Parte 3
Para encerrar o tutorial veremos como acessar os dados de uma RFC e como gravar dados em uma tabela dentro da RFC. Para isso daremos continuidade ao nosso projeto.
Serei bem direto nessa etapa pois creio que o código fonte fala por si só.
Lendo os dados de uma tabela
1º criei um classe de nome Material para receber os dados da tabela que iremos ler:
Public Class Material
Private _code As String
Private _descricao As String
Private _quantidade As Double
Public Property Code As String
Get
Return _code
End Get
Set(value As String)
_code = value
End Set
End Property
Public Property Descricao As String
Get
Return _descricao
End Get
Set(value As String)
_descricao = value
End Set
End Property
Public Property Quantidade As Double
Get
Return _quantidade
End Get
Set(value As Double)
_quantidade = value
End Set
End Property
End Class
2º criei um método dentro da classe RfcTableReader de nome getMateriais, onde iremos ler os dados da tabela SAP e montar uma lista de materias:
Public Function getMateriais(ByRef rfcFunction As IRfcFunction) As IList(Of Material)
Try
'RECUPERANDO A TABELA TB_MATERIAIS DA RFC
Dim rfcTabMateriais As IRfcTable = rfcFunction.GetTable("TB_MATERIAIS")
'CRIANDO UMA LISTA QUE IRÁ CONTER DOS DADOS LIDOS DA RFC-TABLE
Dim itens As IList(Of Material) = New List(Of Material)
'EXECUTANDO O LOOP DOS DADOS DA TABELA SAP
For Each row As IRfcStructure In rfcTabMateriais
Dim it As New Material
'TESTANDO SE O EXISTE VALOR NA VARIAVEL SAP
If Not (IsDBNull(row.GetValue("DSCODE"))) Then
it.Code = row.GetString("DSCODE")
End If
If Not (IsDBNull(row.GetValue("DSDESCRIPT"))) Then
it.Descricao = row.GetString("DSDESCRIPT")
End If
If Not (IsDBNull(row.GetValue("DSQUANT"))) Then
it.Quantidade = row.GetString("DSQUANT")
End If
'VERIFICANDO SE O MATERIAL POSSUI CÓDIGO
If Not String.IsNullOrEmpty(it.Code) Then
itens.Add(it) 'ADD REGISTRO A LISTA
End If
Next
Return itens
Catch exSap As RfcAbapRuntimeException
Throw New Exception("ABAP error run Time: " & exSap.Message)
Catch exSap As RfcAbapBaseException
Throw New Exception("ABAP base error" & exSap.Message)
Catch ex As Exception
Throw
End Try
End Function
leia atentamente os comentários que estão dentro da função para que você tenha maior conhecimento da mesma, ok?
3º Executando a RFC e lendo os dados da tabela Material utilizando o que criamos até o momento:
Antes alguns detalhes importantes,
Criando uma instancia IRfcFunction, ela serve para executar todos os comandos da RFC e dentro dela estão contidas todas as tabelas, parametros etc dessa função.
No nosso exemplo iremos chamar a RFC "FRC_MATERIAL":
Dim rfcFunction As IRfcFunction = repositorio.CreateFunction("RFC_MATERIAL")
Após chamar a RFC é necessário a passagens dos parametros da função, caso necessário, como data, período, usuário, lote etc, cada RFC possui seus próprios parâmetros.
rfcFunction.SetValue("DATA", Now)
rfcFunction.SetValue("USER", "camilo.correa.silva.silva")
Para finalizar essas observações, após definir a RFC, passar os devidos parâmetros, basta invocar a função, ou executa-la. Para isso você irá utilizar a função "invoke" e passar para ela as configurações de acesso definidas na segunda parte desse tutorial [ 2ª parte ].
rfcFunction.Invoke(dest)
Veja como ficou nosso código:
Public Sub LerDadosRFC()
Try
'1º - MONTAR OS PARAMETROS PARA CONEXÃO SAP
Dim con As New SAPConnect()
'A FUNÇÃO REGISTER ABRE A CONEXÃO COM SAP
RfcDestinationManager.RegisterDestinationConfiguration(con)
Dim dest As RfcDestination = RfcDestinationManager.GetDestination("homologacao")
Dim repositorio As RfcRepository = dest.Repository
Try
'CHAMANDO A RFC - PASSANDO PARAMETROS
Dim rfcFunction As IRfcFunction = repositorio.CreateFunction("RFC_MATERIAL")
'PASSANDO OS PARAMETROS DE LEITURA DA RFC
rfcFunction.SetValue("DATA", Now)
rfcFunction.SetValue("USER", "camilo.correa.silva.silva")
'EXECUTANDO A RFC
rfcFunction.Invoke(dest)
'CHAMANDO A FUNÇÃO QUE LÊ OS DADOS CONTIDOS NA TABLE DA RFC
Dim materiais As IList(Of Material) = getMateriais(rfcFunction)
Catch exSap As RfcAbapRuntimeException
Throw New Exception("ABAP error run Time: " & exSap.Message)
Catch exSap As RfcAbapBaseException
Throw New Exception("ABAP base error" & exSap.Message)
Catch ex As Exception
Throw
Finally
'FECHA A CONEXÃO COM SAP
RfcDestinationManager.UnregisterDestinationConfiguration(con)
End Try
Catch exSap As RfcCommunicationException
Throw New Exception("Falha na comenicação com SAP: " & exSap.Message)
Catch exSap As RfcLogonException
Throw New Exception("Falha no Login: " & exSap.Message)
Catch ex As Exception
Throw New Exception("Erro: " & vbCrLf & ex.Message)
End Try
End Sub
4º Gravando dados em uma tabela do SAP
As funções para leitura e gravação são bem parecidas e intuitivas, por exemplo, para se ler um campo de uma tabela SAP getValue("NOME DO CAMPO"), para se escrever em um campo, setValue("NOME DO CAMPO", valor).Dito isso, existe apenas um comando a mais que deve ser inserido para gerar uma nova linha na tabela SAP antes de inserirmos os valores, que é o comando "Append()"
Veja logo baixo como ficou nosso código de gravação em uma tabela SAP:
Public Sub GravarDadosRFC(ByVal materiais As IList(Of Material))
Try
'1º - MONTAR OS PARAMETROS PARA CONEXÃO SAP
Dim con As New SAPConnect()
'A FUNÇÃO REGISTER ABRE A CONEXÃO COM SAP
RfcDestinationManager.RegisterDestinationConfiguration(con)
Dim dest As RfcDestination = RfcDestinationManager.GetDestination("homologacao")
Dim repositorio As RfcRepository = dest.Repository
Try
'CHAMANDO A RFC - PASSANDO PARAMETROS
Dim rfcFunction As IRfcFunction = repositorio.CreateFunction("RFC_MATERIAL")
'PASSANDO OS PARAMETROS DE LEITURA DA RFC
rfcFunction.SetValue("DATA", Now)
rfcFunction.SetValue("USER", "camilo.correa.silva.silva")
'INSTANCIANDO A TABELA MATERIAL
Dim rfcTabMateriais As IRfcTable = rfcFunction.GetTable("TB_MATERIAIS")
'INSERINDO OS REGISTROS DA TABELA DO SAP
For Each material As Material In materiais
'CRIAR UM NOVO REGISTRO NA TABELA
rfcTabMateriais.Append()
'PASSANDO OS VALORES PARA TABLE
rfcTabMateriais.SetValue("DSCODE", material.Code)
rfcTabMateriais.SetValue("DSDESCRIPT", material.Descricao)
rfcTabMateriais.SetValue("DSQUANT", material.Quantidade)
Next
'EXECUTANDO A RFC e INSERINDO OS VALORES
rfcFunction.Invoke(dest)
Catch exSap As RfcAbapRuntimeException
Throw New Exception("ABAP error run Time: " & exSap.Message)
Catch exSap As RfcAbapBaseException
Throw New Exception("ABAP base error" & exSap.Message)
Catch ex As Exception
Throw
Finally
'FECHA A CONEXÃO COM SAP
RfcDestinationManager.UnregisterDestinationConfiguration(con)
End Try
Catch exSap As RfcCommunicationException
Throw New Exception("Falha na comenicação com SAP: " & exSap.Message)
Catch exSap As RfcLogonException
Throw New Exception("Falha no Login: " & exSap.Message)
Catch ex As Exception
Throw New Exception("Erro: " & vbCrLf & ex.Message)
End Try
End Sub
Conclusão
Podemos perceber que para fazer uma integração com SAP via RFC é bem simples. Para isso você deve saber meia dúzia de comandos e ter uma código bem estruturado.
Espero que tenha conseguido ajudar pessoas que como eu tiveram dificuldade de fazer sua primeira integração .Net com SAP.
Se existir alguma dúvida sobre meu código basta me escrever ou postar um comentário, ok?
Para finalizar, como eu havia prometido, segue o link para download da solução que desenvolvemos para esse tutorial:
[ Solução .Net 4.0, visual Studio 2010 RFC Tutorial ]
senha para desconpacta: besaleel.blogspot.com.br
Nenhum comentário:
Postar um comentário