Página 1 de 1

TBROWSE x DBEDIT

Enviado: 26 Nov 2015 11:40
por EANDRIOLI
Amigos,

Tenho a seguinte situação:

Estou fazendo alterações no meu sistema que usa o DBEDIT devido a ficar super lento na abertura de arquivos maiores.

A princípio vi exemplos no fórum PC-TOLEDO e fiz dessa forma:

Código: Selecionar todos


PRIV aCampos:={{"codigo","999999","Código"},;
               {"data","999999","Aquisiçao"},;
               {"modelo","@!","Modelo e Descriçao do Veiculo"},;
               {"ano","9999","Ano/Mod"},;
               {"left(cor,4)","@!","Cor"},;
               {"vlr_venda","@E 999,999.99","Valor (V)"}}

J_ANELA(2,1,18,78,"B+/BG","N/BG","W/BG","VEICULOS LIBERADOS PARA VENDA")
BRW_ARQ(2,1,18,78,aCampos)

Observei que os campos entre as colunas ficam com espaços sobrando, coisa que não ocorrendo quando uso o DBEDIT, vejam o PRG:

Código: Selecionar todos

WIN(2,0,21,78,"VE╓CULOS LIBERADOS PARA VENDA",'GR+/N+*','N+*/W')
SET COLOR TO "N*/W,W+/W+"                                
@03,1 SAY "CαDIGO│ AQUISIÇ╟O │ MODELO                         │ ANO/MOD │COR │ VALOR (V)"
@04,1 SAY "──────┼───────────┼────────────────────────────────┼─────────┼────┼──────────"
                                                                               
@19,1 SAY "──────┴───────────┴────────────────────────────────┴─────────┴────┴──────────"
SET COLOR TO "N*/W,GR+/N"

DECLARE array_lan[1]
array_lan[1] :='TRANS(codigo,"999999")+"│ "+DTOC(data)+"│ "+modelo+" │"+ano+"│"+LEFT(cor,4)+"│"+TRANS(ABS(vlr_venda),"@E 999,999.99")'
KEYBOARD CHR(176)
letra := ""
DBGOTOP()
DBEDIT(05,1,18,77,array_lan,"colunas",,"","")

No exemplo acima podemos colocar barras separadoras e elas ficam bem "juntas" aos campos, podemos ou não colocar espaços.

* Outra coisa é que posso usar uma FUNCTION no DBEDIT, no exemplo uso a Função "colunas".

Como fazer isso no TBROWSE ?

ERASMO ANDRIOLI

TBROWSE x DBEDIT

Enviado: 26 Nov 2015 12:33
por JoséQuintas
Simplificando:
Ao usar dbEdit() está usando TBrowse(), pois ele usa TBrowse()

No dbEdit() usou uma única coluna com tudo, no TBrowse() usou uma coluna pra cada informação, por isso ficou diferente.

Talvez o próprio fonte do dbEdit() sirva de exemplo.
Para o TBrowse() é você quem cria o fonte, inclusive pra chamar função, acaba sendo bem mais flexível.

Nota:
O lado ruim de colocar tudo numa única coluna é que pode ter problemas depois com codepage, para as barras verticais.
Além disso, separando em colunas, o ajuste é automático de acordo com a área disponível.

Pra ficar igual ao dbEdit, só fazer igual ao dbEdit: somente 1 coluna.

Código: Selecionar todos

oCampos := { ;
     {  "CαDIGO│ AQUISIÇ╟O │ MODELO            │ ANO/MOD │COR │ VALOR (V)", ;
  { || TRANS(codigo,"999999")+"│ "+DTOC(data)+"│ "+modelo+" │"+ano+"│"+LEFT(cor,4)+"│"+TRANS(ABS(vlr_venda),"@E 999,999.99") } }

TBROWSE x DBEDIT

Enviado: 26 Nov 2015 12:56
por JoséQuintas
Lembrando: a vantagem do codeblock é que está colocando um fonte compilado, o que deixa mais flexível.
Por exemplo poderia fazer assim:

Código: Selecionar todos

cTitulo :=  "CαDIGO│ AQUISIÇ╟O │ MODELO      │ ANO/MOD │COR │ VALOR (V)"
oCampos := { ;
   { cTitulo, { || Rotinacampos() } }
...

STATIC FUNCTION RotinaCampos()
   LOCAL cText := ""
   cText += Transform( código, "999999" )
   cText += "| "
   cText += Dtoc( Data )
   cText += "| "
   cText += Modelo
   cText += "| "
   cText += Ano
   cText += "| "
   cText += Left( Cor, 4 )
   cText += "| "
   cText += Transform( Abs( Vlr_Venda ), "@E 999,999.99" )
   RETURN cText
A função vai ser executada a cada coluna, pra mostrar o conteúdo.

TBROWSE x DBEDIT

Enviado: 26 Nov 2015 17:05
por EANDRIOLI
Então Mestre...

ficou assim:

Código: Selecionar todos

WIN(2,1,18,78,"VE╓CULOS LIBERADOS PARA VENDA",'GR+/N+*','N+*/W')
DBGOTOP()

PRIV aCampos:={{"codigo","999999","Código"},;
               {"data","999999","Aquisiçao"},;
               {"modelo","@!","Modelo e Descriçao do Veiculo"},;
               {"ano","9999","Ano/Mod"},;
               {"left(cor,4)","@!","Cor"},;
               {"vlr_venda","@E 999,999.99","Valor (V)"}}

BRW_ARQ(2,1,18,78,aCampos)

DESKTOP()
RSTENV(TEL_EST)
SET FILTER TO
RETURN
Só que o sistema continua mostrando espaços nas colunas e não consigo colocar os simbolos "|" entre os campos.

Segue a parte do TBROWSE que mostra a tabela...

Código: Selecionar todos

*--------------
PROC BRW_ARQ
*--------------
PARAMETERS brw_ls,brw_cs,brw_li,brw_ci,brw_campos
brw:=TBrowseNew(brw_ls+1,brw_cs+1,brw_li-1,brw_ci-1)

brw:colorspec := "W+/B,G+/B,GR+/B,R+/B,GB+/B,RB+/B,W+/G,R*/B"
brw:headsep:=chr(205)+chr(209)+chr(205)
brw:colsep:=" "+chr(179)+" "
brw:gotopblock({|| dbGoTop()})
brw:gobottomblock({|| dbGoBottom()})
brw:skipblock({|_1| MOV_PTR(_1)})
        
FOR i_=1 TO LEN(brw_campos)
 cp_titu:=brw_campos[i_,3]
 cp_masc:=brw_campos[i_,2]
 cp_:=brw_campos[i_,1]
 brw:addcolumn(tbcolumnnew(cp_titu,&("{||TRAN("+cp_+",["+cp_masc+"])}")))
 brw:getcolumn(i_):width := LEN(TRAN(&cp_.,cp_masc))
 brw:getcolumn(i_):colorblock=&("{||IF(cor='X',{1,4},{5,4})}")
NEXT

volta_db=.t.

DO WHILE volta_db
   SETCOLOR("W+/B")
   SET CURSO OFF
   DO WHILE !brw:stabilize() .AND. NEXTKEY()=0
   ENDD
   READINSERT(.f.)
   x_ = COL() ; y_ = ROW()
   tecl_p=INKEY(0)
   carac_ = UPPER(CHR(tecl_p))
   SET CURSO ON
   brw:dehilite()
   DO CASE
         CASE tecl_p = K_ESC
            volta_db=.f.
         CASE tecl_p = K_UP
              brw:up()
         CASE tecl_p = K_DOWN
            brw:down()
         CASE tecl_p = K_RIGHT
            brw:right()
         CASE tecl_p = K_LEFT
            brw:left()
         CASE tecl_p = K_HOME
            brw:home()
         CASE tecl_p = K_END
            brw:end()
         CASE tecl_p = K_PGUP
            brw:pageup()
         CASE tecl_p = K_PGDN
            brw:pagedown()
         CASE tecl_p = K_CTRL_PGDN
            brw:gobottom()
         CASE tecl_p = K_CTRL_PGUP
            brw:gotop()
         CASE tecl_p = K_CTRL_END
            brw:panend()
         CASE tecl_p = K_CTRL_HOME
            brw:panhome()
         CASE tecl_p = K_CTRL_LEFT
            brw:panleft()
         CASE tecl_p = K_CTRL_RIGHT
            brw:panright()
         CASE LASTKEY()= -1  // VER GASTOS...
            TEL=SAVENV()
            VER_GAS()
            SELE VEI
            RSTENV(TEL)
   ENDC
ENDD
SET CURSO ON
RETU

FUNC MOV_PTR(a_pular)
LOCAL ja_pulado := 0, chv_
IF a_pular = 0
   SKIP 0
ELSE
   DO WHILE !EOF() .AND. !BOF() .AND.;
      a_pular != ja_pulado
      IF a_pular > 0
         SKIP
         ja_pulado++
      ELSE
         SKIP -1
         ja_pulado--
      ENDI
   ENDD
   IF EOF() .OR. BOF()
      IF a_pular > 0
         GO BOTTOM
         ja_pulado--
      ELSE
         GO TOP
         ja_pulado++
      ENDI
   ENDI
ENDI
RETU ja_pulado

FUNCTION J_ANELA
PARAMETERS L1,C1,L2,C2,C_OR1,C_OR2,C_OR3,T_ITULO
CORR=SETCOLOR()
SET COLOR TO &C_OR1
@ L1,C1 CLEAR TO L2,C2
@ L1,C1 SAY 'U'+REPLICATE(CHR(196),C2-C1-1)+'¿'
SET COLOR TO &C_OR3
@ L1,(80-LEN(T_ITULO))/2 SAY T_ITULO
FOR A=L1+1 TO L2-1
   SET COLOR TO &C_OR1
   @ A,C1 SAY '3'
   SET COLOR TO &C_OR2
   @ A,C2 SAY '3'
NEXT A
SET COLOR TO &C_OR2
@ L2,C1 SAY 'A'+REPLICATE(CHR(196),C2-C1-1)+'U'
SETCOLOR(CORR)
RETURN

TBROWSE x DBEDIT

Enviado: 26 Nov 2015 17:06
por EANDRIOLI
E onde devo alterar para colocar cor de fundo na linha inteira na rolagem como em DBEDIT?

ERASMO

TBROWSE x DBEDIT

Enviado: 26 Nov 2015 17:23
por JoséQuintas
Por enquanto ainda não entendeu a parte mais simples, melhor uma coisa de cada vez.

Apenas similar ao seu, não exatamente igual.

Seu dbEdit:

1) codigo + "|" + data + "|" + modelo

O equivalente em tbrowse:

1) codigo + "|" + data + "|" + modelo

O tbrowse que montou:

1) codigo
2) data
3) modelo

Se fez diferente, o resultado é diferente.


No seu fonte: o separador de colunas:

Código: Selecionar todos

brw:colsep:=" "+chr(179)+" "
Por acaso é desses espaços que está falando?

Não parece, mas o TBrowse mistura duas coisas que podem ser o terror de muita gente: classe e codeblock.
Se possível, é bom dedicar um pouco de tempo pra isso, sem pressa.
Pode facilitar o futuro.

Pontos que não concordo:

SET CURSOR OFF
Pro usuário não ver aonde o cursor está... parece desnecessário

ReadInsert(.F.)
Alterar o funcionamento de READ aonde não tem READ... esquisito.

Convém analisar o fonte, e não apenas usar.
De repente tem coisa que confunde sem necessidade.

por enquanto não usado:

Código: Selecionar todos

x_ = COL() ; y_ = ROW()
Usar rotina de TBrowse usando macro... vai limitar depois, talvez até causando problemas.
Melhor igual fez no dbEdit, já definir o campo usando Transform().

TBROWSE x DBEDIT

Enviado: 26 Nov 2015 17:58
por JoséQuintas
Outro ponto ruim do fonte:

Código: Selecionar todos

PRIV aCampos:={{"codigo","999999","Código"},;
       {"data","999999","Aquisiçao"},;
       {"modelo","@!","Modelo e Descriçao do Veiculo"},;
       {"ano","9999","Ano/Mod"},;
       {"left(cor,4)","@!","Cor"},;
       {"vlr_venda","@E 999,999.99","Valor (V)"}}
O TBrowse trabalha com título e campo.
Aqui é campo, Picture e título.
Uma boa ajuda pra confundir quando estiver mexendo com uma ou outra coisa, por ter ordem diferente.

Mais prático e seguro usar sempre o modo padrão:

Código: Selecionar todos

aCampos := { ;
   { "código", { || Transform( código, "999999" ) } }, ;
   { "aquisição", { || data } }, ;
   { "modelo e descrição", { || modelo } } }
Porque tanto colchete? "{}"

aCampos := {} isso é um array
cada campo {} também é um array de 2 elementos contendo título e valor
o primeiro elemento é um texto "código"
o segundo elemento é um codeblock { || transform( codigo, "999999" ) }

o formato para codeblock é { || algumacoisa }

Entender isso pode facilitar a montagem de seus próximos tbrowse.

TBROWSE x DBEDIT

Enviado: 26 Nov 2015 18:23
por EANDRIOLI
Ótimo isso!

Já ajudou muito mesmo.

Obrigado!

TBROWSE x DBEDIT

Enviado: 30 Nov 2015 18:22
por EANDRIOLI
AMIGO...

Estou usando assim para buscar pela DESCRIÇÃO (Modelo de veículo)...

Código: Selecionar todos

// pesquisa letra a letra...
   IF (tecl_p>31 .and. tecl_p<1000) .or. tecl_p = K_BS
      If tecl_p = K_BS
        st_p=Left(st_pesq,Len(st_pesq)-1)
      Else
        st_p=st_pesq+carac_
      Endif

      st_p_:=st_p
      nTamNomeP:= Len(st_p_)
      nQuantRegP:= 0
      VEI->(DBSeek(st_p_))
      Private brw_mat:={}
      IF LEFT(st_p_,1)="*" .OR. "*" $ st_p_ .OR. "?" $ st_p_
         IF LEN(st_p_)>1
            st_p_+="*"
            nPas_:=1
            DO WHILE OrdWildSeek( st_p_, iif(nPas_=1,.F.,.T.) )
               aadd(brw_mat, {VEI->MODELO,VEI->CODIGO} )
               nPas_+=1
               if nPas_ > nQuantMaxR
                  EXIT
               EndIf
            ENDDO
         ENDIF
      ELSE
         SEEK st_p_
         IF FOUND() .and. !EMPT(st_p_)
            Do While !Eof()
               If Substr(VEI->MODELO,1,nTamNomeP) == st_p_
                  nQuantRegP += 1
                  if nQuantRegP > nQuantMaxR
                     EXIT
                  EndIf
                  aadd(brw_mat, {VEI->MODELO,VEI->CODIGO} )
               ElseIf Substr(VEI->MODELO,1,nTamNomeP) > st_p_
                  EXIT
               Endif
               SKIP
            EndDo
         ENDIF
      ENDIF
      if Len(brw_mat)==0
        brw_mat:={{"",""}}
      Endif
      st_pesq=st_p
      n:=1
      ntot:=len(brw_mat)
      brw:rowpos=1
      brw:configure()
      LOOP
   ENDIF

Mas quando digito letra por letra, o programa não está buscando corretamente as informações quando atualizada tela.

O que pode ser?

Outra coisa, se eu quiser ter outra parte, por exemplo...

Código: Selecionar todos

IF tecl_p = K_F7                   // buscar por CODIGO...
      TEL=SAVENV()
      WIN(08,09,11,25,"BUSCAR CODIGO",'W/RB+*','RB+*/W')
      SET CURSOR ON
      T_VEBU = 0
      @10,10 SAY "CODIGO:" GET T_VEBU PICT '999999'
      READ
      IF LASTKEY()=27
         RSTENV(TEL)
         KEYBOARD CHR(176)
         RETURN(1)
      ENDIF
      ffseek := T_VEBU
      SET SOFTSEEK ON
      SET ORDER TO 1
      DBSEEK(ffseek)
      SET SOFTSEEK OFF
      KEYBOARD CHR(176)
      SET CURSOR OFF
      RSTENV(TEL)
   ENDIF  

Para buscar por CODIGO do veículo... como posso proceder? posso deixar parecido com a busca por NOME (modelo de veiculo)?

ERASMO

TBROWSE x DBEDIT

Enviado: 01 Dez 2015 08:29
por EANDRIOLI
BARRA VERTICAL SEPARADORA DE CAMPOS:

Outra coisa que não consegui fazer é colocar a barra (linha) vertical como em DBEDIT entre os campos.

Por exemplo, veja na imagem a seguir, as linhas verticais entre os campos CÓDIGO e DT.VENDA, etc.