一个adoquery1与dbgrid相连
adoquery1中有一字段type(单据类型)
其中type的值只有'1','2','3','4'四种,
问题:
1,在dbgrid中,type字段如果为'1',我想显示成'入库单'
'2',我想显示成'出库单'
'3',我想显示成'销售单'
'4',我想显示成'销退单'2,用ado+access,是否这种case语句对access不行?
adoquery1中有一字段type(单据类型)
其中type的值只有'1','2','3','4'四种,
问题:
1,在dbgrid中,type字段如果为'1',我想显示成'入库单'
'2',我想显示成'出库单'
'3',我想显示成'销售单'
'4',我想显示成'销退单'2,用ado+access,是否这种case语句对access不行?
when '1' then '入库单'
when '2' then '出库单'
.
.
end as 单据类型
from orderaccess好象没有,试试不就知道了。
begin
if adoquery1.fieldbyname('type').asstring='1' then Text:='入库单'
else if adoquery1.fieldbyname('type').asstring='2' then Text:='出库单'
else if adoquery1.fieldbyname('type').asstring='3' then Text:='销售单'
else if adoquery1.fieldbyname('type').asstring='4' then Text:='销退单'
else
end;
end;
怎么办呢?
我这个adoquery1是动态的sql
adoqquery1中我找不到ongettext事件
也找不到:displayformat属性
呀!
when '1' then '入库单'
when '2' then '出库单'
.
.
end as 单据类型
from order
---这样写ACCESS是肯定不行的
你只有在程序中试一试了:with adoquery1 do
begin
close;
sql.clear;
sql.add('select type,... from order');
open;
fieldByName('type').displayLable := '单据类型'
itypesel := fieldbyname('type').asinteger;
case iTypeSel of
1: fieldByName('type').AsString := '入库单';
2:...
end;
end;为了不使提交的数据保存到数据库,你还得把adoquery1的LockType设置为:ltBatchOptimistic或是ltReadOnly
我想关键的是你的数据库结构可能会有问题
如:你可以设置一个单据类型的表:BillType
有两个字段:
Type 单据类型编码
TypeDesc 单据类型说明
然后呢,你就可以在ORDER的TYPE中存储BILLTYPE中的Type字段了
如果需要显示呢,则显示CODEDESC的字段:
select O.*,B.TypeDesc from Order O,BillType B
where B.Type = O.Type
DataCol: Integer; Column: TColumn; State: TGridDrawState);
beginend;
在上面这样的代码里,加上判断语句,如果当前行的某个字段值为什么,就绘出其它的东东,或者你用STRINGGRID来做:
adotemp.Open;
//写入listview中
LVfee.items.Clear;
while not adofee.Eof do
begin
Listitem:=LVFee.Items.Add ;
listitem.ImageIndex:=-1;
//Listitem.SubItems.Add(adofee.fieldbyname('isFinish').AsString );
Listitem.SubItems.Add(adofee.fieldbyname('RoomNo').AsString);
Listitem.SubItems.Add(adofee.fieldbyname('Feemonth').AsString);
Listitem.SubItems.Add(adofee.fieldbyname('Feeyear').AsString);
Listitem.SubItems.Add(adofee.fieldbyname('OwnerName').AsString);
Listitem.SubItems.Add(adofee.fieldbyname('FeeName').AsString);
Listitem.SubItems.Add(adofee.fieldbyname('Feemoney').AsString); Listitem.SubItems.Add(adofee.fieldbyname('FlowNo').AsString);
adofee.Next ;
end; if not adotemp.IsEmpty then
begin
FeeMoney.Text :=adotemp.Fieldbyname('FeeMoney').asstring;
//PayMoney.Text :=adotemp.Fieldbyname('FeeMoney').asstring;
end
else
begin
FeeMoney.Text :='0';
PayMoney.Text :='0';
end;
上边这样绘上去
case只能用在Microsoft SQL.
不能用于access
在dbgrid中动态显示吧.过一下, 我去写代码给你贴上
Field: TField; State: TGridDrawState);
const
Show: Array[1..4] of String = ('入库单', '出库单', '销售单', '销退单');
var
St: String;
x, y: Integer;
begin
if Field <> Self.Query1.FieldByName('Type') then
begin
Self.DBGrid1.DefaultDrawDataCell(Rect, Field, State);
Exit;
end;
St := Show[Field.AsInteger];
x := 3;
y := 3;
Self.DBGrid1.Canvas.FillRect(Rect);
Self.DBGrid1.Canvas.TextRect(Rect, Rect.Left + x, Rect.Top + y, St);
end;同时, 把 DBGrid1 控件的 DefaultDrawing
属性改为 FALSE
另外,ADOQuery动态的添加SQL语句是这样的:
ADOQuery1.Close;
ADOQuery1.SQL.Clear;
ADOQuery1.SQL.Add('select * from Table');
ADOQuery1.Open;
字段的DisplayFormat是这样的:
TFloatField(ADOQuery1.FieldByName('TableField')).DisplayFormat := '###,###.00';
你再试试看吧。祝你成功。
若不愿意用那种方法,建一个计算字段也行啊。 如建计算字段:DescType. 在AdoQuery的onCalcFields事件中写代码:
begin
if adoquery1.fieldbyname('type').asstring='1' then
adoquery1.fieldbyname('type').asstring='入库单'
else if adoquery1.fieldbyname('type').asstring='2' then
adoquery1.fieldbyname('type').asstring='出库单'
else if adoquery1.fieldbyname('type').asstring='3' then
adoquery1.fieldbyname('type').asstring=:='销售单'
else if adoquery1.fieldbyname('type').asstring='4' then
adoquery1.fieldbyname('type').asstring='销退单'
else
end;
end;
然后显示DescType字段的内容
if adoquery1.fieldbyname('type').asstring='1' then
adoquery1.fieldbyname('DescType').asstring='入库单'