600分的简单问题,LOOKUP字段高手请进(300分)

  • 主题发起人 主题发起人 英国病人
  • 开始时间 开始时间

英国病人

Unregistered / Unconfirmed
GUEST, unregistred user!
任意分类编码级数,每一级编码由“父编码”加上“编码”表示,编码表如下:
父编码 编码 名称
001 xxxx
001 001 xxxx
001 002 xxxx
001-001 001 xxxx
001-001 002 xxxx
001-001-001 001 xxxx
..
另有数据表: 编码 数据1 数据2 (编码=编码表.父编码+'-'+编码表.编码)

分类级数可以任意不固定看用户需要,现在我想用QUERY输出到dxDBGrid列为:
1级分类名称 2级分类名称 ..... n级分类名称 数据1 数据2

请教怎样能实现?为了这个问题我头都大了,600分奉上只为学习学习,看看谁的方法好,
要求能够在dxdbgrid里编辑名称,而存入的是编码,要得高分的请给出详细代码和说明,
代码最好调试通过,谢谢;
 
我也不大清楚,不过我记得"刘艺"的书里面好象提到过.<delphi企业级解决方案>,你看看.
 
显示名称,存贮代码,这个你最好用存贮过程实现。
 
請問dxdbgrid 控件在那裡有下載
 
你这是准备做MRP还是做什么? 我用VF做过.
DELPHI我没试过.
 
你这个问题实在不止600分,
这段代码是MRP的精华部份.
 
我觉得你的处理方法有些问题,我提个建议不知道可否:
1、分类编码用树型结构来显示,根据用户自己定义的层数来分级;
2、数据部分用DBGRID之类的控件来显示,在TREEVIEW中,每点击一个分类编码,在DBGIRD
中就显示该编码及其子类编码所对应的所有数据。
 
to 風:http://www.delphibyte.com/

to baney: 再加600

荷塘新月:请按要求做,问题简单了我就不麻烦您啦,呵呵~
 
哥们,
我DELPHI还是在初学阶段,
但VF的源码我有,我曾用VF做过MRP部份,
物料清单的查询部份的代码我可以给你.不知道对你有没有用.
我的做法是做一个无限循环,在循环中反复查询,真到条件许可后退出循环,生成临时表.
这个临时表你怎么样显示都可以的.
这种方法说实在的有点笨,大数据量不是太适合.但我实在没想出更好的方法.
但我的方法好处在于无论你的层数有多少,我都可以搞定,而且我可以定义查多少层.
 
我不是大夫,不过好像你的问题的确有点病。看看吧,我没有是过,不同的数据库语句会不同不行在来信。
以下是以SQLSERVER为例:
query1.sql.add('select max(len(father)) as maxlen from pub');
query1.open;
level:=(strtoint(query1['maxlen'])+1)/4;//取出最大的级数

if level>1 then
begin
for i:=2 to level do
sql:=sql+',rigth(left(father,'+inttostr(i*4-1)+'),'+inttostr(i-1)+')';
end
sql:='LEFT(father, 3) as "1级分类名称" '+sql;//生成SQL语句。
SQL:='SELECT '+sql+' from pub';
query1.sql.clear;
query1.sql.add(sql);
…………
最终生成类似:
SELECT LEFT(father, 3) as "1级分类名称" ,rigth(left(father,7),3) as "2级分类名称" ……
语句来查询。
有几点建议:1不要用“-”来区分各级,图自增加算法的难度,直接连接即可如:001002001。
2可以用回溯法来生成熟壮视图,这样编辑起来很形象。
 
TO t1122:
我是希望在DBGRID里显示并通过LOOKUP字段选择与编码相对应的名称,而不是仅仅显示
那几级编码,重点在动态生成LOOKUP字段(因为级数事先并不知道),这点是我需要的。
如果我只显示那几级编码,你的代码思路是完全正确的,我的代码如下:
j:=1;
while level>0 do
begin
sqlstr:=sqlstr+',mid(类别编码,'+inttoStr(j)+',3)';
level:=level-1;
j:=j+4;
end;
或者是这样:
j:=3;
while level>0 do
begin
sstr:=sstr+',mid(类别编码,1,'+inttostr(j)+')';
level:=level-1;
j:=j+4;
end;
但这并不能满足我的要求,不过还是要谢谢你
 
procedure TForm1.OpenLookups(inCode: string);
var
i, n, l: Integer;
begin
{
ADODataSet1是grid的表,CommandText =
SELECT SUBSTRING(编码, 1, 3) c1, SUBSTRING(编码, 5, 3) c2, SUBSTRING(编码, 9, 3) c3, 数据1, 数据...
FROM 数据表
假设有n层代码,并已定义了n个TwwDBLookupCombo,
并且已放入数据lbc中(如:
lbc: array[0..2] of TwwDBLookupCombo
...
lbc[0] := wwDBLookupCombo1;
lbc[1] := wwDBLookupCombo2;
lbc[2] := wwDBLookupCombo3;
),各wwDBLookupCombo已关联到DBGrid的相应字段中。
参数inCode是完整父代码
}
n := 3;
l := (Length(inCode) + 1) div 4;
for i := 1 to n - 1 do
with lbc.LookupTable as TADODataSet do begin
Close;
if i > l then
CommandText := 'select 编码, 名称 form 编码表 where 编码 = '''''
else
CommandText := 'select 编码, 名称 from 编码表 where 父编码 = ''' + Copy(inCode, i * 4 - 3, 3) + '''';
Open;
end;
end;
 
这个问题我做过,不过这里并不算复杂,而且也是有不足的地方,楼上的几位仁兄都答出
某方面的问题,不过我想将这个思路在这里公开,而且代码也很多很多!
请将具体信息(英国病人)妹到beetaim@yeah.net联系!咱用妹儿联系
 
to 病人:
看来我是大意了,你看,有抢生意的:)
调整如下语句:
SQL:='SELECT '+sql+' from pub';->SQL:='SELECT '+sql+',name from pub';
然后你就可以收工了。
说真的,我不赞同你用loopup,真的用不着。而且,如果是我,一定要用树状视图。不过看自
300份上……
to beeta:
有好东西拿出来吗,不如这样,请病人把我的分数(如果有的话)给你,贴出来大家研究研究。
 
不知道各位是否用过dexexpress 的dxdbgrid,反正用了它之后我是越来越懒了,不管什么
都用它,它的拖动分组、点击列头排序,可设置左右固定列等等功能太强大了几乎不用编程
,并且打印程序都不用编了,将表直接输出到excel,可利用EXCEL的预显和打印,所见即所得,
并不是鼓励大家不好好学习编程,但这个东西在项目很急的时候确是个省时间的好东西,而且
很有专业味道,我现在就是想把N级分类名称作为列头,这样可以方便利用它的分组功能,
在DXDBGRID里做树型显示而且自动统计求和计数是不是很诱人很专业呢,而得到这样的结果
只需要把各级编码名称按顺序显示在DXDBGRID里就可以了,要求可以修改,那么就必须是LOOKUP
字段,你可以选择编码名称,而它存入的将是名称对应的编码。
对于使用DXDBGRID,我开了另一个问题,让大家交流讨论,1000分用于分给提供有价值经验
的大侠,希望大家光临...
to Kisber:dxdbgrid 好像不支持外部控件关联,所以你的方法....也许你能让那些控件
和dxdbgrid关联?
to t1122:耐心听听大家发言吧,肯定有你分,别着急 :)
  to beeta:已经给你去信了请查收
 
to英国病人:已经收到你的来信,但我还不清楚你所指的LookUP功能的具体实现要求!请
详细描述一下,我写出代码给你,应该没问题吧!
toALL:大家放心,我一定会把代码公开的!
 
已得到数据集: 流水号、1级编码、2级编码....n级编码、数据1、数据2 并已存入access tb1表中
数据集与dxdbgrid1关联,现用该dxdbgrid做界面,供用户做修改,和分组查询及排序
不能给用户看编码,而应该是显示编码表里对应的编码名称,用户要修改需要通过LOOKUP字段选择编码名称
而存回tb1的应该是名称对应的编码,显然要每级分类要对应一个LOOKUP字段,就是说LOOKUP字段的keyfield
应该是tb1的那n级编码字段,有几级分类就要动态的添加几个LOOKUP字段

呵呵~ 不知道我说清楚了没有
 
英国病人,看来我的中医医不了你的病了。我用的是InfoPowner的TwwDBGrid,也试了你的
要求,可以看,可以改;但没想到......
更没想到的是你说的dxdbgrid这么好,怎么不早点告诉我呢,害我辛苦一个星期,编了一大
堆程序来完成那种“点头排序”“点头设filter”的功能。没天理。
mail个dxdbgrid给我,怎么样?kisber@163.com
 
to kisber:
去这里下载:http://www.delphibyte.com/
dexexpress控件包,里面的控件都很棒,十几兆呢,无法MAIL,去DOWN吧,你不会后悔的

 

Similar threads

D
回复
0
查看
2K
DelphiTeacher的专栏
D
D
回复
0
查看
1K
DelphiTeacher的专栏
D
D
回复
0
查看
1K
DelphiTeacher的专栏
D
后退
顶部