Olá, boa tarde!
Venho pedir a vossa ajuda, já em estado de desespero... Sou uma curiosa, e leio toda a vossa informação com muito interesse e satisfação. Usei um código que aqui postaram num projecto em Acess 2007, e tudo funcionou até eu dividir a base de dados em back e front...
A Automatizaçao deixou de funcionar!
trata-se de automatizar uma sequência numérica, em que tenho a seguinte função num módulo Public:
Public Function NextNumSimples() As Long
'Gera o próximo número da tabela de numeração simples
Dim db As DAO.Database
Dim rst As DAO.Recordset
'Verifica o último número
Set db = CurrentDb()
Set rst = db.OpenRecordset("SELECT NumSimples FROM tblNumSimples " & _
"ORDER BY NumSimples DESC")
With rst
If .BOF And .EOF Then
NextNumSimples = 1
Else
.MoveFirst
NextNumSimples = !NumSimples + 1
End If
.Close
End With
Set rst = Nothing
Set db = Nothing
End Function
Public Function NextNumAno() As String
'Gera o próximo código da tabela de numeração/ano
Dim db As DAO.Database
Dim rst As DAO.Recordset
Dim intYear As Integer
Dim strSQL As String
'Ano atual, conforme o sistema
intYear = Year(Date)
'Verifica o último código para o ano
strSQL = "SELECT CLng(Left$(NumAno, Len(NumAno)-5)) As Num, " & _
"CInt(Right$(NumAno, 4)) As Ano FROM tblNumAno " & _
"WHERE CInt(Right$(NumAno, 4))=" & CStr(intYear) & _
" ORDER BY CLng(Left$(NumAno, Len(NumAno)-5)) DESC"
Set db = CurrentDb()
Set rst = db.OpenRecordset(strSQL, dbOpenDynaset)
With rst
If .BOF And .EOF Then
NextNumAno = "1/" & CStr(intYear)
Else
.MoveFirst
NextNumAno = CStr(!Num + 1) & "/" & CStr(intYear)
End If
.Close
End With
Set rst = Nothing
Set db = Nothing
End Function
No formulário que deverá gerar a numeração, tenho o seguinte:
Private Sub Form_BeforeUpdate(Cancel As Integer)
On Error GoTo Form_BeforeUpdate_Err
' Só executa a rotina se o campo [CodPedido] está vazio
If IsNull([CodPedido]) Then
Dim strUltPedido As String ' código completo do último pedido
Dim dataUltPedido As Date ' data do último pedido
Dim sAno As String ' string do ano com 4 dígitos
Dim sPref As String ' string do prefixo
' Dim anomes As String ' parte ano+mês do código (parte 1)
Dim numUltPedido As Integer ' parte numérica seqüencial do código (parte 2)
Const formatoNum As String = "0000#" ' formato da parte numérica: 5 dígitos
' Abre o banco de dados e a tabela tabPedidos
Dim db As Database
Dim t As Recordset
Set db = DBEngine(0)(0)
Set db = CurrentDb
Set t = db.OpenRecordset("tabPedidosFP", dbOpenTable)
' Parte 1 do código: ano atual (com 4 dígitos)
sAno = Left(CStr(Year(Now)), 4)
' Parte 1a do código: Prefixo
sPref = [OrderTypePrefix]
'--------------------------------------------------
' Montagem da parte 2 do código: número seqüencial
'--------------------------------------------------
' A tabela não tem registros; começa a contagem
If t.BOF = True And t.EOF = True Then
[CodPedido] = sPref & sAno & Format(1, formatoNum)
' A tabela tem registro; então, vai para o último
Else
t.MoveLast
'Obtém código e data e prefixo do último pedido
strUltPedido = t![CodPedido]
dataUltPedido = t![Data]
numUltPedido = Val(Right(strUltPedido, Len(formatoNum)))
' Novo pedido é feito no mesmo ano do anterior
If Year(Now) = Year(dataUltPedido) Then
[CodPedido] = [OrderTypePrefix] & sAno & Format(numUltPedido + 1, formatoNum)
' O ano atual é diferente; reinicia a contagem
Else
[CodPedido] = [OrderTypePrefix] & sAno & Format(1, formatoNum)
End If
End If
' Fecha a tabela e o banco de dados
t.Close
db.Close
End If
Form_BeforeUpdate_Fim:
Exit Sub
Form_BeforeUpdate_Err:
MsgBox Err.Description
Resume Form_BeforeUpdate_Fim
End Sub
O que se poderá ter passado? O que me falta fazer para que este código corra no front end?
Agradeço desde já a ajuda que me possam disponibilizar!
Maria
Venho pedir a vossa ajuda, já em estado de desespero... Sou uma curiosa, e leio toda a vossa informação com muito interesse e satisfação. Usei um código que aqui postaram num projecto em Acess 2007, e tudo funcionou até eu dividir a base de dados em back e front...
A Automatizaçao deixou de funcionar!
trata-se de automatizar uma sequência numérica, em que tenho a seguinte função num módulo Public:
Public Function NextNumSimples() As Long
'Gera o próximo número da tabela de numeração simples
Dim db As DAO.Database
Dim rst As DAO.Recordset
'Verifica o último número
Set db = CurrentDb()
Set rst = db.OpenRecordset("SELECT NumSimples FROM tblNumSimples " & _
"ORDER BY NumSimples DESC")
With rst
If .BOF And .EOF Then
NextNumSimples = 1
Else
.MoveFirst
NextNumSimples = !NumSimples + 1
End If
.Close
End With
Set rst = Nothing
Set db = Nothing
End Function
Public Function NextNumAno() As String
'Gera o próximo código da tabela de numeração/ano
Dim db As DAO.Database
Dim rst As DAO.Recordset
Dim intYear As Integer
Dim strSQL As String
'Ano atual, conforme o sistema
intYear = Year(Date)
'Verifica o último código para o ano
strSQL = "SELECT CLng(Left$(NumAno, Len(NumAno)-5)) As Num, " & _
"CInt(Right$(NumAno, 4)) As Ano FROM tblNumAno " & _
"WHERE CInt(Right$(NumAno, 4))=" & CStr(intYear) & _
" ORDER BY CLng(Left$(NumAno, Len(NumAno)-5)) DESC"
Set db = CurrentDb()
Set rst = db.OpenRecordset(strSQL, dbOpenDynaset)
With rst
If .BOF And .EOF Then
NextNumAno = "1/" & CStr(intYear)
Else
.MoveFirst
NextNumAno = CStr(!Num + 1) & "/" & CStr(intYear)
End If
.Close
End With
Set rst = Nothing
Set db = Nothing
End Function
No formulário que deverá gerar a numeração, tenho o seguinte:
Private Sub Form_BeforeUpdate(Cancel As Integer)
On Error GoTo Form_BeforeUpdate_Err
' Só executa a rotina se o campo [CodPedido] está vazio
If IsNull([CodPedido]) Then
Dim strUltPedido As String ' código completo do último pedido
Dim dataUltPedido As Date ' data do último pedido
Dim sAno As String ' string do ano com 4 dígitos
Dim sPref As String ' string do prefixo
' Dim anomes As String ' parte ano+mês do código (parte 1)
Dim numUltPedido As Integer ' parte numérica seqüencial do código (parte 2)
Const formatoNum As String = "0000#" ' formato da parte numérica: 5 dígitos
' Abre o banco de dados e a tabela tabPedidos
Dim db As Database
Dim t As Recordset
Set db = DBEngine(0)(0)
Set db = CurrentDb
Set t = db.OpenRecordset("tabPedidosFP", dbOpenTable)
' Parte 1 do código: ano atual (com 4 dígitos)
sAno = Left(CStr(Year(Now)), 4)
' Parte 1a do código: Prefixo
sPref = [OrderTypePrefix]
'--------------------------------------------------
' Montagem da parte 2 do código: número seqüencial
'--------------------------------------------------
' A tabela não tem registros; começa a contagem
If t.BOF = True And t.EOF = True Then
[CodPedido] = sPref & sAno & Format(1, formatoNum)
' A tabela tem registro; então, vai para o último
Else
t.MoveLast
'Obtém código e data e prefixo do último pedido
strUltPedido = t![CodPedido]
dataUltPedido = t![Data]
numUltPedido = Val(Right(strUltPedido, Len(formatoNum)))
' Novo pedido é feito no mesmo ano do anterior
If Year(Now) = Year(dataUltPedido) Then
[CodPedido] = [OrderTypePrefix] & sAno & Format(numUltPedido + 1, formatoNum)
' O ano atual é diferente; reinicia a contagem
Else
[CodPedido] = [OrderTypePrefix] & sAno & Format(1, formatoNum)
End If
End If
' Fecha a tabela e o banco de dados
t.Close
db.Close
End If
Form_BeforeUpdate_Fim:
Exit Sub
Form_BeforeUpdate_Err:
MsgBox Err.Description
Resume Form_BeforeUpdate_Fim
End Sub
O que se poderá ter passado? O que me falta fazer para que este código corra no front end?
Agradeço desde já a ajuda que me possam disponibilizar!
Maria