variavel acumulativa

Fórum sobre a linguagem CA-Clipper.

Moderador: Moderadores

ederxc
Usuário Nível 4
Usuário Nível 4
Mensagens: 619
Registrado em: 15 Set 2006 08:40
Localização: Pedreira -SP-

variavel acumulativa

Mensagem por ederxc »

ola pessoal , estou tentando fazer uma variavel acumulativa e ñ sei se estou fazendo de maneira correta ...

estou com um programa de notas fiscais , apos inserir um item da nota tenho a opçao de inserir mais um item para esta mesma nota ou ñ inserir e sair ok.

criei a variavel
// valtot é a variavel de valor total por produto

// vtotnf seria a variavel acumulativa que ira acumular todos os totais da valtot

fiz assim ...

valtot=(valuni*vquant)
vtotnf=valtot
vtotnf++


seria este o caminho ??
vtotnf++
Avatar do usuário
gvc
Colaborador
Colaborador
Mensagens: 1270
Registrado em: 23 Ago 2005 10:57

Mensagem por gvc »

vtotnf := 0

while !(arq)->(eof())
...
valtot = valuni * vquant
vtotnf += valtot // soma o valor de valtot em vtotnf (vtotnf = vtotnf + valtot)
...
(arq)->(dbskip())
end
Editado pela última vez por gvc em 25 Set 2006 17:35, em um total de 1 vez.
Avatar do usuário
vagucs
Membro Master
Membro Master
Mensagens: 1480
Registrado em: 10 Jul 2004 10:45
Localização: Ipanema - MG
Contato:

Mensagem por vagucs »

Bom, é uma das diversas opções, este é o caminho...
Sem mais
Wagner Nunes
www.vagucs.com.br
ederxc
Usuário Nível 4
Usuário Nível 4
Mensagens: 619
Registrado em: 15 Set 2006 08:40
Localização: Pedreira -SP-

Mensagem por ederxc »

cara valeu pela explicação , mas ñ teria um geito mais simples de fazer isso sem usar este comando (alias) até agora ñ consegui intender como ele funciona !! VLW
Avatar do usuário
gvc
Colaborador
Colaborador
Mensagens: 1270
Registrado em: 23 Ago 2005 10:57

Mensagem por gvc »

para vc entender como funciona:

select 2
use produto index codpro

select 1
use pedido index numped

Quando eu vou listar os pedidos, eu tenho que consultar o produto para obter o nome do mesmo.

dbgotop() // posiciona a área/arquivo pedido no inicio.
while !eof() // enquanto não for final do arquivo de pedido

xprod := codpro // guarda o código de produto de pedido na variável.
produto->(dbseek(xprod)) // procura na área produto, pelo código do produto.

? codpro, produto->despro // imprime o código do produto de pedido e a descrição do produto de (área) produto.

dbskip()

end

no módo antigo:
gotop
while !eof()
xprod := codpro
select produto
seek xprod
nprod := produto->despro
select pedido
? codpro, nprod

skip

end

Usando "(alias)-> " vc pode chamar direto da área, sem ter que mudar o controle para ela. No exemplo, eu posso trabalhar com produto sem ter que mudar para a área PRODUTO (select 2). Saber se o registro atual do arquivo produto esta marcado como apagado: produto->(deleted()).
Espero ter ajudado.
Qq problema, poste a dúvida.
Boa sorte.
ederxc
Usuário Nível 4
Usuário Nível 4
Mensagens: 619
Registrado em: 15 Set 2006 08:40
Localização: Pedreira -SP-

Mensagem por ederxc »

então no caso seria idela para fazer comparação entre variaveis e um determinado campo do banco de dados sem o uso do comando (sele) seria mais ou menos isso !
Avatar do usuário
vagucs
Membro Master
Membro Master
Mensagens: 1480
Registrado em: 10 Jul 2004 10:45
Localização: Ipanema - MG
Contato:

Mensagem por vagucs »

Eu sempre programo sem o uso do comando select a anos, fica mais pratico e o codigo fica mais legível pois você consegue saber o que é campo e o que é variável e de qual base de dados a informação está vindo.
Sem mais
Wagner Nunes
www.vagucs.com.br
Avatar do usuário
gvc
Colaborador
Colaborador
Mensagens: 1270
Registrado em: 23 Ago 2005 10:57

Mensagem por gvc »

Sim. Na verdade, vc não tem que mudar de área para poder acessar o campo ou o procedimento/função.

if arq1->codigo = arq2->codigo // Compara os campo codigo das área/alias arq1 e arq2.

Vc tb pode transferir dados

arq1->datanasc := xdata_nasc // Atribui a datanasc, da área arq1 o valor da variável xdata_nasc.
Seria como:
select arq1
replace datanasc with xdata_nasc

Para correr o arquivo, sem ir para área:
arq2->(dbgotop())
while !arq2->(eof()) .and. arq2->codigo = xcodigo

? arq2->codigo, arq2->valor, arq3->val_icms

arq2->(dbskip())
end

Os campos vc chama direto. Ex. pedido->numped
As funções referentes a área, vc coloca entre (). Ex. pedido->(dbrecall())
Para fechar a área: pedido->(dbclosearea())
Equivale a, sem mudar de área:
select pedido
use

Ajudou?
ederxc
Usuário Nível 4
Usuário Nível 4
Mensagens: 619
Registrado em: 15 Set 2006 08:40
Localização: Pedreira -SP-

Mensagem por ederxc »

porra .. com uma explicação dessas c ñ ajudase pode parar hehe .. VLW e muiot obrigado !
Stanis Luksys
Colaborador
Colaborador
Mensagens: 1329
Registrado em: 18 Jun 2005 03:04
Localização: São Paulo
Contato:

Mensagem por Stanis Luksys »

Olá,

Eu acho este tipo de lógica mais interessante quando abrimos todos os arquivos no início do programa, que é algo que eu particularmente não gosto muito de fazer, mas que no entanto facilita muito em diversos aspectos, como por exemplo numa eventual migração de banco etc e tal.

Algumas vezes um "select area" no inicio vale mais a pena do que 30 "area->" no meio do programa. É questão de avaliar o caso.

Na verdade a maioria das funções de banco podem ser usadas 'mesclando' uma maneira com a outra de se programar.

E também a varias maneiras de se fazer a mesma coisa, como no exemplo que foi dado:

Para fechar a área: pedido->(dbclosearea())
Equivale a, sem mudar de área:
select pedido
use

Poderia ser também:
close pedido

E por aí vai, eu também gosto muito de usar funções ao invés de comandos, até mesmo por que no fim das contas, os comandos nada mais são do que "traduzidos" pelos cabeçalhos padrões, para estas mesmas funções.

Replace - Area->Campo := nnn
Append Blank - dbAppend()
Commit - dbCommit()
Close - dbCloseArea()
Delete - dbDelete()

etc etc e etc... hehe
Stanis Luksys
sites.google.com/hblibs

Apoiar e se utilizar de projetos opensource não é uma questão de boicote, mas sim de liberdade.
Utilize, aprimore e distribua.
ederxc
Usuário Nível 4
Usuário Nível 4
Mensagens: 619
Registrado em: 15 Set 2006 08:40
Localização: Pedreira -SP-

Mensagem por ederxc »

Boa pedida tbm cara, e finalizando o tópico consegui resolver o meu problema .. que na verdade nem usa varios bancos de dados neste *.prg usa apenas um banco ! eu só ñ estava conseguindo acumular nesta variavel por meio de um (loop) fiz um (do while opc=1) e usei o metodo acima para acumular ex: (vtotnf+=vvaltot ) enfim o tópico serviu muito para abriri minha cabeza muito abrigado a todos !
Responder