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
Fazer duas pesquisas com seek numa "passada" só
Moderador: Moderadores
- rochinha
- Administrador

- Mensagens: 4664
- Registrado em: 18 Ago 2003 20:43
- Localização: São Paulo - Brasil
- Contato:
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 :?)
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 :?)
Grande Rochinha
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
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
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
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
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
(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

