📄 qexpryacc.y
字号:
Function TFieldExpr.GetIsNull: boolean;
Begin
If FxQuery.IsDataSetDisabled( fField.DataSet ) Then
Begin
Result := True;
Exit;
End;
Result := fField.IsNull;
End;
//
Constructor TResultSetFieldExpr.Create( ParameterList: TParameterList; xqField: TxqField );
Begin
Inherited Create( ParameterList );
fxqField := xqField;
End;
Function TResultSetFieldExpr.GetAsString: String;
Begin
Result := fxqField.AsString;
End;
Function TResultSetFieldExpr.GetAsFloat: Double;
Begin
Result := fxqField.AsFloat;
End;
Function TResultSetFieldExpr.GetAsInteger: Integer;
Begin
Result := fxqField.AsInteger;
End;
Function TResultSetFieldExpr.GetAsBoolean: Boolean;
Begin
Result := fxqField.AsBoolean;
End;
Function TResultSetFieldExpr.GetExprType: TExprtype;
Begin
Result := fxqField.DataType;
End;
Function TResultSetFieldExpr.GetIsNull: boolean;
Begin
Result := fxqField.IsNull;
End;
//TNowExpr
function TNowExpr.GetAsFloat: Double;
begin
Result := Now;
end;
function TNowExpr.GetExprtype: TExprtype;
begin
Result:= ttFloat;
end;
//TStrToDate
Function TStrToDateExpr.GetAsFloat: Double;
Begin
Try
Result := StrToDate( Param[0].AsString );
Except
On E: Exception Do
Begin
MessageToUser( E.Message, mtError );
Result := 0;
End;
End;
End;
Function TStrToDateExpr.GetExprtype: TExprtype;
Begin
Result := ttFloat;
End;
//TSQLTrimExpr
Function SQLTrim( trimmed_char: char; Const S: String ): String;
Var
I, L: Integer;
Begin
L := Length( S );
I := 1;
While ( I <= L ) And ( S[I] = trimmed_char ) Do
Inc( I );
If I > L Then
Result := ''
Else
Begin
While S[L] = trimmed_char Do
Dec( L );
Result := Copy( S, I, L - I + 1 );
End;
End;
Function SQLTrimLeft( trimmed_char: char; Const S: String ): String;
Var
I, L: Integer;
Begin
L := Length( S );
I := 1;
While ( I <= L ) And ( S[I] = trimmed_char ) Do
Inc( I );
Result := Copy( S, I, Maxint );
End;
Function SQLTrimRight( trimmed_char: char; Const S: String ): String;
Var
I: Integer;
Begin
I := Length( S );
While ( I > 0 ) And ( S[I] = trimmed_char ) Do
Dec( I );
Result := Copy( S, 1, I );
End;
Function TSQLTrimExpr.GetAsString: String;
Begin
Case Param[2].AsInteger Of
0: // leading
Result := SQLTrimLeft( Param[0].AsString[1], Param[1].MaxString );
1: // trailing
Result := SQLTrimRight( Param[0].AsString[1], Param[1].MaxString );
2: // both
Result := SQLTrim( Param[0].AsString[1], Param[1].MaxString );
End;
End;
Function TSQLTrimExpr.GetMaxString: String;
Begin
Case Param[2].AsInteger Of
0: // leading
Result := SQLTrimLeft( Param[0].AsString[1], Param[1].GetMaxString );
1: // trailing
Result := SQLTrimRight( Param[0].AsString[1], Param[1].GetMaxsString );
2: // both
Result := SQLTrim( Param[0].AsString[1], Param[1].GetMaxString );
End;
End;
Function TSQLTrimExpr.GetExprtype: TExprtype;
Begin
Result := ttString;
End;
//TRoundDecExpr
Constructor TRoundDecExpr.Create( ParameterList: TParameterList;
IsRound: Boolean );
Begin
Inherited Create( ParameterList );
FIsRound := IsRound;
End;
Function TRoundDecExpr.GetAsFloat: Double;
Begin
If Param[1].AsInteger = 0 Then
Result := Param[0].AsFloat
Else
Result := Param[0].AsFloat * IntPower( 10, Param[1].AsInteger );
If FIsRound Then
Result := Result + 0.5;
If Param[1].AsInteger > 0 Then
Result := Int( Result ) / IntPower( 10, Param[1].AsInteger );
End;
Function TRoundDecExpr.GetExprtype: TExprtype;
Begin
Result := ttFloat;
End;
//TISNULLExpr
Function TISNULLExpr.GetAsBoolean: Boolean;
Begin
Result := Param[0].IsNull;
If Param[1].AsBoolean = False Then
Result := Not Result;
End;
Function TISNULLExpr.GetExprtype: TExprtype;
Begin
Result := ttBoolean;
End;
//TNULLValueExpr
Function TNULLValueExpr.GetAsBoolean: Boolean;
Begin
Result := True;
End;
Function TNULLValueExpr.GetExprtype: TExprtype;
Begin
Result := ttBoolean;
End;
//functions defined in Exfunctions property
Constructor TUDFExpr.Create( ParameterList: TParameterList; xQuery:
TCustomXQuery; Const Identifier: String; Resulttype: TExprtype;
MaxLen: Integer );
Begin
Inherited Create( ParameterList );
FxQuery := xQuery;
FIdentifier := Identifier;
FParams := ParameterList;
FResulttype := Resulttype;
FMaxLen := MaxLen;
End;
Function TUDFExpr.GetExprtype: TExprtype;
Begin
Result := FResulttype;
End;
Function TUDFExpr.GetMaxString: String;
Var
MxL: Integer;
Begin
Result:= '';
if Not (FResulttype = ttString) then Exit;
MxL:= FMaxLen;
if MxL = 0 then MxL := 1;
Result:= StringOfChar( 'x', MxL );
End;
Function TUDFExpr.GetAsString: String;
Var
Value: variant;
Begin
Value := Null;
Result := '';
FxQuery.OnUDFSolve( FxQuery, FIdentifier, FParams, Value );
If vartype( Value ) <> varNull Then
Result := Value; // varAstype(Value, varString);
End;
Function TUDFExpr.GetAsFloat: Double;
Var
Value: variant;
Begin
Value := Null;
Result := 0;
FxQuery.OnUDFSolve( FxQuery, FIdentifier, FParams, Value );
If vartype( Value ) <> varNull Then
Result := Value; // varAstype(Value, varDouble);
End;
Function TUDFExpr.GetAsInteger: Integer;
Var
Value: variant;
Begin
Value := Null;
Result := 0;
FxQuery.OnUDFSolve( FxQuery, FIdentifier, FParams, Value );
If vartype( Value ) <> varNull Then
Result := Value; // varAstype(Value, varInteger);
End;
Function TUDFExpr.GetAsBoolean: Boolean;
Var
Value: variant;
Begin
Value := Null;
Result := False;
FxQuery.OnUDFSolve( FxQuery, FIdentifier, FParams, Value );
If vartype( Value ) <> varNull Then
Result := Value; // varAstype(Value, varBoolean);
End;
// TFilterFieldExpr
Constructor TFilterFieldExpr.Create( ParameterList: TParameterList; F: TField );
Begin
Inherited Create( ParameterList );
fField := F;
End;
Function TFilterFieldExpr.GetExprtype: TExprtype;
Begin
If fField.Datatype In ftNonTexttypes Then
Result := ttInteger
Else
Case fField.Datatype Of
ftString(*$IFDEF LEVEL4*), ftFixedChar, ftWideString(*$ENDIF*)(*$IFDEF LEVEL5*),
ftGUID(*$ENDIF*): Result := ttString;
ftFloat, ftCurrency, ftBCD, ftDate, ftTime, ftDateTime: Result := ttFloat;
ftAutoInc, ftSmallInt, ftInteger, ftWord
(*$IFNDEF LEVEL3*), ftLargeInt(*$ENDIF*): Result := ttInteger;
ftBoolean: Result := ttBoolean;
Else
result := ttString;
End;
End;
Function TFilterFieldExpr.GetAsString: String;
Begin
Result := '';
If Not ( fField.Datatype In ftNonTexttypes ) Then
Result := fField.AsString;
End;
Function TFilterFieldExpr.GetAsFloat: Double;
Begin
Result := fField.AsFloat;
End;
Function TFilterFieldExpr.GetAsInteger: Integer;
Begin
Result := fField.AsInteger;
End;
Function TFilterFieldExpr.GetAsBoolean: Boolean;
Begin
Result := fField.AsBoolean;
End;
// TExplicitParamExpr
Constructor TExplicitParamExpr.Create( Analizer: TSqlAnalizer; Param: TParam );
Begin
Inherited Create;
fAnalizer:= Analizer;
fParam:= Param;
if fParam = Nil then
Raise ExQueryError.Create( SParameterNotFound );
End;
Function TExplicitParamExpr.GetExprType: TExprtype;
var
DataType: TFieldType;
DataSet: TDataSet;
fld: TField;
Begin
Result:= ttString;
if fAnalizer.xquery.DataSource <> Nil then
begin
DataSet := fanalizer.xquery.DataSource.DataSet;
If DataSet = Nil Then exit;
if DataSet.Active = False Then DataSet.Open;
fld := DataSet.FindField(fParam.Name);
if fld = nil then Exit;
DataType:= fld.DataType
end else
DataType:= fParam.DataType;
If Not(Datatype In [ftMemo, ftFmtMemo]) And (fParam.Datatype In ftNonTexttypes) Then
Result := ttInteger
Else
Begin
Case Datatype Of
ftString, ftMemo, ftFmtMemo(*$IFDEF LEVEL4*), ftFixedChar, ftWideString(*$ENDIF*)
(*$IFDEF LEVEL5*), ftGUID(*$ENDIF*): Result := ttString;
ftFloat, ftCurrency, ftBCD, ftDate, ftTime, ftDateTime: Result := ttFloat;
ftAutoInc, ftSmallInt, ftInteger, ftWord
(*$IFNDEF LEVEL3*), ftLargeInt(*$ENDIF*): Result := ttInteger;
ftBoolean: Result := ttBoolean;
Else
result := ttString;
End;
End;
End;
Function TExplicitParamExpr.GetAsString: String;
var
DataSet: TDataSet;
fld: TField;
Begin
Result:= '';
if fAnalizer.xquery.DataSource <> Nil then
begin
DataSet := fanalizer.xquery.DataSource.DataSet;
If DataSet = Nil Then exit;
if DataSet.Active = False Then DataSet.Open;
fld := DataSet.FindField(fParam.Name);
if fld = nil then Exit;
Result := fld.AsString;
end else
Result := fParam.AsString;
End;
Function TExplicitParamExpr.GetAsFloat: Double;
var
DataSet: TDataSet;
fld: TField;
Begin
Result:= 0;
if fAnalizer.xquery.DataSource <> Nil then
begin
DataSet := fanalizer.xquery.DataSource.DataSet;
If DataSet = Nil Then exit;
if DataSet.Active = False Then DataSet.Open;
fld := DataSet.FindField(fParam.Name);
if fld = nil then Exit;
Result := fld.AsFloat;
end else
Result := fParam.AsFloat;
End;
Function TExplicitParamExpr.GetAsInteger: Integer;
var
DataSet: TDataSet;
fld: TField;
Begin
Result:= 0;
if fAnalizer.xquery.DataSource <> Nil then
begin
DataSet := fanalizer.xquery.DataSource.DataSet;
If DataSet = Nil Then exit;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -