LINQ NÃO RETORNA DETERMINADO VALOR
Alterado em 15/06/2024 10:39:32
Senhores,
O programa está trabalhando com DataSet em memória para não ficar buscando os produtos a todo momento no BD.
O problema é que, o LINQ não está "pegando", do DataSet, um determinado produto que está, com certeza, listado nele.
O produto tem dois registros:
1. Um registro para o preço normal;
2. Outro registro para o preço com desconto.
Por exemplo:
VELA 7 DIAS ORIXÁ BRANCA C/40 - ATACADO
Vela 7 dias Orixá Branca C/40 - Atacado
Neste exemplo, o produto de cima, em caixa alta, tem código e preço normal (sem desconto).
O produto de baixo, em caixa baixa, não tem código (mas tem ID) e preço com desconto.
Apesar de serem iguais, os valores são diferentes. Por isso, precisa haver 2 registros para cada produto.
O arquivo .xls não pode ser modificado porque faz parte de um banco de dados online de produtos que, infelizmente, é mal estruturado e é de onde eu consigo a listagem de produtos.
Try
'? "clsTabela.table" se refere ao DataSet que fica em memória. "Tables.Item(0)" é a única tabela existente.
Dim sql = From produtos In clsTabela.tabela.Tables.Item(0)
Where produtos("Descrição").Contains(UCase(txtPesquisa.Text.Trim))
Select produtos
For Each item In sql
Dim itemLista
'? Verifica se o código do produto não é nulo. Se for, troca pelo ID de identificação
If Not IsDBNull(item("Código")) Then itemLista = item("Código") Else itemLista = item("ID")
Dim itemList As ListViewItem = lstvPesquisa.Items.Add(itemLista) 'Insere o 1º item
itemList.SubItems.Add(item("Descrição")) 'Insere segunda coluna
valor = item("Preço")
itemList.SubItems.Add(FormatNumber(valor, 2)) 'Insere a terceira coluna
If itemList.Index Mod 2 = 1 Then itemList.BackColor = Color.Ivory 'Zebrar ListView
Next
Catch ex As Exception
MsgBox("Erro: " & ex.Message)
End Try
O DataSet está preenchido normalmente.
Usando a depuração, eu consigo visualizar o item "Vela 7 dias Orixá Branca C/40 - Atacado" (registrado em caixa baixa no BD), mas o LINQ não o retorna e somente pega os registros que estão em caixa alta.
Já tentei tirar o UCase do txtPesquisa. Quando tiro o UCase do código, nenhum produto é retornado.
Já tentei colocar Distinct, no final do LINQ.
Já tentei colocar um código fictício na coluna Código, do banco de dados, deste produto.
Exemplo do arquivo .xls:
(Desculpem. O site empurra a tabela lá para baixo)
Alguém tem uma ideia?
O programa está trabalhando com DataSet em memória para não ficar buscando os produtos a todo momento no BD.
O problema é que, o LINQ não está "pegando", do DataSet, um determinado produto que está, com certeza, listado nele.
O produto tem dois registros:
1. Um registro para o preço normal;
2. Outro registro para o preço com desconto.
Por exemplo:
VELA 7 DIAS ORIXÁ BRANCA C/40 - ATACADO
Vela 7 dias Orixá Branca C/40 - Atacado
Neste exemplo, o produto de cima, em caixa alta, tem código e preço normal (sem desconto).
O produto de baixo, em caixa baixa, não tem código (mas tem ID) e preço com desconto.
Apesar de serem iguais, os valores são diferentes. Por isso, precisa haver 2 registros para cada produto.
O arquivo .xls não pode ser modificado porque faz parte de um banco de dados online de produtos que, infelizmente, é mal estruturado e é de onde eu consigo a listagem de produtos.
Try
'? "clsTabela.table" se refere ao DataSet que fica em memória. "Tables.Item(0)" é a única tabela existente.
Dim sql = From produtos In clsTabela.tabela.Tables.Item(0)
Where produtos("Descrição").Contains(UCase(txtPesquisa.Text.Trim))
Select produtos
For Each item In sql
Dim itemLista
'? Verifica se o código do produto não é nulo. Se for, troca pelo ID de identificação
If Not IsDBNull(item("Código")) Then itemLista = item("Código") Else itemLista = item("ID")
Dim itemList As ListViewItem = lstvPesquisa.Items.Add(itemLista) 'Insere o 1º item
itemList.SubItems.Add(item("Descrição")) 'Insere segunda coluna
valor = item("Preço")
itemList.SubItems.Add(FormatNumber(valor, 2)) 'Insere a terceira coluna
If itemList.Index Mod 2 = 1 Then itemList.BackColor = Color.Ivory 'Zebrar ListView
Next
Catch ex As Exception
MsgBox("Erro: " & ex.Message)
End Try
O DataSet está preenchido normalmente.
Usando a depuração, eu consigo visualizar o item "Vela 7 dias Orixá Branca C/40 - Atacado" (registrado em caixa baixa no BD), mas o LINQ não o retorna e somente pega os registros que estão em caixa alta.
Já tentei tirar o UCase do txtPesquisa. Quando tiro o UCase do código, nenhum produto é retornado.
Já tentei colocar Distinct, no final do LINQ.
Já tentei colocar um código fictício na coluna Código, do banco de dados, deste produto.
Exemplo do arquivo .xls:
(Desculpem. O site empurra a tabela lá para baixo)
ID | Código | Descrição | Preço |
15957617300 | 23070401-0 | VELA 7 DIAS ORIXÁ BRANCA | R$ 8,90 |
16226024190 | 23070404-0 | VELA 7 DIAS ORIXÁ BRANCA 316G C/12 | R$ 96,00 |
15960959929 | 23070402-0 | VELA 7 DIAS ORIXÁ BRANCA C/10 | R$ 80,00 |
15969054435 | 23070402-1 | VELA 7 DIAS ORIXÁ BRANCA C/10 - ATACADO | R$ 68,44 |
16235440282 | Vela 7 dias ORIXÁ Branca C/40 - Atacado | R$ 250,00 | |
15960959930 | 23070403-0 | VELA 7 DIAS ORIXÁ BRANCA C/40 - ATACADO | R$ 273,76 |
Alguém tem uma ideia?
Saudações.
Parece que eu consgui resolver:
Mudei a instrução SELECT e fiz o programa retornar todos os dados da coluna `Descrição` em caixa alta.
Dim oleAdapter As OleDbDataAdapter
Dim dSet As New DataSet
Try
If IsNothing(conexao) Then conectar("EXCEL") 'Conecta ao Access e "seta" a propriedade "conexao"
oleAdapter = New OleDbDataAdapter("SELECT `ID`, `Código`, UCASE(`Descrição`) AS Descrição, `Preço` FROM [produtos$]", conexao)
oleAdapter.Fill(dSet)
Catch ex As Exception
MsgBox("A tabela de produtos não foi carregada devido ao erro:" & vbCrLf & vbCrLf & "Erro: " & ex.Message)
Finally
desconectar()
End Try
tabela = dSet
End Sub
Parece que funcionou.
Vou realizar vários testes agora.
Parece que eu consgui resolver:
Mudei a instrução SELECT e fiz o programa retornar todos os dados da coluna `Descrição` em caixa alta.
Dim oleAdapter As OleDbDataAdapter
Dim dSet As New DataSet
Try
If IsNothing(conexao) Then conectar("EXCEL") 'Conecta ao Access e "seta" a propriedade "conexao"
oleAdapter = New OleDbDataAdapter("SELECT `ID`, `Código`, UCASE(`Descrição`) AS Descrição, `Preço` FROM [produtos$]", conexao)
oleAdapter.Fill(dSet)
Catch ex As Exception
MsgBox("A tabela de produtos não foi carregada devido ao erro:" & vbCrLf & vbCrLf & "Erro: " & ex.Message)
Finally
desconectar()
End Try
tabela = dSet
End Sub
Parece que funcionou.
Vou realizar vários testes agora.
Tópico encerrado , respostas não são mais permitidas