Localizar um registro avaliando uma data

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

Localizar um registro avaliando uma data

Mensagem por Ricardo Sales Ribeiro »

Bom Dia Amigos

Venho mais uma vez solicitar ajuda, tenho um sisteminha que é alimentado com ordens de serviços e datas, e tambem
código do usuário, pois bem:

Quando digito o código do usuario, e localizo se já tem Ordens de Serviços para ele, preciso saber qual a mais rescente
como data de emissão, eu não tenho um arquivo por usuario, tenho um arquivo só, CadOds.Dbf, com indices por NroOrd,
NroUsu, e datemi.

Fiz um teste, e o indice posiciona sempre no primeiro, é claro, e neste usuario já tinha quatro ordens de serviço, e para
minha rotina tinha que pegar a ultima Ordem de Serviço, e estou pegando a primeira.

Por favor como podeira fazer esse procedimento?

Atenciosamente
Ricardo Sales
Fortaleza-Ce
lodara53@yahoo.com.br
lodara53@hotmail.com
Avatar do usuário
Jairo Maia
Moderador
Moderador
Mensagens: 2785
Registrado em: 16 Ago 2010 13:46
Localização: Campinas-SP

Localizar um registro avaliando uma data

Mensagem por Jairo Maia »

Olá Ricardo,

Já tentou criar um índice com os campos usuários e data, sendo a data em modo descendente? Veja se funciona:

Código: Selecionar todos

INDEX ON Str(NroUsu)+Descend(DToS(datemi))
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
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

Localizar um registro avaliando uma data

Mensagem por Ricardo Sales Ribeiro »

Ola
Boa Tarde

Entendi amigo, agora como faço para localizar um usuario especifico, usando o locate? Já que não precisa estar indexado pelo usuario, estar correto?

Vou mudar minha rotina e vê o resultado, obrigado.
Ricardo Sales
Fortaleza-Ce
lodara53@yahoo.com.br
lodara53@hotmail.com
Eros
Usuário Nível 3
Usuário Nível 3
Mensagens: 291
Registrado em: 19 Dez 2008 19:23
Localização: Goiania

Localizar um registro avaliando uma data

Mensagem por Eros »

Para indexar por data, crio o indice chave com Dtos(campo).

Mas fazer pesquisa de registro por data é complicado, pois poderia haver mais de uma OS no mesmo dia. Mais eficiente busca-la por cliente+status ou cliente+numero ou cliente+data+status, de forma que agilize a pesquisa. Mas cada um escolhe como acha mais facil e eficiente.

Ja imaginou pesquisar cupons fiscais por data numa tabela, de uma loja onde emite-se milhares todo dia ??
Avatar do usuário
Jairo Maia
Moderador
Moderador
Mensagens: 2785
Registrado em: 16 Ago 2010 13:46
Localização: Campinas-SP

Localizar um registro avaliando uma data

Mensagem por Jairo Maia »

Olá Pessoal,
Eros escreveu:Ja imaginou pesquisar cupons fiscais por data numa tabela, de uma loja onde emite-se milhares todo dia ??
Olá Erones, Bom revê-lo no fórum. Mas não é esse o caso do Ricardo não, ele apenas quer fazer uma pesquisa pelo codigo do Usuário e que esta pesquisa pare na ordem mais recente.

Ricardo, Não use LOCATE. Como você trabalha com índices, use SEEK ou DbSeek(). O LOCATE ignora indices e a busca é muito lenta. Veja esse exemplo com DbSeek():

Código: Selecionar todos

 Local aEstr := {;
               {"nrousu" ,"N",   5, 0},;
               {"datemi" ,"D",   8, 0};
               }
 DBCreate( "Teste.Dbf", aEstr )

 SET CENTURY ON
 SET DATE BRITISH
 
 Use "Teste.Dbf" Shared New
 
 Append Blank
 Replace NroUsu With 1
 Replace DatEmi With Date()
 
 Append Blank
 Replace NroUsu With 1
 Replace DatEmi With Date() - 1
 
 Append Blank
 Replace NroUsu With 1
 Replace DatEmi With Date() - 2
 
 INDEX ON Str(NroUsu)+Descend(DToS(DatEmi)) To "Teste1"
 
 cCoUsu := Str( 1, 5 )  // codigo com a mesma qtd do campo NroUsu
 DbSeek ( cCoUsu )
 
 Clear Screen
 ?
 ? "  Codigo do Usuario......: ", NroUsu
 ?
 ? "  Data Ordem Mais Recente: ", DatEmi
 ?
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
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

Localizar um registro avaliando uma data

Mensagem por Ricardo Sales Ribeiro »

Bom Dia!
Amigos


A minha situação é a seguinte: Tenho um arquivo CadOds.Dbf, onde tem os seguintes campos:

NroOds,C,08
DatEmi,D,08
CodUsu,C,10
CodEqu,C,03
NomEqu,C,12

Indices, por NroOds

Eu posso ter varias Os com o mesmo codigo do usuario e com diferentes datas ok.

Minha rotina, digito Numero Os, se ja existir, retorna e pede outra os.
Se não existir o numero da Os, o sistema pede código usuario, a rotina precisa me informar:
Se localizar já um registro com esse usuario, que é perfeitamente possivel, me mostrar a data de emissão, se localizar
e tiver mais de um lançamento com o mesmo usuario, me mostrar a data mais rescente.

Esse é o meu dilema, como devo criar os indices e executar essa rotina.

Atenciosamente
Ricardo Sales
Fortaleza-Ce
lodara53@yahoo.com.br
lodara53@hotmail.com
Avatar do usuário
JoséQuintas
Administrador
Administrador
Mensagens: 20267
Registrado em: 26 Fev 2007 11:59
Localização: São Paulo-SP

Localizar um registro avaliando uma data

Mensagem por JoséQuintas »

Use o índice que já tem.
o SEEK, com SOFTSEEK ON, posiciona no registro encontrado, ou na falta dele, no próximo registro.
Então, usando esse recurso, é só pesquisar o primeiro do próximo usuário, que seria depois do último desse usuário.

Tem um índice por código de usuario + data, não sei se guarda código ou nome.

Se for código, o último do usuário 3:

Código: Selecionar todos

SET SOFTSEEK ON
SEEK Str( 3 + 1, 10 )
SET SOFTSEEK OFF
SKIP -1
Se for nome, de repente troque a última letra:

Código: Selecionar todos

SET SOFTSEEK ON
SEEK Pad( cUsuario, 9 ) + Chr(255)
SET SOFTSEEK OFF
SKIP -1
Ou usando SCOPE e o mesmo índice:

Código: Selecionar todos

SET SCOPE TO cod_usuario
GOTO BOTTOM
SET SCOPE TO
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/
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

Localizar um registro avaliando uma data

Mensagem por Ricardo Sales Ribeiro »

Bom Dia
Amigos clipeiros

Quero agradecer a ajuda de todos neste problema, consegui resolver, logico com a ajuda de vocês, agora estou
dando continuidade a rotina ou seja:

Consegui localizar a última Os de um determinado usuário, se o usuário tem mais de uma Os, a rotina posiciona na última, pois bem, agora com ela posicionada, precisomostrar na tela os itens dessa Os, para que o operador tome uma decisão se cadastra ou aborta.

Tenho dois Arquivos:

CadOds:
NroOds: C,08
DatEmi: D,08
CodEqu: C,03
NomEqu:C,45
Status:C,01
Flag_E:C,01

IteOds
CodIte:C,08
DatEmi:D,08
CodSer:C,02
DatBxa:D,08

A minha ligação do CadOds com o IteOds, é pelo Numero da Os, ou seja, NroOds e CodIte, eu tenho no cadastro de Os
CadOds uma Os, mas no cadastro de Itens da Os, posso ter mais de um serviço.
Então como fazer? Na hora que a rotina encontrar a Os na ultima data, o sistema localiza pela os no IteOds, e mostra
os serviços constantes nela.

Gostaria da ajuda de vcs, para criar essa rotina.

Atenciosamente.
Ricardo Sales
Fortaleza-Ce
lodara53@yahoo.com.br
lodara53@hotmail.com
Avatar do usuário
JoséQuintas
Administrador
Administrador
Mensagens: 20267
Registrado em: 26 Fev 2007 11:59
Localização: São Paulo-SP

Localizar um registro avaliando uma data

Mensagem por JoséQuintas »

Me confundiu.
Já não faz isso normalmente no sistema?
Ou ainda está começando a criar o controle de OS?
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/
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

Localizar um registro avaliando uma data

Mensagem por Ricardo Sales Ribeiro »

Olá

Faz, mas de um jeito que demora para mostrar, queria saber se poderia ser feito de outra maneira.

Eu dou um comando para copiar para um arquivo temporario os itens daquela os, e mostro este arquivo num DbEdit
só que meu arquivo de itens é muito gde, demora para localizar e copiar para esse arquivo temporario.

Só sei fazer dessa maneira, no sistema tem uma consulta por os, qdo localizo teclo enter e ele faz essa rotina, localiza no arquivos de itens e copia para um temporario, mostra e depois apaga.

Atenciosamente
Ricardo Sales
Fortaleza-Ce
lodara53@yahoo.com.br
lodara53@hotmail.com
Avatar do usuário
JoséQuintas
Administrador
Administrador
Mensagens: 20267
Registrado em: 26 Fev 2007 11:59
Localização: São Paulo-SP

Localizar um registro avaliando uma data

Mensagem por JoséQuintas »

Então um jeito mais prático, que já mencionei na parte de última OS:
SET SCOPE

Código: Selecionar todos

SELECT ItensDaOS
SET SCOPE TO variavel_numero_OS
GOTO TOP
// faz o que tem que fazer. vai estar filtrado pra somente a OS atual
SET SCOPE TO
Lembrando que para o SCOPE funcionar, os ítens da OS precisam ter como chave o número de OS.
Ajuste de acordo com o campo numérico ou caractere.
Não precisa ser chave única, pode ser composta.

Código: Selecionar todos

// se o índice for deste tipo
INDEX ON Str( num_os, 10 ) + Str( num_item, 10 ) TO indice

// o scope vai ser neste estilo
SET SCOPE TO STR( variavel_num_os, 10 )
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/
Avatar do usuário
JoséQuintas
Administrador
Administrador
Mensagens: 20267
Registrado em: 26 Fev 2007 11:59
Localização: São Paulo-SP

Localizar um registro avaliando uma data

Mensagem por JoséQuintas »

Ou se achar mais simples continuar com o temporário atual:

Código: Selecionar todos

select ItensOS
SEEK variavel_Num_Os
COPY TO TEMP WHILE Num_OS == variavel_Num_Os
...
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/
Eros
Usuário Nível 3
Usuário Nível 3
Mensagens: 291
Registrado em: 19 Dez 2008 19:23
Localização: Goiania

Localizar um registro avaliando uma data

Mensagem por Eros »

Ricardo, porque vc nao usa uma matriz nessa busca sua...

Estou te mandando um fonte meu, onde eu tenho uma necessidade muito parecida com essa sua.

Informo o cliente, depois leio 6 arquivos buscando nota fiscal/pedido/cupom fiscal desse cliente, com numero, data, produtos, tudo num periodo qualquer que pode ser aberto ou nao.

Filtrando esses dados, jogados numa matriz, posso visualiza-los em tela ou enviar para impressora, podendo ser ainda um relatorio resumido ou um relatorio detalhado.

E nao preciso criar nenhum arquivo de indice para isso.

E so me estouraria, se o cliente tivesse registrado mais de 4096 operações no periodo informado. Coisa que é muito pouco provavel, nesse segmento.

O arquivo .prg anexo, pode servir de exemplo para criar sua matriz, adicionar os lados, organizar e resolver seu problema.
Anexos
c1270.prg
(22.3 KiB) Baixado 228 vezes
Responder