Erro no Relatório

Fórum sobre a linguagem CA-Clipper.

Moderador: Moderadores

raquelreis
Usuário Nível 2
Usuário Nível 2
Mensagens: 87
Registrado em: 18 Jul 2011 15:29
Localização: à procura

Erro no Relatório

Mensagem 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

Keel
[]'s

_____________________________________________________________________________________
PROGRAMADOR é aquele que te resolve um problema que você não sabia que tinha, de uma maneira que você não compreende.
Avatar do usuário
Jairo Maia
Moderador
Moderador
Mensagens: 2785
Registrado em: 16 Ago 2010 13:46
Localização: Campinas-SP

Erro no Relatório

Mensagem 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?
Abraços, Jairo
Harbour / Clipper 5.2e - Blinker 7
(Não respondo dúvidas por MP ou E-mail. Por favor, não encaminhe via mensagem privada ou e-mail, dúvidas que podem ser compartilhadas com todos no fórum)
raquelreis
Usuário Nível 2
Usuário Nível 2
Mensagens: 87
Registrado em: 18 Jul 2011 15:29
Localização: à procura

Erro no Relatório

Mensagem 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.
Keel
[]'s

_____________________________________________________________________________________
PROGRAMADOR é aquele que te resolve um problema que você não sabia que tinha, de uma maneira que você não compreende.
Avatar do usuário
Toledo
Administrador
Administrador
Mensagens: 3133
Registrado em: 22 Jul 2003 18:39
Localização: Araçatuba - SP
Contato:

Erro no Relatório

Mensagem 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!
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
Jairo Maia
Moderador
Moderador
Mensagens: 2785
Registrado em: 16 Ago 2010 13:46
Localização: Campinas-SP

Erro no Relatório

Mensagem 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.
Abraços, Jairo
Harbour / Clipper 5.2e - Blinker 7
(Não respondo dúvidas por MP ou E-mail. Por favor, não encaminhe via mensagem privada ou e-mail, dúvidas que podem ser compartilhadas com todos no fórum)
Avatar do usuário
Jairo Maia
Moderador
Moderador
Mensagens: 2785
Registrado em: 16 Ago 2010 13:46
Localização: Campinas-SP

Erro no Relatório

Mensagem 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.
Abraços, Jairo
Harbour / Clipper 5.2e - Blinker 7
(Não respondo dúvidas por MP ou E-mail. Por favor, não encaminhe via mensagem privada ou e-mail, dúvidas que podem ser compartilhadas com todos no fórum)
Avatar do usuário
Toledo
Administrador
Administrador
Mensagens: 3133
Registrado em: 22 Jul 2003 18:39
Localização: Araçatuba - SP
Contato:

Erro no Relatório

Mensagem 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,
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
raquelreis
Usuário Nível 2
Usuário Nível 2
Mensagens: 87
Registrado em: 18 Jul 2011 15:29
Localização: à procura

Erro no Relatório

Mensagem por raquelreis »

Obrigado à todos pelas dicas.

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


At.
Keel
[]'s

_____________________________________________________________________________________
PROGRAMADOR é aquele que te resolve um problema que você não sabia que tinha, de uma maneira que você não compreende.
raquelreis
Usuário Nível 2
Usuário Nível 2
Mensagens: 87
Registrado em: 18 Jul 2011 15:29
Localização: à procura

Erro no Relatório

Mensagem 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.
Keel
[]'s

_____________________________________________________________________________________
PROGRAMADOR é aquele que te resolve um problema que você não sabia que tinha, de uma maneira que você não compreende.
alxsts
Colaborador
Colaborador
Mensagens: 3092
Registrado em: 12 Ago 2008 15:50
Localização: São Paulo-SP-Brasil

Erro no Relatório

Mensagem 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.
[]´s
Alexandre Santos (AlxSts)
Responder