Função para deixar o código do produto sequencial conforme o grupo

Função para deixar o código do produto sequencial conforme o grupo

Olá pessoal…

Hoje vou mostrar para vocês uma função rápida e fácil para preenchimento inteligente do código do produto no Protheus.

Muitas vezes as empresas querem ter um código sequencial de produto inteligente, e pensando nisso montei esse tutorial com um roteiro, sendo que aqui, o código vai se basear no Grupo do Produto + Sequencial do Produto. Basta seguir esses passos:

1. Acesse o Configurador (SIGACFG), vá na tabela SB1 e clique em Editar
2. Vá no campo Grupo (B1_GRUPO), verifique se ele está como obrigatório, caso não esteja, deixe ele como obrigatório (está na aba Uso)
3. No modo de edição do campo, deixe a expressão INCLUI para ele ficar habilitado apenas na inclusão (está na aba Opções)

Modo de Edição do campo Grupo
Modo de Edição do campo Grupo

4. Altere a sequência do campo, para ele vir antes do campo Código (B1_COD)
5. Vá no campo Código (B1_COD), no modo de edição deixe a expressão .F. para não deixar alterar o campo
6. Confirme as alterações da tabela
7. Vá na seção de Gatilhos, e clique para incluir um novo Gatilho. Nesse Gatilho, coloque a origem sendo o B1_GRUPO, e o destino o B1_COD, e a Regra sendo u_zGrupCod()

Criação do Gatilho
Criação do Gatilho

8. Salve as alterações do Configurador
9. Compile a função abaixo

//Bibliotecas
#Include "Protheus.ch"
#Include "TopConn.ch"

/*/{Protheus.doc} zGrupCod
Função que preenche o código do produto conforme o grupo
@author Atilio
@since 04/04/2018
@version 1.0
@type function
@obs Passo a Passo de como fazer para funcionar:
	1. Acesse o Configurador (SIGACFG), vá na tabela SB1 e clique em Editar
	2. Vá no campo Grupo (B1_GRUPO), verifique se ele está como obrigatório, caso não esteja, deixe ele como obrigatório (está na aba Uso)
	3. No modo de edição do campo, deixe a expressão INCLUI para ele ficar habilitado apenas na inclusão (está na aba Opções)
	4. Altere a sequência do campo, para ele vir antes do campo Código (B1_COD)
	5. Vá no campo Código (B1_COD), no modo de edição deixe a expressão .F. para não deixar alterar o campo
	6. Confirme as alterações da tabela
	7. Vá na seção de Gatilhos, e clique para incluir um novo Gatilho. Nesse Gatilho, coloque a origem sendo o B1_GRUPO, e o destino o B1_COD, e a Regra sendo <b>u_zGrupCod()</b>
	8. Salve as alterações do Configurador
	9. Compile a função abaixo
/*/

User Function zGrupCod()
	Local aArea   := GetArea()
	Local cCodigo := ""
	Local cGrupo  := FWFldGet("B1_GRUPO")
	Local cQryAux := ""
	Local nTamGrp := TamSX3('B1_GRUPO')[01]
	Local nTamCod := TamSX3('B1_COD')[01]
	
	//Se houver grupo
	If ! Empty(cGrupo)
		cCodigo := cGrupo + Replicate('0', nTamCod-nTamGrp)
		
		//Pegando o último código (não foi fitraldo o DELET para manter a sequencia unica)
		cQryAux := " SELECT "                                                                        + CRLF
		cQryAux += " 	ISNULL(MAX(B1_COD), '" + cCodigo + "') AS ULTIMO "                           + CRLF
		cQryAux += " FROM "                                                                          + CRLF
		cQryAux += " 	" + RetSQLName('SB1') + " SB1 "                                              + CRLF
		cQryAux += " WHERE "                                                                         + CRLF
		cQryAux += " 	B1_FILIAL = '" + FWxFilial('SB1') + "' "                                     + CRLF
		cQryAux += " 	AND B1_GRUPO = '" + cGrupo + "' "                                            + CRLF
		cQryAux += " 	AND SUBSTRING(B1_COD, 1, " + cValToChar(nTamGrp) + ") = '" + cGrupo + "' "   + CRLF
		TCQuery cQryAux New Alias "QRY_AUX"
		
		//Define o novo código, incrementando 1 no final
		cCodigo := Soma1(cCodigo)
		
		QRY_AUX->(DbCloseArea())
	EndIf
	
	RestArea(aArea)
Return cCodigo

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.

Ressalto que outras tratativas como 2 usuários incluírem ao mesmo tempo, ou tratativas específicas, esse fonte não abrange, ele é apenas um facilitador para inclusão desse recurso.

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.

2 comentários em “Função para deixar o código do produto sequencial conforme o grupo

Deixe uma resposta

%d blogueiros gostam disto: