home *** CD-ROM | disk | FTP | other *** search
/ Delphi Magazine Collection 2001 / Delphi Magazine Collection 20001 (2001).iso / DISKS / Issue52 / HTML / Code / AppServer / dpoBase.pas < prev    next >
Encoding:
Pascal/Delphi Source File  |  1999-10-23  |  2.3 KB  |  117 lines

  1. unit dpoBase;
  2.  
  3. interface
  4.  
  5. uses
  6.   Forms, DBTables, Classes, Db;
  7.  
  8. type
  9.   TDataObject = class;
  10.   TDataObjectClass = class of TDataObject;
  11.  
  12.   TDataObject = class(TDataModule)
  13.     qryMain: TQuery;
  14.   private
  15.   protected
  16.     OIDFieldNames: TStringList;
  17.     function GetModified: Boolean;
  18.     function GetOID: string;
  19.     procedure InternalSetOID(aOID: string); virtual;
  20.   public
  21.     constructor Create(aDB: TDatabase); reintroduce; virtual;
  22.     destructor Destroy; override;
  23.     procedure Delete; virtual;
  24.     procedure GetByOID(aOID: string);
  25.     function PropertyByName(aName: string): TField;
  26.     procedure EditMode; virtual;
  27.     procedure Save; virtual;
  28.     property Modified: Boolean read GetModified;
  29.     property OID: string read GetOID;
  30.   end;
  31.  
  32. implementation
  33.  
  34. {$R *.DFM}
  35.  
  36. uses
  37.   SysUtils;
  38.  
  39. { TDataObject }
  40.  
  41. constructor TDataObject.Create(aDB: TDatabase);
  42. begin
  43.   inherited Create(nil); { do not set owner }
  44.   qryMain.DatabaseName := aDB.DatabaseName;
  45.   OIDFieldNames := TStringList.Create;
  46. end;
  47.  
  48. procedure TDataObject.Delete;
  49. begin
  50.  
  51. end;
  52.  
  53. destructor TDataObject.Destroy;
  54. begin
  55.   OIDFieldNames.Free;
  56.   inherited;
  57. end;
  58.  
  59. procedure TDataObject.EditMode;
  60. begin
  61.   if not (qryMain.State in dsEditModes) then
  62.     qryMain.Edit;
  63. end;
  64.  
  65. procedure TDataObject.GetByOID(aOID: string);
  66. begin
  67.   with qryMain do
  68.   begin
  69.     if Active then Close;
  70.     InternalSetOID(aOID);
  71.     Open;
  72.     FetchAll;
  73.   end;
  74. end;
  75.  
  76. function TDataObject.GetModified: Boolean;
  77. begin
  78.   Result := qryMain.Modified; 
  79. end;
  80.  
  81. function TDataObject.GetOID: string;
  82. var
  83.   I: Integer;
  84. begin
  85.   Result := '';
  86.   for I := 0 to OIDFieldNames.Count - 1 do
  87.     Result := Result + VarAsType(qryMain.FieldByName(OIDFieldNames[I]).Value, varString);
  88. end;
  89.  
  90. procedure TDataObject.InternalSetOID(aOID: string);
  91. var
  92.   I: Integer;
  93. begin
  94.   with TStringList.Create do
  95.     try
  96.       CommaText := aOID;
  97.       for I := 0 to OIDFieldNames.Count - 1 do
  98.         qryMain.ParamByName(OIDFieldNames[I]).Value := Strings[I];
  99.     finally
  100.       Free;
  101.     end;
  102. end;
  103.  
  104. function TDataObject.PropertyByName(aName: string): TField;
  105. begin
  106.   Result := qryMain.FindField(aName);
  107.   if not Assigned(Result) then
  108.     raise Exception.CreateFmt('Invalid property name: %s.%s', [ClassName, aName]);
  109. end;
  110.  
  111. procedure TDataObject.Save;
  112. begin
  113.   qryMain.Post;
  114. end;
  115.  
  116. end.
  117.