criar uma coluna calculada no TSBROWSE

Projeto MiniGui - Biblioteca visual para Harbour/xHarbour

Moderador: Moderadores

Avatar do usuário
Amparo
Usuário Nível 3
Usuário Nível 3
Mensagens: 342
Registrado em: 20 Ago 2010 10:38
Localização: caieiras / sao paulo

criar uma coluna calculada no TSBROWSE

Mensagem por Amparo »

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:

Código: Selecionar todos

[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.

Código: Selecionar todos

[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

Código: Selecionar todos

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 do usuário
Toledo
Administrador
Administrador
Mensagens: 3133
Registrado em: 22 Jul 2003 18:39
Localização: Araçatuba - SP
Contato:

criar uma coluna calculada no TSBROWSE

Mensagem por Toledo »

Amparo, tente fazer o seguinte:

Troque:

Código: Selecionar todos

    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:

Código: Selecionar todos

    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 do usuário
Amparo
Usuário Nível 3
Usuário Nível 3
Mensagens: 342
Registrado em: 20 Ago 2010 10:38
Localização: caieiras / sao paulo

criar uma coluna calculada no TSBROWSE

Mensagem por Amparo »

ola amigos

Toledo

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

valeu.
Responder