A Chamada da Simulate consiste em consultar e extrair as informações, com base no arquivos de parâmetros, da API. A integração fornecida para possibilitar a extração dessa informações é a conexão entre o SAP e a API. O retorno dessa chamada é no formato Json. O propósito do desenvolvimento desta chamada é obter informações de preço, valores totais e de impostos, em função do Tipo de Documento (ZDX, ZCPP e ZCPI), os quais apresentarão a utilidade de construir uma tabela com o cálculo.
Recursos Necessários
Os recursos utilizados devem ser mencionados para apoio no entendimento e desenvolvimento da Chamada Simulate. Abaixo segue a lista de todos os insumos utilizados para o estabelecimento deste projeto:
Postman: apresenta a utilidade de validar o retorno da API com os parâmetros especificados;
Amostra de Parâmetros: arquivo solicitante à área de negócios para fornecer os parâmetros necessários para o retorno das informações da chamada simulate.
Notebook do Databricks da Chamada da Simulate: desenvolvimento de script da Chamada Simulate que realiza a requisição das informações de preço, valores totais e impostos, a partir da leitura e configuração do arquivo de parâmetros, da API. (COLOCAR O LINK)
Notebook do Databricks para a leitura e configuração do arquivo de parâmetros: desenvolvimento de script da leitura do arquivo extraído, adequação das informações com o modelo atual e configuração do Tipo de Documento para ocorrer a chamada da simulate. (COLOCAR O LINK
Jira: este sistema pode ser usado para a consulta do Card DGA - 535 a qual apresenta todas as informações do projeto e o commit dos notebooks do Databricks.
METODOLOGIA
Arquivo de Parâmetros
Após a solicitação do arquivo de parâmetros em excel e a adaptação para csv, o processo de geração, importação e gravação do arquivo de parâmetros pode ser vista na Figura 1:
De acordo com a Figura 1, a área de negócios extrai um arquivo de parâmetros em excel e é enviado para o nosso domínio. Posteriormente, é criado um código Python que lê este arquivo (transformado em csv) e extrai para o storage como gravação de uma tabela relacional no Databricks.
Após a gravação do arquivo de parâmetros, deve-se adequar na mesma configuração de nomenclatura e tipos de dados das colunas da tabela genesis_pricing.parametersv4.
Observações: Pode ocorrer a ausência de algumas colunas no arquivo extraído pela área de negócios, por exemplo, “FuncaoParceiro”. Para este caso deve-se criar uma coluna com este nome e atribuir o valor “AG”. Caso este comportamento ocorra para outras colunas, verificar com a área de negócios.
A extração das informações de preço, valores totais e impostos é dependente do tipo de Documento. O Arquivo de parâmetros extraídos pela área de negócios geralmente está com o Tipo de Documento (coluna “Tp.Doc”) associado ao valor ZDX (Venda Normal). Para este caso, caso seja necessário buscar as informações para ZCPL (Preço Lucro) e ZCPI (Impostos), deve-se duplicar os registros para cada grupo baseado no ZDX e unir tudo conforme na Figura 2:
Para mais informações sobre o desenvolvimento do script, acessar:
Após essas configurações do arquivo de parâmetros, a tabela é gravada no database genesis_pricing e deve seguir este padrão.
Tp_Doc | Org_Vendas | Eq_Vendas | Escr_Vendas | Regiao_de_vendas | Cond_de_Pgto | Cond_Expedicao | Moeda | Entrega_Paletizada | Incoterms | Incoterms_2 | Setor_de_atividade | Canal_distribuicao | Louca_Embalada | Funcao_parceiro | Utilizacao | Emissor_da_Ordem | Centro | Material |
ZDX | DH01 | 35 | DB05 | MS02 | BP19 | 1 | BRL | 4 | CIF | CIF | HY | 45 | 4 | AG | ZR | 92001 | HY01 | 1167.METVMHMN |
ZDX | DH01 | 35 | DB05 | MS02 | BP19 | 1 | BRL | 4 | CIF | CIF | HY | 45 | 4 | AG | ZR | 92001 | HY01 | 1168.METPTHMN |
ZCPP - Consulta Preco | DH01 | 510 | DI05 | ZH02 | B120 | 1 | BRL | 4 | CIF | CIF | HY | 45 | null | AG | ZR | 1186836 | HY01 | DPBL.3SAR.532BR |
ZCPP - Consulta Preco | DH01 | 510 | DI05 | ZH25 | B100 | 1 | BRL | 4 | CIF | CIF | HY | 45 | null | AG | ZR | 712531 | HY01 | DPMD.4.622BR |
ZCPI - Consulta Imposto | DH01 | 35 | DB05 | MS02 | BP19 | 1 | BRL | 4 | CIF | CIF | HY | 45 | 4 | AG | ZR | 92001 | HY01 | 1167.METVMHMN |
ZCPI - Consulta Imposto | DH01 | 35 | DB05 | MS02 | BP19 | 1 | BRL | 4 | CIF | CIF | HY | 45 | 4 | AG | ZR | 92001 | HY01 | 1168.METPTHMN |
Os campos extraídos e configurados são:
'
Campos Origem SAP | Campos Extraídos | Data Types | Descrição do campo |
---|---|---|---|
DOC_TYPE | Tp_Doc | CHAR | Tipo de Documento de Vendas |
SALES_ORG | Org_Vendas | CHAR | Organização de Vendas |
SALES_GRO | Eq_Vendas | CHAR | Equipe de Vendas |
SALES_OFF | Escr_Vendas | CHAR | Escritório de Vendas |
SALES_DIST | Regiao_de_Vendas | CHAR | Região de Vendas |
Cond_de_Pgto | Condição de Pagamento | ||
SHIP_COND | Cond_Expedicao | CHAR | Condição de Expedição |
CURRENCY | Moeda | CUKY | Moeda do documento SD |
PRICE_LIST | Entrega_Paletizada | CHAR | Entrega Paletizada |
INCOTERMS1 | Incoterms | CHAR | Incoterms parte 1 |
INCOTERMS2 | Incoterms2 | CHAR | Incoterms parte 2 |
DIVISION | Setor_de_atividade | CHAR | Setor de Atividade |
DISTR_CHAN | Canal_distribuicao | CHAR | Canal de Distribuição |
CUST_GROUP | Louca_Embalada | CHAR | Louça Embalada |
PARTN_ROLE | Funcao_Parceiro | CHAR | Função do Parceiro |
Utilizacao | CHAR | Utilização | |
Emissor_da_Ordem | CHAR | Emissor da Ordem | |
Centro | CHAR | Centro | |
CUST_MAT | Material | CHAR | Material do Cliente |
Chamada Simulate
A chamada da Simulate ocorre a partir do payload em função do dataframe passado como parâmetro. Este dataframe é construída a partir da leitura do arquivo de parâmetros configurados e da sua relação com as tabelas de clientes e de expedição. Além disso, é feita adaptação em algumas colunas como no Tipo de Documento, Preço e entre outros. Esta adaptação é feita para que a requisição da API possa ocorrer com o êxito. Caso contrário, haverá erro de integração da chamada com o server do SAP.
Em relação a afirmativa do êxito do payload, mais um requisito é necessário: a construção da chamada do payload deve ter formato json com os parâmetros ajustados para que a requisição ocorra. Tais parâmetros deve ser usado desta forma para o ZDX:
{ "schedule": { "Item": { "scheduleLineDate": "", "salesDocumentItem": "000150", "orderQuantityInSalesUnits": "10" } }, "rotationHeader": { "yourReference": "SF", "valueShipping": "0", "valueAccessoryCosts": "0", "termsOfPaymentKey": "B028", "shippingConditions": "Standard", "sdDocumentCurrency": "BRL", "salesOrganization": "DC01", "salesOffice": "DB03", "salesGroup": "091", "salesDocumentType": "ZDX - Venda Normal", "salesDistrict": "Deca - MG Região 07", "requestedDeliveryDate": "", "priceListType": "Não", "incotermsPart2": "CIF - Custo, seguro & frete", "incotermsPart1": "CIF - Custo, seguro & frete", "division": "MS", "distributionChannel": "40", "dateForPricingAndExchangeRate": None, "customerPurchaseOrderNumber": "", "customerPurchaseOrderDate": "2020-07-30", "customerGroup": "false", "cup": "Revenda", "completeDeliveryDefinedForEachSalesOrder": "" }, "quotePartners": { "Item": { "partnerFunction": "EmissorOrdem", "customerNumber": "0000032611" } }, "quoteItems": { "Item": { "salesDocumentItem": "000150", "rateConditionRound": "0", "rateConditionAmountOrPercentage": "0.00", "plant": "D085", "materialNumber": "4688.931" } }, "guuid": None, "extension": { "Item": { "dataPartOfBapiExtensionParameter3": None, "dataPartOfBapiExtensionParameter2": "", "dataPartOfBapiExtensionParameter1": None, "dataPartOfBapiExtensionParameter": "" } } }
Observações: para os casos de ZCPP ou ZCPI deve alterar os parâmetros "yourReference"
para "HUB"
e
"salesDocumentType"
para "ZCPP - Consulta Preço"
ou "ZCPI - Consulta Imposto"
, respectivamente.
Abaixo, segue o modelo testado para o ZCPL:
{ "schedule": { "Item": { "scheduleLineDate": "", "salesDocumentItem": "000150", "orderQuantityInSalesUnits": "10" } }, "rotationHeader": { "yourReference": "HUB", "salesDocumentType": "ZCPL", "valueShipping": "0", "valueAccessoryCosts": "0", "termsOfPaymentKey": "B028", "shippingConditions": "Standard", "sdDocumentCurrency": "BRL", "salesOrganization": "DC01", "salesOffice": "DB03", "salesGroup": "091", "salesDistrict": "Deca - MG Região 07", "requestedDeliveryDate": "", "priceListType": "Não", "incotermsPart2": "CIF - Custo, seguro & frete", "incotermsPart1": "CIF - Custo, seguro & frete", "division": "MS", "distributionChannel": "40", "dateForPricingAndExchangeRate": null, "customerPurchaseOrderNumber": "", "customerPurchaseOrderDate": "2020-07-30", "customerGroup": "false", "cup": "Revenda", "completeDeliveryDefinedForEachSalesOrder": "" }, "quotePartners": { "Item": { "partnerFunction": "EmissorOrdem", "customerNumber": "0000032611" } }, "quoteItems": { "Item": { "salesDocumentItem": "000150", "rateConditionRound": "0", "rateConditionAmountOrPercentage": "0.00", "plant": "D085", "materialNumber": "4688.931" } }, "guuid": None, "extension": { "Item": { "dataPartOfBapiExtensionParameter3": None, "dataPartOfBapiExtensionParameter2": "", "dataPartOfBapiExtensionParameter1": None, "dataPartOfBapiExtensionParameter": "" } } }
O modelo para o ZCPI pode ser visto no código:
A Execução do Payload pode ser visto no comando abaixo. Para este caso, a chamada dos preços, vendas totais e impostos serão para o documento ZDX.
for row in df_payload.rdd.collect(): payload_retorno_s4_hana_interno = payload_retorno_s4_hana if row["DOC_TYPE"] == 'ZDX - Venda Normal': payload_chamada_json["schedule"]["Item"]["salesDocumentItem"] = row["ITM_NUMBER"] payload_chamada_json["schedule"]["Item"]["scheduleLineDate"] = today payload_chamada_json["rotationHeader"]["termsOfPaymentKey"] = row["PMNTTRMS"] payload_chamada_json["rotationHeader"]["shippingConditions"] = row["SHIP_COND"] payload_chamada_json["rotationHeader"]["sdDocumentCurrency"] = row["CURRENCY"] payload_chamada_json["rotationHeader"]["salesOrganization"] = row["SALES_ORG"] payload_chamada_json["rotationHeader"]["salesOffice"] = row["SALES_OFF"] payload_chamada_json["rotationHeader"]["salesGroup"] = row["SALES_GRP"] payload_chamada_json["rotationHeader"]["salesDocumentType"] = row["DOC_TYPE"] payload_chamada_json["rotationHeader"]["salesDistrict"] = row["SALES_DIST"] payload_chamada_json["rotationHeader"]["priceListType"] = row["PRICE_LIST"] payload_chamada_json["rotationHeader"]["incotermsPart2"] = row["INCOTERMS2"] payload_chamada_json["rotationHeader"]["incotermsPart1"] = row["INCOTERMS1"] payload_chamada_json["rotationHeader"]["division"] = row["DIVISION"] payload_chamada_json["rotationHeader"]["distributionChannel"] = row["DISTR_CHAN"] payload_chamada_json["rotationHeader"]["customerGroup"] = row["CUST_GROUP"] payload_chamada_json["rotationHeader"]["cup"] = row["cup"] payload_chamada_json["quotePartners"]["Item"]["partnerFunction"] = row["PARTN_ROLE"] payload_chamada_json["quotePartners"]["Item"]["customerNumber"] = row["PARTN_NUMB"] payload_chamada_json["quoteItems"]["Item"]["salesDocumentItem"] = row["ITM_NUMBER"] payload_chamada_json["quoteItems"]["Item"]["plant"] = row["PLANT"] payload_chamada_json["quoteItems"]["Item"]["materialNumber"] = row["MATERIAL"] payload_chamada_json["guuid"] = row["uuid"] payload_chamada_str = json.dumps(payload_chamada_json) payload_saida = chamada_simulate_api(payload_chamada_str) payload_retorno_str = payload_saida.text if (payload_retorno_str[:5] == "<?xml"): payload_retorno_str = payload_retorno payload_retorno_str = payload_retorno_str.replace("Sem Erros!", "ERRO: Retorno enviado em XML!") payload_retorno_str = payload_retorno_str[:-1] payload_retorno_str = payload_retorno_str[1:] payload_chamada_str = payload_chamada_str[:-1] else : payload_chamada_str = payload_chamada_str[:-1] payload_retorno_str = payload_retorno_str[:-2] payload_retorno_str = payload_retorno_str[2:] merge_json = payload_chamada_str +","+ payload_retorno_str + "}" print(merge_json) payload_gravar = json.loads(merge_json) print(payload_gravar) if (payload_gravar["quoteConditions"][0]["otherCosts"] == "NULL" or payload_gravar["quoteConditions"][0]["otherCosts"] == "null" or payload_gravar["quoteConditions"][0]["otherCosts"] == None ): payload_gravar["quoteConditions"][0]["otherCosts"] = 0.0 if (payload_gravar["quoteConditions"][0]["valueTaxSubstitutionTributary"] == "NULL" or payload_gravar["quoteConditions"][0]["valueTaxSubstitutionTributary"] == "null" or payload_gravar["quoteConditions"][0]["valueTaxSubstitutionTributary"] == None ): payload_gravar["quoteConditions"][0]["valueTaxSubstitutionTributary"] = 0.0 if (payload_gravar["quoteConditions"][0]["commercialCost"] == "NULL" or payload_gravar["quoteConditions"][0]["commercialCost"] == "null" or payload_gravar["quoteConditions"][0]["commercialCost"] == None ): payload_gravar["quoteConditions"][0]["commercialCost"] = 0.0 if (payload_gravar["quoteConditions"][0]["manufacturingCost"] == "NULL" or payload_gravar["quoteConditions"][0]["manufacturingCost"] == "null" or payload_gravar["quoteConditions"][0]["manufacturingCost"] == None ): payload_gravar["quoteConditions"][0]["manufacturingCost"] = 0.0 if (payload_gravar["quoteConditions"][0]["valueAdditionalSale"] == "NULL" or payload_gravar["quoteConditions"][0]["valueAdditionalSale"] == "null" or payload_gravar["quoteConditions"][0]["valueAdditionalSale"] == None ): payload_gravar["quoteConditions"][0]["valueAdditionalSale"] = 0.0 if (len(payload_gravar["quotationItems"]) != 0): payload_gravar["sapReturn"] = payload_retorno_json["sapReturn"] if (len(payload_gravar["quotationItems"]) == 0): payload_gravar["quotationItems"] = payload_retorno_json["quotationItems"] payload_gravar["quoteConditions"] = payload_retorno_json["quoteConditions"] jsonData = json.dumps(payload_gravar) print(jsonData) jsonDataList = [] jsonDataList.append(jsonData) jsonRDD = sc.parallelize(jsonDataList) df = spark.read.json(jsonRDD) df.write.format("delta").mode("append").saveAsTable(simulate_table_name)
Para os casos de ZCPP e ZCPI, é só atribuir a cláusula else para o primeiro condição if para o Tipo de Documento do ZDX assim:
else: #if row["DOC_TYPE"] == "ZDX - Consulta Venda": payload_chamada_json["schedule"]["Item"]["salesDocumentItem"] = row["ITM_NUMBER"] payload_chamada_json["schedule"]["Item"]["scheduleLineDate"] = today payload_chamada_json["rotationHeader"]["termsOfPaymentKey"] = row["PMNTTRMS"] payload_chamada_json["rotationHeader"]["shippingConditions"] = row["SHIP_COND"] payload_chamada_json["rotationHeader"]["sdDocumentCurrency"] = row["CURRENCY"] payload_chamada_json["rotationHeader"]["salesOrganization"] = row["SALES_ORG"] payload_chamada_json["rotationHeader"]["salesOffice"] = row["SALES_OFF"] payload_chamada_json["rotationHeader"]["salesGroup"] = row["SALES_GRP"] payload_chamada_json["rotationHeader"]["salesDocumentType"] = row["DOC_TYPE"] payload_chamada_json["rotationHeader"]["salesDistrict"] = row["SALES_DIST"] payload_chamada_json["rotationHeader"]["priceListType"] = row["PRICE_LIST"] payload_chamada_json["rotationHeader"]["incotermsPart2"] = row["INCOTERMS2"] payload_chamada_json["rotationHeader"]["incotermsPart1"] = row["INCOTERMS1"] payload_chamada_json["rotationHeader"]["division"] = row["DIVISION"] payload_chamada_json["rotationHeader"]["distributionChannel"] = row["DISTR_CHAN"] payload_chamada_json["rotationHeader"]["customerGroup"] = row["CUST_GROUP"] payload_chamada_json["rotationHeader"]["cup"] = row["cup"] payload_chamada_json["quotePartners"]["Item"]["partnerFunction"] = row["PARTN_ROLE"] payload_chamada_json["quotePartners"]["Item"]["customerNumber"] = row["PARTN_NUMB"] payload_chamada_json["quoteItems"]["Item"]["salesDocumentItem"] = row["ITM_NUMBER"] payload_chamada_json["quoteItems"]["Item"]["plant"] = row["PLANT"] payload_chamada_json["quoteItems"]["Item"]["materialNumber"] = row["MATERIAL"] payload_chamada_json["guuid"] = row["uuid"] payload_chamada_str = json.dumps(payload_chamada_json) payload_saida = chamada_simulate_api(payload_chamada_str) payload_retorno_str = payload_saida.text if (payload_retorno_str[:5] == "<?xml"): payload_retorno_str = payload_retorno payload_retorno_str = payload_retorno_str.replace("Sem Erros!", "ERRO: Retorno enviado em XML!") payload_retorno_str = payload_retorno_str[:-1] payload_retorno_str = payload_retorno_str[1:] payload_chamada_str = payload_chamada_str[:-1] else : payload_chamada_str = payload_chamada_str[:-1] payload_retorno_str = payload_retorno_str[:-2] payload_retorno_str = payload_retorno_str[2:] merge_json = payload_chamada_str +","+ payload_retorno_str + "}" payload_gravar = json.loads(merge_json) if (payload_gravar["quoteConditions"][0]["otherCosts"] == "NULL" or payload_gravar["quoteConditions"][0]["otherCosts"] == "null" or payload_gravar["quoteConditions"][0]["otherCosts"] == None ): payload_gravar["quoteConditions"][0]["otherCosts"] = 0.0 if (payload_gravar["quoteConditions"][0]["valueTaxSubstitutionTributary"] == "NULL" or payload_gravar["quoteConditions"][0]["valueTaxSubstitutionTributary"] == "null" or payload_gravar["quoteConditions"][0]["valueTaxSubstitutionTributary"] == None ): payload_gravar["quoteConditions"][0]["valueTaxSubstitutionTributary"] = 0.0 if (payload_gravar["quoteConditions"][0]["commercialCost"] == "NULL" or payload_gravar["quoteConditions"][0]["commercialCost"] == "null" or payload_gravar["quoteConditions"][0]["commercialCost"] == None ): payload_gravar["quoteConditions"][0]["commercialCost"] = 0.0 if (payload_gravar["quoteConditions"][0]["manufacturingCost"] == "NULL" or payload_gravar["quoteConditions"][0]["manufacturingCost"] == "null" or payload_gravar["quoteConditions"][0]["manufacturingCost"] == None ): payload_gravar["quoteConditions"][0]["manufacturingCost"] = 0.0 if (payload_gravar["quoteConditions"][0]["valueAdditionalSale"] == "NULL" or payload_gravar["quoteConditions"][0]["valueAdditionalSale"] == "null" or payload_gravar["quoteConditions"][0]["valueAdditionalSale"] == None ): payload_gravar["quoteConditions"][0]["valueAdditionalSale"] = 0.0 if (len(payload_gravar["quotationItems"]) != 0): payload_gravar["sapReturn"] = payload_retorno_json["sapReturn"] if (len(payload_gravar["quotationItems"]) == 0): payload_gravar["quotationItems"] = payload_retorno_json["quotationItems"] payload_gravar["quoteConditions"] = payload_retorno_json["quoteConditions"] jsonData = json.dumps(payload_gravar) #print(jsonData) jsonDataList = [] jsonDataList.append(jsonData) jsonRDD = sc.parallelize(jsonDataList) df = spark.read.json(jsonRDD) df.write.format("delta").mode("append").saveAsTable(simulate_table_name)
Throubleshoot
Para validar corretamento a chamada da API deve-se atentar a três principais etapas: header da função da chamada da simulate; parâmetros da chamada no formato json e verificação da execução do payload para o formato especificado no header.
Header da Função da Chamada Simulate
O desenvolvimento do notebook para realizar a requisição da API foi desenvolvido com a passagem de parâmetros no formato json. A primeira etapa é verificar se a definição da função da chamada simulate está contemplando este formato. Isto pode ser visto na especificação do header da url.
Parâmetros da Chamada Simulate
Um dos principais problemas que podem ocorrer com o retorno da chamada simulate é a definição dos parâmetros. A solução para este problema foi desenvolvida pelos testes de especificação um a um de cada parâmetro. O modelo ideal para a requisição ocorrer de maneira com êxito é definida no formato abaixo. Este formato pode ser usado para todas as chamadas.
payload_chamada = json.dumps({ "schedule": { "Item": { "scheduleLineDate": "", "salesDocumentItem": "000150", "orderQuantityInSalesUnits": "10" } }, "rotationHeader": { "yourReference": "SF", "valueShipping": "0", "valueAccessoryCosts": "0", "termsOfPaymentKey": "B028", "shippingConditions": "Standard", "sdDocumentCurrency": "BRL", "salesOrganization": "DC01", "salesOffice": "DB03", "salesGroup": "091", "salesDocumentType": "ZDX - Venda Normal", "salesDistrict": "Deca - MG Região 07", "requestedDeliveryDate": "", "priceListType": "Não", "incotermsPart2": "CIF - Custo, seguro & frete", "incotermsPart1": "CIF - Custo, seguro & frete", "division": "MS", "distributionChannel": "40", "dateForPricingAndExchangeRate": None, "customerPurchaseOrderNumber": "", "customerPurchaseOrderDate": "2020-07-30", "customerGroup": "false", "cup": "Revenda", "completeDeliveryDefinedForEachSalesOrder": "" }, "quotePartners": { "Item": { "partnerFunction": "EmissorOrdem", "customerNumber": "0000032611" } }, "quoteItems": { "Item": { "salesDocumentItem": "000150", "rateConditionRound": "0", "rateConditionAmountOrPercentage": "0.00", "plant": "D085", "materialNumber": "4688.931" } }, "guuid": None, "extension": { "Item": { "dataPartOfBapiExtensionParameter3": None, "dataPartOfBapiExtensionParameter2": "", "dataPartOfBapiExtensionParameter1": None, "dataPartOfBapiExtensionParameter": "" } } }) payload_chamada_json = json.loads(payload_chamada)
A ideia usada para Throubleshoot é adicionar parâmetro por parâmetro e executar o seguinte comando:
payload_chamada_str = json.dumps(payload_chamada_json) payload_saida = chamada_simulate_api(payload_chamada_str) payload_retorno_str = payload_saida.text print(payload_chamada_str)
Ao adicionar cada parâmetro e executar, se dar o erro no próprio parâmetro que foi especificado, então foi colocado de maneira errada. Caso, dê erro no próximo parâmetro (por não estar especificado. Lembre-se a adição é um a um), então significa que o parâmetro foi definido de maneira certo.
Observações: atentar aos parâmetros de "guuid"
, "dataPartOfBapiExtensionParameter3"
e "dataPartOfBapiExtensionParameter1"
. No caso do postman, atribui null para estes parâmetros. Aqui no Databricks não deve ser especificado como “null”, e sim como None. Além disso, o parâmetro "yourReference"
é case sensitive.
Para validar a ocorrência do êxito é verificar o retorno do SAP. Se o código for 200 significa que a ocorrência foi certa.
Utilizar apenas este parâmetro para validar não significa muito em relação ao retorno da chamada se ocorrerá com êxito. Para isso, é preciso verificar se o retorno, para os parâmetros que foram especificados, estão com valores conforme na figura abaixo. Caso dê problemas no retorno da chamada, os valores estão zerados. Isso pode estar associado com a adoção do valor do parâmetro None para “null” e caso do case sensitive do SF.
0 Comments