PERGUNTAS E RESPOSTAS
 
Bem Vindo, Visitante  Todos os Fórums
  ADVPL
Enviar para a impressoraImprimir  Enviar e-mail para um amigoEnviar Para um Amigo
Precisa estar Logado

Subject Assunto:
POSICIONE
Versão:
.
Plataforma:
.
Complemento:
DB:
.
Complemento:
LinkedIn
Foto
Mensagem do Enviar e-mail Abrir o Perfil do usuário IAN IAN em 18/07/2024, 13:50 h
Local: SP  Registro: 24/06/2024  Postagens: 7
Olá! Estou tentando criar uma user function em um campo na SD1 mas retorna em branco, alguém pode me ajudar:

User Function xVlrOri
    cValor := ‘‘

    cValor := IF(!EMPTY(SD1->D1_NFORI),POSICIONE(‘SD2‘,3, FWXFILIAL(‘SD2‘)+SD1->(D1_NFORI)+SD1->(D1_SERIORI)+SD1->(D1_FORNECE)+SD1->(D1_LOJA)+SD1->(D1_COD)+SD1->(D1_ITEMORI),"D2_PRCVEN"),‘‘)

Return cValor





Mensagem do Enviar e-mail Abrir o Perfil do usuário ROBERTOMEN ROBERTOMEN em 18/07/2024, 16:03 h
Local: PR  Registro: 04/07/2017  Postagens: 544

Boa tarde.

1 - D2_PRCVEN é numerico
2 - D1_ITEMORI tem 4 caracteres e D2_ITEM TEM 2 caracteres

Então:


User Function xVlrOri

cValor := 0

cValor := IF(!EMPTY(SD1->D1_NFORI),POSICIONE(‘SD2‘,3, FWXFILIAL(‘SD2‘)+SD1->D1_NFORI+SD1->D1_SERIORI+SD1->D1_FORNECE+SD1->D1_LOJA+SD1->D1_COD+rtrim(SD1->D1_ITEMORI),"D2_PRCVEN"),0)

Return cValor



Tente ai....

Abs

Foto
Mensagem do Enviar e-mail Abrir o Perfil do usuário IAN IAN em 18/07/2024, 17:56 h
Local: SP  Registro: 24/06/2024  Postagens: 7
Boa tarde! agora me retorna valores zerados...

Sera que o SD1->D1_FORNECE e SD1->D1_LOJA é preenchido no momento da inclusão do Doc de Entrada?



Obrigado pelo retorno, abss

Mensagem do Enviar e-mail Abrir o Perfil do usuário ROBERTOMEN ROBERTOMEN em 19/07/2024, 07:19 h
Local: PR  Registro: 04/07/2017  Postagens: 544
Bom dia.

Precisamos entender aonde você quer colocar esta função, se for na INCLUSÃO do documento de entrada o registro ainda não foi salvo na tabela SD1 e neste caso vc precisará passar para a função as variáveis de memória.

Poste o fonte e oque você deseja fazer ao obter o valor de D2_PRCVEN.





Um detalhe que não vai fazer diferença na funcionalidade mas que foge dos padrões de programação é que a variável cValor como declaramos agora como numérica, deve ser alterado o nome para nValor pois o primeiro caracterer sempre define o tipo.


User Function xVlrOri

nValor := 0

nValor := IF(!EMPTY(SD1->D1_NFORI),POSICIONE('SD2',3, FWXFILIAL('SD2')+SD1->D1_NFORI+SD1->D1_SERIORI+SD1->D1_FORNECE+SD1->D1_LOJA+SD1->D1_COD+rtrim(SD1->D1_ITEMORI),"D2_PRCVEN"),0)

Return nValor

Foto
Mensagem do Enviar e-mail Abrir o Perfil do usuário MARCELLO_W MARCELLO_W em 19/07/2024, 09:18 h
Local: SP  Registro: 13/06/2024  Postagens: 4
bom dia,

vamos tentar ajudar vc, como o Roberto falou, poste aqui um pequeno escopo da sua necessidade, e cole o fonte para podermos entender melhor...

ate

Marcello W.

Foto
Mensagem do Enviar e-mail Abrir o Perfil do usuário IAN IAN em 19/07/2024, 09:41 h
Local: SP  Registro: 24/06/2024  Postagens: 7
Bom dia! Usaria na função retornar, criaria uma coluna ao lado do valor unitário, pois muitas vezes o produto não puxa o valor da nf de origem e com isso fica difícil ter que ir até a rotina nfe-sefaz para consultar nota a nota, se tiver uma coluna com o valor da origem é só alterar com esse valor.

Foto
Mensagem do Enviar e-mail Abrir o Perfil do usuário EMERSON.EN EMERSON.EN em 19/07/2024, 10:49 h
Local: SP  Registro: 20/08/2010  Postagens: 681
então você está utilizando esta rotina durante a edição da nota fiscal.
como dito pelo Roberto, nesse caso você não deve utilizar SD1-> porque os dados ainda não foram gravados na tabela; utilize M->

Não é necessário criar tantas variáveis como eu fiz, mas deixo assim porque acho que fica mais simples de entender.

/*/{Protheus.doc} xVlrOri()
Obtém o valor unitário do produto da nf origem, a partir do produto informado no item atual da nota de entrada, durante a edição da nota.
Muitas vezes esse valor não é preenchido automaticamente pelo Protheus e assim não é necessário consultar o valor em outra rotina do sistema.
@author IAN
@type function
@since 18/07/2024
@params nil
@return numeric, valor unitário do item da nf origem
@obs pode ser utilizado a partir de um gatilho ou ponto de entrada no item da nota de entrada
/*/
User Function xVlrOri()
Local cDocSD2 := M->(D1_NFORI + D1_SERIORI)
Local cCliSD2 := M->(D1_FORNECE + D1_LOJA)
Local cIteSD2 := M->(D1_COD + D1_ITEMORI)
Local cChaveSD2 := FWXFILIAL(‘SD2‘) + cDocSD2 + cCliSD2 + cIteSD2
Local nVlrSD2

    // SD2, IDX 3: D2_FILIAL, D2_DOC, D2_SERIE, D2_CLIENTE, D2_LOJA, D2_COD, D2_ITEM
    nVlrSD2 := IF(!EMPTY(cDocSD2), GetADVFVal(‘SD2‘, ‘D2_PRCVEN‘, cChaveSD2, 3, 0), 0)
    // se não precisar posicionar o ponteiro de registros da SD2, não use a Posicione().
    // https://academiaprotheus.com.br/totvs-advpl-funcao-getadvfval-uma-alternativa-ao-posicione1/

Return cValToChar( nVlrSD2 ) // para retorno numérico, retire a função cValToChar()

Foto
Mensagem do Enviar e-mail Abrir o Perfil do usuário MARCELLO_W MARCELLO_W em 19/07/2024, 12:16 h
Local: SP  Registro: 13/06/2024  Postagens: 4
Onde vc esta chamado essa função ? xVlrOri

Foto
Mensagem do Enviar e-mail Abrir o Perfil do usuário MARCELLO_W MARCELLO_W em 19/07/2024, 12:17 h
Local: SP  Registro: 13/06/2024  Postagens: 4
cola aqui o seu x3 e eos campos envolvidos

Foto
Mensagem do Enviar e-mail Abrir o Perfil do usuário MARCELLO_W MARCELLO_W em 19/07/2024, 12:33 h
Local: SP  Registro: 13/06/2024  Postagens: 4
Local cIteSD2 := M->(D1_COD + SUBS(D1_ITEMORI,3,2))

se seu x3 estiver igual ao meu
tenta fazer a substring, pq o item origem na sd1 são 4 e na d2 item são dois, ai ele não acha nunca memo..


Foto
Mensagem do Enviar e-mail Abrir o Perfil do usuário EMERSON.EN EMERSON.EN em 19/07/2024, 14:38 h
Local: SP  Registro: 20/08/2010  Postagens: 681
então melhor tratar o tamanho que está definido no campo, sem que haja valores ‘chumbados‘.

Local cIteSD2 := M->(D1_COD + LEFT(D1_ITEMORI,FWTAMSX3(‘D2_ITEM‘)[1]))

Desta forma será utilizado o tamanho definido no dicionário.

/*/{Protheus.doc} xVlrOri()
Obtém o valor unitário do produto da nf origem, a partir do produto informado no item atual da nota de entrada, durante a edição da nota.
Muitas vezes esse valor não é preenchido automaticamente pelo Protheus e com esta função não é necessário consultar o valor em outra rotina do sistema.
@author IAN
@type function
@since 18/07/2024
@params nil
@return numeric, valor unitário do item da nf origem
@obs pode ser utilizado a partir de um gatilho ou ponto de entrada no item da nota de entrada
/*/
User Function xVlrOri()
Local cDocSD2 := M->(D1_NFORI + D1_SERIORI)
Local cCliSD2 := M->(D1_FORNECE + D1_LOJA)
Local cIteSD2 := M->(D1_COD + LEFT(D1_ITEMORI,FWTAMSX3(‘D2_ITEM‘)[1]))
Local cChaveSD2 := FWXFILIAL(‘SD2‘) + cDocSD2 + cCliSD2 + cIteSD2
Local nVlrSD2

    // SD2, IDX 3: D2_FILIAL, D2_DOC, D2_SERIE, D2_CLIENTE, D2_LOJA, D2_COD, D2_ITEM
    nVlrSD2 := IF(!EMPTY(cDocSD2), GetADVFVal(‘SD2‘, ‘D2_PRCVEN‘, cChaveSD2, 3, 0), 0)
    // se não precisar posicionar o ponteiro de registros da SD2, não use a Posicione().
    // https://academiaprotheus.com.br/totvs-advpl-funcao-getadvfval-uma-alternativa-ao-posicione1/

Return cValToChar( nVlrSD2 ) // para retorno numérico, retire a função cValToChar()

Foto
Mensagem do Enviar e-mail Abrir o Perfil do usuário IAN IAN em 19/07/2024, 17:04 h
Local: SP  Registro: 24/06/2024  Postagens: 7
Boa tarde! Fiz todos os testes com os códigos passados, segue um fwalertinfo do retorno da cChavesSD2, como podem ver campos como fornecedor e loja retornam vazio, então nada funcionou... obs: Estou colocando u_xVlrOri() no inic. padrao de um campo customizado.

Esse código abaixo trouxe valores, mas embaralhado não respeitando o cod do produto e o primeiro produto não trouxe valor

User Function xVlrOri()

    Local cTabela   := "SD2"
    Local cIndTmp   := GetNextAlias()
    Local cCampos   := "D2_FILIAL+D2_DOC+D2_SERIE+D2_COD"
    
    
    DbSelectArea(‘SD2‘)
    IndRegua(cTabela, cIndTmp, cCampos)
    

    Local cDocSD2 := M->(D1_NFORI + D1_SERIORI)
    Local cIteSD2 := M->(D1_COD)
    Local cChaveSD2 := FWXFILIAL(‘SD2‘) + cDocSD2 + cIteSD2
    Local nVlrSD2

    nVlrSD2 := IF(!EMPTY(cDocSD2), GetADVFVal(‘SD2‘, ‘D2_PRCVEN‘, cChaveSD2, 0, 0), 0)




Return nVlrSD2

Foto
Mensagem do Enviar e-mail Abrir o Perfil do usuário EMERSON.EN EMERSON.EN em 19/07/2024, 19:48 h
Local: SP  Registro: 20/08/2010  Postagens: 681
não pode ser no inicializador padrão. o inicializador padrão é utilizado quando o registro é criado, logo todos os campos estão vazios.

precisa ser no gatilho dos campos D1_COD, D1_NFORI e D1_SERIORI, com contradomínio no campo do valor unitário que você quer preencher.

assim, quando você alterar qualquer dos campos acima, a função será chamada e preencherá o campo indicado no contra domínio.

Foto
Mensagem do Enviar e-mail Abrir o Perfil do usuário IAN IAN em 30/07/2024, 20:05 h
Local: SP  Registro: 24/06/2024  Postagens: 7
Problema solucionado! Agradeço a todos... Abraço

Para postar no Fórum você precisa efetuar o seu login ou se registrar

 Mudar para Fórum

 

 

 
 
   
Pagina Principal Shopping PROTHEUS Tire suas duvidas Vagas Microsiga em todo Brasil Aprofunde seus conhecimentos Noticias Online Fale Conosco Pagina Principal