Página 1 de 1

Código nao faz leitura sequencial do Arquivo (while !eof()

Enviado: 27 Abr 2010 23:22
por MDKX
Pessoal,
primeiramente me desculpem a forma de programação simples, mas nao é meu ramo o desenvolvimento. Mas todos ja sabem, volta e meia somos solicitados resolver problemas que necessitamos praticar essa arte. Entao corri atras instalei o Clipper e atraves do NG fui mexendo.

Meu cenário e o seguinte: Tenho inicialmente duas tabelas (ALUNO.DBF e ACG.DBF) o conteudo delas sao respectivamente: (MATRICULA, N, 8 - NOME_ALUNO,C,35 - CATEGORIA,C,64 - H_CURSADA,N,6,2 - HORA_ACG,N,6,2 - ID_CATEGOR,N,3) e (ID,N,4 - CATEGORIA,C,64 - H_CURSADA,N,6,2 - HORA_ACG,6,2 - MAXIMO,N,6,2)

==> Coloquei os campos principais so para exemplificar

A lógica é o seguinte: Tenho uma rotina pronta e funcionando ok, que aramazena na tabela ACG.DBF as categorias por exemplo: O usuario do sistema informou que na categoria 10, de descrição "Participacao Semana de Segurança do Trabalho", a cada 1 hora cursada equivale a 5 horas de ACG podendo os alunos dessa categoria 10 fazer no maximo 60 horas.

Ou seja: o aluno XXXXXX (MATRICULA) participou da semana de Segurança do Trabalho (CATEGORIA). Essa semana de engenharia durou (apesar do nome "semana") 2 horas a participação dele (H_CURSADA) logo como ele cursou 2 hs, a hora equivalente para ACG vai ser 10hs. (HORA_ACG)

Muito bem, até aqui ok. Agora vem minha rotina para poder inlcuir novas participações desse mesmo aluno ou de outro novo em N categorias que possuem sua descricao, equivalencia previamente cadastrada na tabela ACG. Logo o aluno pode fazer quantas horas de determinada categoria quiser, de acordo o limite estipulado para ela (MAXIMO). Devendo bloquear a inclusao avisando caso o limite seja atingido, OK. Estou precisando agora fazer o seguinte: Ao cadastrar o aluno deve-se testar se ele ja existe, e se ele ja existir tenho que testar se ele ja fez a categoria que esta sendo incluida no instante ou nao. Se já, tenho que somar(ou nao sei outra logica viavel) para a categoria que esta tentando ser incluida novamente a quantidade de HORA_ACG que ele ja fez. Se é a primeira vez que ele faz, ok, so incluir. O meu laço While EOF() nao faz nada. Cheguei a colocar uns pontos em partes cruciais do sistema com AELRT pra poder debugar o sistema. Estou postando meu PRG, se alguem puder me ajudar.
Obrigado.

Código: Selecionar todos

*---------------------------------------------------------------------------
* Procedimento DE INCLUSAO de Atividades Complementares Graducao - VERSAO 2
*---------------------------------------------------------------------------

Procedure teste_ACG

Do while .T.

       set color to
       set color to GR+/BG+
       @ 24,1 say "F2->Consultar Categorias"
       set Key K_F2 to consulta_categoria()
       Set Cursor on
       tmp_id:=0000
       tmp_matricula:=00000000
       tmp_nome_aluno:=space(35)
       tmp_empresa:=space(25)
       tmp_categoria:=space(64)
       tmp_cod_categoria:=0000
       tmp_hora_acg_:=0
       tmp_h_cursada:=0
       tmp_data_inic:=ctod("  /  /    ")
       tmp_data_fim:=ctod("  /  /    ")
       tmp_total_acg:=0
       tmp_id_categoria:=0000
       tmp_hora_acg_tabela:=0
       tmp_hora_acg_calculada:=0.00
       tmp_maximo_hora_acg:=0.00
       tmp_hora_acg_cursar:=0.00
       tmp_maximo:=0
       tmp_total_hora_acg:=0.00
       tmp_totaliza_hora_acg:=0.00
       tmp_total_acg_existente:=0.0
              
       janela3d(03,01,23,78)
       set color to
       set color to H/g,g/w
       @ 03,02 say "Inclusao de Atividades - Aluno"
       set color to
       set color to gr+/w+
       @ 05,02 say "Identificador(N§ Matricula):[        ]"
       set color to
       set color to b+/w+
       @ 05,31 get tmp_matricula picture "99999999" 
       read
       If empty(tmp_matricula) .OR. tmp_matricula < 0
          alert("Matricula inexistente!")
          return
       Endif
   Use ALUNO.DBF EXCLUSIVE
   If flock()
       index on MATRICULA to ALUNO
       seek tmp_matricula
       if !found()
          @ 07,02 say "Nome do Aluno:[                                    ]"
          @ 07,17 get tmp_nome_aluno picture "@!" valid tmp_nome_aluno != " "
          @ 08,02 say "Categoria:[    ]"
          @ 08,13 get tmp_cod_categoria picture "9999" valid tmp_cod_categoria !=0                   
          read
          Use ACG.DBF SHARED
          If flock()
             index on ID to ACG
             Seek tmp_cod_categoria
             if !found()
                alert("Categoria nao encontrada")
                return
             else
                tmp_categoria:=CATEGORIA
                tmp_hora_acg_tabela:=HORA_ACG
                tmp_maximo:=MAXIMO
                tmp_id_categoria:=ID
             Endif
           else
             alert("Tabela ACG em uso, aguarde...")
             loop
          Endif

          close ACG
          set color to
          set color to b+/W+,w+
          @ 09,02 say "Descricao:"+alltrim(tmp_categoria)
          set color to
          set color to gr+/w+
          @ 11,02 say "Empresa:[                          ]"
          @ 12,02 say "Data de Inicio:[  /  /    ]"
          @ 13,02 say "Data de Termino:[  /  /    ]"
          @ 14,02 say "Carga H. Cursada na Categoria:("+alltrim(str(tmp_id_categoria))+")"
          @ 14,41 say "[         ]"+"hora(s)"
                                                      
          @ 11,11 get tmp_empresa picture "@!" valid tmp_empresa !=" "
          @ 12,18 get tmp_data_inic picture "99/99/9999"
          @ 13,19 get tmp_data_fim picture "99/99/9999"
          @ 14,42 get tmp_h_cursada picture "999999.99"
          read

          // calcula_hora_acg()

          tmp_hora_acg_calculada:=(tmp_hora_acg_tabela * tmp_h_cursada)
          tmp_maximo_hora_acg:=tmp_hora_acg_calculada

          @ 15,02 say "Carga H. Equivalente para ACG:["+alltrim(str(tmp_hora_acg_calculada))+"]"
          @ 17,02 to 17,77

          tmp_hora_acg_cursar:=(tmp_maximo) - (tmp_maximo_hora_acg)

          @ 19,02 say "Para essa categoria o aluno ainda pode cursar:["+alltrim(str(tmp_hora_acg_cursar))+"]"+"hora(s)"

          Use ALUNO.DBF EXCLUSIVE
          If Flock()
             index on MATRICULA TO ALUNO
             append blank
             replace MATRICULA with tmp_matricula
             replace NOME_ALUNO with tmp_nome_aluno
             replace CATEGORIA with tmp_categoria
             replace H_CURSADA with tmp_h_cursada
             replace HORA_ACG with tmp_hora_acg_calculada
             replace EMPRESA with tmp_empresa
             replace DATA_INIC with tmp_data_inic
             replace DATA_FIM with tmp_data_fim
             replace TOTAL_ACG with tmp_hora_acg_calculada
             replace ID_CATEGOR with tmp_id_categoria
             inkey(20)
             alert("Dados gravados com sucesso...")
             clear TYPEAHEAD
             return
           else
             alert("Tabela ALUNO.DBF em uso por outro usuario aguarde...")
             loop
          Endif
          clear gets
      Else
          teste_acg_com_matricula()
     Endif
   Else
       alert("Tabela ALUNO.DBF em uso em outro processo")
       return
    Endif
Enddo
return
*----------------------------------------------------------------------------
* Procedimento de Inclusao de Dados Aluno X ACG ao encontrar Matricula
*----------------------------------------------------------------------------

Procedure teste_acg_com_matricula

Do While .T.                    

          tmp_nome_aluno:=NOME_ALUNO
          temp:=0
          alert("Variaveis carregadas:"+str(tmp_matricula)+" "+str(tmp_totaliza_acg))           
          banco:=DBF()
          alert("Tabela atual: "+alltrim(banco)) //Fiz isso pra saber qual WorkArea esta atualmente carregada

          index on MATRICULA+ID_CATEGOR to ALUNO

          while !EOF() [i][b](ja tentei diversas maneiras, aqui inclusive nao sei se seria o caso de usar seek novamente, pois na rotina anterior ja pesquisei a matriucla)[/b][/i]             seek (tmp_id_categoria, tmp_matricula)
             If found()                
                tmp_totaliza_hora_acg:=(tmp_totaliza_hora_acg + HORA_ACG) 
             else
                skip+1
             Endif
          Enddo
          
          Close ALUNO

          alert("Valor da variavel tmp_totaliza_hora_acg"+" "+alltrim(str(tmp_totaliza_hora_acg)))

          set color to
          set color to gr+/w+
          @ 05,02 clear to 07,76
          @ 05,02 say "Identificador(N§ Matricula): ["+alltrim(str(tmp_matricula))+"]"
          @ 07,02 say "Nome do Aluno: ["+alltrim(tmp_nome_aluno)+"]"
          set color to
          set color to b+/w+
          @ 08,02 say "Categoria:[    ]"
          @ 08,13 get tmp_cod_categoria picture "9999" valid tmp_cod_categoria !=0
          read
          Use ACG.DBF SHARED 
          If flock()
             index on ID to ACG
             Seek tmp_cod_categoria
             if !found()
                alert("Categoria nao encontrada")
                return
             else
                tmp_categoria:=CATEGORIA
                tmp_hora_acg_tabela:=HORA_ACG
                tmp_maximo:=MAXIMO
                tmp_id_categoria:=ID
             Endif
          else
             alert("Tabela ACG em uso, aguarde...")
             loop
          Endif
          close ACG
          alert("Tabela ACG carregou:HORA_ACG/MAXIMO/ID "+alltrim(str(tmp_hora_acg_tabela))+"/"+alltrim(str(tmp_maximo))+"/"+alltrim(str(tmp_id_categoria)))
          set color to
          set color to b+/W+,w+
          @ 09,02 say "Descricao:"+alltrim(tmp_categoria)
          set color to
          set color to gr+/w+
          @ 11,02 say "Empresa:[                          ]"
          @ 12,02 say "Data de Inicio:[  /  /    ]"
          @ 13,02 say "Data de Termino:[  /  /    ]"
          @ 14,02 say "Carga H. Cursada na Categoria:("+alltrim(str(tmp_id_categoria))+")"
          @ 14,41 say "[         ]"+"hora(s)"

          @ 11,11 get tmp_empresa picture "@!" valid tmp_empresa !=" "
          @ 12,18 get tmp_data_inic picture "99/99/9999"
          @ 13,19 get tmp_data_fim picture "99/99/9999"
          @ 14,40 get tmp_h_cursada picture "999999.99"
          read
          // calcula_hora_acg()
          
          tmp_hora_acg_calculada:=(tmp_hora_acg_tabela * tmp_h_cursada)
          tmp_maximo_hora_acg:=tmp_hora_acg_calculada

          @ 15,02 say "Carga H. Equivalente para ACG:["+alltrim(str(tmp_hora_acg_calculada))+"]"
          @ 17,02 to 17,77          

          if tmp_hora_acg_calculada > tmp_maximo
             alert("Total de Carga H. Cursada excede limite Maximo.")
             return
          endif

          USE ALUNO.DBF EXCLUSIVE
            If Flock()  
                  index on  MATRICULA to ALUNO
                  alert("Total de HORA_ACG para essa categoria/aluno: "+alltrim(str(tmp_totaliza_hora_acg)))                  
                  If tmp_totaliza_hora_acg > tmp_maximo
                     alert("Aten‡Æo: Total de horas na categoria excede limite maximo")
                     return
                  Endif     
                  tmp_hora_acg_cursar:=(tmp_totaliza_hora_acg) - (tmp_maximo)
                  @ 19,02 say "Para essa categoria o aluno ainda pode cursar:["+alltrim(str(tmp_hora_acg_cursar))+"]"+"hora(s)"
                  tmp_totaliza_hora_acg:=(tmp_totaliza_hora_acg)+(tmp_hora_acg_calculada)                  
                  appen blank
                  replace MATRICULA with tmp_matricula
                  replace NOME_ALUNO with tmp_nome_aluno
                  replace CATEGORIA with tmp_categoria
                  replace H_CURSADA with tmp_h_cursada
                  replace HORA_ACG with tmp_hora_acg_calculada
                  replace EMPRESA with tmp_empresa
                  replace DATA_INIC with tmp_data_inic
                  replace DATA_FIM with tmp_data_fim
                  replace TOTAL_ACG with tmp_totaliza_hora_acg
                  replace ID_CATEGOR with tmp_id_categoria
                  wait " " 
                  alert("Dados gravados com sucesso")
                  return
             Else
                  alert("Gravando Dados...")
                  loop
             Endif        
EndDo

return

Nota de Moderação:
por Maligno: A presente mensagem foi editada para a inclusão das tags de indentação de código, essenciais para facilitar a leitura do código fonte. Por favor, em futuras mensagens, utilize essas tags obrigatoriamente, pois se não, a moderação terá de editar suas mensagens novamente. Aliás, indentar o código é uma vantagem para você mesmo, haja vista que código sem essa tabulação desencoraja qualquer colega a tentar ajudá-lo. Como é novato no fórum, talvez não conheça o recurso. Ao compor a mensagem, note uma série de botões acima da caixa de edição. O que insere as tags ("code") incluirá na mensagem as tags de abertura/fechamento. Apenas insira seu código entre as duas.

Re: Código nao faz leitura sequencial do Arquivo (while !eof()

Enviado: 27 Abr 2010 23:55
por alxsts
Olá!

Seja bem-vindo ao fórum MDKX!

Seu problema, olhando-se superficialmente, é de fácil solução. O que está difícil é ler o teu código. Por gentileza, antes que um moderador o faça, edite a tua mensagem, colocando o código fonte entre as tags Code, na barra acima da área destinada à digitação das mensagens e indente o código. Exemplo:

Código: Selecionar todos

DO WHILE .T.
   IF ...
      FOR ...
      ...
      NEXT
   Else
   ...
   Endif
ENDDO
Isso agilizará o processo de solução do problema.

Re: Código nao faz leitura sequencial do Arquivo (while !eof()

Enviado: 28 Abr 2010 13:17
por MDKX
Senhores,

desculpem minha falha quanto as tags. Estarei mais atento da proxima vez. Vou testar a sugestão. Agradeço o help.

grato.

Re: Código nao faz leitura sequencial do Arquivo (while !eof()

Enviado: 28 Abr 2010 14:08
por MDKX
Grande alexandre,

cara deu mesma coisa que meu codigo anterior, ele roda mas nao faz o somatorio na variavel HORA_ACG quando acha matricula e o ID iguais aos passados.

Re: Código nao faz leitura sequencial do Arquivo (while !eof()

Enviado: 28 Abr 2010 14:14
por alxsts
Olá!

Eu não alterei nada. Só sugeri que você usasse as tags para indentar o código.

Não tive tempo para analisar o problema a fundo. Creio que poderei fazer isso no final do dia. Se as duas tabelas que você utiliza não forem muito grandes, anexe-as zipadas. Vou fazer uns testes.

Re: Código nao faz leitura sequencial do Arquivo (while !eof()

Enviado: 28 Abr 2010 16:09
por MDKX
Ah sim entendi. Ok.
São pequenas sim. Vou tentar anexa-las.
grato,
Abraços
Marcilio

Re: Código nao faz leitura sequencial do Arquivo (while !eof()

Enviado: 30 Abr 2010 20:45
por alxsts
Olá!

Marcílio:
continuo te devendo aquela ajuda não é?

Preciso de algumas informações:
- o programa que você postou é algo isolado ou faz parte de um sistema? Qual sistema (parece um sistema de escola)?
- você está criando isto agora ou é algo que já está em produção?
- você tem um cadastro de alunos? (a tabela aluno que você postou contem dados da participação do aluno em eventos).
- existem outras tabelas envolvidas? Quais?
- a modelagem de dados pode ser melhorada em muito, facilitando a programação. Este é o motivo das perguntas acima. Se for algo novo, poderei te ajudar a modelar os dados e a construir os programas.

Re: Código nao faz leitura sequencial do Arquivo (while !eof()

Enviado: 30 Abr 2010 21:18
por MDKX
Grande Alexandre,

boa noite.
alxsts escreveu:o programa que você postou é algo isolado ou faz parte de um sistema? Qual sistema (parece um sistema de escola)?
Resp: é um programa isolado (um quebra galho, essa funcionalidade estara operante num sistema ERP a ser implantado mas enquanto nao acontece...)
alxsts escreveu:- você está criando isto agora ou é algo que já está em produção?
Resp: Eu quem estou criando. Usando conhecimentos la de 1997, curso tecnico, pois nao mexo nem trabalhei com desenvolvimento de la pra cá.
alxsts escreveu:- você tem um cadastro de alunos? (a tabela aluno que você postou contem dados da participação do aluno em eventos).
Resp: Exatamente, vc matou a questão. O sisteminha é um controle de eventos que o aluno participou durante sua vida academica, devendo esse seguir as regras das categorias (tabela categoria, que sao a categoria, a unidade/hora e equivalencia para hora_acg). Não existe uma tabela de alunos, essa tabela será criada a partir do momento que vou alimentando o sistema.
alxsts escreveu:- existem outras tabelas envolvidas? Quais?
Resp: Não criei outras tabelas, apenas essas mesmo.

- a modelagem de dados pode ser melhorada em muito, facilitando a programação. Este é o motivo das perguntas acima. Se for algo novo, poderei te ajudar a modelar os dados e a construir os programas.

[ ] ´s

Marcilio

Re: Código nao faz leitura sequencial do Arquivo (while !eof()

Enviado: 30 Abr 2010 21:32
por alxsts
Olá!

Então, se você me permitir, vou tomar a liberdade de fazer algumas alterações e postarei amanhã à tarde/noite.

Re: Código nao faz leitura sequencial do Arquivo (while !eof()

Enviado: 30 Abr 2010 21:57
por MDKX
Claro,

sem problemas. bom que eu me adequo as boas praticas de programação. Os Prg´s que te enviei é a parte principal. o resto do sisteminha e uma tela com um menu de cadastro de categorias, consulta (que exibo com Dbedit) e tennho que criar uma rotina de relatorio depois pra imprimir nome do aluno, os eventos que fez e suas respectivas datas e horas tudo isso dentro do limite de horas ACG.

A gente se fala entao depois.

obrigado.

[]´s

Re: Código nao faz leitura sequencial do Arquivo (while !eof()

Enviado: 26 Mai 2010 15:11
por MDKX
Senhores,

problema resolvido. Dei uma estudada mais a fundo na documentação do clipper e passei a utilzar os comandos NEW / ALIAS para fazer as operações com as tabelas. Mais legigel, profissional que ficar abrindo fehcando banco de dados, bloqueando toda tabela com Flock() etc....
Isso ai.

[]´s

Marcilio