Instalando e desenvolvendo para .Net SAP Connector

Depois de muito esperar, a multinacional alemã SAP finalmente disponibilizou para download o novo conector do .net, mais conhecido como Nco (.Net SAP Connector).
Eles desenvolveram primeiramente para a plataforma Java, Jco(Java Connector), e agora que o .NET vem sendo uma tecnologia muito utilizada, finalmente nos auxiliaram com esta ferramenta, portanto, não será mais necessario criar uma DLL no Visual Studio 2003, podemos finalmente tirar as garras do 2003 nos nossos projetos.
Para isso é necessario uma alteração no código-fonte, antigamente, apenas referenciavamos a DLL e adicionavamos praticamente igual é realizado com um WebService, e adicionava as Transações SAP que desejava referenciar no Projeto.

Hoje este processo esta muito mais fácil pois agora totalmente orientado a objeto e facilitando para instanciarmos o mesmo, no processo antigo muitas vezes travava sem nenhuma explicação.

Instalando o .NET SAP Conector

Para utilizar o .NET SAP Connector, é recomendado realizar o download diretamente do SAP Marketplace, através deste link

Faça download e instale em uma pasta que seja conveniente, caso não tenha usuario e senha para o SAP Marketplace, não fiquem preocupados, eu consegui baixar diretamente um pacote via NuGet que o Cori Schlegel disponibilizou, a ultima atualização dele, desde a data de publicação deste post, foi no dia 31/3/2011, a instalação é muito tranquila.

Criando uma aplicação

A minha proposta aqui é disponibilizar um tutorial, com passo-a-passo para utilizar o Nco. A aplicação que irei criar é bem simples, ela terá uma função que vai consumir a função RFC_READ_TABLE, padrão em todas as versões do SAP, tem como principal funcionalidade trazer todas as informações da tabela enviada como parametro, bom, o foco não é explicar as funções, fiz apenas uma introdução para conhecerem esta função.
Irei utilizar o Visual Studio 2010 e o nome do projeto é Retorna_Clientes.

Criar novo Projeto

Um detalhe importantissimo, para você nao ter problemas, é escolher .Net Framework 4.0 e não .Net Framework 4.0 Client Mode, pois, este nao permite compilar as dll’s com o projeto. Adicione as Referencias, caso, esteja utilizando o NuGet ele adiciona automaticamente, caso contrario, siga o seguinte passo:

Botão direito no projeto e Add Reference.
Quando abrir a janela, clique em Browse e navegue até a pasta que você realizou a instalação do SAP Nco.
Adicione as seguintes dlls em seu projeto: Sapnco.dll e Sapnco_utils.dll

Estrutura do Projeto

Faça uma referencia na sua classe, justamente, para ão ter que digitar milhares de vezes as informações, adicione SAP.Middleware.Connector.

Para realizar uma conexão, é necessario implementar a classe “IDestinationConfiguration”, e definir todas as propriedades de conexão da mesma.

Para isso vou criar uma classe unica para não precisar a todo instante ter que realizar esta configuração, lembrando que é necessaria para cada chamada em cada transação que realizar. Logo que implementamos na nossa classe ela ficará exatamente como o código abaixo:

Para definir uma RFCDestination, precisamos alterar a função GetParameters, para ao receber qual “ambiente” estamos conectando ele automaticamente define todas as configurações necessarias, e para configurar corretamente o ambiente utilizaremos o objeto RfcConfigParameters, e recomendo utilizar a seguinte configuração, porém, verifique junto ao administrador do SAP da sua empresa, se falta mais alguma configuração ou nao, pois o Array RFCConfigParameters tem varios objetos:

Caso a empresa tiver vários ambientes, recomendo trabalhar com o parametro destinationName, para assim, facilitar o desenvolvimento. Neste caso, não irei utiliza-lo.
Observação importantissima, este método obriga você a passar alguma string no destinationName, não pode deixa-la branca, senão, ele acusa dizendo que você nao quer conectar em nenhum banco.

Alguns erros que podem acontecer nesta etapa:
Additional information:
LOCATION CPIC (TCP/IP) on local host with Unicode
ERROR no symbolic destination specified
TIME Thu Jun 14 16:07:05 2012
RELEASE 720
COMPONENT CPIC (TCP/IP) with Unicode
VERSION 3
RC 775
MODULE r3cpic.c
LINE 4296
COUNTER 1

Caso retorne este erro, verifique se você deixou em branco a conexão. Este erro se dá por você deixar em branco ao passar o parametro RfcDestinationManager.GetDestination(“”);

Additional information: Connection parameter GATEWAY_HOST missing

Verifique se o GetDestination está preenchido, pois, o que aconteceu comigo, foi o parametro que não foi enviado, e dentro do método ele fazia a validação nao permitindo ao desenvolvedor deixar em branco.

Pronto, configuração realizada, e alguns futuros problemas resolvidos, vamos criar o método Read_Table para consumir esta função. Terá como parametro, qual a tabela que desejamos retornar, quais as colunas e os filtros.
Antes de conectar preciso explicar os retornos de exceções da Nco.

Tratamento de Exceção

RFCCommunicationException – Retorna todo e qualquer tipo de erro de comunicação com o SAP.
RFCLogonException – Caso não consiga realizar o logon no SAP.
RFCAbapRuntimeException – Caso ocorra algum erro de runtime no SAP.
RFCAbapBaseException – Caso ocorra qualquer tipo de erro ABAP.

Executar Transações no SAP

Depois de configurado e realizado a conexão com o SAP, iremos agora executar a transação. Irei explicar no próprio método como realizar a chamada:Detalhes da função SAP


Por hoje finalizamos, estou anexando, o código-fonte, deste tutorial, caso necessitem, sintam-se a vontade de alterar.
Importante frizar, que melhorou muito a forma com que conectamos no SAP, pois, era um trabalho muito grande, tanto na implementação quanto em manutenção, sem contar que foi apenas uma maneira que encontramos de realizar a conexão no SAP. Poderiamos muito bem instanciar uma classe Java para isso, porém, a partir deste novo Framework que o pessoal do SAP disponibilizou, facilitou muito o trabalho.

Segue o Projeto: Projeto Retorna Clientes

Happy Coding,
Nícolas Tarzia

  • Cassio

    Parabéns pelo artigo.
    Texto bastante claro e didático.

  • rafael

    o meu está aparecendo mensagem de erro, sabe me informar o que seria?

    Warning 1 The referenced assembly “sapnco” could not be resolved because it has a dependency on “System.Web, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a” which is not in the currently targeted framework “.NETFramework,Version=v4.0,Profile=Client”. Please remove references to assemblies not in the targeted framework or consider retargeting your project. ConsoleApplication3

    • Renato

      Esse erro eu resolvi trocando o Framework para 4.0. No meu caso estava o 4.0 Client…

  • rafael

    já vi o erro, o meu estava como client…. executei o arquivo do tutorial mas não aparece nada, apenas uma tela do cmd e depois some sem dar resultado nem um…..

  • cesar

    Era bom deixar claro que deve-se sobrescrever o método ChangeEventsSupported() com o conteúdo: return true;

    Pois caso não o faça irá gerar um erro (obviamente) porém, até eu baixar o código do projeto não sabia que o código deveria ser “return true”…

    Isso facilita quem está totalmente perdido no assunto.

  • cesar

    Gostaria de saber se existe um conector pro framework .net 3.5 … este código e estes conectores não funcionam no framework .net 3.5, apenas no 4.0 …. Existe outro conector específico?

    • http://www.nicolastarzia.com/blog Nícolas Tarzia

      Cesar, tudo tranquilo?
      Acredito que você baixou a versão do connector para .net 4.0.
      Verifique na SCN pois existem duas versões do .net Connector, uma para framework 2.0 e 3.0/3.5 e outra para versão 4.0.

      Att.
      Nicolas Tarzia

  • http://www.etrucksystem.com Leonel

    Parabens pelo post.

    Estou começar integração com .net e achei muito interessante a matéria.
    e se possivel darei um salto ao site para mais consultas.

    Força ai, foi de enorma ajuda.

  • kfouri

    Tem como disponibilizar o programa (solution) de exemplo? Não estou conseguindo reproduzir seu programa aqui.

    Thanks!

  • Kfouri

    Nícolas, obrigado pelo retorno. Consegui finalmente fazer a comunicação com o SAP.

    Thanks!:)

    No entanto, acontenceu um fato e talvez você saiba o que possa estar ocorrendo.

    Aqui na Empresa tem implementado duas versões do SAP. Uma para testes e desenvolvimento e uma outra de produção.

    O Sap Connector funcionou muito bem com o ambiente de desenvolvimento, mas com o ambiente de produção não.

    As credenciais de acesso estão corretas, e o programa flui até a linha
    IRfcFunction fReadTable = repo.CreateFunction(“RFC_READ_TABLE”);

    Neste momento (somente no ambiente de produção)… da um erro do tipo
    “Lookup of function RFC_READ_TABLE metadata failed for destination”.

    Tentei colocar outras funções e nada deu certo.

    TEm idéia do que possa estar acontecendo?

    Thanks any way!
    Boas Festas

    • http://www.nicolastarzia.com/blog Nícolas Tarzia

      Olá Kfouri,
      Pela mensagem de retorno que apresentou para você, me parece algum problema de configuração na classe RfcConfigParameters, o seu servidor de desenvolvimento possui as mesmas configurações de produção?
      Muitas pessoas encontraram erros de configuração com a Linguagem. Tente alterar a linguagem para EN. Verifique também o Client(Mandante) utilizado.

      Apenas lembrando, que este problema acontece devido a uma mudança no framework 2.0 para o framework 3.0 do Nco.

      No framework 2.0 todas as informações metadatas que retornavam era em “design time”, sempre que você incluia uma função em seu código, ele baixava todas as informacoes necessarias naquele momento e deixava um cache da mesma.
      No framework 3.0 é possivel realizar isto, porém, teria que criar uma aplicação server com todas as informações e uma aplicação client, o que muitas vezes é desnecessario, portanto, neste exemplo que eu coloquei, estas informações de metadatas são em tempo de execução.

      Caso mesmo assim não funcione, mande mais mensagens.
      Se puder mandar a Exceção lancada.

      Sucesso e boas festas.
      Fantastic Coding!

      • Felipe Jorge

        Opa Nícolas, montei uma aplicação e estou com um problema semelhante.

        A aplicação funciona, porém em determinados momentos ele apresenta a seguinte mensagem: “Lookup of function ‘FUNÇÃO’ metadata failed for destination ‘ID DO AMBIENTE PI'”.

        O que está estranho é que é intermitente, a unica coisa que tem semelhança entre os erros é que eles acontecem em sua maioria no inicio das utilizações, quando já está operando ele dificilmente da o mesmo erro.

        Você já se deparou com algo do tipo?

        Abraços

        • http://www.nicolastarzia.com nicolastarzia

          Felipe, desculpe a demora cara.
          Não sei se você ja resolveu, mas então, comigo não aconteceu não, mas você poderia enviar o log do erro completo?
          Porque pelo que eu vi, este erro é muito generico, e ao detalhar o objeto de exceção, ajuda a descobrir o problema.

          Valeu!

  • Hugo Souza

    Olá Nicolas, tudo certo? Muito bom o post. Fiz uma aplicação seguindo os passos e funcionou. Mas uma dúvida, algumas vezes a aplicação ao tentar fazer a conexão, apontou que já existia uma aberta. Existe algum método para ‘fechar’ a conexão com o SAP após fazer a consulta?

    Obrigado.

    • nicolastarzia

      Hugo, precisa verificar os objetos que você tem aberto.

  • Tarcísio

    Cara, parabéns.

    Precisei trabalhar muito com .Net Conector na versão antiga…dava muito pau!!!

    Espero que nova versão venha nos ajudar.

  • Felipe Jacob

    Nícolas,

    Parabéns pelo post, já atuei com esse tipo de app e realmente é útil.

    Estou com um problema em apenas uma aplicação que desenvolvi, você pode me ajudar?

    Descrição do problema:

    Desenvolvi uma aplicação com Framework 4.0 (não o Client), em modo debug ou instalada na minha maquina tudo funciona perfeitamente, o problema é quando tento instalo ela em outro PC, no momento da utilização da dll sapnco_utils ocorre o erro:

    Não foi possível carregar arquivo ou assembly ‘sapnco_utils, Version=3.0.0.42, Culture=neutral, PublicKeyToken=50436dca5c7f7d23′ ou uma de suas dependências. Foi feita uma tentativa de se carregar um programa com um formato incorreto.

    Estou verificando as versões dos frames do outro PC, caso tenha alguma ideia e possa me ajudar, ficarei muito grato.

    Abraços

    • http://www.nicolastarzia.com nicolastarzia

      Felipe, pesquisei sobre este erro, o que acontece é que esta mensagem de erro é muito genérica.
      Na maioria das vezes o seu servidor não tem o pacote de redistribuição do C++, de acordo com a versão do framework.

      Abraços,
      Espero ter ajudado

  • Alexandre santos

    Boa noite nobre,
    Através deste conectar implementado em uma classe librara, eu consigo recuperar as informações do sap em uma aplicação silverlight?
    Outra, para o conector disponibilizado na marktplace existe um banco de exemplo?!
    Abrços ótimo artigo!!

    • http://www.nicolastarzia.com nicolastarzia

      Alexandre, desculpe a demora,
      Você consegue normalmente.

      Infelizmente, não tem nenhum banco de exemplo, você consegue encontrar artigos de exemplo.

      Qualquer duvida entre em contato

  • Vanessa

    Nícolas, sabe se essa versão roda no vs2012?

    • nicolastarzia

      Vanessa, sim sem problemas.

  • Gleybson Souza Manso

    Cara, parabéns.
    Gostaria de saber como posso utilizar o exemplo acima com o parâmetro SapRouter para conexões externas ?

    Atenciosamente.

    • http://www.nicolastarzia.com nicolastarzia

      Gleybson, desculpe a demora.
      Veja um exemplo:
      parms.Add(RfcConfigParameters.MessageServerHost, "192.168.0.1");
      parms.Add(RfcConfigParameters.SystemID, "MGF");
      parms.Add(RfcConfigParameters.GatewayHost, "192.168.0.1");
      parms.Add(RfcConfigParameters.SAPRouter, "/H/145.145.150.240/H/");
      parms.Add(RfcConfigParameters.User, "mysapuser");
      parms.Add(RfcConfigParameters.Password, "********");
      parms.Add(RfcConfigParameters.Client, "200");
      parms.Add(RfcConfigParameters.Language, "en");
      parms.Add(RfcConfigParameters.PoolSize, "5");
      parms.Add(RfcConfigParameters.MaxPoolSize, "10");
      parms.Add(RfcConfigParameters.IdleTimeout, "6000");

  • mauricio

    Muito Bom. Consegui acessar meu ambiente de QA e retornar informações mesmo sabendo pouco de C#

  • Ana Osako

    Olá,

    o usuário tem que ser especifico para a conexao? pois estou tentando acessar com meu usuário de acesso no SAP e não estou conseguindo. dá erro de usuario e senha.

    obrigada

  • Marco Rossi

    Boa tarde Nicolas.

    Implementei o código, mas estou com o erro: TABLE_NOT_AVAILABLE
    Estou chamando o método da seguinte forma:

    SAPConnect sap = new SAPConnect();
    sap.Read_Table(“”, “”, “”);

    Tenho que passar parâmetros? Se sim, quais são, onde posso encontrar o nome da tabela ou coluna?

    Obrigado, fico no aguardo.

  • Felipe Jacob Jogre

    Era isso mesmo, muito obrigado.

  • Leandro Cafe

    Nícolas,

    Parabés pelo post.

    Tenho um problema com um web service implementado no visual studio 2008. Até ai funcionada perfeitamente.

    O sistema operacional do servidor foi trocado pelo windows 2008 R2 e partir dai minha aplicação deixou de funcionar.

    Suspeito ser devido ao ao SAP.Connector 2.0.0.23, não consigo fazer a conexão.

    A aplicação retorna o erro:
    Foi feita uma tentativa de se carregar um programa com um formato incorreto.

    Você já passou ou conhece esse problema ?

    Obrigado.

    Leandro Cafe

    • http://www.nicolastarzia.com nicolastarzia

      Leandro, você verificou se tem instalado o connector no servidor?
      Senão está é uma causa. Você não tem a mensagem detalhada do erro?

      Abraços

  • Paulo

    Pessoal,
    Cuidado ao usar esta função ( rfc_read_table ) para conectar e ler diretamente as tabelas do SAP. Apesar de estar ai para ser usada, convém conversar com o cliente antes, pois em caso de auditoria por parte da SAP a mesma pode descartar a garantia do Produto.Obviamente que nunca vi isso acontecer , mas por via das dúvidas é melhor conversar com o ABAP e pedir a ele para criar um módulo de função tipo RFC para ser consumido pela sua aplicação. Como dev ABAP, já fiz esta parceria com muitos devs .NET, e é tudo muito tranquilo.

    Abração.

    • http://www.nicolastarzia.com nicolastarzia

      Paulo,
      Bacana este ponto de vista, eu fiz a simulação utilizando isto até porque na época o ABAP havia me instruído para utilizar esta função, porque tinha muitos jobs que fazia a leitura direto da tabela.
      Mas valeu pela dica……

      Abraçao