Fazendo uma validação no Documento de Entrada para o Pedido de Compra ser obrigatório dependendo do cadastro de TES

Hoje vou mostrar como fazer uma validação ao clicar no botão confirmar do Documento de Entrada, deixando o campo de Pedido de Compra obrigatório para preenchimento, dependendo da TES.

Um dos meus alunos me perguntou, como ele poderia deixar um campo obrigatório, dependendo de uma condição específica.

Pois bem jovens, para esse cenário, o necessário é a montagem da regra, sendo que as perguntas a serem feitas são:

1- Qual campo será obrigatório?

2- Quando ele será obrigatório?

3- Como validar a condição?

A partir dessas perguntas, chegamos às respostas:

1- Campo de código do pedido de compra (D1_PEDIDO)

2- Quando o campo de TES (D1_TES) estiver configurado para gerar financeiro (F4_DUPLIC igual a S)

3- A validação ocorrerá antes de salvar, quando o usuário clicar em Confirmar

Com a lógica já montada, iremos partir para a customização. No caso iremos usar o ponto de entrada MTA103OK (que é acionado para validar a tela), e dentro dele iremos percorrer todas as linhas. A cada linha, iremos posicionar no cadastro de TES, se a TES gerar duplicata no financeiro, mas o campo de pedido estiver vazio, irá retornar falso para não prosseguir com o cadastro e irá mostrar uma mensagem de falha.

Abaixo o fonte desenvolvido conforme explicação acima:

User Function MTA103OK()
	Local aArea := GetArea()
	Local lRet := .T.
	Local nLinha := 0
	Local nPosPed := GDFieldPos('D1_PEDIDO')
	Local nPosTes := GDFieldPos('D1_TES')
	Local cTes
	Local cPedido
	
	//Somente irá validar os pedidos, se a espécie for diferente de CTE (a variável cEspecie é private da MATA103)
	If Alltrim(cEspecie) != "CTE"
		
		//Faz a abertura da tabela de TES, e define o índice 1 para uso
		DbSelectArea('SF4')
		SF4->(DbSetOrder(1)) // F4_FILIAL + F4_CODIGO
	
		//Percorrendo todas as linhas do documento de entrada
		For nLinha := 1 To Len(aCols)
			
			//Pegando as informações de TES e Pedido conforme a grid
			cTes    := aCols[nLinha][nPosTes]
			cPedido := aCols[nLinha][nPosPed]
		
			//Se conseguir posicionar na tabela de TES
			If SF4->(DbSeek(FWxFilial("SF4") + cTes))
			
				//Se no cadastro de TES estiver para gerar duplicata, e o pedido estiver vazio
				If SF4->F4_DUPLIC == 'S' .And. Empty(cPedido)
					MsgStop("Na linha " + cValToChar(nLinha) + ", o cadastro de TES está indicando que gera duplicatas, mas não existe nenhum pedido preenchido! Preencha um pedido válido.", "Atenção")
					lRet := .F.
					Exit
				EndIf
			EndIf
		Next
	
	EndIf
	
	RestArea(aArea)
Return lRet

Bom pessoal, por hoje é só.

Abraços e até a próxima.

Dan (Daniel Atilio)
Cristão de ramificação protestante. Especialista em Engenharia de Software pela FIB, graduado em Banco de Dados pela FATEC Bauru e técnico em informática pelo CTI da Unesp. Entusiasta de soluções Open Source e blogueiro nas horas vagas. Autor e mantenedor do portal Terminal de Informação.

Deixe uma resposta

Terminal de Informação