|
Bem Vindo, Visitante
|
Todos os Fórums
ADVPL
|
Imprimir
Enviar Para um Amigo Precisa estar Logado
|
|
|
Assunto: |
POSICIONE |
|
Versão: |
. |
|
Plataforma: |
. |
Complemento: |
|
|
DB: |
. |
Complemento: |
|
|
|
|
|
Mensagem do
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
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 |
|
|
Mensagem do
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
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 |
|
|
Mensagem do
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. |
|
|
Mensagem do
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. |
|
|
Mensagem do
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()
|
|
|
Mensagem do
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 |
|
|
Mensagem do
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 |
|
|
Mensagem do
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..
|
|
|
Mensagem do
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() |
|
|
Mensagem do
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 |
|
|
Mensagem do
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.
|
|
|
Mensagem do
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
|
|