variavel acumulativa
Moderador: Moderadores
variavel acumulativa
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++
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++
vtotnf := 0
while !(arq)->(eof())
...
valtot = valuni * vquant
vtotnf += valtot // soma o valor de valtot em vtotnf (vtotnf = vtotnf + valtot)
...
(arq)->(dbskip())
end
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.
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.
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.
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?
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?
-
Stanis Luksys
- Colaborador

- Mensagens: 1329
- Registrado em: 18 Jun 2005 03:04
- Localização: São Paulo
- Contato:
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
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.
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.
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 !

