Como evitar itens duplicados no Browse

Projeto MiniGui - Biblioteca visual para Harbour/xHarbour

Moderador: Moderadores

mrcrusso
Usuário Nível 1
Usuário Nível 1
Mensagens: 8
Registrado em: 28 Dez 2019 09:17
Localização: Amparo-SP

Como evitar itens duplicados no Browse

Mensagem 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.
Editado pela última vez por JoséQuintas em 11 Jan 2020 10:20, em um total de 1 vez.
Razão: Mensagem editada para colocar a tag [ code ]<br>Veja como utilizar esta tag: http://www.pctoledo.com.br/forum/faq.php?mode=bbcode#f2r1
Avatar do usuário
JoséQuintas
Administrador
Administrador
Mensagens: 20267
Registrado em: 26 Fev 2007 11:59
Localização: São Paulo-SP

Como evitar itens duplicados no Browse

Mensagem 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.
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/
mrcrusso
Usuário Nível 1
Usuário Nível 1
Mensagens: 8
Registrado em: 28 Dez 2019 09:17
Localização: Amparo-SP

Como evitar itens duplicados no Browse

Mensagem 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()} ,,}
MSDN
Usuário Nível 4
Usuário Nível 4
Mensagens: 741
Registrado em: 28 Nov 2003 15:55
Localização: CWB
Contato:

Como evitar itens duplicados no Browse

Mensagem 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.
mrcrusso
Usuário Nível 1
Usuário Nível 1
Mensagens: 8
Registrado em: 28 Dez 2019 09:17
Localização: Amparo-SP

Como evitar itens duplicados no Browse

Mensagem 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)
Avatar do usuário
JoséQuintas
Administrador
Administrador
Mensagens: 20267
Registrado em: 26 Fev 2007 11:59
Localização: São Paulo-SP

Como evitar itens duplicados no Browse

Mensagem 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
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/
mrcrusso
Usuário Nível 1
Usuário Nível 1
Mensagens: 8
Registrado em: 28 Dez 2019 09:17
Localização: Amparo-SP

Como evitar itens duplicados no Browse

Mensagem 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.
mrcrusso
Usuário Nível 1
Usuário Nível 1
Mensagens: 8
Registrado em: 28 Dez 2019 09:17
Localização: Amparo-SP

Como evitar itens duplicados no Browse

Mensagem 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
Avatar do usuário
JoséQuintas
Administrador
Administrador
Mensagens: 20267
Registrado em: 26 Fev 2007 11:59
Localização: São Paulo-SP

Como evitar itens duplicados no Browse

Mensagem 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.
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
susviela@bol.com.br
Usuário Nível 3
Usuário Nível 3
Mensagens: 236
Registrado em: 30 Jun 2017 11:17
Localização: São José / SC
Contato:

Como evitar itens duplicados no Browse

Mensagem 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.
.
.
"E quando você perder o controle, colherá o que plantou."
=========================================
Carlos Alberto Nunes #Susviela
Site: https://www.PowerInformatica.com.br
=========================================
Blog xBase: https://programandoxbase.wordpress.com/
Blog TI: https://susviela.wordpress.com

( #ProgramandoxBase #AllxBase )
Avatar do usuário
Nascimento
Usuário Nível 4
Usuário Nível 4
Mensagens: 763
Registrado em: 19 Jul 2008 12:11
Localização: OLINDA-PE

Como evitar itens duplicados no Browse

Mensagem 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
A arte de programar é simplesmente fazer seus pensamentos serem interpretados por uma maquina :) clipper 5.3 /harbour/minigui
mrcrusso
Usuário Nível 1
Usuário Nível 1
Mensagens: 8
Registrado em: 28 Dez 2019 09:17
Localização: Amparo-SP

Como evitar itens duplicados no Browse

Mensagem por mrcrusso »

Obrigado pessoal pelas sugestões.

Vou tentar implementar algumas delas e depois informo o resultado.
Marcos Kieron
Usuário Nível 2
Usuário Nível 2
Mensagens: 72
Registrado em: 14 Jan 2020 10:29
Localização: São Paulo/SP

Como evitar itens duplicados no Browse

Mensagem por Marcos Kieron »

Não uso DBF a muitos anos, mas se fosse fazer usaria DBSEEK() cada vez para verificar.
mrcrusso
Usuário Nível 1
Usuário Nível 1
Mensagens: 8
Registrado em: 28 Dez 2019 09:17
Localização: Amparo-SP

Como evitar itens duplicados no Browse

Mensagem 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.
Marcos Kieron
Usuário Nível 2
Usuário Nível 2
Mensagens: 72
Registrado em: 14 Jan 2020 10:29
Localização: São Paulo/SP

Como evitar itens duplicados no Browse

Mensagem por Marcos Kieron »

E o velho FIND? não serviria?
Responder