ALGUMAS DICAS ÚTEIS PARA O MS ACCESS 1 - ALTERNATIVA PARA O TIPO AUTO-NUMERAÇÃO COM A FUNÇÃO DMAX Como o Campo do tipo autonumeração que vem com o Access é muito útil mas tem seusinconvenientes, veja aqui uma alternativa para ele. Esta alternativa somente funciona em formulários únicos no Formulário principal. - Abra o formulário no modo estrutura - Selecione o campo chave primária da tabela em que o form se baseia - Abra a janela de propriedades. - Agora vá até a propriedade Valor padrão (aba Dados) e digite: Nz(DMax("[Código do Cliente]", "Cliente")) + 1 O Nz previne valores nulos. [Código do Cliente] é o nome do Campo Chave. Clientes é o nome da Tabela. Para um controle mais sofisticado use a função abaixo no evento No atual do Formulário: Private Sub Form_Current() If Me.NewRecord Then On Error Resume Next 'Apenas por segurança... Me![Código do Cliente].DefaultValue = Nz(DMax("[Código do Cliente]", "Cliente"), 0) + 1 End If End Sub 2 - TORNANDO O PRIMEIRO (OU OUTRO) ITEM DE UMA COMBO BOX COMO DEFAULT As combo box no Access ao serem exibidam, por default, não exibem nenhum registro. Caso desejemos que ao abrir o form uma combo exiba um determinado registro, podemos usar a seguinte sintaxe: Na propriedade Valor padrão da combo digitamos: [UF].[ItemData](5) No caso UF é o nome da combo box e 5 indica que desejo exibir como default o sexto registro, no caso Ceará. ALERTA.: tenha muito cuidado ao exibir campos como padrão, pois podem induzir o usuário a errar, já que ele poderá passar sem cadastrar este Campo. 3 - EVITE UTILIZAR COMO NOME DE CONTROLES ALGUMA PALAVRA RESERVADA DO ACCESS Uma destas que me tem causado problemas é a palavra reservada "VALOR", prin- cipalmente quando vamos utilizar em operações. 4 - DESFAZER NO ACCESS Coloque no evento desejado: DoCmd.RunCommand acCmdUndo 5 - EVITANDO A MENSAGEM DE ERRO PADRÃO DE COMBOBOX Digitar no evento que trata a ComboBox: Response = acDataErrContinue 6 - QUANDO OCORRE O EVENTO "NO ATUAL (CURRENT)"? Ocorre durante a mudança de um registro para outro 7 - CAIXA DE MENSAGEM QUE SOLICITA CONFIRMAÇÃO Dim msg msg = MsgBox("Aqui a mensagem!", vbYesNo, "Aqui o título") If msg = vbYes Then DoCmd.Close 'Apenas um exemplo Else MsgBox "Você clicou em NÃO!" End If Alternativa: If MsgBox("Mensagem", vbYesNo + vbDefaultButton1, "Título") = vbYes Then MsgBox "Você clicou em SIM!" Else MsgBox "Você clicou em NÃO!" End If 8 - USO DA FUNÇÃO IIF (SeImed) = SeImed([TotalPedido] > 100; "Atingiu"; "Tente novamente") Sgnifica: Se TotalPedido for > 100 mostre Atingiu Se TotalPedido for <= 100 mostre "Tente novamente" Em módulos o SeImed transforma-se em IIF e o ponto e vírgula muda para vírgula, o restante permanece igual. Outra aplicação útil. Na Origem do Controle: =Soma(SeImed([Pagamento] É Nulo;0;Nz([Valor da conta])+Nz([Valor do juro]))) Somente irá somar quando o Campo Pagamento estiver preenchido. 9 - EXPLORE AO MÁXIMO AS CONSULTAS DO ACCESS Sempre que tiver um Formulário ou Relatório que tenha alguma operação entre Campos/Controles, como Totalização, Soma, etc. Não baseie seu Formulário ou Relatório diretamente na Tabela para depois criar Campos calculados, prefira criar estes Campos calculados em uma Consulta, pois fica mais consistente. Tenho tido muita dificuldade de efetuar operações em Campos calculados em Formulários e principalmente em Relatórios já quando estes cálculos são feitos nas Consultas e baseando o Formulário na Consulta a coisa anda realmente com mais facilidade. 10 - REFERÊNCIA A CONTROLES DE OUTROS FORMULÁRIOS - Referência a um Controle de um Subformulário. Estando num Formulário, para fazer referênca a um Controle que esteja num sub formulário deste Form: [ItensDaObra].Formulário![Data] - Referindo-so a um controle de outro Formulário: Formulários![ContasPagar]![txtTotalPg] - Fazendo referência a um Controle que está em um sub de outro form: Formulários![FormPrincipal]![Subformulário].Formulário![controle] - Para um subformulário aninhado, utilize a seguinte sintaxe: Formulários![FormPrincipal]![SubForm].Formulários![SubFormAninhado]Formulário![controle] OBSERVAÇÃO IMPORTANTE: As referências acima são apenas para ser utilizadas em propriedades como Origem do Controle e outras, para usar estas referências em Módulos, mudar de: - Formulários para Forms - Formulário para Form 11 - FUNÇÃO QUE FORÇA O USUÁRIO A CONFIRMAR A DATA DO SISTEMA Adaptada de uma função de martinelle@icmg.seut.org.br, do site Access Brasil Private Sub Form_Open(Cancel As Integer) 'Adaptada de uma função de martinelle@icmg.seut.org.br, no 'site Access Brasil Dim DataAtual As Date Dim msg msg = MsgBox("A data atual é " & vbCrLf & Format(Date, "dddddd") & " Deseja atualizar?", vbYesNo + vbDefaultButton2, "Atualização de Data") Voltar: If msg = vbYes Then On Error Resume Next DataAtual = Nz(InputBox("Digite a data no formato dd/mm/aaaa")) If Not IsDate(DataAtual) Then MsgBox "Formato inválido, OK para digitar novamente" GoTo Voltar Exit Sub Else Date = DataAtual End If End If End Sub 12 - PROIBINDO A EXCLUSÃO DE REGISTROS No Evento Ao excluir do Formulário: Sub Form_Delete (Cancel As Integer) MsgBox "Não é permitida a exclusão de registros!", 48, "Proibido Excluir" DoCmd.CancelEvent End Sub 13 - USANDO UMA BARRA DE ROLAGEM HORIZONTAL NO ACCESS - Abrir o Formulário no modo estrutura - Cricar no botão Mais controles da Caixa de Ferramentas - Clicar em Microsoft Forms 2.0 ScrollBar (ou superior) - Desenhe a barra de rolagem horizontal na posição desejada - Mude o Nome da barra para HSBar na aba Outra da janela de propriedades - Aproveite e altere também na mesma aba as propriedades seguintes: Min = 0 Max = 1000 SmallChange = 10 'Valor para clique nas setas LargeChange = 100 'Valor para o arrasto do retângulo central Estas são as propriedades da Barra. Agora vamos criar um Rótulo para acusar as alterações da Barra ao rolar. Crie um Rótulo e altere as seguintes propriedades: Nome = rotHSB Legenda = 0 Evento para a Barra. Selecione a barra e construa a rotina abaixo no Evento Ao atualizar: Private Sub HSBar_Updated(Code As Integer) rotHSB.Caption = HSBar.Value End Sub 14 - FUNÇÃO QUE FECHA O ACCESS AO CHEGAR UMA DATA Esta dica rolou na lista de VB da Virtualand, ou será que foi na de Access, access-br? Não lembro mais. Private Sub Form_Open(Cancel As Integer) If Date = #8/29/00# Then MsgBox "Tempo de uso esgotou. Favor contactar o programador!" Quit End If End Sub 15 - SELECIONAR TODO O CONTEÚDO DE CAIXA DE TEXTO AO COLOCAR O FOCO NA MESMA No evento Ao receer o foco (GotFocus), escreva: Text1.SelStart = 0 Text1.SelLength = Len(Text1) Rolou na lista de VB da Virtualand 16 - COMBO BOX ABRINDO AO RECEBER O FOCO No Evento Ao receber o Foco da Combo: SendKeys "{F4}" 17 - COMO CRIPTOGRAFAR UM BANCO DE DADOS? - Feche o Banco de Dados, caso esteja aberto - Ferramentas - Segurança - Criptografar 18 - QUANDO USAR O . OU O ! EM REFERÊNCIAS? Ex.: Forms!Form1.Visible = True ! - Usar à esquerda de algo que você criou (Formulário, Controle, etc) . - Usar para algo definido pelo Access (Método, Propriedade, etc) 19 - FUNÇÃO COM DIAS DA SEMANA Dim daynum, today As String ' Notice, first day of the week is vbSunday. daynum = WeekDay(Now) If daynum = 1 Then today = " domingo. " If daynum = 2 Then today = " segunda-feira. " If daynum = 3 Then today = " terça-feira. " If daynum = 4 Then today = " quarta-feira. " If daynum = 5 Then today = " quinta-feira. " If daynum = 6 Then today = " sexta-feira. " If daynum = 7 Then today = " sábado. " MsgBox "Hoje é" & today Do site www.camonet.com Adaptação de Ribamar FS - ribafs@yahoo.com - 13/06/2000 20 - EXCLUIR REGISTRO Public Function ExcluirRegistro() DoCmd.SetWarnings False DoCmd.RunCommand acCmdSelectRecord DoCmd.RunCommand acCmdDeleteRecord DoCmd.SetWarnings True End Function 21 - SALVAR REGISTRO Public Function SalvarRegistro() DoCmd.RunCommand acCmdSaveRecord End Function 22 - PRÓXIMO REGISTRO Public Function ProximoRegistro() On Error GoTo Err_Proximo DoCmd.GoToRecord , , acNext Exit Function Err_Proximo: If Err.Number = 2105 Then MsgBox "Você Encontrou o último registro", 16, "Atenção" Else MSG_ERRO End If End Function 23 - REGISTRO ALTERIOR Public Function RegistroAnterior() On Error GoTo Err_Anterior DoCmd.GoToRecord , , acPrevious Exit Function Err_Anterior: If Err.Number = 2105 Then MsgBox "Você Encontrou o primeiro registro", 16, "Atenção" Else MSG_ERRO End If End Function 24 - NOVO REGISTRO Public Function NovoRegistro() DoCmd.GoToRecord , , acNewRec End Function 25 - EXECUTAR UMA CONEXÃO DIAL-UP Autoria de HELIO CANDIDO Public Sub ExecutarDialUp(NomeDaDialUp As String) Dim Executar Executar = Shell("rundll32.exe rnaui.dll,RnaDial " & NomeDaDialUp, 0) End Sub 26 - TRATANDO TEXTO COMO NÚMERO Estas rotinas fora desenvolvidas para suprir deficiências do Access, VB e cia no sentido de trabalhar com números decimais com mais de 6 dígitos decimais: Private Sub Quantidade_LostFocus() Dim virgula As Long Dim direita As String 'Como é um campo Requerido If IsNull(Quantidade) Then 'O Campo Quantidade é do tipo texto MsgBox "Preenchimento obrigatório!" DoCmd.CancelEvent SendKeys "{up}" Else 'Guardar a posição onde estará a vírgula virgula = InStr(1, Quantidade, ",", vbTextCompare) direita = Right(Quantidade, Len(Quantidade) - virgula) 'Na definição do Campo Quantidade na Tabela ficou: Texto, Tamanho 17 'Prevenir que não se digite mais que 8 decimais If direita > "99999999" Then MsgBox "Somente até 8 decimais!)" DoCmd.CancelEvent SendKeys "{up}" End If End If End Sub Private Sub Quantidade_KeyPress(KeyAscii As Integer) 'Impedir entradas não numéricas If KeyAscii = 8 Or KeyAscii = Asc(",") Then Exit Sub If KeyAscii < Asc("0") Or KeyAscii > Asc("9") Then KeyAscii = 0 'Alternativas: 'If (KeyAscii >= vbKey0 And KeyAscii <= vbKey9) Or KeyAscii = vbKeyBack or KeyAscii=44 Then ' Exit Sub 'Else ' KeyAscii = 0 'End If 'If KeyAscii = 8 Or KeyAscii = 44 Then Exit Sub 'If KeyAscii < 48 Or KeyAscii > 57 Then KeyAscii = 0 End Sub 27 - CÓDIGOS DE TECLAS (KeyAscii) De 0 - 9 (48 a 57) De a - z (97 a 122) De A - Z (65 a 90) Vírgula = 44 Ponto Final = 46 28 - PERMITIR APENAS NÚMEROS EM CAIXA DE TEXTO Colocar no Evento KeyPress (Ao pressionar tecla) If (KeyAscii >= vbKey0 And KeyAscii <= vbKey9) Or KeyAscii = vbKeyBack Then Exit Sub Else KeyAscii = 0 End If 29 - SELECIONAR QUANTIDADE DE CÓPIAS VIA CÓDIGO Function NCopias() Dim cópias As Integer cópias = InputBox("Quantas cópias?") DoCmd.PrintOut , , , , cópias End Function 30 - SAIR DO ACCESS COM CONFIRMAÇÃO Function Sair() If MsgBox("Você deseja sair do aplicativo?", vbYesNo + vbQuestion, _ "Confirmação") = vbYes Then 'Esconder a "Barra de Status" 'Application.SetOption "Mostrar Barra de Status", False Application.Quit acPrompt End End If End Function 31 - OBRIGAR PREECHIMENTO DE CAMPO No Evento Ao perder o foco do Campo/Controle: Private Sub NomeCliente_LostFocus() If IsNull(NomeCliente) Then MsgBox "Preenchimento obrigatório!" DoCmd.CancelEvent SendKeys "{UP}" End If End Sub 32 - REPETIR CONTEÚDO DO ÚLTIMO REGISTRO NO ATUAL Dica de MARCIO DA SILVA VIEIRA CS39152@csn.com.br na lista Access-br. 1. Abra a estrutura de seu formulário ; 2. Selecione todos os campos que vc deseja que os dados se repitam ; 3. Abra a folha de propriedades através da barra de ferramentas ; 4. Clique no campo Marca da guia : Outra 5. Digite : Repetir 6. Crie um Procedimento de evento no seu formulário(Antes de Atualizar), como segue : Private Sub Form_BeforeUpdate(Cancel As Integer) Dim ctlCampo As Control Dim strAspas As String For Each ctlCampo In Me If ctlCampo.Tag = "Repetir" Then If Not IsNumeric(ctlCampo) Then strAspas = Chr(34) Else strAspas = "" End If ctlCampo.DefaultValue = strAspas & ctlCampo & strAspas End If Next ctlCampo End Sub 7. Salve as alterações e experimente ! 33 - CRIAR MODELO DE FORMULÁRIO/RELATÓRIO Crie um formulário com todas as propriedades desejadas como padrão e salve com nome Normal. Caso deseje Salvar com outro nome terá que informar esse nome em Ferramentas - Opções - Formulários/Relatórios - Modelo de... 34 - SOLICITANDO PARÂMETROS EM CONSULTA SQL SELECT * FROM Clientes WHERE NomeCli = [Qual o nome do Cliente?]; Esta consulta solicita o Nome do Cliente e informa apenas os encontrados com o nome solicitado. 35 - EXIBINDO A CAIXA CONTAS DE GRUPOS E USUÁRIOS Public Function ExibirSegurança() DoCmd.RunCommand acCmdUserAndGroupAccounts End Function -------------------------------- Cantinho dos Amantes do Access www.ribafs.hpg.com.br/access