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: 3107
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: 20415
Registrado em: 26 Fev 2007 11:59
Localização: São Paulo-SP
Curtiram: 1 vez

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, multithread, gtwvg, fivewin 25.12, dbfcdx, MySQL, ADOClass, PDFClass, SefazClass, (hwgui), (hmg3), (hmg extended), (oohg), PNotepad, ASP, (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: 3107
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 2
Usuário Nível 2
Mensagens: 57
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) 9 9841 0886
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