Comando TOTAL ON

Fórum sobre a linguagem CA-Clipper.

Moderador: Moderadores

Dilson
Usuário Nível 1
Usuário Nível 1
Mensagens: 2
Registrado em: 07 Jun 2005 18:04

Comando TOTAL ON

Mensagem por Dilson »

Olá amigos deste fórum!

Estou com problemas ao utilizar o Comando Total On no Clipper, pois cada vez que acabo determinada consulta ou impressão de um relatorio e retorno à tela de escolha de periodo ao qual o arquivo totalizado devera conter dá erro na criação do arquivo, gostaria de saber o por que. segue fragmento do codigo.

Código: Selecionar todos

PROCEDURE ABC_CLI

SELE 2
USE FATCONHE SHAR

IF NETERR()
 DO AVISO WITH "ERRO 2"
 RETURN
ENDIF

GOTO TOP

if !EOF()
   While !EOF()
      RLock()
      while !RLock()
      end
      Repl qtde_conhe with 1
      skip
   end
endif
goto top

COPY TO &TMP1 FOR IMPRESSO="*" .AND. CANCELA=" "

SELE 15
USE &TMP1
IF LASTREC()=0
 RETURN
ENDIF
INDEX ON NOM_CLI+DTOS(DAT_CONH)+STR(NUM_CONH,6) TO &TMP1

SELE 1
USE FATCLIEN SHAR
IF NETERR()
 DO AVISO WITH "ERRO 2"
 RETURN
ENDIF
SET INDEX TO FATCLIEN

mdatai=date() // STR(month(DATE()),2)+STR(year(date()),4)
mdataf=date()
mtipo ="S"
mqual =DT_LOC

DO WHILE .T.
 SELE 1
 DO T_ABC_CLI
 @ 23,00 CLEAR
 @ 23,00 SAY PADC("[ENTER] Exibe.   [*] Todos.   [ESC] Finaliza.",80)
 mcod_cli = SPACE(18)
 @ 04,09 GET mcod_cli PICT "!9999999999999"
 READ

 IF LASTKEY()=27
  EXIT
 ENDIF

 @ 23,00 CLEAR

 IF LEFT(mcod_cli,1)=" "
  GO TOP
  IF EOF() .OR. LASTREC()=0
   LOOP
  ENDIF
  SET INDEX TO FATCLORD
  GO TOP
  mpos=RECNO()

  DO CONSULTA WITH 1,"CLIE",0
  SET INDEX TO FATCLIEN
  IF LASTKEY()=27
   LOOP
  ENDIF
  GO mpos
  mcod_cli=CGC
 ELSE
  IF LEN(ALLTRIM(mcod_cli))=14
   mcod_cli = SUBS(mcod_cli,01,02) +"."+ SUBS(mcod_cli,03,03) +"."+ SUBS(mcod_cli,06,03) +"/"+ SUBS(mcod_cli,09,04) +"-"+ SUBS(mcod_cli,13,02)
  ELSE
   IF LEN(ALLTRIM(mcod_cli))=11
    mcod_cli = SUBS(mcod_cli,01,03) +"."+ SUBS(mcod_cli,04,03) +"."+ SUBS(mcod_cli,07,03) +"-"+ SUBS(mcod_cli,10,02)
   ELSE
    IF LEFT(mcod_cli,1)<>"*"
     LOOP
    ENDIF
   ENDIF
  ENDIF
 ENDIF

 SET COLOR TO B+/W
 @ 04,09 SAY mcod_cli
 SET COLOR TO B/W,N/GB
 IF LEFT(mcod_cli,1)="*"
   mnom_cli="********** TODOS **********"
  ELSE
   SEEK mcod_cli
   IF EOF()
    DO AVISO WITH "ERRO 7"
    LOOP
   ENDIF
   mnom_cli=NOM
 ENDIF

 WHILE .T.

    SELE 2
    GO TOP
    DO T_ABC_CLI
    SET COLOR TO B+/W
    @ 04,09 SAY LEFT(mnom_cli,29)
    SET COLOR TO B/W,N/GB
    @ 23,00 CLEAR
    @ 23,32 SAY "[ESC] Retorna."
    @ 04,47 GET mdatai pict "99/99/9999" VALID(dtoc(mdatai) <= dtoc(date()))
    @ 04,60 Get mdataf pict "99/99/9999" VALID(dtoc(mdataf) >= dtoc(mdatai))
    READ

    IF LASTKEY()=27
       EXIT
    ENDIF

    mtipo = "S"

    @ 23,00 CLEAR
    @ 23,32 SAY "Consultando..."

    IF mqual=3
       LOCA FOR DAT_CONH >= mdatai .AND. DAT_CONH <= mdataf
    ELSE
       LOCA FOR DAT_CONH >= mdatai .AND. DAT_CONH <= mdataf .AND. COD_LOC=mqual
    ENDIF

    mTotalGeral:=0

    if !EOF()

       while !EOF()
          mTotalGeral+=TOT_FRT
          cont
       end

       IF mqual=3
          IF LEFT(mcod_cli,1)<>"*"
             SELE 15
             GOTO TOP
             TOTAL ON NOM_CLI fields TOT_FRT, QTDE_CONHE TO &TMP2. FOR DAT_CONH >= mdatai .AND. DAT_CONH <= mdataf .AND.   COD_CLI=mcod_cli
             use &TMP2
             INDEX ON STR(TOT_FRT,10,2) TO &TMP2. DESC
             LOCA FOR DAT_CONH >= mdatai .AND. DAT_CONH <= mdataf .AND. COD_CLI=mcod_cli
          ELSE
             SELE 15
             GOTO TOP
             TOTAL ON NOM_CLI fields TOT_FRT, QTDE_CONHE TO &TMP2. FOR DAT_CONH >= mdatai .AND. DAT_CONH <= mdataf
             use &TMP2
             INDEX ON STR(TOT_FRT,10,2) TO &TMP2. DESC
             LOCA FOR DAT_CONH >= mdatai .AND. DAT_CONH <= mdataf
          ENDIF
       ELSE
          IF LEFT(mcod_cli,1)<>"*"
             SELE 15
             GOTO TOP
             TOTAL ON NOM_CLI fields TOT_FRT, QTDE_CONHE TO &TMP2. FOR DAT_CONH >= mdatai .AND. DAT_CONH <= mdataf .AND. COD_CLI=mcod_cli
             use &TMP2
             INDEX ON STR(TOT_FRT,10,2) TO &TMP2. DESC
             LOCA FOR DAT_CONH >= mdatai .AND. DAT_CONH <= mdataf .AND. COD_CLI=mcod_cli .AND. COD_LOC=mqual
          ELSE
             SELE 15
             GOTO TOP
             TOTAL ON NOM_CLI FIELDS TOT_FRT, QTDE_CONHE TO &TMP2. FOR DAT_CONH >= mdatai .AND. DAT_CONH <= mdataf
             use &TMP2
             INDEX ON STR(TOT_FRT,10,2) TO &TMP2. DESC
             LOCA FOR DAT_CONH >= mdatai .AND. DAT_CONH <= mdataf .AND. COD_LOC=mqual
          ENDIF
       ENDIF

    endif
O erro acontece na segunda vez que vai executar a parte em negrito***, a quem ajudar-me agradeço,

Obrigado!
Nota de Moderação:
por Toledo: *** negrito estava nas linhas: 147, 154, 163 e 170
Editado pela última vez por Toledo em 07 Jan 2011 11:46, em um total de 1 vez.
Razão: Mensagem editada para colocar a tag [ code ]<br>Veja como utilizar esta tag: http://www.pctoledo.com.br/forum/faq.php?mode=bbcode#f2r1
Avatar do usuário
Pablo César
Usuário Nível 7
Usuário Nível 7
Mensagens: 5312
Registrado em: 31 Mai 2006 10:22
Localização: Curitiba - Paraná

Re: Comando TOTAL ON

Mensagem por Pablo César »

Você pode mostrar o erro que dá ?
TOTAL ON

Propósito: Cria um arquivo(.DBF), contendo valores totalizados de outros arquivos de dados.

Sintaxe:

TOTAL ON <campo> TO <arquivo> [<escopo>] [FIELDS<lista campo > [FOR<condição >]
Está me parecendo que há problemas de compartilhamento ou até mesmo falta de fechar o arquivo de totais, assim permitirá a craiação na segunda consulta.
Este tipo de comando, é obsoleto na minha opinião. Talvez seria bem mais prático e bem mais seguro criar variáveis ou até vetores com os totais de cada campo. Podendo ser atribuídas através de SUM ALL <campo> TO <nVariavel>
Um clip-abraço !

Pablo César Arrascaeta
Compartilhe suas dúvidas e soluções com todos os colegas aqui do fórum.
Evite enviar as dúvidas técnicas por MPs ou eMails, assim todos iremos beneficiar-nos.
alxsts
Colaborador
Colaborador
Mensagens: 3092
Registrado em: 12 Ago 2008 15:50
Localização: São Paulo-SP-Brasil

Re: Comando TOTAL ON

Mensagem por alxsts »

Olá!

Provavelmente é algum erro relacionado a arquivo já aberto...

Feche o arquivo temporário onde se armazena o resultado do comando TOTAL ON depois de cada iteração.
[]´s
Alexandre Santos (AlxSts)
Avatar do usuário
ANDRIL
Usuário Nível 5
Usuário Nível 5
Mensagens: 1297
Registrado em: 06 Jul 2004 00:44
Contato:

Re: Comando TOTAL ON

Mensagem por ANDRIL »

Amigo,

SELE 15
169 GOTO TOP
170 TOTAL ON NOM_CLI FIELDS TOT_FRT, QTDE_CONHE TO &TMP2. FOR DAT_CONH >= mdatai .AND. DAT_CONH <= mdataf
171 use &TMP2
Veja que esta abrindo o arquivo recem criado na área SELE 15 que estava sendo usada por outro DBF.

Tente assim:

Código: Selecionar todos

select 254
use &TMP2
ou

Código: Selecionar todos

use &TMP2 new
Tente fazer isso e veja se resolve.
Abraços
Clipper 5.2e / Blinker 5.1 / Harbour 3.2 / GTwvg
Responder