Tbrowser

Projeto [x]Harbour - Compilador de código aberto compatível com o Clipper.

Moderador: Moderadores

jelias
Usuário Nível 3
Usuário Nível 3
Mensagens: 260
Registrado em: 27 Ago 2008 11:32
Localização: Minas Gerais

Tbrowser

Mensagem por jelias »

Amigos,

Tenho em meu sistema uma rotina onde são cadastrados os pedidos de vendas, que é controlado por um TBROWSER.
O conteúdo dos itens devem obedecer a seguinte condição: ( CodigodoPedido + CodigodoCliente ).
Esporadicamente o último item cadastrado para um pedido aparece na estação de outra vendedora no ato do cadastro de um novo pedido.
Por várias vezes já fiz a leitura das rotinas e não encontro o problema.
Todos os indices estão devidamente abertos. Estou usando xHarbour 1.2.1 (Simplex) (Rev. 9421) / Borland C++ 5.8.2 (32 bits) / DBFCDX

Estou desconfiado que o problema está aqui:

Código: Selecionar todos

				 //// Rela‡äes ////
   sele AL_ITPED // Itens do Pedido
   DBSETORDER(1)
   ORDSCOPE(0,v_codp+v_codc) // v_codp = Codigo do pedido     / v_codc = Codigo do Cliente
   ORDSCOPE(1,v_codp+v_codc)

                                  ///// FIM //////
   sele AL_ITPED
   DBSETORDER(1)

   bfirst := {|| DBSEEK(v_codp+v_codc) }
   blast  := {|| DBSEEK(v_codp+v_codc, .T.), DBSKIP(-1)}
   bwhile := {|| AL_ITPED->CODPED = v_codp .and. AL_ITPED->CODCLI = v_codc}
   bfor   := {|| .T. } 
Saudações,

Júlio.
xHarbour 1.2.1 (simplex) + BCC 5.8.2 + Hwgui + SQLRDD
Clipper 5.2e / Blinker 7
Júlio Cézar Elias
e-mail: jelias@tpnet.psi.br
alxsts
Colaborador
Colaborador
Mensagens: 3092
Registrado em: 12 Ago 2008 15:50
Localização: São Paulo-SP-Brasil

Tbrowser

Mensagem por alxsts »

Olá!

Parece que você está usando o código que veio no livro do Rick Spence. Já usei e é muito bom!

Naquele código, ele usa uma pseudo-função chamada IncLast() para setar o limite inferior do filtro. Não vi isso no teu código.

Pelo trecho postado, creio que o problema é que as condições de filtro estão invertidas. Tente colocar assim:

Código: Selecionar todos

bwhile := {|| .T. }
bfor   := {|| AL_ITPED->CODPED = v_codp .and. AL_ITPED->CODCLI = v_codc}
[]´s
Alexandre Santos (AlxSts)
jelias
Usuário Nível 3
Usuário Nível 3
Mensagens: 260
Registrado em: 27 Ago 2008 11:32
Localização: Minas Gerais

Tbrowser

Mensagem por jelias »

Amigo Alexandre obrigado pela ajuda.
alxsts escreveu:Parece que você está usando o código que veio no livro do Rick Spence. Já usei e é muito bom!
Naquele código, ele usa uma pseudo-função chamada IncLast() para setar o limite inferior do filtro. Não vi isso no teu código.
Em suas palavras puder perceber que a maneira que estou usando o TBROWSER em meus sistemas está diferentes do amigo. :)
Sou muito grato aos amigos deste fórum que fez renascer em mim o amor que sinto pelo xBase e hoje voltando a programar encontrei tempo para novos projetos. Aproveito para compartilhar meu código para que possam dizer se está correto ou se existe um método mais fácil e eficaz.

Na grande maioria dos meus TBROWSER's é necessário fazer um filtro antes e controlar a apresentação dos dados somente da condição pré-estabelecida.

Código: Selecionar todos

			 //// Rela‡äes ////
   sele AL_ITPED
   DBSETORDER(1)
   ORDSCOPE(0,v_codp+v_codc)
   ORDSCOPE(1,v_codp+v_codc)

                                  ///// FIM //////
   sele AL_ITPED
   DBSETORDER(1)

   bfirst := {|| DBSEEK(v_codp+v_codc) }
   blast  := {|| DBSEEK(v_codp+v_codc, .T.), DBSKIP(-1)}
   bwhile := {|| AL_ITPED->CODPED = v_codp .and. AL_ITPED->CODCLI = v_codc}
   bfor   := {|| .T. }

   SETCOLOR("b+/b,w+/,,,n/bg")
   aMensagem := { "<INS>-Inclus„o <ENTER>-Altera <DEL>-Exclus„o <F2>-NF. <F5>-MÆo-de-Obra","<F6>-Autoriza‡Æo <F7>-Recal/PG <F8>-Classif.<F9>-Desc.<F10>-KIT <F11>=TP <F12>"}
   aCoordenadas:={09,01,21,78}
   @ aCoordenadas[1]-1, aCoordenadas[2]-1, aCoordenadas[3]+2+LEN(aMensagem), aCoordenadas[4]+1 BOX cBox1
   @ 21,01 say REPL("Ü",78)
   SETCOLOR("w+/b,w+/,,,n/bg")
   IF VALTYPE(aMensagem) == "A"
      FOR I := 1 TO LEN(aMensagem)
          @ aCoordenadas[3]+1+I, aCoordenadas[2] SAY PADC(aMensagem[I],aCoordenadas[4]-aCoordenadas[2]+1) COLOR "W/B"
      NEXT
   ENDIF

   oTab := MyBrowser( bWhile,bFor,bFirst,bLast, aCoordenadas[1], aCoordenadas[2], aCoordenadas[3]-2, aCoordenadas[4] )
   oTab:colsep := " Û "
   oTab:headsep:= "ßÛß"
   FOR I = 1 TO LEN( aCamp )
     IF VALTYPE(aCamp[I]) == "B"
        oCol:=TBcolumnNew( aCab[I], ( aCamp[I] ) )
     ELSE
        oCol:=TBcolumnNew( aCab[I], FIELDWBLOCK( aCamp[I], SELECT()))
     ENDIF
     oTab:addColumn( oCol )
   NEXT

   @ oTab:nTop   +2, oTab:nRight+1 SAY chr(30) COLOR Cor(21)
   @ oTab:nBottom  , oTab:nRight+1 SAY chr(31) COLOR Cor(21)
   @ oTab:nBottom+1, oTab:nRight+1 SAY ""     COLOR Cor(22)
   @ oTab:nBottom+1, oTab:nLeft -1 SAY ""     COLOR Cor(22)

   SCROLL_UP    := { oTab:nTop   +2, oTab:nRight+1, oTab:nTop   +2, oTab:nRight+1 } ; SCROLL_DOWN  := { oTab:nBottom  , oTab:nRight+1, oTab:nBottom  , oTab:nRight+1 }
   SCROLL_LEFT  := { oTab:nBottom+1, oTab:nRight+1, oTab:nBottom+1, oTab:nRight+1 } ; SCROLL_RIGHT := { oTab:nBottom+1, oTab:nLeft -1, oTab:nBottom+1, oTab:nLeft -1 }
   nCol_Reg := (oTab:nRight-oTab:nLeft+2) / LEN(aCamp)
   nvAlt:=.F.
   DO WHILE .T.
      aCoordenadas:={08,01,21,78}
      aTeclas   := { ;
                   { K_INS    , "P_INSERE(v_codp,v_codc)"   } ,;
                   { K_DEL    , "DELREGISTRO()"             } ,;
		   { K_ENTER  , "ALTERAREG(v_codp,v_codc)"  } ,;
                   { K_F1     , "HELP()"                    } ,;
                   { K_F2     , "NOTAF()"                   } ,;
                   { K_F3     , "CALEN()"                   } ,;
                   { K_F4     , "CALCU()"                   } ,;
                   { K_F5     , "MAOOBRA()"                 } ,;
                   { K_F6     , "BAIXAITENS(v_codp,v_codc)" } ,;
                   { K_F7     , "PAGTOS()"                  } ,;
                   { K_F8     , "CLASSIF()"                 } ,;
                   { K_F9     , "DESCONTO()"                } ,;
		   { K_F10    , "IMPORTAKIT(v_codp,v_codc)" } ,;
		   { K_F11    , "TEMPO(v_codp+v_codc,v_codp,v_codc)"      } ,;
		   { K_F12    , "QUADRO()"                  } }

      SETCOLOR("w+/b,w+/,,,n/bg")
      @ 21,01 say "IT->"+TRANS(AL_PEDID->QTDITE,"9999")+" OR->"+TRANS(AL_PEDID->ORCADO,"9,999,999.99")+" MO->"+TRANS(AL_PEDID->AMAOBR,"999,999.99")+" DE->"+TRANS(AL_PEDID->DESCON,"999,999.99")+;
      "  TOTAL-> "+TRANS( ( (AL_PEDID->ORCADO+AL_PEDID->AMAOBR)-AL_PEDID->DESCON),"99,999,999.99")
      @ oTab:nBottom+1,oTab:nLeft SAY REPLICATE("°",oTab:nRight-oTab:nLeft+1) COLOR Cor(28)
      nCol_ := oTab:nLeft+IF(ROUND((nCol_Reg*(oTab:colpos-1)),0)<=0,0,IF(oTab:colpos>=LEN(aCamp),LEN(aCamp)*nCol_Reg,ROUND(nCol_Reg*(oTab:colpos-1),0)))
      @ oTab:nBottom+1,IF(nCol_+nCol_Reg>oTab:nRight,nCol_:=oTab:nRight-ROUND(nCol_Reg,0)+1,nCol_) SAY REPLICATE("Û",ROUND(nCol_Reg,0)) COLOR Cor(29)
      oTab:refreshAll()
      oTab:COLORRECT({oTab:rowpos,1,oTab:rowpos,oTab:COLCOUNT},{1,2})
      DO WHILE ! oTab:stabilize()
         nKey := inkey()
         IF nKey <> 0 .AND. nKey <> K_ENTER
            EXIT
         ENDIF
      ENDDO
      nvAlt:=.F.
      IF oTab:stable
         nRow := ROW()
         nCol := COL()
         oTab:COLORRECT({oTab:ROWPOS,1,oTab:ROWPOS,oTab:COLCOUNT}, {5,2})
	 oTab:hilite()
         DO WHILE ! oTab:stabilize() ; ENDDO
         IF oTAB:hitbottom  ; BEEP() ; Mensagem("Atingiu o final do arquivo",2) ; SETCURSOR(0) ; ELSEIF oTAB:hittop ; BEEP() ; Mensagem("Atingiu o in¡cio do arquivo",2) ; SETCURSOR(0) ; ENDIF
	 SETPOS( nRow, nCol )
         nKey := 0
         DO WHIL nKey == 0 ; nKey := Minkey(5, @nMRow, @nMCol, .T.) ; ENDDO
         DO WHILE (!oTab:Stabilize())  ; ENDDO
      ENDIF
      IF     nKey == K_UP         ; oTab:UP()
      ELSEIF nKey == K_DOWN       ; oTab:DOWN()
      ELSEIF nKey == K_LEFT       ; oTab:LEFT()
      ELSEIF nKey == K_CTRL_LEFT  ; oTab:PANLEFT()
      ELSEIF nKey == K_RIGHT      ; oTab:RIGHT()
      ELSEIF nKey == K_CTRL_RIGHT ; oTab:PANRIGHT()
      ELSEIF nKey == K_PGUP       ; oTab:PAGEUP()
      ELSEIF nKey == K_CTRL_PGUP  ; oTab:GOTOP()
      ELSEIF nKey == K_PGDN       ; oTab:PAGEDOWN()
      ELSEIF nKey == K_CTRL_PGDN  ; oTab:GOBOTTOM()
      ELSEIF nKey == K_HOME       ; oTab:HOME()
      ELSEIF nKey == K_CTRL_HOME  ; oTab:PANHOME()
      ELSEIF nKey == K_END        ; oTab:END()
      ELSEIF nKey == K_CTRL_END   ; oTab:PANEND()
      ELSEIF nKey == K_ESC        ; EXIT
      ELSEIF nKey == M_LEFT
          IF     InRegion(SCROLL_UP)    ; oTab:Up()
          ELSEIF InRegion(SCROLL_DOWN)  ; oTab:Down()
          ELSEIF InRegion(SCROLL_LEFT)  ; oTab:Right()
          ELSEIF InRegion(SCROLL_RIGHT) ; oTab:Left()
          ELSEIF InRegion(oTab:nTop, oTab:nLeft, oTab:nBottom, oTab:nRight)
               nLeftCol := oTab:leftVisible ; nLeftCol := IF(nLeftCol == 0, 1, nLeftCol) ; nOffset  := oTab:nLeft + oTab:colWidth(nLeftCol) + len(oTab:colSep) ; nPlace   := 0
               WHILE nMCol > nOffset ; nPlace++ ; nOffset += oTab:colWidth(nLeftCol + nPlace) + len(oTab:colSep) ; ENDDO
               nRow := 1 + nMRow - oTab:nTop - 2 ; oTab:dehilite() ; oTab:colPos := nLeftCol + nPlace ; oTab:rowPos := nRow
          ENDIF
      ELSE
         IF VALTYPE(aTeclas) == "A"
            nPosicao := ASCAN(aTeclas, { | a | nKey  == a[1] } )
            IF nPosicao # 0
               gTela=SAVESCREEN(00,00,24,79)
	       if (nPosicao==1 .and. AL_PEDID->impres#"*")
                  P_INSERE(v_codp,v_codc)
	       elseif (nPosicao==2 .and. AL_PEDID->impres#"*")
                  DELREGISTRO()
	       elseif (nPosicao==3 .and. AL_PEDID->impres#"*")
		  ALTERAREG(v_codp,v_codc)
		  nvAlt:=.T.
               elseif nPosicao==4
                  HELP()
               elseif nPosicao==5
                  NOTAFI(v_codp,v_codc)
	       elseif (nPosicao==6 .and. AL_PEDID->impres#"*")
                  CALEN()
	       elseif (nPosicao==7 .and. AL_PEDID->impres#"*")
                  CALCU()
	       elseif (nPosicao==8 .and. AL_PEDID->impres#"*")
                  MAOOBRA()
               elseif nPosicao==9
		  BAIXAITENS(v_codp,v_codc)
	       elseif (nPosicao==10 .and. AL_PEDID->impres#"*")
                  PAGTOS()
	       elseif (nPosicao==11)
		  // Retirei a trava a pedido a Ivania
                  CLASSIF()
	       elseif (nPosicao==12 .and. AL_PEDID->impres#"*")
                  DESCONTO()
	       elseif (nPosicao==13 .and. AL_PEDID->impres#"*")
		  IMPORTAKIT(v_codp,v_codc)
               elseif nPosicao==14
		  TEMPO(v_codp+v_codc,v_codp,v_codc)
	       elseif (nPosicao==15 .and. AL_PEDID->impres#"*")
		  QUADRO()
               end
	       RESTSCREEN(00,00,24,79,gTela)
	       sele AL_ITPED
	       DBSETORDER(1)
	       oTab:GoTop()
	       oTab:PanHome()
	       Establ()
            ENDIF
            SET CURSOR OFF
         ENDIF
      ENDIF
   ENDDO
   RESTSCREEN(00,00,24,79,cArea)
   SETCOLOR(cCorUso)
   SETCURSOR(1)
ENDDO
RETURN NIL

***************************************************************************
STATIC FUNCTION Establ()
SET CURSOR OFF
oTab:refreshAll()
DO WHILE ( !oTab:stabilize() ); ENDDO
RETURN NIL
Aqui está o MYBROWSER.PRG.

Código: Selecionar todos

FUNCTION MYBROWSER(bwhile,bFor,bFirst,bLast,L1,C1,L2,C2)
# define DB_NUM_VARS 7
#translate :while      => :cargo\[1\]
#translate :for        => :cargo\[2\]
#translate :gofirst    => :cargo\[3\]
#translate :golast     => :cargo\[4\]
#translate :appendmode => :cargo\[5\]

LOCAL OTBR       := TBROWSENEW(L1,C1,L2,C2)
COR("BROWSE")
OTBR:cargo       := ARRAY(DB_NUM_VARS)
OTBR:while       := bwhile
OTBR:for         := bfor
OTBR:gofirst     := bfirst
OTBR:golast      := blast
OTBR:appendmode  := .F.

OTBR:gotopblock    := {|| TBFIRST(OTBR)}
OTBR:gobottomblock := {|| TBLAST(OTBR)}
OTBR:skipblock     := {|N| DBSKIPBLOCK(n,OTBR)}
OTBR:GOTOP()

RETURN OTBR

*************************************************************************
STATIC FUNCTION TBFIRST(OTBR)
EVAL(OTBR:gofirst)
do while !EOF() .and. EVAL(OTBR:while) .and. !EVAL(OTBR:for)
   skip
enddo

if EOF() .or. !EVAL(OTBR:while)
   goto 0
endif

RETURN NIL

STATIC FUNCTION TBLAST(OTBR)
if OTBR:appendmode
   goto 0
else
   EVAL(OTBR:golast)
endif

do while !bof() .and. eval(OTBR:for) .and. eval(OTBR:while) .and. ;
   skip -1
enddo

if bof() .or. !eval(OTBR:while)
   goto 0
endif

return NIL

**************************************************************************
STATIC FUNCTION DBSKIPBLOCK(N,OTBR)
local NSKIMCC := 0

if N = 0
   skip 0
elseif N > 0
   do while NSKIMCC != N .and. TBNEXT(OTBR)
      NSKIMCC = NSKIMCC + 1
   enddo
else
   do while NSKIMCC != N .and. TBPREV(OTBR)
      NSKIMCC = NSKIMCC - 1
   enddo
endif

return NSKIMCC

**************************************************************************
STATIC FUNCTION TBNEXT(OTBR)
local NSAVERECNUM := recno()
local LMOVED := .T.

if eof()
   LMOVED := .F.
else
   skip
   do while !eval(OTBR:for) .and. eval(OTBR:while) .and. !eof()
      skip
   enddo
   if eof() .and. OTBR:appendmode
      // fine
   elseif !eval(OTBR:while) .or. eof()
       if !eval(OTBR:while) .and. OTBR:appendmode
          goto 0
       else
          LMOVED := .F.
          goto NSAVERECNUM
       endif
   endif
endif

return LMOVED

*************************************************************************
STATIC FUNCTION TBPREV(OTBR)
local NSAVERECNUM := recno()
local LMOVED      := .T.

if eof()
   eval(OTBR:golast)
else
   skip -1
endif

do while !eval(OTBR:for) .and. eval(OTBR:while) .and. !bof()
   skip -1
enddo

if !eval(OTBR:while) .or. bof()
   goto NSAVERECNUM
   LMOVED := .F.
endif

return LMOVED
Saudações,

Júlio.
xHarbour 1.2.1 (simplex) + BCC 5.8.2 + Hwgui + SQLRDD
Clipper 5.2e / Blinker 7
Júlio Cézar Elias
e-mail: jelias@tpnet.psi.br
jelias
Usuário Nível 3
Usuário Nível 3
Mensagens: 260
Registrado em: 27 Ago 2008 11:32
Localização: Minas Gerais

Tbrowser

Mensagem por jelias »

Amiguinhos,

Fiz algumas pesquisas aqui no fórum mais não consegui sanar minha dúvida quanto ao melhor método de usar o TBROWSE. Entretanto, pude perceber que os colegas usam a classe TbrowseDB() e estou usando TbrowseNew().

Se alguém puder me ajudar a entender melhor e me orientar quanto ao método correto, agradeço muito.

Sds,

Júlio
xHarbour 1.2.1 (simplex) + BCC 5.8.2 + Hwgui + SQLRDD
Clipper 5.2e / Blinker 7
Júlio Cézar Elias
e-mail: jelias@tpnet.psi.br
Avatar do usuário
Pablo César
Usuário Nível 7
Usuário Nível 7
Mensagens: 5312
Registrado em: 31 Mai 2006 10:22
Localização: Curitiba - Paraná

Tbrowser

Mensagem por Pablo César »

Para definições leia o Harbour Reference Guide do Gionanni Maria:

TBrowseDB

TBrowseNew

Eu acostumava utilizar TBrowseDB para acessar diretamente no arquivo dbf e TBrowseNew quando tinha que fazer TBrowse de vetores.
Um clip-abraço !

Pablo César Arrascaeta
Compartilhe suas dúvidas e soluções com todos os colegas aqui do fórum.
Evite enviar as dúvidas técnicas por MPs ou eMails, assim todos iremos beneficiar-nos.
Responder