JUNTAR ITEMS LISTVIEW
Desculpa aÃ, DS2T, parece que a nossa resposta foi quase ao mesmo tempo.
Poderia concatenar as duas.
up...........
Pode criar um campo ID na planilha? Porque vou precisar de uma chave primária... o provedor do Excel não tem suporte para o Row_Number como no SQL Server.
DS2T é isso que é o ruim por dia são tirados umas 100 planilhas destas pro usuário ficar criando algo dentro dela iria ficar ruim... Já tentei muita coisa...mais nada que me fizesse o sum funciona juntamente com o restante dos dados, um amigo me disse pra fazer um for e preencher outro listview...
DS2T Poderia fazer desta forma que voce falou? Como criaria este campo automaticamente no Excel? se poder me da uma forca agradeceria...
Só copiar e colar...
Achei melhor fazer usando os recursos de enumeração de uma lista genérica do que ficar sofrendo com essas queries sem recurso algum do Excel...
Imports System.Data.OleDb
Public Class Form1
Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
Listar()
End Sub
Private Function RetornaDataTable() As DataTable
Dim pathconn As New OleDbConnectionStringBuilder([Ô]Provider = Microsoft.ACE.OLEDB.12.0; Data source=[Ô] & Application.StartupPath & [Ô]\IDM-relatorio_qtde_presente_ausente_MARCO16-CAMPINAS.xls[Ô] & [Ô];Extended Properties=[Ô][Ô]Excel 12.0;HDR= yes;[Ô][Ô];[Ô])
Dim conn As New OleDbConnection(pathconn.ToString)
Dim dt As New DataTable()
Dim MyDataAdapter As New OleDbDataAdapter(
[Ô]SELECT
DATA AS dat,
especialidade AS espec,
[Profissionais Previstos] AS prev,
[Profissionais Presentes] AS pres,
[Observação] AS obs,
[Detalhes da observação] AS det
FROM
[[Ô] & ([Ô]AMA CAMPINAS[Ô]) & [Ô]$][Ô],
conn)
MyDataAdapter.Fill(dt)
Return dt
End Function
Private Function RetornaListaCompleta() As List(Of Registro)
Dim retorno As New List(Of Registro)
Dim dt As DataTable = RetornaDataTable()
For Each row As DataRow In dt.Rows
Dim novo As New Registro
With novo
.Data = RetornaDataOuNulo(row([Ô]dat[Ô]))
.Especialidade = IIf(Convert.IsDBNull(row([Ô]espec[Ô])), [Ô][Ô], row([Ô]espec[Ô]))
.ProfissionaisPresentes = row([Ô]pres[Ô])
.ProfissionaisPrevistos = row([Ô]prev[Ô])
.Observacao = IIf(Convert.IsDBNull(row([Ô]obs[Ô])), [Ô][Ô], row([Ô]obs[Ô]))
.DetalhesObservacao = IIf(Convert.IsDBNull(row([Ô]det[Ô])), [Ô][Ô], row([Ô]det[Ô]))
retorno.Add(novo)
End With
Next
Return retorno
End Function
Private Function RetornaDataOuNulo(valor As Object) As Nullable(Of DateTime)
Dim retorno As Nullable(Of DateTime)
If Not Convert.IsDBNull(valor) Then
If IsDate(valor) Then
retorno = Convert.ToDateTime(valor)
End If
End If
Return retorno
End Function
Public Sub Listar()
Dim listaCompleta As List(Of Registro) = RetornaListaCompleta()
Dim listaAgrupado As List(Of Registro) = listaCompleta.GroupBy(Function(x) New With {Key x.Data, Key x.Especialidade}).Select(Of Registro)(Function(g) New Registro() With {
.Data = g.Key.Data,
.Especialidade = g.Key.Especialidade,
.ProfissionaisPresentes = g.Sum(Function(k) k.ProfissionaisPresentes),
.ProfissionaisPrevistos = g.Sum(Function(k) k.ProfissionaisPrevistos),
.DetalhesObservacao = String.Join([Ô],[Ô], g.Select(Function(x) x.DetalhesObservacao).ToArray()),
.Observacao = String.Join([Ô],[Ô], g.Select(Function(x) x.Observacao).ToArray())}).ToList()
For Each reg As Registro In listaAgrupado
Dim lst As ListViewItem
lst = ListView1.Items.Add(IIf(IsNothing(reg.Data), [Ô]Sem data[Ô], reg.Data.ToString()))
lst.SubItems.Add(reg.Especialidade)
lst.SubItems.Add(reg.ProfissionaisPrevistos)
lst.SubItems.Add(reg.ProfissionaisPresentes)
lst.SubItems.Add(reg.Observacao)
lst.SubItems.Add(reg.DetalhesObservacao)
Next
End Sub
End Class
Achei melhor fazer usando os recursos de enumeração de uma lista genérica do que ficar sofrendo com essas queries sem recurso algum do Excel...
Imports System.Data.OleDb
Public Class Form1
Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
Listar()
End Sub
Private Function RetornaDataTable() As DataTable
Dim pathconn As New OleDbConnectionStringBuilder([Ô]Provider = Microsoft.ACE.OLEDB.12.0; Data source=[Ô] & Application.StartupPath & [Ô]\IDM-relatorio_qtde_presente_ausente_MARCO16-CAMPINAS.xls[Ô] & [Ô];Extended Properties=[Ô][Ô]Excel 12.0;HDR= yes;[Ô][Ô];[Ô])
Dim conn As New OleDbConnection(pathconn.ToString)
Dim dt As New DataTable()
Dim MyDataAdapter As New OleDbDataAdapter(
[Ô]SELECT
DATA AS dat,
especialidade AS espec,
[Profissionais Previstos] AS prev,
[Profissionais Presentes] AS pres,
[Observação] AS obs,
[Detalhes da observação] AS det
FROM
[[Ô] & ([Ô]AMA CAMPINAS[Ô]) & [Ô]$][Ô],
conn)
MyDataAdapter.Fill(dt)
Return dt
End Function
Private Function RetornaListaCompleta() As List(Of Registro)
Dim retorno As New List(Of Registro)
Dim dt As DataTable = RetornaDataTable()
For Each row As DataRow In dt.Rows
Dim novo As New Registro
With novo
.Data = RetornaDataOuNulo(row([Ô]dat[Ô]))
.Especialidade = IIf(Convert.IsDBNull(row([Ô]espec[Ô])), [Ô][Ô], row([Ô]espec[Ô]))
.ProfissionaisPresentes = row([Ô]pres[Ô])
.ProfissionaisPrevistos = row([Ô]prev[Ô])
.Observacao = IIf(Convert.IsDBNull(row([Ô]obs[Ô])), [Ô][Ô], row([Ô]obs[Ô]))
.DetalhesObservacao = IIf(Convert.IsDBNull(row([Ô]det[Ô])), [Ô][Ô], row([Ô]det[Ô]))
retorno.Add(novo)
End With
Next
Return retorno
End Function
Private Function RetornaDataOuNulo(valor As Object) As Nullable(Of DateTime)
Dim retorno As Nullable(Of DateTime)
If Not Convert.IsDBNull(valor) Then
If IsDate(valor) Then
retorno = Convert.ToDateTime(valor)
End If
End If
Return retorno
End Function
Public Sub Listar()
Dim listaCompleta As List(Of Registro) = RetornaListaCompleta()
Dim listaAgrupado As List(Of Registro) = listaCompleta.GroupBy(Function(x) New With {Key x.Data, Key x.Especialidade}).Select(Of Registro)(Function(g) New Registro() With {
.Data = g.Key.Data,
.Especialidade = g.Key.Especialidade,
.ProfissionaisPresentes = g.Sum(Function(k) k.ProfissionaisPresentes),
.ProfissionaisPrevistos = g.Sum(Function(k) k.ProfissionaisPrevistos),
.DetalhesObservacao = String.Join([Ô],[Ô], g.Select(Function(x) x.DetalhesObservacao).ToArray()),
.Observacao = String.Join([Ô],[Ô], g.Select(Function(x) x.Observacao).ToArray())}).ToList()
For Each reg As Registro In listaAgrupado
Dim lst As ListViewItem
lst = ListView1.Items.Add(IIf(IsNothing(reg.Data), [Ô]Sem data[Ô], reg.Data.ToString()))
lst.SubItems.Add(reg.Especialidade)
lst.SubItems.Add(reg.ProfissionaisPrevistos)
lst.SubItems.Add(reg.ProfissionaisPresentes)
lst.SubItems.Add(reg.Observacao)
lst.SubItems.Add(reg.DetalhesObservacao)
Next
End Sub
End Class
Eta cara, esqueci que criei uma classe hahahahaha
Cria uma classe aà assim:
Public Class Registro
Public Property Data As Nullable(Of DateTime)
Public Property Especialidade As String
Public Property ProfissionaisPrevistos As Byte
Public Property ProfissionaisPresentes As Byte
Public Property Observacao As String
Public Property DetalhesObservacao As String
End Class
Cria uma classe aà assim:
Public Class Registro
Public Property Data As Nullable(Of DateTime)
Public Property Especialidade As String
Public Property ProfissionaisPrevistos As Byte
Public Property ProfissionaisPresentes As Byte
Public Property Observacao As String
Public Property DetalhesObservacao As String
End Class
Vlw pela Ajuda D2ST
D2ST Poderia me explicar como faco para desclarar Registro esta tendo erro em todos dizendo que nao esta registrado...
Tópico encerrado , respostas não são mais permitidas