pesquisa com escolha de opcao

Fórum sobre a linguagem CA-Clipper.

Moderador: Moderadores

Glauco Cruz Costa
Usuário Nível 3
Usuário Nível 3
Mensagens: 102
Registrado em: 15 Dez 2005 22:02
Localização: Brasília/DF
Contato:

pesquisa com escolha de opcao

Mensagem por Glauco Cruz Costa »

:-o Olá, amigos clipeiros.
Estou precisando de mais uma cooperação de vocês.
Veja. Estou tentando montar uma rotina em que ao se pressionar uma tecla se faça uma pesquisa no dbf de acordo com o que eu digitei em determinado campo. Após, eu possa fazer um rolamento de possível ou possíveis opções que apareçam, sendo que eu possa mirar com a seta nessa opção e escolhe-la com outra tecla ou <enter> e os meus gets se preencham com os dados dessa opção na tela. Já quebrei a cabeça aqui com várias tentativas. Só me restou recorrer a vocês.
Também, pesquisar de acordo com a posição do cursor em determinado get. Por exemplo: se eu quero pesquisar no dbf para ver se há um nome igual, o cursor deve estar posicionado no get de edição do campo referente ao nome, etc.
Veja:

USE REGISTRO SHARED NEW
...
SET KEY 28 TO PESQ()
...
DO WHILE .T.
@ 10,10 SAY "NOME:" GET NOM
@ 10,50 SAY "SEXO:" GET SEX
@ ... // VARIOS OUTROS CAMPOS
READ
ENDDO

Agora, eu gostaria de pressionar alguma tecla, de acordo com o cursor estar em um ou outro campo, surgir uma telinha com campos referentes ao digitado para eu escolher um (por exemplo: podem ter varios nomes Glauco Cruz Costa, mas com diferentes datas de nascimento. Assim, eu também tenho que ver mais alguns campos:data, rg etc). Escolhendo, tal opção, devo voltar a tela anterior (save screen/restore screen) com os campos preenchido conforme eu escolhi, e podendo movimentar normalmente por eles podendo pressionar outras teclas de funções declaradas por set key.

Pode ser simples para muitos de vocês, feras do Clipper, mas para mim, de conhecimento muio limitado na linguagem, está bastante difícil.
Agradeço a cooperação.
Abraços.
gransoft
Usuário Nível 3
Usuário Nível 3
Mensagens: 321
Registrado em: 06 Jul 2004 17:48
Localização: UBERLÂNDIA-MG
Contato:

Função para pesquisar

Mensagem por gransoft »

ARAGUARI-MG, 17 de janeiro de 2006.

Prezado Glauco,

Digite as primeiras letras de um nome e pressione a tecla de função F10;
Selecione com as setas para cima & baixo;
Pressione F12 e o KEYBOARD completará o serviço...

Essa é a idéia:

Código: Selecionar todos

(***)

         WHILE .T.
            HoraData()
            SETCOLOR(cCor3)
            Centro(24,"*** DIGITE O NOME DO CLIENTE  OU TECLE <F10> ***")
            SET CURSOR ON
            *
            SELECT CLIENTE
            SET ORDER TO 2
            GOTO TOP
            *
            SET KEY K_F10 TO PesCli()
            *
            * SETCOLOR(cCor2)
            SETCOLOR(cCorEsp2)
            @ 03,38 GET cCliente PICTURE '@!'
              READ
            SET CURSOR OFF
            *
            SET KEY K_F10 TO
            *
            IF EMPTY(cCliente)
               *
               Ret_Est()
               *
               FechaArqVen("1")
               FechaArqVen("3")
               *
               CLOSE ARQPED
               CLOSE ARQPAUX
               *
             * Retorno()
               *
               ERASE (xcArquivo1)
               ERASE (xcArquivo2)
               ERASE (xcIndice1)
               ERASE (xcIndice2)
               *
               SELECT VEN_MES
               *
               RESTSCREEN(01,00,23,79,xcTelaInc)
               RETURN
            END
            *
            * SELECT CLIENTE
            * SET ORDER TO 2
            GOTO TOP
            SEEK CD(TRIM(cCliente))
            IF (.NOT. FOUND())
               Beep(1)
               SETCOLOR(cCor5)
               Mensagem("*** NOME DO CLIENTE INEXISTENTE ***")
               SETCOLOR(cCor2) 
               cCliente := SPACE(40)            
               LOOP
            END
            *
            **********
            cCodCli   := DC(CODCLI)
            cCliente  := DC(CLIENTE)
            **********
            *
            EXIT
         END  &&  WHILE .T.


(***)


*** PROCEDURE PARA PESQUISA DE CLIENTES ***
FUNCTION PesCli(cProc,cLine,cVar)
*
PRIVATE nArq, objBr, nTecla, nX1:=08, nY1:=02, nX2:=19, nY2:=77
PRIVATE objCol01, objCol02
*
PRIVATE xcTela := SAVESCREEN(01,00,23,79)
*
***
*
PRIVATE cEndereco  := SPACE(11)
*
PRIVATE cCor       := Set(_SET_COLOR)
PRIVATE lIntensity := Set(_SET_INTENSITY)
PRIVATE cCursor    := Set(_SET_CURSOR)
PRIVATE lUse       := IIF(USED(),.T.,.F.)  && SE ARQUIVO EM USO, GUARDA SELECT.
PRIVATE cSelect    := IIF(lUse,SELECT(),SPACE(10))
*
SET CURSOR OFF
SET INTENSITY ON
*
SELECT CLIENTES
GOTO TOP
SEEK TRIM(&cVar.)
IF (.NOT. FOUND())
   Beep(1)
   SETCOLOR(cCor5)
   IF INDEXORD() == 1
      Mensagem("*** CODIGO DO CLIENTE INEXISTENTE ***")
   ELSEIF INDEXORD() == 2
      Mensagem("*** CLIENTE INEXISTENTE ***")
   ELSEIF INDEXORD() == 3
      Mensagem("*** ENDERECO INEXISTENTE ***")
   END
   SETCOLOR(cCor2)
   *
   Set(_SET_COLOR,cCor)
   Set(_SET_INTENSITY,lIntensity)
   Set(_SET_CURSOR,cCursor)
   *
   IF lUse  && SE EXISTIA ARQUIVO EM USO, RETORNA AO SELECT ANTERIOR ...
      SELECT &cSelect.
   END
   *
   RESTSCREEN(01,00,23,79,xcTela)
   *
   HoraData()
   Funcao(1)
   SETCOLOR(cCor3)
   IF INDEXORD() == 1
      Centro(24,"*** DIGITE O CODIGO DO CLIENTE  OU TECLE <F10> ***")
   ELSEIF INDEXORD() == 2
      Centro(24,"*** DIGITE O CLIENTE  OU TECLE <F10> ***")
   ELSEIF INDEXORD() == 3
      Centro(24,"*** DIGITE O ENDERECO  OU TECLE <F10> ***")
   END
   SETCOLOR(cCor2)
   RETURN
END
*
*TelaPC()
HoraData()
Funcao(5)
* Cria Objeto TBrowse
Quadro(nX1,nY1,nX2,nY2)
objBr := TBrowseDB(nX1,nY1,nX2,nY2)
*
* Definir separadores de colunas e cabecalhos
*
* objBr:headSep   := CHR(205) + CHR(209) + CHR(205)
* objBr:colSep    := CHR(032) + CHR(179) + CHR(032)
*
objBr:headSep   := "ÍËÍ"  && CHR(209) + CHR(205)  && ÍÑÍ
objBr:colSep    := " º "  && CHR(179)             &&  ³
objBr:footSep   := "ÍÊÍ"  && CHR(207) + CHR(205)  && ÍÏÍ
*
* Definir cor
*
* objBr:colorSpec := "BG/B,GR+/R,W/N,N,GR+/W,G/B,R+/B,GR+/B"
  objBr:colorSpec := cCor7
*
*_Cod_  _______________Cliente__________________
*99999  XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
*
objCol01 := TBColumnNew("_C¢d_",{||TRANSFORM(DC(CODCLI),'99999')})
objCol01:Width := 05
objBr:addColumn(objCol01)
*
objCol02 := TBColumnNew("________________Cliente_________________",;
          {||TRANSFORM(DC(CLIENTE),'@!')})
objCol02:Width := 42  && 40
objBr:addColumn(objCol02)
*
objCol03 := TBColumnNew("F/J",{||TRANSFORM(DC(TIPO),'@R  ! ')})
objCol03:Width := 03
objBr:addColumn(objCol03)
*
objCol04 := TBColumnNew("SPC",{||TRANSFORM(DC(SPC),'!!!')})
objCol04:Width := 03
objBr:addColumn(objCol04)
*
objCol05 := TBColumnNew("___Fone__",{||TRANSFORM(DC(FONE1),'@R 9999-9999')})
objCol05:Width := 09
objBr:addColumn(objCol05)
*
objCol06 := TBColumnNew("_D‚bito Total_",;
          {||TRANSFORM(SALDO,'@E 999,999,999.99')})
objCol06:Width := 14
objBr:addColumn(objCol06)
*
objCol07 := TBColumnNew("D",{||TRANSFORM(DCTipo("C",SALDO),'!')})
objCol07:Width := 01
objBr:addColumn(objCol07)
*
objBr:colpos := INDEXORD()  && 1 OU 2, 3...
*
Direcao(nX1,nY1,nX2,nY2,25)
*
WHILE .T.
   WHILE (!objBr:stabilize())
      nTecla := INKEY()
      IF (nTecla != 0)
         EXIT
      END
   END
   IF (objBr:stable)
      IF     (objBr:hitTop)
         Beep(1)
         SETCOLOR(cCor5)
         Centro(24,"*** INICIO DE ARQUIVO ***")
         SETCOLOR(cCor0)
         INKEY(0)  && Tempo(nTempo)
      ELSEIF (objBr:hitBottom)
         Beep(1)
         SETCOLOR(cCor5)
         Centro(24,"*** FIM DE ARQUIVO ***")
         SETCOLOR(cCor0)
         INKEY(0)  && Tempo(nTempo)
      END
      SETCOLOR(cCor3)
      Centro(24,"<"+chr(24)+chr(25)+chr(27)+chr(26)+;
      "> <F12-Endere‡o P/NF> <Enter> <PgUp> <PgDn> <Esc>")
      SETCOLOR(cCor0)
      *
      CLEAR TYPEAHEAD
      *
      WHILE ((nTecla := INKEY(.5)) == 0)
         HoraData()
      END
      LimpaLinha(24)
   END
   *
   IF     nTecla == K_RETURN
      IF (objBr:stable)
         xcTela1 := SAVESCREEN(01,00,23,79)
         LVACli1()
         LVACli2()
       * TelaCli1()
       * MVMCli1()
       * IF (cTipo == "F")
       *    TelaCli2()
       *    MVMCli2()
       * END
         MDCli()
         RESTSCREEN(01,00,23,79,xcTela1)
      END
   ELSEIF nTecla == K_F12
      *
      cEscolha   := "S"
      cEndereco  := "COBRANCA   "
      *
    * cCodCli    := DC(CODCLI)
    * cCliente   := DC(CLIENTE)
    * cTipo      := DC(TIPO)
      *
      cTabela    := DC(TABELA)
      *
      cEndPed    := DC(END)
      cNumeroPed := DC(NUMERO)
      cComplPed  := DC(COMPL)
      cBairroPed := DC(BAIRRO)
      cCepPed    := DC(CEP)
      cCidPed    := DC(CID)
      cUfPed     := DC(UF)
      cDddPed    := DC(DDD)
      cFonePed   := DC(FONE1)
      *
      cCNPJPed   := DC(CNPJ)
      cInscPed   := DC(INSC)
      *
      nSaldoCli  := SALDO
      nLimite    := LIMITE
      *
      HoraData()
      SETCOLOR(cCor5)
Centro(24,"*** SELECIONADO ENDERECO DE COBRANCA. P/RETORNAR, TECLE <ESC> ***")
      SETCOLOR(cCor0)
      INKEY(0)
      *
   ELSEIF nTecla == K_ESC
      *
      cCodFor    := cCodCli    := DC(CODCLI)
      cFor       := cCliente   := DC(CLIENTE)
      cTipo      := DC(TIPO)
      *
      cTabela    := DC(TABELA)
      *
      IF     INDEXORD() == 1
         IF     cEndereco == "COBRANCA   "
            KEYBOARD CHR(K_CTRL_A) + CHR(K_CTRL_Y) + cCodCli + CHR(K_HOME)
         ELSEIF cEndereco == "PROPRIEDADE"
            KEYBOARD CHR(K_CTRL_A) + CHR(K_CTRL_Y) + cCodCli + CHR(K_HOME)
         ELSEIF cEndereco == SPACE(11)
            KEYBOARD CHR(K_CTRL_A) + CHR(K_CTRL_Y)
         END
      ELSEIF INDEXORD() == 2
         IF     cEndereco == "COBRANCA   "
            KEYBOARD CHR(K_CTRL_A) + CHR(K_CTRL_Y) + cCliente + CHR(K_HOME)
         ELSEIF cEndereco == "PROPRIEDADE"
            KEYBOARD CHR(K_CTRL_A) + CHR(K_CTRL_Y) + cCliente + CHR(K_HOME)
         ELSEIF cEndereco == SPACE(11)
            KEYBOARD CHR(K_CTRL_A) + CHR(K_CTRL_Y)
         END
      END
      EXIT
   ELSEIF nTecla == K_F1
   ELSEIF nTecla == K_F2
   ELSEIF nTecla == K_F3
   ELSEIF nTecla == K_F4
   ELSEIF nTecla == K_DOWN
      Direcao(nX1,nY1,nX2,nY2,25)
      objBr:down()
   ELSEIF nTecla == K_PGDN
      Direcao(nX1,nY1,nX2,nY2,25)
      objBr:pageDown()
   ELSEIF nTecla == K_CTRL_PGDN
      Direcao(nX1,nY1,nX2,nY2,25)
      objBr:goBottom()
   ELSEIF nTecla == K_UP
      Direcao(nX1,nY1,nX2,nY2,24)
      objBr:up()
   ELSEIF nTecla == K_PGUP
      Direcao(nX1,nY1,nX2,nY2,24)
      objBr:pageUp()
   ELSEIF nTecla == K_CTRL_PGUP
      Direcao(nX1,nY1,nX2,nY2,24)
      objBr:goTop()
   ELSEIF nTecla == K_RIGHT
      Direcao(nX1,nY1,nX2,nY2,26)
      objBr:right()
   ELSEIF nTecla == K_LEFT
      Direcao(nX1,nY1,nX2,nY2,27)
      objBr:left()
   ELSEIF nTecla == K_HOME
      Direcao(nX1,nY1,nX2,nY2,27)
      objBr:home()
   ELSEIF nTecla == K_END
      Direcao(nX1,nY1,nX2,nY2,26)
      objBr:end()
   ELSEIF nTecla == K_CTRL_LEFT
      Direcao(nX1,nY1,nX2,nY2,27)
      objBr:panLeft()
   ELSEIF nTecla == K_CTRL_RIGHT
      Direcao(nX1,nY1,nX2,nY2,26)
      objBr:panRight()
   ELSEIF nTecla == K_CTRL_HOME
      Direcao(nX1,nY1,nX2,nY2,27)
      objBr:panHome()
   ELSEIF nTecla == K_CTRL_END
      Direcao(nX1,nY1,nX2,nY2,26)
      objBr:panEnd()
   END
END  && WHILE .T.
*
Set(_SET_COLOR,cCor)
Set(_SET_INTENSITY,lIntensity)
Set(_SET_CURSOR,cCursor)
*
IF lUse  && SE EXISTIA ARQUIVO EM USO, RETORNA AO SELECT ANTERIOR ...
   SELECT &cSelect.
END
*
RESTSCREEN(01,00,23,79,xcTela)
*
HoraData()
Funcao(1)
SETCOLOR(cCor3)
IF INDEXORD() == 1
   Centro(24,"*** DIGITE O CODIGO DO CLIENTE  OU TECLE <F10> ***")
ELSEIF INDEXORD() == 2
   Centro(24,"*** DIGITE O CLIENTE  OU TECLE <F10> ***")
ELSEIF INDEXORD() == 3
   Centro(24,"*** DIGITE O ENDERECO  OU TECLE <F10> ***")
END
SETCOLOR(cCor2)
*
RETURN
***


(***)


PROCEDURE Direcao(nX1,nY1,nX2,nY2,nChr)
IF (VALTYPE(nChr) <> "N") .OR. (nChr == NIL)
   RETURN
END
SETCOLOR("+W/+W")  && cCor3
@ nX1+1,nY2+1,nX2,nY2+1 BOX "         "
FOR nI:=nX1+1 TO nX2
   @ nI,nY2+1 SAY "±"
NEXT
SETCOLOR("W*+/W")
@ nX1+1,nY2+1 SAY ""+CHR(nChr)+""
@ nX2,nY2+1   SAY ""+CHR(nChr)+""
SETCOLOR(cCor0)
RETURN
***
Atenciosamente,
Janis Peters Grants.

Skype: gransoft
http://www.gransoft.com.br
gransoft@zipmail.com.br
Glauco Cruz Costa
Usuário Nível 3
Usuário Nível 3
Mensagens: 102
Registrado em: 15 Dez 2005 22:02
Localização: Brasília/DF
Contato:

Re: Função para pesquisar

Mensagem por Glauco Cruz Costa »

gransoft escreveu:ARAGUARI-MG, 17 de janeiro de 2006.

Prezado Glauco,

Digite as primeiras letras de um nome e pressione a tecla de função F10;
Selecione com as setas para cima & baixo;
Pressione F12 e o KEYBOARD completará o serviço...

Essa é a idéia:

Código: Selecionar todos

(***)

         WHILE .T.
            HoraData()
            SETCOLOR(cCor3)
            Centro(24,"*** DIGITE O NOME DO CLIENTE  OU TECLE <F10> ***")
            SET CURSOR ON
            *
            SELECT CLIENTE
            SET ORDER TO 2
            GOTO TOP
            *
            SET KEY K_F10 TO PesCli()
            *
            * SETCOLOR(cCor2)
            SETCOLOR(cCorEsp2)
            @ 03,38 GET cCliente PICTURE '@!'
              READ
            SET CURSOR OFF
            *
            SET KEY K_F10 TO
            *
            IF EMPTY(cCliente)
               *
               Ret_Est()
               *
               FechaArqVen("1")
               FechaArqVen("3")
               *
               CLOSE ARQPED
               CLOSE ARQPAUX
               *
             * Retorno()
               *
               ERASE (xcArquivo1)
               ERASE (xcArquivo2)
               ERASE (xcIndice1)
               ERASE (xcIndice2)
               *
               SELECT VEN_MES
               *
               RESTSCREEN(01,00,23,79,xcTelaInc)
               RETURN
            END
            *
            * SELECT CLIENTE
            * SET ORDER TO 2
            GOTO TOP
            SEEK CD(TRIM(cCliente))
            IF (.NOT. FOUND())
               Beep(1)
               SETCOLOR(cCor5)
               Mensagem("*** NOME DO CLIENTE INEXISTENTE ***")
               SETCOLOR(cCor2) 
               cCliente := SPACE(40)            
               LOOP
            END
            *
            **********
            cCodCli   := DC(CODCLI)
            cCliente  := DC(CLIENTE)
            **********
            *
            EXIT
         END  &&  WHILE .T.


(***)


*** PROCEDURE PARA PESQUISA DE CLIENTES ***
FUNCTION PesCli(cProc,cLine,cVar)
*
PRIVATE nArq, objBr, nTecla, nX1:=08, nY1:=02, nX2:=19, nY2:=77
PRIVATE objCol01, objCol02
*
PRIVATE xcTela := SAVESCREEN(01,00,23,79)
*
***
*
PRIVATE cEndereco  := SPACE(11)
*
PRIVATE cCor       := Set(_SET_COLOR)
PRIVATE lIntensity := Set(_SET_INTENSITY)
PRIVATE cCursor    := Set(_SET_CURSOR)
PRIVATE lUse       := IIF(USED(),.T.,.F.)  && SE ARQUIVO EM USO, GUARDA SELECT.
PRIVATE cSelect    := IIF(lUse,SELECT(),SPACE(10))
*
SET CURSOR OFF
SET INTENSITY ON
*
SELECT CLIENTES
GOTO TOP
SEEK TRIM(&cVar.)
IF (.NOT. FOUND())
   Beep(1)
   SETCOLOR(cCor5)
   IF INDEXORD() == 1
      Mensagem("*** CODIGO DO CLIENTE INEXISTENTE ***")
   ELSEIF INDEXORD() == 2
      Mensagem("*** CLIENTE INEXISTENTE ***")
   ELSEIF INDEXORD() == 3
      Mensagem("*** ENDERECO INEXISTENTE ***")
   END
   SETCOLOR(cCor2)
   *
   Set(_SET_COLOR,cCor)
   Set(_SET_INTENSITY,lIntensity)
   Set(_SET_CURSOR,cCursor)
   *
   IF lUse  && SE EXISTIA ARQUIVO EM USO, RETORNA AO SELECT ANTERIOR ...
      SELECT &cSelect.
   END
   *
   RESTSCREEN(01,00,23,79,xcTela)
   *
   HoraData()
   Funcao(1)
   SETCOLOR(cCor3)
   IF INDEXORD() == 1
      Centro(24,"*** DIGITE O CODIGO DO CLIENTE  OU TECLE <F10> ***")
   ELSEIF INDEXORD() == 2
      Centro(24,"*** DIGITE O CLIENTE  OU TECLE <F10> ***")
   ELSEIF INDEXORD() == 3
      Centro(24,"*** DIGITE O ENDERECO  OU TECLE <F10> ***")
   END
   SETCOLOR(cCor2)
   RETURN
END
*
*TelaPC()
HoraData()
Funcao(5)
* Cria Objeto TBrowse
Quadro(nX1,nY1,nX2,nY2)
objBr := TBrowseDB(nX1,nY1,nX2,nY2)
*
* Definir separadores de colunas e cabecalhos
*
* objBr:headSep   := CHR(205) + CHR(209) + CHR(205)
* objBr:colSep    := CHR(032) + CHR(179) + CHR(032)
*
objBr:headSep   := "ÍËÍ"  && CHR(209) + CHR(205)  && ÍÑÍ
objBr:colSep    := " º "  && CHR(179)             &&  ³
objBr:footSep   := "ÍÊÍ"  && CHR(207) + CHR(205)  && ÍÏÍ
*
* Definir cor
*
* objBr:colorSpec := "BG/B,GR+/R,W/N,N,GR+/W,G/B,R+/B,GR+/B"
  objBr:colorSpec := cCor7
*
*_Cod_  _______________Cliente__________________
*99999  XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
*
objCol01 := TBColumnNew("_C¢d_",{||TRANSFORM(DC(CODCLI),'99999')})
objCol01:Width := 05
objBr:addColumn(objCol01)
*
objCol02 := TBColumnNew("________________Cliente_________________",;
          {||TRANSFORM(DC(CLIENTE),'@!')})
objCol02:Width := 42  && 40
objBr:addColumn(objCol02)
*
objCol03 := TBColumnNew("F/J",{||TRANSFORM(DC(TIPO),'@R  ! ')})
objCol03:Width := 03
objBr:addColumn(objCol03)
*
objCol04 := TBColumnNew("SPC",{||TRANSFORM(DC(SPC),'!!!')})
objCol04:Width := 03
objBr:addColumn(objCol04)
*
objCol05 := TBColumnNew("___Fone__",{||TRANSFORM(DC(FONE1),'@R 9999-9999')})
objCol05:Width := 09
objBr:addColumn(objCol05)
*
objCol06 := TBColumnNew("_D‚bito Total_",;
          {||TRANSFORM(SALDO,'@E 999,999,999.99')})
objCol06:Width := 14
objBr:addColumn(objCol06)
*
objCol07 := TBColumnNew("D",{||TRANSFORM(DCTipo("C",SALDO),'!')})
objCol07:Width := 01
objBr:addColumn(objCol07)
*
objBr:colpos := INDEXORD()  && 1 OU 2, 3...
*
Direcao(nX1,nY1,nX2,nY2,25)
*
WHILE .T.
   WHILE (!objBr:stabilize())
      nTecla := INKEY()
      IF (nTecla != 0)
         EXIT
      END
   END
   IF (objBr:stable)
      IF     (objBr:hitTop)
         Beep(1)
         SETCOLOR(cCor5)
         Centro(24,"*** INICIO DE ARQUIVO ***")
         SETCOLOR(cCor0)
         INKEY(0)  && Tempo(nTempo)
      ELSEIF (objBr:hitBottom)
         Beep(1)
         SETCOLOR(cCor5)
         Centro(24,"*** FIM DE ARQUIVO ***")
         SETCOLOR(cCor0)
         INKEY(0)  && Tempo(nTempo)
      END
      SETCOLOR(cCor3)
      Centro(24,"<"+chr(24)+chr(25)+chr(27)+chr(26)+;
      "> <F12-Endere‡o P/NF> <Enter> <PgUp> <PgDn> <Esc>")
      SETCOLOR(cCor0)
      *
      CLEAR TYPEAHEAD
      *
      WHILE ((nTecla := INKEY(.5)) == 0)
         HoraData()
      END
      LimpaLinha(24)
   END
   *
   IF     nTecla == K_RETURN
      IF (objBr:stable)
         xcTela1 := SAVESCREEN(01,00,23,79)
         LVACli1()
         LVACli2()
       * TelaCli1()
       * MVMCli1()
       * IF (cTipo == "F")
       *    TelaCli2()
       *    MVMCli2()
       * END
         MDCli()
         RESTSCREEN(01,00,23,79,xcTela1)
      END
   ELSEIF nTecla == K_F12
      *
      cEscolha   := "S"
      cEndereco  := "COBRANCA   "
      *
    * cCodCli    := DC(CODCLI)
    * cCliente   := DC(CLIENTE)
    * cTipo      := DC(TIPO)
      *
      cTabela    := DC(TABELA)
      *
      cEndPed    := DC(END)
      cNumeroPed := DC(NUMERO)
      cComplPed  := DC(COMPL)
      cBairroPed := DC(BAIRRO)
      cCepPed    := DC(CEP)
      cCidPed    := DC(CID)
      cUfPed     := DC(UF)
      cDddPed    := DC(DDD)
      cFonePed   := DC(FONE1)
      *
      cCNPJPed   := DC(CNPJ)
      cInscPed   := DC(INSC)
      *
      nSaldoCli  := SALDO
      nLimite    := LIMITE
      *
      HoraData()
      SETCOLOR(cCor5)
Centro(24,"*** SELECIONADO ENDERECO DE COBRANCA. P/RETORNAR, TECLE <ESC> ***")
      SETCOLOR(cCor0)
      INKEY(0)
      *
   ELSEIF nTecla == K_ESC
      *
      cCodFor    := cCodCli    := DC(CODCLI)
      cFor       := cCliente   := DC(CLIENTE)
      cTipo      := DC(TIPO)
      *
      cTabela    := DC(TABELA)
      *
      IF     INDEXORD() == 1
         IF     cEndereco == "COBRANCA   "
            KEYBOARD CHR(K_CTRL_A) + CHR(K_CTRL_Y) + cCodCli + CHR(K_HOME)
         ELSEIF cEndereco == "PROPRIEDADE"
            KEYBOARD CHR(K_CTRL_A) + CHR(K_CTRL_Y) + cCodCli + CHR(K_HOME)
         ELSEIF cEndereco == SPACE(11)
            KEYBOARD CHR(K_CTRL_A) + CHR(K_CTRL_Y)
         END
      ELSEIF INDEXORD() == 2
         IF     cEndereco == "COBRANCA   "
            KEYBOARD CHR(K_CTRL_A) + CHR(K_CTRL_Y) + cCliente + CHR(K_HOME)
         ELSEIF cEndereco == "PROPRIEDADE"
            KEYBOARD CHR(K_CTRL_A) + CHR(K_CTRL_Y) + cCliente + CHR(K_HOME)
         ELSEIF cEndereco == SPACE(11)
            KEYBOARD CHR(K_CTRL_A) + CHR(K_CTRL_Y)
         END
      END
      EXIT
   ELSEIF nTecla == K_F1
   ELSEIF nTecla == K_F2
   ELSEIF nTecla == K_F3
   ELSEIF nTecla == K_F4
   ELSEIF nTecla == K_DOWN
      Direcao(nX1,nY1,nX2,nY2,25)
      objBr:down()
   ELSEIF nTecla == K_PGDN
      Direcao(nX1,nY1,nX2,nY2,25)
      objBr:pageDown()
   ELSEIF nTecla == K_CTRL_PGDN
      Direcao(nX1,nY1,nX2,nY2,25)
      objBr:goBottom()
   ELSEIF nTecla == K_UP
      Direcao(nX1,nY1,nX2,nY2,24)
      objBr:up()
   ELSEIF nTecla == K_PGUP
      Direcao(nX1,nY1,nX2,nY2,24)
      objBr:pageUp()
   ELSEIF nTecla == K_CTRL_PGUP
      Direcao(nX1,nY1,nX2,nY2,24)
      objBr:goTop()
   ELSEIF nTecla == K_RIGHT
      Direcao(nX1,nY1,nX2,nY2,26)
      objBr:right()
   ELSEIF nTecla == K_LEFT
      Direcao(nX1,nY1,nX2,nY2,27)
      objBr:left()
   ELSEIF nTecla == K_HOME
      Direcao(nX1,nY1,nX2,nY2,27)
      objBr:home()
   ELSEIF nTecla == K_END
      Direcao(nX1,nY1,nX2,nY2,26)
      objBr:end()
   ELSEIF nTecla == K_CTRL_LEFT
      Direcao(nX1,nY1,nX2,nY2,27)
      objBr:panLeft()
   ELSEIF nTecla == K_CTRL_RIGHT
      Direcao(nX1,nY1,nX2,nY2,26)
      objBr:panRight()
   ELSEIF nTecla == K_CTRL_HOME
      Direcao(nX1,nY1,nX2,nY2,27)
      objBr:panHome()
   ELSEIF nTecla == K_CTRL_END
      Direcao(nX1,nY1,nX2,nY2,26)
      objBr:panEnd()
   END
END  && WHILE .T.
*
Set(_SET_COLOR,cCor)
Set(_SET_INTENSITY,lIntensity)
Set(_SET_CURSOR,cCursor)
*
IF lUse  && SE EXISTIA ARQUIVO EM USO, RETORNA AO SELECT ANTERIOR ...
   SELECT &cSelect.
END
*
RESTSCREEN(01,00,23,79,xcTela)
*
HoraData()
Funcao(1)
SETCOLOR(cCor3)
IF INDEXORD() == 1
   Centro(24,"*** DIGITE O CODIGO DO CLIENTE  OU TECLE <F10> ***")
ELSEIF INDEXORD() == 2
   Centro(24,"*** DIGITE O CLIENTE  OU TECLE <F10> ***")
ELSEIF INDEXORD() == 3
   Centro(24,"*** DIGITE O ENDERECO  OU TECLE <F10> ***")
END
SETCOLOR(cCor2)
*
RETURN
***


(***)


PROCEDURE Direcao(nX1,nY1,nX2,nY2,nChr)
IF (VALTYPE(nChr) <> "N") .OR. (nChr == NIL)
   RETURN
END
SETCOLOR("+W/+W")  && cCor3
@ nX1+1,nY2+1,nX2,nY2+1 BOX "         "
FOR nI:=nX1+1 TO nX2
   @ nI,nY2+1 SAY "±"
NEXT
SETCOLOR("W*+/W")
@ nX1+1,nY2+1 SAY ""+CHR(nChr)+""
@ nX2,nY2+1   SAY ""+CHR(nChr)+""
SETCOLOR(cCor0)
RETURN
***
Atenciosamente,
Janis Peters Grants.

Skype: gransoft
http://www.gransoft.com.br
gransoft@zipmail.com.br

Olha, amigo,
Para mim, que tenho bastane limitação na linguagem, tá dificílimo entender essa rotina. Mas, vou ficar analizando ela.
Mas, não há algo mais simples.
Eu só quero digitar uma palavra ou duas, e pesquisar apresentando dois ou tres campos do dbf, podendo rolar e apresentar fazer os meus gets da tela receber os dados relacionados ao registro que eu escolher.
É assim. Na tela de cadastro, quando chega em um campo chave, eu aperto uma tecla para ver se já não há o registro. Como pode aparecer vários campos iguais (por exemplo, sendo nome, eu digitando o nome, apareceria vários nomes, pois há vários nomes iguais, mas viria também a data de nascimento, o que ajudaria a diferenciar na escolha). Aí, eu faço os campos aparecer na tela.
Seria tão penoso conseguir isso?

Eu tentei com DBEDIT, mas veio todos os registros.
Não dá para vir somente alguns por alguma condiçao?
Veja o que fiz:
CLS
USE REGISTRO
CRO = REPLICATE('.',10)
PRIVATE V1[3]
V1[01] = "MATRICULA"
V1[02] = "NOME"
V1[03] = "DATA"
@ 05,05 SAY "CROND.:" GET CRO PICT "@!"
READ
LOCATE FOR CRONDALFA = CRO
@ 09,04 TO 21,71
SAVE SCREEN TO SC
IF FOUND()
DBEDIT(10,05,20,70,V1,"PESQ")
ELSE
@ 07,05 SAY "NAO FOI"
ENDIF

FUNCTION PESQ
SETCOLOR("N/W")
IF LASTKEY() = 13
@ 10,10 SAY MATRICULA
@ 12,10 SAY NOME
ENDIF
IF LASTKEY() = 27
RETURN(0)
CLS
ENDIF
Glauco Cruz Costa
Usuário Nível 3
Usuário Nível 3
Mensagens: 102
Registrado em: 15 Dez 2005 22:02
Localização: Brasília/DF
Contato:

Mensagem por Glauco Cruz Costa »

Será que é possível, filtrar o bdedit, ou seja, colocar uma opção para ele abrir arquivos com determinada condição?
Avatar do usuário
acelconsultoria
Usuário Nível 3
Usuário Nível 3
Mensagens: 231
Registrado em: 10 Jan 2006 17:05
Localização: Itápolis-SP

Mensagem por acelconsultoria »

Dá sim.... é só colocar o SET FILTER TO.... antes de chamar a função DBEDIT().
Glauco Cruz Costa
Usuário Nível 3
Usuário Nível 3
Mensagens: 102
Registrado em: 15 Dez 2005 22:02
Localização: Brasília/DF
Contato:

Mensagem por Glauco Cruz Costa »

acelconsultoria escreveu:Dá sim.... é só colocar o SET FILTER TO.... antes de chamar a função DBEDIT().
Oi, amigo, valeu.
Só que tá ocorrendo um probleminha.
Os registros que eu coloquei para filtrar, estão aparecendo duplicados na tela do DBEDIT. O que pode ser?
Veja o exemplo, que estou testando:
...
READEXIT(.T.)
CLS
USE REGISTRO SHARED NEW
PRIVATE V1[3]
V1[01] = "MATRICULA"
V1[02] = "NOME"
V1[03] = "DATA"
@ 05,05 SAY "CRONDALFA.:" GET CRO PICT "@!"
READ
SET FILTER TO CRONDALFA = CRO
@ 09,04 TO 21,71
SAVE SCREEN TO SC
DBEDIT(10,05,20,70,V1,"PESQ")

FUNCTION PESQ
IF LASTKEY() = 13
CLS
@ 10,10 SAY MATRICULA
@ 12,10 SAY NOME
RETURN(0)
ENDIF
IF LASTKEY() = 27
RETURN(0)
CLS
ENDIF
Stanis Luksys
Colaborador
Colaborador
Mensagens: 1329
Registrado em: 18 Jun 2005 03:04
Localização: São Paulo
Contato:

Mensagem por Stanis Luksys »

Olá,

Eu desenvolvi uma função que cria automaticamente um objeto TBrowse e permite a pesquisa letra a letra.

No meu caso eu não uso o filtro, assim se o cara digitar "B" ele pode apertar a seta para cima e ir para o ultimo "A", eu considero assim melhor do que filrando...

Ela funciona assim:

Você passa como parametros o arquivo a ser usado, um array de campos que devem aparecer na tabela (sendo que o primeiro deste array deve ser a chave do indice), e o campo cujo seu valor deve ser retornado pela função.

Da uma olhada em como fica a chamada a esta função:

Código: Selecionar todos

/***
*
*  Compilar: /n
*  Linkar:   linkador file Exemplo, LSBrowse
*
*/

Function Main()

   local cCodigo

   cls

   use clientes
   index on nome to clientes

   cCodigo := LSBrowse ( 3, 5, 20, 74, "clientes", {"nome","endereco","telefone"},;
                   "codigo", "w+/b,w+/bg" )
   
   Alert ( AllTrim( cCodigo ) )
   
   close clientes

   Return ( NIL )
Explicando melhor os parametros:

Os 4 primeiros são as coordenadas ;
"clientes" é o alias do arquivo a ser usado ;
{"nome","endereco","telefone"} são os campos a serem exibidos, sendo que o campo nome é chave no índice e é através dele que será feita a pesquisa letra a letra ;
"codigo" e o campo que será retornado, neste caso atribuido a variavel cCodigo;
"w+/b,w+/bg" são as cores...

Bem, está testado e aprovado com NTX e CDX em Clipper 5.2, 5.3 Harbour e xHarbour...

Se for mais ou menos isso que vc quer posso te enviar...
Stanis Luksys
sites.google.com/hblibs

Apoiar e se utilizar de projetos opensource não é uma questão de boicote, mas sim de liberdade.
Utilize, aprimore e distribua.
Avatar do usuário
acelconsultoria
Usuário Nível 3
Usuário Nível 3
Mensagens: 231
Registrado em: 10 Jan 2006 17:05
Localização: Itápolis-SP

Glauco

Mensagem por acelconsultoria »

Eu adicionei um DBGOTOP() na sua rotina, depois do SET FILTER. E pelo jeito esse deve ser o problema.

@ 05,05 SAY "CRONDALFA.:" GET CRO PICT "@!"
READ
SET FILTER TO CRONDALFA = CRO
DBGOTOP()
IF !(CRONDALFA = CRO) ; SKIP ; ENDIF

@ 09,04 TO 21,71
SAVE SCREEN TO SC
DBEDIT(10,05,20,70,V1,"PESQ")

Tente agora, Glauco.

Maickon Sato
Acel Consultoria e Projetos
Glauco Cruz Costa
Usuário Nível 3
Usuário Nível 3
Mensagens: 102
Registrado em: 15 Dez 2005 22:02
Localização: Brasília/DF
Contato:

Re: Glauco

Mensagem por Glauco Cruz Costa »

acelconsultoria escreveu:Eu adicionei um DBGOTOP() na sua rotina, depois do SET FILTER. E pelo jeito esse deve ser o problema.

@ 05,05 SAY "CRONDALFA.:" GET CRO PICT "@!"
READ
SET FILTER TO CRONDALFA = CRO
DBGOTOP()
IF !(CRONDALFA = CRO) ; SKIP ; ENDIF

@ 09,04 TO 21,71
SAVE SCREEN TO SC
DBEDIT(10,05,20,70,V1,"PESQ")

Tente agora, Glauco.

Maickon Sato
Acel Consultoria e Projetos
É Maickon, é isso mesmo. Valeu.
Agora, mudando um pouco de assunto, você pode-me explicar a diferença de dbgotop() para go top?
Obrigado.
Avatar do usuário
rochinha
Administrador
Administrador
Mensagens: 4664
Registrado em: 18 Ago 2003 20:43
Localização: São Paulo - Brasil
Contato:

Mensagem por rochinha »

Amiguinho

A diferença esta no modo de escrever, fazem a mesma coisa, vão ao topo da tabela.

O fato de se usar dbGoTop(), dbBlaBlaBla() somente faz com que a compilação fique mais rápida, pois o Clipper não precisará procurar nos arquivos .CH o que significa GO TOP e traduzilo para dbGoTop().

Compile um arquivo qualquer com /P e ve o resultado, exemplo:

CLIPPER arquivo /P

EDIT arquivo.PPO

.PPO é a extensão de arquivo Pre-Preocessado.

A vantagem de se usar as funções dbBlaBlaBla(0 é que voce poderá aninhar várias delas em codeblock.

Voce pode usar assim os seus comandos:

USE arquivo
SET ORDER TO arquivo1
GO TOP
SEEK campo
RLOCK()
REPLACE campo WITH "teste"
COMMIT

Ou

USE arquivo; SET ORDER TO arquivo1; GO TOP; SEEK campo; RLOCK(); REPLACE campo WITH "teste"; COMMIT

Ou

dbUseArea( ... )
dbSetOrder( arquivo1 )
dbGoTop()
dbSeek( campo )
dbRLock()
dbReplace( ... )
dbCommitAll()

Legau né?

@braços :?)
Responder