现在我的数据库表中有两个字段,分别只有一个字符标示,假如 0:原材料,1:半成品,2:成品,现要用TQUERY 查询并用DBGRID显示出来,但要求显示时,那个字段不能显示成标示码,而是显示成中文的‘原材料’‘半成品’‘成品’。我想问问如何实现?

解决方案 »

  1.   

    在query.text中这样写
    select field1, case field2
                               when 0 then 原材料
                               when 1 then 半成品
                               when 2 then 成品
                   end
    from table
      

  2.   

    select field1, case field2
                               when 0 then ''原材料''
                               when 1 then ''半成品''
                               when 2 then ''成品''
                   end as field2//或者end as 你命名的字段名称
    from table
      

  3.   

    不好意思,第一次回答错了,你用我写在下面的SQL.text试试,
    如果通的话就给分吧 ^_^
      

  4.   

    我的理解是:如果0:原材料,1:半成品,2:成品这些信息还保存在另一个基础信息表里面的话,你可以在query1的字段编辑器里新建一个lookup字段,再用query2在基础表中来查询,这样就可以做到用ID关联,而显示name,达到你的要求
      

  5.   

    oracle里面我没试过,如果是两张表的话,可以join,然后再select;
    如果没有那个产品类型表的话,可以创建临时表,然后再join、select
      

  6.   

    to :yoic
      有问题,出在WHEN那里
      

  7.   

    我用的SQL SERVER 数据库,NO ORACLE
      

  8.   

    给tquery控件加字符串类型的计算字段
    然后在tquery控件的OnCalcFields事件中写代码
    假设计算字段名为fieldname,存放标识的字段名为fieldflag
    if query1.fieldbyname('fieldflag').asstring='0' then
    query1.fieldbyname('fieldname').asstring:='原材料';
    if query1.fieldbyname('fieldflag').asstring='1' then
    query1.fieldbyname('fieldname').asstring:='半成品';
    if query1.fieldbyname('fieldflag').asstring='2' then
    query1.fieldbyname('fieldname').asstring:='成品';
      

  9.   

    ^_^,我找到了,原来是decode
    decode(0,'原材料',1,'半成品',2,'成品','')
      

  10.   

    仔细查一下你写的语句,
    to  wangzn1979(梦郎2001) 
    decode(0,'原材料',1,'半成品',2,'成品','')
    这段代码写在什么地方?我没有用过decode
      

  11.   

    呵呵,老兄能不能在字段的OnsetText事件里写呀!!begin
      if sender.Text='0' then
         text:= '原材料'
      else if sender.Text='1' then
        text:= '半成品 '
      else  text:='成品';
    end;
      

  12.   

    table1.fields[1].displaylabel:=成品
    and so on!
      

  13.   

    在oracle中,用在字段处啊,这样就可以满足楼上的条件了!
    比较简单,不是吗?
    SQL Server中用 case ..when..when....else end
    对不?
      

  14.   

    好吧,假如数据库表(DELPHI 6+SQL SERVER 2000,控件用的是DBGRID 和 TQUERY )是这样的
    NO    NAME  CLASS(表中用字符‘0’代表原材料,‘1’半成品‘2’成品)
    2002  螺丝     1
    2003  垫片     0
    2004  轮胎     2
    现在我要用SQL语言查询并显示出来时,将0,1,2转成原材料,半成品,成品
    即:
    编号  名称   类别
    2002  螺丝   半成品
    2003  垫片   原材料
    2004  轮胎    成品
    问题就出在如何在用TQUERY(和DBGRID相联)查询时,显示成这种样子?如何书写SQL语言?
      

  15.   

    select no as 编号,name as 名称,case class when 0 then '原材料' when 1 then '半成品' when 2 then '成品' else '' end as 类别
    from table
      

  16.   

    我已经在SQL Server2000+Delphi7.0中测试过,已经通过!
    ^_^,接分拉
      

  17.   

    to  xugang96(漂泊在外,居无定所):用我的方法试一下
    给tquery控件加字符串类型的计算字段
    然后在tquery控件的OnCalcFields事件中写代码
    假设计算字段名为fieldname,存放标识的字段名为fieldflag
    if query1.fieldbyname('fieldflag').asstring='0' then
    query1.fieldbyname('fieldname').asstring:='原材料';
    if query1.fieldbyname('fieldflag').asstring='1' then
    query1.fieldbyname('fieldname').asstring:='半成品';
    if query1.fieldbyname('fieldflag').asstring='2' then
    query1.fieldbyname('fieldname').asstring:='成品';
      

  18.   

    楼上的兄弟们,不用这么麻烦啊:
    改两个属性即可呀:
    DBGrid1.FieldColumns[FieldName].PickList.CommaText := '原材料,半成品,成品';
    DBGrid1.FieldColumns[FieldName].KeyList.CommaText := '0,1,2';也可以去字段编辑器里去编辑PickList和KeyList里面。编辑方式同上
      

  19.   

    to xshmeng(爽爽) 
    字段类型可能是字符,也可能是数字,也可能是别的,怎么办??
      

  20.   

    to xshmeng(爽爽) :
     我很菜的,你的那DBGrid1.FieldColumns[FieldName]属性我无法运行,还有用 wangzn1979(梦郎2001)和 yoic(我是一棵菠菜,菜,菜,菜,菜,菜,菜,) 的方法都只能在数据库的查询分析器中运行,而无法使用TQUERY控件运行,我已经等了半天了,哪位高手快快搞定吧!!!!
     TO zzheaptech(风的往事) ,你的方法我也试了,不行,不过我没理解你的把‘给tquery控件加字符串类型的计算字段’这话的意思,能否说的详细一点!
      

  21.   

    我的方法不行马?
    起了怪了!
    你把你的TQuery的sql语句贴出来
    不可能不行的!
      

  22.   

    to  to xshmeng(爽爽):就是在tquery控件中创建永久性的字段对象
    你先把表中原有的字段创建永久字段对象,然后在创建一个计算字段对象
    第一步
    你先双击tquery控件然后在弹出的小窗体中点右键,选第三项(add all fields;
    第二步:创建计算字段
    点右键,选第二项(new fields);
    输入name,选择type,输入size就可以了
    然后点calculated单选按扭
    最后点ok
      

  23.   

    我真的到现在还没搞定,就是在SQL的查询分析器里可以正常运行,可一旦用D6的TQUERY控件书写同样的SQL语句运行就出错,真不知是啥原因
    出现
    'INVAILD USE OF KEYWORD'
    TOKEN:WHEN 
      

  24.   

    这就是查询中的核心程序,其中与引号是无关的。
    With qry_erp do
        begin
          Close;
          Sql.Clear ;
          Sql.Text:='Select  case workdate'
                    +' when  ''0'' then ''20030120'' '
                    +' when  ''1'' then ''20030121'' '
                   +'  when  ''2'' then ''20030122'' '
                   +' end as workdate ,re from noworkday ';
          Prepare;
          Open;
      end;
    错误信息是:(好像是关键子 WHEN)
      Project project_erp.exe raise exception class EDBEngineError with message 'Invalid use of keyword ,Token:When line Number:1',Process stop......... 
      

  25.   

    1.如果0:原材料,1:半成品,2:成品这些信息还保存在另一个基础信息表里面的话,你可以在query1的字段编辑器里新建一个lookup字段,再用query2在基础表中来查询,这样就可以做到用ID关联,而显示name。2.在DBGrid的DrawDataCell事件中写代码。3.找第三方控件,如TopGrid,如找不到也可用我自己做的改良版。和我联系:[email protected]
      

  26.   

    怎么没有else那?
    case field
    when 1 then ''1''
    when 2 then ''2''
    else ''3'' end
      

  27.   

    我又开了个贴,也是关于 DBGRID的数据更新问题,如何检测数据的合法性?帮我看看
      

  28.   

    我看到上面有一大群猪,
    双击DBGRID,大打开的窗口中点击某一字段,title中有一.......
      

  29.   

    to ttwandln(孤独雪) 
     看清楚人家问的什么再发言吧
      

  30.   

    TO ttwandln(孤独雪) 
     老兄,你不要乱骂呀,不是你说的那么简单的,我是要把数据库中用代码表示的字段用通俗的文字显示出来,且在查询时就要做到,而非简单的改改TITLE就可以的。
      

  31.   

    这是我以前编的一个东东,和你的要求一样.
    当尺寸<=10时显示"small",介于11-39时显示"Middle",当>=40时显示"Large",同时在括号里显示原始数据.Table1是表名
    Size是该字段名
    GetText表示这个过程写在OnGetText事件里:procedure TForm1.Table1SIZEGetText(Sender: TField; var Text: String;
      DisplayText: Boolean);
    var
    i : integer;
    begin
    i := Sender.AsInteger;
    if i < 11 then Text := 'small'
    else if (i> 10) and (i<40) then Text := 'Middle'
    else Text := 'Large';
    Text := Text + '('+inttostr(i)+')';
    DisplayText := True;end;
      

  32.   

    如果你是用TQuery来访问的,如果也是用DBGrid来显示,那也一样.
    不过我现在不太喜欢用DB感知控件——可控性不好.
      

  33.   

    你应建一个表存放所有字段的英文名和汉字名的。
    然且用一个过程来实现。
    我有一个过程但只能用于bde,
    var 
    procedure zetoc (dataset: Tdataset;q_etoc:tquery );stdcall;external 'zz_EtoC.dll' name'zetoc';调用
    letoc(query1,query2);//query1是你的数据集。query2是我的过程中用的
    例子
    letoc(table1,query2);
    你可以发mail到[email protected]索取这个dll文件.是免费的。