Clipper On Line • Ver Tópico - Como evitar itens duplicados no Browse
Mudar para estilo Clássico
Projeto MiniGui - Biblioteca visual para Harbour/xHarbour
Postar uma resposta

Como evitar itens duplicados no Browse

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.

Código:
    @ 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:
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, num total de 1 vezes
Razão: Mensagem editada para colocar a tag [ code ]
Veja como utilizar esta tag: Clique aqui

Como evitar itens duplicados no Browse

11 Jan 2020 10:24

Porque tanto fonte?

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


poderia ser assim:

Código:
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

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.

Código:
@ 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

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.

Como evitar itens duplicados no Browse

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)

Como evitar itens duplicados no Browse

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.

Código:
Valida Existe( cChave )
   nRecNo      := RecNo()
   lEncontrou := dbSeek ....
   GOTO (nRecNo)
   RETURN lEncontrou

Como evitar itens duplicados no Browse

11 Jan 2020 11:36

Olá,

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

Código:
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

11 Jan 2020 12:02

Olá,

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

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


E nessa também:
Código:
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

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.

Como evitar itens duplicados no Browse

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.

Como evitar itens duplicados no Browse

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

Como evitar itens duplicados no Browse

15 Jan 2020 18:47

Obrigado pessoal pelas sugestões.

Vou tentar implementar algumas delas e depois informo o resultado.

Como evitar itens duplicados no Browse

17 Jan 2020 12:23

Não uso DBF a muitos anos, mas se fosse fazer usaria DBSEEK() cada vez para verificar.

Como evitar itens duplicados no Browse

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.

Como evitar itens duplicados no Browse

19 Jan 2020 10:31

E o velho FIND? não serviria?
Postar uma resposta