Localizar um registro avaliando uma data
Moderador: Moderadores
- Ricardo Sales Ribeiro
- Usuário Nível 3

- Mensagens: 279
- Registrado em: 13 Jul 2004 18:06
- Localização: Fortaleza-Ceara
Localizar um registro avaliando uma data
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
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
- Jairo Maia
- Moderador
- Mensagens: 2785
- Registrado em: 16 Ago 2010 13:46
- Localização: Campinas-SP
Localizar um registro avaliando uma data
Olá Ricardo,
Já tentou criar um índice com os campos usuários e data, sendo a data em modo descendente? Veja se funciona:
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)
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)
- Ricardo Sales Ribeiro
- Usuário Nível 3

- Mensagens: 279
- Registrado em: 13 Jul 2004 18:06
- Localização: Fortaleza-Ceara
Localizar um registro avaliando uma data
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.
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.
Localizar um registro avaliando uma data
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 ??
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 ??
- Jairo Maia
- Moderador
- Mensagens: 2785
- Registrado em: 16 Ago 2010 13:46
- Localização: Campinas-SP
Localizar um registro avaliando uma data
Olá Pessoal,
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():
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.Eros escreveu:Ja imaginou pesquisar cupons fiscais por data numa tabela, de uma loja onde emite-se milhares todo dia ??
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)
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)
- Ricardo Sales Ribeiro
- Usuário Nível 3

- Mensagens: 279
- Registrado em: 13 Jul 2004 18:06
- Localização: Fortaleza-Ceara
Localizar um registro avaliando uma data
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
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
- JoséQuintas
- Administrador

- Mensagens: 20267
- Registrado em: 26 Fev 2007 11:59
- Localização: São Paulo-SP
Localizar um registro avaliando uma data
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:
Se for nome, de repente troque a última letra:
Ou usando SCOPE e o mesmo índice:
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
Código: Selecionar todos
SET SOFTSEEK ON
SEEK Pad( cUsuario, 9 ) + Chr(255)
SET SOFTSEEK OFF
SKIP -1
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/
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/
- Ricardo Sales Ribeiro
- Usuário Nível 3

- Mensagens: 279
- Registrado em: 13 Jul 2004 18:06
- Localização: Fortaleza-Ceara
Localizar um registro avaliando uma data
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.
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.
- JoséQuintas
- Administrador

- Mensagens: 20267
- Registrado em: 26 Fev 2007 11:59
- Localização: São Paulo-SP
Localizar um registro avaliando uma data
Me confundiu.
Já não faz isso normalmente no sistema?
Ou ainda está começando a criar o controle de OS?
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/
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/
- Ricardo Sales Ribeiro
- Usuário Nível 3

- Mensagens: 279
- Registrado em: 13 Jul 2004 18:06
- Localização: Fortaleza-Ceara
Localizar um registro avaliando uma data
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
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
- JoséQuintas
- Administrador

- Mensagens: 20267
- Registrado em: 26 Fev 2007 11:59
- Localização: São Paulo-SP
Localizar um registro avaliando uma data
Então um jeito mais prático, que já mencionei na parte de última OS:
SET SCOPE
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.
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
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/
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/
- JoséQuintas
- Administrador

- Mensagens: 20267
- Registrado em: 26 Fev 2007 11:59
- Localização: São Paulo-SP
Localizar um registro avaliando uma data
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/
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/
Localizar um registro avaliando uma data
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.
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