private
void
SetSortQuick(ReportClientDocument objRPT)
{
if ( ! String.IsNullOrEmpty( this .SortField))
{
cCreateReport objCreateReport = new cCreateReport();
string [] arrySortField = this .SortField.Split( new char [] { ' , ' });
string [] arrySortDirection = this .SortDirection.Split( new char [] { ' , ' });
for ( int i = 0 ; i < arrySortField.Length; i ++ )
{
string [] arryTemp = arrySortField[i].Split( new char [] { ' | ' });
string strFieldName = arryTemp[ 0 ];
string strFieldType = arryTemp[ 1 ].ToLower();
string strFormula = "" , strFormulaName = "" ;
switch (strFieldType)
{
case " datetime " :
strFormula = " date({ " + arrySortField[i] + " }) " ;
break ;
case " numeric " :
case " int " :
case " money " :
case " float " :
strFormula = " ToNumber({ " + arrySortField[i] + " }) " ;
break ;
default :
strFormula = " { " + arrySortField[i] + " } " ;
break ;
}
strFormulaName = " Order " + i.ToString();
objRPT.DataDefController.FormulaFieldController.AddByName(strFormulaName, strFormula, CrFormulaSyntaxEnum.crFormulaSyntaxCrystal);
ISCRField objS = objRPT.DataDefController.FindFieldByFormulaForm( " {@ " + strFormulaName + " } " );
if (objRPT.DataDefController.SortController.CanSortOn(objS))
{
SortClass objSort = new SortClass();
objSort.SortField = objS;
int countOfSort = objRPT.DataDefinition.Sorts.Count;
if (arrySortDirection[i] == " 1 " )
{
objSort.Direction = CrSortDirectionEnum.crSortDirectionDescendingOrder;
}
else
{
objSort.Direction = CrSortDirectionEnum.crSortDirectionAscendingOrder;
}
objRPT.DataDefController.SortController.Add(countOfSort, objSort);
}
}
}
}
{
if ( ! String.IsNullOrEmpty( this .SortField))
{
cCreateReport objCreateReport = new cCreateReport();
string [] arrySortField = this .SortField.Split( new char [] { ' , ' });
string [] arrySortDirection = this .SortDirection.Split( new char [] { ' , ' });
for ( int i = 0 ; i < arrySortField.Length; i ++ )
{
string [] arryTemp = arrySortField[i].Split( new char [] { ' | ' });
string strFieldName = arryTemp[ 0 ];
string strFieldType = arryTemp[ 1 ].ToLower();
string strFormula = "" , strFormulaName = "" ;
switch (strFieldType)
{
case " datetime " :
strFormula = " date({ " + arrySortField[i] + " }) " ;
break ;
case " numeric " :
case " int " :
case " money " :
case " float " :
strFormula = " ToNumber({ " + arrySortField[i] + " }) " ;
break ;
default :
strFormula = " { " + arrySortField[i] + " } " ;
break ;
}
strFormulaName = " Order " + i.ToString();
objRPT.DataDefController.FormulaFieldController.AddByName(strFormulaName, strFormula, CrFormulaSyntaxEnum.crFormulaSyntaxCrystal);
ISCRField objS = objRPT.DataDefController.FindFieldByFormulaForm( " {@ " + strFormulaName + " } " );
if (objRPT.DataDefController.SortController.CanSortOn(objS))
{
SortClass objSort = new SortClass();
objSort.SortField = objS;
int countOfSort = objRPT.DataDefinition.Sorts.Count;
if (arrySortDirection[i] == " 1 " )
{
objSort.Direction = CrSortDirectionEnum.crSortDirectionDescendingOrder;
}
else
{
objSort.Direction = CrSortDirectionEnum.crSortDirectionAscendingOrder;
}
objRPT.DataDefController.SortController.Add(countOfSort, objSort);
}
}
}
}
必须使用这种方式才可以动态添加公式为排序字段
objRPT.DataDefController.FormulaFieldController.AddByName(strFormulaName, strFormula, CrFormulaSyntaxEnum.crFormulaSyntaxCrystal);
ISCRField objS = objRPT.DataDefController.FindFieldByFormulaForm("{@"+strFormulaName+"}");
我试图使用如下方式动态添加公式字段,但是用CanSortOn检测总是不能作为sort字段。

public
void
AddFormula(ReportClientDocument oReportClientDocument,
string szName,
string szFormula,
CrFieldValueTypeEnum crFieldValueType
)
{
FormulaField oFormulaField;
oFormulaField = new FormulaField();
oFormulaField.Name = szName;
oFormulaField.Text = szFormula;
oFormulaField.Syntax = CrFormulaSyntaxEnum.crFormulaSyntaxCrystal;
oFormulaField.Type = crFieldValueType;
oReportClientDocument.DataDefController.FormulaFieldController.Add(oFormulaField);
}
string szName,
string szFormula,
CrFieldValueTypeEnum crFieldValueType
)
{
FormulaField oFormulaField;
oFormulaField = new FormulaField();
oFormulaField.Name = szName;
oFormulaField.Text = szFormula;
oFormulaField.Syntax = CrFormulaSyntaxEnum.crFormulaSyntaxCrystal;
oFormulaField.Type = crFieldValueType;
oReportClientDocument.DataDefController.FormulaFieldController.Add(oFormulaField);
}
代码
public
FormulaField FindFormulaField(ReportClientDocument oReportClientDocument,
string
szFormula)
{
FormulaField oFormulaField;
Fields oFields;
int iIndex;
oFormulaField = new FormulaFieldClass();
oFields = oReportClientDocument.DataDefinition.FormulaFields;
iIndex = oFields.Find(szFormula, CrFieldDisplayNameTypeEnum.crFieldDisplayNameName, CeLocale.ceLocaleUserDefault);
oFormulaField = ((FormulaField)oFields[iIndex]);
return oFormulaField;
}
{
FormulaField oFormulaField;
Fields oFields;
int iIndex;
oFormulaField = new FormulaFieldClass();
oFields = oReportClientDocument.DataDefinition.FormulaFields;
iIndex = oFields.Find(szFormula, CrFieldDisplayNameTypeEnum.crFieldDisplayNameName, CeLocale.ceLocaleUserDefault);
oFormulaField = ((FormulaField)oFields[iIndex]);
return oFormulaField;
}
后来我发现找到的公式字段的IsRecurring属性是false.只有这个属性为true时才可以作为sort的字段。