StringGrid使用

jskscxy 2007-09-04 09:47:56
要实现效果:
物料领料单我想用bom配比生成,

表头(edit控件):
领料单号,领料日期,产品名称,预计产量
表体(StringGrid控件):

表体根据表头的产品名称和预计产量生成物料清单

最后将表头和表体分别追加至领料表和领料明细表。

现对我来说主要难度是如何将数据显示到StringGrid控件和将StringGrid控件上的记录追加到表里。

是否还有其他较简单的方法?

最后50分,先谢了...
...全文
209 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
qing2145 2008-03-27
  • 打赏
  • 举报
回复
共同学习
jskscxy 2007-09-04
  • 打赏
  • 举报
回复
那如何将动态生成的bom清单显示在dbgrid空间上
liubinhua 2007-09-04
  • 打赏
  • 举报
回复
我也建议用"天行者"的思路,StringGrid可以做到直接在页面里输入保存...但没有DBedit来得快
jskscxy 2007-09-04
  • 打赏
  • 举报
回复
lynmison老师:

我当时也是向您的思路方向考虑的,无奈太菜,未能实现,
您可否和1楼兄弟一样,帮我写一段,麻烦了!
天行归来 2007-09-04
  • 打赏
  • 举报
回复
表头和表体都可以采用数据感知控件,即Data Controls控件组。
数据表现:
表头(edit控件)->DBEdit、DBComboBox等。
表体(StringGrid控件)->DBGrid或者第三方控件,如DBGridEh等。

数据提交,可以采用动态解析ADODataSet里头的字段及内容,记录集采用批量更新(只是缓冲数据只用,真正提交数据采用动态解析数据集,转成SQL写库)。这种处理方式数据表现时比较简单,并且对数据的处理可以统一到对数据集处理上。
WuChenCan 2007-09-04
  • 打赏
  • 举报
回复
1、设置StringGrid.RowCount 最大行数(物料领料单最大条数)
2、//将数据显示到StringGrid控件
 StringGrid.Cells[1, 1]:=EDTI领料单号.TEXT;
StringGrid.Cells[1, 2]:=EDTI产品名称.TEXT;
...
3、//将StringGrid控件上的记录追加到表里。
  For i:=1 to StringGrid.RowCount -1 do
if StringGrid.Cells[i, 1] <> '' then
begin
adoquery1.close;
adoquery1.sql.text := 'insert tableName(领料单号, 产品名称,...) values('''+StringGrid.Cells[i, 1]:=+''','''+StringGrid.Cells[i, 2]:=+''','''+...+''')';
adoquery1.ExecSql;
end;
jskscxy 2007-09-04
  • 打赏
  • 举报
回复
好复杂哦!我慢慢研究学习,谢谢了...
天行归来 2007-09-04
  • 打赏
  • 举报
回复
呵呵,我只是打杂的,老师可不敢当并且也不想当,解决问题只是一种乐趣。
主细表的大概思路是:
1、通过DS来获取和缓存数据,并通过数据表现控件表示出来。
2、数据储存前,在UI层做些数据校验。
3、后台业务处理模块,对数据集进行处理(比如存储、执行相关业务操作等)
只是提个思路而已,有很多细节需要处理,并且有很多通用函数可以封装。题外话:编写一套成熟的东西需要积累,用成熟的积累做的系统是最快并且BUG最少。

非主细表,有的可以直接通过记录集Post的方法直接写库,根据实际需要(比如表单是视图,可能就不适合采用记录集直接更新到数据库方法)。

先编写几个通用函数:
function G_GetFieldValue(const DataSet: TDataSet; fieldName: string): Variant;
var
retValue: Variant;
begin
Result := Unassigned;
if DataSet.State=dsInactive then Exit;
retValue := DataSet[fieldName];
if retValue <> NULL then Result := retValue;
end;

假定处理领料的后台类是 TOutStorage。
function TOutStorage.DoSave(const mDS,sDS: TDataSet): boolean;
var
i: integer;
strSql: string;
begin
result := false;
//启动事务
//处理主表
strSql := 'insert tableName(领料单号, 领料日期,...) values('''+G_GetFieldValue(mDS,'领料单号')+''','''+G_GetFieldValue(mDS,'领料日期')+''',...)';
//执行SQL,如果失败,需要回滚等并退出操作。

//处理细表
sDS.First;
for i:=1 to sDS.RecordCount do
begin
strSql := 'insert tableName(领料单号, 产品名称,...) values('''+G_GetFieldValue(sDS,'领料单号')+ ''','''+G_GetFieldValue(sDS,'产品名称')+''',...)';
//执行SQL,如果失败,需要回滚等并退出操作。
sDS.Next;
end;
//主细表全部写入成功,则提交事务...
result := true;
end;

2,507

社区成员

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

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