Escolar Documentos
Profissional Documentos
Cultura Documentos
RELATÓRIOS
GATEWAY + SAPUI5
Sumário
Sumário ................................................................................................................................................ 2
Definições .............................................................................................................................................. 3
Criar novo Projeto .................................................................................................................................. 5
Definindo Uma Entidade ........................................................................................................................ 7
Publicação do Serviço ............................................................................................................................ 9
Atualizando os Metadados .................................................................................................................. 12
Leitura de lista: Método GET_ENTITYSET ............................................................................................. 14
Leitura de chave primária: Método GET_ENTITY ................................................................................. 18
Criando o Aplicativo FrontEnd ............................................................................................................. 20
Adição de dados na página de detalhes ............................................................................................... 29
Implementação de Filtros .................................................................................................................... 31
Implementação de Ordenação............................................................................................................. 35
Implementação da Paginação .............................................................................................................. 39
Adicionando Associações no Modelo OData ........................................................................................ 43
Implementando Expansões (Cliente/vendas) ...................................................................................... 46
Consumindo as Relações no UI5 (Cliente/vendas) ............................................................................... 50
Deploy da aplicação no servidor – Report ABAP .................................................................................. 53
#MIGRESUACARREIRA
2
Definições
SAP Gateway é uma ferramenta que permite que o desenvolvedor ABAP crie
webservices que podem ser consumidos externamente por qualquer tecnologia
FrontEnd que consuma serviços do protocolo OData. o SAP Gateway na posição de
servidor SAP foi o primeiro nome do atual Front-End Server.
#MIGRESUACARREIRA
3
DEFINIÇÃO E
PUBLICAÇÃO
DO SERVIÇO
ODATA
#MIGRESUACARREIRA
4
Criar novo Projeto
Transação SEGW
Criar Projeto
Indicar:
- Nome
- Descrição
- Pacote
Salvar.
#MIGRESUACARREIRA
5
Na pasta Runtime Artifacts, vão ser geradas as Classes:
• MPC: Model Provider Class
Encarregada da definição do modelo. NÃO MODIFICAR.
• MPC_EXT e DPC_EXT:
Classes herdeiras das indicadas acima. Nelas redefinimos o comportamento,
inserindo a lógica que queremos.
#MIGRESUACARREIRA
6
Definindo Uma Entidade
Transação SEGW
Pelo Wizard: Clique com botão direito em Data Model > Create > Entity Type
(ou manual: clicar duas vezes em Entity Types e clicar em Anexar linha )
Name: Cliente
Marcar ‘Create Related Entity Set’
#MIGRESUACARREIRA
7
Clicar em Inserir Linha e adicionar os registros abaixo:
Gravar e Gerar
#MIGRESUACARREIRA
8
Publicação do Serviço
Indicamos:
- Alias do Sistema: LOCAL
- Nome Serviço Técnico: (nome do objeto gerado dentro da pasta “Runtime
Artifacts” no Passo 1, que termina com _SRV e é do tipo “registered service”)
#MIGRESUACARREIRA
9
Na MAINT_SERVICE, selecionar a entrada.
Clicar ‘Inserir serviços selecionados’.
OK (várias vezes)
Voltar para tela inicial
Filtrar pelo nome do serviço.
Vai ser gerado um link no seguinte padrão. Ajuste os termos entre <> para os dados
do seu ambiente.
http://<host>:<porta>/sap/opu/odata/sap/<nome_serviço>_SRV/
#MIGRESUACARREIRA
10
No final da URL , a interrogação (?) indica que serão informados parâmetros
adicionais.
Os parâmetros adicionais são concatenados por ‘e comercial’ (&)
http://lnl-s4h.opustech.com.br:8000/sap/opu/odata/sap/ZLOJA_SRV/?$format=xml&sap-
client=200
http://lnl-s4h.opustech.com.br:8000/sap/opu/odata/sap/ZLOJA_SRV/?$format=json&sap-
client=200
Contagem: ClienteSet/$count
Paginação: ClienteSet/?$skip=2&$top=2
#MIGRESUACARREIRA
11
Atualizando os Metadados
Sempre que for modificada a definição de um serviço devemos atualizar o cache dos
dois níveis.
• Backend:
• Transação /IWBEP/CACHE_CLEANUP
• Executamos para todos os modelos.
• Frontend:
• Transação /IWFND/CACHE_CLEANUP
• Por modelo: O nome do ‘Registered Model’ (pasta runtime artifacts do projeto
na SEGW)
• Cleanup Cache para todos modelos: manter flag ativo
#MIGRESUACARREIRA
12
IMPLEMENTAÇÃO
DO SERVIÇO
ODATA
#MIGRESUACARREIRA
13
Leitura de lista: Método GET_ENTITYSET
Para toda Entidade que definimos, é gerado de forma automática 5 métodos ABAP
na classe DPC: Create, Update, Delete, GetEntity e GetEntitySet.
#MIGRESUACARREIRA
14
Com a classe DPC_EXT vamos na SE24 e buscamos o método
CLIENTESET_GET_ENTITYSET.
SELECT *
FROM ZTAB_CLIENTES
INTO CORRESPONDING FIELDS OF TABLE ET_ENTITYSET.
#MIGRESUACARREIRA
15
A consulta ao serviço odata também pode ser feito usando a transação
/IWFND/GW_CLIENT - SAP Gateway Client
Nesta tela é informada a url do serviço, sem informar host e porta
#MIGRESUACARREIRA
16
Para melhorar a performance, o serviço OData permite especificar as colunas para
serem selecionadas.
data(lt_select_mandt) = IO_TECH_REQUEST_CONTEXT->get_select_with_mandtry_fields( ) .
SELECT (lt_select_mandt)
FROM ZTAB_CLIENTES
INTO CORRESPONDING FIELDS OF TABLE ET_ENTITYSET.
#MIGRESUACARREIRA
17
Leitura de chave primária: Método GET_ENTITY
O campo chave está nos parâmetros de entrada do método. Pode ser obtido o nome
interno ou externo da propriedade da entidade OData
SELECT SINGLE *
FROM ZTAB_CLIENTES
INTO CORRESPONDING FIELDS OF ER_ENTITY
WHERE ID EQ LS_ENTITY-ID.
#MIGRESUACARREIRA
18
MODO 2: NOMES EXTERNOS
SELECT SINGLE *
FROM ZTAB_CLIENTES
INTO CORRESPONDING FIELDS OF ER_ENTITY
WHERE ID EQ LV_KEY-VALUE.
#MIGRESUACARREIRA
19
Criando o Aplicativo FrontEnd
No VSCode aperte F1 > digite Fiori > selecione Open Application Generator
#MIGRESUACARREIRA
20
#MIGRESUACARREIRA
21
Em Data Source, selecione Connect to a System
#MIGRESUACARREIRA
22
Coloque o host e porta https do ambiente (o mesmo host e porta do launchpad)
Em Service, escolha o serviço OData gerado, podendo digitar o nome para filtrar
#MIGRESUACARREIRA
23
Em Object collection selecione a entidade criada no serviço
Em Object collection key informe o campo chave da entidade
Em Object ID selecione uma propriedade significativa da entidade, que não seja o
campo chave
Em number e unit of measure não informe nada. Informe se tiver criado as
respectivas propriedades no serviço
#MIGRESUACARREIRA
24
Em Project atributes , coloque as informações do aplicativo
#MIGRESUACARREIRA
25
Opcionalmente, você pode informar as configurações de de deploy e launchpad
#MIGRESUACARREIRA
26
Em FPL configuration é informado o objeto semântico e ação para configurações do
launchpad
Depois que o projeto for gerado, clique na opção run e debug, e clique em run
#MIGRESUACARREIRA
27
OPERAÇÕES DE
LEITURA E
QUERY
#MIGRESUACARREIRA
28
Adição de dados na página de detalhes
<mvc:View controllerName="cris.controller.Object"
xmlns="sap.m"
xmlns:mvc="sap.ui.core.mvc"
xmlns:f="sap.ui.layout.form"
xmlns:core="sap.ui.core"
xmlns:semantic="sap.f.semantic">
...
<semantic:content>
<VBox>
<f:Form id="FormDisplay354" editable="false">
<f:title>
<core:Title text="Detalhes" />
</f:title>
<f:layout>
<f:ResponsiveGridLayout labelSpanXL="3" labelSpanL="3" labelSpanM="3" labelSpanS="12"
adjustLabelSpan="false" emptySpanXL="4" emptySpanL="4" emptySpanM="4" emptySpanS="0" columnsXL="1"
columnsL="1" columnsM="1" singleContainerFullSize="false" />
</f:layout>
<f:formContainers>
<f:FormContainer>
<f:formElements>
<f:FormElement label="ID">
<f:fields>
<Text text="{ID}" />
</f:fields>
</f:FormElement>
<f:FormElement label="Nome">
<f:fields>
<Text text="{Nome}" />
</f:fields>
</f:FormElement>
<f:FormElement label="Telefone">
<f:fields>
<Text text="{Telefone}" />
</f:fields>
</f:FormElement>
<f:FormElement label="UF">
<f:fields>
<Text text="{UF}" />
#MIGRESUACARREIRA
29
</f:fields>
</f:FormElement>
<f:FormElement label="Email">
<f:fields>
<Text text="{Email}" />
</f:fields>
</f:FormElement>
</f:formElements>
</f:FormContainer>
</f:formContainers>
</f:Form>
</VBox>
</semantic:content>
</semantic:SemanticPage>
</mvc:View>
#MIGRESUACARREIRA
30
Implementação de Filtros
Se testamos o filtro pelo nome do cliente verificamos que o mesmo não está
funcionando. Temos que implementar a lógica para aplicar o filtro no backend.
#MIGRESUACARREIRA
31
No Controller vemos a implementação do método de busca.
Nele vemos que o filtro está sendo passado para a propriedade Nome
ClienteSet?$filter=UF eq 'MG'
#MIGRESUACARREIRA
32
Para implementar o filtro, no método CLIENTESET_GET_ENTITYSET temos que
obter os filtros passados pelo FrontEnd e aplicar na consulta ao banco de dados.
SELECT *
FROM ZTAB_CLIENTES
INTO CORRESPONDING FIELDS OF TABLE ET_ENTITYSET
WHERE (LS_WHERE).
CASE LV_FILTER->PROPERTY.
WHEN 'Nome'.
ENDLOOP.
WHEN OTHERS.
ENDCASE.
ENDLOOP.
SELECT *
FROM ZTAB_CLIENTES
INTO CORRESPONDING FIELDS OF TABLE ET_ENTITYSET
WHERE NOME IN LR_NOME .
#MIGRESUACARREIRA
33
Após mudanças no backend, nosso filtro deve estar funcionando.
#MIGRESUACARREIRA
34
Implementação de Ordenação
ClienteSet?$orderby=ID desc
#MIGRESUACARREIRA
35
MODO 1 CLASSE ACESSÓRIA
“MONTAGEM DOS FILTROS
...
"ORDENAÇÃO
DATA: LV_DB_ORDERBY TYPE STRING.
DATA(LT_ORDERBY) = IO_TECH_REQUEST_CONTEXT->GET_ORDERBY( ).
IF LS_ORDERBY->ORDER EQ 'desc'.
DATA(LV_SORT_ORDER) = 'DESCENDING'.
ELSE.
LV_SORT_ORDER = 'ASCENDING'.
ENDIF.
CONCATENATE
LV_DB_ORDERBY
LS_ORDERBY->PROPERTY
LV_SORT_ORDER
ENDLOOP.
SELECT *
FROM ZTAB_CLIENTES
INTO CORRESPONDING FIELDS OF TABLE ET_ENTITYSET WHERE
NOME IN LR_NOME
ORDER BY (LV_DB_ORDERBY) .
#MIGRESUACARREIRA
36
MODO 2 MANUAL
“MONTAGEM DOS FILTROS
...
CASE LV_REF_ORDER->PROPERTY.
WHEN 'Nome'.
DATA(LV_DB_FIELD) = 'NOME'.
ENDCASE.
DATA(LV_ORDER) = LV_REF_ORDER->ORDER.
CASE LV_ORDER.
WHEN 'DESC'.
DATA(LV_DB_ORDER) = 'DESCENDING'.
WHEN OTHERS.
LV_DB_ORDER = 'ASCENDING'.
ENDCASE.
CONCATENATE
LV_DB_FIELD
LV_DB_ORDER
INTO
DATA(LV_ORDER_BY)
SEPARATED BY
SPACE.
ENDLOOP.
SELECT *
FROM ZTAB_CLIENTES
INTO CORRESPONDING FIELDS OF TABLE ET_ENTITYSET
WHERE NOME IN LR_NOME.
WHERE NOME IN LR_NOME
ORDER BY (LV_ORDER_BY).
#MIGRESUACARREIRA
37
Após mudanças no backend, a ordenação vai estar funcionando.
#MIGRESUACARREIRA
38
Implementação da Paginação
#MIGRESUACARREIRA
39
Para implementar a paginação, no método CLIENTESET_GET_ENTITYSET temos que
obter os dados de paginação. Estes campos estão nos parâmetros de entrada do
método.
MODO 1 – PARA USO EM TABELAS
POR CAUSA DO “UP TO X ROWS”
“MONTAGEM DOS FILTROS
...
* CONTAGEM
IF IO_TECH_REQUEST_CONTEXT->HAS_COUNT( ) = ABAP_TRUE.
SELECT COUNT(*)
FROM ZTAB_CLIENTES
INTO @DATA(LV_COUNT)
WHERE NOME IN @LR_NOME.
ES_RESPONSE_CONTEXT-COUNT = LV_COUNT.
ELSE.
SELECT *
FROM ZTAB_CLIENTES
UP TO LV_UP_TO ROWS
IF IS_PAGING-SKIP > 0.
DELETE ET_ENTITYSET FROM 1 TO IS_PAGING-SKIP.
ENDIF.
#MIGRESUACARREIRA
40
MODO 2 – PARA USO EM BAPIS
PORQUE BAPI RETORNA A LISTA INTEIRA
“MONTAGEM DOS FILTROS
...
SELECT *
FROM ZTAB_CLIENTES
INTO CORRESPONDING FIELDS OF TABLE LT_CLIENTES WHERE
NOME IN LR_NOME
ORDER BY (LV_DB_ORDERBY) .
DATA(LV_INICIO) = 1.
IF IS_PAGING-TOP IS INITIAL.
DATA(LV_FIM) = LINES( LT_CLIENTES ).
ELSE.
LV_FIM = LV_INICIO + IS_PAGING-TOP - 1.
ENDIF.
ENDIF.
#MIGRESUACARREIRA
41
ASSOCIAÇÕES E
NAVEGAÇÃO
NO SERVIÇO
ODATA
#MIGRESUACARREIRA
42
Adicionando Associações no Modelo OData
• Transação SEGW.
• Criamos a Entidade
#MIGRESUACARREIRA
43
• Informar Associated Type como DATS
• Continuar
#MIGRESUACARREIRA
44
• Na entidade Cliente, adicionamos em
Navigation Properties o registro:
• Name vendas
• Relationship Name ClienteToVendas
• ABAP Field Name VENDAS
Gravamos e Geramos.
Verificamos que os metadados foram atualizados .
#MIGRESUACARREIRA
45
Implementando Expansões (Cliente/vendas)
"SELEÇÃO DE CAMPOS
DATA(LT_SELECT) = IO_TECH_REQUEST_CONTEXT->GET_SELECT_WITH_MANDTRY_FIELDS( ).
"FILTRO DE CAMPOS
DATA(LV_WHERE) = IO_TECH_REQUEST_CONTEXT->GET_OSQL_WHERE_CLAUSE_CONVERT( ).
SELECT (LT_SELECT)
FROM ZTAB_VENDAS_CAB
INTO CORRESPONDING FIELDS OF TABLE ET_ENTITYSET
WHERE (LV_WHERE)
ORDER BY ID .
http://lnl-s4h.opustech.com.br:8000/sap/opu/odata/sap/ZLOJA_SRV/VendaSet/$count
http://lnl-
s4h.opustech.com.br:8000/sap/opu/odata/sap/ZLOJA_SRV/VendaSet/?$filter=substringof('milho',
Descricao)
#MIGRESUACARREIRA
46
Para corrigir, devemos adaptar o método VENDASET_GET_ENTITYSET já
implementado.
DATA(LV_ENTITYSET) = IO_TECH_REQUEST_CONTEXT-
>GET_SOURCE_ENTITY_SET_NAME( ).
"SELEÇÃO DE CAMPOS
DATA(LT_SELECT) = IO_TECH_REQUEST_CONTEXT-
>GET_SELECT_WITH_MANDTRY_FIELDS( ).
"FILTRO DE CAMPOS
DATA(LV_WHERE) = IO_TECH_REQUEST_CONTEXT-
>GET_OSQL_WHERE_CLAUSE_CONVERT( ).
IF LV_ENTITYSET = 'ClienteSet'.
"IMPLEMENTAÇÃO DA NAVEGAÇÃO
IO_TECH_REQUEST_CONTEXT->GET_CONVERTED_SOURCE_KEYS(
IMPORTING
ES_KEY_VALUES = LS_CLIENTE
).
ELSE.
"IMPLEMENTAÇÃO TRADICIONAL
SELECT (LT_SELECT)
FROM ZTAB_VENDAS_CAB
INTO CORRESPONDING FIELDS OF TABLE ET_ENTITYSET
WHERE (LV_WHERE)
ORDER BY ID .
ENDIF.
#MIGRESUACARREIRA
47
Caso existam múltiplas navegações para a mesma associação, verificar a
propriedade de navegação no parâmetro de entrada
IT_NAVIGATION_PATH.
Exemplo: a associação Vendas-Cliente pode ter as navegações ‘emissor”,
“recebedor”, “pagador”, onde cada navegação vai trazer um tipo de cliente
diferente, mas são todos da entidade cliente.
http://lnl-
s4h.opustech.com.br:8000/sap/opu/odata/sap/ZLOJA_SRV/ClienteSet('000000000
1')/vendas
#MIGRESUACARREIRA
48
ASSOCIAÇÕES E
NAVEGAÇÃO
NO SAPUI5
#MIGRESUACARREIRA
49
Consumindo as Relações no UI5 (Cliente/vendas)
<List
growing="true"
growingScrollToLoad="true"
growingThreshold="20"
id="vendasListCliente"
headerText="{i18n>vendaListCliente}"
class="sapUiResponsiveMargin"
width="auto"
items="{
path : 'vendas',
sorter: {
path: 'DataCriacao',
descending: true
}
}">
<items>
<ObjectListItem
title="{Descricao}"
number="{ValorLiquido}"
numberState="{= ${ValorLiquido} > 500 ? 'Error' : 'Success' }"
>
<attributes>
<ObjectAttribute text="{IDVenda}" />
<ObjectAttribute
text="{
path: 'DataCriacao',
type: 'sap.ui.model.type.Date',
formatOptions:
{
style: 'short',
UTC: true
}
}"
/>
</attributes>
</ObjectListItem>
</items>
</List>
</VBox>
#MIGRESUACARREIRA
50
DEPLOY DO APP
NO SERVIDOR
#MIGRESUACARREIRA
51
Deploy da aplicação no servidor – Report ABAP
Para fazer deploy usando o SAP GUI, existe na transação SE38 o report
/UI5/UI5_REPOSITORY_LOAD
• Transação se38
• Programa /UI5/UI5_REPOSITORY_LOAD
• Parâmetros seleção:
• Informar o nome da aplicação a criar/atualizar.
• Selecionar <Carregar>
• Ajustar fins de linha
• <F8>
#MIGRESUACARREIRA
52
• Indicar o caminho completo até pasta webapp, contendo os arquivos do app
#MIGRESUACARREIRA
53
• Rolar a tela até o final
• clicar em <Clicar aqui para upload>
#MIGRESUACARREIRA
54
Se tudo correr bem, o upload será encerrado.
#MIGRESUACARREIRA
55
• Indexar a App utilizando o seguinte programa na SE38:
/UI5/APP_INDEX_CALCULATE
Clique em Executar
#MIGRESUACARREIRA
56
#MIGRESUACARREIRA
57