static public bool AddChangeLog(
      string targetTableName, int targetTableREF, byte[] targetTableTimestamp,
      string function, string reference, string comments)
    {
#if false
      DaChangeLog da = new DaChangeLog(DataStore.DbConnection);
      da.Clear();
      da.Comments = comments;
      da.FsaRevisionLogREF = NullId;
      da.FsaStaffREF = DataStore.UserInfo.Id;
      da.Function = TruncateText(function, DdChangeLog.Function_L);
      da.MachineName = Environment.MachineName;
      da.Reference = reference;
      da.TargetTableName = TruncateText(targetTableName, DdChangeLog.TargetTableName_L);
      da.TargetTableREF = targetTableREF;
      da.TargetTableTimestamp = targetTableTimestamp;
      da.UserDomainName = Environment.UserDomainName;
      da.UserName = Environment.UserName;
      bool ok = da.Insert();
      return ok;
#else
      return true;
#endif
    }
    static public bool AddChangeLog(ref DdChangeLogExt item)
    {
#if false
      DaChangeLog da = new DaChangeLog(DataStore.DbConnection);
      da.Clear();
      da.Comments = item.Comments;
      da.FsaRevisionLogREF = item.FsaRevisionLogREF;
      da.FsaStaffREF = item.FsaStaffREF;
      da.Function = item.Function;
      da.MachineName = item.MachineName;
      da.Reference = item.Reference;
      da.TargetTableName = item.TargetTableName;
      da.TargetTableREF = item.TargetTableREF;
      da.TargetTableTimestamp = item.TargetTableTimestamp;
      da.UserDomainName = item.UserDomainName;
      da.UserName = item.UserName;
      bool ok = da.Insert();
      if (ok) item = new DdChangeLogExt(da.GetBuffer());
      return ok;
#else
      return true;
#endif
    }
 static public void UpdateChangeLog(BindingSource binding, int parentREF)
 {
   DaChangeLog daChangeLog = new DaChangeLog(DataStore.DbConnection);
   BindingList<DdChangeLogExt> list = (BindingList<DdChangeLogExt>)binding.DataSource;
   try
   {
     using (TransactionScope scope = new TransactionScope())
     {
     foreach (DdChangeLogExt item in list)
     {// do deletes first
       bool existing = daChangeLog.GetById(item.Id);
       if (existing && item.DeleteFlag)
       {// delete here - avoid validation
         daChangeLog.DeleteById(item.Id);
       }
     }
     
     foreach (DdChangeLogExt item in list)
     {
       if (item.DeleteFlag) continue; // already done above
       //if (item.Id == string.Empty) continue; // already done above
       bool existing = daChangeLog.GetById(item.Id);
       if (!existing)
       {
         daChangeLog.Clear();
       }
       daChangeLog.Comments = item.Comments;
       daChangeLog.FsaRevisionLogREF = item.FsaRevisionLogREF;
       daChangeLog.FsaStaffREF = item.FsaStaffREF;
       daChangeLog.Function = item.Function;
       daChangeLog.MachineName = item.MachineName;
       daChangeLog.Reference = item.Reference;
       daChangeLog.TargetTableName = item.TargetTableName;
       daChangeLog.TargetTableREF = item.TargetTableREF;
       daChangeLog.TargetTableTimestamp = item.TargetTableTimestamp;
       daChangeLog.UserDomainName = item.UserDomainName;
       daChangeLog.UserName = item.UserName;
       if (!existing)
       {
         daChangeLog.Insert();
       }
       else
       {
         if (!daChangeLog._IsModified) continue;
         daChangeLog.Save();
       }
     }
       scope.Complete();
     }
     binding.DataSource = GetChangeLogList();
   }
   catch (AppEx)
   {
     throw;
   }
   catch (Exception exc)
   {
     throw new AppEx(exc, "Error updating ChangeLog");
   }
 }