Erro de sistema

Fórum sobre a linguagem CA-Clipper.

Moderador: Moderadores

Avatar do usuário
Ricardo Sales Ribeiro
Usuário Nível 3
Usuário Nível 3
Mensagens: 279
Registrado em: 13 Jul 2004 18:06
Localização: Fortaleza-Ceara

Erro de sistema

Mensagem por Ricardo Sales Ribeiro »

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
Ricardo Sales
Fortaleza-Ce
lodara53@yahoo.com.br
lodara53@hotmail.com
Avatar do usuário
Toledo
Administrador
Administrador
Mensagens: 3133
Registrado em: 22 Jul 2003 18:39
Localização: Araçatuba - SP
Contato:

Erro de sistema

Mensagem por Toledo »

Ricardo, o arquivo de índice está atualizado?

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
Avatar do usuário
Ricardo Sales Ribeiro
Usuário Nível 3
Usuário Nível 3
Mensagens: 279
Registrado em: 13 Jul 2004 18:06
Localização: Fortaleza-Ceara

Erro de sistema

Mensagem por Ricardo Sales Ribeiro »

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
Ricardo Sales
Fortaleza-Ce
lodara53@yahoo.com.br
lodara53@hotmail.com
Avatar do usuário
Toledo
Administrador
Administrador
Mensagens: 3133
Registrado em: 22 Jul 2003 18:39
Localização: Araçatuba - SP
Contato:

Erro de sistema

Mensagem por Toledo »

Ricardo Sales Ribeiro escreveu:Como posso postar aqui meu prg?
Veja este tópico: https://pctoledo.org/forum/viewto ... =40&t=8000

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
Avatar do usuário
Ricardo Sales Ribeiro
Usuário Nível 3
Usuário Nível 3
Mensagens: 279
Registrado em: 13 Jul 2004 18:06
Localização: Fortaleza-Ceara

Erro de sistema

Mensagem por Ricardo Sales Ribeiro »

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
Anexos
CADTAB.rar
Tabela de produtos
(1.73 KiB) Baixado 199 vezes
SISMAT61.PRG
Prg
(12.55 KiB) Baixado 195 vezes
Ricardo Sales
Fortaleza-Ce
lodara53@yahoo.com.br
lodara53@hotmail.com
Avatar do usuário
Toledo
Administrador
Administrador
Mensagens: 3133
Registrado em: 22 Jul 2003 18:39
Localização: Araçatuba - SP
Contato:

Erro de sistema

Mensagem por Toledo »

Ricardo, a única diferença entre a opção tipo 1 e tipo 2, é que na tipo 1 no GET foi definido uma picture:

Código: Selecionar todos

@ 23,20 Get wCodigo Pict '999999'
Já no tipo 2, não tem a picture:

Código: Selecionar todos

@ wl,10 Get wCod_Igo
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,
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
Avatar do usuário
Eolo
Colaborador
Colaborador
Mensagens: 1134
Registrado em: 08 Dez 2005 18:24
Localização: São Paulo - SP

Erro de sistema

Mensagem por Eolo »

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.

Código: Selecionar todos

Select a_CadTab
DbSeek(wCodigo)
* If !Eof()
if found()
  * mostra na tela etc
else
  * registro não localizado
endif
Avatar do usuário
Ricardo Sales Ribeiro
Usuário Nível 3
Usuário Nível 3
Mensagens: 279
Registrado em: 13 Jul 2004 18:06
Localização: Fortaleza-Ceara

Erro de sistema

Mensagem por Ricardo Sales Ribeiro »

Bom Dia!

Obrigado pelas sugestões, vou checar agora mesmo
Retorno com as conclusões.


Atenciosamente
Ricardo Sales
Fortaleza-Ce
lodara53@yahoo.com.br
lodara53@hotmail.com
Avatar do usuário
billy1943
Usuário Nível 4
Usuário Nível 4
Mensagens: 570
Registrado em: 12 Mai 2009 17:33
Localização: Bauru-SP

Erro de sistema

Mensagem por billy1943 »

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.
O bom do computador é que ele resolve os problemas, sem nunca levantar nenhum.
Hoje atuo mais com Clipper 52E, e um pouquinho com XHarbour.
Avatar do usuário
rochinha
Administrador
Administrador
Mensagens: 4664
Registrado em: 18 Ago 2003 20:43
Localização: São Paulo - Brasil
Contato:

Erro de sistema

Mensagem por rochinha »

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.

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 
É 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:

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
Se voce precisar colocar xTip_Est=3, 4, 5 ou 10 imagine:

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

Código: Selecionar todos

cMascara := "999999"
...
@ ... GET ... PICTURE cMascara
2 - Aninhe os if..else..endif em case..endcase

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 
Bom trabalho.
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.
Avatar do usuário
Ricardo Sales Ribeiro
Usuário Nível 3
Usuário Nível 3
Mensagens: 279
Registrado em: 13 Jul 2004 18:06
Localização: Fortaleza-Ceara

Erro de sistema

Mensagem por Ricardo Sales Ribeiro »

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
Anexos
SISMAT61.PRG
Meu prg
(12.58 KiB) Baixado 210 vezes
Ricardo Sales
Fortaleza-Ce
lodara53@yahoo.com.br
lodara53@hotmail.com
yugi386
Usuário Nível 2
Usuário Nível 2
Mensagens: 82
Registrado em: 24 Jul 2008 10:36
Localização: Minas Gerais

Erro de sistema

Mensagem por yugi386 »

Prezado Ricardo,

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

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

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
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.
Avatar do usuário
Ricardo Sales Ribeiro
Usuário Nível 3
Usuário Nível 3
Mensagens: 279
Registrado em: 13 Jul 2004 18:06
Localização: Fortaleza-Ceara

Erro de sistema

Mensagem por Ricardo Sales Ribeiro »

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
Ricardo Sales
Fortaleza-Ce
lodara53@yahoo.com.br
lodara53@hotmail.com
Avatar do usuário
billy1943
Usuário Nível 4
Usuário Nível 4
Mensagens: 570
Registrado em: 12 Mai 2009 17:33
Localização: Bauru-SP

Erro de sistema

Mensagem por billy1943 »

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:

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