📄 whereform.cpp
字号:
//---------------------------------------------------------------------------
#include <vcl.h>
#include "WhereForm.h"
//---------------------------------------------------------------------------
#pragma hdrstop
#pragma package(smart_init)
#pragma link "SDComboBox"
#pragma link "DateEdit"
#pragma link "SDEdit"
#pragma resource "*.dfm"
TWhereStrForm *WhereStrForm;
//---------------------------------------------------------------------------
__fastcall TWhereStrForm::TWhereStrForm(TComponent* Owner,TKSCDSet *DSet,AnsiString FixFilter)
: TForm(Owner)
{
ClientFilter=FixFilter;
l_DSet=DSet;
l_DataSetType=1;
l_DSet->Open();
sFields=new TStringList();
sFieldType=new TStringList();
sFieldQueryStr=new TStringList();
sWhere=new TStringList();
int iType;
for(int i=0;i<l_DSet->MasterFieldCount;i++)
{
LFields->Items->Strings[i]=l_DSet->MasterFields->Fields[i]->DisplayName;
sFields->Add(l_DSet->MasterFields->Fields[i]->FieldName);
iType=l_DSet->MasterFields->Fields[i]->DataType;
switch(iType)
{
case 2,3,4,5,6:
sFieldType->Add("NUMBER");
break;
case 11:
sFieldType->Add("DATE");
break;
default:
sFieldType->Add("CHAR");
break;
}
sFieldQueryStr->Add(""); //暂缺字段查询语句
}
LFields->ItemIndex=0;
LFieldsClick(LFields);
scLogic->AddItems("等于","=");
scLogic->AddItems("大于",">");
scLogic->AddItems("小于","<");
scLogic->AddItems("不大于","<=");
scLogic->AddItems("不小于",">=");
scLogic->AddItems("不等于","<>");
scLogic->AddItems("最接近","like");
scLogic->ItemIndex=0;
scRelate->AddItems(" 无", " ");
scRelate->AddItems("或者"," or ");
scRelate->AddItems("并且"," and ");
scRelate->ItemIndex=0;
ecValue->AddItems(" 是 ","1");
ecValue->AddItems(" 否 ","0");
ecValue->ItemIndex=0;
}
//---------------------------------------------------------------------------
__fastcall TWhereStrForm::TWhereStrForm(TComponent* Owner,TKSCRSet *RSet,AnsiString FixFilter,TStringList *FieldList)
: TForm(Owner)
{
AnsiString tmpstr,tmpstr2;
int iPos;
ClientFilter=FixFilter;
l_RSet=RSet;
l_DataSetType=2;
if(l_RSet != NULL)
l_RSet->Open();
sFields=new TStringList();
sFieldType=new TStringList();
sFieldQueryStr=new TStringList();
sWhere=new TStringList();
for(int i=0;i<FieldList->Count;i++)
{
tmpstr=FieldList->Strings[i];
iPos=tmpstr.AnsiPos("\t");
tmpstr2=tmpstr.SubString(1,iPos-1);
sFields->Add(tmpstr2); //字段名
tmpstr=tmpstr.SubString(iPos+1,tmpstr.Length()-iPos);
iPos=tmpstr.AnsiPos("\t");
tmpstr2=tmpstr.SubString(1,iPos-1);
LFields->Items->Add(tmpstr2); //字段中文说明
tmpstr=tmpstr.SubString(iPos+1,tmpstr.Length()-iPos);
iPos=tmpstr.AnsiPos("\t");
tmpstr2=tmpstr.SubString(1,iPos-1);
sFieldType->Add(tmpstr2); //字段类型
sFieldQueryStr->Add(tmpstr.SubString(iPos+1,tmpstr.Length()-iPos)); //字段查询语句
}
LFields->ItemIndex=0;
LFieldsClick(LFields);
scLogic->AddItems("等于","=");
scLogic->AddItems("大于",">");
scLogic->AddItems("小于","<");
scLogic->AddItems("不大于","<=");
scLogic->AddItems("不小于",">=");
scLogic->AddItems("不等于","<>");
scLogic->AddItems("最接近","like");
scLogic->ItemIndex=0;
scRelate->AddItems(" 无", " ");
scRelate->AddItems("或者"," or ");
scRelate->AddItems("并且"," and ");
scRelate->ItemIndex=0;
ecValue->AddItems(" 是 ","1");
ecValue->AddItems(" 否 ","0");
ecValue->ItemIndex=0;
}
//---------------------------------------------------------------------------
void __fastcall TWhereStrForm::FormDestroy(TObject *Sender)
{
delete sFields;
delete sWhere;
}
//---------------------------------------------------------------------------
void __fastcall TWhereStrForm::bbAddClick(TObject *Sender)
{
TListItem *pItem;
AnsiString TStr1,TStr2,Value;
if(lvWhereStr->Items->Count==0&&scRelate->ItemIndex!=0)
{
MessageBox(Handle,"不能选取与或关系.","错误提示",MB_ICONERROR);
return;
}
if(lvWhereStr->Items->Count>0&&scRelate->ItemIndex==0)
{
MessageBox(Handle,"只能选取与或关系.","错误提示",MB_ICONERROR);
return;
}
if(etValue->Visible)
Value=etValue->Text;
if(ecValue->Visible)
Value=ecValue->ItemData[1];
if(edValue->Visible)
Value=edValue->Text;
TStr1=sFields->Strings[LFields->ItemIndex]; //字段名
TStr2=sFieldType->Strings[LFields->ItemIndex]; //字段类型
if(TStr2=="NUMBER" || TStr2=="BOOL")
{
if(Value.IsEmpty())
{
MessageBox(Handle,"数字类型,值不能为空.","错误提示",MB_ICONERROR);
return;
}
if(scLogic->ItemData[1]=="like")
TStr2=" "+scRelate->ItemData[1]+" "+TStr1+" = "+Value;
else
TStr2=" "+scRelate->ItemData[1]+" "+TStr1+" "+scLogic->ItemData[1]+" "+Value;
}
else
{
if(scLogic->ItemData[1]=="like")
TStr2=" "+scRelate->ItemData[1]+" "+TStr1+" "+scLogic->ItemData[1]+" '%"+Value+"%'";
else
TStr2=" "+scRelate->ItemData[1]+" "+TStr1+" "+scLogic->ItemData[1]+" '"+Value+"'";
}
sWhere->Add(TStr2);
pItem=lvWhereStr->Items->Add();
pItem->Caption=scRelate->Text;
pItem->SubItems->Add(LFields->Items->Strings[LFields->ItemIndex]+scLogic->Text+Value);
lvWhereStr->Items->Item[lvWhereStr->Items->Count-1]->Selected=true;
scRelate->ItemIndex=1;
LFields->SetFocus();
}
//---------------------------------------------------------------------------
void __fastcall TWhereStrForm::bbReMoveClick(TObject *Sender)
{
if(lvWhereStr->Selected)
{
int i=lvWhereStr->Selected->Index;
lvWhereStr->Items->Delete(i);
sWhere->Delete(i);
if(i==0&&lvWhereStr->Items->Count>0)
{
lvWhereStr->Items->Item[i]->Caption="无";
sWhere->Strings[i]=sWhere->Strings[i].SubString(6,sWhere->Strings[i].Length());
lvWhereStr->Items->Item[i]->Selected=true;
}
if(i>0&&lvWhereStr->Items->Count>0)
lvWhereStr->Items->Item[i-1]->Selected=true;
if(lvWhereStr->Items->Count==0)
scRelate->ItemIndex=0;
}
LFields->SetFocus();
}
//---------------------------------------------------------------------------
void __fastcall TWhereStrForm::bbOkClick(TObject *Sender)
{
/*
if(lvWhereStr->Items->Count<1)
bbAddClick(Sender);
*/
if(l_DataSetType == 1)
l_DSet->Close();
else
if(l_RSet != NULL)
l_RSet->Close();
WhereStr="";
for(int i=0; i<sWhere->Count;i++)
WhereStr+=sWhere->Strings[i];
if(!ClientFilter.Trim().IsEmpty())
{
if(!WhereStr.Trim().IsEmpty())
WhereStr+=" and "+ClientFilter;
else
WhereStr=ClientFilter;
}
if(l_DataSetType == 1)
{
l_DSet->HeadWhereStr=WhereStr;
l_DSet->Open();
}
else
if(l_RSet != NULL)
{
l_DSet->Close();
l_DSet->Filter=WhereStr;
l_DSet->Filtered=true;
l_DSet->Open();
}
}
//---------------------------------------------------------------------------
void __fastcall TWhereStrForm::scLogicClick(TObject *Sender)
{
etValue->Text="";
if(etValue->Visible)
etValue->SetFocus();
if(edValue->Visible)
edValue->SetFocus();
}
//---------------------------------------------------------------------------
void __fastcall TWhereStrForm::bbClearClick(TObject *Sender)
{
lvWhereStr->Items->Clear();
sWhere->Clear();
LFields->SetFocus();
scRelate->ItemIndex=0;
}
//---------------------------------------------------------------------------
void __fastcall TWhereStrForm::LFieldsClick(TObject *Sender)
{
AnsiString Str1,Str2;
Str1=sFieldType->Strings[LFields->ItemIndex];
Str2=sFieldQueryStr->Strings[LFields->ItemIndex];
if(Str1 == "DATE")
{
edValue->Visible=true;
ecValue->Visible=false;
etValue->Visible=false;
}
else if(Str1 == "BOOL")
{
edValue->Visible=false;
ecValue->Visible=true;
etValue->Visible=false;
}
else
{
edValue->Visible=false;
ecValue->Visible=false;
etValue->Visible=true;
if(Str1 == "NUMBER" )
etValue->CharType=ctMathematic;
else
etValue->CharType=ctNormal;
if(Str2 != "")
etValue->ButtonVisible=true;
else
etValue->ButtonVisible=false;
}
}
//---------------------------------------------------------------------------
void __fastcall TWhereStrForm::FormKeyDown(TObject *Sender, WORD &Key,
TShiftState Shift)
{
if(Shift.Contains(ssCtrl))
{
if(Key==65)
bbAddClick(Sender);
if(Key==83)
bbReMoveClick(Sender);
if(Key==68)
bbClearClick(Sender);
if(Key==88)
bbOkClick(Sender);
}
}
//---------------------------------------------------------------------------
void __fastcall TWhereStrForm::etValueButtonClick(TObject *Sender)
{
if(etValue->ButtonVisible)
{
AnsiString SqlStr;
TfrmWnQuery *p;
SqlStr=sFieldQueryStr->Strings[LFields->ItemIndex];
if(SqlStr.IsEmpty())
return;
try
{
// StartWaitForm("正在查询,请稍候...");
p=new TfrmWnQuery(this,"查询项目查询",SqlStr);
}
__finally
{
// EndWaitForm();
}
if(p->ShowModal()==mrOk)
{
etValue->Text=p->ColData[1];
}
delete p;
}
}
//---------------------------------------------------------------------------
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -