busca no clipper / harbour por mes e ano

Fórum sobre a linguagem CA-Clipper.

Moderador: Moderadores

tchadrack
Usuário Nível 1
Usuário Nível 1
Mensagens: 27
Registrado em: 15 Mar 2016 15:42
Localização: São Paulo

busca no clipper / harbour por mes e ano

Mensagem por tchadrack »

Desculpem a pergunta básica mas estou acostumado a usar SQL e estou precisando fazer a seguinte busca cujo exemplo em SQL seria:

Código: Selecionar todos

select * from Tabela where year(data) = 2020 and month(data) = 12
usando a RDD padrão do clipper / harbour, (dbf), qual a maneira correta e mais eficiente de conseguir isso? Existe alguma forma ou sou obrigado
a percorrer a tabela testando cada registro?

Grato,
alxsts
Colaborador
Colaborador
Mensagens: 3092
Registrado em: 12 Ago 2008 15:50
Localização: São Paulo-SP-Brasil

busca no clipper / harbour por mes e ano

Mensagem por alxsts »

Olá!
tchadrack escreveu:Existe alguma forma ou sou obrigado
a percorrer a tabela testando cada registro?
Depende...
Se a tua tabela não tem índice pelo campo "data", será necessário percorrer a tabela toda.

Usando o RDD padrão xBase (DBFNTX)

Código: Selecionar todos

INDEX ON DtoS (data) TO idxData 
Uma vez criado o índice, é só usar:

Código: Selecionar todos

USE tabela SHARED NEW INDEX idxData
DbSeek ( "202012", .T. ) // Soft seek
DO WHILE .NOT. Eof() .AND. Left (DtoS(data), 6) == "202012"
   // comandos...
   tabela->( DbSkip () )
ENDDO

tabela->(DbCloseArea ())

RETURN
[]´s
Alexandre Santos (AlxSts)
Avatar do usuário
JoséQuintas
Administrador
Administrador
Mensagens: 20267
Registrado em: 26 Fev 2007 11:59
Localização: São Paulo-SP

busca no clipper / harbour por mes e ano

Mensagem por JoséQuintas »

No uso, talvez mais fácil assim, também após existir o índice por Dtos( Data ):

Código: Selecionar todos

SET SCOPE TO "202012"
GOTO TOP
DO WHILE ! Eof()
   SKIP
ENDDO
De certa forma, é parecido com SQL, mas não tem nada automático, e é acessando diretamente a base, selecionando índice, etc.
José M. C. Quintas
Harbour 3.2, mingw, gtwvg mt, fivewin 25.04, multithread, dbfcdx, MySQL, ADOClass, PDFClass, SefazClass, (hwgui mt), (hmg3), (hmg extended), (oohg), PNotepad, ASP, stored procedure, stored function, Linux (Flagship/harbour 3.2)
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"

https://github.com/JoseQuintas/
alxsts
Colaborador
Colaborador
Mensagens: 3092
Registrado em: 12 Ago 2008 15:50
Localização: São Paulo-SP-Brasil

busca no clipper / harbour por mes e ano

Mensagem por alxsts »

Olá!

Minha resposta se condicionou ao RDD citado pelo OP.

Se alterar o RDD para DBFCDX ganha-se recursos mais poderosos como definição de scope top, scope bottom, uso das funções OrdScope () e OrdWildSeek ()...
[]´s
Alexandre Santos (AlxSts)
LDOSISTEMAS
Usuário Nível 1
Usuário Nível 1
Mensagens: 48
Registrado em: 01 Set 2014 17:04
Localização: CLAUDIO/MG
Contato:

busca no clipper / harbour por mes e ano

Mensagem por LDOSISTEMAS »

Bom dia,
Observando o exemplo dele acho que poderia usar

Código: Selecionar todos

 set filter to Year(data)=2020 and month(data)=12 
Observando o titulo do post ai eu acho que poderia usar a sugestão dos colegas
LAURO DE OLIVEIRA
Analista/Diretor
(37) 3381 32 11
www.ldosistemas.com.br
Imagem
Avatar do usuário
vailton
Colaborador
Colaborador
Mensagens: 390
Registrado em: 17 Nov 2005 19:08
Localização: Brasil
Contato:

busca no clipper / harbour por mes e ano

Mensagem por vailton »

Se o RDD em uso for realmente o NTX o uso do SET FILTER penaliza o desempenho e neste caso o uso de um SEEK com laço DO WHILE como citado pelo alxsts pode trazer mais rapidez na operação.
Responder