Foxtable(狐表)用戶欄目專家坐堂 → 模擬關聯表的問題,一直沒有找到很好的解決辦法


  共有528人關注過本帖樹形打印復制鏈接

主題:模擬關聯表的問題,一直沒有找到很好的解決辦法

帥哥喲,離線,有人找我嗎?
reachtone
  1樓 | 信息 | 搜索 | 郵箱 | 主頁 | UC


加好友 發短信 一級勛章
等級:版主 帖子:1951 積分:18988 威望:0 精華:20 注冊:2008/9/2 10:09:00
模擬關聯表的問題,一直沒有找到很好的解決辦法  發帖心情 Post By:2022/3/24 17:07:00 [只看該作者]

訂單、產品、客戶3個datatable已經建立關聯,在訂單中獲取產品或客戶數據輕而易舉。
問題在于,這個訂單數據的獲取是要異步執行的,所以要改用sqlcommand,這樣一來,就要模擬臨時datatable與另外兩個表的關聯關系。
此問題糾結了很久,一直沒找到很好的處理辦法。
這是例子,請高手幫忙看下:
 下載信息  [文件大。   下載次數: ]
圖片點擊可在新窗口打開查看點擊瀏覽該文件:管理項目1.rar



 回到頂部
帥哥,在線噢!
有點藍
  2樓 | 信息 | 搜索 | 郵箱 | 主頁 | UC


加好友 發短信
等級:超級版主 帖子:85402 積分:433373 威望:0 精華:9 注冊:2015/6/24 9:21:00
  發帖心情 Post By:2022/3/24 17:14:00 [只看該作者]

方法1、動態關聯:http://www.sh-yongxian.com/webhelp/topics/1942.htm
2、通過SQLcommand,或者find,select等功能獲取其它表的數據
3、通過視圖/查詢表,合并獲取3個表的數據使用

 回到頂部
帥哥喲,離線,有人找我嗎?
reachtone
  3樓 | 信息 | 搜索 | 郵箱 | 主頁 | UC


加好友 發短信 一級勛章
等級:版主 帖子:1951 積分:18988 威望:0 精華:20 注冊:2008/9/2 10:09:00
  發帖心情 Post By:2022/3/24 17:23:00 [只看該作者]

因為是特定場景,方法3不適用。
方法1考慮過,但代碼量巨大,且未必可行。因為表達式也是動態的,可能用到多個關聯,這就要根據用到的關聯創建N個table才能模擬出關聯關系,太復雜。
方法2也考慮過,但在find的時候,仍然存在方法1中的問題,需要模擬出好多table才能find出來。

 回到頂部
帥哥喲,離線,有人找我嗎?
reachtone
  4樓 | 信息 | 搜索 | 郵箱 | 主頁 | UC


加好友 發短信 一級勛章
等級:版主 帖子:1951 積分:18988 威望:0 精華:20 注冊:2008/9/2 10:09:00
  發帖心情 Post By:2022/3/24 17:30:00 [只看該作者]

如果能給數據源connection也加上類似于Excel報表的AddRelation方法,也就是直接用后臺數據表指定關聯關系,所有問題都迎刃而解。
目前的關聯只能基于table,局限太大了。
[此貼子已經被作者于2022/3/24 17:35:52編輯過]

 回到頂部
帥哥喲,離線,有人找我嗎?
reachtone
  5樓 | 信息 | 搜索 | 郵箱 | 主頁 | UC


加好友 發短信 一級勛章
等級:版主 帖子:1951 積分:18988 威望:0 精華:20 注冊:2008/9/2 10:09:00
  發帖心情 Post By:2022/3/24 18:22:00 [只看該作者]

一樓例子用到的數據庫就是狐表自帶的“多表統計”access文件。簡單的說,現在就想在不修改自定義函數的前提下,讓“窗口1”中的table可以正常顯示“產品名稱”和“客戶名稱”數據,請高手支招!

現補充說明此實例用到的場景(確實是實際開發中碰到的問題,并非自己找麻煩):

1、這是我做的一個通用web項目的服務器端設置。由于是通用的,所以其中的很多參數都是動態的,而非設置死的。
在這個設置里,允許用戶指定網頁中顯示的表格及其列,包括表達式列(可以表內計算,也可以跨表取值,使用的就是foxtable表達式列語法規則)。

2、為方便用戶定義跨表取值的列表達式,系統會先將數據表所在數據源的全部表或視圖,以外部表方式添加進來,并允許用戶對它們建立關聯。
例如,用戶想在網頁上顯示“訂單”表數據,同時想在表格中加上3個表達式列:金額、產品名稱、客戶名稱,系統必須把“訂單”、“產品”、“客戶”3個表先添加到table中,否則用戶就沒辦法為它們創建關聯。因為,即使foxtable使用代碼創建關聯,也是要使用table才行的。
為說明問題方便,一樓例子中,已經添加了3個table表,并建立了2個關聯(分別是po和co)。

3、有了這些關聯設置之后,用戶才能在表達式中使用parent或child跨表取值。
如一樓實例,這里就給“訂單”表添加了3個表達式列,并用jobject表示如下(在實際項目中,表達式內容是由用戶手工輸入的):
Dim exps As new jobject
exps("金額") = "單價*數量*(1-折扣)"
exps("產品名稱") = "parent(po).產品名稱"
exps("客戶名稱") = "parent(co).客戶名稱"
那么,在瀏覽器中實際訪問時,就要異步執行一樓實例中的getdata函數,以獲取包含表達式列在內的全部數據。為說明問題方便,一樓實例將異步執行函數的代碼放到了按鈕中,并在函數中加上了return以方便觀察效果。

4、由于getdata函數是要異步執行的,所以在這個函數里就改用sqlcommand來獲取訂單數據。問題癥結就在這里:
(a)之前的關聯都是根據"訂單"表創建的,現在改用sqlcommand獲取訂單表數據之后,這個臨時表與其他2個表并無關聯關系,因而,通過exps傳來的表達式參數動態添加表達式列就無效了。
(b)如果要讓它有效,就必須加上可能很長的一段代碼對表達式進行解析:首先看表達式里用了幾個關聯,每個關聯的父表、子表及關聯列是什么,然后再根據這些信息分別生成table,最后再使用代碼給這些table分別模擬創建關聯。新創建的關聯名稱還不能與原有的重名,這意味著,在模擬關聯表的工作完成之后,還要修改表達式中對應的關聯名稱才行。相當繁瑣!
由此可見,一樓實例中的“訂單”、“產品”和“客戶”3個外部表實際上是供用戶編寫表達式使用的(要在列表達式中跨表取值就要先有關聯,而關聯的前提又必須有table),真正生成的數據則靠的是sqlcommand。要在這個sqlcommand中加入指定的表達式列,則必須參照表達式中用到的parent或child再新建多個關聯。

5、現有Relations的Add方法在創建關聯時,只能依據table,確實局限太大了。在單向生成或雙向生成關聯表模式下,必須依賴table可以理解,但在開發WEB服務端程序時呢?這個時候不需要ui、不需要顯示關聯表,它僅需跨表取值!如果還單純依賴table,就非常的不合時宜。因此,完全可以參考Excel報表的AddRelation方法,將Relations的Add方法擴展一下,加個參數以決定是否可以直接用后臺數據表指定關聯關系!大概看了下狐表中的常用方法,無論是表數據操作還是表數據統計,都能跳過datatable直接處理后臺,唯獨Relations不可以。強烈建議把這一塊也補上!真能如此的話,本實例中的3個datatable根本就無需添加,所有問題都會迎刃而解。
[此貼子已經被作者于2022/3/24 21:52:42編輯過]

 回到頂部
帥哥喲,離線,有人找我嗎?
pk399
  6樓 | 信息 | 搜索 | 郵箱 | 主頁 | UC


加好友 發短信
等級:嬰狐 帖子:7 積分:137 威望:0 精華:0 注冊:2020/1/22 17:51:00
  發帖心情 Post By:2022/3/25 8:11:00 [只看該作者]

雖然我不懂,但感覺說的太棒了

 回到頂部
帥哥喲,離線,有人找我嗎?
狐貍爸爸
  7樓 | 信息 | 搜索 | 郵箱 | 主頁 | UC


加好友 發短信
等級:管理員 帖子:47206 積分:249491 威望:0 精華:91 注冊:2008/6/17 17:14:00
  發帖心情 Post By:2022/3/25 8:34:00 [只看該作者]

參考這個例子:
 下載信息  [文件大。   下載次數: ]
圖片點擊可在新窗口打開查看點擊瀏覽該文件:管理項目1.table


關聯只能存在于已經加載的數據中,所謂excel報表可以針對后臺數據建立關聯,也是和這個例子一樣,加載幾個臨時表,然后建立關聯,打印完畢后,再刪除關聯和臨時表。
[此貼子已經被作者于2022/3/25 8:39:35編輯過]

 回到頂部
帥哥喲,離線,有人找我嗎?
reachtone
  8樓 | 信息 | 搜索 | 郵箱 | 主頁 | UC


加好友 發短信 一級勛章
等級:版主 帖子:1951 積分:18988 威望:0 精華:20 注冊:2008/9/2 10:09:00
  發帖心情 Post By:2022/3/25 9:02:00 [只看該作者]

謝謝@狐貍爸爸回復。
這種處理方式對于固定的關聯關系還好,代碼量不是太大,處理起來也不復雜。本實例的問題主要在于兩點:
(1)列表達式并不是固定的,或者說它只是一個模板類型的表達式,真正生成數據時需要對這個表達式進行解析并模擬重新建立關聯。如果表達式中用到了N個parent或child,就意味著要加載N個臨時表再建關聯。
(2)代碼寫多一點無所謂,可以自定義函數來處理。我最大的擔心是,服務器端在多人訪問且同時有多個復雜表達式列的情況下,意味著要加載很多個臨時表。假如參與關聯的臨時表數據量很大,服務器能否頂的?

 回到頂部
帥哥喲,離線,有人找我嗎?
狐貍爸爸
  9樓 | 信息 | 搜索 | 郵箱 | 主頁 | UC


加好友 發短信
等級:管理員 帖子:47206 積分:249491 威望:0 精華:91 注冊:2008/6/17 17:14:00
  發帖心情 Post By:2022/3/25 9:10:00 [只看該作者]

這個沒有辦法的,在數據管理和交互上,bs先天就不如cs的。

 回到頂部
帥哥喲,離線,有人找我嗎?
reachtone
  10樓 | 信息 | 搜索 | 郵箱 | 主頁 | UC


加好友 發短信 一級勛章
等級:版主 帖子:1951 積分:18988 威望:0 精華:20 注冊:2008/9/2 10:09:00
  發帖心情 Post By:2022/3/25 9:10:00 [只看該作者]

比如,在父表中使用sum對關聯子表進行統計,假如子表數據量太大,也要先加載進來,服務器肯定完蛋

 回到頂部
總數 15 1 2 下一頁
国产精品边做奶水狂喷无码