Utilizando sequência Código/Ano via AdvPL

Olá pessoal…

Hoje vou mostrar como utilizar uma sequência de Código/Ano via AdvPL, como por exemplo, 001/16, 002/16, 003/16, etc.

Como foi desenvolvido uma User Function, ela pode ser utilizada em qualquer tabela padrão ou customizada, desde que seja alterado o Ini Padrão do campo. Abaixo um print dela sendo chamado pelo cadastro de produtos (B1_COD).

Exemplo de sequência utilizando o campo código do produto

Exemplo de sequência utilizando o campo código do produto

Para utilizar no Ini Padrão, basta criar uma chamada para a função de usuário, passando no primeiro parâmetro a tabela, no segundo o campo, no terceiro a data base de referência, no quarto qual será o caracter separador, no quinto a quantidade de casas utilizadas para o ano e no último se irá retornar o último código encontrado (.F.), ou o próximo disponível após o último (.T.). Abaixo um exemplo para o B1_COD:

u_zCodAno("SB1", "B1_COD", dDataBase, "/", 4, .T.)

Abaixo a rotina desenvolvida:

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

/*/{Protheus.doc} zCodAno
Função que retorna o ultimo campo código com separação de ano (ex.: 00001/15)
@type function
@author Atilio
@since 27/11/2015
@version 1.0
	@param cTab, Caracter, Tabela que será consultada
	@param cCampo, Caracter, Campo utilizado de código
	@param [dData], Data, Data de Referência
	@param [cSep], Caracter, Caracter Separador
	@param [nTamAno], Numérico, Tamanho do ano (não pode ser menor que 2)
	@param [lSoma1], Lógico, Define se além de trazer o último, já irá somar 1 no valor
	@example
	u_zCodAno("SC5", "C5_X_CAMPO", dDataBase, "/", 2, .T.)
/*/

User Function zCodAno(cTab, cCampo, dData, cSep, nTamAno, lSoma1)
	Local aArea		:= GetArea()
	Local cCodFull	:= ""
	Local cCodAux		:= ""
	Local cAno			:= ""
	Local cQuery		:= ""
	Local nTamCampo	:= 0
	Default dData		:= dDataBase
	Default cSep		:= "/"
	Default nTamAno	:= 2
	Default lSoma1	:= .F.
	
	//Se o tamanho do ano for menor que 2 ou maior que 4, será 2
	If nTamAno < 2 .Or. nTamAno > 4
		nTamAno := 2
	EndIf
	
	//Definindo o código atual
	nTamCampo := TamSX3(cCampo)[01]
	cCodAux   := Space(nTamCampo-(nTamAno+1))
	cCodAux   := StrTran(cCodAux, ' ', '0')
	
	//Definindo o ano
	cAno := dToS(dDataBase)
	cAno := SubStr(cAno, 5-nTamAno, nTamAno)
	
	//Faço a consulta para pegar as informações
	cQuery := " SELECT "
	cQuery += "   ISNULL(MAX(SUBSTRING("+cCampo+", 1, "+cValToChar(nTamCampo - (nTamAno+1))+")), '"+cCodAux+"') AS MAXIMO "
	cQuery += " FROM "
	cQuery += "   "+RetSQLName(cTab)+" TAB "
	cQuery += " WHERE "
	cQuery += "   SUBSTRING(TAB."+cCampo+", "+cValToChar(nTamCampo+1 - nTamAno)+", "+cValToChar(nTamAno)+") = '"+cAno+"' "
	cQuery += "   AND TAB.D_E_L_E_T_ = '' "
	cQuery := ChangeQuery(cQuery)
	TCQuery cQuery New Alias "QRY_TAB"
	
	//Se não tiver em branco
	If !Empty(QRY_TAB->MAXIMO)
		cCodAux := QRY_TAB->MAXIMO
	EndIf
	
	//Se for para atualizar, soma 1 na variável
	If lSoma1
		cCodAux := Soma1(cCodAux)
	EndIf
	
	//Definindo o código de retorno
	cCodFull := cCodAux + cSep + cAno
	
	QRY_TAB->(DbCloseArea())
	RestArea(aArea)
Return cCodFull

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.

2 Responses

  1. Boa tarde Mestre Daniel, showww, funcionou perfeitamente e era o que eu precisava, valew.

    Parabéns, abraço.

Deixe uma resposta para Dan_AtilioCancelar resposta

Terminal de Informação