AnaCatacombs Posted October 15, 2012 Report Share Posted October 15, 2012 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 ... Quote Link to comment Share on other sites More sharing options...
AnaCatacombs Posted October 15, 2012 Author Report Share Posted October 15, 2012 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 ... Quote Link to comment Share on other sites More sharing options...
Erciley Junior Posted October 15, 2012 Report Share Posted October 15, 2012 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)) ENDDOid=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 Quote Link to comment Share on other sites More sharing options...
Theotokos Posted October 15, 2012 Report Share Posted October 15, 2012 um chute... já verificou o indice, ou seja, cria-lo de novo? Quote Link to comment Share on other sites More sharing options...
vagner Posted October 15, 2012 Report Share Posted October 15, 2012 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 BancoDeDados->(DbGoTop()) SEEK Variavel ? Found() ou ? BancoDeDados->(DbSeek(Variavel)) DO WHILE !EOF() .AND. CampoDoBanco == Variavel (...) SKIP ENDDO id=code>id=code>Vagner Wirts "Ele não sabendo que era impossÃvel, foi lá e fez" Quote Link to comment Share on other sites More sharing options...
AnaCatacombs Posted October 15, 2012 Author Report Share Posted October 15, 2012 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é? Quote Link to comment Share on other sites More sharing options...
alex2002 Posted October 15, 2012 Report Share Posted October 15, 2012 Experimente colocar um syswait(1) antes do while e veja se funciona. Um abraço, Alexandre Pereira fwh 10.02, xharbour 1.21, PellesC, xDev, SqlLib, Ubuntu 10.10 (isso é que é SO) msn: alexpdasilva6@hotmail.com Belo Horizonte/MG Quote Link to comment Share on other sites More sharing options...
vagner Posted October 15, 2012 Report Share Posted October 15, 2012 Olá, Tente Colocar AllTrim(CampodoBanco) == AllTrim(Variavel) Vagner Wirts "Ele não sabendo que era impossÃvel, foi lá e fez" Quote Link to comment Share on other sites More sharing options...
emotta Posted October 15, 2012 Report Share Posted October 15, 2012 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 Quote Link to comment Share on other sites More sharing options...
AnaCatacombs Posted October 15, 2012 Author Report Share Posted October 15, 2012 Alex, com syswait funcionou ! Qual a bruxaria? Eduardo, obrigada pela sugestão, mas também não funcionou dessa forma. Quote Link to comment Share on other sites More sharing options...
Erciley Junior Posted October 15, 2012 Report Share Posted October 15, 2012 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 Quote Link to comment Share on other sites More sharing options...
Erciley Junior Posted October 15, 2012 Report Share Posted October 15, 2012 Syswait, ? (interrogação), inkey , msginfo.... são funções que vão parar a execução por um tempo, seja para dar apertar uma tecla ou não. 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 Quote Link to comment Share on other sites More sharing options...
AnaCatacombs Posted October 15, 2012 Author Report Share Posted October 15, 2012 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á? Quote Link to comment Share on other sites More sharing options...
alex2002 Posted October 15, 2012 Report Share Posted October 15, 2012 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 Quote Link to comment Share on other sites More sharing options...
Erciley Junior Posted October 15, 2012 Report Share Posted October 15, 2012 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 Quote Link to comment Share on other sites More sharing options...
AnaCatacombs Posted October 15, 2012 Author Report Share Posted October 15, 2012 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 Quote Link to comment Share on other sites More sharing options...
vagner Posted October 15, 2012 Report Share Posted October 15, 2012 Olá, Bom, vamos por partes então 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 "Ele não sabendo que era impossÃvel, foi lá e fez" Quote Link to comment Share on other sites More sharing options...
CleitonSH Posted October 15, 2012 Report Share Posted October 15, 2012 Isso acontece comigo até hoje. Certas rotinas, se eu não colocar um syswait, não funciona como deveria. Cleiton FWH906+xHarbour, MySql, WorkShop, PellesC, FW20d+Clipper5.2+Clip53b Quote Link to comment Share on other sites More sharing options...
Erciley Junior Posted October 15, 2012 Report Share Posted October 15, 2012 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 ENDDOid=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 Quote Link to comment Share on other sites More sharing options...
aferra Posted October 15, 2012 Report Share Posted October 15, 2012 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> Quote Link to comment Share on other sites More sharing options...
AnaCatacombs Posted October 15, 2012 Author Report Share Posted October 15, 2012 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 Quote Link to comment Share on other sites More sharing options...
AnaCatacombs Posted October 15, 2012 Author Report Share Posted October 15, 2012 Alessandro, Funcionar até que funciona, mas dá outro erro que eu não vou nem comentar aqui senão vou ficar conhecida como a rainha da gambiarra ... entre outras coisas. Quote Link to comment Share on other sites More sharing options...
emotta Posted October 15, 2012 Report Share Posted October 15, 2012 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 Quote Link to comment Share on other sites More sharing options...
AnaCatacombs Posted October 15, 2012 Author Report Share Posted October 15, 2012 O Alessandro matou a pau ! Vou fazer uma redefinição do WHILE pra colocar o sysrefresh() em todos. Quote Link to comment Share on other sites More sharing options...
Geraldo (gbsilva) Posted October 15, 2012 Report Share Posted October 15, 2012 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 Quote Link to comment Share on other sites More sharing options...
Recommended Posts
Join the conversation
You can post now and register later. If you have an account, sign in now to post with your account.