Página 1 de 1

variavel acumulativa

Enviado: 25 Set 2006 16:26
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++

Enviado: 25 Set 2006 16:55
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

Enviado: 25 Set 2006 17:05
por vagucs
Bom, é uma das diversas opções, este é o caminho...

Enviado: 26 Set 2006 09:06
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

Enviado: 26 Set 2006 09:51
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.

Enviado: 26 Set 2006 10:13
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 !

Enviado: 26 Set 2006 10:43
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.

Enviado: 26 Set 2006 10:48
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?

Enviado: 26 Set 2006 12:52
por ederxc
porra .. com uma explicação dessas c ñ ajudase pode parar hehe .. VLW e muiot obrigado !

Enviado: 26 Set 2006 12:59
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

Enviado: 26 Set 2006 16:07
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 !