MOSTRAR NO LISTVIEW RESULTADO CORRETO DO SQL

VALDECYR 10/09/2012 09:58:36
#409344
Bom dia Pessoal !

Certa vez tive a ajuda aqui no Fórum para resolver um problema de quantidades a pagar de cerveja numa promoção, onde conforme o consumo o cliente paga uma parte e outra parte fica sem pagar, e o problema foi resolvido conforme a rotina abaixo:

SQL = [Ô]SELECT p.meucod, p.descricao, p.valorvenda, pdv.qtdenormal, pdv.qtdecobra, pdv.valido, pe.codigo, sum(pe.unidade) as quantidade, max(pe.datahora) as hora[Ô]
SQL = SQL & [Ô] FROM pedidos pe, produtosderiv pdv, produtos p[Ô]
SQL = SQL & [Ô] WHERE pe.produto = p.meucod and pe.produto = pdv.prod and pe.datafecha is null and pe.cartao = [Ô] & TxtMesa.Text & [Ô] and p.promocao = [ô]Quantidade[ô] and pdv.valido = [ô]Sim[ô] GROUP BY p.meucod[Ô]
Cursor.Open SQL, Cn
If Cursor.EOF = False Then
[ô]cálculo da promoção
Consumiu = Cursor!Quantidade
Cobra = Cursor!qtdecobra
Normal = Cursor!qtdenormal
Diferenca = Normal - Cobra
Desconto = Int((Consumiu / Normal) * Diferenca)
Paga = Consumiu - Desconto
Ganha = Desconto

If Consumiu < Normal Then
[ô]paga sem atingir a quantidade da promoção
Set Lista = LVPedidos.ListItems.Add(, , Cursor!meucod & [Ô] - [Ô] & Cursor!descricao)
Lista.SubItems(1) = Consumiu
Lista.SubItems(2) = Format(CCur(Cursor!VALORVENDA), [Ô]#,##0.00[Ô])
Lista.SubItems(3) = Format(CCur(Cobra * Cursor!VALORVENDA), [Ô]#,##0.00[Ô])
Lista.SubItems(4) = Cursor!Hora
Lista.SubItems(5) = Cursor!Codigo
End If
If Consumiu >= Normal Then
Do Until Cursor.EOF = True
[ô]quanto paga
Set Lista = LVPedidos.ListItems.Add(, , Cursor!meucod & [Ô] - [Ô] & Cursor!descricao)
Lista.SubItems(1) = Paga
Lista.SubItems(2) = Format(CCur(Cursor!VALORVENDA), [Ô]#,##0.00[Ô])
Lista.SubItems(3) = Format(CCur(Paga * Cursor!VALORVENDA), [Ô]#,##0.00[Ô])
Lista.SubItems(4) = Cursor!Hora
Lista.SubItems(5) = Cursor!Codigo
[ô]sem pagar
Set Lista = LVPedidos.ListItems.Add(, , Cursor!meucod & [Ô] - [Ô] & Cursor!descricao & [Ô]-Promoção[Ô])
Lista.SubItems(1) = Ganha
Lista.SubItems(2) = Format(CCur(Cursor!VALORVENDA), [Ô]#,##0.00[Ô])
Lista.SubItems(3) = Format(CCur(Ganha * 0), [Ô]#,##0.00[Ô])
Lista.SubItems(4) = Cursor!Hora
Lista.SubItems(5) = Cursor!Codigo
Cursor.MoveNext
Loop
End If
Cursor.Close

O problema é que foi feito para uma determinada cerveja, é o código acima mostra tudo certo para aquela cerveja, só que agora, pode ser pra várias marcas de cerveja, ele até mostra certo todas as cervejas na lista e os valores a pagar, o problema e que repete a mesma quantidade pra todas as cervejas igual a primeira marca da lista.

Exemplo para duas cervejas que: uma foi comprada 12 no total, pagou 9 e ficou 3 de graça e a outra deveria aparecer total 4, pagou 3 e 1 ficou sem pagar.
no list aparece:
Cod/Nome qtde valor Total
1100 - Itaipava Premium 9 4,90 44,10
1100 - Itaipava Preminum 3 4,90 0,00
1101 - Itaipava Pilsen 9 3,80 34,20
1101 - Itaipava Pilsen 3 3,80 0,00
o certo seria:
Cod/Nome qtde valor Total
1100 - Itaipava Premium 9 4,90 44,10
1100 - Itaipava Preminum 3 4,90 0,00
1101 - Itaipava Pilsen 3 3,80 11,40
1101 - Itaipava Pilsen 1 3,80 0,00

Não estou conseguindo enxergar como resolver esse problema no list.
Alguém poderia me ajudar, por favor?

Grato,
VALDECYR 11/09/2012 12:04:12
#409431
Bom dia Pessoal !

Não sei se consegui explicar direito a dúvida, mas a Sql abaixo:

SQL = [Ô]SELECT p.meucod, p.descricao, p.valorvenda, pdv.qtdenormal, pdv.qtdecobra, pdv.valido, pe.codigo, sum(pe.unidade) as quantidade, max(pe.datahora) as hora[Ô]
SQL = SQL & [Ô] FROM pedidos pe, produtosderiv pdv, produtos p[Ô]
SQL = SQL & [Ô] WHERE pe.produto = p.meucod and pe.produto = pdv.prod and pe.datafecha is null and pe.cartao = [Ô] & TxtMesa.Text & [Ô] and p.promocao = [ô]Quantidade[ô] and pdv.valido = [ô]Sim[ô] GROUP BY p.meucod[Ô]

traz os dados abaixo (coloquei os principais)

meucod/descricao valorvenda qtdenormal qtdecobra qtdetotalvendida
1100 - Itaipava Premium 4,90 4 3 12
1101 - Itaipava Pilsen 3,80 4 3 4

então, a list, LVPedidos está mostrando certo os dados do primeiro produto onde:
se quando vender 4 cobra só 3, no caso vendeu no total 12, então cobra 9 e não paga 3,
só que o segundo produto está repetindo as mesmas quantidades do primeiro 9 e 3, sendo o certo 3 e 1.

Já tentei fazer com FOR contando a quantidade de produtos e também não dá certo.

Alguém tem alguma idéia?

Obrigado, Valdecyr


KERPLUNK 11/09/2012 14:44:30
#409443
Para podermos ajudar, precisamos:
A estrutura das tabelas pedidos, produtosderiv e produtos
E o que exatamente você quer listar. Só olhar código, não adianta quase nada.
MARCELO.TREZE 11/09/2012 15:37:51
#409445
Resposta escolhida
Lembro que no outro tópico havíamos discutido esta possibilidade de haver uma nova promoção e ocorrer este problema.


bom o correto seria na tabela de promoção existir os seguintes campos:

Mesa
CodProduto
DescrProduto
TotalConsumido
A_Cada
Cobrar_Apenas


com estrutura acima ficaria fácil fazer diversos calculos, talvez depois você consiga implantar isto ao seu projeto, porém vaja um exemplo de lançamentos




[th][/th]
Tabela Promoções
MesaCodProdutoDescrProdutoTotalConsumidoA_CadaCobrar_apenas
00011342Cerveja Pilsen1243


seguindo a tabela acima bastaria usar uma função unica que faria o codigo, tipo esta


Function Promocao(QtdeTotal As Integer, ACada As Integer, Cobrar As Integer) As String
Dim Resto As Integer, totalcobrar As Integer
Resto = (QtdeTotal Mod ACada)
totalcobrar = (((QtdeTotal - Resto) / ACada) * Cobrar) + Resto
Descontar = QtdeTotal - totalcobrar
promocao = totalcobrar & [Ô] - [Ô] & descontar
End Function


inserindo os dados da tabela na função

msgbox Promocao(rs!TotalConsumido,rs!A_cada,rs!Cobrar_apenas)


e vai exibir ( 9 - 3 )


logico que fica a seu critério fazer as alterações necessarias, assim não precisaria usar os if que usa


VALDECYR 11/09/2012 16:28:41
#409446
Boa tarde!

Está certo, seguindo o que vocês falaram, deverei verificar a mudança da estrutura das tabelas e ver o que consigo.
Vou estar trabalhando nisso, depois retorno ao tópico

Já ajudou bastante,

Obrigado,
Abraços,
Valdecyr
VALDECYR 24/09/2012 13:23:39
#410352
Boa tarde Pessoal!

Muito obrigado Marcelo Treze, o problema era mesmo a estrutura das tabelas
Segui sua lógica, e no final acabou dando tudo certo. Valew pelo interesse em ajudar com tantos detalhes.

Abraços,

Valdecyr
Tópico encerrado , respostas não são mais permitidas