Notifications
Clear all

Como contar registros sem repetilos.

9 Posts
2 Usuários
0 Reactions
2,516 Visualizações
(@vbsouza)
Posts: 7
Active Member
Topic starter
 

Olá pessoal sou novo aqui no fórum,
Tenho um sistema de controle de treinamento em VBA, uso BD access e preciso contar os registros que aparecem em um listview com informações de treinamento, quero contar somente os registros dos nomes que não sejam repetidos.
Como posso fazer isso em VBA.

Agradeço se puderem me ajudar.

 
Postado : 17/10/2012 9:13 pm
(@fernandofernandes)
Posts: 43750
Illustrious Member
 

Boa noite!!

Não entendi, você está usando Access?

http://maximoaccess.maisforum.com/t1952 ... ros-unicos

Att

 
Postado : 18/10/2012 4:25 am
(@vbsouza)
Posts: 7
Active Member
Topic starter
 

Desculpe esqueci de citar que estou usando uma planilha de excel com um banco de dados em access.

Fico no aguardo de um help...

 
Postado : 18/10/2012 9:46 am
(@fernandofernandes)
Posts: 43750
Illustrious Member
 

Como os dados são carregados no listview? Utilizando Sql vc pode utilizar em paralelo ao carregamento um SELECT DISTINCTseucampo from suatabela edepois contar o numero de registros.

 
Postado : 18/10/2012 11:48 am
(@vbsouza)
Posts: 7
Active Member
Topic starter
 

Olá Reinaldo,
Tem como fazer uma consulta para contar somente os registros cujo o campo nome não seja repetido e colocar o resultado dessa consulta em um TexBox?
Acredito que seria algo como SELECT COUNT (DISTINCT nome) FROM Cadastro.
Poderia me ajudar quanto a sintaxe correta e como atribuir esse resultado a um TextBox.

Obrigado

 
Postado : 18/10/2012 6:48 pm
(@fernandofernandes)
Posts: 43750
Illustrious Member
 

Em um formulario adicione um textbox =RegistroCadUsu mais um textbox = PesquisaCadClie e um listbox=LisCadClie
Altere os nomes de acordo com os seus campos

Estou usando o LIKE '*" _+ Dados + "*'" _ para conforme for digitando filtrar os nomes... mas você pode muda para o sinal de igual se quiser

cole o codigo abaixo :

Private Sub PesquisaCadclie_Change()
On Error GoTo Trata_Erro

'Declaramos as variáveis utilizadas.
Dim Dados As String, Mensagems As String
Dim Consulta_SQLs As String
Dim resultados As String
Dim Contadors As Integer, Total_encontrados As Integer
      
 '"Zeramos" as variáveis utilizadas
 'para colocar os nomes encontrados
 'dentro do ListBox.
 Contadors = 0
 Total_encontrados = 0
        
 'Limpamos o ListBox.
 LisCadClie.Clear
 
 'O nome (ou o início dele) a ser
 'pesquisado é atribído à variável Dado.
 Dados = PesquisaCadClie.Text
 
 'Monta o comando SQL e o armazena na String Consulta_SQL.
 'Veja que após o nome pesquisado é colocado um asterístico
 'Dado + "*'", para indicar que podem existir outras letras
 'além das especificadas.
 Consulta_SQLs = "SELECT distinct nome " _
              + "FROM cadastro " _
              + "WHERE nome LIKE '*" _
              + Dados + "*'" _
              + "ORDER BY nome;"
    
 'A variável Cadastro (definida como sendo do tipo Recordset
 'em General - Declarations) recebe o resultado da pesquisa
 'SQL montada em Consulta_SQL .
 '
 Set TbCadastro = BancoDeDados.OpenRecordset(Consulta_SQLs, dbOpenDynaset)


 'Verificamos o total de Cadastros encontrados.
 Total_encontrados = TbCadastro.RecordCount
 
 'Em seguida, apresentamos esse
 'total na caixa de texto Registro.
 RegistroCadUsu.Text = Total_encontrados
 If Total_encontrados > 1 Then
    'Caso tenha sido encontrado algum aluno,
    'ajustamos o seguinte ToolTip.
    LisCadClie.ControlTipText = "Clique em um dos Itens " + _
           "disponíveis para verificar dados completos."
 Else
    'Entretanto, caso a pesquisa não encontre
    'pelo menos um aluno com o nome especificado,
    'alteramos o ToolTip para o seguinte texto:
    LisCadClie.ControlTipText = "Nenhum Item disponível."
 End If
 'Alteramos o ToolTip (aquela barra amarela
 'com algum texto explicativo, a qual é
 'apresentada quando passamos com o mouse sobre
 'um objeto - botão, caixa de texto, listbox. etc.
 
 
 
 'O loop Do...Until, utilizado a seguir,
 'coloca os nomes encontrado no ListBox.
 Do
      'É feito um teste para verificar a posição
      'absoluta do registro que será mostrado.
      'Esse teste é apenas uma precaução para que
      'não se tente mostrar um registro inexistente.
      If TbCadastro.AbsolutePosition > -1 Then
                              
          'Adiciona o nome encontrado no ListBox.
          
            LisCadClie.AddItem TbCadastro("Nome")
            
               
          
                    
          'A variável Contador (zerada no início desta
          'procedure) é incrementada. Ela está sendo
          'utilizada para contar o total de registros
          'apresentados aos usuários.
          Contadors = Contadors + 1
      
          'Como a pesquisa SQL foi ordenada por descricao
          '(veja o trecho final da instrução SQL ORDER BY Nome;)
          'agora vamos para o próximo registro,
          'utilizando a instrução MoveNext.
          TbCadastro.MoveNext
      
      
      End If
      
  
  'O loop Do...Loop Until é executado enquanto o
  'Contador for menor ou igual ao total de resgistros
  'encontrados (utilizando a variável Total_encontrado)
  Loop Until Contadors >= Total_encontrados

Exit Sub
Trata_Erro:
MsgBox "Sua Ação Esta Causando uma Falha No Sistema" & Chr(13) & "Tente Reiniciar o Programa, caso o Problema Persistir anote o ERRO." & Chr(13) & "Para Posterior correção pelo Responsavel  do Programa." & Chr(13) & "Tela de Cadastro De Clientes (Campo Pesquisa).", 48, "Problemas Ligue: 99951565"
  
End Sub

 
Postado : 18/10/2012 7:04 pm
(@vbsouza)
Posts: 7
Active Member
Topic starter
 

Vou colocar o meu código abaixo e tentar explicar melhor o que preciso:


' esse é um comando que vem de um click do botão filtrar
Private Sub CommandButton1_Click()
    
    Dim cx As New ClasseConexao
    Dim banco As ADODB.Recordset
    Dim sql As String
    
    
    
    ProcurarPor = Me.ComboBox1.Text
    
    
    With Me.ListView1
        .ListItems.Clear
        
        sql = "SELECT codigo, matricula, nome, departamento, turno, data, horario, instrutor, duracao FROM Cadastro"
        
        
         sql = sql & " WHERE " & ProcurarPor & " LIKE '" & Me.TextBox1.Value & "%'"
              
        Set banco = New ADODB.Recordset
        cx.Conectar
        
        banco.Open sql, cx.Conn, adOpenKeyset, adLockOptimistic
     
                
        Dim i As Integer
        For i = 0 To banco.RecordCount - 1
            If Not IsNull(banco(0)) Then
                .ListItems.Add 1, , banco(0)
                .ListItems(1).ListSubItems.Add 1, , banco(1)
                .ListItems(1).ListSubItems.Add 2, , banco(2)
                .ListItems(1).ListSubItems.Add 3, , banco(3)
                .ListItems(1).ListSubItems.Add 4, , banco(4)
                .ListItems(1).ListSubItems.Add 5, , banco(5)
                .ListItems(1).ListSubItems.Add 6, , banco(6)
                .ListItems(1).ListSubItems.Add 7, , banco(7)
                .ListItems(1).ListSubItems.Add 8, , banco(8)
            
                              
                
            End If
            banco.MoveNext
        Next i
        Set banco = Nothing
        cx.Desconectar
    End With

'Com o código abaixo eu somo o total de minutos que os registro com o campo Duracao contem

Dim e As Long
Dim valor As Double
For e = 1 To Me.ListView1.ListItems.Count
valor = valor + CDbl(Me.ListView1.ListItems(e).ListSubItems(8))
Next e

'Atribuo em uma label a soma em minutos dos registro encontrados
    Me.Label3.Caption = "Tempo de Treinamento " & valor & " minutos"
'Atribuo em outra label o total de registros encontrados
    Me.Label8.Caption = "Total de Resultados " & Me.ListView1.ListItems.Count
    
End Sub

Gostaria encontrar o total de registros cujo o campo nome não se repetisse.
É possível fazer algo parecido como eu já fiz acima?

Agradeço pelo suporte

 
Postado : 19/10/2012 11:37 am
(@fernandofernandes)
Posts: 43750
Illustrious Member
 

sim basta usar o distinct seu campo e lançar os valores em um text box conforme o exemplo que postei....

 
Postado : 19/10/2012 1:17 pm
(@vbsouza)
Posts: 7
Active Member
Topic starter
 

Poxa não estou conseguindo, está dando erro.
Como ficaria isso no código que eu colei?

 
Postado : 19/10/2012 1:46 pm