Página 1 de 1
Como evitar itens duplicados no Browse
Enviado: 11 Jan 2020 09:23
por mrcrusso
Bom dia.
Gostaria de saber como fazer para evitar que itens sejam duplicados no Browse. Quando vc digita um código em uma linha e na linha de baixa digita o mesmo código. Preciso evitar que o usuário possa digitar dois códigos repetidos.
Segue o programa.
Código: Selecionar todos
@ 250,30 BROWSE BROWSE_1 ;
width 800 ;
height 170 ;
HEADERS { ' S ','Item' , 'Exame', 'Descricao do Exame', 'Codigo AMB' , 'Data Coleta' , 'Preco em R$','Prazo','Medicam.'} ;
widthS { 25 , 40 , 60 , 250, 110 , 90 , 90, 50, 70 } ;
WORKAREA CAD ;
fields { 'FLG' , 'item' , 'Codex' , 'Nomex' , 'Codamb' , 'Datcol' ,'Preco','Prazo','Remedio' } ;
READONLY {.T. , .T. , .F. , .T. , .T. , .T. , .T., .T., .T. } ;
VALID { , , { || busc_exa() } , , , , , , } ;
VALIDMESSAGES { ,,' EXAME NAO CADASTRADO ',,,,,,} ;
FONT "MS Sans Serif" SIZE 8 ;
EDIT INPLACE ;
IMAGE {"br0.BMP","br1.BMP","br2.bmp","br3.bmp","br4.bmp","br5.bmp"} ;
LOCK ;
ON GOTFOCUS {|| Pesqexa() } ;
ON HEADCLICK { ,,{ || Premedio()}, { || Pesq_descr()} , { || Pesq_AMB()} ,,}
E a função de pesquisa.
Código: Selecionar todos
function busc_exa
if EXAM->(DBseek(MemVar.Cad.Codex))
Return .t.
else
Return .f.
endif
return
Obrigado.
Como evitar itens duplicados no Browse
Enviado: 11 Jan 2020 10:24
por JoséQuintas
Porque tanto fonte?
Código: Selecionar todos
function busc_exa
if EXAM->(DBseek(MemVar.Cad.Codex))
Return .t.
else
Return .f.
endif
return
poderia ser assim:
Código: Selecionar todos
FUNCTION busc_exa()
RETURN EXAM->( DBseek( MemVar.Cad.Codex ) )
Quanto ao problema, alguém que use minigui deve responder em breve.
Como evitar itens duplicados no Browse
Enviado: 11 Jan 2020 10:46
por mrcrusso
Bom dia José Quintas,
Obrigado pela ajuda.
Fiz um pouco diferente e acebei retirando a função busc_exa.
Esse sistema não foi desenvolvido por mim, apenas dou manutenção no mesmo, e existem algumas alterações um pouco mais complicadas, como essa da restrição de cadastro duplicados. Vou aguardar que alguém tenha uma solução para isso.
Código: Selecionar todos
@ 250,30 BROWSE BROWSE_1 ;
width 800 ;
height 170 ;
HEADERS { ' S ','Item' , 'Exame', 'Descricao do Exame', 'Codigo AMB' , 'Data Coleta' , 'Preco em R$','Prazo','Medicam.'} ;
widthS { 25 , 40 , 60 , 250, 110 , 90 , 90, 50, 70 } ;
WORKAREA CAD ;
fields { 'FLG' , 'item' , 'Codex' , 'Nomex' , 'Codamb' , 'Datcol' ,'Preco','Prazo','Remedio' } ;
READONLY {.T. , .T. , .F. , .T. , .T. , .T. , .T., .T., .T. } ;
VALID { , , { || EXAM->(DBseek(MemVar.Cad.Codex)) } , , , , , , } ;
VALIDMESSAGES { ,,' EXAME NAO CADASTRADO ',,,,,,} ;
FONT "MS Sans Serif" SIZE 8 ;
EDIT INPLACE ;
IMAGE {"br0.BMP","br1.BMP","br2.bmp","br3.bmp","br4.bmp","br5.bmp"} ;
LOCK ;
ON GOTFOCUS {|| Pesqexa() } ;
ON HEADCLICK { ,,{ || Premedio()}, { || Pesq_descr()} , { || Pesq_AMB()} ,,}
Como evitar itens duplicados no Browse
Enviado: 11 Jan 2020 10:55
por MSDN
Nesse caso o problema não é o BROWSE, é a falta de pesquisa na tabela.
O BROWSE só mostra o que está no DBF, então quando vc está manipulando as informações, basta fazer um SEEK e ver se já existe o código, se tiver informa o usuário, se não tiver aceita e dá um REFRESH no BROWSE.
Como evitar itens duplicados no Browse
Enviado: 11 Jan 2020 11:10
por mrcrusso
Bom dia Marcelo,
Já utilizei o SEEK, porém não funcionou, o browse simplesmente congela. A entrada de dados é feita diretamente pelo browse e no DBF como se fosse uma planilha do Excel ou quando vc edita diretamente um DBF através de um gerenciador.
Não estou conseguindo validar a entrada do usuário pelo browse com os dados já cadastrados no DBF (que é um arquivo temporário)
Como evitar itens duplicados no Browse
Enviado: 11 Jan 2020 11:16
por JoséQuintas
Talvez porque o SEEK acaba fazendo uma movimentação no DBF, e o registro do browse que seria temporário talvez se perca.
Se for isso, a saída seria criar uma rotina fora de browse.
Teste também, depois do SEEK retornar o registro anterior, pra ver se não está relacionado a atualização do browse por sair do lugar.
Código: Selecionar todos
Valida Existe( cChave )
nRecNo := RecNo()
lEncontrou := dbSeek ....
GOTO (nRecNo)
RETURN lEncontrou
Como evitar itens duplicados no Browse
Enviado: 11 Jan 2020 11:36
por mrcrusso
Olá,
Já fiz isso também e não funcionou.
Código: Selecionar todos
Valida Existe( cChave )
nRecNo := RecNo()
lEncontrou := dbSeek ....
GOTO (nRecNo)
RETURN lEncontrou
Analisando as possibilidades, acho que não é possível fazer essa verificação, pois eu estou usando o browse pra editar o próprio arquivo DBF, e não sei como pegar a variável para fazer a busca, pois a partir do momento em que digito a mesma, ela já é inserida no DBF. Mesmo usando uma função fora do browse ele não faz a busca.
O arquivo temporário CAD não é indexado, então usei o comando LOCATE.
Como evitar itens duplicados no Browse
Enviado: 11 Jan 2020 12:02
por mrcrusso
Olá,
Apenas informando que já tentei colocar essa função de validação de registro duplicado nesses dois locais.
Código: Selecionar todos
@ 250,30 BROWSE BROWSE_1 ;
width 800 ;
height 170 ;
HEADERS { ' S ','Item' , 'Exame', 'Descricao do Exame', 'Codigo AMB' , 'Data Coleta' , 'Preco em R$','Prazo','Medicam.'} ;
widthS { 25 , 40 , 60 , 250, 110 , 90 , 90, 50, 70 } ;
WORKAREA CAD ;
fields { 'FLG' , 'item' , 'Codex' , 'Nomex' , 'Codamb' , 'Datcol' ,'Preco','Prazo','Remedio' } ;
READONLY {.T. , .T. , .F. , .T. , .T. , .T. , .T., .T., .T. } ;
VALID { , , { || busc_exa() } , , , , , , } ;
VALIDMESSAGES { ,,' EXAME NAO CADASTRADO ',,,,,,} ;
FONT "MS Sans Serif" SIZE 8 ;
EDIT INPLACE ;
IMAGE {"br0.BMP","br1.BMP","br2.bmp","br3.bmp","br4.bmp","br5.bmp"} ;
LOCK ;
ON GOTFOCUS {|| Pesqexa() } ;
ON HEADCLICK { ,,{ || Premedio()}, { || Pesq_descr()} , { || Pesq_AMB()} ,,}
Nessa função:
Código: Selecionar todos
function busc_exa
if EXAM->(DBseek(MemVar.Cad.Codex))
Return .t.
else
Return .f.
endif
return
E nessa também:
Código: Selecionar todos
function Pesqexa
If ! Winif
Winif:=.T.
Return nil
End
IF CAD->CODEX=SPACE(5)
Return nil
endif
Wcodexa:=Cad->Codex
CAD->ITEM:=STRZERO(CAD->(RECNO()),2,0)
CAD->CODEX:=EXAM->CODEX
CAD->NOMEX:=EXAM->NOMEX
cad->remedio:=exam->remedio
MCODUS:=Ltrim(CONV->CODUS)
CODX:="COD"+Ltrim(MCODUS)
TABX:="TAB"+Ltrim(MCODUS)
CAD->Codamb:=EXAM->&CODX
CAD->Prazo:=Exam->PRAZO
CAD->DATCOL:=VDATREC
CAD->PRECO:=EXAM->&TABX*CONV->REFUS
If Exam->Prazo>Mprazo
Mprazo:=Exam->prazo
endif
Win_2.Browse_1.Refresh
sele cad
Return nil
Como evitar itens duplicados no Browse
Enviado: 11 Jan 2020 12:07
por JoséQuintas
mrcrusso escreveu:Analisando as possibilidades, acho que não é possível fazer essa verificação, pois eu estou usando o browse pra editar o próprio arquivo DBF, e não sei como pegar a variável para fazer a busca, pois a partir do momento em que digito a mesma, ela já é inserida no DBF. Mesmo usando uma função fora do browse ele não faz a busca.O arquivo temporário CAD não é indexado, então usei o comando LOCATE.
Desse jeito, eu apelaria pra multithread, mas precisa ver como esperar o resultado...
Porque?
Multithread é igual EXE separado, então faria a validação sem mexer com o tbrowse atual.
Mas de qualquer jeito é complicado, porque como você disse: digitou já inclui.
Se digitou já inclui... se não aceitar repetido... como anular esse novo registro?
Acho que o melhor negócio seria o mais tradicional: teclou ENTER/INSERT, abre uma janela pra digitação.
Como evitar itens duplicados no Browse
Enviado: 11 Jan 2020 15:56
por susviela@bol.com.br
mrcrusso escreveu:Acho que o melhor negócio seria o mais tradicional: teclou ENTER/INSERT, abre uma janela pra digitação.
Verdade, algumas facilidades para o usuário, custam caro para o programador.
Como evitar itens duplicados no Browse
Enviado: 12 Jan 2020 11:18
por Nascimento
eu acho que o certo seria com o dbseek()
depois vc atualizaria o browse desta forma
SetProperty("Form_1","Browse_1","value",Tabela->Recno())
DoMethod("Form_1","Browse_1","Reflesh")
desta forma o browser iria para o numero correto do registro
Como evitar itens duplicados no Browse
Enviado: 15 Jan 2020 18:47
por mrcrusso
Obrigado pessoal pelas sugestões.
Vou tentar implementar algumas delas e depois informo o resultado.
Como evitar itens duplicados no Browse
Enviado: 17 Jan 2020 12:23
por Marcos Kieron
Não uso DBF a muitos anos, mas se fosse fazer usaria DBSEEK() cada vez para verificar.
Como evitar itens duplicados no Browse
Enviado: 17 Jan 2020 12:35
por mrcrusso
Obrigado Marcos,
Mas pelo que estive analisando, o arquivo em questão (CAD) não pode ser indexado, pois ele tem que gravar os registros na ordem em que são inseridos.
Como evitar itens duplicados no Browse
Enviado: 19 Jan 2020 10:31
por Marcos Kieron
E o velho FIND? não serviria?