LINQ NÃO RETORNA DETERMINADO VALOR

RIOLEAL 15/06/2024 06:58:38
#503358
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)











































IDCódigoDescriçãoPreço
1595761730023070401-0VELA 7 DIAS ORIXÁ BRANCA R$ 8,90
1622602419023070404-0VELA 7 DIAS ORIXÁ BRANCA 316G C/12R$ 96,00
1596095992923070402-0VELA 7 DIAS ORIXÁ BRANCA C/10R$ 80,00
1596905443523070402-1VELA 7 DIAS ORIXÁ BRANCA C/10 - ATACADOR$ 68,44
16235440282Vela 7 dias ORIXÁ Branca C/40 - AtacadoR$ 250,00
1596095993023070403-0VELA 7 DIAS ORIXÁ BRANCA C/40 - ATACADOR$ 273,76



Alguém tem uma ideia?
RIOLEAL 15/06/2024 14:04:23
#503361
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.
Tópico encerrado , respostas não são mais permitidas