Erro while ponto de entrada sb1

Boa tarde, alguem poderia me ajudar. estou fazendo uma consulta para saber se foi alterado algum produto . Na consulta do while , ele nao funciona da forma que eu gostaria, gostaria que ele fizesse a consulta,deu true, ele voltasse para a rotina, mas ele fica só repetindo o msg e não volta para a rotina. Criei 2 campos e estou usando esse codigo.

INCLUDE "protheus.ch"

User Function A010TOK() Local aArea := GetArea() Local aAreaB1 := SB1->(GetArea()) Local lRet := .T.

//Se for inclusão //If INCLUI // MsgInfo("Estou em uma inclusão!", "Atenção") //EndIf

//Se for alteração If ALTERA

DO WHILE B1_CUSTOM = '1' .AND. M->B1_VALID = 01 MSGAlert("Produto Alterado !!") MsgAlert("Favor preencher o campo 'Alterações' na aba 'Outros'!") B1_VALID++ RestArea(aAreaB1) RestArea(aArea)

Return lRet

ElseIf M->B1_VALID = 02 MsgInfo("Favor preencher o campo 'Alterações' na aba 'Outros'!","Este Produto sofreu alterações !") //DO WHILE B1_CUSTOM = '1' MsgAlert("Favor preencher o campo 'Alterações' na aba 'Outros'!")

lRet := MSGRETRYCANCEL("Deseja mesmo alterar este produto ?","Atenção") //BREAK //Enddo B1_VALID++ RestArea(aAreaB1) RestArea(aArea) //Endif Return lRet

ElseIf M->B1_VALID >= 03 MsgAlert("Favor preencher o campo 'Alterações' na aba 'Outros'!","Este Produto sofreu alterações !") //WHILE B1_CUSTOM = '1' MsgAlert("Favor preencher o campo 'Alterações' na aba 'Outros'!") // Enddo lRet := MSGRETRYCANCEL("Para Mudanças neste campo, Por Favor preencha o campo alterações !!") //B1_VALID++ //RestArea(aAreaB1) //RestArea(aArea) //Endif //Return lRet

ElseIf M->B1_CUSTOM != '' MsgAlert("o campo alterações ta vazio ") lRet := MsgYesNo("nao deixa o custom vazio ") //RestArea(aAreaB1) //RestArea(aArea) //Endif //Return lRet

//Endif MsgInfo("Estou em uma alteração!", "Atenção") EndIf

//Se for cópia //If lCopia // MsgInfo("Estou em uma cópia!", "Atenção") //EndIf ENDDO

lRet := MsgYesNo("Deseja continuar", "Atenção")

RestArea(aAreaB1) RestArea(aArea) Return lRet

Lusquinhas coloca o fonte como anexo ou formata ele aqui porque está bem difícil de entender o programa.

Lucas se entendi bem vc quer ao salvar um produto verificar se o mesmo foi alterado e barrar ou não baseado em alguma regra certo?

Se sim você não precisa do while, pois o ponto de entrada escolhido já executa no final depois do usuário terminar a entrada de dados.

Assim sendo você pode só fazer a validaćão normal e se retornar .t. no PE ele vai salvar ok o produto, se você retornar .f. do PE a tela não vai fechar, da forma como você precisa.

Então já estou usando meio que resolvendo por IFs, mas qual é o funcionamento?
o Produto já está salvo, o usuario vai fazer alterações.
dai o é verificado se o produto já foi alterado, e salvo em um novo campo quais alterações foram feitas.

não, o M-> é o que está em memória e não já salvo no banco.
O seu PE deve usar o M-> e comparar com o XXX-> para ver se mudou valor. XXX é o alias da tabela que vc ta trabalhando no caso o SB1->…

Codigo de como está ficando

INCLUDE 'PROTHEUS.CH'

User Function A010TOK() Local aArea := GetArea() Local aAreaB1 := SB1->(GetArea()) Local lRet := .T. LOCAL cCustomAntigo := B1_CUSTOM

If ALTERA

If M->B1_VALID = 01 MSGAlert("Produto prestes a sera alterado !!") IF M->B1_CUSTOM = '1' MSGSTOP("Por favor preencha o campo alterações") lRet := .f. ELSE

IF lRet := MSGYESNO("Você alterou o 'campo alterações ' na aba 'outros'? ", "Atenção") B1_VALID++ lRet :=.t. ELSE lRet :=.f. ENDIF

ENDIF ELSE msgstop("ja foi alterado ")

IF MSGYESNO("Você alterou o 'campo alterações ' na aba 'outros'? ", "Atenção")

IF B1_CUSTOM == cCustomAntigo MSGSTOP("Por favor preencha o campo alterações") lRet := .f. ELSE msgstop("saiu de tudo :)") B1_VALID++ lRet :=.t. ENDIF

ELSE MSGSTOP("Por favor preencha o campo alterações") lRet := .f. msgstop("saiu de tudo :)") Endif ENDIF ENDIF RestArea(aAreaB1) RestArea(aArea) Return lRet

um teste legal pra vc fazer, faz sua funćão retornar .t. e .f. apenas e veja o comportamento na tela, pois me parece que você ainda tem duvida de como funciona esse PE.

Opa Vinicius blz, consegui terminar aqui,(Estava com dificuldade de trazer o dado do banco e deixar usavel no codigo, depois disso foi tranquilo) valew mesmo por ter tido a iniciativa de me ajudar , se quiser eu mando o codigo aqui para ver como ficou.

tranquilo meu amigo, que bom que deu certo! abraćo.