交叉数据表编辑的超难问题

QDZZQ 2002-11-12 03:35:15
例如
table1 车间
table2 考核项目
table3 车间编号
考核项目编号
考核得分


最好的编辑界面类似
车间1 车间2 车间3 。。。。。。
项目1 20 30 40
项目2
项目3




怎么实现编辑界面???

...全文
21 19 打赏 收藏 转发到动态 举报
写回复
用AI写文章
19 条回复
切换为时间正序
请发表友善的回复…
发表回复
zhangqiufk 2002-11-24
  • 打赏
  • 举报
回复
我建议获取编辑数据时:
用 {Table1-->ADOQuery1,Table2-->ADOQuery2]}-->Create TTable,Table3-->[ADOQuery3,(Read/Write)]-->[TTable]-->[TDBGrid] 结构。
编辑数据存回Table3时:
用[TDBGrid]-->[TTable]-->[ADOQuery3,(Read/Write)]-->Table3结构。
以[TTable]作内存临时表。
用TTable创建PARADOX表:
type
TForm1 = class(TForm)
Table1: TTable;
ADOConnection1: TADOConnection;
ADOQuery1: TADOQuery;
ADOQuery2: TADOQuery;
ADOQuery3: TADOQuery;
DataSource1: TDataSource;
DBGrid1: TDBGrid;
procedure FormCreate(Sender: TObject);
procedure FormDestroy(Sender: TObject);
procedure FormShow(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;

procedure TForm1.FormCreate(Sender: TObject);
var
aStrX:String;
begin
with talbe1 do
begin
DatabaseName = '.\';
TableName = ‘TempTableName’;
tabletype = ttparadox;
with fielddefs do
begin
add('考核得分'{字段名}, ftstring{字段类型,看帮助}, 25{长度}, 0);

if AdoQuery1.RecordCount>0 then
begin
AdoQuery1.First;
while AdoQuery1.Not Eof do
begin
aStrX:=AdoQuery1.FieldByName('车间').AsString;

add(aStrX{字段名}, ftstring{字段类型,看帮助}, 25{长度}, 0);

AdoQuery1.Next;
end;
end;
end;
indexdefs.add('考核得分'...{建立索引,看帮助})
CreateTable;
CachedUpdates:=True;{临时存于内存}

end;
end;
//预置编辑数据:
procedure TForm1.FormShow(Sender: TObject);
begin
//将ADOQuery2内容写进Table1;
{To Do ....}
//将ADOQuery3(即Table3)内容写进Table1;
{To Do ....}

//
DataSource1.DataSet:=Table1;
DBGrid1.DataSource:=DataSource1;
DBGrid1.Refresh;
end;

用完Table1后磁盘中实际上有‘TempTableName’表,程式结束(Form On Destroy)时执行:
procedure TForm1.FormDestroy(Sender: TObject);
begin
table1.CancelUpdates;
table1.DeleteTable;
end;

如果用StringGrid做编辑界面,可用数组作为存贮缓冲,再由数组写数据到ADOQuery3,然后提交到数据表Table3,但要复印杂些。
QDZZQ 2002-11-20
  • 打赏
  • 举报
回复
zhangqiufk(真言) 理解分析的很透彻,我想用grid和三个ADOQuery写一个控件去实现该功能,一个连接字段表,一个连接项目表,另一个动态SQL语句修改和获得关系数据,并提交给grid

现在存在一个问题,如何建立动态内存数据表??
QDZZQ 2002-11-20
  • 打赏
  • 举报
回复
zhangqiufk(真言) 理解分析的很透彻,我想用grid和四个ADOQuery写一个控件去实现该功能,一个连接字段表,一个连接项目表,一个连接关系表,另一个动态SQL语句修改和获得关系数据,并提交给grid
delphi0build 2002-11-15
  • 打赏
  • 举报
回复
这个问题类似的有很多了
一般来说写入临时表是比较好的方法,以前的一个问题,贴出来给你看一下!gg_spbm表:
> prod_no(商品编号,主键) old_type(原型号) new_type(新型号)
> 100008/2.5-05 100008/2.5 618/2.5
>kc_kc2表:
> prod_no whouse_no(库房编号) amt(数量)
>100008/2.5-05 库房1 300
>100008/2.5-05 库房2 20
>100008/2.5-05 库房9 20
>要求对以上两个表做联接,查询出如下结果:
> prod_no old_type new_type 库房1 库房2 库房9
>100008/2.5-05 100008/2.5 618/2.5 300 20 20


解决方法1,建临时表temp_table(prod_no,old_type,new_type,amt_1,amt_2,....,amt_9)
若还有其他库房则增加相应子段amt_x
2, 在临时表中为每种商品建立一条记录(注意先清空临时表)
即将gg_spbm拷贝到temp_table
3,为temp_table中每个amt_x子段设定相应值
update temp_table
set amt_x = -----此处amt_x为实际子段如amt_2
(select amt from kc_kc2
where temp_table.prod_no = kc_kc2.prod_no
and whouse_no = '库房x')---x为实际值如2
4,将3重复若干次

注意,次钟方法是没办法的办法,以后要注意将表设计好一点
以免遇上此类问题



pdbird 2002-11-15
  • 打赏
  • 举报
回复
//jiaclassmate(jia),你可以帮我看看这个问题
//先谢谢了!!!
数据库为Access,表格名和表格的字段见下面:

表source
--------------------------------------------------------------------
时间 车号 货物名称 货物净重 用户单位 ...
02-10-1 111 一级灰 2000 本厂
02-10-1 222 二级灰 3000 二厂
02-10-2 333 灰渣 4000 二厂
...
02-11-1 444 二级灰 66666 一厂
02-11-1 555 一级灰 44444 本厂
...
-------------------------------------------------------------------
表employee //此表用来修改本厂的司机
-------------------------------------------------------------------
车号 司机 单位 ...
555 张三 本厂
111 李四 本厂
...
-------------------------------------------------------------------
表users //此表用来修改外厂的车号
-------------------------------------------------------------------
车号 用户单位 ...
222 二厂
333 二厂
444 一厂
...
-------------------------------------------------------------------

我要做这么样的一个月报表:
-------------------------------------------------------------------
数 量
用户单位 |------------------------------------------| 统计总数量 |
本 厂 | 自 装
-------------------------------------------------------------------
一厂 | 56000000 | 1000000000000 | 10056000000 |
-------------------------------------------------------------------
二厂 | 22200000 | 8000000000000 | 80022200000 |
-------------------------------------------------------------------
三厂 | 33300000 | 4000000000000 | 40033300000 |
-------------------------------------------------------------------
四厂 | 45400000 | 5000000000000 | 50045400000 |
-------------------------------------------------------------------
... | ... ... ...
-------------------------------------------------------------------
合计 | 234242424200000 | 56757575500000 |3453242342000|
-------------------------------------------------------------------

//本厂指本厂司机所运送的货物量,自装为外厂自己装的货物量,统计总数量为两和。
zhangqiufk 2002-11-15
  • 打赏
  • 举报
回复
QDZZQ 的意思是問如何像Excel那樣編輯表:
table3 车间编号
考核项目编号
考核得分
? 而不是問如何得到table3的數據(sql用join,group by).
常規編輯是:
|考核项目编号|车间编号|考核得分|

项目1 车间1 20
项目1 车间2 30
. . .
. . .
项目2 车间1 22
项目2 车间2 32
. . .
. . .

如果以"车间1 车间2 车间3 。。。。。。"作為DBGrid字段,
則要動態生成字段名表"考核得分,车间1,车间2,车间3 。。。。。。"
然後加到sql語句中,產生臨時表,再幫定到DBGrid.
然後預先填寫(Append):

项目1
项目2
项目3
项目4
.
.
----不確定數量的記錄.
注意:字段"考核得分"的值集合是:
{"项目1","项目2","项目3"...}
這讓,得到一個中國人習慣的表格,西方人不會習慣這讓填表:
-------------------------------------------------
|考核得分|车间1|车间2|车间3|车间4|车间5|车间6|...
| 项目 1 | 20 | 30 | | | | |
| 项目 2 | 22 | 32 | | | | |
| 项目 3 | | | | | | |

難點:動態SQL語句,自己想去...

QDZZQ 2002-11-14
  • 打赏
  • 举报
回复
等些天看看
QDZZQ 2002-11-14
  • 打赏
  • 举报
回复
如果没有就打算写一个仅限于日期、数值、字符型的控件,如果有还是希望大家推荐,现有的比较成熟。
QDZZQ 2002-11-13
  • 打赏
  • 举报
回复
只修改交叉点的数据,可以实现的,用grid自己完全可以写一个,然后用代码更新数据库,控制一下数据类型即可实现的,不是很难的。
jiaclassmate 2002-11-13
  • 打赏
  • 举报
回复
你查询的结果是从三个表里取的,怎么编辑?结果只是在内存里,如果要修改必须改table1--table3的内容。
QDZZQ 2002-11-13
  • 打赏
  • 举报
回复
关键是编辑阿,查询好作的,实时编辑,我觉得自己写一个控件完全可以作到的,就是嫌麻烦
sun_cathay 2002-11-13
  • 打赏
  • 举报
回复
pb里面有数据窗口,有几种风格当然比较容易,在delphi中,如果就是
打印出这种效果也容易啊
jiaclassmate 2002-11-13
  • 打赏
  • 举报
回复
你的问题不是第一个遇到的,我在这两个月里至少看到了三个帖子,都是这种问题,我没看到特别好的方法。把查询的结果放到Query里其他操作就好说了
QDZZQ 2002-11-13
  • 打赏
  • 举报
回复
我的想法最好有个控件可以利用,作报表是有控件的,而且据说powerbuilder里面实现也容易,grid方式编辑最友好
jiaclassmate 2002-11-13
  • 打赏
  • 举报
回复
对不起,上面的代码少了点东西,用这个吧
With ADOQuery1 do
begin
Close;
SQL.Clear;
SQL.Add('select distinct 车间 from table1');
SQL.open;
end;
With ADOQuery2 do
begin
close;
SQL.Clear;
SQL.ADD('select distinct 考核项目 );
While Not ADOQUery1.EOF do
begin
SQL.ADd(',(select sum(考核得分) from table3 where 考核项目编号=table2.考核项目 ');
SQL.ADD(format('and 车间编号=''%s'')as %s',[ADOQuery1.Fields[0].Asstring,ADOQuery1.Fields[0].Asstring]));
ADOQuery1.Next;
end;
SQL.add('from table2');
SQL.SaveToFile('1.sql');//调试用
Open;
end;
  • 打赏
  • 举报
回复
给我也发一个
deluxtx@sohu.com
sun_cathay 2002-11-13
  • 打赏
  • 举报
回复
如果你写好了,发给我一个
qiluzhizi@163.net
jiaclassmate 2002-11-12
  • 打赏
  • 举报
回复
With ADOQuery1 do
begin
Close;
SQL.Clear;
SQL.Add('select distinct 车间 from table1');
SQL.open;
end;
With ADOQuery2 do
begin
close;
SQL.Clear;
SQL.ADD('select distinct 考核项目 );
While Not ADOQUery1.EOF do
begin
SQL.ADd(',(select sum(考核得分) from table3 where 考核项目编号=table2.考核项目 ');
SQL.ADD(format('and 车间编号=''%s'')as %s',[ADOQuery1.Fields[0].Asstring,ADOQuery1.Fields[0].Asstring]));
ADOQuery1.Next;
end;
SQL.SaveToFile('1.sql');//调试用
Open;
end;
dyf2001 2002-11-12
  • 打赏
  • 举报
回复
查询已经挺复杂了,编辑吗dbgrid肯定不行。除非你在stringgrid中输入,然后用sql语句更新回数据库

2,495

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 数据库相关
社区管理员
  • 数据库相关社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧