DUVIDA NO VB6

ADEMIRJOAO 22/02/2013 13:29:56
#419529
Olá amigos, venho mais uma vez pedir a ajuda dos colegas no VBM. Estou com um problema em uma tabela chamada Movimentos onde eu terei de fazer a soma item a item de um campo. Ex.:

Codigo Data Descrição Movimento Qtde Saldo.
15 20/01/12 Caneta Bic Azul S -3 -3
15 25/01/12 Caneta Bic Azul S -5 -8
15 01/02/12 Caneta Bic Azul E 30 22

Preciso atualizar o campo SALDO conforme exemplifiquei acima nos itens e moivimentos já cadastrados na tabela, dentro de cada item que tenho cadastrado, respeitando as datas dos movimentos. Já sei que dá pra fazer um form e rodar um select atualizando item a item, mas o problema é que tenho cerca de 1800 codigos cadastrados. Se for fazer um por um, vou passar o ano pra terminar. Alguém poderi me ajuda me dando apenas um exemplo de como fazer um comando tipo DO WHILE, mas que ele ao terminar um item passe para o proximo e assim fazendo toda a tabela ?

Desde já agradeço...
MARCELO.TREZE 22/02/2013 17:05:09
#419548
existe um numero identificador unico nesta tabela?
ADEMIRJOAO 22/02/2013 18:19:52
#419555
Olá, existe sim. Tem uma coluna chamada codint que eh primary key.
ADEMIRJOAO 26/02/2013 14:37:45
#419650
Amigos, para esclarecer melhor este meu problema, eu preciso fazer o VB executar o seguinte comando:
Faça a soma dos campos QTDE + MOV, enquanto o COD = X, terminado o COD X, passe para o próximo COD e faça a mesma sentença, até acabar os CODs da tabela.

Aguardo comentário e desde já agradeço a ajuda e a atenção.
OMAR2011 26/02/2013 15:12:39
#419654
Ai vai um exemplo simples para verificar e aproveitar alguma coisa que lhe sirva.
Não é meu e sim pego em algum que não lembro.
LLAIA 27/02/2013 18:18:34
#419695
Tem como mandar o seu banco com essa tabela aqui pro fórum?

Dá pra fazer com sum e group by por datas
ADEMIRJOAO 28/02/2013 14:24:52
#419727
Olá Laendro,

Segue anexo a copia da tabela q estou querendo acertar. Postei apenas algumas linhas pois o banco é muito grande. Quero colocar a soma de QUA dentro no campo [Ô]DISP[Ô] classificando por item.
MARCELO.TREZE 28/02/2013 21:19:45
#419747
Desculpe não responder antes, bom tenho de dizer que não é tão simples assim uma vez que você tem que verificar o valor do registro atual comparar como registro anterior para fazer o calculo, ou seja uma unica query não vai fazer isso, vc precisará de um POG.

minha dica é crie uma array com type definida, faça um select e preencha este array e depois faça um for que atualizará a sua tabela

exemplo

[ô] No general do form coloque

Private Type Valores
CodInt As Integer
Qua As Integer
End Type

Dim CampoValores() As Valores
Dim Cont As Integer


[ô]No evento que preferir coloque, ex: no click de um botao

Cont = 0
sSQL = [Ô] SELECT codint,qua FROM movimentos[Ô]
Set RS = Conexao.Execute(sSQL)

Do While Not RS.EOF
Cont = Cont + 1
Redim Preserve CampoValores(Cont) As Valores
CampoValores(Cont).Codint = RS!codint
CampoValores(Cont).Qua = RS!Qua
Rs.MoveNext
Loop


[txt-color=#007100][ô] Agora Sim, Faremos o calculo atualizando a tabela[/txt-color]

For F = 1 To Ubound(CampoValores)
If F = 1 Then
Conexao.Execute([Ô]UPDATE movimentos SET disp = [Ô] & CampoValores(F).Qua & [Ô] WHERE codint = [Ô] & CampoValores(F).CodInt )
Else
Conexao.Execute([Ô]UPDATE movimentos SET disp = (disp + [Ô] & CampoValores(F - 1).Qua & [Ô]) WHERE codint = [Ô] & CampoValores(F).CodInt )
End If
Next F




bom o código acima faz o seguinte

se for o primeiro registro da array ele apenas copia para disp o valor em qua

qua disp
ex: 15 20/01/12 Caneta Bic Azul S -3 -3

após o primeiro registro o calculo será feito baseado no ultimo valor de disp efetuando o calculo com o valor do qua atual

ex: 15 25/01/12 Caneta Bic Azul S (-5 + -3) -8

e assim por diante

ex: 15 01/02/12 Caneta Bic Azul E (-8 + 30) 22


e é isso, eu só consegui ver desta maneria

ps: eu não testei o código acima isso ficara por sua conta, mas creio que dará certo, não esqueça de fazer um backup da tabela antes de fazer os testes.


LLAIA 01/03/2013 11:22:53
#419761
Execute esta query:

select distinct m1.cod, m1.item, m1.data,(
select sum(m2.qua)
from movimentos m2
where m2.cod = m1.cod and m2.data <= m1.data
) as saldo
from movimentos m1
order by m1.cod,m1.data



Com esta query vc tem o saldo em cada dia. Agora realmente vc precisa registrar o saldo na tua tabela de registro de lançamentos?
LLAIA 01/03/2013 11:45:27
#419762
Acho que esta query resolve oseu problema de vez:

select distinct m1.codint,m1.cod,m1.item,m1.mov,m1.data,m1.qua,(
select sum(m2.qua)
from movimentos m2
where m2.cod = m1.cod and m2.codint <= m1.codint
) as saldo
from movimentos m1
order by m1.cod,m1.codint,m1.data
LLAIA 01/03/2013 11:52:38
#419763
O campo CodInt foi importantíssimo nesse caso, um problema seria um lançamento de uma data retrógrada para um produto qualquer, pois o CodInt ia ficar fora do intervalo para gerar saldo.
Página 1 de 2 [13 registro(s)]
Tópico encerrado , respostas não são mais permitidas