Função que cria complementos do produto (SB5) através do cadastro de produtos (SB1)

Função que cria complementos do produto (SB5) através do cadastro de produtos (SB1)

Olá pessoal…

Hoje vou mostrar uma função que criei que cria automaticamente os complementos de produto através dos produtos já cadastros.

AdvPL
AdvPL

Se você utiliza ou habilitou o complemento de produtos (tabela SB5), se já possui produtos cadastrados, já percebeu que é oneroso ter que cadastrar todos novamente, certo?

Pensando nisso, preparei um código fonte, que percorre todos os produtos criados e os que não tiverem complemento, é criado automaticamente.

Segue abaixo o código:

//Bibliotecas
#Include "Protheus.ch"

/*/{Protheus.doc} zSB1Compl
Função que gera o complemento do produto (SB5) através do produto (SB1)
@author Atilio
@since 29/08/2017
@version 1.0
@type function
@obs Executar como Administrador
/*/

User Function zSB1Compl()
	Processa({|| fProcessa()}, "Processando...")
Return

/*----------------------------------------------------------*
 | Func.: fProcessa                                         |
 | Desc.: Função de processamento para gravar o complemento |
 *----------------------------------------------------------*/

Static Function fProcessa()
	Local aArea  := GetArea()
	Local nAtual := 0
	Local nTotal := 0
	Local nOk    := 0
	Local cOk    := ""
	Local cMsg   := ""
	Local lPosUM := ( SB5->(FieldPos('B5_UMIND')) != 0)
	
	//Abre o cadastro de produtos
	DbSelectArea('SB1')
	SB1->(DbSetOrder(1)) //B1_FILIAL + B1_COD
	SB1->(DbGoTop())
	Count To nTotal
	
	//Abre o cadastro de complemento
	DbSelectArea('SB5')
	SB5->(DbSetOrder(1)) //B5_FILIAL + B5_COD
	SB5->(DbGoTop())
	
	//Posiciona no topo e percorre os registros
	SB1->(DbGoTop())
	While ! SB1->(Eof())
		nAtual++
		IncProc("Processando "+cValToChar(nAtual)+" de "+cValToChar(nTotal)+" ("+AllTrim(SB1->B1_COD)+")...")
		
		//Se não existir complemento
		If ! SB5->(DbSeek(FWxFilial('SB5') + SB1->B1_COD))
			//Foi feito através de RecLock, pois o MsExecAuto da MATA180 estava travando
			RecLock('SB5', .T.)
				B5_FILIAL    := FWxFilial('SB5')
				B5_COD       := SB1->B1_COD
				B5_CEME      := SB1->B1_DESC
				If lPosUM
					B5_UMIND := '1'
				EndIf
			SB5->(MsUnlock())
			
			lMsErroAuto := .F.
			
			nOk++
			cOk += "- "+Alltrim(SB1->B1_COD)+";" + CRLF
		EndIf
		
		SB1->(DbSkip())
	EndDo
	
	//Se tiver erros ou inclusões, mostra mensagem
	If nOk != 0
		cMsg := "Foram analisados "+cValToChar(nTotal)+" produtos..." + CRLF + CRLF
		cMsg += "Sucesso na inclusão do complemento de "+cValToChar(nOk)+" produto(s):"+CRLF
		cMsg += cOk + CRLF
		
		Aviso("Atenção", cMsg, {"Ok"}, 2)
	EndIf
	
	//Atualiza o grupo de perguntas
	If MsgYesNo("Deseja atualizar o parâmetro do cadastro de produtos (F12)?", "Atenção")
		u_zAtuPerg("MTA010", "MV_PAR02", 1)
	EndIf
	
	MsgInfo("Processo concluído.", "Atenção")
	
	RestArea(aArea)
Return

Esses e outros códigos, estão disponíveis gratuitamente no nosso GitHub, acesse em github.com/dan-atilio/AdvPL.
Caso queira uma customização específica para sua empresa, saiba mais em nossa Loja.

Bom pessoal, por hoje é só.
Abraços e até a próxima.

About Dan_Atilio

Analista e desenvolvedor de sistemas. Técnico em Informática pelo CTI da Unesp. Graduado em Banco de Dados pela Fatec Bauru. Entusiasta de soluções Open Source e blogueiro nas horas vagas. Autor do projeto Terminal de Informação, onde são postados tutoriais e notícias envolvendo o mundo da tecnologia.

Deixe uma resposta

%d blogueiros gostam disto: