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]O que significa cada linha e cada campo,
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;
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