Como muitas vezes precisamos acessar os dados de operação do SAP, encapsulamos uma classe para facilitar a chamada. As condições operacionais exigem a instalação do cliente SAP, haverá uma interface COM. porque o estágio posterior do com Devido ao problema de vinculação, usei o vb.net para desenvolvê-lo e compartilhá-lo com todos.
Recursos: Mapeie diretamente as tabelas internas de entrada e saída do SAP para o DataTable do dotNet para facilitar a operação e forneça uma função de conversão de uma lista de campos para um DataTable.
'------------------------------------------------ - --------------
' Direitos autorais (C) 2009
'todos os direitos reservados.
'
'Nome do arquivo: SAP.vb
'Descrição da função: Encapsula o acesso básico ao SAP. Esta classe fornece apenas informações básicas de acesso específico às classes SAP RFC herdadas desta classe.
'
'Criar logotipo: www.cnblogs.com/81 , 1º de dezembro de 2009
'
'Logotipo modificado: www.cnblogs.com/81 , 9 de dezembro de 2009
'Modificar descrição: Adicionar operações fechadas para tabelas internas de entrada, parâmetros de saída, etc.
'------------------------------------------------ - ----------------------
Classe Pública SAP
Private m_sapObject As Object 'objeto de chamada de função remota SAP
Função sap protegida m_sapFun As Object
Private m_sapConnection As Object 'Conexão com SAP
''' <resumo>
''' construtor, passe as informações básicas do sap
''' </sumário>
''' <param name="sapSystem">Sistema SAP, você pode passar null</param>
''' <param name="ApplicationServer">IP do servidor SAP</param>
''' <param name="Client">Número do grupo, como 800</param>
''' <param name="SystemNumber">Número do sistema, como 00</param>
''' <observações></observações>
Sub público novo (ByVal sapSystem como string, ByVal ApplicationServer como string, ByVal Client como string, ByVal SystemNumber como string)
Me.m_sapObject = CreateObject("SAP.Functions")
Me.m_sapConnection = Me.m_sapObject.Connection()
Se String.IsNullOrEmpty(sapSystem) = False então
Me.m_sapConnection.System = sapSystem
Terminar se
Me.m_sapConnection.ApplicationServer = ApplicationServer
Me.m_sapConnection.Client = Cliente
Me.m_sapConnection.SystemNumber = SystemNumber
Finalizar sub
''' <resumo>
''' Faça login no SAP, retorne True se for bem-sucedido, retorne False se falhar
''' </sumário>
''' <param name="Usuário">Usuário</param>
''' <param name="Senha">Senha</param>
''' <param name="Language">Idioma, como ZH, EN, etc., você pode passar null</param>
''' <returns>Se o login foi bem-sucedido</returns>
''' <observações></observações>
Função pública ConnectToSAP (ByVal User As String, ByVal Password As String, ByVal Language As String) As Boolean
Me.m_sapConnection.user = Usuário
Me.m_sapConnection.Password = Senha
Se String.IsNullOrEmpty(Language) = False então
Me.m_sapConnection.Language = Idioma
Outro
Me.m_sapConnection.Language = "PT"
Terminar se
Me.m_sapObject.AutoLogon = True 'Login automático
Return Me.m_sapObject.Connection.logon(0, True) 'Se o login foi bem-sucedido
Função final
''' <resumo>
''' Defina o nome da função SAP a ser chamada
''' </sumário>
''' <param name="sapFuncName">nome da função SAP</param>
''' <observações></observações>
Public Sub Defina o nome da função remota SAP (ByVal sapFuncName As String)
Me.m_sapFun = Me.m_sapObject.Add(sapFuncName)
Se m_sapFun não for nada, então
Throw New Exception("O nome da função remota SAP é inválido: " + sapFuncName)
Terminar se
Finalizar sub
''' <resumo>
''' Defina os parâmetros de chamada recebida da função Sap
''' </sumário>
''' <param name="paramName">Nome do parâmetro</param>
''' <param name="paramValue">Valor do parâmetro</param>
''' <observações></observações>
Parâmetros de subconjunto público (ByVal paramName As String, ByVal paramValue As Object)
Dim parâmetro como objeto
param = Me.m_sapFun.Exports(paramName)
Se param não for nada, então
Throw New Exception("O nome do parâmetro da função remota Sap é inválido: " + paramName)
Terminar se
param.Value = paramValue
Finalizar sub
''' <resumo>
''' Defina a tabela interna de entrada do SAP e use dt_value para simular esta tabela interna
''' </sumário>
''' <param name="SapTableName">O nome da tabela interna passada pela função SAP</param>
''' <param name="dt_value">A DataTable simulada deve ser consistente com o nome do campo passado para a tabela interna</param>
''' <observações></observações>
Public Sub define a tabela interna de entrada (ByVal SapTableName As String, ByVal dt_value As DataTable)
Dim sapdata As Object 'sap passa na tabela interna
Dim saprow As Object 'sap passa em uma linha da tabela interna
Dim dc como DataColumn
Dim índice como inteiro
sapdata = Me.m_sapFun.Tables(SapTableName)
For index = 0 To dt_value.Rows.Count - 1 'Dá um loop na tabela e atribui valores à tabela interna passada para o SAP
saprow = sapdata.Rows.Add() 'Adiciona uma nova linha de registros na tabela interna e atribui valores aos registros na tabela interna abaixo.
Para cada dc em dt_value.Columns
saprow(dc.ColumnName) = dt_value.Rows(index)(dc.ColumnName).ToString()
Próximo
Próximo
Finalizar sub
''' <resumo>
''' Após a conclusão da configuração do parâmetro, execute a chamada de função
''' </sumário>
''' <observações></observações>
Chamada de função pública Sub Execute ()
Se Me.m_sapFun.Call() = Falso então
Throw New Exception("Falha na chamada de função remota do SAP.") 'Erro ao buscar dados do SAP, função de saída
Terminar se
Finalizar sub
''' <resumo>
''' Crie um DataTable de campos especificados com base na lista de campos (separados por vírgula)
''' </sumário>
''' <param name="fields">Lista de campos (separados por vírgula)</param>
''' <returns>Mesa vazia</returns>
''' <observações></observações>
Função Pública Criar uma tabela vazia (campos ByVal como String) como DataTable
Dim dt como novo DataTable
Dim strs como String()
Dim é como string
strs = campos.Split(",")
Para cada s em strs
dt.Columns.Add(s.Trim())
Próximo
Retorno dt
Função final
''' <resumo>
''' Obtenha o valor do parâmetro de saída do SAP
''' </sumário>
''' <param name="paramName">Nome do parâmetro de saída</param>
''' <returns>Valor do parâmetro de saída</returns>
''' <observações></observações>
Função pública obtém parâmetros de saída Sap (ByVal paramName As String) As String
Dim parâmetro como objeto
param = Me.m_sapFun.Imports(paramName)
Se param não for nada, então
Throw New Exception("O nome do parâmetro da função remota Sap é inválido: " + paramName)
Terminar se
Se param.Value não for nada, então
Retornar ""
Outro
Retornar param.Value.ToString()
Terminar se
Função final
''' <resumo>
''' Converta a tabela interna de saída da estrutura de chamada de função SAP em uma tabela dotNet
''' </sumário>
''' <param name="fields">Lista de campos de saída SAP da tabela interna, separados por vírgulas</param>
''' <param name="SapTableName">O nome da tabela interna de saída SAP</param>
''' <returns>A tabela dotnet exportada da tabela interna SAP, todos os campos são do tipo string</returns>
''' <observações></observações>
Função pública Obtenha dados da tabela de saída Sap (campos ByVal como String, ByVal SapTableName como String, ByVal se deseja remover espaços iniciais e finais como Booleano) As DataTable
'Cria uma tabela por lista de campos, a lista de campos nos campos é separada por vírgulas
Dim dt como DataTable
dt = Eu. Crie uma tabela vazia (campos)
'Leia os dados da tabela SAP, faça um loop dos dados obtidos no SAP e grave-os em dt
Dim sapdata como objeto
Saprow escuro como objeto
Dim dr As DataRow 'Nova linha de dados adicionada
Dim dc como DataColumn
sapdata = Me.m_sapFun.Tables(SapTableName)
Para cada saprow em sapdata.Rows
dr = dt.NewRow()
Para cada dc em dt.Columns
Se for necessário remover espaços iniciais e finais = Verdadeiro Então
dr(dc.ColumnName) = saprow(dc.ColumnName).ToString().Trim()
Outro
dr(dc.ColumnName) = saprow(dc.ColumnName).ToString()
Terminar se
Próximo
dt.Rows.Add(dr)
Próximo
Retorno dt
Função final
''' <resumo>
''' Fechar a conexão SAP
''' </sumário>
''' <observações></observações>
SubDisConnectSAP público()
Me.m_sapConnection.logoff()
Finalizar sub
Fim da aula