Portugal

Portugal

 

 

Função msgbox

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.

 

Início

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 #.

Início

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

Início

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.

 

Anterior  Seguinte  Início da página

 

geral@datatrade.net

Optimizado para a resolução 1024x768 - IE 6, tamanho do texto "médio"

Página actualizada em 2005-10-05