DUVIDA NO VB6
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...
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...
existe um numero identificador unico nesta tabela?
Olá, existe sim. Tem uma coluna chamada codint que eh primary key.
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.
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.
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.
Não é meu e sim pego em algum que não lembro.
Tem como mandar o seu banco com essa tabela aqui pro fórum?
Dá pra fazer com sum e group by por datas
Dá pra fazer com sum e group by por datas
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.
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.
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
[ô]No evento que preferir coloque, ex: no click de um botao
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.
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.
Execute esta query:
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?
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?
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
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.
Tópico encerrado , respostas não são mais permitidas