Clipper On Line • Ver Tópico - criar uma coluna calculada no TSBROWSE

criar uma coluna calculada no TSBROWSE

Projeto MiniGui - Biblioteca visual para Harbour/xHarbour

Moderador: Moderadores

 

criar uma coluna calculada no TSBROWSE

Mensagempor Amparo » 01 Fev 2012 10:50

ola amigos,

Harbour MiniGUI Extended Edition 2.0.5 - 2011.12.14
BRMAKE - Make File para Harbour/xHarbour/MiniGUI Versão 2.05 FreeWare

o intuito deste POST é como criar uma coluna calculada no TSBROWSE na hora que estiver executando o sistema, digamos que um TSBROWSE contem as seguintes colunas;
estou pegando a tabela de clientes como exemplo mas poderia fazer com a tabela de produtos.

CODIGO = codigo do cliente
NOME = razao social
TIPO = tipo do cliente, se é CONSUMIDOR, REVENDEDOR, ATELIER, GOVERNAMENTAL e por ai vai
CONCEITO = BOM, RETIDO ou NOVO
CREDITO= limite de credito para o cliente 100,00 500,00 1.000,00 ....

na hora da execução o usuario quer acrescentar uma coluna calculada que satisfaça a seguinte condição
IIF( CLIENTES->CONCEITO = "NOVO", "", IIF( CLIENTES->CONCEITO = "BOM","BOM PAGADOR","CALOTEIRO") )
OU ENTAO
IIF( CLIENTES->CONCEITO = "RETIDO", CLIENTES->LIM_CREDIT , ( CLIENTES->LIM_CREDIT * 20.00 ) / 100 )

ai teriamos as seguintes colunas
CODIGO, NOME, TIPO, CONCEITO, CREDITO, SITUACAO FINANCEIRA e a ultima coluna o valor do CREDITO com acrescimo.

muito bem, Eu tenho um arquivo INI que fica gravado todas as colunas e suas propriedades que devem aparecer no TSBROWSE o arquito esta assim:
[FIELDS]
A:CLIENTES;F:CODIGO;H:Codigo;L:15;C:COR_BRANCA;B:;P:;D:;E:;Y:;Z:;T:C;
A:Calculada;F:CLIENTES->CONCEITO="Retido";H:NOVA;L:15;C:;B:;P:@E 999,999.99;D:;E:;Y:CLIENTES->LIM_CREDIT ;Z:CLIENTES->LIM_CREDIT * 20 / 100;T:N;
A:CLIENTES;F:TIPO;H:TIPO;L:10;C:;B:;P:;D:;E:;Y:;Z:;T:C;
A:CLIENTES;F:FANTASIA;H:FANTASIA;L:20;C:;B:;P:;D:;E:;Y:;Z:;T:C;
A:CLIENTES;F:DATA_INCLU;H:DATA_INCLU;L:8;C:;B:;P:;D:;E:;Y:;Z:;T:D;
A:CLIENTES;F:LIM_CREDIT;H:LIM_CREDIT;L:10;C:;B:;P:@E 999,999.99;D:;E:;Y:;Z:;T:N;
A:CLIENTES;F:ISENTO_ISS;H:ISENTO_ISS;L:10;C:;B:;P:;D:;E:;Y:;Z:;T:L;
A:CLIENTES;F:CONCEITO;H:CONCEITO;L:10;C:;B:;P:;D:;E:;Y:;Z:;T:C;
A:CLIENTES;F:NOME;H:Nome;L:40;C:COR_AMARELA ;B:;P:;D:;E:;Y:;Z:;T:C;
A:CLIENTES;F:ENDERECO;H:Endereco;L:50;C:COR_VERDE;B:;P:;D:;E:;Y:;Z:;T:C;
A:CLIENTES;F:CEP;H:Cep;L:9;C:COR_VERMELHA;B:;P:;D:;E:;Y:;Z:;T:C;
O que significa cada linha e cada campo,
cada linha nada mais é que a coluna do TSBROWSE
os campos sao as propriedades de cada coluna sendo

A = nome da tabela aberta, no caso CLIENTES
F = nome do campo da tabela
H = nome que vai na barra de titulos do TSBROWSE
L = é o tamanho da coluna
C = é a cor da coluna
B = é uma condicao para todas as colunas
P = é a picture da coluna
D = é a primeira condicao a satisfazer no campo B
E = é a segunda condicao a satisfazer no campo B
Y = é a primeira condicao a satisfazer se o campo A for igual a Calcula e dependera da condicao do campo F
Z = é a segunda condicao a satisfazer se o campo A for igual a Calcula e dependera da condicao do campo F
T = é tipo do campo N numerico C caracter D data L logico M memo

ao criar o TSBROWSE as colunas sao montadas corretamente inclusive a segunda coluna chamada NOVA que é a coluna calculada.
vamos ao problema, tenho outro arquivo INI que contem duas (2) colunas calculadas e esta nao funciona corretamente, a segunda coluna é calculada e a quinta coluna tambem é calculada, so que na hora de apresentar no TSBROWSE a segunda coluna traz os dados da quinta coluna, abaixo segue o arquivo INI com as duas colunas calculadas.
[FIELDS]
A:CLIENTES;F:CODIGO;H:Codigo;L:15;C:COR_BRANCA;B:;P:;D:;E:;Y:;Z:;T:C;
A:Calculada;F:CLIENTES->CONCEITO="Retido";H:NOVA;L:15;C:;B:;P:@E 999,999.99;D:;E:;Y:CLIENTES->LIM_CREDIT ;Z:CLIENTES->LIM_CREDIT * 20 / 100;T:N;
A:CLIENTES;F:TIPO;H:TIPO;L:10;C:;B:;P:;D:;E:;Y:;Z:;T:C;
A:CLIENTES;F:FANTASIA;H:FANTASIA;L:20;C:;B:;P:;D:;E:;Y:;Z:;T:C;
A:Calculada;F:CLIENTES->CONCEITO="Retido";H:SITUAÇÃO;L:20;C:;B:;P:;D:;E:;Y:"CALOTEIRO";Z:"BOM PAGADOR";T:C;
A:CLIENTES;F:DATA_INCLU;H:DATA_INCLU;L:8;C:;B:;P:;D:;E:;Y:;Z:;T:D;
A:CLIENTES;F:LIM_CREDIT;H:LIM_CREDIT;L:10;C:;B:;P:@E 999,999.99;D:;E:;Y:;Z:;T:N;
A:CLIENTES;F:ISENTO_ISS;H:ISENTO_ISS;L:10;C:;B:;P:;D:;E:;Y:;Z:;T:L;
A:CLIENTES;F:CONCEITO;H:CONCEITO;L:10;C:;B:;P:;D:;E:;Y:;Z:;T:C;
A:CLIENTES;F:NOME;H:Nome;L:40;C:COR_AMARELA ;B:;P:;D:;E:;Y:;Z:;T:C;
A:CLIENTES;F:ENDERECO;H:Endereco;L:50;C:COR_VERDE;B:;P:;D:;E:;Y:;Z:;T:C;
A:CLIENTES;F:CEP;H:Cep;L:9;C:COR_VERMELHA;B:;P:;D:;E:;Y:;Z:;T:C;

segue a parte do fonte onde crio o TSBROWSE
STATIC FUNCTION TBROWSESGC020101()
LOCAL CABECALHO020101 := ''
LOCAL X := 0
LOCAL W := 0
LOCAL NOMEORDEM020101 := ''
LOCAL NUM := 0
LOCAL NUMCOR := 0
LOCAL C_VERMELHA := RGB( 255,000,000 )

IF _ISCONTROLDEFINED("BROW020101","SGC020101FORM")
   RELEASE CONTROL BROW020101 OF SGC020101FORM
ENDIF

CABECALHO020101 := ''

f := Len( SGC020101FIELDS )

FOR x := 1 TO f STEP 1
  CABECALHO020101 := CABECALHO020101 + "{|| PROPRIEDADE020101( " + ALLTRIM( STR( X ) ) +" ) }"

  IF X < F
     CABECALHO020101 := CABECALHO020101 + " , "
  ENDIF
NEXT

SET( _SET_DELETED, .T. )   //  EXIBE NO BRAOWSE OS REGISTROS DELETADOS .T. = NAO .F. = EXIBE

DEFINE TBROWSE BROW020101 AT 100,005 OF SGC020101FORM ALIAS 'CLIENTES' WIDTH LARGURA020101 - 15 ;
HEIGHT ALTURA020101 - 160 FONT "Arial" SIZE 10 CELL ;
ON CHANGE NUMERO_RECNO020101() ON HEADCLICK { &CABECALHO020101. }

f := Len( SGC020101FIELDS )

IF ALLTRIM( SGC020101NOME_NOVO_LAYOUT ) == 'Layout natural (Ctrl+F6)' .AND. lAdmin
    SET( _SET_DELETED, .F. )
ENDIF

FOR W := 1 TO f STEP 1
   IF ALLTRIM(SGC020101NOME_NOVO_LAYOUT) == 'Layout natural (Ctrl+F6)'
      ADD COLUMN TO BROW020101 HEADER SGC020101TITULO[W] SIZE SGC020101TAMANHO[W] FOOTER "" ;
      3DLOOK TRUE DATA FieldWBlock( SGC020101FIELDS[W],Select( "CLIENTES" ) );
      ALIGN DT_LEFT , nMakeLong( DT_CENTER, 3 )
   ELSE
*o vetor SGC020101TABELA[W] é o campo A do arquivo INI
      IF SGC020101TABELA[W] == 'Calculada'
         NUM := W

*o vetor SGC020101FIELDS[NUM] é o campo F do arquivo INI
*o vetor SGC020101CONDY[NUM] é o campo Y do arquivo INI
*o vetor SGC020101CONDZ[NUM] é o campo Z fo arquivo INI

    ADD COLUMN TO BROW020101 HEADER SGC020101TITULO[W] SIZE SGC020101TAMANHO[W] FOOTER "" ;
         PICTURE SGC020101PICTURE[W] 3DLOOK TRUE;
         DATA IIF( &(SGC020101FIELDS[NUM]), &(SGC020101CONDY[NUM]), &(SGC020101CONDZ[NUM]) ) ;
         ALIGN IIF(SGC020101TIPO[W] == "C",DT_LEFT , IIF( SGC020101TIPO[W] == "N", DT_RIGHT , DT_CENTER ) ) , ;
         nMakeLong( DT_CENTER, 3 )
      ELSE
    ADD COLUMN TO BROW020101 HEADER SGC020101TITULO[W] SIZE SGC020101TAMANHO[W] FOOTER "" ;
    PICTURE IIF( SGC020101TIPO[W] == "N", SGC020101PICTURE[W], "@!" ) ;
         DATA FieldWBlock( SGC020101FIELDS[W], Select( "CLIENTES" ) ) ;
         ALIGN IIF(SGC020101TIPO[W] == "C",DT_LEFT , IIF( SGC020101TIPO[W] == "N", DT_RIGHT , DT_CENTER ) ) , ;
         nMakeLong( DT_CENTER, 3 )
      ENDIF
   ENDIF

   IF !EMPTY( SGC020101BLOCO[W] )
      IF NUMCOR = 0
         NUMCOR := W
      ENDIF
     
      BROW020101:SetColor( { 1, 2, 5 }, { COR_PRETA, { || IF( &(SGC020101BLOCO[NUMCOR]), ;
      VERCOR( SGC020101CONDD[NUMCOR] ) , VERCOR( SGC020101CONDE[NUMCOR] ) ) }, COR_AZULCLARO }, W )

      BROW020101:Refresh()
   ELSE
      IF SGC020101COR[W] = 'COR_VERDE'
         BROW020101:Setcolor( { 2 }, { COR_VERDE },W )   // COLOCA COR NO FUNDO DAS CELULAS (2)
      ELSEIF SGC020101COR[W] = 'COR_AMARELA'
         BROW020101:Setcolor( { 2 }, { COR_AMARELA },W )   // COLOCA COR NO FUNDO DAS CELULAS (2)
      ELSEIF SGC020101COR[W] = 'COR_VERMELHA'
         BROW020101:Setcolor( { 2 }, { COR_VERMELHA },W )   // COLOCA COR NO FUNDO DAS CELULAS (2)
      ELSE
         BROW020101:Setcolor( { 2 }, { COR_BRANCA },W )   // COLOCA COR NO FUNDO DAS CELULAS (2)
      ENDIF
   ENDIF
NEXT W

BROW020101:Setcolor( { 4 }, { COR_CINZA } )    // COLOCA COR NOS NOMES DAS COLUNAS (4)
BROW020101:nHeightCell = 25    // altura de celula do browse
BROW020101:nHeightHead = 30    // altura do texto das colunas
BROW020101:SetSelectMode( .T., { | BROW020101, nI, lSel | IF( lSel,AADD(SGC020101LINHA_MARCADAS,LTRIM(STR(nI))),ADEL(SGC020101LINHA_MARCADAS,ASCAN(SGC020101LINHA_MARCADAS,LTRIM(STR(nI)))) ) , IF( lSel,ASOMA020101(SGC020101LINHA_MARCADAS,'+'),ASOMA020101(SGC020101LINHA_MARCADAS,'-') ) }, SGC020101ABMP[ 2 ], 1, DT_LEFT )

FOR X = 1 TO LEN( SGC020101NOME_ORDEM )
   IF SUBSTR(SGC020101NOME_ORDEM,X,1) == '+'
      EXIT
   ENDIF

   NOMEORDEM020101 += SUBSTR(SGC020101NOME_ORDEM,X,1)
NEXT

FOR X = 1 TO LEN( SGC020101TAMANHO )
   IF ALLTRIM( NOMEORDEM020101 ) = ALLTRIM( SGC020101FIELDS[X] )
      BROW020101:HiliteCell(X)           //POSICIONA O CURSOR NA COLUNA X
      BROW020101:SetColor( { 2,4,14 }, { { COR_AZULCLARO, COR_AZULCLARO }, { COR_AZULCLARO, COR_AZULCLARO }, { COR_AZULCLARO, COR_AZULCLARO } } ,X )        // PINTA O TEXTO E A COLUNA X QUE INDICA UMA ORDEM DE INDICES

      SGC020101COLUNA_PINTADA := X
      SetProperty ( "SGC020101FORM", 'PESQUISA', 'CAPTION' , SGC020101FIELDS[X] + '.:' )
   ENDIF
NEXT

BROW020101:lNoResetPos := .F.          // this is very important when working with the same database
END TBROWSE

RETURN


nao entendi o que esta acontecendo pois se eu tirar a quinta linha do arquivo INI que é a calculada ai a segunda linha funciona legal, ou se eu tirar a segunda linha tambem funciona legal.

Se eu acrescentar mais uma linha a ultima por exemplo e colocar como calculada qualquer expressao, a segunda e a quinta linha assume o valor desta ultima linha.

qualquer ajuda é bem vinda
Avatar de usuário

Amparo
Usuário Nível 3

Usuário Nível 3
 
Mensagens: 337
Data de registro: 20 Ago 2010 10:38
Cidade/Estado: caieiras / sao paulo
Curtiu: 0 vez
Mens.Curtidas: 2 vezes

criar uma coluna calculada no TSBROWSE

Mensagempor Toledo » 02 Fev 2012 20:05

Amparo, tente fazer o seguinte:

Troque:
    ADD COLUMN TO BROW020101 HEADER SGC020101TITULO[W] SIZE SGC020101TAMANHO[W] FOOTER "" ;
         PICTURE SGC020101PICTURE[W] 3DLOOK TRUE;
         DATA IIF( &(SGC020101FIELDS[NUM]), &(SGC020101CONDY[NUM]), &(SGC020101CONDZ[NUM]) ) ;
         ALIGN IIF(SGC020101TIPO[W] == "C",DT_LEFT , IIF( SGC020101TIPO[W] == "N", DT_RIGHT , DT_CENTER ) ) , ;
         nMakeLong( DT_CENTER, 3 )


Por:
    bMacro:=&( "{ || IIF( " + SGC020101FIELDS[NUM]+ "," +SGC020101CONDY[NUM]+ "," +SGC020101CONDZ[NUM]+")}" )
    ADD COLUMN TO BROW020101 HEADER SGC020101TITULO[W] SIZE SGC020101TAMANHO[W] FOOTER "" ;
         PICTURE SGC020101PICTURE[W] 3DLOOK TRUE;
         DATA bMacro ;
         ALIGN IIF(SGC020101TIPO[W] == "C",DT_LEFT , IIF( SGC020101TIPO[W] == "N", DT_RIGHT , DT_CENTER ) ) , ;
         nMakeLong( DT_CENTER, 3 )


Abraços,
Toledo - Clipper On Line
toledo@pctoledo.com.br
Harbour 3.2/MiniGui/HwGui
Faça uma doação para o fórum, clique neste link: http://www.pctoledo.com.br/doacao
Avatar de usuário

Toledo
Administrador

Administrador
 
Mensagens: 3038
Data de registro: 22 Jul 2003 18:39
Cidade/Estado: Araçatuba - SP
Curtiu: 263 vezes
Mens.Curtidas: 258 vezes

criar uma coluna calculada no TSBROWSE

Mensagempor Amparo » 03 Fev 2012 10:01

ola amigos

Toledo

funcionou perfeito, tinha um layout com uma coluna calculada outro com duas e outro com tres e funcionaram perfeitamente.

valeu.
Avatar de usuário

Amparo
Usuário Nível 3

Usuário Nível 3
 
Mensagens: 337
Data de registro: 20 Ago 2010 10:38
Cidade/Estado: caieiras / sao paulo
Curtiu: 0 vez
Mens.Curtidas: 2 vezes




Retornar para MiniGui

Quem está online

Usuários vendo este fórum: Nenhum usuário registrado online e 10 visitantes


Ola Amigo, espero que meu site e forum tem lhe beneficiado, com exemplos e dicas de programacao.
Entao divulgue o link da Doacao abaixo para seus amigos e redes sociais ou faça uma doacao para o site forum...
MUITO OBRIGADO PELA SUA DOACAO!
Faça uma doação para o forum
cron
v
Olá visitante, seja bem-vindo ao Fórum Clipper On Line!
Efetue o seu login ou faça o seu Registro