TBROWSE x DBEDIT

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

Moderador: Moderadores

Avatar do usuário
EANDRIOLI
Usuário Nível 3
Usuário Nível 3
Mensagens: 109
Registrado em: 22 Jun 2007 18:31
Localização: Sorriso-MT

TBROWSE x DBEDIT

Mensagem 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
Avatar do usuário
JoséQuintas
Administrador
Administrador
Mensagens: 20267
Registrado em: 26 Fev 2007 11:59
Localização: São Paulo-SP

TBROWSE x DBEDIT

Mensagem 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") } }
José M. C. Quintas
Harbour 3.2, mingw, gtwvg mt, fivewin 25.04, multithread, dbfcdx, MySQL, ADOClass, PDFClass, SefazClass, (hwgui mt), (hmg3), (hmg extended), (oohg), PNotepad, ASP, stored procedure, stored function, Linux (Flagship/harbour 3.2)
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"

https://github.com/JoseQuintas/
Avatar do usuário
JoséQuintas
Administrador
Administrador
Mensagens: 20267
Registrado em: 26 Fev 2007 11:59
Localização: São Paulo-SP

TBROWSE x DBEDIT

Mensagem 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.
José M. C. Quintas
Harbour 3.2, mingw, gtwvg mt, fivewin 25.04, multithread, dbfcdx, MySQL, ADOClass, PDFClass, SefazClass, (hwgui mt), (hmg3), (hmg extended), (oohg), PNotepad, ASP, stored procedure, stored function, Linux (Flagship/harbour 3.2)
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"

https://github.com/JoseQuintas/
Avatar do usuário
EANDRIOLI
Usuário Nível 3
Usuário Nível 3
Mensagens: 109
Registrado em: 22 Jun 2007 18:31
Localização: Sorriso-MT

TBROWSE x DBEDIT

Mensagem 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
Avatar do usuário
EANDRIOLI
Usuário Nível 3
Usuário Nível 3
Mensagens: 109
Registrado em: 22 Jun 2007 18:31
Localização: Sorriso-MT

TBROWSE x DBEDIT

Mensagem por EANDRIOLI »

E onde devo alterar para colocar cor de fundo na linha inteira na rolagem como em DBEDIT?

ERASMO
Avatar do usuário
JoséQuintas
Administrador
Administrador
Mensagens: 20267
Registrado em: 26 Fev 2007 11:59
Localização: São Paulo-SP

TBROWSE x DBEDIT

Mensagem 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().
José M. C. Quintas
Harbour 3.2, mingw, gtwvg mt, fivewin 25.04, multithread, dbfcdx, MySQL, ADOClass, PDFClass, SefazClass, (hwgui mt), (hmg3), (hmg extended), (oohg), PNotepad, ASP, stored procedure, stored function, Linux (Flagship/harbour 3.2)
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"

https://github.com/JoseQuintas/
Avatar do usuário
JoséQuintas
Administrador
Administrador
Mensagens: 20267
Registrado em: 26 Fev 2007 11:59
Localização: São Paulo-SP

TBROWSE x DBEDIT

Mensagem 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.
José M. C. Quintas
Harbour 3.2, mingw, gtwvg mt, fivewin 25.04, multithread, dbfcdx, MySQL, ADOClass, PDFClass, SefazClass, (hwgui mt), (hmg3), (hmg extended), (oohg), PNotepad, ASP, stored procedure, stored function, Linux (Flagship/harbour 3.2)
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"

https://github.com/JoseQuintas/
Avatar do usuário
EANDRIOLI
Usuário Nível 3
Usuário Nível 3
Mensagens: 109
Registrado em: 22 Jun 2007 18:31
Localização: Sorriso-MT

TBROWSE x DBEDIT

Mensagem por EANDRIOLI »

Ótimo isso!

Já ajudou muito mesmo.

Obrigado!
Avatar do usuário
EANDRIOLI
Usuário Nível 3
Usuário Nível 3
Mensagens: 109
Registrado em: 22 Jun 2007 18:31
Localização: Sorriso-MT

TBROWSE x DBEDIT

Mensagem 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
Avatar do usuário
EANDRIOLI
Usuário Nível 3
Usuário Nível 3
Mensagens: 109
Registrado em: 22 Jun 2007 18:31
Localização: Sorriso-MT

TBROWSE x DBEDIT

Mensagem 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.
Anexos
barravert.jpg
Responder