# SAP

{% hint style="info" %}
Para acessar a coleção SAP e usar as funcionalidades presentes nesse artigo, você precisa ter a permissão PIPELINE:CREATE. Aprenda mais na[ documentação sobre Papéis](/documentation/developer-guide/pt-br/platform-administration/administration/new-access-control/access-control-roles.md).
{% endhint %}

As cápsulas da coleção SAP são usadas para abstrair chamadas para SAP, encapsulando a capacidade de chamar funções remotas (RFC) para o sistema SAP.

Para utilizar as cápsulas RFC, você deve configurá-las com os parâmetros exigidos pelo SAP (como SID, LANGUAGE e CLIENT ID) e definir os parâmetros esperados pelo SAP.

Após a execução da cápsula, é possível controlar o fluxo de mensagens, analisar os casos de sucesso e falha e tratar a mensagem de resposta no formato JSON para facilitar o trabalho de dados no fluxo do *pipeline*.

## Pré-requisitos para usar a coleção SAP

SAP é um dos principais fornecedores mundiais de software de gestão de processos de negócios e desenvolve soluções que facilitam o fluxo de informações entre empresas. Saiba mais no [site do SAP](https://www.sap.com/brazil/about/what-is-sap.html).

### Pré-requisitos <a href="#h_b619770c7a" id="h_b619770c7a"></a>

1. **Estabelecer VPN**

As cápsulas SAP são sempre utilizadas para enviar o fluxo de informações ao SAP. Portanto, uma *VPN Site-to-Site* deve ser definida na instalação do SAP.

2. **Liberações de Porta 33XX e&#x20;*****Hostname*****&#x20;SAP**

A conexão padrão SAP é estabelecida. Neste caso, as portas 33XX (XX é o número da instância SAP) devem ser liberadas dentro da VPN. Sem esta ação, o acesso às informações SAP não é possível. Além disso, a conexão requer o *hostname* SAP, que você pode acessar facilmente por meio da transação SMGW.

Por exemplo, se o *Instance Number* for 20, então a porta a ser liberada no túnel da VPN é 3320.

3. **Informações SAP Gui**

Tal como acontece com o SAP GUI, as cápsulas também requerem informações de conexão para permitir o fluxo de dados. Veja abaixo as informações necessárias:

* *Instance Number* e *System ID*

![](/files/9U7FfhmTfvntJDFvsWyf)

* *Logon Language* e *Client ID* (mandante)

![](/files/PTZAIfzn50nVI61DBfaG)

4. **Credenciais**

Tanto o usuário quanto a senha de acesso ao SAP deverão estar cadastrados na Digibee Integration Platform. Uma conta do tipo “*Basic*” deve ser usada.

## Cápsulas SAP

### SAP RFC - Connectivity test

Com a cápsula **SAP RFC - Connectivity Test** um teste de conectividade pode ser realizado sem a necessidade de conhecer as funções e os parâmetros do SAP. A cápsula abstrai a chamada de uma RFC padrão (RFC\_READ\_TABLE) com os parâmetros mínimos já definidos.

Se ocorrer um erro na resposta após a execução da cápsula, deve-se verificar se os pré-requisitos foram atendidos. Contudo, se a resposta for `“sucess”: true`, você poderá continuar com a integração e chamar outras funções do SAP.

### SAP RFC - Connector (JSON Input)

A cápsula SAP RFC - Connector (JSON Input) é uma cápsula genérica usada para todas as operações com as funções remotas do SAP. É possível ler dados de tabelas e cadastros de forma mais completa, adicionar novos cadastros (como Fornecedores, Clientes e Endereços) e também atualizar cadastros.

Por se tratar de uma cápsula genérica, todas as funções nativas do SAP estão disponíveis e as funções ABAP customizadas no ambiente SAP também podem ser executadas. Por exemplo, RFC para inclusão de Nota Fiscal com cálculo de impostos.

Entenda melhor como trabalhar com esse dinamismo e qual a relação com os parâmetros RFC:

1. ***Import Parameters Attributes***

Os parâmetros de entrada (opcionais) que devem ser especificados ao chamar a função. O campo não oferece suporte a parâmetros estruturais.

```
{  
    "BUSINESSPARTNER": "",  
    "VALID_DATE": ""
}
```

2. ***Object Params***

Os parâmetros de entrada (opcionais) que devem ser preenchidos na função. Parâmetros estruturais são suportados.

```
{
  "OBJ1": {
    "ATTR1": "V1"
  },
  "OBJ2": {
    "ATTR2": "V2",
    "ATTR3": "V3"
  }
}
```

3. ***Table and Fields***

Modelo para envio de parâmetros em formato de tabela. Para enviar mais de um item para a mesma tabela, adicione um novo objeto JSON dentro do *array*, conforme mostrado no exemplo a seguir:

```
[
  {
    "TABLE1": [{
      "ATTR1": "VALUE1",
      "ATTR2": "VALUE2"
    },
   {
      "ATTR1": "VALUE1",
      "ATTR2": "VALUE2"
    }],
    "TABLE2": [{
      "ATTR1": "VALUE1",
      "ATTR2": "VALUE2"
    }]
  }
]
```

{% hint style="info" %}
De acordo com as boas práticas do SAP, recomenda-se não enviar parâmetros de tabela como *Import Parameters*.
{% endhint %}

4. **Conhecendo os parâmetros de uma função RFC**

Verifique como você pode identificar os parâmetros esperados por um RFC para preencher a cápsula **SAP RFC - Connector (JSON Input)**.

Exemplo:

* RFC padrão do SAP, nativo no ambiente SAP
* Função: **BAPI\_BUPA\_ADDRESS\_CHANGE**

Primeiro, acesse a transação SE37 (Function Builder) em seu SAP:

![](/files/CtNAR72121SoS7uzmPY8)

Digite o nome da função (**BAPI\_BUPA\_ADDRESS\_CHANGE**) e pressione **F8** no teclado.

Todos os parâmetros esperados pela RFC e seus respectivos tipos são exibidos no seu **SAP GUI&#x20;*****Business Client***.

![](/files/Rc5o9p2E1IkbGiR8qycn)

Como mostrado no exemplo acima, os campos do tipo ***Import Parameters Attributes*** são: **BUSINESSPARTNER** e **ADDRESSGUID** (não são parâmetros estruturais).

Para os demais campos, clique no ícone exibido na coluna **Valor**. Em seguida, acesse o editor de estrutura usando o atalho **Shift + F7**.

![](/files/mZW7dPaOYncIs9m5TD4H)

Na figura acima, **ADDRESSATA\_X** representa o nome do objeto. Os outros campos são os atributos do objeto.

Agora dê uma olhada em um parâmetro estrutural do tipo tabela que você pode usar para enviar uma lista e seus respectivos atributos um após o outro.

![](/files/C0UbqCnfcHcpoq80eYLv)

Usando os exemplos de parâmetros mostrados acima, dê uma olhada em um exemplo JSON que simula o formato esperado pela cápsula SAP.

***Import Parameters Attributes*****:**

```
{  
    "BUSINESSPARTNER": "0000000003"
}
```

#### ***Object Params*****:**

```
{
  "ADDRESSDATA": {
    "STANDARDADDRESS": "X",
    "C_O_NAME": "",
    "CITY": "Barueri",
    "POSTL_COD1": "19970000",
    "STREET": "Rua adriano augusto teste",
    "HOUSE_NO": "1",
    "COUNTRY": "BR",
    "REGION": "SP",
    "LANGU": "PT",
    "VALIDFROMDATE": {{FORMATDATE(NOW(), "timestamp", "yyyy-MM-dd", null , "GMT-3") }},
    "VALIDTODATE": "2999-12-31"
  },
  "ADDRESSDATA_X": {
    "STANDARDADDRESS": "X",
    "C_O_NAME": "X",
    "POSTL_COD1": "X",
    "STREET": "X",
    "HOUSE_NO": "X",
    "COUNTRY": "X",
    "REGION": "X",
    "LANGU": "X"
  }
}
```

#### ***Table and Fields*****:**

```
{
 "BAPIADTEL": [
   {
     "COUNTRY": "",
     "TELEPHONE": "",
     "TEL_NO": ""
   },
   {
     "COUNTRY": "",
     "TELEPHONE": "",
     "TEL_NO": ""
   }
 ],
 "BAPIADFAX": [
   {
     "COUNTRY": "",
     "FAX": ""
   }
 ]
}

```

### **SAP RFC - Read Nota Fiscal**

{% hint style="info" %}
A cápsula **SAP RFC - Read Nota Fiscal** foi desenvolvida especificamente para as necessidades do mercado brasileiro.
{% endhint %}

A cápsula **SAP RFC - Read Nota Fiscal** foi desenvolvida para realizar consultas de dados de notas fiscais no SAP utilizando o campo DOCNUM.

A RFC usada para a consulta é **BAPI\_J\_1B\_NF\_GETDETAIL**. Para consultar os detalhes de uma nota fiscal, insira o valor do campo DOCNUM em ***Import Parameters***.

Use expressões [*Double Braces*](/documentation/connectors-and-triggers/pt-br/double-braces/overview.md) para fornecer o valor dinamicamente. Veja um exemplo:

![](https://digibee-d5ff4ba226ed.intercom-attachments-7.com/i/o/362504813/e7976045a5e0255b81d202d8/57ob004gp3aCzuPcAivcfyoyh3Sd9GYJjFgpSsfkLz8t5Sx2K3BZe0XgTCo1oVk6-fbrJ5IUqkmJjCMW6ua_gm9c-nW_ItZ9HO9wxlvHQ4ESsmXu0aX2GcH4pSe2CDg8UsC3Kcsy)

```
{
  "BAPIADTEL": [
    {
      "COUNTRY": "",
      "TELEPHONE": "",
      "TEL_NO": ""
    },
    {
      "COUNTRY": "",
      "TELEPHONE": "",
      "TEL_NO": ""
    }
  ],
  "BAPIADFAX": [
    {
      "COUNTRY": "",
      "FAX": ""
    }
  ]
}
```

### **SAP RFC - Read Table**

A cápsula **SAP RFC - Read Table** foi desenvolvida para executar consultas diretamente nas tabelas do SAP. Estes parâmetros se destacam entre os parâmetros padrão disponíveis em “Pré-requisitos”:

1. ***TABLE*****:** nome da tabela para a consulta de dados.
2. ***Skip & Limit*****:** parâmetros para controlar a paginação da consulta e limitar o número de registros retornados. Dessa forma, as consultas são executadas em blocos e o processo se torna mais eficiente.
3. ***FIELDS*****:** campos a serem retornados na consulta. É obrigatório especificar pelo menos um campo para iniciar a consulta.

Para determinar quais campos existem na tabela SAP, use a transação **SE11 ()**. Exemplo para a tabela KNA1:

![](/files/Jins34PauwoETE3FJDl5)

4. ***Option Filters*****:** parâmetro opcional que permite a especificação de dados adicionais para a consulta na tabela do SAP. O parâmetro geralmente é utilizado para definir o corte dos dados, o que significa reduzir a quantidade de informações e evitar a leitura de toda a tabela.

Veja alguns exemplos das opções de filtros:

```
MATNR IN (10000,1000001,1000002,100003,100004)
ERDAT = '19990101'
BUKRS EQ '{{ message.company_code_sap }}'
```

{% hint style="warning" %}
Para determinar o filtro sugerido para sua consulta, verifique os campos da Tabela SAP. A transação **SE37** permite realizar testes de consulta via RFC (READ\_TABLE) e definir os parâmetros adequados para a consulta.
{% endhint %}


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://docs.digibee.com/documentation/developer-guide/pt-br/development-cycle/build-overview/capsulas/public-capsules/sap.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
