⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 u_data.pas

📁 repair repairrepairrepairrepair
💻 PAS
字号:
unit u_data;

interface

uses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
  Db, DBTables;

type
  TDM_main = class(TDataModule)
    Database: TDatabase;
    Q_login: TQuery;
    DS_login: TDataSource;
    T_person: TTable;
    DS_person: TDataSource;
    T_code: TTable;
    DS_code: TDataSource;
    DS_wp_ungroup: TDataSource;
    DS_wp_group: TDataSource;
    Q_wp_ungroup: TQuery;
    Q_wp_group: TQuery;
    T_group: TTable;
    DS_group: TDataSource;
    Q_change_group: TQuery;
    T_equip: TTable;
    T_merchant: TTable;
    T_workplace: TTable;
    DS_equip: TDataSource;
    DS_merchant: TDataSource;
    DS_workplace: TDataSource;
    Q_equip_num: TQuery;
    T_movement: TTable;
    DS_movement: TDataSource;
    T_workplace2: TTable;
    DS_workplace2: TDataSource;
    T_equip2: TTable;
    DS_equip2: TDataSource;
    T_fail: TTable;
    DS_fail: TDataSource;
    T_equip3: TTable;
    T_mode: TTable;
    T_cause: TTable;
    T_consequence: TTable;
    T_result: TTable;
    DS_equip3: TDataSource;
    DS_mode: TDataSource;
    DS_cause: TDataSource;
    DS_consequence: TDataSource;
    DS_result: TDataSource;
    Q_equip: TQuery;
    DS_q_equip: TDataSource;
    Q_fail_rec: TQuery;
    Q_move_rec: TQuery;
    Q_reliability: TQuery;
    DS_fail_rec: TDataSource;
    DS_move_rec: TDataSource;
    DS_reliability: TDataSource;
    T_group_list: TTable;
    DS_group_list: TDataSource;
    T_distribution: TTable;
    DS_distribution: TDataSource;
    Q_member: TQuery;
    Q_fail_list: TQuery;
    Q_install_time: TQuery;
    procedure T_personNewRecord(DataSet: TDataSet);
    procedure T_groupAfterScroll(DataSet: TDataSet);
    procedure T_equipNewRecord(DataSet: TDataSet);
    procedure T_movementNewRecord(DataSet: TDataSet);
    procedure T_movementBeforePost(DataSet: TDataSet);
    procedure T_failNewRecord(DataSet: TDataSet);
    procedure Q_equipAfterScroll(DataSet: TDataSet);
  private
    procedure ConnectDB(server, user, passwd:String);
  public
    function Login(server, user, passwd:String):Boolean;
    procedure Logout;
    procedure OpenPerson;
    procedure SetPassword(passwd:String);
    procedure SetCodeTable(TabName:String);
    procedure OpenGroup;
    procedure AddToGroup;
    procedure DelFromGroup;
    procedure OpenEquip;
    procedure OpenMovement;
    procedure OpenFail;
    procedure SetQuery(workplace:String;StartTime, EndTime:TDate);
    procedure OpenGroupList;
    procedure Analyse;
    procedure SaveResult;
  end;

var
  DM_main: TDM_main;

implementation

uses crypt, u_main, u_analyse, u_EstimateInt;
{$R *.DFM}

procedure TDM_main.ConnectDB(server, user, passwd:String);
begin
  with Database do
  begin
    Connected:=False;
    Params.Values['SERVER NAME']:=server;
    Params.Values['USER NAME']:=user;
    Params.Values['PASSWORD']:=passwd;
    Connected:=True;
  end;
end;

function TDM_main.Login(server, user, passwd:String):Boolean;
var
  authority:String;
begin
  ConnectDB(server, 'ERUSR', 'password');
  passwd:=Copy(passwd+passwd, 1, 10);
  passwd:=Encrypt(passwd, 222);
  with Q_login do
  begin
    Close;
    Params.ParamValues['ID']:=user;
    Params.ParamValues['PASSWD']:=passwd;
    Open;
    Result:=( not IsEmpty);
    if not IsEmpty then
    begin
      authority:=FieldValues['AUTHORITY'];
      case StrToInt(authority) of
        0: ConnectDB(server, 'ERUSR', 'password');
        1: ConnectDB(server, 'ERDM', 'password');
        2: ConnectDB(server, 'ERDBA', 'password');
      end;
      Open;
    end
    else
      Database.Connected:=False;
  end;
end;

procedure TDM_main.Logout;
begin
  Database.Connected:=False;
  Database.Params.Values['PASSWORD']:='';
end;

procedure TDM_main.OpenPerson;
begin
  T_person.Open;
end;

procedure TDM_main.T_personNewRecord(DataSet: TDataSet);
begin
  with DataSet do
  begin
    FieldValues['PASSWD']:='';
  end;
end;

procedure TDM_main.SetPassword(passwd:String);
begin
  passwd:=Copy(passwd+passwd, 1, 10);
  passwd:=Encrypt(passwd, 222);
  with T_person do
  begin
    Edit;
    FieldValues['PASSWD']:=passwd;
    Post;
  end;
end;

procedure TDM_main.SetCodeTable(TabName:String);
begin
  with T_code do
  begin
    Close;
    TableName:=TabName;
    Open;
  end;
end;

procedure TDM_main.OpenGroup;
begin
  T_group.Open;
  Q_wp_ungroup.Close;
  Q_wp_ungroup.Open;
end;

procedure TDM_main.T_groupAfterScroll(DataSet: TDataSet);
begin
  Q_wp_group.Close;
  Q_wp_group.Params.ParamValues['ID']:=T_group['ID'];
  Q_wp_group.Open;
end;

procedure TDM_main.AddToGroup;
begin
  with Q_change_group do
  begin
    Close;
    Params.ParamValues['GROUP']:=T_group['ID'];
    Params.ParamValues['WORKPLACE']:=Q_wp_ungroup['CODE'];
    ExecSQL;
  end;
  OpenGroup;
end;

procedure TDM_main.DelFromGroup;
begin
  with Q_change_group do
  begin
    Close;
    Params.ParamValues['GROUP']:='00000';
    Params.ParamValues['WORKPLACE']:=Q_wp_group['CODE'];
    ExecSQL;
  end;
  OpenGroup;
end;

procedure TDM_main.OpenEquip;
begin
  T_equip.Open;
  T_merchant.Open;
  T_workplace.Open;
end;

procedure TDM_main.T_equipNewRecord(DataSet: TDataSet);
var
  counter:Integer;
  equip_id:String;
begin
  with Q_equip_num do
  begin
    Open;
    counter:=FieldValues['COUNT'];
    Close;
  end;
  equip_id:='00000'+IntToStr(counter);
  equip_id:=Copy(equip_id, Length(equip_id)-5, 6);
  equip_id:=FormatDateTime('yymmdd', now)+equip_id;
  T_equip['ID']:=equip_id;
  T_equip['BUY_DATE']:=now;
end;

procedure TDM_main.OpenMovement;
begin
  T_movement.Open;
  T_workplace2.Open;
  T_equip2.Open;
end;

procedure TDM_main.T_movementNewRecord(DataSet: TDataSet);
begin
  T_movement['ID']:=0;
  T_movement['MOVE_DATE']:=now;
  T_movementBeforePost(DataSet);
end;

procedure TDM_main.T_movementBeforePost(DataSet: TDataSet);
begin
  with DataSet do
  begin
    FieldValues['LAST_MODIFY']:=now;
    FieldValues['PERSON']:=F_main.i_user.Text;
  end;
end;

procedure TDM_main.OpenFail;
begin
  T_fail.Open;
  T_equip3.Open;
  T_mode.Open;
  T_cause.Open;
  T_consequence.Open;
  T_result.Open;
end;

procedure TDM_main.T_failNewRecord(DataSet: TDataSet);
begin
  T_fail['ID']:=0;
  T_fail['FIND_DATE']:=now;
  T_fail['END_DATE']:=now;
  T_movementBeforePost(DataSet);
end;

procedure TDM_main.SetQuery(workplace:String;StartTime, EndTime:TDate);
begin
  with Q_equip do
  begin
    Close;
    Params.ParamValues['WORKPLACE']:=workplace;
    Params.ParamValues['START_TIME']:=StartTime;
    Params.ParamValues['END_TIME']:=EndTime;
    Open;
  end;
  with Q_fail_rec do
  begin
    Close;
    Params.ParamValues['EQUIP']:=Q_equip['EQUIP'];
    Params.ParamValues['START_TIME']:=StartTime;
    Params.ParamValues['END_TIME']:=EndTime;
    Open;
  end;
  with Q_move_rec do
  begin
    Close;
    Params.ParamValues['EQUIP']:=Q_equip['EQUIP'];
    Params.ParamValues['START_TIME']:=StartTime;
    Params.ParamValues['END_TIME']:=EndTime;
    Open;
  end;
  with Q_reliability do
  begin
    Close;
    Params.ParamValues['EQUIP']:=Q_equip['EQUIP'];
    Open;
  end;
end;

procedure TDM_main.Q_equipAfterScroll(DataSet: TDataSet);
begin
  with Q_fail_rec do
  begin
    Close;
    Params.ParamValues['EQUIP']:=Q_equip['EQUIP'];
    Open;
  end;
  with Q_move_rec do
  begin
    Close;
    Params.ParamValues['EQUIP']:=Q_equip['EQUIP'];
    Open;
  end;
  with Q_reliability do
  begin
    Close;
    Params.ParamValues['EQUIP']:=Q_equip['EQUIP'];
    Open;
  end;
end;

procedure TDM_main.OpenGroupList;
begin
  T_group_list.Open;
  T_distribution.Open;
end;

procedure TDM_main.Analyse;
var
  EndTime:TDate;
  TimeList:TTimeList;
  SampleRList:TSampleRList;
  RecordLength:Integer;
  TimeMark, TimeStep, TimeEnd:TDateTime;
  Installed, EquipDistroyed:Boolean;
  Distribution:String;
  i:Integer;
  MTTF, P1, P2, P3, F:Double;
begin
  //初始化
  EndTime:=F_analyse.i_end_time.Date;
  SetLength(TimeList, 0);
  with Q_member do
  begin
    Close;
    Params.ParamValues['GROUP']:=T_group_list['ID'];
    Open;//获取成员列表
    First;
    while not Eof do
    begin//逐个扫描成员
      with Q_install_time do
      begin
        Params.ParamValues['EQUIP']:=Q_member['ID'];
        Open;//获取安装信息
        Installed:=(not IsEmpty);//是否安装使用
        if installed then
          TimeMark:=FieldValues['MOVE_DATE'];//记录投入使用时间
        Close;
      end;
      if installed then
      begin
        with Q_fail_list do
        begin
          Close;
          Params.ParamValues['EQUIP']:=Q_member['ID'];
          Params.Paramvalues['END_TIME']:=EndTime;
          Open;//提取指定时间范围内的失效记录
          First;
          EquipDistroyed:=True;
          while not Eof do
          begin//遍历失效记录
            SetLength(TimeList, length(TimeList)+1);//增加记录
            TimeList[length(TimeList)-1].Time:=FieldValues['FIND_DATE']-TimeMark;
            TimeList[length(TimeList)-1].Failed:=True;
            TimeMark:=FieldValues['END_DATE'];
            EquipDistroyed:=(FieldValues['RESULT']<>'0');
            Next;//下一个失效记录
          end;
          if (not EquipDistroyed) and (EndTime>TimeMark) then
          begin//截尾数据
            SetLength(TimeList, length(TimeList)+1);//增加记录
            TimeList[length(TimeList)-1].Time:=FieldValues['FIND_DATE']-TimeMark;
            TimeList[length(TimeList)-1].Failed:=False;
          end;
        end;
      end;
      Next;//下一个成员
    end;
  end;
  F_analyse.Series1.Clear;//清除原有曲线
  F_analyse.Series2.Clear;
  if length(TimeList)>0 then
  begin
    SetLength(SampleRList, length(TimeList));
    RecordLength:=TruncationR(TimeList, SampleRList);//计算截尾数据可靠性
    SetLength(SampleRList, RecordLength);
    for i:=0 to RecordLength-1 do//加入数据点
      F_analyse.Series1.AddXY(SampleRList[i].Time, 1-SampleRList[i].R);
    MTTF:=ExpDistPointEsti(TimeList);
    P1:=1/MTTF;
    P2:=0;
    P3:=0;
    Distribution:=T_group_list['DISTRIBUTION'];
    if Distribution='1' then
    begin//二参数威布尔分布估计
      Weibull2PointEstiLeast(TimeList, P1, P2);
    end;
    with F_analyse do
    begin//显示参数
      o_mttf.Text:=FloatToStrF(MTTF, ffFixed, 5, 2);
      o_p1.Text:=FloatToStrF(P1, ffFixed, 5, 2);
      o_p2.Text:=FloatToStrF(P2, ffFixed, 5, 2);
      o_p3.Text:=FloatToStrF(P3, ffFixed, 5, 2);
    end;
    TimeMark:=SampleRList[0].Time;
    TimeEnd:=SampleRList[length(SampleRList)-1].Time;
    TimeStep:=(TimeEnd-TimeMark)/10;
    while TimeMark<TimeEnd do
    begin
      if Distribution='0' then
        F:=ExpDistFT(P1, TimeMark)
      else
        F:=WeibullDistFT(P1, P2, P3, TimeMark);
      F_analyse.Series2.AddXY(TimeMark, F);
      TimeMark:=TimeMark+TimeStep;
    end;
  end;
end;

procedure TDM_main.SaveResult;
var
  MTTF, P1, P2, P3:Single;
begin
  with F_analyse do
  begin
    MTTF:=StrToFloat(o_mttf.Text);
    P1:=StrToFloat(o_p1.Text);
    P2:=StrToFloat(o_p2.Text);
    P3:=StrToFloat(o_p3.Text);
  end;
  with T_group_list do
  begin
    Edit;
    FieldValues['MTTF']:=MTTF;
    FieldValues['R1']:=P1;
    FieldValues['R2']:=P2;
    FieldValues['R3']:=P3;
    Post;
  end;
end;

end.

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -