Histórico da Página
...
Abaixo temos um exemplo de API REST que possuí duas procedurescom suas procedures que são:
- pGetMetaData que retorna os metadados do campos em questão;
- pGetAll pFindAll que retorna os valores dos campos em questão;
- pFindById que retorna um registro de um determinado ID;
- pCreate que cria um novo registro;
- pUpdateById que altera um registro de um determinado ID;
- pDeleteById que elimina 1 ou mais registros.
Como podemos verificar essas duas procedures possuem chamadas para o programa de UPC:
Bloco de código | ||||
---|---|---|---|---|
| ||||
/** Procedure que retorna a metadata **/ PROCEDURE pGetMetaData: DEFINE INPUT PARAMETER oJsonInput AS JsonObject NO-UNDO. DEFINE OUTPUT PARAMETER oJsonOutput AS JsonObject NO-UNDO. ... // montaMonta a lista de campos que aparecerão em tela oObj = new JsonObject(). oObj:add('root', jAList). //* realizaRealiza a chamada da UPC Progress */ {include/i-epcrest.i &endpoint=getMetaData &event=getMetaData &jsonVar=oObj} oIdiomas = oObj:getJsonArray('root'). // Monta o retorno para o HTML oResponse = NEW JsonAPIResponse(oIdiomas). oJsonOutput = oResponse:createJsonResponse(). ... END PROCEDURE. PROCEDURE pGetAll/** Procedure que retorna os valores **/ PROCEDURE pFindAll: DEFINE INPUT PARAMETER oJsonInput AS JsonObject NO-UNDO. DEFINE OUTPUT PARAMETER oJsonOutput AS JsonObject NO-UNDO. ... // Monta a lista de registros a serem enviados oIdiomas = JsonAPIUtils:convertTempTableToJsonArray(TEMP-TABLE ttIdiomas:HANDLE). oObj = new JsonObject(). oObj:add('root', oIdiomas). /*/ realiza a chamada da UPC Progress */ {include/i-epcrest.i &endpoint=getAll &event=getAll &jsonVar=oObj} oIdiomas = oObj:getJsonArray('root'). // Monta o retorno para o HTML oResponse = NEW JsonAPIResponse(oIdiomas). oJsonOutput = oResponse:createJsonResponse(). ... END PROCEDURE. |
Programa UPC:
Abaixo temos um exemplo de uma UPC criada para a API REST:
/** Procedure que retorna 1 registro pelo ID **/
PROCEDURE pFindById:
DEFINE INPUT PARAMETER oJsonInput AS JsonObject NO-UNDO.
DEFINE OUTPUT PARAMETER oJsonOutput AS JsonObject NO-UNDO.
...
// Le os parametros enviados pela interface HTML
oRequest = NEW JsonAPIRequestParser(oJsonInput).
// Obtem o ID
cId = oRequest:getPathParams():getCharacter(2).
// Localiza o registro na tabela IDIOMA pelo ID (recid)
FIND FIRST idioma
WHERE RECID(idioma) = INT(cId)
NO-LOCK NO-ERROR.
IF AVAILABLE idioma THEN DO:
BUFFER-COPY idioma TO ttIdiomas.
ASSIGN ttIdiomas.id = RECID(idioma).
END.
// Obtem um jsonArray com base no conteudo da temp-table
oIdioma = JsonAPIUtils:convertTempTableFirstItemToJsonObject(TEMP-TABLE ttIdiomas:HANDLE).
// Realiza a chamada da UPC Progress
{include/i-epcrest.i &endpoint=findById &event=findById &jsonVar=oIdioma}
// Retorna o registro customizado ou nao para a interface HTML
oResponse = NEW JsonAPIResponse(oIdioma).
oJsonOutput = oResponse:createJsonResponse().
END PROCEDURE.
/** Procedure que cria um novo registro na tabela **/
PROCEDURE pCreate:
DEFINE INPUT PARAMETER oJsonInput AS JsonObject NO-UNDO.
DEFINE OUTPUT PARAMETER oJsonOutput AS JsonObject NO-UNDO.
...
// Le os parametros e os dados enviados pela interface HTML
oRequest = NEW JsonAPIRequestParser(oJsonInput).
oBody = oRequest:getPayload().
// Obtem os demais dados
cCodIdioma = oBody:getCharacter("codIdioma") NO-ERROR.
cDesIdioma = oBody:getCharacter("desIdioma") NO-ERROR.
cCodIdiomPadr = oBody:getCharacter("codIdiomPadr") NO-ERROR.
// Cria o registro na tabela IDIOMA
DO TRANSACTION
ON ERROR UNDO, LEAVE:
FIND FIRST idioma
WHERE idioma.cod_idioma = cCodIdioma
NO-LOCK NO-ERROR.
IF NOT AVAILABLE idioma THEN DO:
CREATE idioma.
ASSIGN idioma.cod_idioma = cCodIdioma
idioma.des_idioma = cDesIdioma
idioma.cod_idiom_padr = cCodIdiomPadr
idioma.dat_ult_atualiz = TODAY
idioma.hra_ult_atualiz = STRING(TIME,"HH:MM:SS")
rIdioma = RECID(idioma)
lCreated = TRUE.
// Realiza a chamada da UPC Progress para a criacao do
// registro customizado. Nao utilizaremos o retorno da UPC
// neste caso.
{include/i-epcrest.i &endpoint=create &event=afterCreate &jsonVar=oBody}
RELEASE idioma.
END.
END.
// Retorna o ID e se foi criado com sucesso
oBody = NEW JsonObject().
oBody:add('id', rIdioma).
oBody:add('created', (IF lCreated THEN 'OK' ELSE 'NOK')).
// Retorna o oBody montado para a interface HTML
oResponse = NEW JsonAPIResponse(oBody).
oJsonOutput = oResponse:createJsonResponse().
END PROCEDURE.
/** Procedure que atualiza o conteudo do registro pelo ID **/
PROCEDURE pUpdateById:
DEFINE INPUT PARAMETER oJsonInput AS JsonObject NO-UNDO.
DEFINE OUTPUT PARAMETER oJsonOutput AS JsonObject NO-UNDO.
...
// Le os parametros e os dados enviados pela interface HTML
oRequest = NEW JsonAPIRequestParser(oJsonInput).
oBody = oRequest:getPayload().
// Obtem o ID
cId = oRequest:getPathParams():getCharacter(1).
// Obtem os demais dados
cCodIdioma = oBody:getCharacter("codIdioma") NO-ERROR.
cDesIdioma = oBody:getCharacter("desIdioma") NO-ERROR.
cCodIdiomPadr = oBody:getCharacter("codIdiomPadr") NO-ERROR.
// Atualiza o registro na tabela IDIOMA pelo ID (recid)
DO TRANSACTION
ON ERROR UNDO, LEAVE:
FIND FIRST idioma
WHERE RECID(idioma) = INT(cId)
EXCLUSIVE-LOCK NO-ERROR.
IF AVAILABLE idioma THEN DO:
ASSIGN idioma.des_idioma = cDesIdioma
idioma.cod_idiom_padr = cCodIdiomPadr
idioma.dat_ult_atualiz = TODAY
idioma.hra_ult_atualiz = STRING(TIME,"HH:MM:SS")
lUpdated = TRUE.
// Realiza a chamada da UPC Progress para atualizar o registro
// na tabela cutomizada ou nao. Nao utilizaremos o retorno da UPC
// neste caso.
{include/i-epcrest.i &endpoint=update &event=afterUpdate &jsonVar=oBody}
END.
END.
// Retorna o ID e se foi atualizado com sucesso
oBody = NEW JsonObject().
oBody:add('id', cId).
oBody:add('updated', (IF lUpdated THEN 'OK' ELSE 'NOK')).
// Retorna o oBody montado para a interface HTML
oResponse = NEW JsonAPIResponse(oBody).
oJsonOutput = oResponse:createJsonResponse().
END PROCEDURE.
/** Procedure que atualiza o conteudo do registro pelo ID **/
PROCEDURE pDeleteById:
DEFINE INPUT PARAMETER oJsonInput AS JsonObject NO-UNDO.
DEFINE OUTPUT PARAMETER oJsonOutput AS JsonObject NO-UNDO.
...
// Le os parametros enviados pela interface HTML
oRequest = NEW JsonAPIRequestParser(oJsonInput).
// Eliminacao de registro individual
IF oRequest:getPathParams():length > 0 THEN DO:
// Obtem o ID
cId = oRequest:getPathParams():getCharacter(1).
RUN piDeleteRecord (cId).
ASSIGN lDeleted = (RETURN-VALUE = "OK").
END.
ELSE DO:
// Eliminacao de registros em lote
oArray = oRequest:getPayloadArray().
DO ix = 1 TO oArray:length:
oObj = oArray:getJsonObject(ix).
cId = STRING(oObj:getInteger('id')).
RUN piDeleteRecord (cId).
IF lDeleted = FALSE THEN
ASSIGN lDeleted = (RETURN-VALUE = "OK").
END.
END.
// Retorna o ID e se foi criado com sucesso
oObj = NEW JsonObject().
IF oRequest:getPathParams():length > 0 THEN DO:
oObj:add('id', cId).
END.
oObj:add('deleted', (IF lDeleted THEN 'OK' ELSE 'NOK')).
// Retorna o oBody montado para a interface HTML
oResponse = NEW JsonAPIResponse(oObj).
oJsonOutput = oResponse:createJsonResponse().
END PROCEDURE.
PROCEDURE piDeleteRecord:
DEFINE INPUT PARAMETER cId AS CHARACTER NO-UNDO.
DEFINE VARIABLE oObj AS JsonObject NO-UNDO.
DEFINE VARIABLE lDeleted AS LOGICAL NO-UNDO INITIAL FALSE.
LOG-MANAGER:WRITE-MESSAGE("Eliminando registro -> " + cId, ">>>>>").
// Elimina o registro na tabela IDIOMA pelo ID (recid)
DO TRANSACTION
ON ERROR UNDO, LEAVE:
FIND FIRST idioma
WHERE RECID(idioma) = INT(cId)
EXCLUSIVE-LOCK NO-ERROR.
IF AVAILABLE idioma THEN DO:
// Monta a chave estrangeira para enviar para UPC
// poder elominar o registro da tabela customizada
oObj = NEW JsonObject().
oObj:add('codIdioma', idioma.cod_idioma).
// Realiza a chamada da UPC Progress para a eliminacao do
// registro customizado. Nao utilizaremos o retorno da UPC
// neste caso.
{include/i-epcrest.i &endpoint=delete &event=beforeDelete &jsonVar=oObj}
DELETE idioma.
ASSIGN lDeleted = TRUE.
END.
END.
RETURN (IF lDeleted THEN "OK" ELSE "NOK").
END PROCEDURE. |
Programa UPC:
Abaixo temos um exemplo de uma UPC criada para a API REST:
Bloco de código | ||||
---|---|---|---|---|
| ||||
/**************************************************************************
** idiomas_upc.p - Exemplo de epc para Endpoints REST
***************************************************************************/
USING PROGRESS.json.*.
USING PROGRESS.json.ObjectModel.*.
USING com.totvs.framework.api.*.
DEFINE INPUT PARAMETER pEndPoint AS CHARACTER NO-UNDO.
DEFINE INPUT PARAMETER pEvent AS CHARACTER NO-UNDO.
DEFINE INPUT PARAMETER pAPI AS CHARACTER NO-UNDO.
DEFINE INPUT-OUTPUT PARAMETER jsonIO AS JSONObject NO-UNDO.
DEFINE VARIABLE jAList AS JsonArray NO-UNDO.
DEFINE VARIABLE jObj AS JsonObject NO-UNDO.
DEFINE VARIABLE hBuf AS HANDLE NO-UNDO.
DEFINE VARIABLE ix AS INTEGER NO-UNDO.
DEFINE VARIABLE iTot AS INTEGER NO-UNDO.
DEFINE VARIABLE cType AS CHARACTER NO-UNDO.
// carrega as definicoes dos campos da tabela
IF pEndPoint = "getMetaData"
AND pEvent = "getMetaData" THEN DO ON STOP UNDO, LEAVE:
// Obtem a lista de campos e valores
ASSIGN jAList = jsonIO:getJsonArray('root').
// Cria os novos campos na lista
ASSIGN jObj = NEW JsonObject().
jObj:add('property', 'codUsuario').
jObj:add('label', 'Usuário').
jObj:add('visible', TRUE).
jObj:add('required', TRUE).
jObj:add('type', JsonAPIUtils:convertAblTypeToHtmlType('character')).
jObj:add('gridColumns', 6).
jAList:add(jObj).
ASSIGN jObj = NEW JsonObject().
jObj:add('property', 'nomUsuario').
jObj:add('label', 'Nome').
jObj:add('visible', TRUE).
jObj:add('required', TRUE).
jObj:add('type', JsonAPIUtils:convertAblTypeToHtmlType('character')).
jObj:add('gridColumns', 6).
jAList:add(jObj).
ASSIGN jObj = NEW JsonObject().
jObj:add('property', 'codDialet').
jObj:add('label', 'Dialeto').
jObj:add('visible', TRUE).
jObj:add('required', TRUE).
jObj:add('type', JsonAPIUtils:convertAblTypeToHtmlType('character')).
jObj:add('gridColumns', 6).
jAList:add(jObj).
// Retorna a nova lista com os campos customizados
jsonIO:Set("root", jAList).
END.
// carrega os valores dos campos da tabela
IF pEndPoint = "findAll"
AND pEvent = "findAll" THEN DO ON STOP UNDO, LEAVE:
// Obtem a lista de campos e valores
ASSIGN jAList = jsonIO:getJsonArray('root').
FIND FIRST usuar_mestre NO-LOCK NO-ERROR.
// Armazena o tamanho da lista em variavel para evitar LOOP devido a adicionar novos itens na lista
ASSIGN iTot = jAList:length.
DO ix = 1 TO iTot:
ASSIGN jObj = jAList:GetJsonObject(ix).
// Alimenta os novos dados
IF AVAILABLE usuar_mestre THEN DO:
jObj:add('codUsuario', usuar_mestre.cod_usuario) NO-ERROR.
jObj:add('nomUsuario', usuar_mestre.nom_usuario) NO-ERROR.
jObj:add('codDialet', usuar_mestre.cod_dialet) NO-ERROR.
END.
// Atualiza o objeto na lista
jAList:set(ix, jObj).
FIND NEXT usuar_mestre NO-LOCK NO-ERROR.
END | ||||
Bloco de código | ||||
| ||||
/************************************************************************** ** idiomas_upc.p - Exemplo de epc para Endpoints REST ***************************************************************************/ USING PROGRESS.json.*. USING PROGRESS.json.ObjectModel.*. USING com.totvs.framework.api.*. DEFINE INPUT PARAMETER pEndPoint AS CHARACTER NO-UNDO. DEFINE INPUT PARAMETER pEvent AS CHARACTER NO-UNDO. DEFINE INPUT PARAMETER pAPI AS CHARACTER NO-UNDO. DEFINE INPUT-OUTPUT PARAMETER jsonIO AS JSONObject NO-UNDO. DEFINE VARIABLE jAList AS JsonArray NO-UNDO. DEFINE VARIABLE jObj AS JsonObject NO-UNDO. DEFINE VARIABLE hBuf AS HANDLE NO-UNDO. DEFINE VARIABLE ix AS INTEGER NO-UNDO. DEFINE VARIABLE iTot AS INTEGER NO-UNDO. DEFINE VARIABLE cType AS CHARACTER NO-UNDO. // carrega as definicoes dos campos da tabela IF pEndPoint = "getMetaData" AND pEvent = "getMetaData" THEN DO ON STOP UNDO, LEAVE: // obtem a lista de campos e valores ASSIGN jAList = jsonIO:getJsonArray('root'). // criaRetorna umo bufferjson daROOT tabelaa paralista obternova oscom camposnovos dadados tabelacustomizados usuar_mestre CREATE BUFFER hBuf FOR TABLE 'usuar_mestre'. DO ix = 1 TO hBuf:NUM-FIELDS: jsonIO:Set("root", jAList). END. IF pEndPoint = "findById" AND pEvent = "findById" THEN //DO ignoraON osSTOP campos que nao estao nesta lista IF NOT CAN-DO("nom_usuario,cod_usuario,cod_dialet", hBuf:BUFFER-FIELD(ix):NAME) THENUNDO, LEAVE: // Obtem as informacoes necessarias da API para retornar dados cCodIdioma = jsonIO:getCharacter("codIdioma"). // NEXT.chave estrangeira // Adiciona os valores da tabela customizada no retorno // monta aFIND formatacaoFIRST do item usuar_mestre NO-LOCK NO-ERROR. IF AVAILABLE usuar_mestre ASSIGN jObj = NEW JsonObject().THEN DO: jObjjsonIO:add('propertycodUsuario', JsonAPIUtils:convertToCamelCase(hBuf:BUFFER-FIELD(ix):NAME))usuar_mestre.cod_usuario) NO-ERROR. jObjjsonIO:add('labelnomUsuario', hBuf:BUFFER-FIELD(ix):Label) usuar_mestre.nom_usuario) NO-ERROR. jObjjsonIO:add('visiblecodDialet', TRUE)usuar_mestre.cod_dialet) NO-ERROR. END. END. IF pEndPoint = "create" AND pEvent = "afterCreate" THEN DO ON STOP UNDO, LEAVE: // ajusta o tipo Obtem as informacoes necessarias da API para criacao do registro cCodIdioma = jsonIO:getCharacter("codIdioma") NO-ERROR. // chave estrangeira ASSIGN cTypecCodUsuario = JsonAPIUtilsjsonIO:convertAblTypeToHtmlType(hBuf:BUFFER-FIELD(ix):type)getCharacter("codUsuario") NO-ERROR. cNomUsuario = jObjjsonIO:add('type', cType)getCharacter("nomUsuario") NO-ERROR. cCodDialet = jsonIO:getCharacter("codDialet") NO-ERROR. // logica de CREATE // adiciona o objeto/* naEm lista comentario a logica para nao jAList:add(jObj).criar registros desnecessariamente END.FIND FIRST usuar_mestre hBuf:BUFFER-RELEASE(). DELETE OBJECT hBuf.WHERE usuar_mestre.cod_usuario = cCodUsuario // retorna a nova lista com os campos adicionados jsonIO:Set("root", jAList). END. // carrega os valores dos campos da tabela IF pEndPoint = "getAll" AND pEvent = "getAll" THEN DO ON STOP UNDO, LEAVE: // obtem a lista de campos e valores ASSIGN jAList = jsonIO:getJsonArray('root'). FIND FIRST usuar_mestre NO-LOCK NO-ERROR. EXCLUSIVE-LOCK NO-ERROR. IF NOT AVAILABLE usuar_mestre THEN DO: ASSIGN usuar_mestre.nom_usuario = cNomUsuario usuar_mestre.cod_dialet = cCodDialet. END. */ END. IF pEndPoint = "update" AND pEvent = "afterUpdate" THEN DO ON STOP UNDO, LEAVE: // Obtem quardadoas oinformacoes tamanhonecessarias da listaAPI em variavel para evitaratualizacao LOOP devido a adicionar novos itens na lista cCodIdioma = ASSIGN iTot = jAList:length. jsonIO:getCharacter("codIdioma") NO-ERROR. // chave estrangeira DOcCodUsuario ix = 1 TO iTot: = jsonIO:getCharacter("codUsuario") NO-ERROR. cNomUsuario = jsonIO:getCharacter("nomUsuario") NO-ERROR. ASSIGNcCodDialet jObj = jAListjsonIO:GetJsonObjectgetCharacter(ix)"codDialet") NO-ERROR. // logica de UPDATE //* alimentaEm oscomentario novosa dados logica para nao alterar tabelas desnecessariamente IF FIND AVAILABLEFIRST usuar_mestre THEN DO: jObj:add('codUsuario',WHERE usuar_mestre.cod_usuario) = cCodUsuario EXCLUSIVE-LOCK NO-ERROR. IF AVAILABLE usuar_mestre THEN DO: jObj:add('nomUsuario',ASSIGN usuar_mestre.nom_usuario) NO-ERROR. = cNomUsuario jObj:add('codDialet', usuar_mestre.cod_dialet) NO-ERROR. = cCodDialet. END. */ END. IF pEndPoint = "delete" AND pEvent = "beforeDelete" THEN //DO adicionaON oSTOP objeto na listaUNDO, LEAVE: // obtem as jAList:add(jObj). informacoes necessarias da API para eliminacao cCodIdioma = FIND NEXT usuar_mestre NO-LOCK NO-ERROR.jsonIO:getCharacter("codIdioma"). // chave estrangeira END. // devolvelogica parade oDELETE json ROOT a lista/* novaEm comcomentario novosa objetoslogica para nao eliminar jsonIO:Set("root", jAList). END. IF pEndPoint = "getOne" AND pEvento registro desnecessariamente FIND FIRST usuar_mestre = "getOne" THEN DO ON STOP UNDO, LEAVE: WHERE usuar_mestre.cod_usuario = cCodUsuario // nao implementado END. IF pEndPoint = "create" AND pEventEXCLUSIVE-LOCK NO-ERROR. IF AVAILABLE usuar_mestre THEN DO: = "afterCreate" THEN DO ON STOP UNDO, LEAVE:delete usuar_mestre. END. *// nao implementado END. /* fim */ |
Resultado ao chamar ao API tendo uma UPC cadastrada:
...
Bloco de código | ||||||
---|---|---|---|---|---|---|
| ||||||
import { Component } from '@angular/core'; import { PoMenuItem } from '@po-ui/ng-components'; import { PoBreadcrumb } from '@po-ui/ng-components'; import { PoPageDynamicDetailActions} from '@po-ui/ng-templates'; @Component({ selector: 'app-idioma-dynamic', templateUrl: './idioma-dynamic.component.html', styleUrls: ['./idioma-dynamic.component.css'] }) export class IdiomaDynamicComponent { public readonly serviceApi = 'http://localhost:8180/dts/datasul-rest/resources/prg/trn/v1/idiomas'; public readonly actions: PoPageDynamicDetailActions = { back: '/documentation/po-page-dynamic-table' }; public readonly breadcrumb: PoBreadcrumb = { items: [ { label: 'Home', link: '/' }, { label: 'People', link: '/documentation/po-page-dynamic-table' }, { label: 'Detail' } ] }; } |
View file | ||||
---|---|---|---|---|
|
View file | ||||
---|---|---|---|---|
|
06. Facilitadores Progress
...
Visão Geral
Import HTML Content
Conteúdo das Ferramentas
Tarefas