Página 1 de 3

problemas com DO WHILE e ALERT

Enviado: 06 Jun 2007 16:21
por Gelson
Olá pessoal do forum.

Tenho uma rotina que faz uma consulta e retorna se o limite cadastrado no campo da tabela clientes foi estourado, porém analisando o procedimento o correto seria a cada lançamento feito no programa aparecer uma caixa de alerta dizendo se o limite estourou, e em seguida quando for teclado ENTER o sistema continuar com os lançamentos na conta independente do estouro de limite.

1ª duvida ) na apostila que tenho e uso não achei muta coisa a repeito do alert , como faço para dizer em qual linha e coluna a caixa deve aparecer ?

2º duvida ) Tentei juntar os fontes para fazer o procedimento acima funcionar, depois de muitas e muitas tentativas cheguei em um ponto onde após o lançamento o sistema fica somando os valores a vida inteira. Não estou conseguindo ver onde meu DO WHILE está errado, ou se o problema é em outro lugar do fonte, seguindo a apostila que tenho parece que o mesmo foi finalizado certo.

Coloco abaixo o fonte, e desde já agradeço pela atenção.

Código: Selecionar todos

USE MOVIM   INDEX IMOVIM,IMOVDOC,IMOVCON
SELECT 2
USE CLIENTES INDEX ICLIENTE
SELECT 3
USE HISTOR INDEX IHISTOR

mlimite    = 0.00 
mlinha     = 7
msal_ini   = 0.00

SELECT 2

msal_ini = SAL_INI
mdat_sal = DAT_INI

SELECT 1
DO WHILE mconta = CONTA .AND. DATA < mdata .AND. .NOT. EOF() 
 IF CT < 10
  msal_ini = msal_ini - VALOR
 ELSE
  msal_ini = msal_ini + VALOR
 ENDIF
 mdat_sal = DATA
 SKIP
ENDDO


DO WHILE .T.
 SELECT 1
 DO WHILE mconta = CONTA .AND. .NOT. EOF()

mdat_sal = DATA
  mct = CT
  SELECT 3
  SEEK mct
  IF EOF()

   CLOSE ALL
   RETURN
  ENDIF

SELECT 1

  IF CT < 10
   msal_ini = msal_ini - VALOR
  ELSE
   msal_ini = msal_ini + VALOR
  ENDIF
  IF msal_ini < 0.00
  @mlinha,55 SAY -msal_ini PICTURE '9,999,999,999.99D'
  ELSE
  @mlinha,55 SAY  msal_ini PICTURE '9,999,999,999.99C'
  ENDIF
ENDDO 
ENDDO
ENDDO

SELECT 2
 IF -msal_ini >  LIMITE
 ALERT ("     LIMITE ESTOURADO !!!       ")
 ENDIF
 CLEAR
 CLOSE ALL
 RETURN
***
Fonte inclusão de lançamentos

Código: Selecionar todos

CLEAR
mconta   = SPACE(5)
mct      = 0       
mdoc     = SPACE(10)
mdata    =  CTOD('01/01/00')
mdat_emi =  CTOD('  /  /  ')
mvalor   =  0.00
mresp    = SPACE(1)
DO WHILE mdata # DATE()
 @15,2  SAY 'DATA DO MOVIMENTO'
 @15,24 GET mdata PICTURE '  /  /  '
 READ


 IF mdata # DATE()
  @24,1 SAY 'DATA NAO CONFERE'
  WAIT ', ENTER'
  CLEAR
 ENDIF
ENDDO

USE MOVIM   INDEX IMOVIM,IMOVDOC,IMOVCON
SELECT 2
USE CLIENTES INDEX ICLIENTE
SELECT 3
USE HISTOR INDEX IHISTOR
SELECT 4
USE DATAS
GO BOTTOM
IF mdata > DATA_MOVIM
 APPEND BLANK
 REPLACE DATA_MOVIM WITH mdata
ENDIF
USE
DO CCCABP10
DO WHILE .T.
 @7,0 CLEAR
 @7,0 TO 22,79 DOUBLE
 @6,10 SAY 'INCLUSAO DE MOVIMENTO'
 @6,32 SAY 'DE '
 @6,35 SAY mdata PICTURE '  /  /  ' 
 @23,3 SAY 'INFORME 99999 NO CODIGO PARA ENCERRAR'
 @9,2  SAY 'CODIGO DO CORRENTISTA'
 @9,24 GET mconta  
 READ
 IF mconta = '99999'
  EXIT
 ENDIF
 IF mconta = '99998'
  @24,1 SAY 'ESTA CONTA NAO ACEITA INCLUSAO'
  WAIT ', ENTER PARA CONTINUAR'
  CLEAR
  DO CCCABP10
  LOOP
 ENDIF
 SELECT 2
 SEEK mconta  
 IF EOF()
    @24,1 SAY 'CONTA NAO CADASTRADA'
    WAIT ', ENTER'
    CLEAR
    DO CCCABP10
    LOOP
 ENDIF
 IF DESATIVADA = 'S'
  @24,1 SAY 'CONTA DESATIVADA'
  WAIT 'ENTER'
  CLEAR
  DO CCCABP10
  LOOP
 ENDIF
 mdat_atu = DAT_ATU
 @9,36 SAY NOME
 @11,2  SAY 'CODIGO DE TRANSACAO'
 @11,24 GET mct PICTURE '99'
 READ
 IF mct = 21
  LOOP
 ENDIF
 SELECT 3
 SEEK mct
 IF EOF()
  @24,1 SAY 'CODIGO NAO CADASTRADO'
  WAIT ', ENTER'
  CLEAR
  DO CCCABP10
  LOOP
 ENDIF
 @11,36 SAY HISTORICO
 @13,02 SAY 'DATA EMISSAO'
 mdat_emi = mdata
 @13,24 GET mdat_emi         
 @15,2  SAY 'DOCUMENTO'
 @15,24 GET mdoc
 READ

 IF mdat_emi <= mdat_atu
  @24,1 SAY 'JA EMITIMOS EXTRATO ALEM DESTA DATA'    
  WAIT ', ENTER'
  CLEAR 
  DO CCCABP10
  LOOP
 ENDIF
 @17,2  SAY 'VALOR'
 @17,24 GET mvalor PICTURE '9,999,999,999.99'
 READ
 @21,3  SAY 'CONFIRME -> S'
 @21,24 GET mresp
 READ
 IF mresp # 'S'
  LOOP
 ENDIF
 SELECT 1   
 APPEND BLANK
 REPLACE CONTA        WITH mconta  
 REPLACE CT           WITH mct  
 REPLACE DOC          WITH mdoc   
 REPLACE DATA         WITH mdat_emi
 REPLACE DAT_LANC     WITH mdata   
 REPLACE VALOR        WITH mvalor
 SELECT 2
 IF mct < 11
  REPLACE SAL_ATU2 WITH SAL_ATU2 - mvalor
 ELSE
  REPLACE SAL_ATU2 WITH SAL_ATU2 + mvalor
 ENDIF
 mct     =   0        
 mdoc    =   SPACE(10)
 mvalor  =   0.00
 @7,1 CLEAR

Enviado: 06 Jun 2007 20:41
por sygecom
Buenas...
Tenho uma rotina que faz uma consulta e retorna se o limite cadastrado no campo da tabela clientes foi estourado
Tche, não entendi nd....mas se for por causa de campo pequeno aumenta o Limite no campo....explica melhor como funciona isso ?
1ª duvida ) na apostila que tenho e uso não achei muta coisa a repeito do alert , como faço para dizer em qual linha e coluna a caixa deve aparecer ?
Tche, não entendi tb. bem o que vc quer fazer com o alert() mas ele é bem simples mesmo....e define o centro da tela para aparecer a mensagem...mais detalhes no link abaixo:
https://pctoledo.org/forum/viewto ... ight=alert
2º duvida ) Tentei juntar os fontes para fazer o procedimento acima funcionar, depois de muitas e muitas tentativas cheguei em um ponto onde após o lançamento o sistema fica somando os valores a vida inteira. Não estou conseguindo ver onde meu DO WHILE está errado, ou se o problema é em outro lugar do fonte, seguindo a apostila que tenho parece que o mesmo foi finalizado certo.
Tche, dah uma olhada no seu codigo abaixo e tente colocar um INKEY(0) com algumas mensagens na TELA antes do INKEY(0) para ver onde ele esta se perdendo....

Código: Selecionar todos

CLEAR
mconta = SPACE(5)
mct = 0
mdoc = SPACE(10)
mdata = CTOD('01/01/00')
mdat_emi = CTOD(' / / ')
mvalor = 0.00
mresp = SPACE(1)

DO WHILE mdata # DATE()
   @15,2 SAY 'DATA DO MOVIMENTO'
   @15,24 GET mdata PICTURE ' / / '
   READ

   IF mdata # DATE()
      @24,1 SAY 'DATA NAO CONFERE'
      WAIT ', ENTER'
      CLEAR
   ENDIF
ENDDO

SELECT 1
USE MOVIM INDEX IMOVIM,IMOVDOC,IMOVCON

SELECT 2
USE CLIENTES INDEX ICLIENTE

SELECT 3
USE HISTOR INDEX IHISTOR

SELECT 4
USE DATAS

GO BOTTOM
IF mdata > DATA_MOVIM
   APPEND BLANK
   REPLACE DATA_MOVIM WITH mdata
ENDIF

USE
DO CCCABP10
DO WHILE .T.
   @7,0 CLEAR
   @7,0 TO 22,79 DOUBLE
   @6,10 SAY 'INCLUSAO DE MOVIMENTO'
   @6,32 SAY 'DE '
   @6,35 SAY mdata PICTURE ' / / '
   @23,3 SAY 'INFORME 99999 NO CODIGO PARA ENCERRAR'
   @9,2 SAY 'CODIGO DO CORRENTISTA'
   @9,24 GET mconta
   READ

   IF mconta = '99999'
      EXIT
   ENDIF

   IF mconta = '99998'
      @24,1 SAY 'ESTA CONTA NAO ACEITA INCLUSAO'
      WAIT ', ENTER PARA CONTINUAR'
      CLEAR
      DO CCCABP10 //CHAMA OUTRA FUNÇÃO
      LOOP
   ENDIF

   SELECT 2
   SEEK mconta
   IF EOF()
      @24,1 SAY 'CONTA NAO CADASTRADA'
      WAIT ', ENTER'
      CLEAR
      DO CCCABP10 //CHAMA OUTRA FUNÇÃO
      LOOP
   ENDIF

   IF DESATIVADA = 'S'
      @24,1 SAY 'CONTA DESATIVADA'
      WAIT 'ENTER'
      CLEAR
      DO CCCABP10 //CHAMA OUTRA FUNÇÃO
      LOOP
   ENDIF

   mdat_atu = DAT_ATU
   @9,36 SAY NOME
   @11,2 SAY 'CODIGO DE TRANSACAO'
   @11,24 GET mct PICTURE '99'
   READ

   IF mct = 21 // QUE ISSO QUE CONTA É ESSA ?
      LOOP
   ENDIF

   SELECT 3
   SEEK mct
   IF EOF()
      @24,1 SAY 'CODIGO NAO CADASTRADO'
      WAIT ', ENTER'
      CLEAR
      DO CCCABP10 //CHAMA OUTRA FUNÇÃO
      LOOP
   ENDIF

   @11,36 SAY HISTORICO
   @13,02 SAY 'DATA EMISSAO'
   mdat_emi = mdata
   @13,24 GET mdat_emi
   @15,2 SAY 'DOCUMENTO'
   @15,24 GET mdoc
   READ

   IF mdat_emi <= mdat_atu
      @24,1 SAY 'JA EMITIMOS EXTRATO ALEM DESTA DATA'
      WAIT ', ENTER'
      CLEAR
      DO CCCABP10 //CHAMA OUTRA FUNÇÃO
      LOOP
   ENDIF

   @17,2 SAY 'VALOR'
   @17,24 GET mvalor PICTURE '9,999,999,999.99'
   READ
   @21,3 SAY 'CONFIRME -> S'
   @21,24 GET mresp
   READ

   IF mresp # 'S'
      LOOP
   ENDIF

   SELECT 1
   APPEND BLANK
   REPLACE CONTA WITH mconta
   REPLACE CT WITH mct
   REPLACE DOC WITH mdoc
   REPLACE DATA WITH mdat_emi
   REPLACE DAT_LANC WITH mdata
   REPLACE VALOR WITH mvalor
   SELECT 2

   IF mct < 11
      REPLACE SAL_ATU2 WITH SAL_ATU2 - mvalor
   ELSE
      REPLACE SAL_ATU2 WITH SAL_ATU2 + mvalor
   ENDIF

   mct = 0
   mdoc = SPACE(10)
   mvalor = 0.00
   @7,1 CLEAR

   *******
   *** FONTE PARA VERIFICAÇÃO DE ESTOURO DE LIMITE ***

   USE MOVIM INDEX IMOVIM,IMOVDOC,IMOVCON
   SELECT 2
   USE CLIENTES INDEX ICLIENTE
   SELECT 3
   USE HISTOR INDEX IHISTOR

   mlimite = 0.00
   mlinha = 7
   msal_ini = 0.00

   SELECT 2

   msal_ini = SAL_INI
   mdat_sal = DAT_INI

   SELECT 1
   DO WHILE mconta = CONTA .AND. DATA < mdata .AND. .NOT. EOF()
      IF CT < 10
         msal_ini = msal_ini - VALOR
      ELSE
         msal_ini = msal_ini + VALOR
      ENDIF
      mdat_sal = DATA
      SKIP
   ENDDO

   DO WHILE .T.
      SELECT 1
      DO WHILE mconta = CONTA .AND. .NOT. EOF()
         mdat_sal = DATA
         mct = CT
         SELECT 3
         SEEK mct
         IF EOF()
            CLOSE ALL
            RETURN
         ENDIF

         SELECT 1

         IF CT < 10
            msal_ini = msal_ini - VALOR
         ELSE
            msal_ini = msal_ini + VALOR
         ENDIF
         IF msal_ini < 0.00
            @mlinha,55 SAY -msal_ini PICTURE '9,999,999,999.99D'
         ELSE
            @mlinha,55 SAY msal_ini PICTURE '9,999,999,999.99C'
         ENDIF
      ENDDO
   ENDDO
   EXIT
ENDDO

SELECT 2
IF -msal_ini > LIMITE
   ALERT (" LIMITE ESTOURADO !!! ")
ENDIF

CLEAR
CLOSE ALL
RETURN
Obs: Observe que coloquei um EXIT no ultimo ENDDO...para ele sair, outra coisa procure colocar os Fontes dentro de Code[] aqui no Forum...

Abraços
Leonardo Machado

Enviado: 06 Jun 2007 21:07
por Gelson
Olá, sygecom . tudo bem ?

Quanto ao alert, pensei que tinha como determinar um lugar qualquer para ele, sem ser o meio da tela. Neste caso o que você me orienta a fazer ?


Meu dbf clientes possue um campo chamado limite, onde cadastro um valor qualquer, e a medida que vou fazendo lancamentos no sistema e vai gravando estes lançamento em outro dbf chamando movim. Estes lançamentos podem ser creditos ou debitos. Tenho uma opção de consulta de me retorna uma posição do saldo, e me diz que o mesmo está estourado ou não. Só que estou tentando colocar está opção para funcionar no meu de inclusão de lançamentos.

Assim toda vez que o toda vez que a inclusão for confirmada ele deveria pegar os lançamentos daquela conta e olhar o saldo até na aquela data e me dizer que o limite está estourado ou não e depois disto continuar com os lançamentos normalmente.

obrigado pela atenção,

Enviado: 06 Jun 2007 21:22
por Eolo
Gelson,

Faça 2 campos no clientes.dbf: LIMITE e USADO. Em LIMITE, vc registra até onde a coisa pode ir e, em USADO, vc vai debitando ou creditando o valor dos lançamentos do movimento, aí ele mostra o "SALDO".

Código: Selecionar todos

Limite=$100
Dia   Lançamento  USADO
1      D $20           $  20 Ok
2      D $35           $  55 Ok
3      C $10           $  45 Ok
4      D $70           $115 Opa! Limite vai estourar...
Sem esse campo, imagina vc ter que vasculhar o movimento inteiro, a cada lançamento, pra achar o novo saldo?

Enviado: 06 Jun 2007 22:06
por sygecom
Gelson:
Quanto ao alert, pensei que tinha como determinar um lugar qualquer para ele, sem ser o meio da tela. Neste caso o que você me orienta a fazer ?
Tche, vc viu o link do Colega Marcelo.....onde ele mostra um alert personalizado....vai lah e confira...

Obs: O que o Nosso colega Eolo postou é a melhor solução pra vc !!! outra coisa testo a alteração que fiz no seu codigo ?

Abraços
Leonardo Machado

Enviado: 06 Jun 2007 23:10
por Gelson
Olá amigos,

O campo limite eu já tinha, criei o campo sal_limite, quando é lançando alguma despesas, ou seja, débito o sistema grava com um sinal de menos na frente do valor.

Coloquei o limite de 50,00 em um cadastro de qualquer e lancei uma despesa de 50,01 era para ter aparecido o alerta de estourado, mas o sistema analisa -50,00 como sendo menor que 50,00 por isso não considera como estourado o limite. Com isso aparece o alerta de limite bom. Tem como contornar isto ?

Quanto ao fonte testei mas deu a mesma coisa, coisa mais doida, limpei a tabela chamada movim, e ele continuou somando sem parar, mais de 10 minutos somando, tem algo muito errado com meu do while mesmo.

Mas fazer como você disse e seguir a orientação do Eolo, fico muito grato pela atenção de vocês dois.

meu fonte agora esta desta forma:




[CLEAR
mconta = SPACE(5)
mct = 0
mdoc = SPACE(10)
mdata = CTOD('01/01/00')
mdat_emi = CTOD(' / / ')
mvalor = 0.00
mresp = SPACE(1)
DO WHILE mdata # DATE()
@15,2 SAY 'DATA DO MOVIMENTO'
@15,24 GET mdata PICTURE ' / / '
READ


IF mdata # DATE()
@24,1 SAY 'DATA NAO CONFERE'
WAIT ', ENTER'
CLEAR
ENDIF
ENDDO

USE MOVIM INDEX IMOVIM,IMOVDOC,IMOVCON
SELECT 2
USE CLIENTES INDEX ICLIENTE
SELECT 3
USE HISTOR INDEX IHISTOR
SELECT 4
USE DATAS
GO BOTTOM
IF mdata > DATA_MOVIM
APPEND BLANK
REPLACE DATA_MOVIM WITH mdata
ENDIF
USE
DO CCCABP10
DO WHILE .T.
@7,0 CLEAR
@7,0 TO 22,79 DOUBLE
@6,10 SAY 'INCLUSAO DE MOVIMENTO'
@6,32 SAY 'DE '
@6,35 SAY mdata PICTURE ' / / '
@23,3 SAY 'INFORME 99999 NO CODIGO PARA ENCERRAR'
@9,2 SAY 'CODIGO DO CORRENTISTA'
@9,24 GET mconta
READ
IF mconta = '99999'
EXIT
ENDIF
IF mconta = '99998'
@24,1 SAY 'ESTA CONTA NAO ACEITA INCLUSAO'
WAIT ', ENTER PARA CONTINUAR'
CLEAR
DO CCCABP10
LOOP
ENDIF
SELECT 2
SEEK mconta
IF EOF()
@24,1 SAY 'CONTA NAO CADASTRADA'
WAIT ', ENTER'
CLEAR
DO CCCABP10
LOOP
ENDIF
IF DESATIVADA = 'S'
@24,1 SAY 'CONTA DESATIVADA'
WAIT 'ENTER'
CLEAR
DO CCCABP10
LOOP
ENDIF
mdat_atu = DAT_ATU
@9,36 SAY NOME
@11,2 SAY 'CODIGO DE TRANSACAO'
@11,24 GET mct PICTURE '99'
READ
IF mct = 21
LOOP
ENDIF
SELECT 3
SEEK mct
IF EOF()
@24,1 SAY 'CODIGO NAO CADASTRADO'
WAIT ', ENTER'
CLEAR
DO CCCABP10
LOOP
ENDIF
@11,36 SAY HISTORICO
@13,02 SAY 'DATA EMISSAO'
mdat_emi = mdata
@13,24 GET mdat_emi
@15,2 SAY 'DOCUMENTO'
@15,24 GET mdoc
READ

IF mdat_emi <= mdat_atu
@24,1 SAY 'JA EMITIMOS EXTRATO ALEM DESTA DATA'
WAIT ', ENTER'
CLEAR
DO CCCABP10
LOOP
ENDIF
@17,2 SAY 'VALOR'
@17,24 GET mvalor PICTURE '9,999,999,999.99'
READ
@21,3 SAY 'CONFIRME -> S'
@21,24 GET mresp
READ
IF mresp # 'S'
LOOP
ENDIF
SELECT 1
APPEND BLANK
REPLACE CONTA WITH mconta
REPLACE CT WITH mct
REPLACE DOC WITH mdoc
REPLACE DATA WITH mdat_emi
REPLACE DAT_LANC WITH mdata
REPLACE VALOR WITH mvalor
SELECT 2
IF mct < 11
REPLACE SAL_ATU2 WITH SAL_ATU2 - mvalor
ELSE
REPLACE SAL_ATU2 WITH SAL_ATU2 + mvalor
ENDIF
IF mct < 10
REPLACE SAL_LIMITE WITH SAL_LIMITE - mvalor
ELSE
REPLACE SAL_LIMITE WITH SAL_LIMITE + mvalor
ENDIF

mct = 0
mdoc = SPACE(10)
mvalor = 0.00
@7,1 CLEAR
ENDDO

*******

USE MOVIM INDEX IMOVIM,IMOVDOC,IMOVCON
SELECT 2
USE CLIENTES INDEX ICLIENTE
SELECT 3
USE HISTOR INDEX IHISTOR

mlimite = 0.00
mSAL_LIMITE = 0.00

SELECT 2
IF -mSAL_LIMITE > LIMITE
ALERT (" LIMITE ESTOURADO !!! ")
else
ALERT ( "### L I M I T E B O M ### ")
ENDIF
CLEAR
CLOSE ALL
RETURN
][/code]

Enviado: 07 Jun 2007 07:46
por Gelson
olá, amigos

quero apenas efetuar uma correção do meu post anterior.
de:

" Mas fazer como você disse e seguir a orientação do Eolo, fico muito grato pela atenção de vocês dois."

Para:

Mas realmente é melhor fazer como você disse e seguir a oientação do Eolo, é mais pratico rápido, pois evita a verificação de todos os lançamento"

Enviado: 07 Jun 2007 08:40
por Eolo
Coloquei o limite de 50,00 em um cadastro de qualquer e lancei uma despesa de 50,01 era para ter aparecido o alerta de estourado, mas o sistema analisa -50,00 como sendo menor que 50,00 por isso não considera como estourado o limite. Com isso aparece o alerta de limite bom. Tem como contornar isto ?
Gelson,
É só questão de usar o sinal certo. Olhe, a seguir, os desvios em 3 lançamentos: o primeiro, a débito, sem estouro do limite; o segundo, a crédito; o terceiro, a débito, com estouro do limite.

(ah: como o tamanho do campo USADO pode chegar a ser igual ao do LIMITE, faça-o maior em 1, para acomodar o sinal "-". Explicando: LIMITE=1000.00, tamanho 7/2. USADO=-1000.00, tamanho 8/2)

Código: Selecionar todos

* Lançamento 1
limite=50.00
usado=0,00
novo=-10.00 Débito (sinal negativo)
if novo<0 // Débito
  if (abs(novo)>(limite+usado)) // (10.00 > (50.00+0.00)) = .F.
    ?"limite estourado"
  else
    * CAI AQUI *************************************
    usado=usado+novo // usado = 0.00+-10.00 = -10.00
  endi
else // Crédito
  usado=usado+novo
endi



* Lançamento 2
limite=50.00
usado=-10,00
novo=5.00 Crédito (sinal positivo)
if novo<0
  if (abs(novo)>(limite+usado))
    ?"limite estourado"
  else
    usado=usado+novo
  endi
else
  * CAI AQUI *************************************
  usado=usado+novo // usado = -10,00+5.00 = -5.00
endi



* Lançamento 3
limite=50.00
usado=-5,00
novo=-45.01 Débito (sinal negativo)
if novo<0
  if (abs(novo)>(limite+usado)) // (45.01 > (50.00+-5.00)) = .T.
    * CAI AQUI *************************************
    ?"limite estourado"
  else
    usado=usado+novo
  endi
else
  usado=usado+novo
endi

Enviado: 07 Jun 2007 10:41
por Gelson
Eolo, obrigado por seu interesse em me ajudar.

Desde cedo quando vi seu post tenho tentado que muitas formas, lendo a apostila que tenho vi que o comando abs, serve para retornar um valor absoluto, e em cima do exemplo que você pôs tentei mudar as minhas linhas. Porém não sei se pelo fato de estar abrindo dois dbf, não tenho tido êxito.

O meu campo valor (que no seu ex: você chama de novo), fica em meu dbf chamado movim. Os meus campos limite e sal_limite fica em meu dbf chamado clientes. O Campo que a titulo de ex: você chama de usado, no meu dbf clientes chamo de sal_limite.

use movim index imovim, imovdoc, imovcon
select 2
use clientes index icliente

select 1
mvalor = 0.00

select 2
IF mvalor < 0.00 // tentei usando 0 (zero sem ponto e sem casas decimais
if (abs(mvalor) > (mlimite+msal_limite))
alert (" LIMITE ESTOURADO !!! ")
else
msal_limite=msal_limite+mvalor
endif
endif
enddo // para finalizar meu do while anterior
clear
close all
return

Desta forma o sistema não mostra nenhuma tela de alerta mesmo estourando o limite, tentei usando :

if (abs(mvalor) > (LIMITE+SAL_LIMITE)) e também não deu nada.

Enviado: 07 Jun 2007 12:21
por Eolo
Gelson, vamos voltar um pouco pra trás. Não adianta vc usar a função ABS() se vc ainda não sacou algumas outras coisas, importantes... Bão, vou parecer meio "chato", mas a intenção é boa. Vou ser meio "curto" neste primeiro post e aguardar uma resposta sua, certo? Aí vamos em frente.

select 1
use movim index imovim, imovdoc, imovcon
select 2
use clientes index icliente

Primeiro, vamos trocar isso aí pelo seguinte:
use movim index imovim, imovdoc, imovcon new
use clientes index icliente new

Por que? Pelo seguinte: a cláusula NEW ("nova", em inglês) vai abrir o DBF+NTX na próxima área de trabalho disponível, seja ela qual for, usando o nome como ALIAS (a não ser que outro seja definido). Com isso, vc não precisa esquentar em definir SELE 1, SELE 2 etc. Para se referir ao conteúdo de um campo em uma área de trabalho qualquer, basta fazer, por exemplo, "clientes->nome".

ALIAS? Área de trabalho? "->"?
Que p* é essa?

Diz aí se até aqui tá tranquilo. Aí vamos em frente.

Enviado: 07 Jun 2007 13:01
por Gelson
ok, Eolo .
Realmente tem muita coisa que não saquei ainda, fico grato pela paciência.

Fiz a mudança conforme seu post.

Enviado: 07 Jun 2007 14:00
por Eolo
Gelson,

Então, continuando. Se vc fez...
use movim index imovim, imovdoc, imovcon new
use clientes index icliente new
... então, de qualquer lugar, vc pode ver o conteúdo de um campo fazendo o seguinte:

movim->data // mostra o campo DATA do movim.dbf
clientes->nome // mostra o campo NOME do clientes.dbf

Certo? Tá claro?

Enviado: 07 Jun 2007 14:06
por Eolo
Sempre que vc ver algo do tipo "clientes->nome", vc pode entender como: "Clipper: vá na área de trabalho onde o arquivo CLIENTES.dbf está aberto e traga o conteúdo do campo NOME, onde o PONTEIRO estiver...".

Ponteiro? O que é o ponteiro? Eu num sei. Agora vc, Gelson, explica pra mim!... eh eh eh

Enviado: 07 Jun 2007 14:38
por Gelson
De acordo com minha apostila ponteiro logico serve para verificar o inicio ou fim de um registro. Realmente trás a ideia de algo que marca no banco um ponto incial ou final.

Enviado: 07 Jun 2007 14:47
por Gelson
Eolo,

Deixe-me lhe fazer uma pergunta.

IF sal_limite < 0
IF (abs(sal_limite)) > limite
ALERT (" LIMITE ESTOURADO !!! ")
endif
endif
ou seja, quando o valor no campo sal_limite for negativo, e pega o valor absoluto e compara com o limite.

-50,01, então ele deveria pegar 50,01 > 50,00 e acusar um estouro.

não seria isto ?



mas tentei assim também e não deu . Porque ?