none
Filtrar o ultimo número de registro de cada usuário, armazena-lo e exibi-lo em uma label RRS feed

  • Pergunta

  • Bom dia,

    Estou de desenvolvendo uma programa simples, porém o único item que não conseguir resolver foi o seguinte:

    Meu programa acessa um arquivo txt online, neste txt é armazenado um procedimento feito por todos usuários e os dados são organizados assim:

    #### ARQUIVO DE LOG - TESTE - 14.10.2014
    |TESTE | 1291260 | Ronaldo | 14.10.2014| 07:09|
    |TESTE | 1291261 | Ursula | 14.10.2014| 07:47|
    |TESTE | 1291262 | Ronaldo | 14.10.2014| 07:57|

    Sendo o primeiro dado, o procedimento, o segundo o número do registro feito, o terceiro o nome do usuário, e os respectivos estão claros no exemplo acima. Para cada procedimento feito, é inserido os dados no txt. O que estou tentando fazer e não estou conseguindo é o seguinte: tenho que filtrar o ultimo número de registro de cada usuário, armazena-lo e exibi-lo em uma label.

    Alguem teria uma luz?

    Sou leigo neste assunto e estou com muita dificuldade neste caso.

    terça-feira, 14 de outubro de 2014 14:13

Respostas

  • Buenas.

    primeira coisa que deve-se considerar é que esse registro ele armazena varias propriedades,entao criemos uma classe com as seguintes propriedades:

    PROCEDIMENTO;

    REGISTRO;

    USUARIO;

    DATA;

    Aconselho a usar apenas um campo como referencia de DATA e HORA,portanto exclui-se o campo de HORA

    e os pipes( | ) devem ser utilizados somente para separar as informaçoes,ou seja,deve-se ficar

    com o formato:

    TESTE | 1291260 | Ronaldo | 14.10.2014| 07:09 <<sem o "|" no inicio e fim>>

    A classe fica assim:

    Public Class Log
        Dim xProced As String
    
        Public Property Procedimento As String
            Get
                Return xProced
            End Get
            Set(value As String)
                xProced = value
            End Set
        End Property
    
        Dim xReg As String
    
        Public Property Registro As String
    
            Get
                Return xReg
            End Get
            Set(value As String)
                xReg = value
            End Set
        End Property
    
        Dim xNome As String
    
        Public Property Nome As String
            Get
                Return xNome
            End Get
            Set(value As String)
                xNome = value
            End Set
        End Property
    
        Dim xData As DateTime
    
        Public Property Data As DateTime
            Get
                Return xData
            End Get
            Set(value As DateTime)
                xData = value
            End Set
        End Property
    
    End Class

    no Form:

    Option Strict On
    
    Public Class Form1
    
        'lista de ocorrencias
        Dim xLista As New List(Of Log)
    
        Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
            'recebe os valores separados por "|"
            Dim xVal() As String
            'recebe as linhas do txt
            Dim xValores() As String = Me.TextBox1.Text.Split(New Char() {Chr(13)})
    
            For i As Integer = 0 To xValores.Length - 1
                Dim xLog As New Log
                xVal = xValores(i).Split(New Char() {CChar("|")})
                'adiciona à propriedade da classes seus valores respectivos
                'procedimento posição 0
                xLog.Procedimento = xVal(0)
                'registro posição 1
                xLog.Registro = xVal(1)
                'nome posição 2
                xLog.Nome = xVal(2)
                'data da ocorrencia e hora posição 3
                xLog.Data = CDate(xVal(3))
                'adiciona o objeto à lista de ocorrencia
                xLista.Add(xLog)
            Next
    
            Call getMaior()
        End Sub
    
        Sub getMaior()
            'seleciona os ultimos acontecimentos de cada usuario
            Dim x = xLista.GroupBy(Function(r) r.Nome).Select(Function(g) g.OrderByDescending(Function(z) z.Data).First())
    
            For Each i In x
                'joga na label os valores processados
                Me.Label1.Text += String.Concat(i.Procedimento, "|", i.Registro, "|", i.Nome, "|", i.Data, vbCrLf)
            Next
        End Sub
    
    End Class

    Saida:


    Microsoft Technology Associate (MTA)


    • Editado Eduardo xUni quarta-feira, 15 de outubro de 2014 13:44
    • Marcado como Resposta Xunaider Lima quinta-feira, 16 de outubro de 2014 18:32
    quarta-feira, 15 de outubro de 2014 13:38

Todas as Respostas

  • Buenas.

    primeira coisa que deve-se considerar é que esse registro ele armazena varias propriedades,entao criemos uma classe com as seguintes propriedades:

    PROCEDIMENTO;

    REGISTRO;

    USUARIO;

    DATA;

    Aconselho a usar apenas um campo como referencia de DATA e HORA,portanto exclui-se o campo de HORA

    e os pipes( | ) devem ser utilizados somente para separar as informaçoes,ou seja,deve-se ficar

    com o formato:

    TESTE | 1291260 | Ronaldo | 14.10.2014| 07:09 <<sem o "|" no inicio e fim>>

    A classe fica assim:

    Public Class Log
        Dim xProced As String
    
        Public Property Procedimento As String
            Get
                Return xProced
            End Get
            Set(value As String)
                xProced = value
            End Set
        End Property
    
        Dim xReg As String
    
        Public Property Registro As String
    
            Get
                Return xReg
            End Get
            Set(value As String)
                xReg = value
            End Set
        End Property
    
        Dim xNome As String
    
        Public Property Nome As String
            Get
                Return xNome
            End Get
            Set(value As String)
                xNome = value
            End Set
        End Property
    
        Dim xData As DateTime
    
        Public Property Data As DateTime
            Get
                Return xData
            End Get
            Set(value As DateTime)
                xData = value
            End Set
        End Property
    
    End Class

    no Form:

    Option Strict On
    
    Public Class Form1
    
        'lista de ocorrencias
        Dim xLista As New List(Of Log)
    
        Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
            'recebe os valores separados por "|"
            Dim xVal() As String
            'recebe as linhas do txt
            Dim xValores() As String = Me.TextBox1.Text.Split(New Char() {Chr(13)})
    
            For i As Integer = 0 To xValores.Length - 1
                Dim xLog As New Log
                xVal = xValores(i).Split(New Char() {CChar("|")})
                'adiciona à propriedade da classes seus valores respectivos
                'procedimento posição 0
                xLog.Procedimento = xVal(0)
                'registro posição 1
                xLog.Registro = xVal(1)
                'nome posição 2
                xLog.Nome = xVal(2)
                'data da ocorrencia e hora posição 3
                xLog.Data = CDate(xVal(3))
                'adiciona o objeto à lista de ocorrencia
                xLista.Add(xLog)
            Next
    
            Call getMaior()
        End Sub
    
        Sub getMaior()
            'seleciona os ultimos acontecimentos de cada usuario
            Dim x = xLista.GroupBy(Function(r) r.Nome).Select(Function(g) g.OrderByDescending(Function(z) z.Data).First())
    
            For Each i In x
                'joga na label os valores processados
                Me.Label1.Text += String.Concat(i.Procedimento, "|", i.Registro, "|", i.Nome, "|", i.Data, vbCrLf)
            Next
        End Sub
    
    End Class

    Saida:


    Microsoft Technology Associate (MTA)


    • Editado Eduardo xUni quarta-feira, 15 de outubro de 2014 13:44
    • Marcado como Resposta Xunaider Lima quinta-feira, 16 de outubro de 2014 18:32
    quarta-feira, 15 de outubro de 2014 13:38
  • Muito obrigado cara, funcionou aqui!! Mais uma dúvida, no caso ele está exibindo o ultimo resultado de todos usuários, como faço para filtrar e exibir o ultimo resultado de apenas um usuário?
    quinta-feira, 16 de outubro de 2014 10:07
  • Altere

    Sub getMaior()
            'seleciona os ultimos acontecimentos de cada usuario
            Dim x = xLista.GroupBy(Function(r) r.Nome).Select(Function(g) g.OrderByDescending(Function(z) z.Data).First())
    
            For Each i In x
                'joga na label os valores processados
                Me.Label1.Text += String.Concat(i.Procedimento, "|", i.Registro, "|", i.Nome, "|", i.Data, vbCrLf)
            Next
        End Sub

    Para

    Sub getMaior(ByVal UsuarioProcurado As String)
            'seleciona os ultimos acontecimentos de cada usuario
            Dim x = xLista.GroupBy(Function(r) r.Nome).Select(Function(g) g.OrderByDescending(Function(z) z.Data).First())
    
            For Each i In x
                If (i.Nome = UsuarioProcurado) Then
                    Me.Label1.Text = String.Concat(i.Procedimento, "|", i.Registro, "|", i.Nome, "|", i.Data, vbCrLf)
                    Exit For
                End If
            Next
        End Sub

    E quando chamar a função, passe o argumento o nome que você quer exibir.

    quinta-feira, 16 de outubro de 2014 12:28
  • Cara é exatamente isso que eu queria! Muito obrigado aos dois que me ajudaram!

    quinta-feira, 16 de outubro de 2014 13:14
  • Tranquilo. Mas Xunaider, marca a Resposta do Eduardo então como resposta do tópico para fechar então.
    quinta-feira, 16 de outubro de 2014 18:11