Árvore de páginas

Versões comparadas

Chave

  • Esta linha foi adicionada.
  • Esta linha foi removida.
  • A formatação mudou.

...

É possível configurar a pesquisa simple e avançada através da configuração:

PropriedadeObrigatoriedadeDescrição
campoBuscaOpcional

Campo para busca rápida.

camposBuscaAvancadaOpcional

Lista de campos para busca avançada, o sistema vai utilizar o titulo da SX3. Se informar fieldsBuscaAvancada essa propriedade é ignorada.

fieldsBuscaAvancada Opcional

Array de json com os campos do para utilizar na busca avançada. Cada campo deve ter as propriedades property, type e label. (PoDynamicFormField)

03.02. CONFIGURAÇÃO DE DETALHES

...

PropriedadeObrigatoriedadeDescrição
tituloPaginaObrigatórioTitulo apresentado na pagina de detalhes.
tituloAbaPrincipalObrigatórioTitulo apresentado na aba principal.
camposDetalhesObrigatórioLista de campos que serão apresentados, o sistema vai utilizar o titulo da SX3. Se informar ffieldsDetalhes essa propriedade é ignorada.
fieldsDetalhesOpcionalArray de json com os campos do browse. Cada campo deve ter as propriedades property, type e label. (PoTableColumn)
tituloAbaItensObrigatórioTitulo apresentado na aba itens.
funcaoQueryItensObrigatórioUser funcion que vai retornar a query dos itens.
tabelaItensObrigatórioAlias dos itens.
colunasObrigatório

Lista de campos do browse, o sistema vai utilizar o titulo da SX3. Se informar fields essa propriedade é ignorada.

fieldsObrigatório

Array de json com os campos do browse. Cada campo deve ter as propriedades property, type e label. (PoTableColumn)

...

04. USER FUNCTION QUERY

A função passada na propriedade 'funcaoQuery' será chamada pelo portal do cliente e aguarda a query que será executada para buscar os dados do menu customizado.

...

  e  'funcaoQueryItens' serão chamadas pelo Portal do cliente par que retorne a query customizada para busca dos itens. 

funcaoQuery recebe os parâmetros: 

PARAMIXB

Tipo

Descrição

1º PosiçãoArrayContém um Array com as chaves (FILIAL+CODIGO+LOJA) dos clientes selecionados no portal. 

Cada posição do Array contém um objeto Json com as propriedades: filial, codigo e loja.

2º PosiçãoCaracterUsuário de login do Portal do cliente

Retorno do ponto de entrada:

A função deve retornar a query personalizada:

...

Query personalizada para listagem dos registros do menu customizado.

Aviso
titleAtenção
  • A seção SELECT da query deve contar a sintaxe #QueryFields# para uso interno em sua execução.
  • A seção WHARE da query deve contar a sintaxe #QueryWhere# para uso interno em sua execução.

04. DESCRIÇÃO 'funcaoQueryItens - PCITEM'

A função passada na propriedade 'funcaoQueryItens' será chamada pelo portal do cliente e aguarda a query que será executada para buscar os dados detalhados.

...

PARAMIXB

...

Tipo

...

Descrição

...

Cada posição do Array contém um objeto Json com as propriedades: filial, codigo e loja.

...

funcaoQueryItens recebe os parâmetros: 

PARAMIXB

Tipo

Descrição

1º PosiçãoArrayContém um Array com as chaves (FILIAL+CODIGO+LOJA) dos clientes selecionados no portal. 

Cada posição do Array contém um objeto Json com as propriedades: filial, codigo e loja.

2º PosiçãoCaracterUsuário de login do Portal do cliente
2º PosiçãoJson

json da linha selecionada no formato "{ Campo: Valor} " Ex.: "{E1_FILIAL: '01', E1_NUM: '000001'}"


Retorno do ponto de entrada:

A função deve retornar a query personalizada:

Deverá ser utilizado os Id's:

#QueryFields# Campos do SELECT, existe tratamento para o FIELDS no QueryParam
#QueryWhere# Condições do WHERE, existe tratamento para FILTER no QueryParam


Retorno do ponto de entrada:

A função deve retornar a query personalizada:

  • A seção SELECT da query deve contar a sintaxe #QueryFields# para uso interno em sua execução.
  • A seção WHARE da query deve contar a sintaxe #QueryWhere# para uso interno em sua execução

    .

    TipoObrigatoriedadeDescrição
    CaractereObrigatório

    Query personalizada para listagem dos registros do menu customizado.

    Aviso
    titleAtenção

    05. EXEMPLO DE UTILIZAÇÃO

    Bloco de código
    languagejava
    themeMidnight
    firstline1
    titlePCBROWSE
    linenumberstrue
    collapsetrue
    #Include 'Protheus.ch'
    
    user Function PCBROWSE()
    	Local aMenu := {} as Array
    
    	aAdd(aMenu, MENU1())
    	aAdd(aMenu, MENU2())
    
    Return aMenu
    
    
    Static Function MENU1()
    	Local jMenu     := JsonObject():new() as Json
    	Local jDetalhes := JsonObject():new() as Json
    	//titulo apresentado no menu
    	jMenu['tituloMenu'] := 'Pedidos'
    	//icone para o menu, lista de icones https://po-ui.io/guides/icons
    	jMenu['iconeMenu']  := 'po-icon po-icon-manufacture'
    	//titulo apresentado na pagina
    	jMenu['tituloPagina'] := 'Meus Pedidos'
    	//user funcion que vai retornar a query de busca
    	jMenu['funcaoQuery'] := 'PCQRY01'
    	//alias da tabela utilizada para tratamentos internos
    	jMenu['tabela'] := 'SC5'
    	//lista de campos do browse, o sistema vai utilizar o titulo da SX3. Se informar fields essa propriedade é ignorada
    	jMenu['colunas'] := {'c5_filial', 'c5_condpag', 'c5_num', 'c5_vend1', 'c5_nota', 'c5_emissao'}
    	//configuracao de legendas, array com value, color e label
    	jMenu['legendas'] := {}
    	aAdd(jMenu['legendas'], prepareStatus("N", "color-01", "Normal"))
    	aAdd(jMenu['legendas'], prepareStatus("C", "color-02", "Compl.PrecIo/Cantidad"))
    	aAdd(jMenu['legendas'], prepareStatus("I", "color-03", "Compl.ICMS"))
    	aAdd(jMenu['legendas'], prepareStatus("P", "color-04", "Compl.IPI"))
    	aAdd(jMenu['legendas'], prepareStatus("D", "color-05", "Dev.Compras"))
    	aAdd(jMenu['legendas'], prepareStatus("B", "color-06", "Utiliza proveedor"))
    	jMenu['campoLegendas'] := 'c5_tipo'
    	jMenu['tituloLegendas'] := 'Tipo'
    	//campo para busca rapida, Se informar fieldBusca essa propriedade é ignorada
    	jMenu['campoBusca'] := 'c5_num'
    	//lista de campos apra busca avancada, o sistema vai utilizar o titulo da SX3. Se informar fieldsBuscaAvancada essa propriedade é ignorada
    	jMenu['camposBuscaAvancada'] := {'c5_filial', 'c5_vend1', 'c5_nota', 'c5_emissao', 'c5_transp'}
    	
    	//exemplo de configuracao de detalhes
    	//titulo apresentado na pagina de detalhes
    	jDetalhes['tituloPagina'] := 'Detalhes do pedido'
    	//titulo apresentado na aba principal
    	jDetalhes['tituloAbaPrincipal'] := 'Dados gerais'
    	//lista de campos que serao apresentados, o sistema vai utilizar o titulo da SX3. Se informar fieldsDetalhes essa propriedade é ignorada 
    	jDetalhes['camposDetalhes'] := {'c5_num','c5_tipo', 'c5_nota', 'c5_emissao', 'c5_vend1', 'c5_tabela', 'c5_cliente', 'c5_lojacli', 'c5_transp', 'c5_frete', 'c5_seguro',}
    
    	//titulo apresentado na aba itens
    	jDetalhes['tituloAbaItens'] := 'Produtos'
    	//user funcion que vai retornar a query dos itens
    	jDetalhes['funcaoQueryItens'] := 'PCITEM'
    	//alias dos itens
    	jDetalhes['tabelaItens'] := 'SC6'
    	//lista de campos do browse, o sistema vai utilizar o titulo da SX3. Se informar fields essa propriedade é ignorada
    	jDetalhes['colunas'] := {'c6_item', 'c6_produto', 'c6_descri', 'c6_qtdven', 'c6_prcven', 'c6_valor'}
    	
    	
    	jMenu['detalhes'] := jDetalhes
    
    
    return jMenu
    
    Static Function MENU2()
    	Local jMenu     := JsonObject():new() as Json //Json com as propriedades esperadas.
    	Local jDetalhes := JsonObject():new() as Json
    
    	jMenu['tituloMenu']   := 'Pedidos2'
    	jMenu['iconeMenu']    := 'po-icon po-icon-manufacture'
    	jMenu['tituloPagina'] := 'Meus Pedidos2'
    	jMenu['funcaoQuery']  := 'PCQRY01'
    	jMenu['tabela']       := 'SC5'
    	//lista de campos do browse, utilizado quando nao quer pegar dados da SX3.
    	//deve ser um array de json com as propriedades property, type e label
    	jMenu['fields'] := {}
    	aAdd(jMenu['fields'], prepareField("c5_filial", "string", "Filial do pedido"))
    	aAdd(jMenu['fields'], prepareField("c5_num", "string", "Pedido"))
    	aAdd(jMenu['fields'], prepareField("c5_vend1", "string", "Vendedor"))
    	aAdd(jMenu['fields'], prepareField("c5_condpag", "string", "Forma de pagamento"))
    	aAdd(jMenu['fields'], prepareField("c5_nota", "string", "NF"))
    
    	//campo para busca rapida, utilizado quando nao quer pegar dados da SX3.
    	//deve ser um array de json com as propriedades property, type e label
    	jMenu['fieldBusca'] := prepareField("c5_num", "string", "Pesquisa por pedido")
    
    	//lista de campos apra busca avancada, o sistema vai utilizar o titulo da SX3. Se informar fieldsBuscaAvancada essa propriedade é ignorada
    	jMenu['fieldsBuscaAvancada'] := {}
    	aAdd(jMenu['fieldsBuscaAvancada'], prepareField("c5_emissao", "date", "Data"))
    	aAdd(jMenu['fieldsBuscaAvancada'], prepareField("c5_filial", "string", "Filial"))
    	aAdd(jMenu['fieldsBuscaAvancada'], prepareField("c5_nota", "string", "NF"))
    	aAdd(jMenu['fieldsBuscaAvancada'], prepareField("c5_num", "string", "Pedido"))
    
    	//exemplo de configuracao de detalhes
    	//titulo apresentado na pagina de detalhes
    	jDetalhes['tituloPagina'] := 'Detalhes do pedido'
    	//titulo apresentado na aba principal
    	jDetalhes['tituloAbaPrincipal'] := 'Dados gerais'
    	//Utiliza as propriedades PoDynamicViewField do po-dynamic-view poui. https://po-ui.io/documentation/po-dynamic-view
    	jDetalhes['fieldsDetalhes'] := {}
    	aAdd(jDetalhes['fieldsDetalhes'], prepareField('c5_num'    , 'string', 'Pedido'            , 'Dados'     ))
    	aAdd(jDetalhes['fieldsDetalhes'], prepareField('c5_tipo'   , 'string', 'Tipo do pedido'                  ))
    	aAdd(jDetalhes['fieldsDetalhes'], prepareField('c5_nota'   , 'string', 'Nota'                            ))
    	aAdd(jDetalhes['fieldsDetalhes'], prepareField('c5_emissao', 'date'  , 'Data'                            ))
    	aAdd(jDetalhes['fieldsDetalhes'], prepareField('c5_vend1'  , 'string', 'Vendedor'                        ))
    	aAdd(jDetalhes['fieldsDetalhes'], prepareField('c5_tabela' , 'string', 'Tabela de preços'                ))
    	aAdd(jDetalhes['fieldsDetalhes'], prepareField('c5_cliente', 'string', 'Código', 'Comprador'             ))
    	aAdd(jDetalhes['fieldsDetalhes'], prepareField('c5_lojacli', 'string', 'Loja'                            ))
    	aAdd(jDetalhes['fieldsDetalhes'], prepareField('c5_transp' , 'string', 'Código transportadora', 'Entrega'))
    	aAdd(jDetalhes['fieldsDetalhes'], prepareField('c5_frete'  , 'string', 'Valor do frete'                  ))
    	aAdd(jDetalhes['fieldsDetalhes'], prepareField('c5_seguro' , 'string', 'Valor do seguro'                 ))
    
    	//titulo apresentado na aba itens
    	jDetalhes['tituloAbaItens'] := 'Produtos'
    	//user funcion que vai retornar a query dos itens
    	jDetalhes['funcaoQueryItens'] := 'PCITEM'
    	//alias dos itens
    	jDetalhes['tabelaItens'] := 'SC6'
    	//lista de campos do browse, deve ser um array de json com as propriedades property, type e label
    	jDetalhes['fields'] := {}
    	aAdd(jDetalhes['fields'], prepareField('c6_item'   , 'string'  , 'Item'))
    	aAdd(jDetalhes['fields'], prepareField('c6_produto', 'string'  , 'Código'))
    	aAdd(jDetalhes['fields'], prepareField('c6_qtdven' , 'string'  , 'Quantidade'))
    	aAdd(jDetalhes['fields'], prepareField('c6_prcven' , 'currency', 'Preço'))
    	aAdd(jDetalhes['fields'], prepareField('c6_valor'  , 'currency', 'Valor'))
    
    	jMenu['detalhes'] := jDetalhes
    return jMenu
    
    Static Function prepareField(cCampo as Character, cTipo as Character, cTitulo as Character, cDivisor as Character)
    	Local jField  := JsonObject():new() as Json
    	jField["property"] := cCampo
    	jField["type"]     := cTipo
    	jField["label"]    := cTitulo
    	if !Empty(cDivisor)
    		jField["divider"] := cDivisor
    	endIf
    Return jField
    
    Static Function prepareStatus(cValor as Character, cCor as Character, cTitulo as Character)
    	Local jStatus  := JsonObject():new() as Json
    	jStatus["value"] := cValor
    	jStatus["color"] := cCor
    	jStatus["label"] := cTitulo
    Return jStatus
    
    
    user function PCITEM()
        local aSA1    := Paramixb[1] // Clientes
        local cUser   := Paramixb[2] // Login do portal
        local jFilter := Paramixb[3] // Linha selecionada para os detalhes
        local cAlias := "SC6"
    
    
        cQuery := " SELECT #QueryFields#  "
        cQuery += " FROM " + RetSqlName(cAlias) + " " + cAlias
        cQuery += " WHERE  " + cAlias + ".D_E_L_E_T_ = ' ' AND "
        cQuery += " C6_FILIAL = '" + jFilter['C5_FILIAL'] + "' AND "
        cQuery += " C6_NUM = '" + jFilter['C5_NUM'] + "'"
        cQuery += " #QueryWhere# "
    return cQuery
    
    
    User function PCQRY01()
    	local aSA1   := Paramixb[1] //{{"D MG    ", "000002", "02"}, {"D RJ    ", "000002", "12"}}
    	local cLogin := Paramixb[2] // Login do portal
    	local cQuery := ""
    	local cAlias := "SC5"
    	local nCli  := 1
    	local cOr := ""
    
    	cQuery := " SELECT #QueryFields#  "
    	cQuery += " FROM " + RetSqlName(cAlias) + " SC5 "
    	cQuery += " WHERE SC5.D_E_L_E_T_ = ' ' AND "
    	cQuery += "("
    
    	for nCli := 1 to len(aSA1)
    		if (nCli > 1)
    			cOr := " OR "
    		endIf
    		cQuery +=  cOr + "(SC5.C5_CLIENTE = '" + aSA1[nCli][2] + "' AND SC5.C5_LOJACLI = '" + aSA1[nCli][3]+"')" 
    	next
    	cQuery += ")"
    	cQuery += " #QueryWhere# "
    Return cQuery