初学者问题:多个表之间的ID-Name字段的转换显示的问题(100分)

  • 主题发起人 主题发起人 starfloat
  • 开始时间 开始时间
S

starfloat

Unregistered / Unconfirmed
GUEST, unregistred user!
表Dept,有两个字段:dept_id,dept_name
表Employee,有一个字段存dept_id
在显示员工表信息时,要将dept_id换成dept_name显示,
在新增员工信息时,要将dept_name转换成dept_name保存。

我的想法是:
为了在dept_id和dept_name之间快速的转换,将dept表中的内容一次性取出来,放在一个东东里保存着,需要转换时到这里里查。而不用在Employee,Dept两个表去联合查询。

为此,我使用一个THashedStringList来保存这个表的内容。而THashedStringList容纳的必须是TObject对象。我用一个类TStringObject将String包装成TObject:
type
TStringObject=class(TObject)
private
Value:String

public
constructor Create(aValue:String)

procedure SetValue(aValue:String)

function GetValue:String

end

.....

在我的主Form中,定义一个THashedStringList:
var
depts:THashedStringList


以下是我的初始化depts的过程
var
pso:^TStringObject

i:Integer
qry:TADOQuery

begin
//设置qry的连接属性等等..略
with qry do
begin
Close

SQL.Clear

SQL.Add('select dept_id,dept_name from Dept order by id')

Open

if RecordCount > 0 then
begin
First

while not EOF do
begin
New(pso)

pso.SetValue(Fields['dept_name'].AsString)

depts.addObject(Fields['dept_id'].AsString,@pso)

Next

end

end

end

end


上面的过程不知道怎么回事,老是有问题,请帮我改一改.是不是里面的指针的用法有问题??谢谢!!

另外,关于key-value转换这种问题大家应该经常碰到的,显示时用value,保存时保存其key,大家一般是怎么处理的???请提示点思路。谢谢!!
 
这种不用这么烦吧,一般的方法可以用关联字段的方法来完成,首先你在你用一个Adoquery1指象Employee表,然后双击该Adoquery1控件新建一个字段,选Lookup类型,在Look definition的选项中的Dataset选中另一个Adoquery2(指向表Dept),然后Key field
指定表Employee中的dept_id 字段,Lookup fields则指定表 Dept中的dept_id字段,而result fields则选定dept_name字段。这样你就可以当成一个表一样用了。
 
我这里不想这么用。
表Dept的dept_id---dept_name对应关系,我在系统很多地方用得很频繁,每次去查表或者其他表和它关联查询,有点不合算。。
我上面的思路行不通吗?
 
行是行的通,但是如果你的表內容更新了,那你其不是又要更新THashedStringList,單用戶還好說,如果是多用戶的更煩,一個用戶改了那是不是所有的用戶都要跟著去更新THashedStringList?
 
你看看你的while
沒次都new(pso),隻有開辟指針,確沒有dispose(pso)
 
多人接受答案了。
 

Similar threads

S
回复
0
查看
3K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
2K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
1K
SUNSTONE的Delphi笔记
S
后退
顶部