中国开发网: 论坛: 程序员情感CBD: 贴子 326728
ysb_ysb_ysb: 全部代码如下:各位帮忙看看,谢谢!
unit upkSetInfo;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, TableOperationClassFrm, DB, DBClient, StdActns, ActnList, Menus,
ImgList, ComCtrls, ToolWin, dxExEdtr, Grids, ExtCtrls, StdCtrls, Buttons,
CheckLst, dxTL, dxDBCtrl, dxDBGrid, dxCntner, Mask, DBCtrls,math, DBGrids;

type
TFrmPkSet = class(TFrmSignleTableOperation)
PageControl1: TPageControl;
TabSheet1: TTabSheet;
Label1: TLabel;
Label2: TLabel;
Label3: TLabel;
Label4: TLabel;
Label5: TLabel;
Label6: TLabel;
Label7: TLabel;
Label8: TLabel;
Label9: TLabel;
Label10: TLabel;
Label11: TLabel;
Label12: TLabel;
Label13: TLabel;
Label14: TLabel;
Label15: TLabel;
Label16: TLabel;
Label17: TLabel;
Label18: TLabel;
Label19: TLabel;
Label20: TLabel;
Label21: TLabel;
Label22: TLabel;
Label23: TLabel;
Label24: TLabel;
Label25: TLabel;
Label26: TLabel;
Label27: TLabel;
Label28: TLabel;
Label29: TLabel;
Label30: TLabel;
Label31: TLabel;
Label32: TLabel;
Label33: TLabel;
Label34: TLabel;
Label35: TLabel;
Label44: TLabel;
DBEdit1: TDBEdit;
DBEdit2: TDBEdit;
DBEdit3: TDBEdit;
DBEdit4: TDBEdit;
DBEdit5: TDBEdit;
DBEdit6: TDBEdit;
DBEdit7: TDBEdit;
DBEdit8: TDBEdit;
DBEdit9: TDBEdit;
DBEdit10: TDBEdit;
DBEdit11: TDBEdit;
DBEdit12: TDBEdit;
DBEdit13: TDBEdit;
DBEdit14: TDBEdit;
CheckBox9: TCheckBox;
Panel5: TPanel;
dxDBYear: TdxDBGrid;
dxDBYearColumn1: TdxDBGridColumn;
dxDBYearColumn2: TdxDBGridColumn;
dxDBYearColumn3: TdxDBGridColumn;
TabSheet2: TTabSheet;
Panel1: TPanel;
DxDBTeach: TdxDBGrid;
dxDBGridColumn1: TdxDBGridColumn;
dxDBGridColumn2: TdxDBGridColumn;
dxDBGridColumn3: TdxDBGridColumn;
Panel2: TPanel;
Panel3: TPanel;
Panel6: TPanel;
Label37: TLabel;
Label38: TLabel;
Label48: TLabel;
Label53: TLabel;
Label54: TLabel;
Label42: TLabel;
SpeedButton1: TSpeedButton;
Button3: TSpeedButton;
GroupBox1: TGroupBox;
TabSheet4: TTabSheet;
StringPK: TStringGrid;
dsMst: TDataSource;
dsTeach: TDataSource;
cdsTeach: TClientDataSet;
DBRadioGroup1: TDBRadioGroup;
DBCheckBox1: TDBCheckBox;
DBCheckBox2: TDBCheckBox;
DBCheckBox3: TDBCheckBox;
DBCheckBox4: TDBCheckBox;
DBCheckBox5: TDBCheckBox;
DBCheckBox6: TDBCheckBox;
DBCheckBox7: TDBCheckBox;
DBComboBox1: TDBComboBox;
CdsTeachClass: TClientDataSet;
dsTeachClass: TDataSource;
cdsSubject: TClientDataSet;
dsSubject: TDataSource;
Label55: TLabel;
Panel7: TPanel;
clbFuncRight: TCheckListBox;
Panel4: TPanel;
DBLookupComboBox2: TDBLookupComboBox;
Label49: TLabel;
SpeedButton3: TSpeedButton;
dsYearInfo: TDataSource;
cdsYearInfo: TClientDataSet;
cdsYearClass: TClientDataSet;
dsYearClass: TDataSource;
DBEdit15: TDBEdit;
cdsDepart: TClientDataSet;
dsDepart: TDataSource;
Label50: TLabel;
DBLookupComboBox1: TDBLookupComboBox;
cdsTeachClassBack: TClientDataSet;
dsTeachClassBack: TDataSource;
cdsClassSubject: TClientDataSet;
cdsNoPk: TClientDataSet;
cdsPk: TClientDataSet;
cdsSubjectBack: TClientDataSet;
SpeedButton2: TSpeedButton;
cdsTwoPK: TClientDataSet;
dxDBGrid1: TdxDBGrid;
dxDBGrid1Column1: TdxDBGridColumn;
dxDBGrid1Column2: TdxDBGridColumn;
dxDBGrid1Column3: TdxDBGridColumn;
dxDBGrid1Column4: TdxDBGridColumn;
DataSource1: TDataSource;
dxDBGrid1Column5: TdxDBGridColumn;
procedure DBEdit1Change(Sender: TObject);
procedure SpeedButton1Click(Sender: TObject);
procedure Button3Click(Sender: TObject);
procedure FormShow(Sender: TObject);
procedure clbFuncRightClickCheck(Sender: TObject);
procedure cdsTeachAfterScroll(DataSet: TDataSet);
procedure FormCreate(Sender: TObject);
procedure clbFuncRightClick(Sender: TObject);
procedure dxDBGridColumn1GetText(Sender: TObject;
ANode: TdxTreeListNode; var AText: String);
procedure SpeedButton2Click(Sender: TObject);
procedure FormKeyDown(Sender: TObject; var Key: Word;
Shift: TShiftState);
procedure FormClose(Sender: TObject; var Action: TCloseAction);
procedure FormCloseQuery(Sender: TObject; var CanClose: Boolean);
private
FBool: Boolean;
FPostionTwo: Integer;
FClassMin: Integer;//上课最小数
FAllCount: Integer;//总共上课的天数
FPKCount: Integer; //一周内排的最大多的课数
FCount : Integer;
FDoubleClass: Integer;//记录排双课的次数,如果排的跟科目数相同,则能够等于的 +1;
FConnect: Boolean;
FRepeart: Boolean;
FRepeartDtl: Boolean;
FuporDown: Boolean;
FMstOrDtl: String;
FlYearClassList, FlYearClassListName : TStringList;
FlClassList, FlClassListName : TStringList;
FlYearList,FDayCountList,FSubjectCount, FlYearListName : TStringList;
{ Private declarations }
Function SearchList(vList: TStringList; vStr: String): Boolean;
Function SearchListTwo(vList: TStringList; vStr: String): Boolean;
Function ExistAllList(vList: TStringList;vMaxCount: Integer): Boolean;
function ExistAllRecord(vList: TStringList;vcds: TClientDataSet): Boolean;
Function GetOrExist(vDayCount,vPostion: Integer;vTeachID:string): Boolean;//星期几的 第几节 课是否存教其他班级了了
Function GetOrExistTwo(vDayCount,vPostion: Integer;vYearID,vClassID:string): Boolean;//星期几的 第几节 课是否存教其他班级了了
Function GetOrPostion(vDayCount,vPostion: Integer;vYearID,vClassID:string): Boolean;// 又没有空位置
Function GetOrPostionTwo(vDayCount,vPostion: Integer;vYearID,vClassID,vSubjectID:string): Boolean;// 又没有空位置
Function GetDayCount(vDayCount: Integer; vYearID,vClassID: string): Boolean;//星期几的 第几节 课是否存在该教师了
function GetExistsSubject(vDayCount: Integer; vYearID,vClassID,vSubjectID: string): Boolean;//星期几的年纪班级,是否已经有了改科目
procedure WriteDataToStringGrid;
Function GetSubjectName(vSubjectID: string): String;
procedure WriteCdsDtl(vMin,vMax, vInt: Integer);
function SubjectNoOne(vSubject: string): boolean;
function GetPKCount(vYearID,vClassID,vSUbjectID: string): Integer;
function GetPkMinDayCount(vYearID,vClassID: string): Integer;//
public
procedure StandSignTableOperation;override;
procedure PrintData;override;
procedure PrivewData;override;
Procedure SetClassSubject(vYearID,vClassID: string);
function GetMinCount(vYearID: string; K: Integer): Integer;
function GetMaxCount(vYearID: string; K: Integer): Integer;
function TeachDayOr(vTeach: string; K: Integer): Boolean;
function TeachClassOr(vTeach: string; K: Integer):Boolean; //不排的位置
function TeachClassTrue(vTeach: string; K: Integer):Boolean;
procedure PkSet;
procedure PkSetTWo;
Procedure SaveAllData; override;
function GetMstOrDtl(vSubject: string): string;
procedure GetCurrPKCount(vYearID,vClassID,vTeachID: string);
Procedure WriteLastRecord;
{ Public declarations }
end;

var
FrmPkSet: TFrmPkSet;

implementation
uses uPKPostionInfo,uNoPkPostionInfo,UnitPublic;
{$R *.dfm}

procedure TFrmPkSet.DBEdit1Change(Sender: TObject);
var
BookMark1: TBookMark;
cdsTemp: TClientDataSet;
I: Integer;
begin
inherited;
if FBool then Exit;
FBool := True;
cdsMst.CheckBrowseMode;
if CheckBox9.Checked then
begin
cdsTemp := TClientDataSet.Create(nil);
cdsTemp.Data := cdsMst.Data;
cdsTemp.Locate('YearID',cdsMst.fieldByName('YearID').AsString,[]);
for I := 3 to CdsTemp.FieldCount - 1 do
begin
CdsTemp.Edit;
CdsTemp.Fields[I].Value := cdsMst.Fields[i].Value;
end;
cdsMst.DisableControls;
cdsMst.First;
while not CdsMst.Eof do
begin
for I := 3 to CdsTemp.FieldCount - 1 do
begin
cdsMst.Edit;
cdsMst.Fields[I].Value := cdstemp.Fields[i].Value;
end;
cdsMst.Next;
end;
cdsMst.EnableControls;
cdsMst.Locate('YearID',cdsTemp.fieldByName('YearID').AsString,[]);
end;
FBool := False;
cdsTemp.Free;
ButtonStates := 1;
JuestBottonStates;
end;

procedure TFrmPkSet.SpeedButton1Click(Sender: TObject);
begin
inherited;
try
frmNoPKInfo := TfrmNoPKInfo.Create(nil);
frmNoPKInfo.cdsNoPk.Data := cdsDtl.Data ;
frmNoPKInfo.ShowModal;
finally
frmNoPKInfo.Free;
end;
end;

procedure TFrmPkSet.Button3Click(Sender: TObject);
begin
inherited;
try
frmPKInfo := TfrmPKInfo.Create(nil);
frmPKInfo.cdsPk.Data := cdsDtl.Data ;
frmPKInfo.ShowModal;
finally
frmPKInfo.Free;
end;
end;

procedure TFrmPkSet.FormShow(Sender: TObject);
var
tempParam: OleVariant;
begin
inherited;
FBool := False;
IDataGet.GetPKSet(tempParam);
cdsMst.Data := tempParam[0];
cdsYearInfo.Data := tempParam[0];
cdsDepart.Data := tempParam[1];
cdsClassSubject.Data := tempParam[5];
CdsTeachClass.Data := tempParam[5];
cdsTeach.Data := tempParam[2];
cdsYearClass.Data := tempParam[3];
cdsSubject.Data := tempParam[4];
cdsSubjectBack.Data := TempParam[4];
cdsNoPk.Data := tempParam[6];
cdsPk.Data := tempParam[7];
cdsDtl.Data := tempParam[8];
cdsYearClass.First;
{ clbFuncRight.Items.Clear;
while not cdsYearClass.Eof do
begin
clbFuncRight.Items.Add(cdsYearClass.FieldByName('YearName').AsString+cdsYearClass.FieldByName('ClassName').AsString);
cdsYearClass.Next;
end;}
ShowCheckListBox(cdsYearClass, 'YearID','ClassID','YearName','ClassName', clbFuncRight, FlClassList,
FlClassListName, FlYearList, FlYearListName, FlYearClassList, FlYearClassListName);
ShowCheckListBoxValue(CdsTeachClass, 'YearID','ClassID', clbFuncRight, FlYearClassList, FlYearClassListName);
end;

procedure TFrmPkSet.StandSignTableOperation;
begin
inherited;
CanAdd := False;
canPrint := True;
CanPreview := True;
end;

procedure TFrmPkSet.clbFuncRightClickCheck(Sender: TObject);
var
YearID, ClassID: string;
I: integer;
begin
YearID := GetListValue(FlYearClassListName, clbFuncRight.Items.Strings[clbFuncRight.ItemIndex], FlYearList);
ClassID := GetListValue(FlYearClassListName, clbFuncRight.Items.Strings[clbFuncRight.ItemIndex], FlClassList);
if clbFuncRight.Checked[clbFuncRight.ItemIndex] then
begin
if CdsTeachClass.Locate('YearID;ClassID;TeachSubject', VarArrayOf([YearID, ClassID,cdsClassSubject.FieldByName('TeachSubject').AsString ]), [loPartialKey]) then
begin
PShowWarning(clbFuncRight.Items.Strings[clbFuncRight.ItemIndex]+cdsClassSubject.FieldByName('TeachSubject').AsString +
'已经有老师交');
clbFuncRight.Checked[clbFuncRight.ItemIndex] := not clbFuncRight.Checked[clbFuncRight.ItemIndex];
Exit;
end;
CdsTeachClass.Append;
CdsTeachClass.FieldByName('YearID').AsString := YearID;
CdsTeachClass.FieldByName('ClassID').AsString := ClassID;
CdsTeachClass.FieldByName('TeachSubject').AsString := cdsSubject.FieldByName('SubjectID').AsString;
CdsTeachClass.FieldByName('TeachID').AsString := cdsTeach.FieldByName('TeachID').AsString;
CdsTeachClass.FieldByName('A1').AsBoolean := DBCheckBox1.Checked;
CdsTeachClass.FieldByName('A2').AsBoolean := DBCheckBox2.Checked;
CdsTeachClass.FieldByName('A3').AsBoolean := DBCheckBox3.Checked;
CdsTeachClass.FieldByName('A4').AsBoolean := DBCheckBox4.Checked;
CdsTeachClass.FieldByName('A5').AsBoolean := DBCheckBox5.Checked;
CdsTeachClass.FieldByName('A6').AsBoolean := DBCheckBox6.Checked;
CdsTeachClass.FieldByName('A7').AsBoolean := DBCheckBox7.Checked;
CdsTeachClass.FieldByName('maxClassCount').AsString := DBComboBox1.Text;
CdsTeachClass.FieldByName('WeekClass').AsString := DBEdit15.Text;
// cdsClassSubject.FieldByName('DayClass').AsString := DBEdit16.Text;
CdsTeachClass.Post;
end else
begin
CdsTeachClass.Delete;
end;
end;

procedure TFrmPkSet.cdsTeachAfterScroll(DataSet: TDataSet);
begin
inherited;
ShowCheckListBoxValue(CdsTeachClass, 'YearID','ClassID', clbFuncRight, FlYearClassList, FlYearClassListName);
end;

procedure TFrmPkSet.PrintData;
begin
// inherited;
//导出
end;

procedure TFrmPkSet.PrivewData;
var
I,j,JJ,k,kk,TempACount,ACount,jCount,KCount: integer;
p: integer;
begin
// inherited;
TempACount := 0;
for I := 1 to 14 do
if CdsMst.FieldByName('A'+IntToStr(i)).AsInteger = 0 then
begin
if I > 7 then
begin
P := CdsMst.FieldByName('A'+IntToStr(i-7)).AsInteger;
FClassMin := (8-P) div 2 + 1;
end else
begin

end;
FuporDown := True;
end;
FAllCount := 0;
for I := 1 to 7 do
if (CdsMst.FieldByName('A'+IntToStr(i)).AsInteger <> 0) or (CdsMst.FieldByName('A'+IntToStr(i)).AsInteger <> 0 ) then
Inc(FAllCount);

for I := 1 to 14 do
TempACount := TempACount + CdsMst.FieldByName('A'+IntToStr(i)).AsInteger;
StringPK.ColCount := TempACount + 1;
for I := 1 to TempACount do
StringPK.ColWidths[i] := 30;
for I := 1 to 7 do //meitian
begin
ACount := CdsMst.FieldByName('A'+IntToStr(i)).AsInteger;//每天上午
jCount := CdsMst.FieldByName('A'+IntToStr(i+7)).AsInteger; //每天下午
KCount := ACount + jCount;
for K := 1 to KCount do
begin
StringPK.Cells[K + (I-1)*7,0] :=IntToStr(K);
end;
end;
for i := 1 to StringPK.ColCount -1 do
for J := 1 to StringPK.RowCount -1 do
StringPK.Cells[i,j] := '';
cdsYearClass.First;
// for I := 0 to cdsYearClass.RecordCount - 1 do//所有班级一个一个的排
// for I := 0 to 2 - 1 do//所有班级一个一个的排
begin
SetClassSubject(cdsYearClass.FieldByName('YearID').AsString,
cdsYearClass.FieldByName('ClassID').AsString);
//先排连续课
cdsTwoPk.First;
FDoubleClass := 0;
FSubjectCount.Clear;
for JJ := 1 to cdsTwoPk.RecordCount do
begin
for Kk := 1 to cdsTwoPK.FieldByName('WeekClass').AsInteger do
begin
FDayCountList.Clear;
FCount := 0;
FConnect := False;
FRepeart := False;
PkSetTWo;
end;
cdsTwoPK.Next;
end;
cdsClassSubject.Last;
//zai pai yi jie ke de
for j := 0 to cdsClassSubject.RecordCount - 1 do
begin
FCount := 0;
FConnect := False;
FRepeart := False;
FDayCountList.Clear;
FMstOrDtl := GetMstOrDtl(CdsClassSUbject.FieldByName('TeachSubject').AsString);
PKSet;
CdsClassSubject.Prior;
end;

// cdsYearClass.Next;
end;
dxDBGrid1.DataSource := dsDtl;
WriteDataToStringGrid;
end;

procedure TFrmPkSet.SetClassSubject(vYearID,vClassID: string);
var
I: integer;
pkCount: Integer;//当前排课的数量
iCount: integer;
begin
cdsClassSubject.EmptyDataSet;
cdsClassSubject.IndexDefs.Clear;
cdsTeachClassBack.Data := cdsTeachClass.Data;
cdsTeachClassBack.First;
for I:=0 to cdsTeachClassBack.RecordCount - 1 do
begin
if (cdsTeachClassBack.FieldByName('YearID').AsString = vYearID) and (cdsTeachClassBack.FieldByName('ClassID').AsString = vClassID) then
begin
if cdsTeachClassBack.FieldByName('TeachSubject').AsString <> '' then
if not cdsClassSubject.Locate('TeachSubject',cdsTeachClassBack.FieldByName('TeachSubject').AsString,[]) then
begin
cdsClassSubject.Append;
cdsClassSubject.FieldByName('YearID').AsString := cdsTeachClassBack.FieldByName('YearID').AsString;
cdsClassSubject.FieldByName('ClassID').AsString := cdsTeachClassBack.FieldByName('ClassID').AsString;
cdsClassSubject.FieldByName('TeachSubject').AsString := cdsTeachClassBack.FieldByName('TeachSubject').AsString;
cdsClassSubject.FieldByName('TeachID').AsString := cdsTeachClassBack.FieldByName('TeachID').AsString;
cdsClassSubject.FieldByName('A1').AsBoolean := cdsTeachClassBack.FieldByName('A1').AsBoolean;
cdsClassSubject.FieldByName('A2').AsBoolean := cdsTeachClassBack.FieldByName('A2').AsBoolean;
cdsClassSubject.FieldByName('A3').AsBoolean := cdsTeachClassBack.FieldByName('A3').AsBoolean;
cdsClassSubject.FieldByName('A4').AsBoolean := cdsTeachClassBack.FieldByName('A4').AsBoolean;
cdsClassSubject.FieldByName('A5').AsBoolean := cdsTeachClassBack.FieldByName('A5').AsBoolean;
cdsClassSubject.FieldByName('A6').AsBoolean := cdsTeachClassBack.FieldByName('A6').AsBoolean;
cdsClassSubject.FieldByName('A7').AsBoolean := cdsTeachClassBack.FieldByName('A7').AsBoolean;
cdsClassSubject.FieldByName('maxClassCount').AsString := cdsTeachClassBack.FieldByName('maxClassCount').AsString;
cdsClassSubject.FieldByName('WeekClass').AsString := cdsTeachClassBack.FieldByName('WeekClass').AsString;
cdsClassSubject.FieldByName('orMst').AsString := GetMstOrDtl(cdsTeachClassBack.FieldByName('TeachSubject').AsString);
cdsClassSubject.Post;
end;
end;
cdsTeachClassBack.Next;
end;
cdsClassSubject.IndexDefs.Add('orMst1','orMst',[ixCaseInsensitive]);
cdsClassSubject.IndexName := cdsClassSubject.IndexDefs.Items[0].Name;
// cdsClassSubject.IndexDefs.Add('orMst1','',[ixCaseInsensitive]);
//得到需要排2次课的
cdsTwoPk.Data := cdsClassSubject.Data;
cdsTwoPk.EmptyDataSet;
cdsClassSubject.First;
iCount := 0;
while not cdsClassSubject.Eof do
begin
PKCount := 0;
if not cdsClassSubject.FieldByName('A1').AsBoolean then Inc(PKCount);
if not cdsClassSubject.FieldByName('A2').AsBoolean then Inc(PKCount);
if not cdsClassSubject.FieldByName('A3').AsBoolean then Inc(PKCount);
if not cdsClassSubject.FieldByName('A4').AsBoolean then Inc(PKCount);
if not cdsClassSubject.FieldByName('A5').AsBoolean then Inc(PKCount);
if not cdsClassSubject.FieldByName('A6').AsBoolean then Inc(PKCount);
if not cdsClassSubject.FieldByName('A7').AsBoolean then Inc(PKCount);
if cdsClassSubject.FieldByName('WeekClass').AsInteger > PKCount then
begin
cdsTwoPk.Append;
cdsTwoPk.FieldByName('YearID').AsString := cdsClassSubject.FieldByName('YearID').AsString;
cdsTwoPk.FieldByName('ClassID').AsString := cdsClassSubject.FieldByName('ClassID').AsString;
cdsTwoPk.FieldByName('TeachSubject').AsString := cdsClassSubject.FieldByName('TeachSubject').AsString;
cdsTwoPk.FieldByName('TeachID').AsString := cdsClassSubject.FieldByName('TeachID').AsString;
cdsTwoPk.FieldByName('maxClassCount').AsString := cdsClassSubject.FieldByName('maxClassCount').AsString;
if iCount > FClassMin then
cdsTwoPk.FieldByName('WeekClass').AsInteger := cdsClassSubject.FieldByName('WeekClass').AsInteger mod PkCount else
cdsTwoPk.FieldByName('WeekClass').AsInteger := cdsClassSubject.FieldByName('WeekClass').AsInteger mod (PkCount -1);
Inc(iCount);
cdsTwoPk.Post;
cdsClassSubject.Edit;
cdsClassSubject.FieldByName('WeekClassBack').AsInteger := cdsTwoPk.FieldByName('WeekClass').AsInteger;
end else
begin
cdsClassSubject.Edit;
cdsClassSubject.FieldByName('WeekClassBack').AsInteger := 8;
cdsClassSubject.post;
end;
cdsClassSubject.Next;
end ;
cdsClassSubject.IndexDefs.Delete(0);
cdsClassSubject.IndexDefs.Add('orMst12','WeekClassBack',[ixDescending]);
cdsClassSubject.IndexName := cdsClassSubject.IndexDefs.Items[0].Name;
end;

function TFrmPkSet.GetMaxCount(vYearID: string; K: Integer): Integer;
begin
cdsMst.Locate('YearID',vYearID,[]);
Result := cdsMst.FieldByName('A'+IntToStr(7+K)).AsInteger;
end;

function TFrmPkSet.GetMinCount(vYearID: string; K: Integer): Integer;
begin
cdsMst.Locate('YearID',vYearID,[]);
Result := cdsMst.FieldByName('A'+IntToStr(K)).AsInteger;
end;

function TFrmPkSet.TeachClassOr(vTeach: string; K: Integer): Boolean;
begin
Result := False;
cdsNoPk.First;
while not cdsNoPk.Eof do
begin
if cdsNoPk.FieldByName('TeachID').AsString = vTeach then
if cdsNoPk.FieldByName('A'+InttoStr(K)).AsBoolean then
Result := True;
cdsNoPk.Next;
end;
end;

function TFrmPkSet.TeachClassTrue(vTeach: string; K: Integer): Boolean;
begin
Result := False;
cdsPk.First;
while not cdsPk.Eof do
begin
if cdsPk.FieldByName('TeachID').AsString = vTeach then
if cdsPk.FieldByName('A'+InttoStr(K)).AsBoolean then
Result := True;
cdsPk.Next;
end;
end;

function TFrmPkSet.TeachDayOr(vTeach: string; K: Integer): Boolean;
begin

end;

procedure TFrmPkSet.PkSet;
var
ListPostion,TempListPostion: TStringList;
K: integer;
iPostion,FUpMinCount,FUpMaxCount: integer;
// iPKCount: Integer;
iPKMinDayCount: Integer;//排课最少的xingqi
begin
ListPostion := TStringList.Create;
TempListPostion := TStringList.Create;
FPKCount := GetPKCount(cdsClassSubject.FieldByName('YearID').asstring,
cdsClassSubject.FieldByName('ClassID').asstring,cdsClassSubject.FieldByName('TeachSubject').asstring);

for K := 1 to 7 do //从星期一到星期天
begin
if cdsClassSubject.FieldByName('WeekClass').AsInteger -FPKCount = FCount then
Exit;
{ if cdsClassSubject.FieldByName('A'+IntToStr(K)).AsBoolean then
break; }
iPKMinDayCount := GetPkMinDayCount(cdsYearClass.FieldByName('YearID').asString,cdsYearClass.FieldByName('ClassID').asString);
Randomize;
FUpMinCount := GetMinCount(cdsYearClass.FieldByName('YearID').asString,iPKMinDayCount);
FUpMaxCount := GetMaxCount(cdsYearClass.FieldByName('YearID').asString,iPKMinDayCount);
//如果该科目的教师允许教多个班级
if cdsClassSubject.FieldByName('maxClassCount').AsInteger > 1 then
begin//一个教师允许教多个班级
{ Repeat
iPostion := RandomRange(FUpMinCount,FUpMaxCount+1);
until }//没有跟以前相同位置,老师在这个位置不教其他班级
//
// until
end else
begin//一个教师只能教一个班级
// if cdsDtl.Locate('YearID;ClassID;SubjectID', VarArrayOf([cdsClassSubject.FieldByName('YearID').AsString,
// cdsClassSubject.FieldByName('ClassID').AsString,cdsClassSubject.FieldByName('TeachSubject').AsString ]), [loPartialKey]) then
{ if FConnect then
begin //已经排列了一次,这次排列要看是否连续
FRepeartDtl := False;
WriteCdsDtl(FUpMinCount,FUpMaxCount ,cdsClassSubject.FieldByName('OrConnect').AsInteger);
end else
begin }
TempListPostion.Clear;
Repeat
Randomize;
iPostion := RandomRange(1,FUpMinCount+FUpMaxCount+1);
TempListPostion.Add(IntTostr(iPostion));
if TempListPostion.Count >= FUpMinCount+FUpMaxCount then
if ExistAllList(TempListPostion, FUpMinCount+FUpMaxCount) then
begin
// Inc(FCount);
// AddOnePostion();
TempListPostion.Clear;
FRepeart:= True;
break;
end; //老师不教其他班级
until (not SearchList(ListPostion,IntToStr(iPostion))) and (not GetOrExist(iPKMinDayCount,iPostion,
cdsClassSubject.FieldByName('TeachID').AsString))
and (not GetExistsSubject(iPKMinDayCount,cdsClassSubject.FieldByName('YearID').AsString,
cdsClassSubject.FieldByName('ClassID').AsString,cdsClassSubject.FieldByName('TeachSubject').AsString))
//该班级的该位置目前还没有其他科目来排。
and ( not GetOrPostion(iPKMinDayCount,iPostion,cdsClassSubject.FieldByName('YearID').AsString,cdsClassSubject.FieldByName('ClassID').AsString) );//)
// or (ExistAllList(TempListPostion, FUpMinCount+FUpMaxCount)); //没有跟以前相同位置,老师在这个位置不教其他班级
if not FRepeart then
begin
ListPostion.Add(IntToStr(iPostion));
Inc(FCount);
cdsDtl.Append;
cdsDtl.FieldByName('DayCount').AsInteger := iPKMinDayCount ;
cdsDtl.FieldByName('Postion').AsInteger := iPostion;
cdsDtl.FieldByName('YearID').AsString := cdsClassSubject.FieldByName('YearID').AsString ;
cdsDtl.FieldByName('ClassID').AsString := cdsClassSubject.FieldByName('ClassID').AsString ;
cdsDtl.FieldByName('SubjectID').AsString := cdsClassSubject.FieldByName('TeachSubject').AsString ;
cdsDtl.Post;
FRepeart := False;
end;
FRepeart := False;
FDayCountList.Add(IntToStr(iPKMinDayCount));
end ;
end;
ListPostion.Free;
TempListPostion.Free;
end;

function TFrmPkSet.ExistAllList(vList: TStringList;
vMaxCount: Integer): Boolean;
var
I: Integer;
function ExistSing(m: Integer): Boolean;
var
J : integer;
begin
Result := False;
for J := 0 to vList.Count - 1 do
if vList.Strings[j] = IntToStr(m) then
Result := True;
end;
begin
Result := True;
for I:= 1 to vMaxCount do
if not ExistSing(I) then
begin
Result := False;
Break;
end;
end;


function TFrmPkSet.SearchList(vList: TStringList; vStr: String): Boolean;
var
I: Integer;
begin
Result := False;
{ for I:= 0 to vLIst.Count -1 do
if vList.Strings[i] = vStr then
begin
Result := True;
end;
if FMstOrDtl = '1' then Result := False;//辅助科目不设立位置
if vList.Count >= (7 - FPKCount) then Result := False; }
end;

function TFrmPkSet.GetOrExist(vDayCount, vPostion: Integer;vTeachID:string): Boolean;
var
cds: TClientDataSet;
begin
cds := TClientDataSet.Create(nil);
cds.Data := cdsDtl.Data;
cds.Filter := ' Postion = ' +InttoStr(vPostion) +' and DayCount = ' + IntToStr(vDayCount)+
' and TeachID = '''+vTeachID+''' ';
cds.Filtered:= True;
if cds.RecordCount > 0 then Result := True else Result := False;
cds.Free;
end;
procedure TFrmPkSet.FormCreate(Sender: TObject);
begin
inherited;
FlClassList := TStringList.Create;
FlClassListName := TStringList.Create;
FlYearList := TStringList.Create;
FlYearListName := TStringList.Create;
FlYearClassList := TStringList.Create;
FlYearClassListName := TStringList.Create;
FDayCountList := TStringList.Create;
FSubjectCount := TStringList.Create;
end;

procedure TFrmPkSet.WriteDataToStringGrid;
var
I,J : Integer;
vDayCount,vPostion: integer;
begin
StringPK.RowCount := cdsYearClass.RecordCount +1 ;
cdsYearClass.First;
for J := 0 to cdsYearClass.RecordCount - 1 do
begin
StringPK.Cells[0,J+1] := cdsYearClass.FieldByName('YearName').AsString + cdsYearClass.FieldByName('ClassName').AsString;
StringPK.ColWidths[0] := 100;
cdsDtl.First;
for I := 0 to cdsDtl.RecordCount - 1 do //班级数量'
begin
if cdsYearClass.FieldByName('YearID').AsString = cdsDtl.FieldByName('YearID').AsString then
if cdsYearClass.FieldByName('ClassID').AsString = cdsDtl.FieldByName('ClassID').AsString then
begin
vDayCount := cdsDtl.FieldByName('DayCount').AsInteger;
vPostion := cdsDtl.FieldByName('Postion').AsInteger;
StringPK.Cells[(vDayCount-1)*7 + vPostion,J+1] := GetSubjectName(cdsDtl.FieldByName('SubjectID').AsString);
end;
cdsDtl.Next;
end;
cdsYearClass.Next;
end;
// cdsDtl.Data := cdsDtlNull.Data;
end;


function TFrmPkSet.GetSubjectName(vSubjectID: string): String;
var
I: integer;
begin
Result := '';
cdsSubjectBack.First;
for I := 0 to cdsSubjectBack.RecordCount -1 do
begin
if cdsSubjectBack.FieldByName('SubjectID').AsString = vSubjectID then
Result := cdsSubjectBack.FieldByName('SubjectName').AsString;
cdsSubjectBack.Next;
end;
end;


procedure TFrmPkSet.clbFuncRightClick(Sender: TObject);
var
YearID, ClassID: string;
begin
YearID := GetListValue(FlYearClassListName, clbFuncRight.Items.Strings[clbFuncRight.ItemIndex], FlYearList);
ClassID := GetListValue(FlYearClassListName, clbFuncRight.Items.Strings[clbFuncRight.ItemIndex], FlClassList);
CdsTeachClass.Locate('YearID;ClassID', VarArrayOf([YearID, ClassID]), [loPartialKey]) ;
end;

procedure TFrmPkSet.dxDBGridColumn1GetText(Sender: TObject;
ANode: TdxTreeListNode; var AText: String);
begin
inherited;
AText := GetResultName(cdsDepart, AText, 'DepartID', 'DepartName');
end;

procedure TFrmPkSet.SpeedButton2Click(Sender: TObject);
var
DepartID,TeachID,YearID,ClassID: string;
B1,B2,B3,B4,B5,B6,B7: boolean;
LastClass: String;
orConnect: Integer;
maxClassCount,SubjectID: string;
begin
inherited;
DepartID := cdsTeach.FieldByName('DepartID').AsString;
SubjectID := cdsSubject.FieldByName('SubjectID').AsString ;
B1 := DBCheckBox1.Checked;
B2 := DBCheckBox2.Checked;
B3 := DBCheckBox3.Checked;
B4 := DBCheckBox4.Checked;
B5 := DBCheckBox5.Checked;
B6 := DBCheckBox6.Checked;
B7 := DBCheckBox7.Checked;;
LastClass := DBEdit15.Text;
orConnect := DBRadioGroup1.ItemIndex;
maxClassCount := DBComboBox1.Text;

cdsTeach.First;

while not cdsTeach.Eof do
begin
if cdsTeach.FieldByName('DepartID').AsString = DepartID then
begin
CdsTeachClass.First;
while not CdsTeachClass.Eof do
begin
CdsTeachClass.Edit;
CdsTeachClass.FieldByName('TeachSubject').AsString := SubjectID;
CdsTeachClass.FieldByName('TeachID').AsString := cdsTeach.FieldByName('TeachID').AsString;
CdsTeachClass.FieldByName('A1').AsBoolean := B1;
CdsTeachClass.FieldByName('A2').AsBoolean := B2;
CdsTeachClass.FieldByName('A3').AsBoolean := B3;
CdsTeachClass.FieldByName('A4').AsBoolean := B4;
CdsTeachClass.FieldByName('A5').AsBoolean := B5;
CdsTeachClass.FieldByName('A6').AsBoolean := B6;
CdsTeachClass.FieldByName('A7').AsBoolean := B7;
CdsTeachClass.FieldByName('OrConnect').AsInteger := orConnect;

CdsTeachClass.FieldByName('maxClassCount').AsString := maxClassCount;
CdsTeachClass.FieldByName('WeekClass').AsString := LastClass;
// cdsClassSubject.FieldByName('DayClass').AsString := DBEdit16.Text;
CdsTeachClass.Post;
CdsTeachClass.Next;
end;
cdsTeach.Next;
end else cdsTeach.Next;
end;
end;

procedure TFrmPkSet.SaveAllData;
var
OutParam: OleVariant;
InParam: OleVariant;
cdsArray: Array of TClientDataSet;
begin
inherited;
SetLength(cdsArray, 3);
cdsArray[0] := cdsMst;
cdsArray[1] := CdsTeachClass;
cdsArray[2] := cdsDtl;
InParam := RetrieveDeltas(cdsArray);
IDataGet.PostPKSet(InParam, OutParam);
ReconcileDeltas(cdsArray, OutParam);
end;

procedure TFrmPkSet.WriteCdsDtl(vMin,vMax,vInt: Integer);
var
TempCdsDtl: TClientDataSet;
iPostion: integer;
TempListPostion: TStringList;
vDayCount: Integer;
begin
TempListPostion := TStringList.Create;
TempCdsDtl := TClientDataSet.Create(nil);
TempCdsDtl.Data := cdsDtl.Data;
if vInt = 0 then //连续
begin
TempCdsDtl.Filter := 'YearID = '''+cdsClassSubject.FieldByName('YearID').AsString+''' and '+
'ClassID = '''+cdsClassSubject.FieldByName('ClassID').AsString+''' and ' +
' SubjectID = '''+cdsClassSubject.FieldByName('TeachSubject').AsString+''' and orExistConect = False ' ;
TempCdsDtl.Filtered := True;
tempCdsDtl.First;
Randomize;
TempListPostion.Clear;
Repeat
Randomize;
vDayCount := RandomRange(1,tempCdsDtl.RecordCount+1);//随机一个星期
TempCdsDtl.RecNo := vDayCount;
vDayCount := TempCdsDtl.FieldByName('DayCount').AsInteger;
iPostion := TempCdsDtl.FieldByName('Postion').AsInteger;
TempListPostion.Add(IntTostr(vDayCount));
if TempListPostion.Count >= tempCdsDtl.RecordCount then
if ExistAllRecord(TempListPostion, tempCdsDtl) then
begin
TempListPostion.Clear;
FRepeartDtl:= True;
break;
end;
if iPostion mod 2 = 0 then
begin
iPostion := iPostion - 1;
end else
begin
iPostion := iPostion + 1;
if iPostion > vMin+vMax then iPostion := IPostion - 2;
end;

until (not GetOrPostion(vDayCount,iPostion,cdsClassSubject.FieldByName('YearID').AsString,cdsClassSubject.FieldByName('ClassID').AsString)) and
(not GetDayCount(vDayCount,cdsClassSubject.FieldByName('YearID').AsString,cdsClassSubject.FieldByName('ClassID').AsString)) and
(not GetOrExist(vDayCount,iPostion,cdsClassSubject.FieldByName('TeachID').AsString));//)
// or (ExistAllList(TempListPostion, FUpMinCount+FUpMaxCount)); //没有跟以前相同位置,老师在这个位置不教其他班级
begin
if not FRepeartDtl then
begin
cdsDtl.Append;
cdsDtl.FieldByName('DayCount').AsInteger := TempCdsDtl.FieldByName('DayCount').AsInteger ;
cdsDtl.FieldByName('Postion').AsInteger := iPostion;
cdsDtl.FieldByName('YearID').AsString := TempCdsDtl.FieldByName('YearID').AsString;
cdsDtl.FieldByName('ClassID').AsString := TempCdsDtl.FieldByName('ClassID').AsString ;
cdsDtl.FieldByName('SubjectID').AsString := TempCdsDtl.FieldByName('SubjectID').AsString ;
cdsDtl.FieldByName('orExistConect').AsBoolean := True ;
cdsDtl.Post;
Inc(FCount);
end else begin //如果找不到满足条件的
{ TempListPostion.Clear; //随即放一个算了
Repeat
vDayCount := RandomRange(1,tempCdsDtl.RecordCount + 1);//随机一个星期
TempCdsDtl.RecNo := vDayCount;
vDayCount := TempCdsDtl.FieldByName('DayCount').AsInteger;
iPostion := TempCdsDtl.FieldByName('Postion').AsInteger;
TempListPostion.Add(IntTostr(iPostion));
if TempListPostion.Count >= vMin+vMax then
if ExistAllList(TempListPostion, vMin+vMax) then
begin
TempListPostion.Clear;
FRepeartDtl:= True;

break;
end;
until (not GetOrPostion(vDayCount,iPostion,cdsClassSubject.FieldByName('ClassID').AsString,cdsClassSubject.FieldByName('TeachSubject').AsString)) and
(not GetOrExist(vDayCount,iPostion,cdsClassSubject.FieldByName('ClassID').AsString,cdsClassSubject.FieldByName('TeachSubject').AsString));//)
// or (ExistAllList(TempListPostion, FUpMinCount+FUpMaxCount)); //没有跟以前相同位置,老师在这个位置不教其他班级
}
inc(FCount);
FRepeartDtl:= false ;
end;
if cdsClassSubject.FieldByName('WeekClass').AsInteger = FCount then Exit;
end;
tempcdsDtl.Next;
end;
TempListPostion.Free;
tempcdsDtl.Free;
end;

function TFrmPkSet.GetOrPostion(vDayCount, vPostion: Integer;vYearID, vClassID:string): Boolean;
var
cds: TClientDataSet;
begin
Result := False;
cds := TClientDataSet.Create(nil);
cds.Data := cdsDtl.Data;
cds.Filter := ' Postion = ' +InttoStr(vPostion) +' and DayCount = ' + IntToStr(vDayCount)+
' and YearID = '''+vYearID+''' and ClassID = '''+vClassID+'''';
cds.Filtered:= True;
if cds.RecordCount > 0 then Result := True else Result := False;
cds.Free;
end;
{var
I,j: integer;
begin
Result := False;
cdsDtl.First;
for I := 0 to cdsDtl.RecordCount - 1 do
begin
if cdsDtl.FieldByName('DayCount').AsInteger = vDayCount then
if cdsDtl.FieldByName('Postion').AsInteger = vPostion then
if cdsDtl.FieldByName('YearID').AsString= vYearID then
if cdsDtl.FieldByName('ClassID').AsString= vClassID then
if cdsDtl.FieldByName('SubjectID').AsString = '' then
begin
Result := True;
Break;
end;
cdsDtl.Next;
end;
end; }

function TFrmPkSet.GetMstOrDtl(vSubject: string): string;
var
I: integer;
begin
Result := '';
cdsSubjectBack.First;
for I := 0 to cdsSubjectBack.recordCount -1 do
begin
if cdsSubjectBack.FieldByName('SubjectID').AsString = vSubject then
begin
Result := cdsSubjectBack.FieldByName('SubjectType').AsString;
Break;
end;
cdsSubjectBack.Next;
end;
end;

function TFrmPkSet.ExistAllRecord(vList: TStringList;
vcds: TClientDataSet): Boolean;
var
I: Integer;
function ExistSing(m: Integer): Boolean;
var
J : integer;
begin
Result := False;
for J := 0 to vList.Count - 1 do
if vList.Strings[j] = IntToStr(m) then
Result := True;
end;
begin
Result := True;
for I:= 1 to vcds.RecordCount do
begin
if not ExistSing(vcds.FieldByName('DayCount').AsInteger) then
begin
Result := False;
Break;
end;
vcds.Next;
end;
end;

function TFrmPkSet.GetDayCount(vDayCount: Integer; vYearID,vClassID: string): Boolean;
var
cds: TClientDataSet;
begin
cds := TClientDataSet.Create(nil);
cds.Data := cdsDtl.Data;
cds.Filter := ' YearID = '''+vYearID+''' and '+
'ClassID = '''+vClassID+''' and DayCount = ' + IntToStr(vDayCount) +
' and orExistConect = True ';
cds.Filtered:= True;
if cds.RecordCount > 0 then Result := True else Result := False;
cds.Free;
end;

procedure TFrmPkSet.GetCurrPKCount(vYearID, vClassID, vTeachID: string);
begin

end;

procedure TFrmPkSet.PkSetTWo;
var
ListPostion,TempListPostion: TStringList;
// K: integer;
vDayCount,iPostion,FUpMinCount,FUpMaxCount: integer;
begin
ListPostion := TStringList.Create;
TempListPostion := TStringList.Create;
Repeat
Randomize;
vDayCount := RandomRange(1,8);
if FDayCountList.Count >= 7 then
if ExistAllList(FDayCountList, 7) then
begin
FDayCountList.Clear;
FRepeart:= True;
Exit;
end;
until (not SearchList(FDayCountList,IntToStr(vDayCount)));
FDayCountList.Add(IntToStr(vDayCount));
// if cdsTwoPK.FieldByName('A'+IntToStr(vDayCount)).AsBoolean then break;
FUpMinCount := GetMinCount(cdsYearClass.FieldByName('YearID').asString,vDayCount);
FUpMaxCount := GetMaxCount(cdsYearClass.FieldByName('YearID').asString,vDayCount);
TempListPostion.Clear;
Repeat
Randomize;
iPostion := RandomRange(1,FUpMinCount+FUpMaxCount+1);
TempListPostion.Add(IntTostr(iPostion));
if TempListPostion.Count >= FUpMinCount+FUpMaxCount then
if ExistAllList(TempListPostion, FUpMinCount+FUpMaxCount) then
begin
TempListPostion.Clear;
FRepeart:= True;
break;
end;
if iPostion mod 2 = 0 then
begin
FPostionTwo := iPostion - 1;
end else
begin
FPostionTwo := iPostion + 1;
if FPostionTwo > FUpMinCount+FUpMaxCount then FPostionTwo := iPostion - 1;
end; //位置可以排
until (not SearchListTwo(ListPostion,IntToStr(iPostion))) and (not GetOrExistTwo(vDayCount,iPostion,
cdsTwoPK.FieldByName('YearID').AsString,cdsTwoPK.FieldByName('ClassID').AsString ))
and (not SubjectNoOne(cdsTwoPK.FieldByName('TeachSubject').Asstring)) //
and ( not GetOrPostionTwo(vDayCount,iPostion,cdsTwoPK.FieldByName('YearID').AsString,
cdsTwoPK.FieldByName('ClassID').AsString,cdsTwoPK.FieldByName('TeachSubject').AsString) );//)
if not FRepeart then
begin
ListPostion.Add(IntToStr(iPostion));
ListPostion.Add(IntToStr(iPostion +1));
FSubjectCount.Add(cdsTwoPK.FieldByName('TeachSubject').AsString);
Inc(FCount);
Inc(FDoubleClass);
cdsDtl.Append;
cdsDtl.FieldByName('DayCount').AsInteger := vDayCount ;
cdsDtl.FieldByName('Postion').AsInteger := iPostion;
cdsDtl.FieldByName('YearID').AsString := cdsTwoPK.FieldByName('YearID').AsString ;
cdsDtl.FieldByName('ClassID').AsString := cdsTwoPK.FieldByName('ClassID').AsString ;
cdsDtl.FieldByName('SubjectID').AsString := cdsTwoPK.FieldByName('TeachSubject').AsString ;
cdsDtl.FieldByName('orExistConect').AsBoolean := True ;
cdsDtl.Post;
cdsDtl.Append;
cdsDtl.FieldByName('DayCount').AsInteger := vDayCount ;
cdsDtl.FieldByName('Postion').AsInteger := FPostionTwo;
cdsDtl.FieldByName('YearID').AsString := cdsTwoPK.FieldByName('YearID').AsString ;
cdsDtl.FieldByName('ClassID').AsString := cdsTwoPK.FieldByName('ClassID').AsString ;
cdsDtl.FieldByName('SubjectID').AsString := cdsTwoPK.FieldByName('TeachSubject').AsString ;
cdsDtl.FieldByName('orExistConect').AsBoolean := True ;
cdsDtl.Post;
Exit;
end else
begin
//数据设置有点问题,科目课多了或者上课时间设置少了
// Exit;
end;
FRepeart:= False;
ListPostion.Free;
TempListPostion.Free;
PkSetTWo;
end;
function TFrmPkSet.SearchListTwo(vList: TStringList;
vStr: String): Boolean;
var
I: Integer;
begin
Result := False;
for I:= 0 to vLIst.Count -1 do
if vList.Strings[i] = vStr then
begin
Result := True;
Exit;
end;
for I:= 0 to vLIst.Count -1 do
if vList.Strings[i] = IntToStr(FPostionTwo) then
begin
Result := True;
Exit;
end;

end;

function TFrmPkSet.GetOrExistTwo(vDayCount, vPostion: Integer;vYearID,vClassID:string): Boolean;
var
cds: TClientDataSet;
begin
cds := TClientDataSet.Create(nil);
Result := False;
cds.Data := cdsDtl.Data;
cds.Filter := ' Postion = ' +InttoStr(vPostion) +' and DayCount = ' + IntToStr(vDayCount) +
' and YearID = '''+vYearID+''' and ClassID = '''+vClassID+'''';
cds.Filtered:= True;
if FDoubleClass >= cdsTwoPK.RecordCount then //如果只有半天课
begin
if cds.RecordCount > 1 then
begin
Result := True ;
Exit;
end;
end else
begin
if cds.RecordCount > 0 then
begin
Result := True ;
Exit;
end;
end;
cds.Data := cdsDtl.Data;
cds.Filter := ' Postion = ' +InttoStr(FPostionTwo) +' and DayCount = ' + IntToStr(vDayCount) +
' and YearID = '''+vYearID+''' and ClassID = '''+vClassID+'''';
cds.Filtered:= True;
if FDoubleClass >= cdsTwoPK.RecordCount then //当前的科目
begin
if cds.RecordCount > 1 then
begin
Result := True ;
Exit;
end;
end else
begin //当前科目

if cds.RecordCount > 0 then
begin
Result := True ;
Exit;
end;
end;
cds.Free;
end;

function TFrmPkSet.GetOrPostionTwo(vDayCount, vPostion: Integer;
vYearID,vClassID,vSubjectID: string): Boolean;
var
I,j: integer;
cdsTemp: TClientDataSet;
begin
cdsTemp := TClientDataSet.Create(nil);
Result := False;
cdsTemp.Data := cdsDtl.Data;
cdsTemp.Filter := ' Postion = ' +InttoStr(vPostion) +' and DayCount = ' + IntToStr(vDayCount) +
' and YearID = '''+vYearID+''' and ClassID = '''+vClassID+'''';
cdsTemp.Filtered:= True;
if cdsTemp.RecordCount > 0 then
begin
Result := True;
Exit;
end;
cdsTemp.Filter := ' Postion = ' +InttoStr(FPostionTwo) +' and DayCount = ' + IntToStr(vDayCount) +
' and YearID = '''+vYearID+''' and ClassID = '''+vClassID+'''';
cdsTemp.Filtered:= True;
if cdsTemp.RecordCount > 0 then
begin
Result := True;
Exit;
end;
cdsTemp.Filter := ' YearID = '''+vYearID+''' and ClassID = '''+vClassID+'''';
cdsTemp.Filtered:= True;
if cdsTemp.RecordCount >= FAllCount*2 then Exit;


cdsTemp.Filter := ' DayCount = ' + IntToStr(vDayCount) +
' and YearID = '''+vYearID+''' and ClassID = '''+vClassID+'''';
cdsTemp.Filtered:= True;
if cdsTemp.RecordCount > 0 then
begin
Result := True;
Exit;
end;
cdsTemp.Free;
end;

function TFrmPkSet.GetExistsSubject(vDayCount: Integer; vYearID, vClassID,
vSubjectID: string): Boolean;
var
I,j: integer;
cdsTemp: TClientDataSet;
begin
cdsTemp := TClientDataSet.Create(nil);
Result := False;
cdsTemp.Data := cdsDtl.Data;
cdsTemp.Filter := ' SubjectID = '''+vSubjectID+''' and DayCount = ' + IntToStr(vDayCount) +
' and YearID = '''+vYearID+''' and ClassID = '''+vClassID+'''';
cdsTemp.Filtered:= True;
if cdsTemp.RecordCount > 1 then
begin
Result := True;
Exit;
end;
cdsTemp.Free;
end;
{var
I,j: integer;
begin
Result := False;
cdsDtl.First;

for I := 0 to cdsDtl.RecordCount - 1 do
begin
if cdsDtl.FieldByName('DayCount').AsInteger = vDayCount then
if cdsDtl.FieldByName('YearID').AsString= vYearID then
if cdsDtl.FieldByName('ClassID').AsString= vClassID then
if cdsDtl.FieldByName('SubjectID').AsString = vSubjectID then
if cdsDtl.FieldByName('orExistConect').AsBoolean then
begin
Result := True;
Exit;
end;
cdsDtl.Next;
end;

end; }

function TFrmPkSet.SubjectNoOne(vSubject: string): boolean;
var
I: Integer;
begin
Result := False;
{ for I := 0 to FSubjectCount.Count - 1 do
if FSubjectCount.Strings[i] = vSubject then
Result := True;
if FSubjectCount.Count = cdsTWoPK.RecordCount then
Result := False;}
end;

procedure TFrmPkSet.FormKeyDown(Sender: TObject; var Key: Word;
Shift: TShiftState);
begin
inherited;
if (Shift = [ssShift,ssCtrl,ssAlt])then
if key = VK_Return then
begin
GroupBox1.Visible := not GroupBox1.Visible;
Label54.Visible := not Label54.Visible;
end;
end;

function TFrmPkSet.GetPKCount(vYearID, vClassID,
vSUbjectID: string): Integer;
var
cds: TClientDataSet;
begin
cds := TClientDataSet.Create(nil);
Result := 0;
cds.Data := cdsDtl.Data;
cds.Filter := ' SubjectID = '''+vSUbjectID+''' ' +
' and YearID = '''+vYearID+''' and ClassID = '''+vClassID+'''';

cds.Filtered:= True;
Result := cds.RecordCount;
cds.Free;
end;

function TFrmPkSet.GetPkMinDayCount(vYearID,vClassID: string): Integer;//的到排课最少的天数
var
tempArray : Array[0..6] of Integer;
i: integer;
cdsTemp: TClientDataSet;
MinValue,MinDayCOunt: Integer;
function ExistsDayCount(vStr: Integer): Boolean;
var
II: integer;
begin
Result := False;
for II := 0 to FDayCountList.Count - 1 do
begin
if FDayCountList.Strings[ii] = IntToStr(vStr) then
Result := True;
end;
end;
begin
cdsTemp := TClientDataSet.Create(nil);
cdsTemp.Data := cdsDtl.Data;
for I := 0 to High(TempArray) do
TempArray[i] := 0;
for I := 1 to 7 do
begin
cdsTemp.Filter := 'YearID = '''+vYearID+''' and ClassID = '''+vClassID+''' and DayCount = ' + IntToStr(I);
cdsTemp.Filtered := True;
TempArray[I-1] := cdsTemp.RecordCount;
end;
MinValue := 100;
for I := low(TempArray) to High(TempArray) do
begin
if (tempArray[i] < MinValue) and (not ExistsDayCount(I+1)) and (tempArray[i]< getMaxCount(vYearID,I+1)+GetMinCount(vYearID,I+1) ) then
begin
MinValue := TempArray[i];
MinDayCount := I + 1;
end;
end;
cdsTemp.Free;
Result := MinDayCount;
// FreeMem(tempArray);
end;

procedure TFrmPkSet.WriteLastRecord;
var
cds,cds1: TClientDataSet;
j,iWeek: Integer;
vYearID,vClassID,vTeachSubject: string;
begin
cds := TClientDataSet.Create(nil);
cds1 := TClientDataSet.Create(nil);
cds.Data := cdsSubject.Data;
cds1.Data := cdsDtl.Data;
cds.First;
while cds.Eof do
begin
iWeek := cds.FieldByName('weekClass').AsInteger ;
vYearID := cds.FieldByName('YearID').AsString ;
vClassID := cds.FieldByName('ClassID').AsString ;
vTeachSubject := cds.FieldByName('TeachSubject').AsString ;
cds1.Filter := 'YearID ='''+vYearID+''' and classID= '''+vClassID+''' and SubjectID = '''+vTeachSubject+''' ';
cds1.Filtered := True;
if cds1.RecordCount < iWeek then
begin
for j := cds1.RecordCount to iWeek-1 do
begin
cdsDtl.Append;
cdsDtl.FieldByName('YearID').AsString := vYearID ;
cdsDtl.FieldByName('classID').AsString := vClassID;
cdsDtl.FieldByName('DayCount').AsInteger := cds1.FieldByName('DayCount').AsInteger ;
cdsDtl.FieldByName('Postion').AsInteger := cdsTwoPK.FieldByName('ClassID').AsInteger ;
cdsDtl.FieldByName('SubjectID').AsString := vTeachSubject ;
end;
end;
cds.Next;
end;
cds1.Free;
cds.Free;
end;

procedure TFrmPkSet.FormClose(Sender: TObject; var Action: TCloseAction);
begin
inherited;
FlClassList.Free;
FlClassListName.Free;
FlYearList.Free ;
FlYearListName.Free ;
FlYearClassList.Free ;
FlYearClassListName.Free ;
FDayCountList.Free;
FSubjectCount.Free;
cdsDtl.Free;
Action := CaFree;
end;

procedure TFrmPkSet.FormCloseQuery(Sender: TObject; var CanClose: Boolean);
begin
inherited;

end;

end.

相关信息:


欢迎光临本社区,您还没有登录,不能发贴子。请在 这里登录