Jump to content
Fivewin Brasil

Erro com While.


AnaCatacombs

Recommended Posts

  • Replies 51
  • Created
  • Last Reply

Top Posters In This Topic

Malandro!!! Juntou o alto-clero pra resolver o problema e ainda assim nem todos estão convencidos. Isso é o que eu chamo de MCFP. É quando vc aciona o interruptor pra acender a luz e esta nem thum, daí vc dá uma porradinha e ela acende e as vezes tem que dar mais uma porradinha.

To aqui já curioso pela solução definitiva.

[]s,

citação:

Boa noite.

Desculpe se a pergunta parece boba, mas, vamos lá:

Você usa == , então o campo e variável tem sempre o mesmo tamanho, certo?

Alberto - SP


id=quote>id=quote>

Jorge Andrade

"Quem tem medo de perguntar, está fadado a eternizar-se na dúvida"

Link to comment
Share on other sites

Ana,

Com certeza alguma lógica precisa ser verificada no programa que você está tendo este problema, pois deve ter uma falha de programação.

O uso de SysWait ou SysRefresh vai somente deixar seu sistema mais lento e não vai resolver o problema, as dicas do Vagner e do Eduardo devem te ajudar.

Se for possível poste o fonte e as informações comentadas pelo Vagner que poderemos dar informações com mais assertividade.

Alexandre

Link to comment
Share on other sites

Tái, eu gostaria de uma explicação do pq não está certo usar o SysRefresh(), Vejam a tradução e tirem suas conclusões.


SysRefresh ()

Deixa o processo do Windows todas as mensagens pendentes

sintaxe:

SysRefresh () -> lQuit

parâmetros:

Nenhum.

retorna:

Um valor lógico que indica se uma mensagem WM_QUIT foi emitido, para que o aplicativo deve ser terminado.

observações:

Esta função FiveWin é extremamente importante e não tem contrapartida no padrão Windows API.

SysRefresh () processa todas as mensagens pendentes, deixando o Windows continuar a gerir todas as suas atividades pendentes.

Devemos usar SysRefresh () de dentro de processos que podem ser demorado.

O grande benefício e vantagem de SysRefresh () é que ele permite-nos continuar a fazer programação linear "padrão" sem ter

que enviar mensagens de nós mesmos para manter o processamento de uma tarefa longa.

Use-o em loops, busca e quaisquer processos demorados para evitar Windows de perder o controle de processamento.

id=code>id=code>

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 feliz , resolvi fazer um teste simples simples:


nCount := 0

SELECT Clientes

SET ORDER TO 1

GO TOP

DO WHILE !EOF()

nCount ++

SKIP

ENDDO

Msginfo(str(nCount))

Msginfo(str(Lastrec()))

id=code>id=code>

Resultado:

1º Mensagem: 0

2º Mensagem: 5490

Outro teste:


nCount := 0

Msginfo("Vai entrar no while")

SELECT Clientes

SET ORDER TO 1

GO TOP

DO WHILE !EOF()

nCount ++

SKIP

ENDDO

Msginfo(str(nCount))

Msginfo(str(Lastrec()))

id=code>id=code>

Resultado:

1º Mensagem: 5490

2º Mensagem: 5490

Entenderam o problema ? Não é erro de índices, nem de lógica de programação, nem de cláusulas do SEEK , nem SET DATE, SET CENTURY, nem OrdScope (Nem uso SET SCOPE), nem SET FILTER, nem SET EXACT e etc etc etc.

Editado por - anacatacombs on 16/10/2012 08:08:17

Link to comment
Share on other sites

Bom Dia,

Acho que o melhor teste a ser feito é atualizar seu xharbour e fazer o mesmo exemplo em modo console, já que o FW não exerce nada em rotinas diferente de GUI.

Ficar falando de problemas com [x]harbour antigo e tiro no pé, todos sabem que o [x]harbour passou por diversos processo de amadurecimento.

Sysrefresh() pode ser usado sim em Loop, alias caso não queira que apareça a mensagem "não respondendo" é melhor usar!

O SysWait() realmente deixa um pouco mais lento, já que ele usa o sysrefresh(), mas fica no loop um periodo, diferente do Sysrefresh() que apenas libera o evento do windows.

e-mail: gilmer@fivewin.com.br

msn: fivewinbrasil@hotmail.com

Link to comment
Share on other sites

Ana nao coloque nada que atualize a tela dentro de um loop sem necessidade… senao o teu programa vira uma carroça. Tenho este problema em um software aqui também.

Isto não tem nada haver com o FW e pelo que você mencionou acredito que o certo é justametne o que o Gilmer falou: bug do compilador!

Att,

Vailton Renato

"No dia mais claro, na noite mais escura... o bug sucumbirá ante a minha presença"

assinatura.jpg

E-mail/MSN: contato@vailton.com.br

Skype: vailtom

Link to comment
Share on other sites

dica

aconselho sempre estar atualizado com fwh & (x)habour, recebo semestralmente pagando um pouco por mês, nao tenho trabalho para atualiza pois sempre estou com uma versao proxima da versao final... outra coisa que faço eh sempre usar classes nativas do fwh.

estranho que esse seu erro nao tenha acontecido antes neh?... acho q seja alguma logica de programacao...

pode tb criar um dbf novo e dah um append do velho para o novo

FWH1205 / FWPPC1002 / xHarbour / BCC582 / RDD CDX

Editado por - roberio on 16/10/2012 11:28:34

Link to comment
Share on other sites

Pessoal,

Qual o "erro de programação" no teste simples que ela apresentou?

Por favor, me indiquem, eu sinceramente não vi. É muito fácil falar que é "erro de programação". Discordo plenamente desta afirmação.

Concordo que pode ser uma LIB, um RDD, uma versão do compilador, ou algo parecido, exceto erro de programação na sintaxe que ela apresentou.

Falo isso porque isso aconteceu comigo. E se tivesse sido erro de programação quando aconteceu o caso, a SKILL do Evandro teria quebrado.

Me lembro que na época o problema foi com uma versão da SQLLIB que rapidamente o Vailton nos enviou outra e o erro parou. Mas para não parar o cliente e eu continuar com a programação sem perder tempo, usei o syswait e passou. Bola pra frente.

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

Nem sempre é a atualização que vai resolver problemas, as vezes precisamos saber o que se está errado, sempre é uma falha de lógica de programação ou de estrutura de avaliação. A solução é bem simples, como já mostrei antes e ela confirmou... SysRefresh() o detalhe da versão dela é que colocando o Sysrefresh() some o alias ( vai entender ) então bastou colocar a referencia de alias e solucionou o problema.

Exemplo dela.


SELECT BancoDeDados

SET ORDER TO Ordem

SEEK Variavel

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

(...)

SKIP

ENDDO

id=code>id=code>

Exemplo corrigido


SELECT BancoDeDados

SET ORDER TO Ordem

SEEK Variavel

DO WHILE BancoDeDados->id=red>(!EOF()) .AND. BancoDeDados->id=red>CampoDoBanco == Variavel

(...)

BancoDeDados->( DBSKIP() )

SysRefresh()

id=red>

ENDDO

id=code>

id=code>

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>

Editado por - aferra on 16/10/2012 11:42:14

Link to comment
Share on other sites

Concordo com o Alexandre, há problemas que é da linguagem, coisas que as vezes acontecem, as vezes não. Um exemplo é esse tópico que abri uma vez, arrumei o problema antes mesmo de criar o tópico, mas abri o tópico para entender O PORQUE, mas até hoje não entendi, não entendi pois não há explicação aparente, é um BUG misterioso, coisa do mal ^^

http://www.fivewin.com.br/forum/topic.asp?TOPIC_ID=19936

Aproveitando o Vailton aqui, peço para que dê uma resposta para essa pergunta abaixo, se possível, obrigado.

http://www.fivewin.com.br/forum/topic.asp?TOPIC_ID=21309

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

Olá,

SELECT Clientes

SET ORDER TO 1

GO TOP

DO WHILE !EOF()

SKIP

ENDDO

SEEK

Estes comandos são pré-históricos. Se usassem SQL não teria nem o tópico. Eu nem me lembrava mais deles! icon_smile.gif

[]s,

Evandro G. de Paula

Curvelo - MG

evandro@skillnet.com.br (Escr. - na Cidade)

imortal@skillnet.com.br (Res. - na Roça)

FWH 9.01+PellesC+MyMake+xHarbour.org 1.00+SqlLib

Link to comment
Share on other sites

na minha opnião sempre é o problema do programador...qdo se refere a tela, controles, recursos ( redefine ) são problemas de fwh e em alguns casos o problema de lib fora de ordem ( como já foi citado ), agora no exemplo dela não foi bem isso que aconteceu e a resposta está acima ou seja não era atualização, não era compilador, era a forma de se usar...

esse jeito de usar é muito antigo e desde a versão 5.1 do clipper ( se não antes até ) era indicado usar ->, ->( ), enfim, desta maneira. e desde essa época eu trabalho com o alias em referencia e não tenho problema, fui ter problema com while, for, etc, onde tinha muito processamento e o SysRefresh() foi a solução ( explicado anteriormente ), o xhb manteve a compatibilidade, que eu acho um erro, pois o programador não muda o jeito só pq já está escrito, porem uma hora é cobrado, e foi o que aconteceu...enfim...está solucionado.

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

Eu já tive este problema inclusive em Clipper puro. É igual aquele bug do dbEdit() que pega um lastkey() fantasma e que praticamente ninguém nunca viu e eu ja sofri com isto barbaridades tanto em Clipper como em Harbour/xHarbour.

Enfim, há situações como estas que não são fáceis de se explicar, mas que são no mínimo curiosas.

Acho válida a idéia da Ana de expor um problema, visando nos avisar e também buscar uma solução.

Att,

Vailton Renato

"No dia mais claro, na noite mais escura... o bug sucumbirá ante a minha presença"

assinatura.jpg

E-mail/MSN: contato@vailton.com.br

Skype: vailtom

Link to comment
Share on other sites

legal que deu certo o que falei no inicio. Mas somente para complementar, até variavel de memoria é bom usar com M-> caso ela nao tenha nomes com notação hungara (cNome, dData, nSalario, ETC) pois se o nome da variavel for por exemplo NOME e no alias selecionado naquele momento tiver um campo chamado NOME ele busca o campo do alias e nao a variavel, é só uma dica.

Outra coisa é que se for isso mesmo então o SYSFRESH muda o alias selecionado internamente e nao volta... Nesse caso seria um BUG do Fivewin já que a funcao SYSFRESH é do fivewin. Mas se realmente for isso que acontece.

abraços,

citação:

Nem sempre é a atualização que vai resolver problemas, as vezes precisamos saber o que se está errado, sempre é uma falha de lógica de programação ou de estrutura de avaliação. A solução é bem simples, como já mostrei antes e ela confirmou... SysRefresh() o detalhe da versão dela é que colocando o Sysrefresh() some o alias ( vai entender ) então bastou colocar a referencia de alias e solucionou o problema.

Exemplo dela.


SELECT BancoDeDados

SET ORDER TO Ordem

SEEK Variavel

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

(...)

SKIP

ENDDO

id=code>id=code>

Exemplo corrigido


SELECT BancoDeDados

SET ORDER TO Ordem

SEEK Variavel

DO WHILE BancoDeDados->id=red>(!EOF()) .AND. BancoDeDados->id=red>CampoDoBanco == Variavel

(...)

BancoDeDados->( DBSKIP() )

SysRefresh()

id=red>

ENDDO

id=code>id=code>

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>

Editado por - aferra on 16/10/2012 11:42:14


id=quote>id=quote>

Eduardo Motta

emotta@gmail.com.br

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

AJbJ

Editado por - emotta on 16/10/2012 17:47:48

Link to comment
Share on other sites

Só pra não deixar o tópico abandonado:

A minha idéia era justamente expor o problema (que tinha resolvido com uma gambi)e ver se alguém mais já tinha passado por isso.

Estou refatorando o script de compilação, e fazer mais alguns testes pra tentar descobrir a real causa do problema (Que não é erro de programação !!), e depois atualizar a versão do xHarbour e do Fivewin (trabalho pro fim de semana todo).

Assim que terminar volto a postar os resultados.

Link to comment
Share on other sites

Ana, boa noite.

Você somente saberá se tem algum problema (seja no compilador ou na sua rotina) ao isolar a situação.

Por exemplo, você poderia isolar este código e rodar em modo console, notei que você colocou um trecho onde apresentou o problema, mas precisaríamos ver como o alias Clientes foi aberto, qual a expressão do SET ORDER TO etc ... enfim, só analisando a situação por completo ou isolando um exemplo simples demonstrando o problema.

No trabalho com o FW já tive sim problemas de "falhas" deste tipo, mas foi devido a forma de desenvolvimento da rotina e o culpado no meu caso foi o SysRefresh.

NÃO ENTENDAM COMO PROBLEMA DA FUNÇÃO SYSREFRESH!!!

O problema foi numa rotina que fazia um WHILE no mesmo ALIAS que estava num BROWSE, ao executar o SYSREFRESH o Windows mandou uma mensagem para atualizar os controles e quem recebeu este comando??? o BROWSE, que reposicionou meu WHILE ...

Talvez não ajude em nada esta informação, mas foi uma situação que eu encontrei uma falha de programação.

Você poderia também nos informar qual o RDD e versão do compilador?

Boa sorte em sua análise.

Alexandre

Link to comment
Share on other sites

citação:

Ana, boa noite.

Você somente saberá se tem algum problema (seja no compilador ou na sua rotina) ao isolar a situação.

Por exemplo, você poderia isolar este código e rodar em modo console, notei que você colocou um trecho onde apresentou o problema, mas precisaríamos ver como o alias Clientes foi aberto, qual a expressão do SET ORDER TO etc ... enfim, só analisando a situação por completo ou isolando um exemplo simples demonstrando o problema.

No trabalho com o FW já tive sim problemas de "falhas" deste tipo, mas foi devido a forma de desenvolvimento da rotina e o culpado no meu caso foi o SysRefresh.

NÃO ENTENDAM COMO PROBLEMA DA FUNÇÃO SYSREFRESH!!!

O problema foi numa rotina que fazia um WHILE no mesmo ALIAS que estava num BROWSE, ao executar o SYSREFRESH o Windows mandou uma mensagem para atualizar os controles e quem recebeu este comando??? o BROWSE, que reposicionou meu WHILE ...

Talvez não ajude em nada esta informação, mas foi uma situação que eu encontrei uma falha de programação.

Você poderia também nos informar qual o RDD e versão do compilador?

Boa sorte em sua análise.

Alexandre


id=quote>id=quote>

Por isso mesmo, perguntei se há um timer no sistema, ou algo assim, já tive problemas por causa de um "correio interno" onde eu com um timer lia se havia mensagens para o usuário e os arquivos se reposicionavam, aí montei uma função para pegar a ordem de todos os arquivos, e depois de executar a rotina retorna a ordem icon_smile_wink.gif

Vagner Wirts

bgprofilea.jpg

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

Link to comment
Share on other sites

citação:

Estes comandos são pré-históricos. Se usassem SQL não teria nem o tópico. Eu nem me lembrava mais deles! icon_smile.gif

[]s,

Evandro G. de Paula

Curvelo - MG

evandro@skillnet.com.br (Escr. - na Cidade)

imortal@skillnet.com.br (Res. - na Roça)

FWH 9.01+PellesC+MyMake+xHarbour.org 1.00+SqlLib


id=quote>id=quote>

Melhor solução de todas. icon_smile_big.gif

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

citação:

citação:

Estes comandos são pré-históricos. Se usassem SQL não teria nem o tópico. Eu nem me lembrava mais deles!

[]s,

Evandro G. de Paula

Curvelo - MG

evandro@skillnet.com.br (Escr. - na Cidade)

imortal@skillnet.com.br (Res. - na Roça)

FWH 9.01+PellesC+MyMake+xHarbour.org 1.00+SqlLib

Melhor solução de todas.

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


id=quote>id=quote>

Existem controvérsias ...

DELETE as linhas de uma tabela e não tenha o backup pra ver

>> No DBF o DBU resolve

Imagine ter um banco de dados em cada estação PDV

>> No DBF a "base é local"

Entre outras coisas mais ... NÃO que eu seja contra o SQL, mas o DBF não é vilão, inclusive sobrevive muito bem nesta selva de linguagens e recursos abundantes.

Abs,

Alexandre

Link to comment
Share on other sites

xiiiiiii, concordo....vilão não é.....eeee talvez não teria esse problema, porem provavelmente teriam outros... kkkkkkk

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

Hehehe, aí sim pode começar uma longa discussão ^^

No caso do PDV, tendo um DBF local, seria o mesmo q um banco local em cada máquina, fazer oq. (mas graças a Alá existe a rede, o que deixa o sql bem superior nesta comparação ^^)

Quanto ao DELETE, o DBF também faz isso, mas trabalhamos com o modo de "marcar como deletado", coisa esta que também poderia se fazer com sql.

E concordo plenamente que o DBF não é vilão, foi ele quem começou a pagar meu salarinho aqui, eu quase digo que amo o DBF, huahuahauhau.

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

kkkkkkkkkkkkkkkkkkkkkkkkkk

o que um while sem alias não faz.

kkkkkkkkkkkkkkkkkkkkkkkkkk

Culpa do Evando, que tinha que colocar o SQL no meio

kkkkkkkkkkkkkkkkkkkkkkkkkk

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

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...