Jump to content
Fivewin Brasil

Erro com While.


AnaCatacombs

Recommended Posts

Bom dia colegas.

Estou com um problema de tirar o sono...

Tenho uma simples rotina:


SELECT BancoDeDados

SET ORDER TO Ordem

SEEK Variavel

DO WHILE !EOF() .AND. CampoDoBanco == Variavel

(...)

SKIP

ENDDO

id=code>id=code>

Se eu coloco uma mensagem (MsgInfo)antes do WHILE , ele entra no do while ... se eu retiro não entra ! Alguém já passou por isso?

Um amigo sugeriu um KEYBOARD(CHR(32)) antes do WHILE e funcionou, mas não acho que seja a solução mais correta.

Só faltava mesmo ter que fazer uma redefinição do WHILE pra colocar um KEYBOARD(CHR(32)) antes ...

Link to comment
Share on other sites

  • Replies 51
  • Created
  • Last Reply

Top Posters In This Topic

Bom dia colegas.

Estou com um problema de tirar o sono...

Tenho uma simples rotina:


SELECT BancoDeDados

SET ORDER TO Ordem

SEEK Variavel

DO WHILE !EOF() .AND. CampoDoBanco == Variavel

(...)

SKIP

ENDDO

id=code>id=code>

Se eu coloco uma mensagem (MsgInfo)antes do WHILE , ele entra no do while ... se eu retiro não entra ! Alguém já passou por isso?

Um amigo sugeriu um KEYBOARD(CHR(32)) antes do WHILE e funcionou, mas não acho que seja a solução mais correta.

Só faltava mesmo ter que fazer uma redefinição do WHILE pra colocar um KEYBOARD(CHR(32)) antes ...

Link to comment
Share on other sites

Estranho hein, coisa do mal isso ^^

Tente fazer assim para ver se funciona:


ALIAS->(DBSEEK( variavel ))

WHILE !ALIAS->(EOF()) .AND. ALIAS->CAMPODOBANCO == variavel

(...)

ALIAS->(DBSKIP(1))

ENDDO

id=code>id=code>

Se não der certo, em vez de exibir uma mensagem, crie um arquivo texto para ver o que está ocorrendo, assim...:


cFile:='c:\teste01.txt'

oTxt:=TTxtFile():New(cFile)

ALIAS->(DBSETORDER(Ordem))

ALIAS->(DBSEEK( variavel ))

oTxt:ADD( 'VAI ENTRAR NO LOOP' )

oTxt:ADD( CSTR( ALIAS->(RECNO()) ) + '-' + CSTR( ALIAS->(EOF()) ) + '-' + CSTR( ALIAS->CAMPODOBANCO ) + '-' + CSTR( variavel ) )

WHILE !ALIAS->(EOF()) .AND. ALIAS->CAMPODOBANCO == variavel

oTxt:ADD( 'VERIFIQUE ALGO AQUI, SE FOR O CASO' )

(...)

ALIAS->(DBSKIP(1))

ENDDO

oTxt:ADD( 'FORA DO LOOP' )

oTxt:End()

id=code>id=code>

Erciley Junior (FWH8.01 + SQLLIB 1.9d + xHB 1.10 + xDev 0.65 + @SAY)

NÃO ABANDONE O POST, QUEREMOS SABER SE SUA DÚVIDA/PROBLEMA TEVE SOLUÇÃO

Editado por - eco_fw on 15/10/2012 08:45:39

Link to comment
Share on other sites

Olá,


SELECT BancoDeDados

SET ORDER TO Ordem

Veja se não existe algum scope(), nessa ordem, não esqueça que se vc abre o arquivo no início do programa, ele mantem sempre até a saida, então se fez um scope, retire icon_smile_wink.gif

BancoDeDados->(DbGoTop())

SEEK Variavel

? Found()

ou

? BancoDeDados->(DbSeek(Variavel))

DO WHILE !EOF() .AND. CampoDoBanco == Variavel

(...)

SKIP

ENDDO

id=code>id=code>

Vagner Wirts

bgprofilea.jpg

"Ele não sabendo que era impossível, foi lá e fez"

Link to comment
Share on other sites

Obrigada pelas respostas.

Erciley:

1º Sugestão: Não deu certo.

2º Sugestão: Deu certo com o txt, nada de anormal, mas se retirar não funciona.

Theotokos:

Já tentei, não funciona :(

vagner: Já tentei limpar os Set Filters e o OrdScope e nada funcionou. Segui seu exemplo, e com ?Found() funcionou.. mas se retirar não funga.

Tentei até colocar um IF FOUND() antes. O found retorna verdadeiro , mas não entra no While.

Coisa de doido né?

Link to comment
Share on other sites

Geralmente esses erros são "comidas de bola" e que geram essa coincidencia... Procure deixar seu codigo o mais claro possivel na pesquisa, principalmente quanto a CAMPOS de tabela e VARIAVEIS. Pois quando existe o mesmo nome para campo e variavel é um problema... Procure mudar seu codigo para:

SELECT BancoDeDados

SET ORDER TO Ordem

SEEK M->Variavel

DO WHILE !BANCODEDADOS->(EOF()) .AND. BANCODEDADOS->CampoDoBanco == M->Variavel

(...)

BANCODEDADOS->(DBSKIP())

ENDDO

citação:

Obrigada pelas respostas.

Erciley:

1º Sugestão: Não deu certo.

2º Sugestão: Deu certo com o txt, nada de anormal, mas se retirar não funciona.

Theotokos:

Já tentei, não funciona :(

vagner: Já tentei limpar os Set Filters e o OrdScope e nada funcionou. Segui seu exemplo, e com ?Found() funcionou.. mas se retirar não funga.

Tentei até colocar um IF FOUND() antes. O found retorna verdadeiro , mas não entra no While.

Coisa de doido né?


id=quote>id=quote>

Eduardo Motta

emotta@gmail.com.br

FWH 9.09 (original) - xHARBOUR 1.2.1 (comercial e original) - SQLRDD

AJbJ

Link to comment
Share on other sites

Então Ana, a idéia do TXT é uma outra forma de você debugar

a idéia dele é você salvar no txt o retorno do IF EOF, posição do arquivo, etc, para ver o pq funciona as vezes e o pq não funciona as vezes.

Troque coisas simples, como o SET ORDER, ao invés de deixar fazendo a ordem pela variável, coloque um valor numérico.

Deve ser alguma comida de bola mesmo, como o Eduardo disse.

Você sabe que colocar um inkey, syswait, etc, vai funcionar, mas lembre-se que isso é uma "gambiarra" para arrumar algo que não está encontrando, não é legal deixar assim.

Faça como o Vagner disse também, teste as variável, se for caracter, com ALLTRIM(UPPER())

se for variável numérica, compare elas fazendo o mesmo ROUND.

Erciley Junior (FWH8.01 + SQLLIB 1.9d + xHB 1.10 + xDev 0.65 + @SAY)

NÃO ABANDONE O POST, QUEREMOS SABER SE SUA DÚVIDA/PROBLEMA TEVE SOLUÇÃO

Link to comment
Share on other sites

Beleza, isso eu sei.

Meu computador é rápido demais?

Vou dar uma mensagem pro cliente : "Atenção, seu computador é muito bom pra executar essa operação ! O Sistema vai esperar um pouco até a ficha cair. Enquanto isso, desfrute de um cafézinho."

O.o

Mesmo que funcione, não é certo. Eu tenho 500 mil WHILE's no sistema. Como eu vou saber em qual tá executando a rotina, e qual não está?

Link to comment
Share on other sites

Então,

Descobri este "enigma" quando em uma versão da SQLLib dava um certo delay. Daí eu debugava dando msginfo e funcionava. Cheguei a conclusão que estas funções davam uma "esvaziada" nos buffers e com isso o syswait resolveu.

Mas foi doido descobrir isso, pq eu descobri da pior forma.

Bom que resolveu.

Um abraço,

Alexandre Pereira

fwh 10.02, xharbour 1.21, PellesC, xDev, SqlLib, Win7

Belo Horizonte/MG

Link to comment
Share on other sites

Olha, alguma bruxaria tem...

já me deparei algumas vezes com esses erros absurdos, xinguei até minha mãe blz... aí parei pra pensar: Bom, FW existe há muitos anos, muitas pessoas utilizam e tem PC´s muito melhores que o meu, se está acontecendo isso só comigo, o mais provável é ter algo errado comigo.

Bom, nem sempre isso é vdd, mas no caso do seu While, sei lá, não acredito que seja um bug da linguagem ou q vc ou o cliente tenham um super PC vindo da NASA.

Erciley Junior (FWH8.01 + SQLLIB 1.9d + xHB 1.10 + xDev 0.65 + @SAY)

NÃO ABANDONE O POST, QUEREMOS SABER SE SUA DÚVIDA/PROBLEMA TEVE SOLUÇÃO

Link to comment
Share on other sites

Realmente meu pc não veio da Nasa, e nem é tão rápido assim.

Eu só gostaria de entender o que está acontecendo pra tomar uma medida preventiva.

Eu programo profissionalmente a uns 11 ou 12 anos e nunca tive esse tipo de problema... já enfrentei muita coisa cabeluda, que na maioria das vezes era a forma ou os componentes que eu trabalhava que acabava dando "merda", mas sempre encontrei uma solução lógica para o problema.

A maioria das pessoas resolvem o problema sem se preocupar com o motivo dele.

Como um amigo disse "Nessa altura do campeonato, eu só quero resolver, se com o Keyboard deu certo beleza, vou deixar assim !".

Eu gostaria de ir mais além e entender o pq disso, e solucionar definitivamente.

Aposto que teve mais gente que passou por problemas como esse, resolveu com solução doméstica e ficou por isso mesmo com a falsa sensação de problema resolvido.

Editado por - anacatacombs on 15/10/2012 15:13:03

Editado por - anacatacombs on 15/10/2012 15:14:20

Link to comment
Share on other sites

Olá,

Bom, vamos por partes então icon_smile_big.gif

1ªmente, vc abre seu arquivos no início do programa ?

2ªmente, vc usa dialog ou window para apresentação de tela ?

3ªmente, vc possui temporizadores no seu programa que executem alguma outra função ?

4ªmente, vc não está fazendo chamadas recursivas nessa mesma função/procedure ?

Vagner Wirts

bgprofilea.jpg

"Ele não sabendo que era impossível, foi lá e fez"

Link to comment
Share on other sites

Olá Ana, agora quero descobrir isso, aff (coisas do FW)

Como estão os SET DATE, SET CENTURY, SET DELETED, etc, do seu sistema?

O arquivo do DBSEEK, é DBF mesmo, ou você está usando um USE SQL da SQLLIB por exemplo?

Você tentou criar um projeto só com um trecho semelhante a esse para ver se o problema persiste?

Você tentou por exemplo, em vez de fazer o teste no WHILE, carregar um variável lógica, e usar apenas ela no while?

EX:


lTeste:=!EOF() .AND. CampoDoBanco == Variavel

WHILE lTeste

SKIP...

lTeste:=!EOF() .AND. CampoDoBanco == Variavel

ENDDO

id=code>id=code>

Tentou fazer a comparação com ALLTRIM(UPPER?

Tentou ao invés de usar comando DBF, usar as funções? (dbseek() dbsetorder()...)

Tentou usar com ponteiro ao invés de fazer SELECT ALIAS?

Bom, não sei se vou ajudar ou atrapalhar enchendo você de perguntas, mas espero ajudar em algo ^^ (e tente essas coisas ^^)

Erciley Junior (FWH8.01 + SQLLIB 1.9d + xHB 1.10 + xDev 0.65 + @SAY)

NÃO ABANDONE O POST, QUEREMOS SABER SE SUA DÚVIDA/PROBLEMA TEVE SOLUÇÃO

Link to comment
Share on other sites

Bem acredito que usando o Sysrefresh() seria o correto.


SELECT BancoDeDados

SET ORDER TO Ordem

SEEK Variavel

DO WHILE !EOF() .AND. CampoDoBanco == Variavel

(...)

SKIP

SysRefresh()id=red>

ENDDO

id=code>id=code>

o Sysrefresh() permite a liberação dos eventos do windows junto a aplicação, é indicado usar em rotinas pesadas como while, for, etc..., liberando a aplicação até o final do processo, teste e veja se da certo.

Um grande Abraço

Alessandroid=blue>

FW9.07 + xHb121 + CDX

Fico feliz com os Meus erros, pois eles me apontam a direção para o acerto.id=red>

Link to comment
Share on other sites

Não indico usar FUNCAO em indices, a não ser STR e DTOS. Em DBF nao tem nenhum problema mas quando mudar pra banco de dados usando alguma RDD isso se torna um, apenas as funcoes STR e DTOS a RDD converte. Então aconselho a mudar seu indice para STR apenas e nao STRZERO.

Outra coisa, procure no seu fonte ter de forma clara a indicacao do que é CAMPO e do que é VARIAVEL, indicando sempre o ALIAS seguido de -> ou M->. Procure fazer assim o seu SEEK

SELECT BancoDeDados

SET ORDER TO Ordem

SEEK M->Variavel

DO WHILE !BANCODEDADOS->(EOF()) .AND. BANCODEDADOS->CampoDoBanco == M->Variavel

(...)

BANCODEDADOS->(DBSKIP())

ENDDO

citação:

Erciley, é um seek com strzero.

a ordem foi criada com STRZERO(CodigoDoCoiso,6)

e eu estou fazendo um seek com STRZERO(CodigoDoCoisinho,6)

Minha versão do xharbour e do fivewin é meio antiga.

Xharbour: 1.0 e fivewin: 8.01


id=quote>id=quote>

Eduardo Motta

emotta@gmail.com.br

FWH 9.09 (original) - xHARBOUR 1.2.1 (comercial e original) - SQLRDD

AJbJ

Link to comment
Share on other sites

Ana sei que resolveu, mas concordo com a maioria que não esta certo.

Entendendo seu código voce procura um determinado valor e quer um while/end enquanto for isso no while ok.

//-> IMPORTANTE: o índice é pelo mesmo campo que esta igualando a variável no while?

Talvez pareça bobagem, mas há muito tempo eu usava bastante dbf e me lembro de fazer muito esse tipo de rotina, então lá vai.


SET ORDER TO Ordem

IF !DbSeek(variavel)

? "existe"

ELSE

? "nao existe vou voltar"

return(.f.)

ENDIF

//-> Se existe tem que entrar no while, mas vamos testar antes onde esta o ponteiro

? SeuDbf->(recno()) // acho que é isso né como disse não uso dbf há muito tempo

// Iguale a a variável antes de entrar no while porque voce só quer o while da

// variável certo?

variável := SeuDbf->CampoDoBanco

// Inverta a linha abaixo

//DO WHILE !EOF() .AND. CampoDoBanco == Variavel

DO WHILE variavel = CampoDoBanco .AND. SeuDbf->(!Eof() )

(...)

SKIP

ENDDO

id=code>id=code>

Sds,

Geraldo B. Silva

Fwh1202 Fev/2012, xHarbour 2.0, Bcc582, Pelles, xDev, Sqllib, Tdolphin e MySql.

lucgera@terra.com.br

São Paulo - SP

Link to comment
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Loading...

×
×
  • Create New...