Fazer duas pesquisas com seek numa "passada" só

Fórum sobre a linguagem CA-Clipper.

Moderador: Moderadores

Paulao
Usuário Nível 3
Usuário Nível 3
Mensagens: 186
Registrado em: 09 Jul 2004 11:03
Localização: Franca
Contato:

Fazer duas pesquisas com seek numa "passada" só

Mensagem por Paulao »

Estou criando uma rotina de cadastro de cheques recebidos que utilizara o código de barras do cheque, preciso que qdo o usuário passar o cheque na leitora o sistema faça uma busca no dbf procurando se aquele cheque ainda não esta cadastrado caso não esteja procurar se ja existe algum cheque cadastrado daquele emitente onde o sistema ja buscaria o nome, banco do emitente do cheque para jogar no registro novo.
Utilizo clipper 5.2 E e indices IDX.

Grande abraço
Avatar do usuário
rochinha
Administrador
Administrador
Mensagens: 4664
Registrado em: 18 Ago 2003 20:43
Localização: São Paulo - Brasil
Contato:

Mensagem por rochinha »

Amiguinho

No codigo de barras do cheque existe um numero que pode identificar melhor o seu cliente, podendo ser o numero da conta-corrente ou outro trecho que pode identifica-lo.

Para tal no cadastro do primeiro cheque deste cliente, voce já deveria ter armazenado em um campo do cadastro de clientes o numero de conta-corrente e criado um indice para a pesquisa, ja que dois clientes diferentes jamais terao o mesmo numero de conta.

Ai ficaria facil, seek no contas pelo numero do cheque, seek no cliente pelo numero de contas:

// mCMC = ao codigo capturado do cheque
if contas->dbseek( m->nCheque )
// encontrou cheque
else
nCC := substr( nCMC, 10, 5 ) // Dados ficticios para a funcao
if clientes->dbseek( m->nCC )
// encontrou o cliente pela conta
nIDCliente := clientes->idcliente
sele contas
set filter to contas->IDCliente = nIDCliente
//
endif
endif

@braços :?)
Paulao
Usuário Nível 3
Usuário Nível 3
Mensagens: 186
Registrado em: 09 Jul 2004 11:03
Localização: Franca
Contato:

Grande Rochinha

Mensagem por Paulao »

a idéia é esta fazer uma associação pelo numero do banco+conta+numero
do cheque. Resumindo

1-le o codigo de barras
2-entra no cheques.dbf
3-procura pra ver se o cheque ainda não esta cadastrado
>>> se tiver cadastrado informa pro usuario
>>> se ainda não estiver cadastrado continua procurando pra ver se acha outro cheque com a mesma conta.
>>> se achar outro cheque com a mesmo banco+conta pega os dados do emitente e joga no registro novo
>>> se não achar outro cheque com a mesma conta, pega apenas o codigo do banco+numero do cheque para jogar ao regsitro novo

A princípio poderia fazer um seek para procurar se o cheque ja foi cadastrado e depois fazer outro seek para procurar se tem outro cheque cadastrado comm a mesma conta+banco mas assim a rotina varre o dbf duas vezes, lembra-se do comando continue do locate, seria algo mais ou menos assim.


espero ter me expressado a contento


Grande abraço
Avatar do usuário
filizola
Usuário Nível 3
Usuário Nível 3
Mensagens: 421
Registrado em: 19 Ago 2003 20:10
Localização: Belo Horizonte/MG

Mensagem por filizola »

o seek é infinitamente mais rápido que o locate, pode utilizar quantos seek´s quiser sem problema.
Avatar do usuário
Eolo
Colaborador
Colaborador
Mensagens: 1134
Registrado em: 08 Dez 2005 18:24
Localização: São Paulo - SP

Mensagem por Eolo »

Dá pra usar um SEEK só, junto com o SOFTSEEK. Aí é só analisar os resultados...

Como exemplo, cria um arquivo CHEQUE, com dois campos:
CPF - N,3,0 (o CPF é único, então é a melhor chave)
CHEQUE - N,3,0

(deixei cpf e cheque com 3 dígitos, só pra facilitar)

use cheque
index on strzero(cpf,3,0)+strzero(cheque,3,0) to cheque1
v_cpf=0
v_cheque=0
clear

SET SOFTSEEK ON
* liga o softseek

do whil .t.
@10,10 get v_cpf pict "999"
@11,10 get v_cheque pict "999"
read
if lastkey()=27
exit
endi
seek strzero(v_cpf,3,0)+strzero(vcheque,3,0)
@13,10 say found()
* se a chave COMPLETA for encontrada, found()=.t.; se não, found()=.f.
@14,10 say eof()
* se for achado uma chave maior, eof()=.f.; se não, eof()=.t.
if found()
* seek achou a chave completa => found()=.t., eof()=.f.
@16,10 say pad("CLIENTE ok, CHEQUE ok ",40)
elseif (!found())
* seek não achou a chave completa => found()=.f.
* seek posiciona ponteiro no próximo registro (maior)
* se houver um registro maior => eof()=.f.
* se não houver um registro maior => eof()=.t.
if recno()#1
* verifica se o ponteiro parou no recno()=1
* se não parou, volta 1 registro
skip -1
endi
if cliente=vcliente .and. (!cheque=vcheque)
* se cliente=vcliente => cliente já é cadastrado e tem outro cheque (menor)
@16,10 say pad("CLIENTE ok, CHEQUE não",40)
else
* como cliente#vcliente, cliente ainda não está cadastrado
@16,10 say pad("CLIENTE não, CHEQUE não",40)
endi
endi
endd

Eolo
Avatar do usuário
Eolo
Colaborador
Colaborador
Mensagens: 1134
Registrado em: 08 Dez 2005 18:24
Localização: São Paulo - SP

Mensagem por Eolo »

Ops, comi bola no finzinho:
(onde se lê CLIENTE, leia-se CPF)

...
if cpf=v_cpf .and. (!cheque=v_cheque)
* se cpf=v_cpf => cliente já é cadastrado e tem outro cheque (menor)
@16,10 say pad("CLIENTE ok, CHEQUE não",40)
else
* como cpf#v_cpf, cliente ainda não está cadastrado
@16,10 say pad("CLIENTE não, CHEQUE não",40)
...

Eolo
Responder