打印本文 打印本文 关闭窗口 关闭窗口
ADO多表更新BCB實現
作者:武汉SEO闵涛  文章来源:敏韬网  点击数2233  更新时间:2009/4/23 10:47:14  文章录入:mintao  责任编辑:mintao


強烈感謝PPower.
ADO多表更新的代碼,welcome指正xuchaofei@jit.com.tw,
//-------------------------------------------------------------------------------------------------------------------------------------------
在.h文件中 定義一個這樣的結構:
struct FieldValue
{
  AnsiString FNName;
  Variant FNValue;
} ;
struct FieldInfor
{
  std::vector<FieldValue> MyValue;
};
//-----------
在private部分中定義下面函數:
  std::vector<FieldInfor>MyFieldInfor;
  std::vector<FieldValue>TableField;
  void __fastcall GetTheUpdateTable(std::vector<AnsiString>&TableName);
  void __fastcall BeforePostEv(TDataSet *DataSet);
//-----------------------
在cpp文件中:
在訂義了多表的SQL語句的DataSet的BeforePost事件中加入如下代碼:
BeforePostEv(DataSet);
//-----------------------
void __fastcall TMutableOp::BeforePostEv(TDataSet *DataSet)
{
      if(DataSet->Modified)
    {
       FieldInfor TempVector;
      for(int i=0; i<DataSet->FieldCount; ++i)
      {
        FieldValue AllField;
        AllField.FNName  = DataSet->Fields->Fields[i]->FieldName;
        AllField.FNValue = DataSet->Fields->Fields[i]->Value;
        TempVector.MyValue.push_back(AllField);//把有數據更改的那個字段的數據的全部內容全部都保存起來。
      }
       MyFieldInfor.push_back(TempVector);
    }
}
//---------------------------------
//假設已取得了改變了的字段,那麼對它進行比較,看是那個表的數據,分表更新。
void __fastcall TMutableOp::GetTheUpdateTable(std::vector<AnsiString>&TableName)
{
  std::auto_ptr<TADOQuery>Query(new TADOQuery(NULL));
  Query->Connection = ADOConnection1;
//-------------------------------------------------------------
   for(std::size_t i=0;i< MyFieldInfor.size();++i)                            // 1 for
   {
      for(std::size_t t=0;t<TableName.size(); ++t)//按表名來分類處理 
      {
         AnsiString KeyFieldID;
         AnsiString KeyFieldValue;
         TableField.clear();
         for(std::size_t j=0; j< MyFieldInfor[i].MyValue.size(); ++j )    //3 for
         {
            //這裡是一個視圖被更改的一條記錄
            //對記錄按表分類:
              AnsiString StrTemp = MyFieldInfor[i].MyValue[j].FNName;
              if(StrTemp.Delete(TableName[t].Length()+1,StrTemp.Length()) ==TableName[t])//
              { //如果是這個表的字段,如果是Key字段,則把它記下,如果不是,則讓它組成SQL語句
                AnsiString Temp;
                Temp =  MyFieldInfor[i].MyValue[j].FNName;
                Temp.Delete(1,TableName[t].Length());
                Temp.Delete(5,Temp.Length());//除表名後的前面四個字符,看看是不是"_Key"
                if(Temp == "_Key")
                {//是關建字段 ;把數據存到一個項量裡
                  //把字段的附加信息除去

                  AnsiString TempA = MyFieldInfor[i].MyValue[j].FNName;;

                   TempA.Delete(1,TableName[t].Length());//把表名去除
                   TempA.Delete(1,5);                    //把_Key去除,得到真實字段名
                   FieldValue FieldStruct;

                   KeyFieldID = TempA;
                   KeyFieldValue = MyFieldInfor[i].MyValue[j].FNValue;
                   FieldStruct.FNName =TempA;
                   FieldStruct.FNValue = MyFieldInfor[i].MyValue[j].FNValue;
                   TableField.push_back(FieldStruct);
                }
                else
                {
                   FieldValue FieldStruct;
                   AnsiString TempA = MyFieldInfor[i].MyValue[j].FNName;;

                   TempA.Delete(1,TableName[t].Length());//把表名去除
                   TempA.Delete(1,2);                    //把__去除


                   FieldStruct.FNName = TempA;
                   FieldStruct.FNValue = MyFieldInfor[i].MyValue[j].FNValue;
                   TableField.push_back(FieldStruct);
                }

            }
            else
            {
              //如果表名不一樣,什麼也不做
            }
         }// 3 for
         //對第一個表的數據,到此找完,因些在這裡做更新SQL語句的合成
            if(TableField.size()==0)
            return;
            AnsiString SQL;
            SQL =" Select ";
            for(std::size_t v=0 ;v <TableField.size()-1 ;++v)
            {
              SQL+= TableField[v].FNName +  " , ";
            }
            SQL += TableField[TableField.size()-1].FNName+" ";// 到些應組成了類如這樣的字串"Select  FA,FB,FC "
            //加上表名  +條件
            SQL += " From "+ TableName[t]+ " Where "+ KeyFieldID +"  =  " + KeyFieldValue;
            Query->SQL->Text = SQL;
            Query->Open();//取出了這個表中符合這個ID條件的記錄。然後進行比較,後付值
            while(!Query->Eof) //這 個SQL語句選 出來的結果只能有一條記。
            {
              for(int F=0; F< Query->FieldCount; ++F)
              {
       

[1] [2]  下一页

打印本文 打印本文 关闭窗口 关闭窗口