要实现效果:
物料领料单我想用bom配比生成, 表头(edit控件):
领料单号,领料日期,产品名称,预计产量
表体(StringGrid控件):
表体根据表头的产品名称和预计产量生成物料清单最后将表头和表体分别追加至领料表和领料明细表。现对我来说主要难度是如何将数据显示到StringGrid控件和将StringGrid控件上的记录追加到表里。是否还有其他较简单的方法?最后50分,先谢了...
物料领料单我想用bom配比生成, 表头(edit控件):
领料单号,领料日期,产品名称,预计产量
表体(StringGrid控件):
表体根据表头的产品名称和预计产量生成物料清单最后将表头和表体分别追加至领料表和领料明细表。现对我来说主要难度是如何将数据显示到StringGrid控件和将StringGrid控件上的记录追加到表里。是否还有其他较简单的方法?最后50分,先谢了...
解决方案 »
- 急!fastreport显示存储过程里的数据,每一次执行,列的数量是未知的
- 请教关于程序设计结构的问题?
- ODAC的oraQuery,在缓存模式下ApplyUpdates和CommitUpdates有什么不一样 ?
- 超级简单的问题。ShellTreeView怎么让它的ReadOnly为True。现在我发现它没有这个属性。顶者有分!
- 安装了Castalia后第一次打开Project,都会出现错误
- 小虾问大侠简单问题
- 初学者的小问题
- 报表的问题
- 简单问题给100分
- 各位道友帮个忙,Delphi 调用 Oracle8i 存储过程参数问题(特急!!!)
- Delphi list index out of bounds(1) Error
- 发布自画TlistView带进度条的Item 源码
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;
数据表现:
表头(edit控件)->DBEdit、DBComboBox等。
表体(StringGrid控件)->DBGrid或者第三方控件,如DBGridEh等。数据提交,可以采用动态解析ADODataSet里头的字段及内容,记录集采用批量更新(只是缓冲数据只用,真正提交数据采用动态解析数据集,转成SQL写库)。这种处理方式数据表现时比较简单,并且对数据的处理可以统一到对数据集处理上。
您可否和1楼兄弟一样,帮我写一段,麻烦了!
主细表的大概思路是:
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;