📄 ucalc.~pas
字号:
unit UCalc;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, UBase, PrnDbgeh, DB, ADODB, ComCtrls, ExtCtrls, Grids, DBGridEh,
StdCtrls, DBTables, DBClient, TeeProcs, TeEngine, Chart, DbChart, Series,
DBGrids, BubbleCh, Buttons;
type
TFCalc = class(TFBase)
StatusBar: TStatusBar;
DataSource: TDataSource;
PrintDBGridEh: TPrintDBGridEh;
PageControl1: TPageControl;
TabSheet1: TTabSheet;
TabSheet2: TTabSheet;
Panel1: TPanel;
Splitter1: TSplitter;
Shape1: TShape;
ComboBox: TComboBox;
Label1: TLabel;
RadioGroup: TRadioGroup;
Button1: TButton;
Button2: TButton;
ADOQuery: TADOQuery;
ADOQueryID: TAutoIncField;
ADOQuerybj: TWideStringField;
ADOQueryrs: TSmallintField;
ADOQuerykr: TWideStringField;
ADOQuerypjf: TWideStringField;
ADOQueryhgl: TWideStringField;
ADOQuerylhl: TWideStringField;
ADOQueryyxl: TWideStringField;
Edit1: TEdit;
Label2: TLabel;
Panel3: TPanel;
Splitter2: TSplitter;
Panel4: TPanel;
Shape2: TShape;
Panel5: TPanel;
Shape3: TShape;
RadioGrou1: TRadioGroup;
RadioGroup2: TRadioGroup;
GroupBox1: TGroupBox;
Edit2: TEdit;
Edit3: TEdit;
Label3: TLabel;
DBChart1: TDBChart;
DataSource_fx1: TDataSource;
ADOQuery_fx1: TADOQuery;
ADOQuery_fx1DSDesigner: TWideStringField;
ADOQuery_fx1yw: TIntegerField;
ADOQuery_fx1bj: TStringField;
Series1: TBarSeries;
Button3: TButton;
ADOQuery_fx: TADOQuery;
DataSource_fx: TDataSource;
ADOQuery_fxID: TAutoIncField;
ADOQuery_fxbj: TWideStringField;
ADOQuery_fxrs: TSmallintField;
ADOQuery_fxkr: TWideStringField;
ADOQuery_fxpjf: TWideStringField;
ADOQuery_fxhgl: TWideStringField;
ADOQuery_fxlhl: TWideStringField;
ADOQuery_fxyxl: TWideStringField;
ADOQuery_fxbjmc: TStringField;
ADOQuery_fxvhgl: TFloatField;
ADOQuery_fxvlhl: TFloatField;
ADOQuery_fxvyxl: TFloatField;
ADOQuery_fxvpjf: TFloatField;
Button4: TButton;
BitBtn2: TBitBtn;
BitBtn1: TBitBtn;
BitBtn3: TBitBtn;
Panel2: TPanel;
Splitter3: TSplitter;
Panel6: TPanel;
DBGridEh: TDBGridEh;
DBChart2: TDBChart;
ComboBox_jb: TComboBox;
Series2: TBarSeries;
Series3: TBarSeries;
Series4: TBarSeries;
Series5: TBarSeries;
procedure Button2Click(Sender: TObject);
procedure Button1Click(Sender: TObject);
procedure FormCreate(Sender: TObject);
procedure FormClose(Sender: TObject; var Action: TCloseAction);
procedure RadioGrou1Click(Sender: TObject);
procedure ADOQuery_fx1CalcFields(DataSet: TDataSet);
procedure RadioGroup2Click(Sender: TObject);
procedure Button3Click(Sender: TObject);
procedure ADOQuery_fxCalcFields(DataSet: TDataSet);
procedure ComboBox_jbChange(Sender: TObject);
procedure ComboBoxChange(Sender: TObject);
procedure RadioGroupClick(Sender: TObject);
procedure Button4Click(Sender: TObject);
procedure BitBtn1Click(Sender: TObject);
procedure BitBtn2Click(Sender: TObject);
procedure BitBtn3Click(Sender: TObject);
private
{ Private declarations }
procedure showTX;
procedure Showtxfx;//显示图形信息
public
{ Public declarations }
end;
var
FCalc: TFCalc;
implementation
uses UPublic, UMain;
{$R *.dfm}
procedure TFCalc.Button2Click(Sender: TObject);
begin
if not ADOQuery.IsEmpty then
begin
PrintDBGridEh.PageHeader.CenterText.Clear;
PrintDBGridEh.PageHeader.CenterText.Add(G_sys.SChool+Edit1.text+ComboBox.text+'科教学效果统计');
PrintDBGridEh.Preview;
end;
end;
procedure TFCalc.Button1Click(Sender: TObject);
function getbjmc(vStr: string): String;
var
i,j, k: integer;
begin
Result :='1';
j := 999; k := 999;
for i := 1 to length(vStr) do
if vStr[i] in ['0'..'9'] then begin
if j = 999 then j := i
else k :=i;
end;
if (j=999)then exit;
if k<>999 then Result := vStr[j]+vStr[k] else
Result := vStr[j];
end;
var
fFz: array[1..3] of integer;//合格率、良好率及优秀率
kskm, bjmc, pjf, hgl,lhl,yxl: string; //考试科目及班级名称
jb: array[1..3] of string;
i, total: integer;
begin
if ComboBox.ItemIndex < 0 then exit;
if Ask('真的要统计吗?','提示',MB_OKCL)<>1 then exit;
SCreen.Cursor := crHourGlass;
while not ADOQuery.Eof do ADOQuery.Delete;
jb[1] :='七'; jb[2] :='八';jb[3] :='九';
Case RadioGroup.ItemIndex of
0: begin
fFz[3] := 135;
fFz[2] := 105;
fFz[1] := 90;
end;
1: begin
fFz[3] := 108;
fFz[2] := 84;
fFz[1] := 72;
end;
2: begin
fFz[3] := 90;
fFz[2] := 70;
fFz[1] := 60;
end;
end;
//取得各个级别要考试的班级及科目
ComboBox_jb.Clear;
for i := 1 to 3 do begin
kskm := GetFieldVar('select km from STU_kskm where nj='''+jb[i]+'''');
if trim(kskm)<>'' then
if Pos(ComboBox.Text, kskm)>0 then
if GetFieldVar('select Count(1) from stu_info where 退学否=''F'' and 级别='''+jb[i]+'''')>0 then
begin
ComboBox_jb.Items.Add(jb[i]);
With TADOQuery.Create(self) do try
Connection := ADOQuery.Connection;
SQL.Text := 'select bj from STU_class where bj like''%'+jb[i]+'%'' order by id';
Open;
while not Eof do begin
ADOQuery.Append;
ADOQuery.FieldByName('bj').AsString := Fields[0].AsString;
Next;
end;
finally
free;
end;
end;
end;
if ADOQuery.IsEmpty then exit;
ADOQUery.First;
while not ADOQUery.Eof do begin
bjmc := ADOQuery.fieldbyname('bj').AsString;
//取得考试人数
if g_sys.qk='1' then
total := GetFieldVar('select Count(1) from stu_info where 退学否=''F'' and 班级='''+bjmc+''' and ((缺考科目 is null) or(缺考科目 not like''%'+ComboBox.Text+'%''))')
else
total := GetFieldVar('select Count(1) from stu_info where 退学否=''F'' and 班级='''+bjmc+'''');
//total为0的才计算
if total <>0 then begin
pjf :=
MyTrunc(GetFieldVar('select sum('+ComboBox.Text+') from stu_info where 退学否=''F'' and 班级='''+bjmc+'''')/total, 2);
hgl :=
MyTrunc(GetFieldVar('select Count(1) from stu_info where 退学否=''F'' and '+ComboBox.Text+'>='+inttostr(fFz[1])+' and '+ComboBox.Text+'<'+inttostr(fFz[2])+ 'and 班级='''+bjmc+'''')*100/total, 2)+'%';
lhl :=
MyTrunc(GetFieldVar('select Count(1) from stu_info where 退学否=''F'' and '+ComboBox.Text+'>='+inttostr(fFz[2])+' and '+ComboBox.Text+'<'+inttostr(fFz[3])+' and 班级='''+bjmc+'''')*100/total, 2)+'%';
yxl :=
MyTrunc(GetFieldVar('select Count(1) from stu_info where 退学否=''F'' and '+ComboBox.Text+'>='+inttostr(fFz[3])+' and 班级='''+bjmc+'''')*100/total, 2)+'%';
ExecuteSQL('update calc set pjf='''+pjf+''',rs='+inttostr(total)
+',hgl='''+hgl+''',lhl='''+lhl+''',yxl='''+yxl+''' where bj='''+bjmc+'''');
end;
ADOQuery.Next;
end;
ADOQuery.Refresh;
if ComboBox_jb.Items.Count>0 then ComboBox_jb.ItemIndex := 0;
Showtxfx;
SCreen.Cursor := crDefault;
end;
procedure TFCalc.FormCreate(Sender: TObject);
var
i: integer;
begin
ExecuteSQL('delete from calc');
for i := 0 to ComponentCount - 1 do
if (Components[i] is TADOQuery) then
if (TADOQuery(Components[i]).SQL.Text<>'') and (TADOQuery(Components[i]).Tag<>111) then
begin
if TADOQuery(Components[i]).Active then TADOQuery(Components[i]).Close;
try
TADOQuery(Components[i]).Open;
except
end;
end;
inherited;
if ComboBox.Items.Count > 0 then
ComboBox.ItemIndex := 0;
RadioGrou1Click(RadioGrou1);
DBChart1.AutoRefresh := True;
end;
procedure TFCalc.FormClose(Sender: TObject; var Action: TCloseAction);
begin
inherited;
Action := caFree;
end;
procedure TFCalc.RadioGrou1Click(Sender: TObject);
var
str: string;
begin
str := GetFieldVar('select km from STU_kskm where nj='''+RadioGrou1.Items[RadioGrou1.itemIndex] +'''');
RadioGroup2.Items.Clear;
RadioGroup2.Columns := 0;
while Pos(';',str)>0 do begin
RadioGroup2.Columns := RadioGroup2.Columns + 1;
RadioGroup2.Items.Add(Copy(str,1,Pos(';',str)-1));
str := Copy(str,Pos(';',str)+1,length(str));
end;
if RadioGroup2.Items.Count > 0 then RadioGroup2.ItemIndex := 0;
ShowTX;
end;
procedure TFCalc.ADOQuery_fx1CalcFields(DataSet: TDataSet);
begin
ADOQuery_fx1.FieldByName('bj').AsString := Copy(ADOQuery_fx1.FieldByName('班级').AsString,3,10);
end;
procedure TFCalc.showTX;
var
str, km: string;
begin
if RadioGroup2.Items.Count<1 then begin
ADOQuery.Close;
DBChart1.Title.Text.CommaText := RadioGrou1.Items[RadioGrou1.ItemIndex]+'级没有相关数据';
if ADOQuery_fx1.Active then ADOQuery_fx1.Close;
ADOQuery_fx1.SQL.Text := 'select 班级,Count(语文)as yw from stu_info where 1=2 group by 班级';
try
ADOQuery_fx1.open;
except
end;
exit;
end;
if (trim(Edit2.Text)='')or (trim(Edit3.Text)='') then begin
Ask('分数段为填,请填入分数段!','提示',MB_OK);
Edit2.SetFocus;
exit;
end;
if strtoint(Edit2.Text)>strtoint(Edit3.Text) then begin
str := Edit2.Text;
Edit2.Text := Edit3.Text;
Edit3.Text := str;
end;
km := RadioGroup2.Items[RadioGroup2.ItemIndex];
str := 'select 班级,Count('+km+')as yw from stu_info where '+
km+'>='+trim(Edit2.text)+' and '+km+'<='+trim(Edit3.text)+' and 退学否=''F'' and 级别='''
+RadioGrou1.Items[RadioGrou1.ItemIndex]+''' group by 班级';
DBChart1.Title.Text.CommaText := RadioGrou1.Items[RadioGrou1.ItemIndex]+km
+Edit2.text+'分至'+Edit3.text+'分人数分布图';
if ADOQuery_fx1.Active then ADOQuery_fx1.Close;
ADOQuery_fx1.SQL.Text := str;
try
ADOQuery_fx1.open;
except
end;
end;
procedure TFCalc.RadioGroup2Click(Sender: TObject);
begin
showTX;
end;
procedure TFCalc.Button3Click(Sender: TObject);
begin
if Ask('真的要打印吗?','提示',MB_OKCl)=1 then DBChart1.PrintLandscape;
end;
procedure TFCalc.Showtxfx;
begin
if ComboBox_jb.ItemIndex < 0 then exit;
if ComboBox.ItemIndex < 0 then exit;
with ADOQuery_fx do try
if Active then close;
sql.Text := 'select * from calc where bj like ''%'+ComboBox_jb.Text+'%''';
Open;
except
end;
DBChart2.Title.Text.CommaText := ComboBox_jb.Text+ComboBox.Text+'成绩分析图';
end;
procedure TFCalc.ADOQuery_fxCalcFields(DataSet: TDataSet);
begin
ADOQuery_fx.FieldByName('bjmc').asstring := copy(ADOQuery_fx.FieldByName('bj').asstring,3,10);
ADOQuery_fx.FieldByName('vpjf').asFloat := strtofloat(ADOQuery_fx.FieldByName('pjf').asstring);
ADOQuery_fx.FieldByName('vhgl').asFloat := strtofloat(Copy(ADOQuery_fx.FieldByName('hgl').asstring,1,Pos('%',ADOQuery_fx.FieldByName('hgl').asstring)-1));
ADOQuery_fx.FieldByName('vlhl').asFloat := strtofloat(Copy(ADOQuery_fx.FieldByName('lhl').asstring,1,Pos('%',ADOQuery_fx.FieldByName('lhl').asstring)-1));
ADOQuery_fx.FieldByName('vyxl').asFloat := strtofloat(Copy(ADOQuery_fx.FieldByName('yxl').asstring,1,Pos('%',ADOQuery_fx.FieldByName('yxl').asstring)-1));
end;
procedure TFCalc.ComboBox_jbChange(Sender: TObject);
begin
Showtxfx;
end;
procedure TFCalc.ComboBoxChange(Sender: TObject);
begin
ComboBox_jb.Clear;
end;
procedure TFCalc.RadioGroupClick(Sender: TObject);
begin
ComboBox_jb.Clear;
end;
procedure TFCalc.Button4Click(Sender: TObject);
begin
if Ask('真的要打印吗?','提示',MB_OKCl)=1 then DBChart2.PrintLandscape;
end;
procedure TFCalc.BitBtn1Click(Sender: TObject);
begin
DBChart2.ZoomPercent(120);
end;
procedure TFCalc.BitBtn2Click(Sender: TObject);
begin
DBChart2.ZoomPercent(80);
end;
procedure TFCalc.BitBtn3Click(Sender: TObject);
begin
DBChart2.UndoZoom;
end;
end.
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -