要实现效果:
  物料领料单我想用bom配比生成,  表头(edit控件):
  领料单号,领料日期,产品名称,预计产量
  表体(StringGrid控件):
   
  表体根据表头的产品名称和预计产量生成物料清单最后将表头和表体分别追加至领料表和领料明细表。现对我来说主要难度是如何将数据显示到StringGrid控件和将StringGrid控件上的记录追加到表里。是否还有其他较简单的方法?最后50分,先谢了...

解决方案 »

  1.   

    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;
      

  2.   

    表头和表体都可以采用数据感知控件,即Data Controls控件组。
    数据表现:
      表头(edit控件)->DBEdit、DBComboBox等。
      表体(StringGrid控件)->DBGrid或者第三方控件,如DBGridEh等。数据提交,可以采用动态解析ADODataSet里头的字段及内容,记录集采用批量更新(只是缓冲数据只用,真正提交数据采用动态解析数据集,转成SQL写库)。这种处理方式数据表现时比较简单,并且对数据的处理可以统一到对数据集处理上。
      

  3.   

    lynmison老师:我当时也是向您的思路方向考虑的,无奈太菜,未能实现,
    您可否和1楼兄弟一样,帮我写一段,麻烦了!
      

  4.   

    我也建议用"天行者"的思路,StringGrid可以做到直接在页面里输入保存...但没有DBedit来得快
      

  5.   

    那如何将动态生成的bom清单显示在dbgrid空间上
      

  6.   

    呵呵,我只是打杂的,老师可不敢当并且也不想当,解决问题只是一种乐趣。
    主细表的大概思路是:
      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;