GROUP SUM ORDER BY LINQ
Olá amigos, tudo bem?
tenho um ilist,
com a seguinte estrutura:
ID_CLI,
Cliente e
valor
desejo usar o LINQ para :
agrupar pelo ID_CLi,
Somar o valor e
ordenar pela Soma desceding .
desejo fazer um for next com ID_CLI, Cliente e soma(valor) agrupado.
montei esse Link, mas tem algum erro, o valor não confere, se alguém poder verificar qual a melhor forma de faze-lo.
Dim Linq2 = From t1 In _ilist_ItensPed
Group t1 By t1.ID_CLI, t1.Cliente Into Group
Order By Group.Sum(Function(p) p.Vlr_Total) Descending
Select New With {
.idcli = ID_CLI,
.name = cliente,
.v = Group.Sum(Function(p) p.Vlr_Total),
.count = Group.Count}
tenho um ilist,
com a seguinte estrutura:
ID_CLI,
Cliente e
valor
desejo usar o LINQ para :
agrupar pelo ID_CLi,
Somar o valor e
ordenar pela Soma desceding .
desejo fazer um for next com ID_CLI, Cliente e soma(valor) agrupado.
montei esse Link, mas tem algum erro, o valor não confere, se alguém poder verificar qual a melhor forma de faze-lo.
Dim Linq2 = From t1 In _ilist_ItensPed
Group t1 By t1.ID_CLI, t1.Cliente Into Group
Order By Group.Sum(Function(p) p.Vlr_Total) Descending
Select New With {
.idcli = ID_CLI,
.name = cliente,
.v = Group.Sum(Function(p) p.Vlr_Total),
.count = Group.Count}
Aparentemente esta certo, porém esse count no final da expressão que deve estar te atrapalhando.
Crie uma tela igual a essa m anexo
no evento click do botão coloque o código abaixo
Crie uma tela igual a essa m anexo
no evento click do botão coloque o código abaixo
Dim lista As New List(Of ItensPed)()
lista.Add(New ItensPed() With {.ID_CLI = 1, .Cliente = [Ô]NOME PARA TESTE 1[Ô], .Valor = 1})
lista.Add(New ItensPed() With {.ID_CLI = 2, .Cliente = [Ô]NOME PARA TESTE 2[Ô], .Valor = 12})
lista.Add(New ItensPed() With {.ID_CLI = 3, .Cliente = [Ô]NOME PARA TESTE 3[Ô], .Valor = 13})
lista.Add(New ItensPed() With {.ID_CLI = 4, .Cliente = [Ô]NOME PARA TESTE 4[Ô], .Valor = 14})
lista.Add(New ItensPed() With {.ID_CLI = 5, .Cliente = [Ô]NOME PARA TESTE 5[Ô], .Valor = 15})
lista.Add(New ItensPed() With {.ID_CLI = 6, .Cliente = [Ô]NOME PARA TESTE 6[Ô], .Valor = 16})
lista.Add(New ItensPed() With {.ID_CLI = 7, .Cliente = [Ô]NOME PARA TESTE 7[Ô], .Valor = 17})
lista.Add(New ItensPed() With {.ID_CLI = 8, .Cliente = [Ô]NOME PARA TESTE 8[Ô], .Valor = 18})
lista.Add(New ItensPed() With {.ID_CLI = 9, .Cliente = [Ô]NOME PARA TESTE 9[Ô], .Valor = 19})
lista.Add(New ItensPed() With {.ID_CLI = 1, .Cliente = [Ô]NOME PARA TESTE 1[Ô], .Valor = 21.45})
lista.Add(New ItensPed() With {.ID_CLI = 2, .Cliente = [Ô]NOME PARA TESTE 2[Ô], .Valor = 17.58})
lista.Add(New ItensPed() With {.ID_CLI = 3, .Cliente = [Ô]NOME PARA TESTE 3[Ô], .Valor = 118})
lista.Add(New ItensPed() With {.ID_CLI = 4, .Cliente = [Ô]NOME PARA TESTE 4[Ô], .Valor = 14.59})
lista.Add(New ItensPed() With {.ID_CLI = 5, .Cliente = [Ô]NOME PARA TESTE 5[Ô], .Valor = 145.59})
lista.Add(New ItensPed() With {.ID_CLI = 6, .Cliente = [Ô]NOME PARA TESTE 6[Ô], .Valor = 18.96})
lista.Add(New ItensPed() With {.ID_CLI = 7, .Cliente = [Ô]NOME PARA TESTE 7[Ô], .Valor = 15.01})
lista.Add(New ItensPed() With {.ID_CLI = 8, .Cliente = [Ô]NOME PARA TESTE 8[Ô], .Valor = 19.99})
lista.Add(New ItensPed() With {.ID_CLI = 9, .Cliente = [Ô]NOME PARA TESTE 9[Ô], .Valor = 114.54})
Dim MyList = From l In lista _
Group l By l.ID_CLI, l.Cliente Into Group _
Order By Group.Sum(Function(s) s.Valor) Descending _
Select New With {.COD_CLIENTE = ID_CLI, .NOME_CLIENTE = Cliente, .TOTAL = Group.Sum(Function(s) s.Valor)}
For Each ml In MyList
TextBox1.Text &= [Ô]Cód. [Ô] & ml.COD_CLIENTE & [Ô]: [Ô] & ml.NOME_CLIENTE & Environment.NewLine()
Dim MyListNew = From l In lista _
Where l.ID_CLI = ml.COD_CLIENTE
Order By l.Valor Ascending
Select New With {l.ID_CLI, l.Cliente, l.Valor}
For Each lt In MyListNew
TextBox1.Text &= vbTab & [Ô]R$[Ô] & lt.Valor.ToString([Ô]#0.00[Ô]) & Environment.NewLine()
Next
TextBox1.Text &= vbTab & [Ô]R$[Ô] & ml.TOTAL.ToString([Ô]#0.00[Ô]) & Environment.NewLine() & Environment.NewLine()
Next
Olá Filmam, deu certo
só mais um coisa, tem como a instrução de order by ser opcional ou editável?
o cliente quer ter a opção de ordenar pelo valor total do grupo ou pelo nome do cliente.
desde já agradeço.
só mais um coisa, tem como a instrução de order by ser opcional ou editável?
o cliente quer ter a opção de ordenar pelo valor total do grupo ou pelo nome do cliente.
desde já agradeço.
Faça o seguinte
crie uma tela como a tela em anexo e coloque o código abaixo dentro do evento click do botão
crie uma tela como a tela em anexo e coloque o código abaixo dentro do evento click do botão
TextBox1.Text = String.Empty
Dim lista As New List(Of ItensPed)()
lista.Add(New ItensPed() With {.ID_CLI = 1, .Cliente = [Ô]NOME PARA TESTE 1[Ô], .Valor = 1})
lista.Add(New ItensPed() With {.ID_CLI = 2, .Cliente = [Ô]NOME PARA TESTE 922[Ô], .Valor = 12})
lista.Add(New ItensPed() With {.ID_CLI = 3, .Cliente = [Ô]NOME PARA TESTE 3[Ô], .Valor = 13})
lista.Add(New ItensPed() With {.ID_CLI = 4, .Cliente = [Ô]NOME PARA TESTE 4[Ô], .Valor = 14})
lista.Add(New ItensPed() With {.ID_CLI = 5, .Cliente = [Ô]NOME PARA TESTE 955[Ô], .Valor = 15})
lista.Add(New ItensPed() With {.ID_CLI = 6, .Cliente = [Ô]NOME PARA TESTE 6[Ô], .Valor = 16})
lista.Add(New ItensPed() With {.ID_CLI = 7, .Cliente = [Ô]NOME PARA TESTE 7[Ô], .Valor = 17})
lista.Add(New ItensPed() With {.ID_CLI = 8, .Cliente = [Ô]NOME PARA TESTE 8[Ô], .Valor = 18})
lista.Add(New ItensPed() With {.ID_CLI = 9, .Cliente = [Ô]NOME PARA TESTE 9[Ô], .Valor = 19})
lista.Add(New ItensPed() With {.ID_CLI = 1, .Cliente = [Ô]NOME PARA TESTE 1[Ô], .Valor = 21.45})
lista.Add(New ItensPed() With {.ID_CLI = 2, .Cliente = [Ô]NOME PARA TESTE 922[Ô], .Valor = 17.58})
lista.Add(New ItensPed() With {.ID_CLI = 3, .Cliente = [Ô]NOME PARA TESTE 3[Ô], .Valor = 118})
lista.Add(New ItensPed() With {.ID_CLI = 4, .Cliente = [Ô]NOME PARA TESTE 4[Ô], .Valor = 14.59})
lista.Add(New ItensPed() With {.ID_CLI = 5, .Cliente = [Ô]NOME PARA TESTE 955[Ô], .Valor = 145.59})
lista.Add(New ItensPed() With {.ID_CLI = 6, .Cliente = [Ô]NOME PARA TESTE 6[Ô], .Valor = 18.96})
lista.Add(New ItensPed() With {.ID_CLI = 7, .Cliente = [Ô]NOME PARA TESTE 7[Ô], .Valor = 15.01})
lista.Add(New ItensPed() With {.ID_CLI = 8, .Cliente = [Ô]NOME PARA TESTE 8[Ô], .Valor = 19.99})
lista.Add(New ItensPed() With {.ID_CLI = 9, .Cliente = [Ô]NOME PARA TESTE 9[Ô], .Valor = 114.54})
Dim MyList = From l In lista _
Group l By l.ID_CLI, l.Cliente Into Group _
Select New With {.COD_CLIENTE = ID_CLI, .NOME_CLIENTE = Cliente, .TOTAL = Group.Sum(Function(s) s.Valor)}
Select Case ComboBox1.SelectedIndex
Case 0
MyList = IIf((ComboBox2.SelectedIndex = 0), MyList.OrderBy(Function(o) o.COD_CLIENTE), MyList.OrderByDescending(Function(o) o.COD_CLIENTE))
Case 1
MyList = IIf((ComboBox2.SelectedIndex = 0), MyList.OrderBy(Function(o) o.NOME_CLIENTE), MyList.OrderByDescending(Function(o) o.NOME_CLIENTE))
Case Else
MyList = IIf((ComboBox2.SelectedIndex = 0), MyList.OrderBy(Function(o) o.TOTAL), MyList.OrderByDescending(Function(o) o.TOTAL))
End Select
For Each ml In MyList
TextBox1.Text &= [Ô]Cód. [Ô] & ml.COD_CLIENTE & [Ô]: [Ô] & ml.NOME_CLIENTE & Environment.NewLine()
Dim MyListNew = From l In lista _
Where l.ID_CLI = ml.COD_CLIENTE
Order By l.Valor Ascending
Select New With {l.ID_CLI, l.Cliente, l.Valor}
For Each lt In MyListNew
TextBox1.Text &= vbTab & [Ô]R$[Ô] & lt.Valor.ToString([Ô]#0.00[Ô]) & Environment.NewLine()
Next
TextBox1.Text &= vbTab & [Ô]R$[Ô] & ml.TOTAL.ToString([Ô]#0.00[Ô]) & Environment.NewLine() & Environment.NewLine()
Next
fera! matou..
valeu pela força!
valeu pela força!
Tópico encerrado , respostas não são mais permitidas