# SAP (IDoc and RFC)

O conector **SAP** permite a integração com sistemas SAP utilizando o protocolo **RFC** e o padrão **IDoc** para troca de dados.

## **Parâmetros**

Dê uma olhada nos parâmetros de configuração do conector. Parâmetros suportados por [expressões Double Braces](https://docs.digibee.com/documentation/connectors-and-triggers/pt-br/double-braces) estão marcados com `(DB)`.

### **Aba Authorization**

<table data-full-width="true"><thead><tr><th>Parâmetro</th><th>Descrição</th><th>Valor padrão</th><th>Tipo de dado</th></tr></thead><tbody><tr><td><strong>Use Dynamic Account</strong></td><td>Quando ativado, o conector utilizará a conta de forma dinâmica. Caso contrário, usará a conta de forma estática. Saiba mais sobre <a href="https://app.gitbook.com/s/cO0A6g1dOsu8BiHYqO67/development-cycle/overview/runtime/pipeline-engine/dynamic-accounts">Contas Dinâmicas</a>.</td><td>False</td><td>Booleano</td></tr><tr><td><strong>Scoped</strong></td><td>Quando ativado, a conta armazenada é isolada de outros subprocessos. Nesse caso, os subprocessos visualizam sua própria versão dos dados da conta armazenada. Disponível apenas se o parâmetro <strong>Use Dynamic Account</strong> estiver habilitado.</td><td>False</td><td>Booleano</td></tr><tr><td><strong>Account Name</strong> <code>(DB)</code></td><td>Nome da conta dinâmica utilizada pelo conector. Essa conta deve ter sido previamente configurada em um conector <a href="../tools/store-account"><strong>Store Account</strong></a> no pipeline para que este processo tenha efeito. Disponível apenas se o parâmetro <strong>Use Dynamic Account</strong> estiver habilitado.</td><td>N/A</td><td>String</td></tr><tr><td><strong>Account</strong></td><td>Conta utilizada pelo conector. Tipo suportado: <a href="https://app.gitbook.com/s/cO0A6g1dOsu8BiHYqO67/platform-administration/settings/accounts"><strong>Basic</strong> </a>(usuário e senha). Disponível apenas se o parâmetro <strong>Use Dynamic Account</strong> estiver desabilitado.</td><td>N/A</td><td>Conta</td></tr><tr><td><strong>Host</strong> <code>(DB)</code></td><td>Hostname do sistema SAP. Para suportar "IP" e "Port", é necessário conectividade via VPN (a VPN pode ser configurada pelo SAP GUI). Para resolver o hostname em um endereço IP, é preciso adicionar uma entrada de mapeamento no arquivo de hosts da máquina onde o agente está instalado.</td><td>N/A</td><td>String</td></tr><tr><td><strong>Client ID</strong> <code>(DB)</code></td><td>ID do cliente SAP, geralmente um número de 3 dígitos usado para conectar ao SAP.</td><td>400</td><td>String</td></tr><tr><td><strong>System Number</strong> <code>(DB)</code></td><td>Número do sistema SAP, geralmente com 2 dígitos. Essa informação pode ser encontrada no SAP GUI.</td><td>01</td><td>Integer</td></tr><tr><td><strong>Language</strong> <code>(DB)</code></td><td>Idioma utilizado na conexão com o sistema SAP (por exemplo, "EN" para inglês).</td><td>en</td><td>String</td></tr></tbody></table>

### **Aba General**

<table data-full-width="true"><thead><tr><th>Parâmetro</th><th>Descrição</th><th>Valor padrão</th><th>Tipo de dado</th></tr></thead><tbody><tr><td><strong>Alias</strong></td><td>Nome (alias) para a saída deste conector, permitindo referenciá-la posteriormente no fluxo utilizando expressões Double Braces. <a href="../../double-braces/how-to-reference-data-using-double-braces/previous-steps-access">Saiba mais</a>.</td><td>sap-1</td><td>String</td></tr><tr><td><strong>SAP Operation</strong></td><td>Tipo de conexão com o sistema SAP. Opções suportadas: <strong>RFC</strong> ou <strong>IDoc</strong>.</td><td>RFC</td><td>String</td></tr></tbody></table>

{% tabs fullWidth="true" %}
{% tab title="RFC" %}

<table data-full-width="true"><thead><tr><th>Parâmetro</th><th>Descrição</th><th>Valor padrão</th><th>Tipo de dado</th></tr></thead><tbody><tr><td><strong>RFC</strong> <code>(DB)</code></td><td>Nome da RFC utilizada para conectar ao sistema SAP. Esse valor é fornecido pelo cliente. Os parâmetros de import da função SAP devem ser mapeados.</td><td>YYPCL_RFC_ORDEM_FATURA</td><td>String</td></tr><tr><td><strong>Search Template</strong></td><td>Botão que preenche automaticamente o parâmetro <strong>Template (XML)</strong> com um template de RFC quando todos os detalhes de autorização e o nome da RFC são válidos.</td><td>N/A</td><td>Botão</td></tr><tr><td><strong>Send as File</strong></td><td>Quando ativado, um arquivo pode ser definido e enviado.</td><td>False</td><td>Booleano</td></tr><tr><td><strong>File Name</strong> <code>(DB)</code></td><td>Arquivo que contém o corpo a ser enviado ao servidor SAP. Utilize esta opção quando o payload for muito grande para o campo <strong>Template</strong>. Recomenda-se usar outros conectores como <a href="../tools/template-transformer"><strong>Template Transformer</strong></a> e <a href="../files/file-writer"><strong>File Writer</strong></a> para gerar o conteúdo do arquivo.</td><td>N/A</td><td>String</td></tr><tr><td><strong>Template (XML)</strong> <code>(DB)</code></td><td>Define o template Apache FreeMarker para a mensagem SOAP enviada na requisição. Para chamadas RFC, um template é gerado através do botão <strong>Search Template</strong> quando os detalhes de autorização e o nome da RFC são válidos.</td><td>N/A</td><td>String</td></tr><tr><td><strong>Fail On Error</strong></td><td>Se ativado, interrompe a execução do pipeline ao ocorrer um erro. Se desativado, a execução continua, mas a propriedade <code>"success"</code> será definida como <code>false</code>.</td><td>False</td><td>Booleano</td></tr><tr><td><strong>Raw Mode</strong></td><td>Quando ativado, o resultado será retornado no formato SAP XML original, encapsulado em JSON.</td><td>False</td><td>Booleano</td></tr></tbody></table>

{% endtab %}

{% tab title="IDoc" %}

<table data-full-width="true"><thead><tr><th>Parâmetro</th><th>Descrição</th><th>Valor padrão</th><th>Tipo de dado</th></tr></thead><tbody><tr><td><strong>IDoc Type</strong> <code>(DB)</code></td><td>Tipo básico de IDoc a ser enviado.</td><td>N/A</td><td>String</td></tr><tr><td><strong>IDoc Type Extension</strong> <code>(DB)</code></td><td>Extensão do tipo de IDoc, se aplicável.</td><td>N/A</td><td>String</td></tr><tr><td><strong>System Release</strong> <code>(DB)</code></td><td>SAP Basis Release associado ao IDoc.</td><td>N/A</td><td>String</td></tr><tr><td><strong>Application Release</strong> <code>(DB)</code></td><td>Application Release associado ao IDoc.</td><td>N/A</td><td>String</td></tr><tr><td><strong>Send as File</strong></td><td>Quando ativado, um arquivo pode ser definido e enviado.</td><td>False</td><td>Booleano</td></tr><tr><td><strong>File Name</strong> <code>(DB)</code></td><td>Arquivo que contém o corpo a ser enviado ao servidor SAP. Utilize esta opção quando o payload for muito grande para o campo <strong>Template</strong>. Recomenda-se usar outros conectores como <strong>Template Transformer</strong> e <strong>File Writer</strong> para gerar o conteúdo do arquivo.</td><td>N/A</td><td>String</td></tr><tr><td><strong>Template (XML)</strong> <code>(DB)</code></td><td>Define o template Apache FreeMarker para a mensagem SOAP enviada na requisição.</td><td>N/A</td><td>String</td></tr><tr><td><strong>Fail On Error</strong></td><td>Se ativado, interrompe a execução do pipeline ao ocorrer um erro. Se desativado, a execução continua, mas a propriedade <code>"success"</code> será definida como <code>false</code>.</td><td>False</td><td>Booleano</td></tr></tbody></table>

{% hint style="info" %}
Os IDocs são processados de forma assíncrona no SAP. Quando um IDoc é enviado, não há confirmação imediata de sucesso ou falha. Caso ocorra falha, o usuário deve reenviar o IDoc.
{% endhint %}
{% endtab %}
{% endtabs %}

### **Aba Documentation**

<table data-full-width="true"><thead><tr><th>Parâmetro</th><th>Descrição</th><th>Valor padrão</th><th>Tipo de dado</th></tr></thead><tbody><tr><td><strong>Documentation</strong></td><td>Campo opcional para descrever a configuração do conector e possíveis regras de negócio envolvidas.</td><td>N/A</td><td>Texto</td></tr></tbody></table>

## **Conector SAP – Guia de uso**

### **Limites de tamanho de arquivo**

Ao usar o conector SAP, observe o tamanho máximo de arquivo por tipo de implantação. Esses limites se aplicam quando o conector é usado isoladamente. Se outros conectores estiverem presentes no pipeline, os tamanhos podem variar:

* **Pequeno:** 10 MB
* **Médio:** 28 MB
* **Grande:** 67 MB

### **Configuração de variáveis globais**

Para simplificar a configuração dinâmica e promover a reutilização, recomenda-se definir [variáveis globais](https://app.gitbook.com/s/cO0A6g1dOsu8BiHYqO67/platform-administration/settings/globals) no seu pipeline.

#### **Variáveis globais obrigatórias**

| Variável      | Descrição    |
| ------------- | ------------ |
| `environment` | Ambiente SAP |

#### **Variáveis globais opcionais para templates**

| Variável    | Descrição                              |
| ----------- | -------------------------------------- |
| `[rfc]`     | Nome da função RFC                     |
| `[table]`   | Tabela relacionada à chamada RFC       |
| `[columns]` | Colunas da tabela usadas na requisição |

Para mais detalhes, consulte o [guia de conectividade SAP](https://app.gitbook.com/s/3ANg0NQQeslB7Og5K7Ah/connectivity-guides/digibee-sap).

### **Integração RFC**

#### **Exemplo de entrada JSON**

Para conexões RFC, inclua a [cápsula](https://app.gitbook.com/s/cO0A6g1dOsu8BiHYqO67/development-cycle/build-overview/capsulas/public-capsules/sap) "**SAP JSON to RFC**" antes do conector SAP. Isso garante que a entrada esteja formatada corretamente para o sistema SAP.

Exemplo de uma chamada RFC em um conector [**JSON Generator**](https://docs.digibee.com/documentation/connectors-and-triggers/pt-br/connectors/tools/json-generator):

```json
{
  "sid": "{{sap-test-sid}}", 
  "rfc": "BAPI_BUPA_ADDRESS_GETDETAIL", 
  "importParameters": { 
    "attributes": { 
      "BUSINESSPARTNER": {{ message.BUSINESSPARTNER }}, 
      "VALID_DATE": {{FORMATDATE(NOW(), "timestamp", "yyyy-MM-dd", null , "GMT-3") }} 
    } 
  }
}
```

#### **Melhores práticas**

* Sempre especifique o `sid` (Nome do Ambiente/Sistema ou ID do Sistema).
* A função `rfc` pode ser definida no payload JSON ou diretamente no conector.
* Defina `importParameters` apenas com os campos necessários para a chamada da função.

### **Configuração do Template (XML)**

O campo **Template (XML)** permite a geração automática para RFCs e também suporta customização manual tanto para estruturas RFC quanto IDoc.

#### **Geração automática de template RFC**

Quando uma função RFC é selecionada, o botão **Search Template** fica disponível. Se os detalhes de autorização estiverem corretos e o nome da RFC for válido, ao clicá-lo o campo **Template (XML)** é preenchido automaticamente com um template pronto para você apenas substituir os valores.

**Exemplo de template gerado:**

```xml
<BBP_RFC_READ_TABLE:Request xmlns:BBP_RFC_READ_TABLE="http://sap.fusesource.org/rfc/EC1/BBP_RFC_READ_TABLE">
    <DELIMITER>${body.DELIMITER}</DELIMITER>
    <NO_DATA>${body.NO_DATA}</NO_DATA>
    <QUERY_TABLE>${body.QUERY_TABLE}</QUERY_TABLE>
    <ROWCOUNT>${body.ROWCOUNT?c}</ROWCOUNT>
    <ROWSKIPS>${body.ROWSKIPS?c}</ROWSKIPS>
    <FIELDS>
        <#if body.FIELDS??>
            <#list body.FIELDS as item>
            <row>
                <FIELDNAME>${item.FIELDNAME}</FIELDNAME>
                <OFFSET>${item.OFFSET}</OFFSET>
                <LENGTH>${item.LENGTH}</LENGTH>
                <TYPE>${item.TYPE}</TYPE>
                <FIELDTEXT>${item.FIELDTEXT}</FIELDTEXT>
            </row>
            </#list>
        </#if>
    </FIELDS>
    <OPTIONS>
        <#if body.OPTIONS??>
            <#list body.OPTIONS as item>
            <row>
                <TEXT>${item.TEXT}</TEXT>
            </row>
            </#list>
        </#if>
    </OPTIONS>
</BBP_RFC_READ_TABLE:Request>
```

#### **Exemplos de templates manuais**

**Exemplo de template IDoc**

```xml
<?xml version="1.0" encoding="ASCII"?> 
<idoc:Document 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xmlns:FLCUSTOMER_CREATEFROMDATA01---="http://sap.fusesource.org/idoc/{_YOUR_ENVIRONMENT_}/FLCUSTOMER_CREATEFROMDATA01///" 
    xmlns:idoc="http://sap.fusesource.org/idoc" 
    creationDate="2015-01-28T12:39:13.980-0500" 
    creationTime="2015-01-28T12:39:13.980-0500" 
    iDocType="FLCUSTOMER_CREATEFROMDATA01" 
    iDocTypeExtension="" 
    messageType="FLCUSTOMER_CREATEFROMDATA" 
    recipientPartnerNumber="QUICKCLNT" 
    recipientPartnerType="LS" 
    senderPartnerNumber="QUICKSTART" 
    senderPartnerType="LS"> 
  <rootSegment xsi:type="FLCUSTOMER_CREATEFROMDATA01---:ROOT" document="/">
    <segmentChildren parent="//@rootSegment"> 
      <E1SCU_CRE parent="//@rootSegment" document="/"> 
        <segmentChildren parent="//@rootSegment/@segmentChildren/@E1SCU_CRE.0"> 
          <E1BPSCUNEW parent="//@rootSegment/@segmentChildren/@E1SCU_CRE.0" 
              document="/" 
              CUSTNAME="Fred Flintstone" FORM="Mr." 
              STREET="123 Rubble Lane" 
              POSTCODE="01234" 
              CITY="Bedrock" 
              COUNTR="US" 
              PHONE="800-555-1212" 
              EMAIL="fred@bedrock.com"
              CUSTTYPE="P" 
              DISCOUNT="005" 
              LANGU="E"/> 
        </segmentChildren> 
      </E1SCU_CRE> 
    </segmentChildren> 
  </rootSegment> 
</idoc:Document>  
```

{% hint style="warning" %}
Substitua `{_YOUR_ENVIRONMENT_}` pelo seu SID SAP.
{% endhint %}

**RFC – Consulta Simples**

Campos elementares / Parâmetros de entrada:

```xml
<?xml version="1.0" encoding="ASCII"?> 
<[rfc]:Request xmlns:[rfc]="http://sap.fusesource.org/rfc/{{global.environment}}/[rfc]" 
  [columns]="20180801" 
  [columns]="20180806" 
  [columns]="050" />
```

Exemplo:

```xml
<?xml version="1.0" encoding="ASCII"?> 
<ABCD_RFC_ORDEM_FATURA:Request 
    xmlns:ABCD_RFC_ORDEM_FATURA="http://sap.fusesource.org/rfc/QAS/ABCD_RFC_ORDEM_FATURA" 
    P_ERDAT_INI="2018-07-01T00:00:00.000" 
    P_ERDAT_FIM="2018-08-01T00:00:00.000" 
    CLIENTE="" 
    VKORG="0010" 
    AUART="" /> 
```

**RFC – Consulta em Tabela**

Campos da tabela:

```xml
<?xml version="1.0" encoding="ASCII"?> 
<[rfc]:Request ">xmlns:[rfc]="http://sap.fusesource.org/rfc/{{global.environment}}/[rfc]"> 
 <[table]> 
  <row> 
   <[columns]>${VBELN}</[columns]> 
   <[columns]>${ABDC}</[columns]> 
  </row> 
 </[table]> 
</[rfc]:Request> 
```

Exemplo:

```xml
<?xml version="1.0" encoding="ASCII"?> 
<ABCD_RFC_MATERIAIS:Request ">xmlns:ABCD_RFC_MATERIAIS:Request="http://sap.fusesource.org/rfc/{{global.environment}}/ABCD_RFC_MATERIAIS:Request"> 
 <T_TIPO> 
  <row> 
   <MTART>${type}</MTART> 
  </row> 
 </T_TIPO> 
</ABCD_RFC_MATERIAIS:Request>
```

**Entrada**

```json
{  
    "body":{     
        "type": "S"   
    } 
}
```

* `${type}`**:** Variável que deve ser fornecida dentro da tag `body`.

#### **Variáveis no template e escape**

Ao usar variáveis como `sapRequestTemplate`, lembre-se:

* Caracteres especiais (como `-`, `.`, `:`) em nomes de variáveis devem ser **escapados** com barra invertida (`\`).
* Use funções Apache FreeMarker para formatação e conversão:

```
<#assign x=42>
${x}
${x?string} <#-- o mesmo que ${x} -->
${x?string.number}
${x?string.currency}
${x?string.percent}
${x?string.computer}
```

**Saídas:**

```
42
42
42
$42.00
4,200%
42
```

### **Fluxo de mensagens**

#### **Entrada**

O conector aceita entrada em qualquer formato, mas procura por um caminho específico baseado na configuração `modelPath`.

#### **Saída**

* A saída reflete a entrada, porém substitui a propriedade do modelo definida pela string XML gerada (a partir do Template).
* Em caso de erro, a propriedade `property_error` é adicionada no mesmo nível do modelo original.
