Convidado 23/11/2012, 15:01
Bem amigos.... A cnsulta que fiz acima resolveu o meu problema, tentarei explicar de maneira mais clara possível.
É um form de cadastro de Alunos e o seu número de matrícula, este número de matricula serve para gerar também um número de contrato para impressão de contrato no word.
Pois bem...
Suponhamos que o Aluno ID=1 tenha a sua primeira matricula de numero 0007/2012
mas que outro aluno ja tenha sido cadastrados com números 0006/2013, se eu utilizar o Recordset com a propriedade Move Last.. ele peegaria o ultimo registro o que as vezes daria erro, se por outro lado utilizasse a consulta com o Max somente m retornaria o numero 0007/2012
Então eu preciso pegar o maior numero do ano da nova matricula que no caso é 2013, então apliquei uma combo do tipo lista de valores com alguns anos cadastrados, tomando cuidado para em uma clausula nao permitir selecionar ano inferior ao ano atual, apartir dai um botão onde se executo o codigo para caso for efetuar nova matricula para o Aluno ID = 1 este numero será substituido pelo proximo numero +1 da tabela cujo ano seja igual ao ano da matricula.
- Código:
Private Sub btnNovaMat_Click()
On Error GoTo trataerro
Dim I As String
Dim Msg As String
Dim AnoMat As String
StrAnoMat = Year(Date)
If Me.cboAnoMat.Value < StrAnoMat Then MsgBox "Este ano não está mais disponível" _
& vbNewLine & "para efetuar matrículas!", vbCritical, "INDISPONÍVEL": Exit Sub
If Me.cboAnoMat = "" Or IsNull(Me.cboAnoMat) = True Then MsgBox "Selecione o Ano Letivo para a Matrícula", vbCritical, "ATENÇÃO": Me.cboAnoMat.SetFocus: Me.cboAnoMat.Dropdown: Exit Sub
If Right(Me.txtNumMat, 4) <> Year(Date) Or IsNull(Me.txtNumMat) = True Or Me.txtNumMat = "" Then
Call NumeraAnoNova ' Função para levar a variável a última numeração da tabela
'=========================================================================
If Format(Date, "yyyy") > Right(LastNum, 4) Then
NumAtual = Format(1, "0000") & "/" & Year(Date)
Else
I = Left(LastNum, 4)
I = CInt(I)
NumAtual = Format(I + 1, "0000") & "/" & Year(Date)
Me.txtNumMat = NumAtual
End If
Exit Sub
Exit_TrataErro:
DoCmd.Hourglass False
DoCmd.Echo True
Exit Sub
trataerro:
If err.Number = 0 Then
Resume Next
Else
DoCmd.Hourglass False
DoCmd.Echo True
Msg = "Erro # " & Str(err.Number) & " gerado na " & err.Source _
& vbNewLine & vbNewLine & "Descrição: " & err.description _
& vbNewLine & vbNewLine & "Por favor contate o Administrador de Sistema."
MsgBox Msg, vbMsgBoxHelpButton + vbCritical, "Erro", err.Helpfile, err.HelpContext
Resume Exit_TrataErro
End If
End If
End Sub
Sub NumeraAnoNova()
On Error GoTo trataerro
Dim db As DAO.Database
Dim ws As DAO.Workspace
Dim rs As DAO.Recordset
Dim StrSQLNumero As String
Dim DetIdent As String
Set ws = DBEngine.Workspaces(0)
Set db = CurrentDb
'StrSQLNumero = ("SELECT * FROM tblAlunos WHERE Right(CpNumMat,4) = " & Me.cboAnoMat.Value & ";")
StrSQLNumero = ("SELECT Right([cpNumMat],4) AS Ano, Max(tblAlunos.CpNumMat) AS MáxDeCpNumMat FROM tblAlunos" _
& " GROUP BY Right([cpNumMat],4)HAVING (((Right([cpNumMat],4)) Like Format(Now(),'yyyy')));")
Set rs = db.OpenRecordset(StrSQLNumero)
MsgBox rs.RecordCount
rs.MoveLast
LastNum = rs!MáxDeCpNumMat
If rs.NoMatch Then ' Se o código ainda não está cadastrado...
Exit Sub
End If
rs.Close
db.Close
Set rs = Nothing
Set db = Nothing
Exit Sub
'No tratamento de erro se não encontra registro correspondente gera numero 0001/Ano
trataerro:
If err.Number = 3021 Then
NumAtual = Format(1, "0000") & "/" & Year(Date)
Me.txtNumMat = NumAtual
Call btnSalvar_Click
ElseIf err.Number = 94 Then
LastNum = Nz(rs!CpNumMat, "0001") & "/" & Year(Date)
If Me.txtNumMat = LastNum Then Exit Sub
Me.txtNumMat = LastNum
Else
MsgBox Error, , "Erro nº" & err & " em Numera Ano"
End If
End Sub
Cumprimentos.