Uso Access 2003
Amigos, preciso mais uma vez da ajuda de vocês no seguinte:
Tenho um Form que gera ou não 01 Notificação por cada Registro inserido, a mesma quando gerada é seqüencial por Ano, no formato: 001/2012, 002/2012, 003/2012, e assim por diante, ou seja, a cada ano começa de 001, até aqui tudo bem, a questão é que só posso gerar uma nova Notificação se o tipo de expediente forem os códigos 1 e 2 baseado no campo IDExpediente deste Formulário que por sua vez tem sua origem em outra Tabela T16_Expedientes que possui atualmente 8 códigos. Então se em determinado registro for escolhido por exemplo o código 3 ou 5 a Notificação não deve ser gerada, o problema é que no campo NumNOT que recebe a numeração coloquei no valor padrão desse campo: “000/0000” para os códigos que não geram Notificação, mas a Função/Módulo que uso para geração da sequencia sempre pega da Tabela o último número gerado e adiciona mais 1 como seria o normal, então a numeração das Notificações na tabela está em 005/2012 e crio um novo registro e coloco o código 3 ele grava no campo NumNOT assim: “000/0000” (por ser valor padrão), e após isso eu criar um novo registro o sistema emite uma mensagem que irá começar uma nova numeração e grava novamente o número 001/2012 nesse novo registro, o que está incorreto, pois deveria criar a numeração 006/2012, visto que na tabela o registro anterior era “000/0000”. Minha necessidade é justamente essa, ou seja, de quando não forem os códigos 1 ou 2 e na tabela ficar a numeração zerada, e ao incluir um outro registro e identifique que o último número está zerado com “000/0000”, ele pegue a última numeração diferente de zerado e acrescente mais 1, mas tem um detalhe, nem sempre o código 2 gera uma Notificação, o qual no campo NumNOT desse registro também ficaria zerado, apenas o código 1 gera necessariamente uma Notificação com Numeração Seqüencial X Ano. Tentei alterar com os comandos abaixo no botão de comando, mas não funcionou pois se encontra um registro como "000/0000" ou mesmo vazio, a função começa novamente do 001/2012, quando já existe essa numeração, conforme já citado acima.
Os códigos que uso para a rotina acima citada são:
Botão de comando para inserir uma nova Notificação:
Private Sub MenuNotificacao_Click() '** NOTIFICACAO
If IDExpediente = 1 Or IDExpediente = 2 Then
On Error GoTo Sai
Call NumeraRegistros
Exit Sub
Sai:
MsgBox "Erro - " & Err.Description
Else
DoCmd.CancelEvent
Exit Sub
End If
End Sub
Abaixo a Função/Módulo que gera a Numeração Automática Seqüencial por Ano
Onde:
T16_Autuacoes = Tabela onde é gravado os campos da rotina
CodAutuacao = campo de Autonumeracao da tabela acima
NumNOT = campo onde é armazenado o Número da Notificação (000/0000) na tabela acima
ContadorDeRegistros = Módulo para contagem dos registros x sequencia x ano
Private Sub NumeraRegistros() '** NOTIFICACAO
'Para um contador de registros personalizado ser eficiente você deve introduzir um campo ‘autonumeração na sua tabela só para facilitar a busca do ultimo registro. Ele pode ficar ‘oculto. Note que eu passo uma sql para a função em ordem decrescente e o nome do campo ‘que eu quero incrementar a contagem.
Dim sql As String
sql = "SELECT CodAutuacao, NumNOT"
sql = sql & " FROM T16_Autuacoes"
sql = sql & " ORDER BY CodAutuacao DESC"
Me.NumNOT = ContadorDeRegistros("NumNOT", sql)
End Sub
Módulo:
'Autor: Carlos em 20/01/99 e-mail: crpmoura@ig.com.br
'Contador de registros personalizado no formato numero/ano
Public Function ContadorDeRegistros(strCampo As String, strSql As String)
Dim strNum As String, DB As Database
Dim strMax As String, CampoAno As String
Dim AnoData As String, tbl As Recordset
Set DB = CurrentDb
AnoData = Year(Date)
Set tbl = DB.OpenRecordset(strSql)
If tbl.RecordCount = 0 Then
ContadorDeRegistros = 1 & "/" & AnoData
Else
strMax = tbl(strCampo)
CampoAno = Mid(strMax, (InStr(1, strMax, "/")) + 1, 4)
If CampoAno = AnoData Then
strNum = Left(strMax, (InStr(1, strMax, "/") - 1)) + 1
ContadorDeRegistros = strNum & "/" & AnoData
Else
MsgBox "O Sistema iniciará uma nova contagem dos Registros" _
& vbCrLf & " em função da virada do ANO", vbInformation, "ATENÇÃO"
ContadorDeRegistros = 1 & "/" & AnoData
End If
End If
ContadorDeRegistros = StrZero(ContadorDeRegistros,
tbl.Close
Set DB = Nothing
End Function
Public Function StrZero(nNumero As Variant, nCasas As Integer)
StrZero = Right("00000000" + LTrim(nNumero), nCasas)
End Function
Amigos, preciso mais uma vez da ajuda de vocês no seguinte:
Tenho um Form que gera ou não 01 Notificação por cada Registro inserido, a mesma quando gerada é seqüencial por Ano, no formato: 001/2012, 002/2012, 003/2012, e assim por diante, ou seja, a cada ano começa de 001, até aqui tudo bem, a questão é que só posso gerar uma nova Notificação se o tipo de expediente forem os códigos 1 e 2 baseado no campo IDExpediente deste Formulário que por sua vez tem sua origem em outra Tabela T16_Expedientes que possui atualmente 8 códigos. Então se em determinado registro for escolhido por exemplo o código 3 ou 5 a Notificação não deve ser gerada, o problema é que no campo NumNOT que recebe a numeração coloquei no valor padrão desse campo: “000/0000” para os códigos que não geram Notificação, mas a Função/Módulo que uso para geração da sequencia sempre pega da Tabela o último número gerado e adiciona mais 1 como seria o normal, então a numeração das Notificações na tabela está em 005/2012 e crio um novo registro e coloco o código 3 ele grava no campo NumNOT assim: “000/0000” (por ser valor padrão), e após isso eu criar um novo registro o sistema emite uma mensagem que irá começar uma nova numeração e grava novamente o número 001/2012 nesse novo registro, o que está incorreto, pois deveria criar a numeração 006/2012, visto que na tabela o registro anterior era “000/0000”. Minha necessidade é justamente essa, ou seja, de quando não forem os códigos 1 ou 2 e na tabela ficar a numeração zerada, e ao incluir um outro registro e identifique que o último número está zerado com “000/0000”, ele pegue a última numeração diferente de zerado e acrescente mais 1, mas tem um detalhe, nem sempre o código 2 gera uma Notificação, o qual no campo NumNOT desse registro também ficaria zerado, apenas o código 1 gera necessariamente uma Notificação com Numeração Seqüencial X Ano. Tentei alterar com os comandos abaixo no botão de comando, mas não funcionou pois se encontra um registro como "000/0000" ou mesmo vazio, a função começa novamente do 001/2012, quando já existe essa numeração, conforme já citado acima.
Os códigos que uso para a rotina acima citada são:
Botão de comando para inserir uma nova Notificação:
Private Sub MenuNotificacao_Click() '** NOTIFICACAO
If IDExpediente = 1 Or IDExpediente = 2 Then
On Error GoTo Sai
Call NumeraRegistros
Exit Sub
Sai:
MsgBox "Erro - " & Err.Description
Else
DoCmd.CancelEvent
Exit Sub
End If
End Sub
Abaixo a Função/Módulo que gera a Numeração Automática Seqüencial por Ano
Onde:
T16_Autuacoes = Tabela onde é gravado os campos da rotina
CodAutuacao = campo de Autonumeracao da tabela acima
NumNOT = campo onde é armazenado o Número da Notificação (000/0000) na tabela acima
ContadorDeRegistros = Módulo para contagem dos registros x sequencia x ano
Private Sub NumeraRegistros() '** NOTIFICACAO
'Para um contador de registros personalizado ser eficiente você deve introduzir um campo ‘autonumeração na sua tabela só para facilitar a busca do ultimo registro. Ele pode ficar ‘oculto. Note que eu passo uma sql para a função em ordem decrescente e o nome do campo ‘que eu quero incrementar a contagem.
Dim sql As String
sql = "SELECT CodAutuacao, NumNOT"
sql = sql & " FROM T16_Autuacoes"
sql = sql & " ORDER BY CodAutuacao DESC"
Me.NumNOT = ContadorDeRegistros("NumNOT", sql)
End Sub
Módulo:
'Autor: Carlos em 20/01/99 e-mail: crpmoura@ig.com.br
'Contador de registros personalizado no formato numero/ano
Public Function ContadorDeRegistros(strCampo As String, strSql As String)
Dim strNum As String, DB As Database
Dim strMax As String, CampoAno As String
Dim AnoData As String, tbl As Recordset
Set DB = CurrentDb
AnoData = Year(Date)
Set tbl = DB.OpenRecordset(strSql)
If tbl.RecordCount = 0 Then
ContadorDeRegistros = 1 & "/" & AnoData
Else
strMax = tbl(strCampo)
CampoAno = Mid(strMax, (InStr(1, strMax, "/")) + 1, 4)
If CampoAno = AnoData Then
strNum = Left(strMax, (InStr(1, strMax, "/") - 1)) + 1
ContadorDeRegistros = strNum & "/" & AnoData
Else
MsgBox "O Sistema iniciará uma nova contagem dos Registros" _
& vbCrLf & " em função da virada do ANO", vbInformation, "ATENÇÃO"
ContadorDeRegistros = 1 & "/" & AnoData
End If
End If
ContadorDeRegistros = StrZero(ContadorDeRegistros,
tbl.Close
Set DB = Nothing
End Function
Public Function StrZero(nNumero As Variant, nCasas As Integer)
StrZero = Right("00000000" + LTrim(nNumero), nCasas)
End Function