home *** CD-ROM | disk | FTP | other *** search
/ Chip 2001 October / Chip_2001-10_cd1.bin / zkuste / delphi / kompon / d45 / ARDOCI.ZIP / OraSQL.pas < prev    next >
Pascal/Delphi Source File  |  2001-04-27  |  4KB  |  157 lines

  1. unit OraSQL;
  2.  
  3. interface
  4.  
  5. {
  6.   ValuesNull contains True - if data exists, False - if no data
  7.  
  8.   from Oracle this flags comes as : -1 - this is NUll, >=0 - NOT NULL
  9.   for parameters flags stored such as its come from Oracle
  10. }
  11.  
  12. uses Classes, DB, AOraUpdateSQL, AOraSQL, ADataSet, DataSetQuery, OraDB;
  13.  
  14. type
  15.   TOraSQL=class(TDataSetQuery)
  16.   private
  17.    FOraUpdate:TAOraUpdateSQL;
  18.    procedure SetOraUpdateSQL(Value:TAOraUpdateSQL);
  19.   protected
  20.   public
  21.    constructor Create(AOwner:TComponent);override;
  22.    procedure ApplyUpdates; override;
  23.    procedure InternalRefresh;override;
  24.   published
  25.    property UpdateSQLs:TAOraUpdateSQL read FOraUpdate write SetOraUpdateSQL;
  26.    property Database;
  27.    property FetchCount;
  28.    property SQL;
  29.    property Params;
  30.    property OnUpdateRecord;
  31.   end;
  32. procedure Register;
  33.  
  34. implementation
  35.  
  36. {$R dOCIIcons.res}
  37.  
  38. uses Dialogs, SysUtils, GoodDate;
  39.  
  40. procedure Register;
  41. begin
  42.   RegisterComponents('Data Access', [TOraSQL]);
  43. end;
  44.  
  45. constructor TOraSQL.Create(AOwner: TComponent);
  46. begin
  47.  inherited CreateSet(AOwner,qtOracle);
  48. end;
  49.  
  50. procedure TOraSQL.ApplyUpdates;
  51. var sql:TStrings;
  52.     q:TAOraSQL;
  53.     i:integer;
  54.     p:TParams;
  55.     fid:integer;
  56.     pname,fname:string;
  57.     pt:TAParamType;
  58.     old:boolean;
  59.     v:variant;
  60. begin
  61.  q:=TAOraSQL.Create(self);
  62.  p:=TParams.Create;
  63. try
  64.  if not Assigned(FOraUpdate) then begin raise Exception.Create('UpdateSQLs not defined!'); end;
  65.  sql:=nil;
  66.  case updType of
  67.   ukDelete: sql:=FOraUpdate.DeleteSQL;
  68.   ukModify: sql:=FOraUpdate.ModifySQL;
  69.   ukInsert: sql:=FOraUpdate.InsertSQL;
  70.  end;
  71.  q.Database:=TOraDB(Database);
  72.  q.SQL.Assign(sql);
  73.  p.ParseSQL(sql.Text,true);
  74.  for i:=0 to p.Count-1 do begin // ∩≡Φ±ΓαΦΓασ∞ τφα≈σφΦ  ∩εδ ∞
  75.   pname:=p[i].Name;
  76.   if pname='=' then continue;
  77.   old:=False;
  78.   if copy(pname,1,4)='OUT_'
  79.    then begin pt:=ptoOutput; fname:=copy(pname,5,256); end
  80.   else if copy(pname,1,4)='OLD_'
  81.    then begin pt:=ptoInput; fname:=copy(pname,5,256); old:=True; end
  82.   else begin pt:=ptoInput; fname:=pname; end;
  83.   fid:=FieldID[fname];
  84.   if q.ParamExists(pname) then continue;
  85.   q.AddParam(pname,TypeDelphiToA(Fields[fid].DataType),pt);
  86.   if old then begin
  87.    if Modified
  88.     then v:=Fields[fid].OldValue
  89.     else v:=Fields[fid].Value;
  90.    if VarIsNull(v) then q.ParamByName[pname].Clear
  91.     else
  92.      case q.ParamByName[pname].FieldType of
  93.       ftoDate:    q.ParamByName[pname].AsDate:=DateTimeToGoodDate(v);
  94.       ftoInteger: q.ParamByName[pname].AsInteger:=v;
  95.       ftoString:  q.ParamByName[pname].AsString:=v;
  96.       ftoDouble:  q.ParamByName[pname].AsDouble :=v;
  97.      end;
  98.   end else begin
  99.    if Fields[fid].IsNull then q.ParamByName[pname].Clear
  100.     else
  101.      case q.ParamByName[pname].FieldType of
  102.       ftoDate:    q.ParamByName[pname].AsDate:=DateTimeToGoodDate(Fields[fid].AsDateTime);
  103.       ftoInteger: q.ParamByName[pname].AsInteger:=Fields[fid].AsInteger;
  104.       ftoString:  q.ParamByName[pname].AsString:=Fields[fid].AsString;
  105.       ftoDouble:  q.ParamByName[pname].AsDouble :=Fields[fid].AsFloat;
  106.      end;
  107.   end;
  108.  end;
  109.  q.ExecSQL;
  110.  for i:=0 to p.Count-1 do begin // ∩≡Φ±ΓαΦΓασ∞ τφα≈σφΦ  ∩εδ ∞
  111.   pname:=p[i].Name;
  112.   if pname='=' then continue;
  113.   if copy(pname,1,4)<>'OUT_' then continue;
  114.   fname:=copy(pname,5,256);
  115.   fid:=FieldID[fname];
  116.   if q.ParamByName[pname].IsNull then Fields[fid].Clear
  117.    else
  118.     case q.ParamByName[pname].FieldType of
  119.      ftoInteger: Fields[fid].AsInteger:=q.ParamByName[pname].AsInteger;
  120.      ftoString:  Fields[fid].AsString:=q.ParamByName[pname].AsString;
  121.      ftoDouble:  Fields[fid].AsFloat:=q.ParamByName[pname].AsDouble;
  122.     end;
  123.  end;
  124. finally
  125.  p.Free;
  126.  q.Free;
  127. end;
  128. end;
  129.  
  130. procedure TOraSQL.InternalRefresh;
  131. begin
  132.  DisableControls;
  133.  ReOpen;
  134.  EnableControls;
  135. end;
  136.  
  137. procedure TOraSQL.SetOraUpdateSQL(Value: TAOraUpdateSQL);
  138. begin
  139.   if Value <> FOraUpdate then
  140.   begin
  141.     if Assigned(FOraUpdate) and (FOraUpdate.DataSet = Self) then
  142.       FOraUpdate.DataSet := nil;
  143.     FOraUpdate := Value;
  144.     if Assigned(FOraUpdate) then begin
  145.       { If another dataset already references this updateobject, then
  146.         remove the reference }
  147.       if Assigned(FOraUpdate.DataSet) and
  148.         (FOraUpdate.DataSet <> Self) then
  149.         TOraSQL(FOraUpdate.DataSet).UpdateSQLs := nil;
  150.       FOraUpdate.DataSet := Self;
  151.     end;
  152.   end;
  153. end;
  154.  
  155. end.
  156.  
  157.