Função Posicione

Função Posicione

Aprenda a usar a função Posicione do Protheus.

É muito comum você precisar posicionar uma outra tabela para pegar alguma informação.

Hoje vou demostrar o uso da função Posicione em um gatilho e em um inicializador de browse.

Podemos utilizar em Gatilhos, inicializador de browse, Lançamento Padrão (Contabilidade), consultas e Relatórios.

Para nosso exemplo, usaremos a tela de saldo inicial no estoque. Vamos criar um campo virtual para mostrar a descrição do produto.

Lembrando que a mesma sintaxe pode ser usado onde for necessário (Lançamento padrão, consulta, relatórios).

Sintaxe: POSICIONE( <cAlias>, <nOrdem>, <cChave>, <cCampo> )

<cAlias> : Define o alias do arquivo cujo campo terá o seu conteúdo retornado.
<nOrdem>: Define o índice que será utilizado para a pesquisa. Informa-se a ordem do índice.
 <cChave>: Chave de pesquisa utilizada para se encontrar o registro do qual o conteúdo de um determinado campo será retornado.
<cCampo> :  Define o nome do campo cujo conteúdo será retornado.

 

Na aba Opções na opção Inicializador Padrão e Inicializador de Browse colocaremos a função Posicione para que o sistema posicione a tabela de produto e retorne a descrição do produto em questão.

iif(inclui,”,POSICIONE(‘SB1’,1,XFILIAL(‘SB1′)+SB9->B9_COD,’B1_DESC’))

posicione(‘SB1’,1,xFilial(‘SB1′)+SB9->B9_COD,’B1_DESC’)     

Conforme imagem abaixo

01 - Inicializador

 

Agora vamos criar um gatilho e colocar a função Posicione conforme imagem abaixo para assim que informar o código do produto, o sistema retorna a descrição do mesmo no nosso campo.

02 - Gatilho

 

Agora é só abrir o cadastro de saldo inicial e conferir que o campos já esta com o conteúdo (virtual) preenchido conforme inicializador.

03 - TelaSaldoInicial

Com isso concluímos, espero que tenha gostado.

Link TDN: Função Posicione

Dúvidas?! Deixem seus comentários e inscreva-se.

9 comentários

    • Admin

      Legal Leonardo, obrigado por compartilhar.
      E, importante mesmo destacar que o posicione deixa o arquivo com o registro setado, temos mesmo de ter atenção quanto a isto.
      Obrigado pela informação do GetAdvFVal!

  • Felipe

    Olá, achei simples e interessante.
    Porém o meu não funcionou. estou tentando colocar um campo com o NOME CLIENTE no “Nf-e Sefaz” – monitoramento SEFAZ tabela SF2.
    1 – Criei o campo virtual “F2_NCLIENT”
    2 – POSICIONEI ELE NA ORDEM PARA FICAR AO LADO NO COD_CLIENTE NO BROWSE
    3 – SALVEI E CONSEGUI VISUALIZAR O CAMPO VAZIO NO BROWSE
    Inic. Padrão = IIF(INCLUI,”,POSICIONE(‘SA1’,1,XFILIAL(‘SA1′)+SF2->F2_CLIENTE,’F2_NCLIENT’))
    Inic. Browse = POSICIONE(‘SA1’,1,XFILIAL(‘SA1′)+SF2->F2_CLIENTE,’F2_NCLIENT’)

    gatilho = POSICIONE(‘SA1’,1,XFILIAL(‘SA1′)+SF2->F2_CLIENTE,’F2_NCLIENT’)

    porém apresenta erro na abertura da Tela.
    imagino eu como a tela não é de inclusão, eu não precise colocar o INCLUI no INICIALIZADOR PADRÃo. porém tambem não funcinou somente com POSICIONE(‘SA1’,1,XFILIAL(‘SA1′)+SF2->F2_CLIENTE,’F2_NCLIENT’)

    ocorre o erro:

    THREAD ERROR ([8752], felipe, TI01-HP) 07/04/2016 10:28:37
    variable does not exist F2_NCLIENT on POSICIONE(APLIB080.PRW) 17/11/2015 16:09:42 line : 4318

    [TOTVS build: 7.00.131227A-20150911 NG]
    Called from POSICIONE(APLIB080.PRW) 17/11/2015 16:09:42 line : 4318
    Called from { ||POSICIONE('SA1',1,XFILIAL('SA1')+SF2->F2_CLIENTE,'F2_NCLIENT') }(FWMBROWSE.PRW) 27/10/2015 11:03:02
    Called from GETCOLUMNDATA(FWBROWSE.PRW) 09/12/2015 15:12:44 line : 4502
    Called from { |o|

    • Admin

      Olá Felipe,
      Acredito que o erro esta ai no ultimo parâmetro onde você esta usando ‘F2_NCLIENT’ e o correto é colocar o nome do campo lá da tabela de origem ( A1_NOME ). Esse é o conteúdo que você quer que retorno do posicione.

  • Felipe

    Identifiquei que eu estava errando no gatilho. Mas tive outro erro ao arrumar.

    THREAD ERROR ([9068], felipe, TI01-HP) 07/04/2016 10:36:31
    invalid macro source (SSLex0105e: Invalid token, Line 1, Offset 46, ”) :{|a,b,c| FWInitCpo(a,b,c),xRet:=(IIF(INCLUI,”,POSICIONE('SA1',1,XFILIAL('SA1')+SF2->F2_CLIENTE,'F2_NCLIENT'))),FWCloseCpo(a,b,c,.T.),FwSetVarMem(a,b,xRet),xRet } on FWBUILDFEATURE(PROTHEUSFUNCTIONMVC.PRX) 29/12/2015 14:58:26 line : 5719

    • Admin

      Olá Felipe,
      Acredito que o erro esta ai no ultimo parâmetro onde você esta usando ‘F2_NCLIENT’ e o correto é colocar o nome do campo lá da tabela de origem ( A1_NOME ). Esse é o conteúdo que você quer que retorno do posicione.

      Ex.: IIF(INCLUI,”,POSICIONE(‘SA1’,1,XFILIAL(‘SA1′)+SF2->F2_CLIENTE,’A1_NOME’))

  • Igor Sá

    Boa tarde, fiz exatamente como vc disse mas não consegui.

    IIF(INCLUI,”,POSICIONE(‘SB1’,1,XFILIAL(‘SB1′)+SLK->LK_CODIGO,’B1_DESC’))
    POSICIONE(‘SB1’,1,xFilial(‘SB1′)+SLK->LK_CODIGO,’B1_DESC’)

    Estou tentando cricar um campo virtual na tabela SLK, que retorne a descrição do Produto da tabela SB1.
    Aparece o seguinte erro:

    THREAD ERROR (igor.sá, BRARAMVLTI04) 29/07/2016 16:36:35
    invalid macro source (SSLex0105e: Invalid token, Line 1, Offset 46, ”) :({|a,b,c| FWInitCpo(a,b,c),xRet:=(IIF(INCLUI,”,POSICIONE(‘SB1’,1,XFILIAL(‘SB1′)+SLK->LK_CODIGO,’B1_DESC’))),FWCloseCpo(a,b,c,.T.),FwSetVarMem(a,b,xRet),xRet }) on FWBUILDFEATURE(PROTHEUSFUNCTIONMVC.PRX) 22/09/2015 16:08:50 line : 5714

    Pode me ajudar?

  • Igor Sá

    Fiz exatamente como ensinou, mas não consegui.
    Criei o campo virtual LK_DESC na tabela SLK para retornar a descrição do produto (B1_DESC) da tabela SB1.

    Inic. Padrão = IIF(INCLUI,”,POSICIONE(‘SB1’,1,XFILIAL(‘SB1′)+SLK->LK_CODIGO,’B1_DESC’))
    Inic. Browse = POSICIONE(‘SB1’,1,xFilial(‘SB1′)+SLK->LK_CODIGO,’B1_DESC’)
    Gatilho = POSICIONE(‘SB1’,1,xFilial(‘SB1′)+SLK->LK_CODIGO,’B1_DESC’)

    Porém apresenta erro ao executar a rotina do cadastro de código de barras.

    THREAD ERROR (igor.sá, BRARAMVLTI04) 29/07/2016 16:36:35
    invalid macro source (SSLex0105e: Invalid token, Line 1, Offset 46, ”) :({|a,b,c| FWInitCpo(a,b,c),xRet:=(IIF(INCLUI,”,POSICIONE(‘SB1’,1,XFILIAL(‘SB1′)+SLK->LK_CODIGO,’B1_DESC’))),FWCloseCpo(a,b,c,.T.),FwSetVarMem(a,b,xRet),xRet }) on FWBUILDFEATURE(PROTHEUSFUNCTIONMVC.PRX) 22/09/2015 16:08:50 line : 5714

    • Admin

      Olá Igor, Muito obrigado por acompanhar nosso site.
      Acredito que o problema esta na questão das aspas. Quando é copiado e colado do site, pode ser que o browse altere alguma aspa colocando crase, tenta alterar no configurador refazendo essas aspas simples ( apagando e digitando novamente as aspas ).

      Espero que apenas isso pode resolver já que a formula esta aparentemente correta.