📄 vafuncs.pas
字号:
//
// Variant array manipulation functions.
// (c) ChiconySoftware 2001
//
// When Who How
// --------- --- -------------------------------------------------------
// 2001.5.31 century Initial version
//
unit vafuncs;
interface
uses sysutils, classes,dialogs,dbfuncs,dbInfo;
// Prototypes
function VarIsNullOrEmpty(const value: Variant): Boolean;
function RowsCheck(const rows: OleVariant; num_columns: Integer): Boolean;
function ColumnsCheck(const rows: OleVariant; num_columns: Integer): Boolean;
function GetArrayBounds(const var_array: OleVariant;
var high_col, low_col, high_row, low_row: Integer): Boolean;
function GetArrayLowBounds(const var_array: OleVariant;
var low_col, low_row: Integer): Boolean;
function InitialiseVariantArray(var var_array: OleVariant;
const columns: Integer): Boolean; overload;
function InitialiseVariantArray(var var_array: OleVariant;
const columns: Integer; var_type: Integer; init_value: Variant): Boolean; overload;
function ValidSelectResult(const value: Variant; const columns: Integer=0): Boolean;
function CopyRow(const src_array: OleVariant; var dest_array: OleVariant;
const row: Integer=0): Boolean;
function NullValue(const value: Variant; const null_value: Variant): Variant;
function SortArray(var var_array: OleVariant; sort_column: Integer): Boolean;
function CheckExistStrVar(t_connection:TPodmsConnection;tableName,fieldName,val:string):boolean;
procedure AddValue(value: Variant; var q:TPodmsQuery;
const par_name: String; const date_time: DT_TYPES);
function AddColumn(value: Variant; var rows_str, values_str: String;
const col_name: String): Boolean;
function CheckExistIntVar(t_connection:TPodmsConnection;tableName,fieldName:string;varl:integer):boolean;
function CheckIssystem(val,ctype:string):boolean;
procedure AddUpdateValue(value: Variant; var q:TPodmsQuery;
const col_name: String; const date_time: DT_TYPES=DT_DATE);
implementation
function AddColumn(value: Variant; var rows_str, values_str: String;
const col_name: String): Boolean;
begin
// Value is NULL?
if (VarType(value)<>varNull) and (VarType(value)<>varEmpty) then begin
// Update rows string
rows_str:=rows_str + ',' + col_name;
// Update parameters string
values_str:=values_str + ',:v' + col_name;
Result:=TRUE;
end else
Result:=FALSE;
end;
//
// Used by the Insertxx functions to add the parameter values to an SQL
// statement text.
//
// Args: value of the parameter
// SQL query to add parameter value to
// parameter name
// format to use for date & time columns (optional, default is DT_DATE)
//
// Returns: TRUE on success
// FALSE is value type is unknown
//
// NOTE: EUnknownValueType exception is raised if ValType of value is unknown
//
// If the value is NULL or empty then no parameter value will be
// included and TRUE will be returned
//
procedure AddValue(value: Variant; var q:TPodmsQuery;
const par_name: String; const date_time: DT_TYPES);
begin
if (VarType(value)=varString) or (VarType(value)=varOleStr) then
// String
q.ParamString(par_name, value)
else if (VarType(value)=varInteger) or (VarType(value)=varSmallInt) or (VarType(value)=varByte) then
// Integer
q.ParamInteger(par_name, value)
else if (VarType(value)=varDate) then
// Date - use date, time, or both depending on date_time value
GiveDateOrTime(true,q, par_name, date_time, value)
else if (VarType(value)=varBoolean) then begin
// Boolean - may not be supported by RDBMS
//if g_Prefs.PREFS_BITSUPPORTED then begin
// q.ParamBoolean(par_name, value);
//end else begin
if value=TRUE then q.ParamString(par_name, 'Y')
else q.ParamString(par_name, 'N');
//end;
end else if (VarType(value)=varCurrency) then
// Currency - not used in Prexim
q.ParamCurrency(par_name, value)
else if (VarType(value)=varSingle) or (VarType(value)=varDouble) then
// Real number - not used in Prexim
q.ParamFloat(par_name, value)
else if (varType(value)=varVariant) then begin
q.ParamVariant(par_name,value);
end else if VarIsNullOrEmpty(value) then begin
// Ignore - NULL or empty value
;
end else
EUnknownValueType.Create('Unknown value type for parameter '+par_name);
end;
procedure AddUpdateValue(value: Variant; var q:TPodmsQuery;
const col_name: String; const date_time: DT_TYPES=DT_DATE);
var par_name: String;
begin
// Include this value?
if VarIsEmpty(value) then Exit;
// Initialise
par_name:='vx'+col_name;
// Add parameter value
if (VarType(value)=varString) or (VarType(value)=varOleStr) then begin
// String
q.SQLAdd(', '+col_name+'=:'+par_name);
q.ParamString(par_name, value);
end else if (VarType(value)=varInteger) or (VarType(value)=varSmallInt) or (VarType(value)=varByte) then begin
// Integer
q.SQLAdd(', '+col_name+'=:'+par_name);
q.ParamInteger(par_name, value)
end else if (VarType(value)=varDate) then begin
// Date - use date_time to decide to use date, time, or both
q.SQLAdd(', '+col_name+'=:'+par_name);
q.ParamDateTime(par_name,value);
//GiveDateOrTime(q, par_name, date_time, value)
end else if (VarType(value)=varBoolean) then begin
// Boolean - may not be supported by RDBMS
q.SQLAdd(', '+col_name+'=:'+par_name);
q.ParamBoolean(par_name, value);
end else if (VarType(value)=varCurrency) then begin
// Currency - not used in Prexim
q.SQLAdd(', '+col_name+'=:'+par_name);
q.ParamCurrency(par_name, value)
end else if (VarType(value)=varSingle) or (VarType(value)=varDouble) then begin
// Real - not used in Prexim
q.SQLAdd(', '+col_name+'=:'+par_name);
q.ParamFloat(par_name, value)
end else if VarIsNull(value) then begin
// NULL
q.SQLAdd(', '+col_name+'=NULL');
end else begin
// Failed - unknown value
EUnknownValueType.Create('Unknown value type for column '+col_name);
end;
end;
//
function CheckExistStrVar(t_connection:TPodmsConnection;tableName,fieldName,val:string):boolean;
var q: TPodmsQuery;
begin
Result:=True;
// Create query object
q:=TPodmsQuery.Create(t_connection);
if q=nil then begin
Result:=false;
Exit;
end;
// Construct SQL statement
try
q.SQLAdd('Select '+fieldName+' From '+tableName);
q.SQLAdd(' where '+fieldName+'=:var');
q.ParamString('var',val);
q.Open;
If q.RecordCount=0 then begin
Result:=false;
Exit;
end;
except on E:Exception do begin
Result:=false;
Exit;
end;
end;
try
CloseNewQuery(q);
except
end;
end;
function CheckIssystem(val,ctype:string):boolean;
begin
Result:=false;
if ctype='G' then begin
if uppercase(val)=uppercase('system') then result:=true;
end
else if ctype='U' then begin
if (uppercase(val)=uppercase('Admin')) or (uppercase(val)=uppercase('Manager')) then result:=true;
end;
end;
function CheckExistIntVar(t_connection:TPodmsConnection;tableName,fieldName:string;varl:integer):boolean;
var q: TPodmsQuery;
begin
Result:=True;
// Create query object
q:=TPodmsQuery.Create(t_connection);
if q=nil then begin
Result:=false;
Exit;
end;
// Construct SQL statement
try
q.SQLAdd('Select '+fieldName+' From '+tableName);
q.SQLAdd(' where '+fieldName+'=:var');
q.ParamInteger('var',varl);
q.Open;
If q.RecordCount=0 then begin
Result:=false;
Exit;
end;
except on E:Exception do begin
Result:=false;
Exit;
end;
end;
try
CloseNewQuery(q);
except
end;
end;
//
// Helper function to return a default value if the value is null/empty
//
// e.g. NullValue(value, TRUE) will return TRUE if value is null or
// will return value if value is not null
//
// Args: value to check to see if null or empty
// default value to use if value is null or empty
//
// Returns: null_value if value is null or empty
// value if value is not null or empty
//
function NullValue(const value: Variant; const null_value: Variant): Variant;
begin
// Valid variant?
if VarIsNullOrEmpty(value) then Result:=null_value
else Result:=value;
end;
//
// Returns TRUE if the variant given is a valid result from a call
// to a DR_xx method or a AD_Getxx method
//
// Args: variant to check
// number of columns expected (optional, 0=do not check)
//
// Returns: TRUE if the variant is two-dimensional and contains atleast
// one row
//
function ValidSelectResult(const value: Variant; const columns: Integer=0): Boolean;
begin
// Initialise
Result:=FALSE;
// Valid variant?
if VarIsNullOrEmpty(value) then Exit;
// Two-dimensional?
if VarArrayDimCount(value)<>2 then Exit;
// Correct number of columns?
if (columns>0) and (VarArrayHighBound(value, 1) - VarArrayLowBound(value, 1)<>columns - 1) then Exit;
// Atleast one row?
if VarArrayHighBound(value, 2) - VarArrayLowBound(value, 2) < 0 then Exit;
// Success
Result:=TRUE;
end;
//
// Returns TRUE if a variant is Null or empty
//
// Args: variant to test
//
// Returns: TRUE if a variant is Null or empty
//
function VarIsNullOrEmpty(const value: Variant): Boolean;
begin
Result:=VarIsEmpty(value) or VarIsNull(value);
end;
//
// A helper function for the UPDATE methods to check that the variant
// array passed is in the correct format
//
// Args: rows is the 1-dimensional variant array containing the row data to
// update
//
// num_columns is the number of columns expected
//
// Returns: TRUE on success
//
function RowsCheck(const rows: OleVariant; num_columns: Integer): Boolean;
var low_rows, high_rows: Integer;
begin
// Assume failure
Result:=FALSE;
// Correct dimensions?
if VarIsNullOrEmpty(rows) then Exit;
if VarArrayDimCount(rows)<>1 then Exit;
// Get boundaries
low_rows:=VarArrayLowBound(rows, 1);
high_rows:=VarArrayHighBound(rows, 1);
// Correct number of columns?
if (high_rows - low_rows <> num_columns - 1) then Exit;
// Success
Result:=TRUE;
end;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -