Usuário com melhor resposta
Filtrar o ultimo número de registro de cada usuário, armazena-lo e exibi-lo em uma label

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