Erro de sistema
Moderador: Moderadores
- Ricardo Sales Ribeiro
- Usuário Nível 3

- Mensagens: 279
- Registrado em: 13 Jul 2004 18:06
- Localização: Fortaleza-Ceara
Erro de sistema
Caros Colegas
Bom Dia!
Tenho um pequeno sistema, onde criei um arquivo chamado CadTab.Dbf, nele contem 118 registros, com os seguintes campos:
Codigo, C, 6
Material, C 45
Custo, N, 8,2
Tipo, C, 1
O código é caractere, mas preencho com numeros.
Então, criei uma rotina, que entra com o Codigo, C, 6 , e faço o seguinte:
Select a_CadTab
Set Orde To 1
DbSeek(Codigo)
If !Eof()
wMaterial:=Material
wCusto:=Custo
Else
Mensagem(´Codigo não encontrado´)
Endif
Eu entro com 114 diferentes codigos, e localizo todos, mas tem 4 códigos, que estão no arquivo, porque abri o CadTab com o fox, e vi, mas esses códigos sempre me retornam ´Código não localizado´
Já fiz de tudo, troquei variaveis, usei locate, mas esses quatros ultimos codigos ele não localiza.
Já zerei todo o arquivo, criei novamente, mas esses quatro codigos não conisgo localizar.
Gostaria da ajuda dos amigos.
Agradeço desde já a colaboração
Bom Dia!
Tenho um pequeno sistema, onde criei um arquivo chamado CadTab.Dbf, nele contem 118 registros, com os seguintes campos:
Codigo, C, 6
Material, C 45
Custo, N, 8,2
Tipo, C, 1
O código é caractere, mas preencho com numeros.
Então, criei uma rotina, que entra com o Codigo, C, 6 , e faço o seguinte:
Select a_CadTab
Set Orde To 1
DbSeek(Codigo)
If !Eof()
wMaterial:=Material
wCusto:=Custo
Else
Mensagem(´Codigo não encontrado´)
Endif
Eu entro com 114 diferentes codigos, e localizo todos, mas tem 4 códigos, que estão no arquivo, porque abri o CadTab com o fox, e vi, mas esses códigos sempre me retornam ´Código não localizado´
Já fiz de tudo, troquei variaveis, usei locate, mas esses quatros ultimos codigos ele não localiza.
Já zerei todo o arquivo, criei novamente, mas esses quatro codigos não conisgo localizar.
Gostaria da ajuda dos amigos.
Agradeço desde já a colaboração
- Toledo
- Administrador

- Mensagens: 3133
- Registrado em: 22 Jul 2003 18:39
- Localização: Araçatuba - SP
- Contato:
Erro de sistema
Ricardo, o arquivo de índice está atualizado?
Abraços,
Abraços,
Toledo - Clipper On Line
toledo@pctoledo.com.br
Harbour 3.2/MiniGui/HwGui
Faça uma doação para o fórum, clique neste link: http://www.pctoledo.com.br/doacao
toledo@pctoledo.com.br
Harbour 3.2/MiniGui/HwGui
Faça uma doação para o fórum, clique neste link: http://www.pctoledo.com.br/doacao
- Ricardo Sales Ribeiro
- Usuário Nível 3

- Mensagens: 279
- Registrado em: 13 Jul 2004 18:06
- Localização: Fortaleza-Ceara
Erro de sistema
Ola amigos
Sim, o arquivo de indices, estar atualizado sim, ja troquei o nome do arquivo de indices, agora mesmo fiz o seguinte:
Abri o CadTab, zerei tudo, e com o programa, adicionei os tres codigos, voltei a rotina de consulta, ou localização e nada.
É um misterio, ja verifiquei o prg varias vezes, posso estar deixando passar alguma coisa muito pequena, que não estou conseguindo vê.
Como posso postar aqui meu prg?
Atenciosamente
Sim, o arquivo de indices, estar atualizado sim, ja troquei o nome do arquivo de indices, agora mesmo fiz o seguinte:
Abri o CadTab, zerei tudo, e com o programa, adicionei os tres codigos, voltei a rotina de consulta, ou localização e nada.
É um misterio, ja verifiquei o prg varias vezes, posso estar deixando passar alguma coisa muito pequena, que não estou conseguindo vê.
Como posso postar aqui meu prg?
Atenciosamente
- Toledo
- Administrador

- Mensagens: 3133
- Registrado em: 22 Jul 2003 18:39
- Localização: Araçatuba - SP
- Contato:
Erro de sistema
Veja este tópico: https://pctoledo.org/forum/viewto ... =40&t=8000Ricardo Sales Ribeiro escreveu:Como posso postar aqui meu prg?
Abraços,
Toledo - Clipper On Line
toledo@pctoledo.com.br
Harbour 3.2/MiniGui/HwGui
Faça uma doação para o fórum, clique neste link: http://www.pctoledo.com.br/doacao
toledo@pctoledo.com.br
Harbour 3.2/MiniGui/HwGui
Faça uma doação para o fórum, clique neste link: http://www.pctoledo.com.br/doacao
- Ricardo Sales Ribeiro
- Usuário Nível 3

- Mensagens: 279
- Registrado em: 13 Jul 2004 18:06
- Localização: Fortaleza-Ceara
Erro de sistema
Bom Dia! Amigos
Continuo com o mesmo erro, não consigo resolver, é muito extranho, eu uso a mesma rotina, para buscar o codigo
no CadTab, tres(3) codigos não encontro, mas estão lá, e o indice estar correto, como buscar a maioria dos codigos e
apenas tres deles não vem?
Vou anexar meu prg e o arquivo cadtab, é muito simples, é basico, um prg para dar entradas de produtos, tenho o cadastro no cadtab, solicito o codigo, mostro a descrição e preço de custo e dou entrada, mas os tres ultimos codigos
adicionados ao CadTab, não retornam qdo eu procuro, os outros vem tudo direitinho.
Qdo eu executo o programa, eu escolho uma opçao tipo 1 ou 2, para eu poder definir a tela de entrada, na entrada
pela opçao 1, a rotina encontra o produto, mas na rotina tipo 2, encontra todos menos os tres ultimos codigos adicionados.
Não entendo, nunca passei por esse tipo de erro, estar la o codigo, mostra numa rotina e na outra não mostra. Com certeza não devo estar enchergando o erro, por isso anexei o prg para os amigos darem uma olhada.
Atenciosamente
Continuo com o mesmo erro, não consigo resolver, é muito extranho, eu uso a mesma rotina, para buscar o codigo
no CadTab, tres(3) codigos não encontro, mas estão lá, e o indice estar correto, como buscar a maioria dos codigos e
apenas tres deles não vem?
Vou anexar meu prg e o arquivo cadtab, é muito simples, é basico, um prg para dar entradas de produtos, tenho o cadastro no cadtab, solicito o codigo, mostro a descrição e preço de custo e dou entrada, mas os tres ultimos codigos
adicionados ao CadTab, não retornam qdo eu procuro, os outros vem tudo direitinho.
Qdo eu executo o programa, eu escolho uma opçao tipo 1 ou 2, para eu poder definir a tela de entrada, na entrada
pela opçao 1, a rotina encontra o produto, mas na rotina tipo 2, encontra todos menos os tres ultimos codigos adicionados.
Não entendo, nunca passei por esse tipo de erro, estar la o codigo, mostra numa rotina e na outra não mostra. Com certeza não devo estar enchergando o erro, por isso anexei o prg para os amigos darem uma olhada.
Atenciosamente
- Anexos
-
CADTAB.rar- Tabela de produtos
- (1.73 KiB) Baixado 199 vezes
-
SISMAT61.PRG- Prg
- (12.55 KiB) Baixado 195 vezes
- Toledo
- Administrador

- Mensagens: 3133
- Registrado em: 22 Jul 2003 18:39
- Localização: Araçatuba - SP
- Contato:
Erro de sistema
Ricardo, a única diferença entre a opção tipo 1 e tipo 2, é que na tipo 1 no GET foi definido uma picture:
Já no tipo 2, não tem a picture:
Mas acho que isto não faz diferença se você digitar todos os números do código.
Bom, como este código que você enviou não tem como compilar para testar, fica difícil tentar descobrir onde está o erro.
Abraços,
Código: Selecionar todos
@ 23,20 Get wCodigo Pict '999999'Código: Selecionar todos
@ wl,10 Get wCod_IgoBom, como este código que você enviou não tem como compilar para testar, fica difícil tentar descobrir onde está o erro.
Abraços,
Toledo - Clipper On Line
toledo@pctoledo.com.br
Harbour 3.2/MiniGui/HwGui
Faça uma doação para o fórum, clique neste link: http://www.pctoledo.com.br/doacao
toledo@pctoledo.com.br
Harbour 3.2/MiniGui/HwGui
Faça uma doação para o fórum, clique neste link: http://www.pctoledo.com.br/doacao
Erro de sistema
Ricardo,
1. No PRG que vc publicou, não aparece COMO é feita a INDEXAÇÃO. Você pode mostrar pra gente? Pode ser que vc tenha criado o índice de uma maneira e esteja procurando por outra...
2. O campo CODIGO, no registro 82 do DBF, contém uma aspa ('60280), parece erro de digitação... É preciso, em suas rotinas, que vc VALIDE as entradas antes de salvar no DBF: no caso do código, confirmar antes que ele só contém caracteres de 0 a 9.
3. Após o seek, vc tá usando !EOF() indevidamente. O correto é usar FOUND(), que retorna .T. se foi encontrado algum registro.
1. No PRG que vc publicou, não aparece COMO é feita a INDEXAÇÃO. Você pode mostrar pra gente? Pode ser que vc tenha criado o índice de uma maneira e esteja procurando por outra...
2. O campo CODIGO, no registro 82 do DBF, contém uma aspa ('60280), parece erro de digitação... É preciso, em suas rotinas, que vc VALIDE as entradas antes de salvar no DBF: no caso do código, confirmar antes que ele só contém caracteres de 0 a 9.
3. Após o seek, vc tá usando !EOF() indevidamente. O correto é usar FOUND(), que retorna .T. se foi encontrado algum registro.
Código: Selecionar todos
Select a_CadTab
DbSeek(wCodigo)
* If !Eof()
if found()
* mostra na tela etc
else
* registro não localizado
endif
- Ricardo Sales Ribeiro
- Usuário Nível 3

- Mensagens: 279
- Registrado em: 13 Jul 2004 18:06
- Localização: Fortaleza-Ceara
Erro de sistema
Bom Dia!
Obrigado pelas sugestões, vou checar agora mesmo
Retorno com as conclusões.
Atenciosamente
Obrigado pelas sugestões, vou checar agora mesmo
Retorno com as conclusões.
Atenciosamente
Erro de sistema
Vou informar como sempre fiz para campos numéricos ou alfas, que farão parte de índices:
1. na criação do índice:
a) se o campo for numérico, com até 4 algarismos: index on strzero(codigo,4,0) to indice1
b) se o campo for caractere, ex. também com 4 caracteres: index on codigo to indice1
2. na gravação do arquivo:
a) se o campo for numérico, com até 4 algarimos: replace codigo with strzero(codigo,4,0)
b) se o campo for caractere, também com 4 caracteres: replace codigo with strzero(val(codigo),4,0)
3. no acesso ao registro:
do while .t.
xcodigo := space(4)
@ x,y say "Informe o código: " get xcodigo pict "9999"
read
xcodigo := strzero(val(xcodigo),4,0)
select arquivo
set order to 1
seek xcodigo
if eof()
.... código não existe, vai para pesquisa ou mensagem de erro, etc.
loop
else
exit
enddo
tratamento normal da rotina
Observação: como podem notar, transformo tudo sempre para alfas, nunca deu erro.
1. na criação do índice:
a) se o campo for numérico, com até 4 algarismos: index on strzero(codigo,4,0) to indice1
b) se o campo for caractere, ex. também com 4 caracteres: index on codigo to indice1
2. na gravação do arquivo:
a) se o campo for numérico, com até 4 algarimos: replace codigo with strzero(codigo,4,0)
b) se o campo for caractere, também com 4 caracteres: replace codigo with strzero(val(codigo),4,0)
3. no acesso ao registro:
do while .t.
xcodigo := space(4)
@ x,y say "Informe o código: " get xcodigo pict "9999"
read
xcodigo := strzero(val(xcodigo),4,0)
select arquivo
set order to 1
seek xcodigo
if eof()
.... código não existe, vai para pesquisa ou mensagem de erro, etc.
loop
else
exit
enddo
tratamento normal da rotina
Observação: como podem notar, transformo tudo sempre para alfas, nunca deu erro.
O bom do computador é que ele resolve os problemas, sem nunca levantar nenhum.
Hoje atuo mais com Clipper 52E, e um pouquinho com XHarbour.
Hoje atuo mais com Clipper 52E, e um pouquinho com XHarbour.
- rochinha
- Administrador

- Mensagens: 4664
- Registrado em: 18 Ago 2003 20:43
- Localização: São Paulo - Brasil
- Contato:
Erro de sistema
Amiguinho,
Como o Toledo postou, suas mascaras para a pegada dos dados são diferentes, se o campo tem X caracteres suas mascara obrigatóriamente devem estar de acordo, senão falha.
Outra coisa, quando se usa estruturas deve-se avaliar qual e quando usar um controlador. Cada controlador de estrutura tem uma peculiaridade.
O if..else..endif é usado quando voce rem duas opções, ou É ou não É, ou seja, quando se é(if = .t.) executa um código, senão(else) executa outro. Apesar desta estrutura aceita vários senão(elseIf) a coisa pode fica preta e voce ter de aninhar if..endif dentro de if..endif.
O case..endcase já é uma estrutura mais vertical mas no seu caso pode acontecer de ter várias opções distintas, É um, É outro e Talvez outro.
É muito importante que se defina as criticas conforme o que voce tem de opções. Colocar um if..algo = 1 supoe que qualquer coisa diferente de 1 será igual a 2,3,1000,0,-1, 1 e meio, etc.
Se voce possui duas opçoes ou mais ai o melhor é usar case..endcase.
Na sua estrutura:
Se voce precisar colocar xTip_Est=3, 4, 5 ou 10 imagine:
Apesar de pequeno o codigo duas sugestões:
1 - Coloque a mascara em uma variavel e passe-a para o GET. Se com o tempo voce alterar o tamanho do campo não terá tanta dor de cabeça procurando e alterando cada mascara que existir.
2 - Aninhe os if..else..endif em case..endcase
Bom trabalho.
Como o Toledo postou, suas mascaras para a pegada dos dados são diferentes, se o campo tem X caracteres suas mascara obrigatóriamente devem estar de acordo, senão falha.
Outra coisa, quando se usa estruturas deve-se avaliar qual e quando usar um controlador. Cada controlador de estrutura tem uma peculiaridade.
O if..else..endif é usado quando voce rem duas opções, ou É ou não É, ou seja, quando se é(if = .t.) executa um código, senão(else) executa outro. Apesar desta estrutura aceita vários senão(elseIf) a coisa pode fica preta e voce ter de aninhar if..endif dentro de if..endif.
O case..endcase já é uma estrutura mais vertical mas no seu caso pode acontecer de ter várias opções distintas, É um, É outro e Talvez outro.
Código: Selecionar todos
do case
case critica
... // Faz isto aqui
case critica
... // Faz isto aqui
case critica
... // Faz isto aqui
otherwise // Por outro lado
... // Faz isto finalmente
endcase
Se voce possui duas opçoes ou mais ai o melhor é usar case..endcase.
Na sua estrutura:
Código: Selecionar todos
Do while .T.
...
If wTip_Est = '1'
Do while .T.
...
Enddo
Else
...
If wTip_Est = '2'
Do while .T.
...
Enddo
Endif
Endif
Exit
Enddo
Código: Selecionar todos
Do while .T.
If wTip_Est = '1'
...
Else
If wTip_Est = '2'
...
Else
If wTip_Est = '3'
...
Else
If wTip_Est = '4'
...
Else
... muitos IFs depois
If wTip_Est = '20'
...
Endif
Endif
Endif
Endif
Endif
Exit
Enddo
1 - Coloque a mascara em uma variavel e passe-a para o GET. Se com o tempo voce alterar o tamanho do campo não terá tanta dor de cabeça procurando e alterando cada mascara que existir.
Código: Selecionar todos
cMascara := "999999"
...
@ ... GET ... PICTURE cMascara
Código: Selecionar todos
Do while .T.
do case
case wTip_Est = '1'
... // Outra rotina
case wTip_Est = '2'
... // Outra rotina
case wTip_Est = '3'
... // Outra rotina
case wTip_Est = '4'
... // Outra rotina
case wTip_Est = '5'
... // Outra rotina
...
case wTip_Est = '10'
... // Outra rotina
otherwise
... // Outra rotina
endcase
Enddo
OPS! LINK QUEBRADO? Veja ESTE TOPICO antes e caso não encontre ENVIE seu email com link do tópico para [url=mailto://fivolution@hotmail.com]fivolution@hotmail.com[/url]. Agradecido.
@braços : ? )
A justiça divina tarda mas não falha, enquanto que a justiça dos homens falha porque tarda.
@braços : ? )
A justiça divina tarda mas não falha, enquanto que a justiça dos homens falha porque tarda.
- Ricardo Sales Ribeiro
- Usuário Nível 3

- Mensagens: 279
- Registrado em: 13 Jul 2004 18:06
- Localização: Fortaleza-Ceara
Erro de sistema
Boa Tarde
Amigos
Continuo com o mesmo problema, só que agora inverteu, os codigos que eu não conseguia localizar, estou localizando
agora, e os restante que eu localizava, não aparecem mais.
Detalhe na opção 1 eu localizo todos, na opção 2 não localizo nada.
Fiz todas as alterações sugeridas, e nada, o meu campo codigo, é caractere, mas só contem numeros, então crio o indice
simplismente
index on codigo to CadTabCd
só uso um indice, já atualizei tb as mascaras, estão iguais nas duas opções, não sei mas o que fazer, não entendo porque consigo localizar na opção 1 e nã 2 só tres codigos.
Vou anexar novamente o meu prg, para mais uma olhada de vcs.
Estou com essa rotina aqui no sistema parada porque não consigo resolver.
Atenciosament
Amigos
Continuo com o mesmo problema, só que agora inverteu, os codigos que eu não conseguia localizar, estou localizando
agora, e os restante que eu localizava, não aparecem mais.
Detalhe na opção 1 eu localizo todos, na opção 2 não localizo nada.
Fiz todas as alterações sugeridas, e nada, o meu campo codigo, é caractere, mas só contem numeros, então crio o indice
simplismente
index on codigo to CadTabCd
só uso um indice, já atualizei tb as mascaras, estão iguais nas duas opções, não sei mas o que fazer, não entendo porque consigo localizar na opção 1 e nã 2 só tres codigos.
Vou anexar novamente o meu prg, para mais uma olhada de vcs.
Estou com essa rotina aqui no sistema parada porque não consigo resolver.
Atenciosament
- Anexos
-
SISMAT61.PRG- Meu prg
- (12.58 KiB) Baixado 210 vezes
Erro de sistema
Prezado Ricardo,
Seu código:
Parece que o problema está no indice. Você usa NTX ou CDX? Siga exatamente as orientações de billy1943 falou.
Teste o seu código com o seguinte código:
Verifique sem o uso de índices se é possível encontrar o codigo buscado. Verifique o tamanho do código. Lembre-se: espaço também ocupa "espaço".
Repita a experiência com o mesmo código alterado como segue:
Verifique se há diferença entre os dois processamentos. Caso o segundo funcione o problema está na forma como o arquivo foi indexado e também na forma como os dados foram gravados no DBF.
att,
Yugi.
Seu código:
Código: Selecionar todos
Select a_CadTab
* Set Orde To 1
* DbSeek(wCodigo)
Locate For wCodigo = Codigo
If Found()
wCod_Igo:=wCodigo
wDes_Ite:=Material
wPcu_Ite:=wCus_Ite:=Custo
Endif
Teste o seu código com o seguinte código:
Código: Selecionar todos
Select a_CadTab
set order to 0
go top // ou goto 100 por exemplo
do while.not.eof()
if Codigo = wCodigo
else
? codigo + " - " + str(len(codigo))
? wCodigo + " - " + str(len(wCodigo))
endif
skip
Enddo
Repita a experiência com o mesmo código alterado como segue:
Código: Selecionar todos
Select a_CadTab
set order to 0
go top // ou goto 100 por exemplo
do while.not.eof()
if ALLTRIM(Codigo) = ALLTRIM(wCodigo)
else
? ALLTRIM(codigo) + " - " + str(len(ALLTRIM(codigo)))
? ALLTRIM(wCodigo) + " - " + str(len(ALLTRIM(wCodigo)))
endif
skip
Enddo
att,
Yugi.
- Ricardo Sales Ribeiro
- Usuário Nível 3

- Mensagens: 279
- Registrado em: 13 Jul 2004 18:06
- Localização: Fortaleza-Ceara
Erro de sistema
Bom Dia
Amigo Yugi
Vou fazer as mudanças que vc surgeriu, agora o que eu não consigo entender, é que na opção 1 eu consigo localizar todos os códigos e na opção 2, apenas 3 códigos, e eu uso esse procedimento em todos os outros programas do sistema.
Só nessa rotina deu esse problema todo, vou acabar é criando outra rotina partindo do zero, esquercendo esse prg.
Mas vamos lá, deixa eu testar aqui essas mudanças.
Agradeço a atenção dos amigos
Atenciosamente
Amigo Yugi
Vou fazer as mudanças que vc surgeriu, agora o que eu não consigo entender, é que na opção 1 eu consigo localizar todos os códigos e na opção 2, apenas 3 códigos, e eu uso esse procedimento em todos os outros programas do sistema.
Só nessa rotina deu esse problema todo, vou acabar é criando outra rotina partindo do zero, esquercendo esse prg.
Mas vamos lá, deixa eu testar aqui essas mudanças.
Agradeço a atenção dos amigos
Atenciosamente
Erro de sistema
Oi, Ricardo:
Vou sugerir duas coisinhas:
1. Faz tempo que eu nunca uso campo númerico para índices, pois o algorítmo de criação de índices pode lhe pregar peças. Eu inclusive já sofri com isso nos bons tempos do COBOL, onde às vezes um código não entrava de jeito nenhum e não encontrava explicação.
Li não sei aonde que o computador foi feito para trabalhar com caracteres ou strings, e os campos numéricos são objeto de rotinas de ponto flutuante.
O que diferenciou os arquivos em disco e os em fita magnética foi a criação de índices de acesso aleatório.
2. Para auditar seu sistema, inclua provisoriamente uma checagem da forma:
......
3. Se você não descobrir os seu(s) erro(s) por estas formas, é melhor exorcizar seu sistema, rsrsrs....
Vou sugerir duas coisinhas:
1. Faz tempo que eu nunca uso campo númerico para índices, pois o algorítmo de criação de índices pode lhe pregar peças. Eu inclusive já sofri com isso nos bons tempos do COBOL, onde às vezes um código não entrava de jeito nenhum e não encontrava explicação.
Li não sei aonde que o computador foi feito para trabalhar com caracteres ou strings, e os campos numéricos são objeto de rotinas de ponto flutuante.
O que diferenciou os arquivos em disco e os em fita magnética foi a criação de índices de acesso aleatório.
2. Para auditar seu sistema, inclua provisoriamente uma checagem da forma:
Código: Selecionar todos
select arquivo_tal
set index to indice_da_chave
go top
xchave := (IMPORTANTE. construa aqui a chave sempre em caracteres para acessar o arquivo, e se tiver concatenar datas, usar a função DTOS())
set softseek on // habilita a procura não exata ou seja, localiza o registro que tenha a chave procurada ou para no imediatamente seguinte
seek xchave
set softseek off // desabilita a procura acima
if ! eof()
flock() // bloqueia o arquivo
browse() // ao abrir a janela do browse, você vê em qual registro ele parou, e que, pode ser o correto ou então você analisa porque ele parou nesse registro que não é o desejado
dbunlock() // desbloqueia arquivo
... continua ou não você decide se agora quer localizar o registro sem softseek
... o importante é você ver no browse o porque que ele não acessa o registro que a chave indica
... você pode testar outros índices que o arquivo porventura tenha tomando sempre cuidado na hora de criá-los
else // deu EOF()
( mensagem informando que NENHUM registro foi encontrado, e, chegou até ao registro em branco que fica no final do arquivo sempre)
(mensagem exibindo a chave que foi criada, às vezes você se assusta com o que você informou para o sistema localizar um registro.Analise a chave criada com os dados. )
loop // não adianta prosseguir
endif
3. Se você não descobrir os seu(s) erro(s) por estas formas, é melhor exorcizar seu sistema, rsrsrs....
O bom do computador é que ele resolve os problemas, sem nunca levantar nenhum.
Hoje atuo mais com Clipper 52E, e um pouquinho com XHarbour.
Hoje atuo mais com Clipper 52E, e um pouquinho com XHarbour.


