填報表之資料留痕

bubblegum發表於2019-12-18

隨著資訊時代的快速發展,報表工具的應用也越來越普遍,其中難免會涉及到很多填報需求。

比如:

資料採集錄入填報時如何只更新當前修改行、用報表工具實現樹狀層級結構的填報表、web 運算元據留痕等等,今天我們主要來介紹一下 web 運算元據留痕,簡單說就是填報表從 A 表取數,將 web 端修改記錄更新到 B 表儲存操作記錄……如果您還不明白,其實就相當於記錄您某個賬號的登入時間地點。

下面我們具體看一下。

工具:潤乾報表 oracle11g

資料庫表結構(SQL 語句)

A表:create table GDFW_RB_FHQK_MX(

ID NUMBER,

JCSJ DATE not null,

TJRQ DATE,

TJSJ VARCHAR2(12),

QKJFH NUMBER(12,2)

)

B表:create table GDFW_RB_FHQK_MX_HISTORY(

ID NUMBER,

JCSJ DATE not null,

TJRQ DATE,

TJSJ VARCHAR2(12),

QKJFH NUMBER(12,2),

CREATER NVARCHAR2(20) default ‘SYSTEM’,

CREATETIME DATE default SYSDATE,

XGYY NVARCHAR2(200) default ‘暫未填寫’

)

當前 報表設計如下,首先實現基本的行式填報操作:

1png

資料來源:

2png

資料去向:

3png

至此,填報表的基本功能已經實現, 下面我們繼續以這個報表為例看一下怎麼實現 web 運算元據留痕。

  1. 保證資料來源、資料去向、報表中涉及到的欄位個數名稱一致。

  2. 在資料去向執行 update 前對要插入到 B 表的資料做處理。方式如下:

透過對比新舊物件的記錄來實現,以獲取到 web 端操作的記錄,因為行式填報表在 web 頁面上支援做增、刪、改三種操作,故不能保證新舊物件的記錄條數一致,所以這裡需要透過雙層迴圈來獲取新舊物件的差集(即 web 頁面操作的記錄集)。

注:舊物件儲存的是修改前的資料,新物件儲存的是修改後的資料。

  1. 具體的資料處理過程:

資料來源指令碼增加 XGYY,並且以物件(如物件:GDFW_RB_F HQK_MX)的方式返回新增後的結果集。如下:

4png

資料去向指令碼修改如下:

5png

其中:

第 2 行、第 8 行以及第 10 行的 debug 部分,是為了觀察各部操作前後資料的變化,有助於排查問題,最終可以視實際情況刪除或註釋。

3-7 行 使用雙層 for 迴圈對比 GDFW_RB_FHQK_MX 與 GDFW_RB_FHQK_MX_old 物件記錄並從 GDFW_RB_FHQK_MX 中刪除兩者相同的記錄,從而整理出 web 端操作的行;

for 迴圈原理:

for 舊物件

if(新物件主鍵對比舊物件主鍵)

for 新物件

  if (舊物件記錄 == 新物件記錄)從新物件裡刪除

else 將 web 頁面刪除的記錄插入新物件

注:if…else…作用是對比主鍵保證 web 頁面上刪除的記錄也被記錄下來。

最後新物件中保留的記錄既是 web 端操作的行。

A9 單元格 使用 db.update@i() 函式實現更新入庫, 其中 @i 選項代表的是僅執行插入操作。

透過上面的修改後,我們就可以實現 web 運算元據留痕了。

效果如下:

web 操作前,B 表資料記錄。

6png

在 web 端訪問報表,修改原有資料,並增加行(動圖)

gif

web 操作後,在資料庫端查詢資料,檢查一下,我們會發現僅把 web 端操作的資料插入到資料庫中了,Bingo! 沒想到吧,就這麼輕鬆搞定了。

7png

最後,課外知識擴充套件

1. 怎樣在不改變資料庫表結構的基礎上,增加欄位。

使用集算器函式 P.derive(xi :Fi,…),給序表 / 排列 _P_ 增加 Fi,…欄位,形成 "P 中原有的欄位, Fi,…" 結構的序表,然後對 P 的每條記錄遍歷,給每個 Fi 賦值為 xi。簡單說就是使用此函式可以複製原序表也可以在原序表的基礎上追加欄位。

2. 資料更新時,如何控制僅執行插入操作。

靈活運用 _db_.update_(A:A’,tbl,Fi:xi,…;P,…)_ 函式的選項。

@i 對比主鍵只生成 INSERT。無 _A’_ 時不再對比,直接用 A 插入到資料庫。

@u 對比主鍵只生成 UPDATE。無 _A’_ 時不再對比,直接用 _A_ 更新到資料庫。

@k 完成後不提交事務,預設將提交。

等等,具體參考集算器函式參考 doc.raqsoft.com.cn/esproc/func/update.html

3. 填報更新原理:

目前,行式填報表在提交的時會自動對比修改前和修改後的資料:首先對比主鍵,根據主鍵是否有新增或缺失確定資料的增刪操作;然後再針對前後都有的記錄對比每條記錄值是否有不同,如有不同則執行 update 操作。

所以,建議資料處理(資料來源、資料去向)中的欄位名稱與報表中的欄位名稱個數要保持一致,不然填報更新時就會因新舊物件欄位不匹配導致更新失敗。

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/69900830/viewspace-2671118/,如需轉載,請註明出處,否則將追究法律責任。

相關文章