起步软件技术论坛-X3

 找回密码
 立即注册
搜索
查看: 369|回复: 16

【结帖】功能退出出错怎么解决?**

[复制链接]
发表于 2008-7-3 15:19:49 | 显示全部楼层 |阅读模式
我在功能A的DATAGRID中点击某列运行另一个功能B,运行正常,当关闭功能B退出的时候就报错,是怎么回事?

错误.jpg

98.18 KB, 下载次数: 225

回复

使用道具 举报

发表于 2008-7-3 15:26:35 | 显示全部楼层
请把你的代码贴完整,你的Func是什么?
回复 支持 反对

使用道具 举报

 楼主| 发表于 2008-7-3 15:47:01 | 显示全部楼层
贴哪部分代码 func是模具计划上传那个功能 一退出的时候就在系统核心库的这个地方报错
回复 支持 反对

使用道具 举报

发表于 2008-7-3 15:54:01 | 显示全部楼层
贴你自己的代码
回复 支持 反对

使用道具 举报

 楼主| 发表于 2008-7-3 15:57:04 | 显示全部楼层
请帮忙看一下

计划.rar

1.08 MB, 下载次数: 42

回复 支持 反对

使用道具 举报

发表于 2008-7-3 16:29:33 | 显示全部楼层
楼主,你的资源没有数据库
回复 支持 反对

使用道具 举报

 楼主| 发表于 2008-7-3 17:31:38 | 显示全部楼层
unit MainForm;

interface

uses
  Business.System, Business.Model, Business.Forms, Business.Data;

type
  TMainForm = class(TForm)
    FuncBroker: TFuncBroker;
    InfoBrokerMOLDPLANUPLOADINFO: TInfoBroker;
    Panel: TPanel;
    DocViewMOLDPLANUPLOADINFO_JHSJWG: TDocView;
    Panel1: TPanel;
    ExcelToTable1: TExcelToTable;
    MoldPlanDataSetBroker: TDataSetBroker;
    NodeDataSetBroker: TDataSetBroker;
    OpenDialog1: TOpenDialog;
    InDataSetBroker: TDataSetBroker;
    ToolBar1: TToolBar;
    btnInExcel: TToolButton;
    ToolButton1: TToolButton;
    btnOutExcel: TToolButton;
    ToolButton2: TToolButton;
    btnSave: TToolButton;
    SaveDialog1: TSaveDialog;
    procedure BizFormCreate(Sender: TObject);
    procedure BizFormCloseQuery(Sender: TObject; var CanClose: Boolean);
    procedure btnInExcelClick(Sender: TObject);
    procedure btnSaveClick(Sender: TObject);
    procedure btnOutExcelClick(Sender: TObject);
  private
    {private declarations}
    procedure SetUpMakeAddress(lDataSet:TDataSet);
    procedure SaveMoldDataSet(MoldDS:TDataSet);
    procedure ImportExcel();
    procedure FillMoldDataSet();
    procedure TrimDataSet(TempDS:TDataSet);
    procedure TransData(InDataSet: TDataSet);//获取导入数据集的表头
    procedure CreateUserDataSet();
    procedure MoldPlanToUserDS(ProjectID:string);//获取某项目下属的模具计划 拆分数据到用户数据集 进行显示
    procedure DataGridCustomDrawCell(Sender: TObject; ACanvas: TCanvas; ARect: TRect; ANode: TTreeListNode; AColumn: TTreeListColumn; ASelected, AFocused, ANewItemRow: Boolean; var AText: string; var AColor: Integer; AFont: TFont; var AAlignment: TAlignment; var ADone: Boolean);
    Function  ValidateData(ProjectID:string):Boolean;
  public
    {public declarations}
    NodeDataSet: TDataSet;
    UserDataSet: TUserDataSet;
    lNodeNameToIDs:TStrings;
    FaultMoldID:TStrings;
    ZZDIndex:Integer;
    ProjectID:string;
    TransType:string;
  end;

implementation

{**************************************
   procedure:    TransData
   Describe:     拆分数据集
   Author:       DeyuLiu
   Date:         2008-06-27
**************************************/}
procedure TMainForm.TransData(InDataSet:TDataSet);
var
    lHeaderNames:TStrings;
    i,j:Integer;
    flag:Boolean;
    str:string;
begin
    try
        if (InDataSet<>nil) and (InDataSet.RecordCount>1) then
        begin
            UserDataSet.Open;
            UserDataSet.DisableControls;
            UserDataSet.EmptyDataSet;
            flag:=true;
            lHeaderNames:=TStringList.Create;
            InDataSet.First;
            for i:=0 to InDataSet.FieldCount-1 do
            begin
                lHeaderNames.Add(InDataSet.Fields.AsString);
                //第一个制造地
                if flag then
                begin
                    str:=InDataSet.Fields.AsString;
                    if (str.Length>3) and (str.Substring(str.Length-3,3)='制造地') then
                    begin
                        ZZDIndex:=i+1;
                        flag:=false;
                    end;
                end;
            end;
            InDataSet.Next;
            for j:=1 to InDataSet.RecordCount-1 do
            begin
                UserDataSet.Append;
                for i:=0 to InDataSet.FieldCount-1 do
                begin
                    try
                        if lHeaderNames<>'' then
                        begin
                            UserDataSet.FieldByName(lNodeNameToIDs.Values[lHeaderNames]).AsString := InDataSet.Fields.AsString;     //赋值方式需要修改
                        end
                        else
                        begin
                            break;
                        end;
                    except
                        Dialogs.ShowMessage('导入的文档格式不正确');
                        UserDataSet.EmptyDataSet;
                    end;
                end;
                UserDataSet.Post;
                InDataSet.Next;
            end;
            ValidateData(ProjectID);
            UserDataSet.EnableControls;
        end;
    finally
      // lHeaderNames.Free;
    end;
end;

{**************************************
   procedure:    CreateUserDataSet
   Describe:     创建自定义的用户数据集进行数据表现
   Author:       DeyuLiu
   Date:         2008-06-27
**************************************/}
procedure TMainForm.CreateUserDataSet();
var
    i : integer;
    tempBizField: TBizField;
    source:TDataSource;
    database:TBizRef;
    connectionstring:string;
    connectionurl:array of string;
begin
    try
        source:=TDataSource.Create(self);
        NodeDataSet:=NodeDataSetBroker.DataSet;
        if (UserDataSet = nil) then
        begin
            UserDataSet := TUserDataSet.Create(self);          //创建自定义数据集
            //UserDataSet.ConnectionString:=CommonFunction.TCOMMONFUNCTION.GetSystemDBConnectionString;
            lNodeNameToIDs:=TStringList.Create;
            UserDataSet.DisableControls;
            NodeDataSet.Open;
            try
                UserDataSet.ID := 'UserDataSet';

                tempBizField := TUserDataField.Create(UserDataSet); //创建用户数据字段
                tempBizField.DataSet := UserDataSet;                //指定字段所在的数据集
                tempBizField.ID := 'MoldID';                        //设置字段ID
                tempBizField.DataType := TDataType.dtString;        //设置字段类型
                tempBizField.Size := 10;                            //设置字段大小
                tempBizField.DisplayName := '制号';                 //设置字段显示名称
                tempBizField.Name := 'MoldID';
                lNodeNameToIDs.Add('制号=MoldID');                       //设置字段名称

                tempBizField := TUserDataField.Create(UserDataSet); //创建用户数据字段
                tempBizField.DataSet := UserDataSet;                //指定字段所在的数据集
                tempBizField.ID := 'BZT';                        //设置字段ID
                tempBizField.DataType := TDataType.dtString;        //设置字段类型
                tempBizField.Size := 4;                            //设置字段大小
                tempBizField.DisplayName := '标准套';                 //设置字段显示名称
                tempBizField.Name := 'BZT';
                lNodeNameToIDs.Add('标准套=BZT');                       //设置字段名称

                NodeDataSet.First;
                for  i := 1 to NodeDataSet.RecordCount do
                begin
                    if NodeDataSet.FieldByName('IsDisplay').AsInteger = 1 then
                    begin
                        tempBizField := TUserDataField.Create(UserDataSet);                            //创建用户数据字段
                        tempBizField.DataSet := UserDataSet;                                           //指定字段所在的数据集
                        tempBizField.ID := NodeDataSet.FieldByName('NodeAlias').AsString;              //设置字段ID
                        tempBizField.DataType := TDataType.dtString;                                   //设置字段类型
                        tempBizField.Size := 12;                                                       //设置字段大小
                        tempBizField.ValidChars:='-';

                        tempBizField.DisplayName := NodeDataSet.FieldByName('NodeName').AsString;      //设置字段显示名称
                        tempBizField.Name := NodeDataSet.FieldByName('NodeAlias').AsString;            //设置字段名称
                        lNodeNameToIDs.Add(NodeDataSet.FieldByName('NodeName').AsString + '=' +NodeDataSet.FieldByName('NodeAlias').AsString);
                    end;
                    NodeDataSet.Next;
                end;

                NodeDataSet.First;
                for  i := 1 to NodeDataSet.RecordCount do
                begin
                    if NodeDataSet.FieldByName('IsDisplay').AsInteger = 1 then
                    begin
                        tempBizField := TUserDataField.Create(UserDataSet);                                       //创建用户数据字段
                        tempBizField.DataSet := UserDataSet;                                                      //指定字段所在的数据集
                        tempBizField.ID := NodeDataSet.FieldByName('NodeAlias').AsString + 'ZZD';                 //设置字段ID
                        tempBizField.DataType := TDataType.dtString;                                              //设置字段类型
                        tempBizField.Size := 16;                                                                  //设置字段大小
                        tempBizField.DisplayName := NodeDataSet.FieldByName('NodeName').AsString + '制造地';      //设置字段显示名称
                        tempBizField.Name := NodeDataSet.FieldByName('NodeAlias').AsString + 'ZZD';               //设置字段名称
                        lNodeNameToIDs.Add(NodeDataSet.FieldByName('NodeName').AsString + '制造地=' +NodeDataSet.FieldByName('NodeAlias').AsString + 'ZZD');
                        //定义查找属性
                        database:=TBizRef.Create(self);
                        connectionstring:=CommonFunction.TCOMMONFUNCTION.GetSystemDBConnectionString;
                        connectionurl:=connectionstring.Split(['=']);
                        database.URL:=connectionurl[1];
                        tempBizField.LookupDef.DataBase:=database;
                        tempBizField.LookupDef.Kind:=TLookupKind.lkDataValues;
                        tempBizField.LookupDef.ValidateKind:=TLookupValidateKind.vkMust;
                        tempBizField.LookupDef.SQL.Text:='select FDisplayName from TDEPT where FPARENTGUID=(select FGUID from TDept where FID=''TQM'' ) ';
                        tempBizField.LookupDef.KeyField:='FDisplayName';
                        tempBizField.LookupDef.DisplayField:='FDisplayName';
                        //tempBizField.LookupDef.DropDownButton:=true;
                        tempBizField.LookupDef.Options:=[TLookupOption.loDropDownButton, TLookupOption.loDropDownList];
                    end;
                    NodeDataSet.Next;
                end;
                source.DataSet:=UserDataSet;
                UserDataSet.Open;
                MoldPlanUploadInfo.TJHSJWG(DocViewMOLDPLANUPLOADINFO_JHSJWG.Doc).DataGrid.DataSource:=source;
                UserDataSet.EnableControls;
            except
                UserDataSet.Free;
                UserDataSet := nil;
                raise;
            end;
        end
        else
            Dialogs.ShowMessage('自定义数据集不能被创建');
    finally
       //source.Free;
       //lNodeNameToIDs.Free;
    end;
end;


{**************************************
   procedure:    ImportExcel
   Describe:     导入Excel到临时数据集
   Author:       Panyc
   Date:         2008-06-23
**************************************/}
procedure TMainForm.ImportExcel();
var
    ErrStr:string;
begin
    try
    ErrStr:='';
    InDataSetBroker.DataSet.Open;
    InDataSetBroker.DataSet.EmptyDataSet;
    if OpenDialog1.Execute then
    begin
        MoldPlanUploadInfo.TJHSJWG(DocViewMOLDPLANUPLOADINFO_JHSJWG.Doc).DataGrid.Cursor:=Business.Forms.Controls.crAppStart;
        //MoldPlanUploadInfo.TJHSJWG(DocViewMOLDPLANUPLOADINFO_JHSJWG.Doc).DataGrid.Cursor:=Business.Forms.Controls;
        excelToTable1.FileName:=OpenDialog1.FileName;
        ExcelToTable1.Execute(ErrStr);
        TrimDataSet(InDataSetBroker.DataSet);
        TransData(InDataSetBroker.DataSet);
        SetUpMakeAddress(UserDataSet);
        MoldPlanUploadInfo.TJHSJWG(DocViewMOLDPLANUPLOADINFO_JHSJWG.Doc).DataGrid.Cursor:=Business.Forms.Controls.crDefault;
    end;
    Except
        dialogs.ShowMessage('导入格式不正确');
        UserDataSet.EmptyDataSet;
        InDataSetBroker.DataSet.EmptyDataSet;
    end;
end;

{**************************************
   procedure:    FillMoldDataSet
   Describe:     填充模具计划数据集 该数据集与数据库同构
   Author:       Panyc
   Date:         2008-06-24
**************************************/}
procedure TMainForm.FillMoldDataSet();
var
   MoldPlanDS:TDataSet;  //模具计划数据集
   NodeDS:TDataSet;   //节点数据集
   FieldName,MoldID,NodeID,NodeName,MakeCompanyID,MakeCompanyName:string; //列名 模具编号
   PlanOperator,MakeCompanyValue:string;     //计划操作者
   lQuery:TQuery;
   RelationNodeName,RelationNodeID:string;
   BuChang:integer;
   sql:string; //查询语句
   PlanDate:string;
   RelPlanDate:string;
   FieldCount,i,isExist:integer;
   tempDate:TDateTime;
begin
   try
       lQuery:=TQuery.Create(nil);
       lQuery.ConnectionString:=CommonFunction.TCOMMONFUNCTION.GetSystemDBConnectionString;
       MoldPlanDS:=MoldPlanDataSetBroker.DataSet;
       NodeDS:=NodeDataSetBroker.DataSet;
       FieldCount:=UserDataSet.Fields.Count;
      // PlanOperator:=SystemCore.TSystemCore.Operator.ID;
       MoldPlanDS.Open;
       MoldPlanDS.EmptyDataSet;
       UserDataSet.First;
       while not UserDataSet.Eof do //遍历演示数据集的行
       begin
           MoldID:=UserDataSet.FieldByName('MoldID').AsString;
           NodeDS.Open;
           NodeDS.First;
           while not NodeDS.Eof do //轮询节点表
           begin
              isExist:=1;
              RelationNodeID:='';
              MakeCompanyID:='';
              FieldName:='';
              NodeID:=NodeDS.FieldByName('NodeID').AsString;   //获取节点编号
              NodeName:=NodeDS.FieldByName('NodeName').AsString; //获取节点名称

              if NodeDS.FieldByName('IsDisplay').AsInteger=1 then // 当前节点数据在Excel中是存在的
              begin
                  for i:=0 to FieldCount-1 do  //遍历显示数据集的列
                  begin
                       if UserDataSet.Fields.DisplayName=NodeName then  //找到和节点对应的列
                       begin
                          FieldName:=UserDataSet.Fields.FieldName;
                          break;
                       end;
                  end;
                  PlanDate:=UserDataSet.FieldByName(FieldName).AsString; //取出该列对应的值
                  if PlanDate='-' then  //判断数据库中该节点是否有数据 如果有维持原有数据 同时将标示位置为0 如果不存在数据 则填充空
                  begin //表示该节点不存在
                     sql:='select PlanDate from AM_TMOLDPLAN where NodeID='''+NodeID+'''';
                     lQuery.Close;
                     lQuery.CommandText:=sql;
                     lQuery.Open;
                     if not lQuery.IsEmpty then
                        PlanDate:=lQuery.FieldByName('PlanDate').AsString
                     else
                        PlanDate:='';
                     isExist:=0;
                  end;
                  MakeCompanyName:=FieldName+'ZZD';//去制造地的编号
                  MakeCompanyValue:= UserDataSet.FieldByName(MakeCompanyName).AsString;
                  sql:='select FID from TDEPT where FDisplayName='''+ MakeCompanyValue+'''';
                  lQuery.Close;
                  lQuery.CommandText:=sql;
                  lQuery.Open;
                  if not lQuery.IsEmpty then
                     MakeCompanyID:=lQuery.FieldByName('FID').AsString;
              end
              else
              begin
                 RelationNodeID:=NodeDS.FieldByName('RelNodeID').AsString;
                 if RelationNodeID='' then
                 begin
                     //没有关联节点
                     PlanDate:='';
                 end
                 else
                 begin
                     //有关联节点
                     sql:='select NodeName from AM_TPlanNode where NodeID='''+RelationNodeID+'''';
                     lQuery.Close;
                     lQuery.CommandText:=sql;
                     lQuery.Open;
                     if not lQuery.IsEmpty then
                        RelationNodeName:=lQuery.FieldByName('NodeName').AsString;
                     for i:=0 to FieldCount-1 do  //遍历显示数据集的列
                     begin
                          if UserDataSet.Fields.DisplayName=RelationNodeName then  //找到和节点对应的列
                          begin
                               FieldName:=UserDataSet.Fields.FieldName;
                               break;
                          end;
                     end;
                     RelPlanDate:=UserDataSet.FieldByName(FieldName).AsString; //如果关联节点为‘---'则看该节点在数据库中是否有初始值 有 维持 没有 置空 如果不是‘---‘重新计算
                     if RelPlanDate='-' then  // 如果关联节点不存在 查看本身是否存在数据
                     begin
                         sql:='select PlanDate from AM_TMOLDPLAN where NodeID='''+NodeID+'''';
                         lQuery.Close;
                         lQuery.CommandText:=sql;
                         lQuery.Open;
                         if not lQuery.IsEmpty then
                             PlanDate:=lQuery.FieldByName('PlanDate').AsString
                         else
                             PlanDate:='';
                     end
                     else
                     begin
                        //计算步长
                        BuChang:= NodeDS.FieldByName('Step').AsInteger;
                        tempDate:=SysUtils.StrToDateTime(RelPlanDate);
                        tempDate:=tempDate+BuChang;
                        PlanDate:= SysUtils.DateTimeToStr(tempDate);
                     end;
                 end;
              end;
              //将数据填充到保存数据集中
              MoldPlanDS.Insert;
              MoldPlanDS.FieldByName('NodeID').AsString:=NodeID;
              MoldPlanDS.FieldByName('MoldID').AsString:=MoldID;
              MoldPlanDS.FieldByName('MakeCompanyID').AsString:=MakeCompanyID;
              MoldPlanDS.FieldByName('PlanDate').AsString:=PlanDate;
              //MoldPlanDS.FieldByName('PlanOperatorID').AsString:=PlanOperator;
              MoldPlanDS.FieldByName('IsExist').AsInteger:=isExist;
              NodeDS.Next;
           end;
           UserDataSet.Next;
       end;
   finally
       //lQuery.Free;
   end;
end;

{**************************************
   procedure:    SaveMoldDataSet
   Describe:     提交模具计划数据集 保存数据 同时覆盖项目表中的标准套值
   Author:       Panyc
   Date:         2008-06-26
**************************************/}
procedure TMainForm.SaveMoldDataSet(MoldDS:TDataSet);
var
   lQuery:TQuery;
   sql:string;
   NodeID,MoldID,MakeCompanyID,PlanOperatorID:string;
   PlanDate:string ;
   IsExist:string;
   ID:string;
   lTransactionHandle:TTransactionHandle;
   bzt:string;
begin
    try
        lQuery:= TQuery.Create(nil);
        lQuery.ConnectionString:=CommonFunction.TCOMMONFUNCTION.GetSystemDBConnectionString;
        MoldDS.Open;
        MoldDS.First;
        try
            lTransactionHandle := lQuery.Connection.Transaction.Start(False);

            //修改标准套值 遍历显示的用户数据集
            UserDataSet.Open;
            UserDataSet.DisableControls;
            UserDataSet.First;
            while not UserDataSet.Eof do
            begin
                bzt:= UserDataSet.FieldByName('BZT').AsString;
                MoldID:=UserDataSet.FieldByName('MoldID').AsString;
                sql:='update AM_TMold set BZT='''+bzt+''' where MoldCode='''+MoldID+'''';
                lQuery.Close;
                lQuery.CommandText:=sql;
                lQuery.Execute;
                UserDataSet.Next;
            end;
            UserDataSet.EnableControls;

            while not MoldDS.Eof do
            begin
                //找当前记录在数据库中是否存在 存在则更新 不存在 添加
                NodeID:=MoldDS.FieldByName('NodeID').AsString;
                MoldID:=MoldDS.FieldByName('MoldID').AsString;
                MakeCompanyID:=MoldDS.FieldByName('MakeCompanyID').AsString;
                PlanDate:=MoldDS.FieldByName('PlanDate').AsString;;
                ID:=MoldDS.FieldByName('ID').AsString;
                //PlanOperatorID:= MoldDS.FieldByName('PlanOperatorID').AsString;
                IsExist:=MoldDS.FieldByName('IsExist').AsString;
                sql:='select * from AM_TMOLDPLAN where NodeID='''+NodeID+'''and MoldID='''+MoldID+'''';
                lQuery.Close;
                lQuery.CommandText:=sql;
                lQuery.Open;
                if not lQuery.IsEmpty then
                begin
                   //在数据库中存在数据 则更新
                   if PlanDate='' then
                   begin
                        sql:='update AM_TMOLDPLAN set MakeCompanyID='''+MakeCompanyID+
                              ''',IsExist='''+IsExist+''',PlanOperatorID='''
                              +PlanOperatorID+''' where NodeID='''+NodeID+''' and MoldID='''+MoldID+'''';
                   end
                   else
                   begin
                        sql:='update AM_TMOLDPLAN set MakeCompanyID='''+MakeCompanyID+
                              ''',PlanDate='''+PlanDate.ToString+''',IsExist='''+IsExist+''',PlanOperatorID='''
                              +PlanOperatorID+''' where NodeID='''+NodeID+''' and MoldID='''+MoldID+'''';
                   end;
                end
                else
                begin
                   ID:=Business.System.JSCommon.CreateGUIDStr;
                   if PlanDate='' then
                   begin
                       sql:='insert into AM_TMOLDPLAN(ID,NodeID,MoldID,MakeCompanyID,PlanOperatorID,IsExist) values('''
                               +ID+''','''+NodeID+''','''+MoldID+''','''+MakeCompanyID+''','''+ PlanOperatorID+''','''+ IsExist+''')';
                   end
                   else
                   begin
                        sql:='insert into AM_TMOLDPLAN(ID,NodeID,MoldID,MakeCompanyID,PlanDate,PlanOperatorID,IsExist) values('''
                               +ID+''','''+NodeID+''','''+MoldID+''','''+MakeCompanyID+''','''+PlanDate.ToString+''','''+ PlanOperatorID+''','''+ IsExist+''')';
                   end;
                end;
                lQuery.Close;
                lQuery.CommandText:=sql;
                lQuery.Execute;
                MoldDS.Next;
            end;
            lQuery.Connection.Transaction.Commit(lTransactionHandle);
        Except
            lQuery.Connection.Transaction.Rollback(lTransactionHandle);
        end;
    finally
        //lQuery.Free;
    end;
end;

{**************************************
   procedure:    SetUpMakeAddress
   Describe:     填充数据集中的生产地 将空值填充为横纵向集成的数据
   Author:       Panyc
   Date:         2008-06-25
**************************************/}
procedure TMainForm.SetUpMakeAddress(lDataSet:TDataSet);
var
    i:integer;
    inistr,str:string;
begin
    //设置制造地
    lDataSet.DisableControls;
    lDataSet.First;
    inistr:=lDataSet.Fields.FieldByNumber(ZZDIndex).AsString;
    str:=inistr;
    while not lDataSet.Eof do
    begin
        if lDataSet.Fields.FieldByNumber(ZZDIndex).AsString='' then
        begin
            lDataSet.Active:=true;
            lDataSet.Edit;
            lDataSet.Fields.FieldByNumber(ZZDIndex).AsString:= inistr;
            str:=inistr;
        end
        else
        begin
            inistr:=lDataSet.Fields.FieldByNumber(ZZDIndex).AsString;
            str:=inistr;
        end;
        for i:=20 to  lDataSet.Fields.Count do
        begin
            if lDataSet.Fields.FieldByNumber(i).AsString='' then
            begin
                lDataSet.Active:=true;
                lDataSet.Edit;
                lDataSet.Fields.FieldByNumber(i).AsString:= str;
            end
            else
                str:=lDataSet.Fields.FieldByNumber(i).AsString;
        end;
         lDataSet.Next;
    end;
    lDataSet.EnableControls;
end;

{**************************************
   procedure:    TrimDataSet
   Describe:     处理数据集 显示数据集的显示方式为字符串 处理掉时间 保留日期
   Author:       Panyc
   Date:         2008-06-25
**************************************/}
procedure TMainForm.TrimDataSet(TempDS:TDataSet);
var
   i,j:integer;
   arr:array of string;
begin
   TempDS.Open;
   TempDS.First;
   for i:=0 to TempDS.RecordCount-1 do
   begin
       for j:=1 to TempDS.Fields.Count do
       begin
           arr:=TempDS.Fields.FieldByNumber[j].AsString.Split([' ']);
           TempDS.Edit;
           TempDS.Fields.FieldByNumber[j].AsString:=arr[0];
       end;
       TempDS.Next;
   end;
end;

{**************************************
   procedure:    BizFormCreate
   Describe:     窗体初始化 创建自定义的数据集
   Author:       Panyc
   Date:         2008-06-25
**************************************/}
procedure TMainForm.BizFormCreate(Sender: TObject);
var
    lParams:TStrings;
begin
    //读出功能参数
    lParams:=TStringList.Create;
    lParams.Text:=FuncBroker.Func.Parameters;
    ProjectID:=lParams.Values['ProjectID'];
    TransType:=lParams.Values['Type'];
    CreateUserDataSet();
    DocViewMOLDPLANUPLOADINFO_JHSJWG.Doc.Close;
    DocViewMOLDPLANUPLOADINFO_JHSJWG.Doc.Open(TDocMode.dmEdit,self);
    MoldPlanUploadInfo.TJHSJWG(DocViewMOLDPLANUPLOADINFO_JHSJWG.Doc).DataGrid.OnCustomDrawCell:=DataGridCustomDrawCell;
    lParams.Free;
    if TransType='Upload' then
    begin
        btnOutExcel.Enabled:=false;
    end
    else
    begin
        btnInExcel.Enabled:=false;
        MoldPlanToUserDS(ProjectID);
    end;
end;

{**************************************
   procedure:    BizFormCloseQuery
   Describe:     关闭窗体时取消对数据已经更改的判断
   Author:       Panyc
   Date:         2008-06-25
**************************************/}
procedure TMainForm.BizFormCloseQuery(Sender: TObject; var CanClose: Boolean);
begin
   CanClose:=true;
end;

Function TMainForm.ValidateData(ProjectID:string):Boolean;
var
    i:integer;
    FieldValue,sql:string;
    flag:Boolean;
    lQuery:TQuery;
begin
    try
        if FaultMoldID=nil then
           FaultMoldID:=TStringList.Create;
        FaultMoldID.Clear;
        flag:=true;
        lQuery:=TQuery.Create(nil);
        lQuery.ConnectionString:=CommonFunction.TCOMMONFUNCTION.GetSystemDBConnectionString;
        //验证数据合法
        if(UserDataSet<>nil) and (UserDataSet.RecordCount>1) then
        begin
           UserDataSet.Open;
           UserDataSet.DisableControls;
           UserDataSet.First;
           while not UserDataSet.Eof do
           begin
               FieldValue:=UserDataSet.FieldByName('MoldID').AsString;
               sql:='select * from AM_TMold where MoldCode='''+FieldValue+'''and MoldProjectID='''+ProjectID+'''';
               lQuery.Close;
               lQuery.CommandText:=sql;
               lQuery.Open;
               if lQuery.IsEmpty then
               begin
                   flag:=false;
                   FaultMoldID.Add(FieldValue);
                   //dialogs.ShowMessage('制号为:'+FieldValue+'的模具不属于当前项目!');
               end;
               UserDataSet.Next;
           end;
           if flag then
              Result:=true
           else
              Result:=false;
        end;
        UserDataSet.EnableControls;
    finally
        //lQuery.Free;
    end;
end;

{**************************************
   procedure:    MoldPlanToUserDS
   Describe:     获取某项目下属的模具计划 拆分数据到用户数据集进行显示
   Author:       Panyc
   Date:         2008-07-01
**************************************/}
procedure TMainForm.MoldPlanToUserDS(ProjectID:string);
var
    lParam: TBizParam;
    lQuery:TQuery;
    MoldPlanDS:TDataSet;
    NodeID,NodeName:string;
    NodeAlias:string;
    sql:string;
    MoldID:string;
    MakeCompanyName,MakeCompanyID:string;
    MakeCompanyHeaderName:string;
begin
    try
        lQuery:=TQuery.Create(nil);
        lQuery.ConnectionString:=CommonFunction.TCOMMONFUNCTION.GetSystemDBConnectionString;
        lParam := SYSTEMUTILS.TContextUtils.GetParam(Self.Context, 'Biz:\OPERATION\AMCPMS\JHKZYWCSZ.ParamGroup', 'MoldProjectIDParam');
        lParam.Value:=ProjectID;
        MoldPlanDataSetBroker.DataSet.Open;
        MoldPlanDataSetBroker.DataSet.Refresh;
        MoldPlanDS:=MoldPlanDataSetBroker.DataSet;
        MoldPlanDS.Open;
        UserDataSet.Open;
        UserDataSet.EmptyDataSet;
        UserDataSet.DisableControls;
        MoldPlanDS.First;
        MoldID:='';
        while not MoldPlanDS.Eof do //遍历模具计划数据集 显示某个项目下所有模具的计划数据
        begin
            if MoldPlanDS.FieldByName('MoldID').AsString<>MoldID then  //查询节点
            begin
                UserDataSet.Append;
                MoldID:=MoldPlanDS.FieldByName('MoldID').AsString;
                UserDataSet.FieldByName('MoldID').AsString:=MoldID;
                //查询标准套
                sql:='select BZT from AM_TMold where MoldCode='''+MoldID+'''and MoldVersion=0';
                lQuery.Close;
                lQuery.CommandText:=sql;
                lQuery.Open;
                UserDataSet.FieldByName('bzt').AsString:=lQuery.FieldByName('BZT').AsString;
            end;
            NodeID:=MoldPlanDS.FieldByName('NodeID').AsString;
            sql:='select NodeName,NodeAlias,IsDisplay from AM_TPLANNODE where NodeID='''+NodeID+'''';
            lQuery.Close;
            lQuery.CommandText:=sql;
            lQuery.Open;
            if not lQuery.IsEmpty then
            begin
                if lQuery.FieldByName('IsDisplay').AsInteger=1 then
                    begin
                    NodeAlias:=lQuery.FieldByName('NodeAlias').AsString;
                    if (MoldPlanDS.FieldByName('PlanDate').AsString='') and (MoldPlanDS.FieldByName('IsExist').AsInteger=0) then
                        UserDataSet.FieldByName(NodeAlias).AsString:='-'
                    else
                        UserDataSet.FieldByName(NodeAlias).AsString:=MoldPlanDS.FieldByName('PlanDate').AsString;
                    MakeCompanyHeaderName:=NodeAlias+'ZZD';
                    MakeCompanyID:=MoldPlanDS.FieldByName('MakeCompanyID').AsString;
                    sql:='select FDisplayName from TDEPT where FID='''+ MakeCompanyID+'''';
                    lQuery.Close;
                    lQuery.CommandText:=sql;
                    lQuery.Open;
                    if not lQuery.IsEmpty then
                    begin
                        MakeCompanyName:=lQuery.FieldByName('FDisplayName').AsString;
                        UserDataSet.FieldByName(MakeCompanyHeaderName).AsString:=MakeCompanyName;
                    end;
                end;
            end;
            MoldPlanDS.Next;
        end;
        UserDataSet.EnableControls;
    finally
        //lQuery.Free;
    end;
   // dialogs.ShowMessage(SysUtils.IntToStr(MoldPlanDataSetBroker.DataSet.RecordCount));

end;

{**************************************
   procedure:    DataGridCustomDrawCell
   Describe:     重绘单元格的时候判断当前制号是否属于某项目
   Author:       Panyc
   Date:         2008-07-01
**************************************/}
procedure TMainForm.DataGridCustomDrawCell(Sender: TObject; ACanvas: TCanvas; ARect: TRect; ANode: TTreeListNode; AColumn: TTreeListColumn; ASelected, AFocused, ANewItemRow: Boolean; var AText: string; var AColor: Integer; AFont: TFont; var AAlignment: TAlignment; var ADone: Boolean);
var
    i:integer;
begin
    if AColumn.Name<>'DataGridColumnMoldID' then
       exit;
    if FaultMoldID<>nil then
    begin
        for i:=0 to FaultMoldID.Count-1 do
        begin
            if AText=FaultMoldID then
            begin
                AFont.Color:=Business.System.Graphics.clRed;
            end;
        end;
    end;
end;


{**************************************
   procedure:    btnInExcelClick
   Describe:     导入Excel并填充磨具计划数据集
   Author:       Panyc
   Date:         2008-07-03
**************************************/}
procedure TMainForm.btnInExcelClick(Sender: TObject);
begin
    ImportExcel();
    FillMoldDataSet();
    //ValidateData(ProjectID);
end;

{**************************************
   procedure:    btnSaveClick
   Describe:     保存提交模具计划数据集
   Author:       Panyc
   Date:         2008-07-03
**************************************/}
procedure TMainForm.btnSaveClick(Sender: TObject);
begin
    if ValidateData(ProjectID) then
        SaveMoldDataSet(MoldPlanDataSetBroker.DataSet)
    else
        dialogs.ShowMessage('提交数据不合法,请检查数据!');
end;

{**************************************
   procedure:    btnOutExcelClick
   Describe:     DataGrid数据导出为Excel
   Author:       Panyc
   Date:         2008-07-03
**************************************/}
procedure TMainForm.btnOutExcelClick(Sender: TObject);
begin
    if SaveDialog1.Execute then
    begin
        MoldPlanUploadInfo.TJHSJWG(DocViewMOLDPLANUPLOADINFO_JHSJWG.Doc).DataGrid.SaveToXLS(SaveDialog1.FileName,false);
    end;
end;

end.
回复 支持 反对

使用道具 举报

 楼主| 发表于 2008-7-3 17:32:26 | 显示全部楼层
要不你看一下这个功能的代码吧 看有什么问题没有 就是关闭这个功能的时候出的错误
回复 支持 反对

使用道具 举报

发表于 2008-7-3 17:59:20 | 显示全部楼层
楼主,你检查一下,所有用Create声明的的变量(自定义的和函数内的),都在不用时Free一下
我只看了前几个。其它你用XXX.Free搜一下对应的就能找到
NodeDataSet
FaultMoldID
lHeaderNames
tempBizField
回复 支持 反对

使用道具 举报

 楼主| 发表于 2008-7-4 09:01:08 | 显示全部楼层
都在窗体销毁的时候释放掉了还是不行啊
procedure TMainForm.BizFormDestroy(Sender: TObject);
begin
    NodeDataSet.Free;
    UserDataSet.Free;
    lNodeNameToIDs.Free;
    FaultMoldID.Free;
    lHeaderNames.Free;
    source.Free;
    database.Free;
end;
tempBizField怎么释放啊 如果放在这个函数中销毁 执行到tempBizField.Free的时候就出现那个错误了 我把这些变量都声明到窗体级了
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Justep Inc.

GMT+8, 2025-7-18 23:57 , Processed in 0.044745 second(s), 18 queries .

Powered by Discuz! X3.4

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表