Código nao faz leitura sequencial do Arquivo (while !eof()
Enviado: 27 Abr 2010 23:22
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.
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.
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
returnpor 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.