Quem usa a função msgbox para personalizar as mensagens de
advertência ou erro, e utiliza um string onde coloca a mensagem
que pretende, fazendo uso do caracter @ (coloca a primeira linha
a bold e permite até 2 parágrafos sem ser necessário usar a
sequência "& vbcr &") já com certeza reparou que ao
converter de Access 97 para 2000, esta funcionalidade
desaparece.
|
 |
O exemplo a seguir gera, em Access 97, a mensagem em cima.
(...)
rst.Index = "Index2"
rst.MoveFirst
rst.Seek ">=", 0, d
If Not rst.NoMatch Then
Do While rst!Data = Me!Data
If rst!Data = Me!Data And rst!Hora = Me!Hora And rst!Programa <>Me!Programa Then
Mens = "Atenção!@ Essa hora já está ocupada com outro
programa!@"
MsgBox Mens, vbCritical + vbOKOnly, "Marcações"
Cancel = True
Exit Do
End If
rst.MoveNext
If rst.EOF Then
Exit Do
End If
Loop
End If
(...)
|
No entanto, se fôr feita a conversão para o Access 2000,
aparece-nos uma mensagem como a que está ao lado, ou seja, a
formatação gerada pelo caracter @, desaparece por completo.
Para se resolver este problema, basta
|
 |
criarmos na versão 2000 ou XP (de preferência num módulo) a
seguinte função:
Function NovaMsgBox(Prompt As String, _
Optional Buttons As VbMsgBoxStyle = vbOKOnly, _
Optional Title As String, Optional HelpFile As Variant, _
Optional Context As Variant) As VbMsgBoxResult
Dim strMsg As String
If IsMissing(HelpFile) Or IsMissing(Context) Then
strMsg = "MsgBox(" & Chr(34) & Prompt & Chr(34) & ", " & Buttons
& _
", " & Chr(34) & Title & Chr(34) & ")"
Else
strMsg = "MsgBox(" & Chr(34) & Prompt & Chr(34) & ", " & Buttons
& _
", " & Chr(34) & Title & Chr(34) & ", " & Chr(34) & _
HelpFile & Chr(34) & ", " & Context & ")"
End If
NovaMsgBox = Eval(strMsg)
End Function
|
Depois de criada a função, abre-se um módulo qualquer, ou vamos
para o editor de código de um form e, usando a ferramenta
replace, substituímos a palavra msgbox por novamsgbox como se
apresenta ao lado.
E pronto, este problema está resolvido.
|
 |
|
Formato de datas em string SQL
Embora em Access, se consiga trabalhar com as datas em
qualquer formato, quando se pretende obter dados num determinado
intervalo de tempo, usando para o efeito um string SQL, o único
formato reconhecido é do tipo "mês-dia-ano"
Significa isto que se fôr definida uma variável à qual seja
atribuída um determinado campo onde está uma data, qualquer que
seja o seu formato, no string ela passará a ter o formato
mm-dd-yy, sem ser convertida.
Veja-se o exemplo a seguir. Suponhamos que num determinado form
"Exemplo", nos campos DataInício e DataFim, tínhamos a seguinte
informação:
Form!DataInício = 01.07.2001 (1 de Julho de 2001)
Form!DataFim = 10.03.2001 (10 de Março de 2001)
Se na função seguinte (receitas), não estivesse contemplado o
format das datas (a vermelho), no string strSQL, "a" não
referiria "1 de Julho de 2001" mas sim "7 de Janeiro de 2001" e
"b" não referiria "10 de Março de 2001" mas sim "3 de Outubro de
2001". A ordem dos termos mantinha-se, mas o seu significado
alterava-se.
Para qua a função consiga trabalhar com as datas que realmente
se pretende, é necessário previamente utilizar a função Format(),
para que "a" e "b" tenham as datas correctas mas no formato
utilizado no string.
Public Function Receitas()
On Error GoTo Receitas_Err
Dim db As Database
Dim rst, rst1 As Recordset Dim frm As Form
Dim strSQL As String Dim a, b
Set db = CurrentDb()
Set frm = Forms!Exemplo
a = Format(frm!DataInício, "mm-dd-yy")
b = Format(frm!DataFim, "mm-dd-yy")
strSQL = "SELECT Data,Marcações.Programa,Marcações.DiaSemana,Marcações.Pago," &_
"Marcações.Custo FROM Marcações " & _
"WHERE Data Between #" & a & "# And #" & b & "# " & _
"AND Programa='L01' " & _
"AND Pago=true"
Set rst = db.OpenRecordset(strSQL)
If rst.EOF Then
Beep
Mens = "Informação@ Não existem registos neste período.@"
MsgBox Mens, vbInformation, "Estatística"
Exit Function
End If
(...)
É interessante notar os caracteres com que "a" e "b" são
precedidos e seguidos na sua localização entre os símbolos #.
|

|
Função IsNothing()
Esta função é particularmente útil porque permite avaliar um
campo numa condição de valor nulo ou mesmo vazia.
Evita-se desta forma ter de usar a conjunção de IsNull com
IsEmpty, etc para se avaliar a situação de um campo, que tanto
pode estar a 0 (Null), ou vazio (Empty).
Function IsNothing(varToTest As Variant) As Integer
IsNothing = True
Select Case VarType(varToTest)
Case vbEmpty
Exit Function
Case vbNull
Exit Function
Case vbBoolean
If varToTest Then IsNothing = False
Case vbByte, vbInteger, vbLong, vbSingle, vbDouble, vbCurrency
If varToTest <> 0 Then IsNothing = False
Case vbDate
IsNothing = False
Case vbString
If (Len(varToTest) <> 0 And varToTest <> " ") Then IsNothing = False End Select
End Function
A sua aplicação é extremamente simples como se pode ver no
exemplo a seguir:
Public Function CartasModelo()
On Error GoTo CartasModelo_Err
Set frm = Forms!Marcações
If IsNothing(frm!Programa) Then (analisa se o campo "Programa"
no form "Marcações" é nulo ou está vazio)
Mens = "Atenção!@Não foi escolhido nenhum programa!@Para poder
imprimir "& _
"cartas o campo PROGRAMA deverá estar preenchido.@"
MsgBox Mens, vbExclamation, "Impressão"
Exit Function
End If
CartasModelo_Exit:
Exit Function
CartasModelo_Err:
Erros
Resume CartasModelo_Exit
End Function
|

|
Transportar valores de campos em
forms para os módulos
Quem programa em Access já se deparou com a necessidade de
fazer referência a campos de forms num qualquer módulo (sem ser
um class module).
Para isso cria uma variável a que faz corresponder o respectivo
campo:
dim frm as form, a,b as string
frm=forms!form
a=frm!campo1
b=frm!campo2
Ora, isto é possível de outra forma, bem mais expedita e sem
perder qualquer tipo de eficácia ou criar erros.
Logo no form, quando associamos a execução de uma função ao
evento que se pretende (um clique sobre um botão, por exemplo),
colocamos como argumento dessa função o campo que se pretende.
O exemplo seguinte mostra isso mesmo.
|
Imaginemos que temos um determinado form onde existem os campos
programa, hora e data e desejamos que ao sair deste ultimo campo
(evento On Exit) seja executada uma determinada função (neste
caso maximoprog) mas que leve em conta o conteúdo dos campos
referidos. A forma de o fazer está na figura ao lado.
Agora como escrever o código no módulo?
|
 |
Nestes casos não é
necessário criar nenhuma variável nem associar-lhe o valor do
campo do form.
Reparem na forma de o fazer:
Function MaximoProg(p, d, h)
p,d e h correspondem a Programa, Data e Hora Set db = CurrentDb()
Set marc = db.OpenRecordset("Marcações")
If marc.EOF Then
Exit Function
End If
marc.Index = "Index2"
marc.MoveFirst
marc.Seek ">=", 0, d
Tot = 0
If Not marc.NoMatch Then
Do While marc!Data = d
referência a data
If marc!Data = d And marc!Hora = h And marc!Programa <> p Then
Mais referências
mens = "Atenção!@ Essa hora já está ocupada com outro
programa!@"
MsgBox mens, vbCritical + vbOKOnly, m
DoCmd.CancelEvent
Exit Do
End If
marc.MoveNext
If marc.EOF Then
Exit Do
End If
Loop
End If
(...)
E não é necessário estar a explicitar variáveis.
|
|
|
|