Página 1 de 1

Erro no Relatório

Enviado: 08 Ago 2011 12:10
por raquelreis
Bom dia à todos,

Pessoal desde de já agradeço toda a atenção que sempre encontro aqui no fórum.

É o seguinte, estou com um problema em um dos relatórios.
O relatório exibe informações sobre caixa. E peço ao usuario o período (data inicial / data final).
O problema está em: se o usuario digitar 01/07/2011 a 31/07/2011 - o relatório é gerado em branco.
Porém, se o usuário dgitar 18/07/2011 a 31/07/2011 - o relatorio é gerado corretamente.
Não entendi pq como não há lançamentos do dia 01 até 17, ele não gera. Pq acredito que ele deveria gerar o relatório, porém contando do dia 18.
Segundo Caso: Abrir o arquivo DBF que gera esse relatório e só tem dados até 2009. Porém há 15 arquivos de index referente ao arquivo .dbf. Alguém poderia me ajudar e ver esses arquivos de index? E no código

Código: Selecionar todos

SET INDEX TO 11
o que ele quer dizer? Ainda não entendi essa questão de indexs.
Segue Parte do código:

Código: Selecionar todos

SELE CADSAI
          SET ORDER TO 11
          GO TOP

          SEEK SUBSTR(DTOC(pDATA1),7,4)+SUBSTR(DTOC(pDATA1),4,2)+SUBSTR(DTOC(pDATA1),1,2)

          DO WHILE CTOD(CADSAI->DATA) <= pDATA2 .AND. !EOF()

             IF CTOD(CADSAI->DATA) >= pDATA1
                pDATA   := CADSAI->DATA
                DO WHILE CADSAI->DATA = pDATA .AND. !EOF()
                   pDIA    := SUBSTR(CADSAI->DATA,1,2)
                   pTOTDIA := 0
                   DO WHILE CADSAI->DATA = pDATA .AND. SUBSTR(CADSAI->DATA,1,2) = pDIA .AND. !EOF()

                      IF AutoBusc("CADCANC",2,STR(CADSAI->PEDIDO,6))
                         SELE CADSAI      // Ignora Pedidos Cancelados
                         SKIP ; LOOP

                      ENDIF


Erro no Relatório

Enviado: 08 Ago 2011 13:42
por Jairo Maia
Olá Raquel,

Acredito que onde vc escreveu: SET INDEX TO 11, houve erro de digitação, acho que vc queria escrever: SET ORDER TO 11.

SET INDEX abre um indice. Usar SET INDEX TO 11, não é possível. Necessariamente precisa ser caracter entre aspas ou uma variavel caracter informando o nome do indice a ser aberto. Por exemplo, neste programa deve ter em algum lugar o seguinte:

Código: Selecionar todos

SET INDEX TO "INDICE1.ext", "INDICE2.ext", "INDICE3.ext", até "INDICE15.ext"
A área de cada indice, é a ordem em que ele foi aberto. Assim, quando ele usou o comando SET ORDER TO 11, ele está tornando o índice que foi aberto na posição 11 como o índice corrente da área, ou seja, o índice Master. O clipper permite abrir até 15 indices para cada tabela, não pode ser aberto mais que 15.

Pelo código que vc postou, não dá pra saber o que está ocorrendo, ele parece correto, embora tenha uma arquitetura redundante, está correto.

Nesta linha, ele monta a string que deseja procurar no indice, ou seja, conforme a forma da chave do indice, a saber: Ano+Mês+Dia:

Código: Selecionar todos

SEEK SUBSTR(DTOC(pDATA1),7,4)+SUBSTR(DTOC(pDATA1),4,2)+SUBSTR(DTOC(pDATA1),1,2)
Porém, seu sistema deve ter com certeza o recurso de reconstruir os indices, vc está certa que eles estão atualizados?

Também não entendi o seguinte: Se vc abriu a tabela e tem dados somente até 2009, como ele gera um relatório entre 18/07/2011 e 31/07/2011?

Outras respostas:
raquelreis escreveu:Pq acredito que ele deveria gerar o relatório, porém contando do dia 18.
Sim. É assim que tem acontecer quando os dados existem.
raquelreis escreveu:Alguém poderia me ajudar e ver esses arquivos de index?
Vc quer identificar a chave de cada indice, é isto? Ou não entendi?

Erro no Relatório

Enviado: 08 Ago 2011 14:35
por raquelreis
Boa Tarde,

Jairo desde já agradeço a ajuda.
Jairo Maia escreveu:Acredito que onde vc escreveu: SET INDEX TO 11, houve erro de digitação, acho que vc queria escrever: SET ORDER TO 11.

Sim, foi um erro de digitação, me desculpe.
Jairo Maia escreveu:Porém, seu sistema deve ter com certeza o recurso de reconstruir os indices, vc está certa que eles estão atualizados?
Eu não tenho certeza se os index estão ou não atualizados. Não tenho muito conhecimento em clipper. Porém tem um recurso no sistema de "re-indexar", já realizei este procedimento. Como posso saber se estão atualizados?
Jairo Maia escreveu:Também não entendi o seguinte: Se vc abriu a tabela e tem dados somente até 2009, como ele gera um relatório entre 18/07/2011 e 31/07/2011?
Observe que no codigo ele seleciona um arquivo .dbf com o nome de "CADSAI". Eu abri esse arquivo usando "dbu CADSAI" e olhando os dados só tem até 2009, por isso eu não estou entendendo nada. Porém se eu por qualquer período entre 2010, ele gera o relatório. Inclusive, o período de 01/06/2011 - 31/06/2011, ele gera relatorio. Se for 18/07/2011 - 31/07/2011, ele tbm gera relatório. Apenas no período 01/07/2011 - 31/07/2011 é que ele dá erro (tudo em branco).
Jairo Maia escreveu:Vc quer identificar a chave de cada indice, é isto? Ou não entendi?
Sim. Eu quero ver para onde vai esse

Código: Selecionar todos

SET ORDER TO 11
.

Pesquisei na internet, e vi uma site dizendo para apagar os índices, que quando abrir o sistema novamente ele reconstroi atualizando os índices é correta a informação?

Concordo inteiramente com vc, quando diz:
Jairo Maia escreveu:ele parece correto, embora tenha uma arquitetura redundante
. Porém não tenho muito conhecimento em Clipper para refazer esse relatório.

Segue em anexo todo o arquivo.
EST142.PRG
(5.76 KiB) Baixado 125 vezes
At.

Erro no Relatório

Enviado: 08 Ago 2011 15:17
por Toledo
raquelreis escreveu:O problema está em: se o usuario digitar 01/07/2011 a 31/07/2011 - o relatório é gerado em branco.
Porém, se o usuário dgitar 18/07/2011 a 31/07/2011 - o relatorio é gerado corretamente.
Não entendi pq como não há lançamentos do dia 01 até 17, ele não gera.
No exemplo que você passou, você está usando o comando SEEK para buscar a primeira data digitada pelo usuário, então se no seu banco de dados não tiver nenhum registro com esta data (01/07/2011), o ponteiro de registro vai para o final do banco de dados e a função EOF() vai retornar verdadeiro (.T.).
Neste caso, você teria que usar o comando SET SOFTSEEK ON para se a primeira data não existir, o comando SEEK posicione o ponteiro no registro lógico seguinte.

Exemplo:

Código: Selecionar todos

GO TOP
          SET SOFTSEEK ON
          SEEK SUBSTR(DTOC(pDATA1),7,4)+SUBSTR(DTOC(pDATA1),4,2)+SUBSTR(DTOC(pDATA1),1,2)
          SET SOFTSEEK OFF
Olha, outra coisa é que você poderia mudar a linha:

Código: Selecionar todos

SEEK SUBSTR(DTOC(pDATA1),7,4)+SUBSTR(DTOC(pDATA1),4,2)+SUBSTR(DTOC(pDATA1),1,2)
Por:

Código: Selecionar todos

SEEK DTOS(pDATA1)
O resultado será o mesmo!

Erro no Relatório

Enviado: 08 Ago 2011 15:35
por Jairo Maia
Olá Raquel,
raquelreis escreveu:Porém tem um recurso no sistema de "re-indexar", já realizei este procedimento.
Ok. Então os indices forma atualizados.
raquelreis escreveu:Sim. Eu quero ver para onde vai esse SET ORDER TO 11
Ele não vai a lugar nenhum. Este comando apenas coloca o indice indexado pela data como o Master, é nele que a rotina busca os dados.

Um arquivo .DBF é uma tabela, nele é que ficam os dados. Os arquivos Indices (se este sistema usa DBFNTX, eles têm a extensão .NTX), são arquivos auxiliares que ordenam os dados conforme o projetista precisa. Para esta rotina, está aberto a tabela, e indexado pelo indice da área 11, cuja chave fica claro que é um campo da data.
raquelreis escreveu:Apenas no período 01/07/2011 - 31/07/2011 é que ele dá erro (tudo em branco).
Estou propenso a pensar que não é um erro, e sim porque realmente não existem registros para este período.

Vamos verificar algumas coisas:
1- Localize o seguinte trecho em sua rotina:

Código: Selecionar todos

SELE CADSAI
     SET ORDER TO 11
     GO TOP

     SEEK SUBSTR(DTOC(pDATA1),7,4)+SUBSTR(DTOC(pDATA1),4,2)+SUBSTR(DTOC(pDATA1),1,2)

     DO WHILE CTOD(CADSAI->DATA) <= pDATA2 .AND. !EOF()
2- Altere da seguinte forma:

Código: Selecionar todos

SELE CADSAI
     SET ORDER TO 11
     GO TOP

     Alert( IndexKey() ) // retorna a chave deste indice. Anote que vou pedir um teste abaixo

     SEEK SUBSTR(DTOC(pDATA1),7,4)+SUBSTR(DTOC(pDATA1),4,2)+SUBSTR(DTOC(pDATA1),1,2)

     If !Found()  // Se não encontrar a data,
       Alert( "Não foi encontrado Movimento para a data: " + DToC( pData1 ) )  // avisa e,
       Loop  // pede outra data
     EndIf

     DO WHILE CTOD(CADSAI->DATA) <= pDATA2 .AND. !EOF()
3- Abra novamente o arquivo usando o DBU
a- Acesse a opção Create
b- escolha INDEX
c- coloque um nome diferente do indice existente, p.ex. TESTE
d- coloque para chave o campo que pedi pra vc anotar
e- verifique o arquivo. No final dele estará a data mais antiga.

Erro no Relatório

Enviado: 08 Ago 2011 15:46
por Jairo Maia
Em tempo:

Olá Toledo, demorei pra montar minha resposta, e vi a sua após postar.
Toledo escreveu:Neste caso, você teria que usar o comando SET SOFTSEEK ON
Legal essa dica. Esqueci deste comando. Legal.

Mas veja uma coisa:
Toledo escreveu:Olha, outra coisa é que você poderia mudar a linha:
SEEK SUBSTR(DTOC(pDATA1),7,4)+SUBSTR(DTOC(pDATA1),4,2)+SUBSTR(DTOC(pDATA1),1,2)
Por:
SEEK DTOS(pDATA1)
O resultado será o mesmo!
O problema é que o indice está indexado por Ano+Mes+Dia, a varialvel pDATA1 está no formato Dia+Mês+Ano

Em tempo (novamente):
Raquel,

Analisando novamente o código, fica claro que SOFTSEEK está setado como ON, por isso a linha abaixo de SEEK checa o seguinte:

Código: Selecionar todos

CTOD(CADSAI->DATA) <= pDATA2 .AND. !EOF()
Verifica se a data é menor que a data final, e se não é fim de arquivo. O problema que mesmo não encontrando a data, no final ele gera um relatório branco, por isso abaixo de SEEK precisa verificar se FOUND (encontrou) for .F., nem prossegue, dá o Loop.

Como SOFSEEK está ON, não use SOFTSEEK OFF. Pode alterar outros pontos do programa.

Erro no Relatório

Enviado: 08 Ago 2011 18:33
por Toledo
Jairo Maia escreveu:O problema é que o indice está indexado por Ano+Mes+Dia, a varialvel pDATA1 está no formato Dia+Mês+Ano
Jairo, observe que estou usando a função DTOS(), que retorna um string no formado AAAAMMDD (Ano+Mês+Dia) de uma data.

Abraços,

Erro no Relatório

Enviado: 09 Ago 2011 09:58
por raquelreis
Obrigado à todos pelas dicas.

Estarei tentando resolver o problema. Mais dúvidas eu informações postarei para vocês.


At.

Erro no Relatório

Enviado: 09 Ago 2011 15:51
por raquelreis
RESOLVIDO

Pessoal, consegui resolver o problema adicionando apenas o comando

Código: Selecionar todos

SET SOFTSEEK ON / OFF
no meu código.

Muito obrigado à todos vcs.

Tbm estou a disposição caso precisem de ajuda.


vlw.

Erro no Relatório

Enviado: 09 Ago 2011 19:39
por alxsts
Olá!

Somente para ilustrar ainda mais o conteúdo do tópico, lembro que a função DbSeek() aceita um segundo parâmetro, onde se pode solicitar um soft seek. Assim, o trecho de código

Código: Selecionar todos

          SET SOFTSEEK ON
          SEEK SUBSTR(DTOC(pDATA1),7,4)+SUBSTR(DTOC(pDATA1),4,2)+SUBSTR(DTOC(pDATA1),1,2)
          SET SOFTSEEK OFF
ficaria assim:

Código: Selecionar todos

DbSeek( DtoS(pDATA1), .T. ) 
já considerando a intervenção do Toledo.
No Clipper 5.3, a função aceita ainda um terceiro parâmetro que força o ponteiro de registro ser posicionado na última ocorrência da chave, quando esta apresenta várias ocorrências no índice.