//---------------------------------------------------------------------------
//注意：检查校验脚本在OnBeforePost()事件中执行!
//---------------------------------------------------------------------------
// String _opacsconnection; 	约定的输入变量名
// String _modalitytype; 		约定的输入变量名
// int _number; 				约定的输入变量名：值1为测试模式，0为非测试。
// String _guid; 				约定的输出变量名
// TADOQuery _qryStudy; 		外部已定义的对象
// TADOQuery _qryCustom; 		外部已定义的对象

//---------------------------------------------------------------------------
String _opacsconnection;	
String _modalitytype;
int _number;
String _guid = "";

//---------------------------------------------------------------------------
String cSplit="-";//脚本内部定义的变量：GUID与重复次数之间的分隔符，默认为'-'

//---------------------------------------------------------------------------
bool IsExistStudy( String sStudyKey )
{
	bool bExist=false;
	if ( sStudyKey=="")
		return bExist;
		
	String sQuery = "select top 1 study_key from study " + 
		"where study_key=" + sStudyKey;
	
	_qryCustom.Close();
  	_qryCustom.SQL.Text = sQuery;
  	_qryCustom.Open();
  	if (!_qryCustom.Eof)
  		bExist=true;
  		
  	return bExist;	
} 

//---------------------------------------------------------------------------
//编号校验规则
//1.当手工输入的编号不带分隔符，但此编号表中已存在时，在原编号后＋分隔符＋后缀
//2.后缀从1开始递增
//3.每次新增编号时，从表中取出匹配的已有编号，在其最大的后缀数值上加1，作为新增编号的后缀
//4.强制执行 xxx-n的编号形式，避免 xxx-n-1这样的形式
//5.当手工输入的编号带分隔符(后缀)，且分隔符左侧的部分表中已存在时，检查是否符合上述编号规则
//  如不符合，则予纠正
//6.除以上情况外，保留手工编号，不加后缀
//7.仅新增记录时执行校验。用户手工修改已保存的记录编号时，不作校验。（控制权交给用户）
//---------------------------------------------------------------------------
String ValidPatientGuid()
{
	String sCurPatientGuid = _qryStudy.FieldByName("patient_guid").AsString;
	String sStudyKey = _qryStudy.FieldByName("study_key").AsString;
	
	if ( IsExistStudy(_opacsconnection,sStudyKey) )//如不是新增记录，不必检查
		return sCurPatientGuid;
	
	String sPatientGuid = sCurPatientGuid;
	int iPos = Pos( cSplit, sCurPatientGuid );
	if ( iPos > 0 )
		sPatientGuid =  Copy( sCurPatientGuid, 1, iPos-1);
	
	String sQuery = "select patient_guid from study " + 
		"where (patient_guid='" + sPatientGuid +
		"' or patient_guid like '"+ sPatientGuid + cSplit +"[0-9]%'"+
		") and study_modalitytype='" + _modalitytype + "'";
		
  	int iSuffix=-1;
  	int iMaxSuffix=-1;
  	String sOrgPatientGuid = sPatientGuid;//保存不带后缀形式的guid
  	String sSuffix="";
  	int lenPrefix = Length(sOrgPatientGuid)+1;

	_qryCustom.Close();
  	_qryCustom.SQL.Text = sQuery;
	try
	{
	  	_qryCustom.Open();
	  	_qryCustom.First();
	  	while ( !_qryCustom.Eof )
	  	{
	  		sPatientGuid = _qryCustom.FieldByName("patient_guid").AsString;

	  		iPos = Pos( cSplit, sPatientGuid );
	  		sSuffix="";
			if ( iPos > 0 )//如带后缀，取出后缀
				sSuffix =  Copy( sPatientGuid, iPos+1, Length(sPatientGuid)-lenPrefix);
	  		if ( sSuffix == "")
	  			iSuffix = 0;
	  		else
	  			iSuffix = StrToInt( sSuffix );
	  		if ( iSuffix > iMaxSuffix )
	  			iMaxSuffix = iSuffix;//刷新最大后缀
	  			
	  		_qryCustom.Next();
	  	}

	  	if ( iMaxSuffix > -1 )
	  	{
	  		sPatientGuid = sOrgPatientGuid + cSplit + IntToStr( iMaxSuffix+1 );

		  	if (sPatientGuid != sCurPatientGuid)//如果输入的号是带后缀的，检查其是否正确
	  		{
				sCurPatientGuid = sPatientGuid;
				ShowMessage("此号已登记过，现改为"+sCurPatientGuid);
				_qryStudy.FieldByName("patient_guid").Value=sCurPatientGuid;
			}
		}
	}
	except
	{
		ShowMessage(sCurPatientGuid+"是错误的编号");    		
	}
  	////
    return sCurPatientGuid;
}
	
//---------------------------------------------------------------------------
// 主程序
//---------------------------------------------------------------------------
{
  	_guid = ValidPatientGuid();
}
