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).
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.
Boa tarde Mestre Daniel, showww, funcionou perfeitamente e era o que eu precisava, valew.
Parabéns, abraço.
Opa, eu que agradeço mano Charles.
Um grande abraço.