外掛程式開發技術說明 13 含明細列表查詢的處理

2021-07-05 05:50:59 字數 1848 閱讀 3320

查詢乙個列表,每個列表項有對應的一組明細記錄(這裡稱為含明細列表).這是開發過程中常見的應用場景.如查詢訂單列表,同時返回每個訂單的明細。

umx協議支援crowset的列是乙個crowset(dtrowset型別),但umx.js未實現.

如果在服務端完成分拆,則返回多個crowset.umx限制的最大行集數是65535.

一般方法是,1個crowset表示列表內容,後面按出現在列表crowset的順序依次跟隨每個記錄的明細crowset.

一種實現方法是先查詢列表,然後對查詢結果的每條記錄對應的明細逐一查詢。

假設一次查詢頁的大小為20條.則需要查詢資料庫21次。

迴圈是影響效能的常見原因.

可以對此進行優化,明細查詢一次完成.總共只進行2次查詢.

**示例:

string strsql = ///< 查詢訂單列表sql.

int ret = pagizequerytomsg(strsql,strorderby,pin,pans); ///< 執行列表查詢,獲得訂單列表

crowset* prs = pans->getrowset(0);/// prs是查詢訂單列表的crowset

prs->first();

vectorvs;

while(!prs->iseof())

string in_str;

mergestring(vs,in_str);///< 合併成in表示式

strsql = logmsg("select sheetid,goodsid,qty from t_orderitem where sheetid in (%s) order by sheetid",in_str.c_str());

if (querytomsgex(strsql,"sheetid",1,vs,pans))

return -1;

實現的主要函式querytomsgex定義和實現在cqqbase.h的cqqbaseplugin.

///< 函式:querytomsgex

///< 根據key_fld把查詢結果順序儲存到pmsg的行集中

///< 引數:

///< strsql: 查詢sql

///< key_fld:key欄位名稱

///< remove_key_fld:是否從行集中刪除key欄位

///< vs:物件key列表

///< pmsg:輸出crowset的訊息物件

///< 返回值: 0:成功 -1:失敗

int querytomsgex(const string& strsql,const string &key_fld,bool remove_key_fld,vector&vs,cmsg *pmsg,const string &strdbc="");

注意使用限制:

.必須有乙個單一列的key.示例為sheetid

.明細查詢必須包含key欄位,並且必須按key排序. 如果協議定義不要求返回key,可以設定querytomsgex的remove_key_fld引數為true.

實現是針對5210協議優化的.見cmpm::onquerypurchaselist方法.

實現querytomsgex,在query_func.h中增加了2個公共匯出函式:

int recordsetfieldtorowset(crecordset *prs,crowset *rs) ///< 資料庫查詢記錄集的字段轉換到crowset列資訊

int recordtorowset(crecordset *prs,crowset *rs) ///< 把查詢記錄轉換為crowset記錄

外掛程式開發技術說明 15 檔案自動分目錄儲存

用途 當檔案數量很大,在單一目錄下時無法容納,需要把檔案自動分散到不同的目錄下.特性 指定乙個 home目錄,可限定每個目錄下最多檔案數量 分級目錄儲存,如 home 1,home 2.在 home 1下再分目錄儲存,以保證可容納足夠數量的檔案.按每個目錄最大檔案數2000個計算,3級可儲存的檔案數...

VS外掛程式開發(1 選單)

最近工作需要,學習一些外掛程式的開發。ide平台不是.net開發的。用起來比較累。在visualstudio裡建立 visualstudio外接程式。選單主要的工作方法 onconnection querystatus exec connectmode 列舉,執行模式 ext cm aftersta...

c 外掛程式式開發1

mef 原文 首先,新建乙個類庫,裡面定義介面,這裡定義兩個方法,乙個有返回值的,乙個無返回值的。using system using system.collections.generic using system.text namespace imsg 將上面的類庫生成imsg.dll,新建乙個類...