Página 1 de 1

pesquisando no dbedit letra a letra

Enviado: 27 Out 2010 11:21
por lapinhazzz
Bom dia amigos do forum,

O meu problema é o seguinte:

tenho um dbf com vários campos e um deles chama-se vendas

eu faço inde on strzero(vendas,5,0) to venda1

o procedure main() tem dbedit assim

o array que faço antes do dbedit contem numa linha strzero(vendas,5,0)+' '+str(valor)

tenho uma function que se chama letraaletra que pesquisa o dbedit depois de ele mostrar os campos em linha ou seja em browse.

na funçao letraaletra()
pesquiso letra a letra se condiz com o valor da vendas.

mas há um problema

o browse do dbedit faz isto

vendas utente valor
00001 cliente1 10,0
00002 cliente1 10,0
00003 cliente1 10,0
00004 cliente2 10,0
00005 cliente2 10,0
00006 cliente3 10,0
00007 cliente4 10,0
00008 cliente5 10,0
00009 cliente5 10,0
00010 cliente6 10,0

só que a função letraaletra na pesquisa tenho que pesquisar 00007 por exemplo para parar o registo no 00007.
eu queria que aparecesse os zeros mas a pesquisa ser feita com o número apenas por exemplo 7 e o letra a letra ficar no 00007
se teclar 10 o ponteiro do dbedit pára no 00010 e não digitar 00010
os campos sao strzero(vendas,5,0) e uns alfanumericos e outros numéricos como é o caso do campo vendas
Gostaria que alguém me desse uma opinião sobre isto
Agradecido.
lapinhazzz

Re: pesquisando no dbedit letra a letra

Enviado: 27 Out 2010 12:25
por Itamar M. Lins Jr.
Ola!
Onde pega o '0' /zero para poupar que o usuário digite '00007'
Coloque:

ZeroEsquerda(7,5) //Retorna := '00007'

Código: Selecionar todos

********************************************************
Function ZeroEsquerda(mvalor,tamanho,decimais)
********************************************************
*
*
Local  texto
if valtype(decimais)='U'
   decimais := 0
endif
if valtype(tamanho)='U'
   tamanho := 13
endif
if valtype(mvalor)='C'
   if val(mvalor)<>0
       texto:=strzero(val(alltrim(mvalor)),tamanho,0)
   else
       texto:=mvalor
   endif
elseif valtype(mvalor)='N'
   if decimais<>0
      mvalor := strzero(mvalor,tamanho+1,decimais)
      texto  := strtran(mvalor,'.')
   else
      texto  := strzero(mvalor,tamanho,0)
   endif
endif
return texto
Função util para quem faz o sintegra.

Pode usar transform() com a picture '@B'

Código: Selecionar todos

nKey := transform(nKey,'@B 99999')
Saudações,
Itamar M. Lins Jr.

Re: pesquisando no dbedit letra a letra

Enviado: 30 Out 2010 19:06
por lapinhazzz
Boa noite amigos do forum
Boa noite Itamar
Não consigo saber como faço isso que voce postou.
Por favor me desculpe de eu não perceber mas tente modificar aquilo que tenho para poder utilizar.
Aqui vao as duas rotinas

Código: Selecionar todos



/*
 ÚÄ Program ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿
 ³    Aplica‡„o:                                                            ³
 ³    Descri‡„o:                                                            ³
 ³         Nome: MV.PRG                                                     ³
 ³        Autor: Carlos Lapa                                                ³
 ³       Vers„o:                                                            ³
 ³ Data cria‡„o: 03-07-10              Actualizado em   : þ16-10-10         ³
 ³ Hora cria‡„o: 23:15:54              Hora actualiza‡„o: þ22:43:24         ³
 ³   Fich. Make:                                                            ³
 ³  Fich. Exec.:                       Doc.s por: Carlos Lapa               ³
 ³          Copyright: (c)  by Carlos Lapa, Inc.                            ³
 ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ
*/
function mv()
   public vprecov
   rot="MV"
   priv l
   sele 2
   OrdSetFocus("vendaitem")
   set filt to recno()>1
   go top
   sele 1
   OrdSetFocus("vvenda1")
   set filt to recno()>1
   go top
   do whil .t.
      publ v1a[1],v2a[1],v3a[1],v4a
      if indexord()=1
         tit("Vendas (por VENDA)")
         v1a[1]="strzero(VENDA)+' '+dtoc(datactual)+' '+utente+' '+proc+' '+hora+'  '+letraesc+cursoabv+'    '+origem+tran(total,'@E 999,999.99')"

         v3a[1]="Venda DataACTUAL Utente              Proc      Hora   Esc  Curso   Ori     Total"
         *       12345 10/10/2009 12345678901234567890 123456 13:15:15 A    CEF1A1       12345.12
         *                 1         2         3         4         5         6         7         8
         *       012345678901234567890123456789012345678901234567890123456789012345678901234567890
         pfs("[ENTER]EditaVenda,F4NovaVenda,F5ExcluiVenda,F7ReordenaLista")
      elseif indexord()=2
         tit("Vendas (por utente)")
         v1a[1]="utente+' '+strzero(venda,5,0)+' '+dtoc(datactual)+'  '+proc+' '+hora+' '+letraesc+''+cursoabv+'   '+origem+' '+tran(total,'@E 999,999.99')"
         *                 1         2         3         4         5         6         7         8
         *       012345678901234567890123456789012345678901234567890123456789012345678901234567890

         v3a[1]="Utente               Venda DataACTUAL Proc      Hora  Esc  Curso  Ori      Total"
         *       12345678901234567890 12345 10/10/2009 123456 13:15:50 A    CEF1A1        12345.12
         pfs("[ENTER]EditaVenda,F4NovaVenda,F5ExcluiVenda,F7ReordenaLista")
      endi
      v2a[1]="@"
      v4a=""
      cor(2)
      go top
      IF l=-6
         letraaa()
      ENDIF
      keyb chr(26)
      dbedit(04,00,22,80,v1a,"fc",v2a,v3a,v4a)
      l=lastkey()
      do case
         case l=27
            exit
         case l=13
            sele 1
            IF origem="S"
               @ 04,00 clea to 22,80
               calenda()
            elseif origem="F"
               mv_e()
            endi                                                // edita venda
         case l=-3
            mv_n()                                              // inclui nova venda
         case l=-4
            sele 1
            IF origem="F"
               mv_d()
            elseif origem="S"
               mv_d()
            endi
         case l=-6
            mv_r()                                              // reordena
      endc
   endd
   rele v1a,v2a,v3a,v4a
   rot="MAIN"

e aqui está a letra a letra

Código: Selecionar todos


/*
 ÚÄ Program ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿
 ³    Aplica‡„o:                                                            ³
 ³    Descri‡„o:                                                            ³
 ³         Nome: LETRA2.PRG                                                 ³
 ³        Autor: Carlos Lapa                                                ³
 ³       Vers„o:                                                            ³
 ³ Data cria‡„o: 24-10-10              Actualizado em   : þ24-10-10         ³
 ³ Hora cria‡„o: 15:59:51              Hora actualiza‡„o: þ15:59:51         ³
 ³   Fich. Make:                                                            ³
 ³  Fich. Exec.:                       Doc.s por: Carlos Lapa               ³
 ³          Copyright:       (c) Carlos Lapa, Inc.                          ³
 ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ
*/
FUNC LETRAaa()
   LOCAL ar_dbf:=ALIAS(), nCol:=20, nKey, v_tel_p               && cor_ant:=SETCOLOR()
   rot="LETRAAA"
   *v_tel_p:=SAVESCREEN(0,0,MAXROW(),79)
   nVar="0000"
   KEYBOARD CHR(27)
   sele 1
   dbedit(04,00,22,80,v1a,"fc",v2a,v3a,v4a)
   IF indexord()=1 .or. indexord()<=3
      @ 02, 05 SAY "Digite o Venda:"
   elseif indexord()=2 .OR.  indexord()=4
      @ 02, 05 SAY "Digite o Nome:"
   ENDIF

   read
   cor(2)
   @ 02, 20 SAY SPAC(30)
   nCol=20
   cNome=SPAC(00)
   DO WHILE .T.
      nKey=INKEY(0)
      IF LASTKEY()=13
         rvenda=venda
         exit
      elseif lastkey()=27
         exit
      endif
      IF lastkey()=24 .OR.  lastkey()=5 .AND.  cNome=spac(00)
         return
      ENDIF

      IF nKey=8 .or. nKey=19
         nCol=nCol-1
         IF nCol < 20
            nCol=20
         ENDIF
         cNome=SUBS(cNome,1,LEN(cNome)-1)
         cor(2)
         @ 02, 20 SAY cNome+"  "
      ELSEIF (nKey>=32 .and. nKey<=165)
         nCol=nCol+1
         IF nCol>=50
            nCol=50
            cNome=SUBS(cNome,1,LEN(cNome)-1)
         ENDIF
         cNome=UPPER(cNome+CHR(nKey))
         @ 02,20 SAY cNome
      ENDIF
      IF !PESQ_DBEDIT2(cNome)
         nCol=nCol - 1
         IF nCol <20
            nCol=20
         ENDIF
         cNome=SUBS(cNome,1,LEN(cNome)-1)
         cor(2)
         @ 02,20 SAY cNome
      ENDIF
      cor(2)
      @ 02,20 SAY cNome
   ENDDO
   *  SETCOLOR(cor_ant)
   *  RESTSCREEN(0,0,MAXROW(),79,v_tel_p)
RETURN

FUNC PESQ_DBEDIT2(cNome)
   IF DBSEEK(cNome,.T.)
      nVar=venda
      IF LASTKEY() <> 5 .AND. LASTKEY() <> 24
         KEYBOARD CHR(27)
      ENDIF
      IF lastkey()=24 .OR.  lastkey()=5
         return
      ENDIF
      dbedit(04,00,22,80,v1a,"fc",v2a,v3a,v4a)
   ELSE
      RETURN (.F.)
   ENDIF
RETURN (.T.)
Agradeço a todos
obrigado

lapinhazzz

Re: pesquisando no dbedit letra a letra

Enviado: 02 Nov 2010 20:51
por lapinhazzz
Já percebi o que deveria ser feito.
Mas não funciona se

Código: Selecionar todos

procedure main()  //aqui cria os indices. Verificar que o vvenda3 é for deleted()
 sele 1
   use vendas  alia a1
   index on strzero(venda,5,0)              tag vvenda1     to ivendas
   index on utente+strzero(venda,5,0)   tag vvenda2     to ivendas
   index on strzero(venda,5,0)              tag vvenda3     to ivendas for deleted()
   index on utente+strzero(venda,5,0)   tag vvenda4     to ivendas for deleted()
   index on datactual                            tag vvenda5     to ivendas
   index on strzero(venda,5,0)              tag vvenda6     to ivendas


function mv_mv()                 //aqui mostra em browse
   rot="MVMV"
   priv l,rr
   rr=0
   sele 2
   OrdSetFocus("vendaitem")
   set filt to recno()>1
   go top
   sele 1
   OrdSetFocus("vvenda3")
   dbsetorder(3)
   set deleted off
   set filt to recno()>1
   go top
   do whil .t.
      publ v1a[1],v2a[1],v3a[1],v4a
      if indexord()=3
         tit("Vendas (Recupera‡Æo por venda)")
         v1a[1]="strzero(VENDA,5,0)+' '+dtoc(datactual)+' '+utente+' '+proc+' '+hora+' '+letraesc+cursoabv+'    '+origem+tran(total,'@E 999,999.99')+iif(ff=' ',' ',iif(ff='1','þ',' '))"

         v3a[1]="Venda DataACTUAL Utente                Proc    Hora   Esc  Curso  Orig    Total"
         *       12345 10/10/2009 12345678901234567890 123456 13:15:15 A    CEF1A1       12345.12
         *                 1         2         3         4         5         6         7         8
         *       012345678901234567890123456789012345678901234567890123456789012345678901234567890
         pfs("[SPACE]Marca/Desmarca,[ENTER]Grava,F7ReordenaLista")
      elseif indexord()=4
         tit("Vendas (Recupera‡Æo por utente)")
         v1a[1]="utente+' '+strzero(venda,5,0)+' '+dtoc(datactual)+' '+proc+' '+hora+' '+letraesc+cursoabv+'    '+origem+tran(total,'@E 999,999.99')+iif(ff=' ',' ',iif(ff='1','þ',' '))"
         *                 1         2         3         4         5         6         7         8
         *       012345678901234567890123456789012345678901234567890123456789012345678901234567890

         v3a[1]="Utente               Venda DataACTUAL Proc    Hora    Esc  Curso   Orig    Total"
         *       12345678901234567890 12345 10/10/2009 123456 13:15:50 A    CEF1A1       12345.12
         pfs("[SPACE]Marca/Desmarca,[ENTER]Grava,F7ReordenaLista")
      endi
      v2a[1]="@"
      v4a=""
      cor(2)
      IF l=-6
         letraaa()
      ENDIF
      keyb chr(26)
      dbedit(04,00,22,80,v1a,"fc",v2a,v3a,v4a)
      l=lastkey()
      do case
         case l=27
            replace all ff with " "
            exit
         case l=13
            mv_gr(1)
            IF vali=.t.
               mvreca()
            endi
            rr=1
            exit
         case l=-6
            mv_ord()                                            // reordena
            if lastkey()=27
               exit
            endif
      endc
   endd
   IF rr=1
      rr=0
      mv_mv()
   ENDIF
   rele v1a,v2a,v3a,v4a
   rot="MAIN"
return


FUNC PESQ_DBEDIT2(cNome)              //esta é a parte de pesquisa com zeroesquerda
   IF DBSEEK([b]zeroesquerda(cNome,5[/b]),.T.)
      nVar=venda
      IF LASTKEY() <> 5 .AND. LASTKEY() <> 24
         KEYBOARD CHR(27)
      ENDIF
      IF lastkey()=24 .OR.  lastkey()=5
         return
      ENDIF
      dbedit(04,00,22,80,v1a,"fc",v2a,v3a,v4a)
   ELSE
      RETURN (.F.)
   ENDIF
RETURN (.T.)
Mas, quando eu vou para a rotina mv_mv e se tiver da venda 00002 até á venda 00010
Venda Cliente Valor
00002 -- --
00003 -- --
00005 -- --
00006 -- --
00007 -- --
00008 -- --
00009 -- --
00010 -- --


se digitar 10 no index vvenda3 for deleted()
o programa de pesquisa não deixa por o 10
Se existir a venda 00001 então já deixa por o 10 se existir a venda 100 também não funciona.
Tem que ter um número anterior por exemplo para 00010 tem que ter o 00001 para procurar o 00100 tem que ter a venda 10

Amigos do forum
Ajudem-me!
E obrigado Itamar e obrigado a este forum que é espectacular na resolução de problemas
Um abraço a todos
Fico aguardando com expectativa a resposta.
Mais uma vez obrigado
lapinhazzz

Re: pesquisando no dbedit letra a letra

Enviado: 02 Nov 2010 22:03
por alxsts
Olá!

Desculpa-me a curiosidade: por qual motivo crias índice for deleted()? E o Set Filter to Recno() > 1?

Sugiro trocares

Código: Selecionar todos

IF DBSEEK(zeroesquerda(cNome,5),.T.)
por

Código: Selecionar todos

IF DBSEEK(StrZero(Val(cNome,5)),.T.)
P.S.
mais uma curiosidade: o que é um utente?

Re: pesquisando no dbedit letra a letra

Enviado: 03 Nov 2010 07:16
por lapinhazzz
Bom dia a todos do forum
Bom dia alxsts

eu crio indice for deleted() para me mostrar a base de dados só aqueles registos que estão apagados.
Quando faço o set filter é porque quando a base de dados está vazia o dbedit mostrar o browse com nada la dentro.
Utente - é o utilizador, a pessoa que beneficia de um serviço.
Fico à espera de uma resposta vossa para o meu problema
Cumprimentos a todos

lapinhazzz

Re: pesquisando no dbedit letra a letra

Enviado: 03 Nov 2010 12:32
por Itamar M. Lins Jr.
Ola!
Veja que é preciso guardar a última tecla pressionada, para juntar com a anterior.

Código: Selecionar todos

vPesq += chr(key) //Atenção aqui!
KeyAnt := key
Atenção que se for utilizar a sugestão do "alxsts" deverá verificar se o usuário teclou outra coisa que não seja números.
Usando a função zeroesq() o usuário pode pressionar qualquer tecla.

Saudações,
Itamar M. Lins Jr.

Re: pesquisando no dbedit letra a letra

Enviado: 03 Nov 2010 13:18
por Itamar M. Lins Jr.
Ola!
Use o indice dessa forma

Código: Selecionar todos

     index on str(venda,14,4) 
........
vPesq += chr(key)
KeyAnt := key
//Pode checar se preciso, If chr(key) $ '0123456789.,'

if a1->(DbOrderInfo(DBOI_NUMBER)) = 3
     nPesq := StrTran(vPesq,',','.')
     nPesq := str(val(nPesq),14,4)
     a1->(DbSeek(nPesq))
EndIf

Saudações,
Itamar M. Lins Jr.

Re: pesquisando no dbedit letra a letra

Enviado: 04 Nov 2010 20:03
por lapinhazzz
Amigos do Forum muito boa noite.

quando faço o index on strzero(venda,5,0) tag vvenda3 for deleted()

Este index tem que existir porque quando faço o browse só quero que me aparecem os registos deletados.
Aqui vai a rotina que faz a pesquisa.
É como eu tinha dito atrás.
Verifiquem esta procura por favor.

Código: Selecionar todos

/*
 ÚÄ Program ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿
 ³    Aplica‡„o:                                                            ³
 ³    Descri‡„o:                                                            ³
 ³         Nome: LETRA2.PRG                                                 ³
 ³        Autor: Carlos Lapa                                                ³
 ³       Vers„o:                                                            ³
 ³ Data cria‡„o: 24-10-10              Actualizado em   : þ24-10-10         ³
 ³ Hora cria‡„o: 15:59:51              Hora actualiza‡„o: þ15:59:51         ³
 ³   Fich. Make:                                                            ³
 ³  Fich. Exec.:                       Doc.s por: Carlos Lapa               ³
 ³          Copyright:       (c) Carlos Lapa, Inc.                          ³
 ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ
*/
FUNC LETRAaa()
   LOCAL ar_dbf:=ALIAS(), nCol:=20, nKey, v_tel_p               && cor_ant:=SETCOLOR()
   rot="LETRAAA"
   *v_tel_p:=SAVESCREEN(0,0,MAXROW(),79)
   nVar="00000"
   KEYBOARD CHR(27)
   sele 1
   dbedit(04,00,22,80,v1a,"fc",v2a,v3a,v4a)
   IF indexord()=1 .or. indexord()=3
      @ 02, 05 SAY "Digite o Venda:"
   elseif indexord()=2 .OR.  indexord()=4
      @ 02, 05 SAY "Digite o Nome:"
   ENDIF

   read
   cor(2)
   @ 02, 20 SAY SPAC(30)
   nCol=20
   cNome=SPAC(00)
   DO WHILE .T.
      nKey=INKEY(0)
      IF LASTKEY()=13
         rvenda=venda
         exit
      elseif lastkey()=27
         exit
      endif
      IF lastkey()=24 .OR.  lastkey()=5 .AND.  cNome=spac(00)
         return
      ENDIF

      IF nKey=8 .or. nKey=19
         nCol=nCol-1
         IF nCol < 20
            nCol=20
         ENDIF
         cNome=SUBS(cNome,1,LEN(cNome)-1)
         cor(2)
         @ 02, 20 SAY cNome+"  "
      ELSEIF (nKey>=32 .and. nKey<=165)
         nCol=nCol+1
         IF nCol>=50
            nCol=50
            cNome=SUBS(cNome,1,LEN(cNome)-1)
         ENDIF
         cNome=UPPER(cNome+CHR(nKey))
         @ 02,20 SAY cNome
      ENDIF
      IF !PESQ_DBEDIT2(cNome)
         nCol=nCol - 1
         IF nCol <20
            nCol=20
         ENDIF
         cNome=SUBS(cNome,1,LEN(cNome)-1)
         cor(2)
         @ 02,20 SAY cNome
      ENDIF
      cor(2)
      @ 02,20 SAY cNome
   ENDDO
   *  SETCOLOR(cor_ant)
   *  RESTSCREEN(0,0,MAXROW(),79,v_tel_p)
RETURN

FUNC PESQ_DBEDIT2(cNome)
   IF DBSEEK(zeroesquerda(cNome,5),.T.)
      nVar=venda
      IF LASTKEY() <> 5 .AND. LASTKEY() <> 24
         KEYBOARD CHR(27)
      ENDIF
      IF lastkey()=24 .OR.  lastkey()=5
         return
      ENDIF
      dbedit(04,00,22,80,v1a,"fc",v2a,v3a,v4a)
   ELSE
      RETURN (.F.)
   ENDIF
RETURN (.T.)

E agora tenho duas opções de acordo com duas opções:
Passo a citar:

Código: Selecionar todos

IF indexord()=1 .or. indexord()=3
      @ 02, 05 SAY "Digite o Venda:"    //numérico com tamanho 5
   elseif indexord()=2 .OR.  indexord()=4
      @ 02, 05 SAY "Digite o Nome:"    //Alfanumérico com tamanho 20
   ENDIF
Caros amigos o que tenho que fazer para o valor apresentado no browse ser 00010 e eu introduzir só 10 e ele pesquisar o valor 10 o que não está a fazer.
Se depois escolher o Nome então pesquisa o nome que é caracter por exemplo cliente exemplo 1


Obrigado
Aguardo breves notícias de vocês
lapinhazzz