Clipper On Line • Ver Tópico - Como evitar itens duplicados no Browse

Como evitar itens duplicados no Browse

Projeto MiniGui - Biblioteca visual para Harbour/xHarbour

Moderador: Moderadores

 

Como evitar itens duplicados no Browse

Mensagempor mrcrusso » 11 Jan 2020 09:23

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.

    @ 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.
function busc_exa
if EXAM->(DBseek(MemVar.Cad.Codex))
   Return .t.
else
   Return .f.
endif
return


Obrigado.
Nota de Moderação:
JoséQuintas: Mensagem editada para colocar a tag [ code ]
Veja como utilizar esta tag: Clique aqui
mrcrusso
Usuário Nível 1

Usuário Nível 1
 
Mensagens: 8
Data de registro: 28 Dez 2019 09:17
Cidade/Estado: Amparo-SP
Curtiu: 0 vez
Mens.Curtidas: 0 vez

Como evitar itens duplicados no Browse

Mensagempor JoséQuintas » 11 Jan 2020 10:24

Porque tanto fonte?

function busc_exa
if EXAM->(DBseek(MemVar.Cad.Codex))
   Return .t.
else
   Return .f.
endif
return


poderia ser assim:

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.4, mingw, gtwvg, multithread, dbfcdx, ADO+MySql, hbnetio, PNotepad
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"
Avatar de usuário

JoséQuintas
Colaborador

Colaborador
 
Mensagens: 14341
Data de registro: 26 Fev 2007 11:59
Cidade/Estado: São Paulo-SP
Curtiu: 13 vezes
Mens.Curtidas: 859 vezes

Como evitar itens duplicados no Browse

Mensagempor mrcrusso » 11 Jan 2020 10:46

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.

 @ 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()} ,,}
mrcrusso
Usuário Nível 1

Usuário Nível 1
 
Mensagens: 8
Data de registro: 28 Dez 2019 09:17
Cidade/Estado: Amparo-SP
Curtiu: 0 vez
Mens.Curtidas: 0 vez

Como evitar itens duplicados no Browse

Mensagempor MSDN » 11 Jan 2020 10:55

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.
MSDN
Usuário Nível 4

Usuário Nível 4
 
Mensagens: 737
Data de registro: 28 Nov 2003 14:55
Cidade/Estado: CWB
Curtiu: 159 vezes
Mens.Curtidas: 105 vezes

Como evitar itens duplicados no Browse

Mensagempor mrcrusso » 11 Jan 2020 11:10

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)
mrcrusso
Usuário Nível 1

Usuário Nível 1
 
Mensagens: 8
Data de registro: 28 Dez 2019 09:17
Cidade/Estado: Amparo-SP
Curtiu: 0 vez
Mens.Curtidas: 0 vez

Como evitar itens duplicados no Browse

Mensagempor JoséQuintas » 11 Jan 2020 11:16

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.

Valida Existe( cChave )
   nRecNo      := RecNo()
   lEncontrou := dbSeek ....
   GOTO (nRecNo)
   RETURN lEncontrou
José M. C. Quintas
Harbour 3.4, mingw, gtwvg, multithread, dbfcdx, ADO+MySql, hbnetio, PNotepad
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"
Avatar de usuário

JoséQuintas
Colaborador

Colaborador
 
Mensagens: 14341
Data de registro: 26 Fev 2007 11:59
Cidade/Estado: São Paulo-SP
Curtiu: 13 vezes
Mens.Curtidas: 859 vezes

Como evitar itens duplicados no Browse

Mensagempor mrcrusso » 11 Jan 2020 11:36

Olá,

Já fiz isso também e não funcionou.

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
Data de registro: 28 Dez 2019 09:17
Cidade/Estado: Amparo-SP
Curtiu: 0 vez
Mens.Curtidas: 0 vez

Como evitar itens duplicados no Browse

Mensagempor mrcrusso » 11 Jan 2020 12:02

Olá,

Apenas informando que já tentei colocar essa função de validação de registro duplicado nesses dois locais.

    @ 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:
function busc_exa
if EXAM->(DBseek(MemVar.Cad.Codex))
   Return .t.
else
   Return .f.
endif
return


E nessa também:
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
mrcrusso
Usuário Nível 1

Usuário Nível 1
 
Mensagens: 8
Data de registro: 28 Dez 2019 09:17
Cidade/Estado: Amparo-SP
Curtiu: 0 vez
Mens.Curtidas: 0 vez

Como evitar itens duplicados no Browse

Mensagempor JoséQuintas » 11 Jan 2020 12:07

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.4, mingw, gtwvg, multithread, dbfcdx, ADO+MySql, hbnetio, PNotepad
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"
Avatar de usuário

JoséQuintas
Colaborador

Colaborador
 
Mensagens: 14341
Data de registro: 26 Fev 2007 11:59
Cidade/Estado: São Paulo-SP
Curtiu: 13 vezes
Mens.Curtidas: 859 vezes

Como evitar itens duplicados no Browse

Mensagempor susviela@bol.com.br » 11 Jan 2020 15:56

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 de usuário

susviela@bol.com.br
Usuário Nível 3

Usuário Nível 3
 
Mensagens: 207
Data de registro: 30 Jun 2017 11:17
Cidade/Estado: São José / SC
Curtiu: 127 vezes
Mens.Curtidas: 20 vezes

Como evitar itens duplicados no Browse

Mensagempor Nascimento » 12 Jan 2020 11:18

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
Avatar de usuário

Nascimento
Usuário Nível 4

Usuário Nível 4
 
Mensagens: 586
Data de registro: 19 Jul 2008 12:11
Cidade/Estado: OLINDA-PE
Curtiu: 92 vezes
Mens.Curtidas: 65 vezes

Como evitar itens duplicados no Browse

Mensagempor mrcrusso » 15 Jan 2020 18:47

Obrigado pessoal pelas sugestões.

Vou tentar implementar algumas delas e depois informo o resultado.
mrcrusso
Usuário Nível 1

Usuário Nível 1
 
Mensagens: 8
Data de registro: 28 Dez 2019 09:17
Cidade/Estado: Amparo-SP
Curtiu: 0 vez
Mens.Curtidas: 0 vez

Como evitar itens duplicados no Browse

Mensagempor Marcos Kieron » 17 Jan 2020 12:23

Não uso DBF a muitos anos, mas se fosse fazer usaria DBSEEK() cada vez para verificar.
Marcos Kieron
Usuário Nível 2

Usuário Nível 2
 
Mensagens: 66
Data de registro: 14 Jan 2020 10:29
Cidade/Estado: São Paulo/SP
Curtiu: 0 vez
Mens.Curtidas: 5 vezes

Como evitar itens duplicados no Browse

Mensagempor mrcrusso » 17 Jan 2020 12:35

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.
mrcrusso
Usuário Nível 1

Usuário Nível 1
 
Mensagens: 8
Data de registro: 28 Dez 2019 09:17
Cidade/Estado: Amparo-SP
Curtiu: 0 vez
Mens.Curtidas: 0 vez

Como evitar itens duplicados no Browse

Mensagempor Marcos Kieron » 19 Jan 2020 10:31

E o velho FIND? não serviria?
Marcos Kieron
Usuário Nível 2

Usuário Nível 2
 
Mensagens: 66
Data de registro: 14 Jan 2020 10:29
Cidade/Estado: São Paulo/SP
Curtiu: 0 vez
Mens.Curtidas: 5 vezes




Retornar para MiniGui

Quem está online

Usuários vendo este fórum: Nenhum usuário registrado online e 2 visitantes


Ola Amigo, espero que meu site e forum tem lhe beneficiado, com exemplos e dicas de programacao.
Entao divulgue o link da Doacao abaixo para seus amigos e redes sociais ou faça uma doacao para o site forum...
MUITO OBRIGADO PELA SUA DOACAO!
Faça uma doação para o forum
cron
v
Olá visitante, seja bem-vindo ao Fórum Clipper On Line!
Efetue o seu login ou faça o seu Registro