DbGrid ?? Como Listar um Campo da tabela=Boolean ??

08/07/2008

4

Ola Amigos
Por Favor:

Tenho um Campo na Tabela Sim/Nao ou seja o campo é Boolean.

Entao, quando listo a tabela no DbGrid os Valores da Coluna, me aparecem TRUE ou FALSE,
Eu Precisava que, quando o campo da tabela for=True, Listar no DBGRID ´PAGO´ , e quando o campo da tabela estiver=False, preciso listar ´ ´ ou NAO PAGO.

Aproveitando, outra duvida. mas com COMBOX.
Preciso listar na mesma linha o Cod do Cliente e o Nome. Eu Ja fiz uma vez, e agora, nao sei onde guardei o codigo, e nao estou mais conseguindo fazer.
dm.TbSetores.Open;
dm.TbSetores.First;
with dm.TbSetores do
while not eof do
begin
DbcNome.Items.Add(FieldValues[´NomObra´]) ;
DbcNome.Items.Add(FieldValues[´NomObra´]) ;
next;
end;
Desta forma, lista duas linhas, e eu queria assim: cod - Nome

Mui Atrenciosamente.
Jotas


Responder

Posts

08/07/2008

Mazzi

1- para mostrar o que vc quer em cada tupla de dados, use campos calculados no seu componente Table ou ClienteDadaset, pode ser campos calculados (CALCULATE) ou agregados (AGREGATE).
Para cria-los basta clicar com o botao direito em cima do compoente tDatset(pode ser Table ou CDS), escolha a opcao CreateField,
e para Calculate, por exemplo, dê o nome do campo e tipo Como STRING

1.1 entre na propriedades do componete (table ou CDS) e procure o evento OnCalcFields e coloque :

if TableCampo.value=true then
campo_criado_como_calculate.asstring := ´PAGO´
else
campo_criado_como_calculate.asstring := ´NAO PAGO´;

-------------------------------------------------------------------------------


2- Problema em relacao a popular um componente Itens:

use concatencao de Cod+NomObra

exemplo:
DbcNome.Items.Add(´COD:´+Dmd.tbtbCodigo.asstring+´ ´+ FieldValues[´NomObra´]) ;


Responder

08/07/2008

Joaoshi

Com relação ao primeiro item você tambem poderia utilizar o evento [b:2cbee94fd6]OnGetText[/b:2cbee94fd6] da Field.

Ex.:

procedure SuaTabelaNomeDoCampoGetText(Sender: TField;
  var Text: String; DisplayText: Boolean);
begin
  if Sender.asBoolean  = true then
     Text := ´Sim´
  else
     Text := ´--´;
end;



Responder

11/07/2008

Jotas

Gente
Bomdia !!
Desculpem pela demora

Quero só dizer Obrigado Pela Dicas.... Tudo Certinho.. Quanto a do DbGrid, usei a do Joao (OnsetGetText)

Valeu Mesmo. Supimpa !!!
Jotas.


Responder

12/07/2008

Paullsoftware

dm.TbSetores.Open; 
dm.TbSetores.First; 
with dm.TbSetores do 
while not eof do 
begin 
DbcNome.Items.Add(FieldValues[´NomObra´]) ; 
DbcNome.Items.Add(FieldValues[´NomObra´]) ; 
next; 
end; 
aqui basta concatenar os campos, que ficam na mesma linha!!!

[b:fc69ecfef4]DbcNome.Items.Add(FieldValues[´NomObra´] + ´ - ´+ FieldValues[´NomObra´]) ; [/b:fc69ecfef4]
blz? espero ter ajudado! :wink:


Responder

13/07/2008

Marco Salles

Bom Jotas a Primeira pergunta ja foi respondida e eu acrescento tb
na escolha do[b:685f2f62ea] evento OnGetText [/b:685f2f62ea]... Sem duvida é um evento muito
indicado

Quanto a sua segunda Dúvida a concatenação das Strings ela funciona se for seguida de uma formatação do Tamanho dos campos , para que todos os campos Tenham o mesmo Tamanho

Porém segue abaixo uma solução mais profissional para esta situação

[b:685f2f62ea]1)Altere a Propriedade Style do ComboBox para csOwnerDrawFixed[/b:685f2f62ea]

[b:685f2f62ea]2)No Evento onDrawItem do Seu Combo Escreva o Codigo Abaixo[/b:685f2f62ea]

[u:685f2f62ea]P:S Meu ComboBox Estou Chamando de Cb1[/u:685f2f62ea]

procedure TForm1.cb1DrawItem(Control: TWinControl; Index: Integer;
  Rect: TRect; State: TOwnerDrawState);
 var
   strVal,strAll:String;
   pos1,rWidth:integer;
   rc:TRect;
   arrWidth:Array[0..2] of integer;
procedure AcrescentarColuna(i:integer);
begin
  rc.Left:=Rect.Left+ arrWidth[i] +2;
  rc.Right:=Rect.Left + arrWidth[i+1] - 2;
  if i=0 Then
    begin
     rc.Top:=Rect.Top;
     rc.Bottom:=Rect.Bottom;
     pos1:=pos(´;´,strAll)
    end
  else
    begin
      strAll:=copy(strAll,pos1+1,length(strAll)-pos1);
      pos1:=pos(´;´,strAll);
    end;
  Strval:=copy(strAll,1,pos1-1);
  cb1.Canvas.TextRect(rc,rc.Left,rc.Top,strVal);
  cb1.Canvas.MoveTo(rc.Right,rc.Top);
  cb1.Canvas.LineTo(rc.Right,rc.Bottom);
end;
begin

  cb.Canvas.Brush.Style:=bsSolid;
  Cb.Canvas.FillRect(Rect);
  StrAll:=cb.Items[Index];

  rWidth:=cb.Width;

  arrWidth[0]:=0;
  arrWidth[1]:=(rWidth div 2);
  arrWidth[2]:=2*(rWidth div 2);

  AcrescentarColuna(0);
  AcrescentarColuna(1);

end;


Para qua o Codigo Funcione voce deve chamar Assim :

dm.TbSetores.Open; 
dm.TbSetores.First; 
with dm.TbSetores do 
while not eof do 
begin 
cb1.Items.Add(FieldByName(´SeuCampo1´).AsString+´;´+
                     FieldByName  (´SeuOutroCampo´).AsString+´;´); 
next; 
end; 


[b:685f2f62ea]é importante ou primordial usar a concatenação [color=darkblue:685f2f62ea][u:685f2f62ea]´,´[/u:685f2f62ea][/color:685f2f62ea][/b:685f2f62ea]

espero ter sido util


Responder

13/07/2008

Marco Salles

Como não posso editar so para relatar troque o codigo

cb.Canvas.Brush.Style:=bsSolid; 
Cb.Canvas.FillRect(Rect); 

por

cb1.Canvas.Brush.Style:=bsSolid;
Cb1.Canvas.FillRect(Rect);


e

arrWidth[2]:=2*(rWidth div 2); por arrWidth[2]:=rWidth;



p:s

Veja apesar de ´grande´ a solução apresentada pode ser
facilmente estendida para [b:9fe6a79149]Tres , ou mais colunas [/b:9fe6a79149]no Combobox
sem praticamente nenhuma codificação extra..


Responder