2023年8月5日 星期六

SC 的 應用程式連結,資料庫主關鍵的欺騙技巧

今天在做SC應用程式時,發生一個狀況

做一個GRID Application,其中的一個契約單號欄位,希望他能夠建立一個連結關連到該契約單號的編輯表單應用程式(FORM APPLICATION)。該 FORM Application 的主關鍵欄位為 id 內碼,而我有另外建一個ext_id,是給用戶看的外部單號,那也是唯一的關鍵欄位。當使用 GRID Application 建立 連結時,SC 是自動抓取被連結的 PK,或是 有 SQL WHERE 裡面的 [v_parameter]Global Variable。因為,我那個契約單的PK是 id,不是 ext_id,但是我在 GRID 上顯示且要連結的是 ext_id,所以,建立起來時,SC會自動抓取 id,而不是 ext_id,因此就會連結不上!我必須要到契約單的 FORM 去把 PK改成 ext_id,然後,再重新在 GRID 跑一次 建立 連結,這樣SC就會抓 ext_id,而成功的建立了連結。

我原本想,這樣就完美了。

所以,契約單這邊的 FORM就繼續保留 ext_id為PK。

但是,後來,因為這個 ext_id,是我另外寫程式自動產生流水號的編碼,所以在 INSERT 時會是空白的,這樣的程式,在原本是 id 內碼為PK的情形下,都沒有問題,跑得很順利,沒有錯誤。但因為設 ext_id 為PK,結果就一直跑出 該單號 不能為 空白的錯誤,我一直嘗試把自動給值的程式加在 EVENT onValidate/ onBeforeInsert 等看能否在SC檢查PK不能為空白之前就餵給他值,這樣就可以解決!但,都失敗了!SC還是一直給我錯誤:該PK欄位不能為空白!試了很多不同的途徑,還是都無法繞過SC的檢查!最後,還是把PK 還給 id,這樣FORM本身所有的問題都沒問題了!

但是,前面,因為為了給 GRID Application 建立外部連結而關連到這支 FORM的連結,而還抓得到嗎?結果,一試!GRID 的連結,還是跑得很正常,因為他是抓 ext_id!

換句話說:以後,我可以用這個方式,來避開SC的建立連結的限制。

也就是,像今天這樣意外的經驗:

1. 原本 契約單的 FORM 的 PK是內碼 id,可以暫時 修改為 要被 GRID 建立外部連結的程式要去抓取的 ext_id (他也必須是唯一的ALT KEY),這樣讓 GRID 連結程式可以抓得到,然後自動產生。

2. 建好以後,再去 FORM 的 PK,還原為原本的 內碼 id,這樣原本設計好的 FORM 也沒有改變!只是還原而已,馬照跑舞照跳,一切跟過去一樣!

這樣就好像是暫時欺騙一下SC的GRID建立連結的程式,讓他得以建立起連結,然後再改回來!

SC GRID的建立連結要抓取PK的設計,那也是要保證程式的邏輯抓取到是唯一的正確性而這樣設計。SC只設計了 PK,還有在 SQL WHERE 裡面的 Global Variable,兩種,他還沒有設計還可以自動抓 其他也是唯一的ALT KEY的選項,那我們只好這樣先騙騙他,然後再去改回來就好了!

以上記錄一下。


沒有留言:

張貼留言

如何判斷現在FORM是在 insert mode? 還是 update mode?

只要用  if (empty({primary_key})) 就可以知道是否為新增模式了。 如果 {promary_key} 是空白的,那麼就是在新增模式;反之,就是更新模式。 以上。