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

📄 dataanalysis.pas

📁 这是一个正式的项目工程
💻 PAS
字号:
unit DataAnalysis;

interface

uses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
  Db, DBTables, StdCtrls, Grids, DBGrids, QuickRpt, Qrctrls, ExtCtrls,
  ComCtrls,wsTypes,wsCores, ActnList;

type
  TfrmDataAnalysis = class(TForm)
    DataSource1: TDataSource;
    Table1: TTable;
    Panel1: TPanel;
    Panel2: TPanel;
    Panel3: TPanel;
    TreeViewSelect: TTreeView;
    DateTimePicker1: TDateTimePicker;
    Label5: TLabel;
    Splitter1: TSplitter;
    Panel4: TPanel;
    Panel5: TPanel;
    Panel6: TPanel;
    StringGrid1: TStringGrid;
    QuickRep1: TQuickRep;
    PageHeaderBand1: TQRBand;
    QRLabel17: TQRLabel;
    QRExpr1: TQRExpr;
    QRSysData1: TQRSysData;
    QRLabel18: TQRLabel;
    QRLabel19: TQRLabel;
    DetailBand1: TQRBand;
    QRDBText1: TQRDBText;
    QRDBText2: TQRDBText;
    QRLabel1: TQRLabel;
    ButtonRefresh: TButton;
    ButtonPrint: TButton;
    ButtonDelete: TButton;
    ButtonClose: TButton;
    dsViewProjectID: TDataSource;
    ViewProjectID: TTable;
    ViewProjectIDClass: TStringField;
    ViewProjectIDACode: TStringField;
    ViewProjectIDCodeMeaning: TStringField;
    dsViewPH: TDataSource;
    ViewPH: TTable;
    ViewPHProjectID: TStringField;
    ViewPHHourseID: TStringField;
    ViewPHHourseIDLookup: TStringField;
    ActionListData: TActionList;
    ActionDelete: TAction;
    ActionPrint: TAction;
    ActionRefresh: TAction;
    Table1AutoInc: TAutoIncField;
    Table1DDate: TDateTimeField;
    Table1HourseID: TStringField;
    Table1ExtensionID: TStringField;
    Table1StandardG: TFloatField;
    Table1Gravity: TFloatField;
    Table1Height: TFloatField;
    Table1HorizonDiff: TFloatField;
    Table1State: TStringField;
    Table1AverageG: TFloatField;
    Table1AverageH: TFloatField;
    Table1Flag: TStringField;
    procedure FormCreate(Sender: TObject);
    procedure ButtonCloseClick(Sender: TObject);
    procedure FormActivate(Sender: TObject);
    procedure StringGrid1DrawCell(Sender: TObject; ACol, ARow: Integer;
      Rect: TRect; State: TGridDrawState);
    procedure QRDBPrint(sender: TObject; var Value: String);
    procedure FormClose(Sender: TObject; var Action: TCloseAction);
    procedure FormDestroy(Sender: TObject);
    procedure DateTimePicker1CloseUp(Sender: TObject);
    procedure TreeViewSelectChanging(Sender: TObject; Node: TTreeNode;
      var AllowChange: Boolean);
    procedure TreeViewSelectChange(Sender: TObject; Node: TTreeNode);
    procedure ActionDeleteExecute(Sender: TObject);
    procedure ActionListDataUpdate(Action: TBasicAction;
      var Handled: Boolean);
    procedure ActionPrintExecute(Sender: TObject);
    procedure ActionRefreshExecute(Sender: TObject);

  private
    { Private declarations }
    StrHourseID:String;
    DDate      :TDate;
    CurrExtensionCount :Integer;
  public
    procedure datafresh;
    procedure drawrep;
    procedure clrrep;
    { Public declarations }
  end;

var
  frmDataAnalysis: TfrmDataAnalysis;
  Qrdb:array of TQRDBText;
  Qrlb,Qrlb2:array of TQRLabel;
  Ta_Length:Integer;

implementation

uses MainDB;

{$R *.DFM}

procedure TfrmDataAnalysis.clrrep;
var i,n:integer;
begin
    n:=Length(Qrdb);
    for i:=0 to n-1 do if Qrdb[i]<>nil then Qrdb[i].Free;
    n:=Length(Qrlb);
    for i:=0 to n-1 do if Qrlb[i]<>nil then Qrlb[i].Free;
end;

procedure TfrmDataAnalysis.FormCreate(Sender: TObject);
var
  RootNode,CurrentNode :TTreeNode;
begin
  Top:=2;
  Left:=2;
  Width:=720;
  Height:=440;
  strHourseID:='';
  DDate:=Date();
  DateTimePicker1.DateTime:=DDate;
  CurrExtensionCount:=0;
  ViewProjectID.Open;
  ViewPH.Open;
  Table1.open;
  if dmMainDB.ViewHourseID.State<>dsInactive then
    dmMainDB.ViewHourseID.Open
  else
    dmMainDB.ViewHourseID.First;
  try
    TreeViewSelect.Items.BeginUpdate;
    ViewPH.First;
    While Not ViewProjectID.Eof do
    begin
      RootNode:=TreeViewSelect.Items.Add(nil,ViewProjectID['CodeMeaning']+' ['+ViewProjectID['ACode']+']');
      while not ViewPH.Eof do
      begin
        CurrentNode:=TreeViewSelect.Items.AddChild(RootNode,ViewPH['HourseIDLookup']+' ['+ViewPH['HourseID']+']');
        CurrentNode.ImageIndex:=0;
        CurrentNode.SelectedIndex:=3;
        ViewPH.Next;
      end;
      ViewProjectID.Next;
    end;
  finally
    TreeViewSelect.FullExpand;
    TreeViewSelect.Items.EndUpdate;
  end;
  if (TreeViewSelect.TopItem<>nil) and  (TreeViewSelect.TopItem.getFirstChild<>nil) then
  begin
    strHourseID:=GetID(TreeViewSelect.TopItem.getFirstChild.Text);
    TreeViewSelect.TopItem.getFirstChild.Selected:=True;
  end;
  ViewProjectID.Close;
  ViewPH.Close;

  Ta_Length:=-1;
  DataFresh();
end;

procedure TfrmDataAnalysis.ButtonCloseClick(Sender: TObject);
begin
  Close;
end;

procedure TfrmDataAnalysis.FormActivate(Sender: TObject);
begin
  DataFresh;
end;

procedure TfrmDataAnalysis.datafresh;
var
  i,j,k,m,avag,avah:integer;
begin
  if (strHourseID<>'') and (CurrExtensionCount<>0) then
  begin
    table1.First;
    table1.Filter:='(HourseId=' + StrHourseID+') and ('+'DDate>='+DateToStr(DDate)+') and ('+'DDate<'+DateToStr(DDate+1)+')';
    table1.filtered:=true;
    k:=CurrExtensionCount;
    stringgrid1.ColCount:=k+2;
    stringgrid1.RowCount:=(Table1.RecordCount div k)*5+1;
    stringgrid1.ColWidths[0]:=130;
    stringgrid1.ColWidths[1]:=38;
    stringgrid1.Cells[0,0]:='      时  间';
    for i:= 2 to k+1 do
      stringgrid1.Cells[i,0]:='设备'+inttostr(i-1);
    for i:= 0 to (Table1.RecordCount div k)-1 do
    begin
      if Table1.Eof then
        Break;
      stringgrid1.Cells[0,i*5+1]:=table1.Fields[1].AsString;
      StringGrid1.Cells[0,i*5+2]:=' 建筑物号:'+strHourseID;
      stringgrid1.cells[1,i*5+1]:='标重:';
      stringgrid1.cells[1,i*5+2]:='实重:';
      stringgrid1.cells[1,i*5+3]:='高度:';
      stringgrid1.cells[1,i*5+4]:='水平:';
      stringgrid1.cells[1,i*5+5]:='状态:';
      avag:=0;
      avah:=0;
      for j:=1 to k do
      begin
        for m:=1 to 5 do
        begin
          stringgrid1.cells[j+1,i*5+m]:=table1.Fields[3+m].AsString;
        end;
        avag:=avag+table1.Fields[5].AsInteger ;
        avah:=avah+table1.Fields[6].AsInteger ;
        table1.Next;
      end;
      avag:=avag div k;
      avah:=avah div k;
      StringGrid1.Cells[0,i*5+3]:=' 平均重力:'+IntToStr(avag)+'吨';
      StringGrid1.Cells[0,i*5+4]:=' 平均高度:'+IntToStr(avah)+'米' ;
    end;
  end;
end;

procedure TfrmDataAnalysis.StringGrid1DrawCell(Sender: TObject; ACol, ARow: Integer;
  Rect: TRect; State: TGridDrawState);
var value,sv:real;
begin
  if (ACol>=2) and ((ARow mod 5)=2) then
  begin
    if stringgrid1.Cells[ACol,ARow]<>'' then
      value:=StrToFloat(stringgrid1.Cells[ACol,ARow])
    else
      Value:=0;
    if stringgrid1.Cells[ACol,ARow-1]<>'' then
      sv:=strtofloat(stringgrid1.Cells[ACol,ARow-1])
    else
      sv:=0;

    if (value<=(0.7*sv)) or (value>=1.3*sv) then
    begin
      StringGrid1.Canvas.Brush.Color := clYellow;
      if (value<(0.45*sv)) or (value>(1.55*sv)) then
         StringGrid1.Canvas.Brush.Color:=clRed;
      StringGrid1.Canvas.FrameRect(Rect);
    end;
   end;
end;

procedure TfrmDataAnalysis.drawrep;
var n,i,lines,spa,left,top0,top1:integer;
begin
    n:=CurrExtensionCount;
    {lines:=((n-1) div 12)+1;}
    lines:=table1.recordcount div 6;
    Setlength(Qrdb,n*5);   //n*4
    Setlength(Qrlb,6);      //n
    Setlength(Qrlb2,lines*5); //4
    DetailBand1.Height:=21*lines;
    PageHeaderBand1.Height:=10+7*lines;
    spa:=110 div ((n+lines-1) div lines);

    left:=22;
    top1:=2;
    for i:=0 to lines-1 do
    begin
        Qrlb[i]:=TQRLabel.Create(Application);
        Qrlb[i].Parent:=DetailBand1;
        Qrlb[i].Left:=left;
        Qrlb[i].Top:=top1;
        Qrlb[i].Caption:='标重';
        Qrlb[i].Font.Name:='楷体';

        Qrlb[i+1]:=TQRLabel.Create(Application);
        Qrlb[i+1].Parent:=DetailBand1;
        Qrlb[i+1].Left:=left;
        Qrlb[i+1].Top:=top1+4;
        Qrlb[i+1].Caption:='实重';
        Qrlb[i+1].Font.Name:='楷体';

        Qrlb[i+2]:=TQRLabel.Create(Application);
        Qrlb[i+2].Parent:=DetailBand1;
        Qrlb[i+2].Left:=left;
        Qrlb[i+2].Top:=top1+8;
        Qrlb[i+2].Caption:='高度';
        Qrlb[i+2].Font.Name:='楷体';

        Qrlb[i+3]:=TQRLabel.Create(Application);
        Qrlb[i+3].Parent:=DetailBand1;
        Qrlb[i+3].Left:=left;
        Qrlb[i+3].Top:=top1+12;
        Qrlb[i+3].Caption:='水平';
        Qrlb[i+3].Font.Name:='楷体';

        Qrlb[i+4]:=TQRLabel.Create(Application);
        Qrlb[i+4].Parent:=DetailBand1;
        Qrlb[i+4].Left:=left;
        Qrlb[i+4].Top:=top1+16;
        Qrlb[i+4].Caption:='状态';
        Qrlb[i+4].Font.Name:='楷体';

        top1:=top1+20;
    end;

    left:=30;
    top0:=8;
    top1:=2;

    for i:=0 to n-1 do
    begin
        Qrlb[i]:=TQRLabel.Create(Application);
        Qrlb[i].Parent:=PageHeaderBand1;
        Qrlb[i].Left:=left;
        Qrlb[i].Top:=top0;
        Qrlb[i].Caption:='设备'+IntToStr(i+1)+#13+'----';
        Qrlb[i].Font.Name:='宋体';

        Qrdb[i]:=TQRDBText.Create(Application);
        Qrdb[i].Parent:=DetailBand1;
        Qrdb[i].Left:=left+2;
        Qrdb[i].Top:=top1;
        Qrdb[i].DataSet:=Table1;
        {Qrdb[i*5].DataField:='St'+IntToStr(i+1);}
        Qrdb[i].DataField:='standardg';

        Qrdb[i+1]:=TQRDBText.Create(Application);
        Qrdb[i+1].Parent:=DetailBand1;
        Qrdb[i+1].Left:=left+2;
        Qrdb[i+1].Top:=top1+4;
        Qrdb[i+1].DataSet:=Table1;
        {Qrdb[i*5+1].DataField:='F'+IntToStr(i+1);}
        Qrdb[i+1].DataField:='gravity';
        Qrdb[i+1].Tag:=i+1;
        Qrdb[i+1].OnPrint:=QRDBPrint;

        Qrdb[i+2]:=TQRDBText.Create(Application);
        Qrdb[i+2].Parent:=DetailBand1;
        Qrdb[i+2].Left:=left+2;
        Qrdb[i+2].Top:=top1+8;
        Qrdb[i+2].DataSet:=Table1;
        Qrdb[i+2].DataField:='height';
        {Qrdb[i*5+2].DataField:='Ang'+IntToStr(i+1);}

         Qrdb[i+3]:=TQRDBText.Create(Application);
        Qrdb[i+3].Parent:=DetailBand1;
        Qrdb[i+3].Left:=left+2;
        Qrdb[i+3].Top:=top1+12;
        Qrdb[i+3].DataSet:=Table1;
        Qrdb[i+3].DataField:='horizondiff';
        {Qrdb[i*5+3].DataField:='Ang'+IntToStr(i+1);}

        Qrdb[i+4]:=TQRDBText.Create(Application);
        Qrdb[i+4].Parent:=DetailBand1;
        Qrdb[i+4].Left:=left+2;
        Qrdb[i+4].Top:=top1+16;
        Qrdb[i+4].DataSet:=Table1;
        Qrdb[i+4].DataField:='state';
        {Qrdb[i*5+4].DataField:='Sj'+IntToStr(i+1);}

        left:=left+spa;
        if left>130 then
        begin
            left:=30;
            top1:=top1+20;
            top0:=top0+6;
        end;

    end;
end;

procedure TfrmDataAnalysis.QRDBPrint(sender: TObject; var Value: String);
var v1,v2:real;
    i:integer;
    s:string;
begin
    v1:=StrToFloat(Value);
    i:=(sender as TQRDBText).Tag;
 //   s:='St'+IntToStr(i);
    v2:=Table1.FieldByName('standardg').AsFloat;
    (sender as TQRDBText).Font.Color:=clWindowText;
    if (v1<=(0.7*v2)) or (v1>=1.3*v2) then
    begin
       (sender as TQRDBText).Font.Color := clYellow;
       if (v1<(0.45*v2)) or (v1>(1.55*v2)) then
          (sender as TQRDBText).Font.Color:=clRed;
    end;
end;

procedure TfrmDataAnalysis.FormClose(Sender: TObject; var Action: TCloseAction);
begin
  Action:=caFree;
end;

procedure TfrmDataAnalysis.FormDestroy(Sender: TObject);
begin
  Table1.Close;
end;

procedure TfrmDataAnalysis.DateTimePicker1CloseUp(Sender: TObject);
var s1,s2:string;
    next_d:TDateTime;
begin
//     next_d:=strtodate(s1)+1;
//     s2:=datetostr(next_d);
//     table1.Filter:='ddate>=' + s1 + ' And ' + 'ddate<' + s2+ 'and '+'HourseId='
//               + edit4.text;
//     table1.filtered:=true;
//     datafresh;
  DDate:=DateTimePicker1.Date;
  DataFresh();
end;

procedure TfrmDataAnalysis.TreeViewSelectChanging(Sender: TObject; Node: TTreeNode;
  var AllowChange: Boolean);
begin
  if Node.Level=1 then
  begin
    AllowChange:=True;
  end
  else
  begin
    AllowChange:=False;
  end;
end;

procedure TfrmDataAnalysis.TreeViewSelectChange(Sender: TObject; Node: TTreeNode);
begin
  strHourseID:=GetID(Node.Text);
  if  strHourseID<>'' then
  begin
  with dmMainDB do
  begin
    qryPublic.Close;
    qryPublic.SQL.CLear;
    qryPublic.SQL.Add('Select Count(*) CurrCount from GE Where HourseID='+''''+StrHourseID+'''');
    qryPublic.Prepare;
    qryPublic.Open;
    if not qryPublic.IsEmpty then
      CurrExtensionCount:=qryPublic.FieldByName('CurrCount').AsInteger
    else
      CurrExtensionCount:=0;
    qryPublic.Close;
  end;
  end
  else
    CurrExtensionCount:=0;
  DataFresh();
end;

procedure TfrmDataAnalysis.ActionDeleteExecute(Sender: TObject);
begin
if Application.MessageBox('真的要删除所有的数据吗?','警告信息',MB_OKCancel)=idOK then
begin
try
  dmMainDB.MainDB.TransIsolation:=tiDirtyRead;
  try
    dmMainDB.MainDB.StartTransaction;
    with dmMainDB do
    begin
      qryPublic.Close;
      qryPublic.SQL.CLear;
      qryPublic.SQL.Add('Delete from Extension Where HourseID='+''''+StrHourseID+'''');
      qryPublic.Prepare;
      qryPublic.ExecSQL;
      qryPublic.Close;
    end;
    dmMainDB.MainDB.Commit;
  except
    dmMainDB.MainDB.Rollback;
  end;
finally
  dmMainDB.MainDB.TransIsolation:=tiReadCommitted;
end;
DataFresh();
end;

end;

procedure TfrmDataAnalysis.ActionListDataUpdate(Action: TBasicAction;
  var Handled: Boolean);
begin
  ActionDelete.Enabled:=(strHourseID<>'');
end;

procedure TfrmDataAnalysis.ActionPrintExecute(Sender: TObject);
begin

  if Table1.FieldCount<>Ta_Length then
  begin
    clrrep;
    drawrep;
    Ta_length:=Table1.FieldCount;
  end;
  QuickRep1.Preview;

end;

procedure TfrmDataAnalysis.ActionRefreshExecute(Sender: TObject);
begin
  DataFresh();
end;

end.

⌨️ 快捷键说明

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