Componentes.Terceros.RemObj.../official/5.0.24.615/Data Abstract for Delphi/Source/uDAMacroProcessors.pas

510 lines
17 KiB
ObjectPascal

unit uDAMacroProcessors;
{----------------------------------------------------------------------------}
{ Data Abstract Library - Core Library }
{ }
{ compiler: Delphi 6 and up, Kylix 3 and up }
{ platform: Win32, Linux }
{ }
{ (c)opyright RemObjects Software. all rights reserved. }
{ }
{ Using this code requires a valid license of the Data Abstract }
{ which can be obtained at http://www.remobjects.com. }
{----------------------------------------------------------------------------}
{$I DataAbstract.inc}
interface
uses uDAEngine;
(*
Macros:
-------------------- Date --------------------
Returns the current date from the server
Syntax: {Date()}
Example: SELECT * FROM Table WHERE OrderDate>{Date()}
Parameters: this macro has no parameters
-------------------- Time --------------------
Returns the current time from the server
Syntax: {Time()}
Example: SELECT * FROM Table WHERE OrderDate>{Time()}
Parameters: this macro has no parameters
-------------------- DateTime --------------------
Returns the current datetime from the server
Syntax: {DateTime()}
Example: SELECT * FROM Table WHERE OrderDate>{DateTime()}
Parameters: this macro has no parameters
-------------------- AddTime --------------------
Returns a new datetime value based on adding an interval to the specified date.
Not all databases support this macro.
Syntax: {AddTime(<date>, <interval>, <interval_type>)}
Example: SELECT * FROM Table WHERE OrderDate>{AddTime(Date(), 2, day)}
Parameters: <date>: a valid date
<interval>: number of days, weeks, etc as per next parameter
<interval_type>: day, week, year, hour, min, sec
-------------------- FormatDateTime --------------------
Formats the specified datetime to the datetime format used by the database
Syntax: {FormatDateTime(<date>)}
Example: SELECT * FROM Table WHERE OrderDate>{FormatDateTime('12/22/2003 15:22:34.123')}
Parameters: <date>: a string expression representing a data in format MM/DD/YYYY HH24:MM:SS.MS
-------------------- FormatDate --------------------
Formats the specified date to the date format used by the database
Syntax: {FormatDateTime(<date>)}
Example: SELECT * FROM Table WHERE OrderDate>{FormatDate('12/22/2003')}
Parameters: <date>: a string expression representing a data in format MM/DD/YYYY
-------------------- Length --------------------
Returns the length of the given string
Syntax: {Length(<string>)}
Example: SELECT * FROM Table WHERE {Length(CustomerID)}>3
Parameters: <string>: a text string
-------------------- LowerCase --------------------
Converts the given string to lower case
Syntax: {LowerCase(<string>)}
Example: SELECT * FROM Table WHERE {LowerCase(CustomerID)}='alfki'
Parameters: <string>: a text string
-------------------- UpperCase --------------------
Converts the given string to upper case
Syntax: {UpperCase(<string>)}
Example: SELECT * FROM Table WHERE {UpperCase(CustomerID)}='ALFKI'
Parameters: <string>: a text string
-------------------- TrimLeft --------------------
Removes the leading spaces from a string
Syntax: {TrimLeft(<string>)}
Example: SELECT * FROM Table WHERE {TrimLeft(CustomerID)}='ALFKI'
Parameters: <string>: a text string
-------------------- TrimRight --------------------
Removes the trailing spaces from a string
Syntax: {TrimRight(<string>)}
Example: SELECT * FROM Table WHERE {TrimRight(CustomerID)}='ALFKI'
Parameters: <string>: a text string
-------------------- Copy --------------------
Returns <count> characters starting from <index> from <string>
Syntax: {Copy(<string>, <index>, <count>)}
Example: SELECT * FROM Table WHERE OrderDate>{Date()}
Parameters:
<string>: a field name or a string
<index>: the position from where to start copying
<count>: the number of characters to copy
-------------------- NoLockHint --------------------
Returns (NOLOCK) for MSSQL server and empty string for other databases
Syntax: {NoLockHint}
Example: SELECT * FROM Table {NoLockHint}
*)
type { TDAMSSQLMacroProcessor }
TDAMSSQLMacroProcessor = class(TDASQLMacroProcessor)
protected
function DateTime(Sender: TObject; const Parameters: array of string): string; override;
function AddTime(Sender: TObject; const Parameters: array of string): string; override;
function Length(Sender: TObject; const Parameters: array of string): string; override;
function LowerCase(Sender: TObject; const Parameters: array of string): string; override;
function UpperCase(Sender: TObject; const Parameters: array of string): string; override;
function TrimLeft(Sender: TObject; const Parameters: array of string): string; override;
function TrimRight(Sender: TObject; const Parameters: array of string): string; override;
function Copy(Sender: TObject; const Parameters: array of string): string; override;
function Nolock(Sender: TObject; const Parameters: array of string): string; override;
public
constructor Create;
end;
TMSSQLMacroProcessor = TDAMSSQLMacroProcessor;
{ TDAIBMacroProcessor }
TDAIBMacroProcessor = class(TDASQLMacroProcessor)
protected
function DateTime(Sender: TObject; const Parameters: array of string): string; override;
function AddTime(Sender: TObject; const Parameters: array of string): string; override;
function Length(Sender: TObject; const Parameters: array of string): string; override;
function LowerCase(Sender: TObject; const Parameters: array of string): string; override;
function UpperCase(Sender: TObject; const Parameters: array of string): string; override;
function TrimLeft(Sender: TObject; const Parameters: array of string): string; override;
function TrimRight(Sender: TObject; const Parameters: array of string): string; override;
function Copy(Sender: TObject; const Parameters: array of string): string; override;
function Nolock(Sender: TObject; const Parameters: array of string): string; override;
public
constructor Create;
end;
TIBMacroProcessor = TDAIBMacroProcessor;
{ TDAOracleMacroProcessor }
TDAOracleMacroProcessor = class(TDASQLMacroProcessor)
function DateTime(Sender: TObject; const Parameters: array of string): string; override;
function AddTime(Sender: TObject; const Parameters: array of string): string; override;
function Length(Sender: TObject; const Parameters: array of string): string; override;
function LowerCase(Sender: TObject; const Parameters: array of string): string; override;
function UpperCase(Sender: TObject; const Parameters: array of string): string; override;
function TrimLeft(Sender: TObject; const Parameters: array of string): string; override;
function TrimRight(Sender: TObject; const Parameters: array of string): string; override;
function Copy(Sender: TObject; const Parameters: array of string): string; override;
function FormatDate(Sender: TObject; const Parameters: array of string): string; override;
function FormatDateTime(Sender: TObject; const Parameters: array of string): string; override;
function Nolock(Sender: TObject; const Parameters: array of string): string; override;
public
constructor Create;
end;
TOracleMacroProcessor = TDAOracleMacroProcessor;
{ TDADBISAMMacroProcessor }
TDADBISAMMacroProcessor = class(TDASQLMacroProcessor)
function DateTime(Sender: TObject; const Parameters: array of string): string; override;
function AddTime(Sender: TObject; const Parameters: array of string): string; override;
function Length(Sender: TObject; const Parameters: array of string): string; override;
function LowerCase(Sender: TObject; const Parameters: array of string): string; override;
function UpperCase(Sender: TObject; const Parameters: array of string): string; override;
function TrimLeft(Sender: TObject; const Parameters: array of string): string; override;
function TrimRight(Sender: TObject; const Parameters: array of string): string; override;
function Copy(Sender: TObject; const Parameters: array of string): string; override;
function Nolock(Sender: TObject; const Parameters: array of string): string; override;
public
constructor Create;
end;
TDBISAMMacroProcessor = TDADBISAMMacroProcessor;
implementation
uses SysUtils;
{ TDAMSSQLMacroProcessor }
constructor TDAMSSQLMacroProcessor.Create;
begin
inherited Create('yyyy-mm-dd', 'yyyy-mm-dd hh:nn:ss.zzz', FALSE, '@');
end;
function TDAMSSQLMacroProcessor.AddTime(Sender: TObject;
const Parameters: array of string): string;
begin
result := Format('dateadd(%s, %s, %s)', [Parameters[2], Parameters[1], Parameters[0]]);
end;
function TDAMSSQLMacroProcessor.Copy(Sender: TObject;
const Parameters: array of string): string;
begin
result := Format('substring(%s, %s, %s)', [Parameters[0], Parameters[1], Parameters[2]]);
end;
function TDAMSSQLMacroProcessor.DateTime(Sender: TObject;
const Parameters: array of string): string;
begin
result := 'GetDate()';
end;
function TDAMSSQLMacroProcessor.Length(Sender: TObject;
const Parameters: array of string): string;
begin
result := 'len(' + Parameters[0] + ')'
end;
function TDAMSSQLMacroProcessor.LowerCase(Sender: TObject;
const Parameters: array of string): string;
begin
result := 'lower(' + Parameters[0] + ')'
end;
function TDAMSSQLMacroProcessor.TrimLeft(Sender: TObject;
const Parameters: array of string): string;
begin
result := 'ltrim(' + Parameters[0] + ')'
end;
function TDAMSSQLMacroProcessor.TrimRight(Sender: TObject;
const Parameters: array of string): string;
begin
result := 'rtrim(' + Parameters[0] + ')'
end;
function TDAMSSQLMacroProcessor.UpperCase(Sender: TObject;
const Parameters: array of string): string;
begin
result := 'upper(' + Parameters[0] + ')'
end;
function TDAMSSQLMacroProcessor.Nolock(Sender: TObject; const Parameters: array of string): string;
begin
result := ' (NOLOCK) ';
end;
{ TDAIBMacroProcessor }
constructor TDAIBMacroProcessor.Create;
begin
inherited Create('yyyy-mm-dd', 'yyyy-mm-dd hh:mm:ss.zzz', FALSE);
end;
function TDAIBMacroProcessor.AddTime(Sender: TObject;
const Parameters: array of string): string;
begin
result := '???'
end;
function TDAIBMacroProcessor.Copy(Sender: TObject;
const Parameters: array of string): string;
begin
result := Format('substring(%s from %s for %s)', [Parameters[0], Parameters[1], Parameters[2]]);
end;
function TDAIBMacroProcessor.DateTime(Sender: TObject;
const Parameters: array of string): string;
begin
result := '(select current_timestamp from rdb$database)';
end;
function TDAIBMacroProcessor.Length(Sender: TObject;
const Parameters: array of string): string;
begin
result := Format('char_length(%s)', [Parameters[0]]);
end;
function TDAIBMacroProcessor.LowerCase(Sender: TObject;
const Parameters: array of string): string;
begin
result := 'lower(' + Parameters[0] + ')'
end;
function TDAIBMacroProcessor.TrimLeft(Sender: TObject;
const Parameters: array of string): string;
begin
result := 'trim ( leading from ' + Parameters[0] + ')'
end;
function TDAIBMacroProcessor.TrimRight(Sender: TObject;
const Parameters: array of string): string;
begin
result := 'trim ( trailing from ' + Parameters[0] + ')'
end;
function TDAIBMacroProcessor.UpperCase(Sender: TObject;
const Parameters: array of string): string;
begin
result := 'upper(' + Parameters[0] + ')'
end;
function TDAIBMacroProcessor.Nolock(Sender: TObject; const Parameters: array of string): string;
begin
result := '';
end;
{ TDAOracleMacroProcessor }
constructor TDAOracleMacroProcessor.Create;
begin
inherited Create('MM/DD/YYYY', 'MM/DD/YYYY HH:MM:SS.ZZZ', FALSE);
end;
function TDAOracleMacroProcessor.FormatDate(Sender: TObject;
const Parameters: array of string): string;
begin
result := StringReplace('TO_DATE(''' + Parameters[0] + ''', ''MM/DD/YYYY'')', '''''', '''', [rfReplaceAll]);
end;
function TDAOracleMacroProcessor.FormatDateTime(Sender: TObject;
const Parameters: array of string): string;
begin
result := StringReplace('TO_DATE(''' + Parameters[0] + ''', ''MM/DD/YYYY HH24:MI:SS.FF3'')', '''''', '''', [rfReplaceAll]);
end;
function TDAOracleMacroProcessor.AddTime(Sender: TObject;
const Parameters: array of string): string;
begin
result := Parameters[0] + '+';
if SameText(Parameters[2], 'DAY') then
result := result + Parameters[1]
else if SameText(Parameters[2], 'WEEK') then
result := result + Parameters[1] + '*7'
else if SameText(Parameters[2], 'YEAR') then
result := result + Parameters[1] + '*365'
else if SameText(Parameters[2], 'HOUR') then
result := result + Parameters[1] + '/24'
else if SameText(Parameters[2], 'MIN') then
result := result + Parameters[1] + '/1440'
else if SameText(Parameters[2], 'SEC') then
result := result + Parameters[1] + '/86400';
end;
function TDAOracleMacroProcessor.Copy(Sender: TObject;
const Parameters: array of string): string;
begin
result := Format('SUBSTR(%s, %s, %s)', [Parameters[0], Parameters[1], Parameters[2]]);
end;
function TDAOracleMacroProcessor.DateTime(Sender: TObject;
const Parameters: array of string): string;
begin
result := 'SYSDATE'
end;
function TDAOracleMacroProcessor.Length(Sender: TObject;
const Parameters: array of string): string;
begin
result := Format('LENGTH(%s)', [Parameters[0]]);
end;
function TDAOracleMacroProcessor.LowerCase(Sender: TObject;
const Parameters: array of string): string;
begin
result := Format('LOWER(%s)', [Parameters[0]]);
end;
function TDAOracleMacroProcessor.TrimLeft(Sender: TObject;
const Parameters: array of string): string;
begin
result := Format('TRIM(%s)', [Parameters[0]]);
end;
function TDAOracleMacroProcessor.TrimRight(Sender: TObject;
const Parameters: array of string): string;
begin
result := Format('TRIM(%s)', [Parameters[0]]);
end;
function TDAOracleMacroProcessor.UpperCase(Sender: TObject;
const Parameters: array of string): string;
begin
result := Format('UPPER(%s)', [Parameters[0]]);
end;
function TDAOracleMacroProcessor.Nolock(Sender: TObject; const Parameters: array of string): string;
begin
result := '';
end;
{ TDADBISAMMacroProcessor }
constructor TDADBISAMMacroProcessor.Create;
begin
inherited Create('MM/DD/YYYY', 'MM/DD/YYYY HH:MM:SS.ZZZ', FALSE);
end;
function TDADBISAMMacroProcessor.AddTime(Sender: TObject;
const Parameters: array of string): string;
begin
result := Parameters[0] + '+';
if SameText(Parameters[2], 'DAY') then
result := result + Parameters[1]
else if SameText(Parameters[2], 'WEEK') then
result := result + Parameters[1] + '*7'
else if SameText(Parameters[2], 'YEAR') then
result := result + Parameters[1] + '*365'
else if SameText(Parameters[2], 'HOUR') then
result := result + Parameters[1] + '/24'
else if SameText(Parameters[2], 'MIN') then
result := result + Parameters[1] + '/1440'
else if SameText(Parameters[2], 'SEC') then
result := result + Parameters[1] + '/86400';
end;
function TDADBISAMMacroProcessor.Copy(Sender: TObject;
const Parameters: array of string): string;
begin
result := Format('SUBSTRING(%s FROM %s FOR %s)', [Parameters[0], Parameters[1], Parameters[2]]);
end;
function TDADBISAMMacroProcessor.DateTime(Sender: TObject;
const Parameters: array of string): string;
begin
result := 'CURRENT_TIMESTAMP'
end;
function TDADBISAMMacroProcessor.Length(Sender: TObject;
const Parameters: array of string): string;
begin
result := Format('LENGTH(%s)', [Parameters[0]]);
end;
function TDADBISAMMacroProcessor.LowerCase(Sender: TObject;
const Parameters: array of string): string;
begin
result := Format('LOWER(%s)', [Parameters[0]]);
end;
function TDADBISAMMacroProcessor.TrimLeft(Sender: TObject;
const Parameters: array of string): string;
begin
result := Format('TRIM(LEADING '' '' FROM %s)', [Parameters[0]]);
end;
function TDADBISAMMacroProcessor.TrimRight(Sender: TObject;
const Parameters: array of string): string;
begin
result := Format('TRIM(TRAILING '' '' FROM %s)', [Parameters[0]]);
end;
function TDADBISAMMacroProcessor.UpperCase(Sender: TObject;
const Parameters: array of string): string;
begin
result := Format('UPPER(%s)', [Parameters[0]]);
end;
function TDADBISAMMacroProcessor.Nolock(Sender: TObject; const Parameters: array of string): string;
begin
result := '';
end;
end.