SAP Fiori Launchpad 用了不短時間的人,多半都經歷過這樣的場景:某個 Tile 在別人的畫面裡好好躺著,換到自己的用戶就是不出來;或者在設定後台做配置,明明把應用掛上去了,Launchpad 上卻怎麼刷新都沒反應。這類問題十有八九都要回到同一個原點——先把這個 Tile 到底是誰、ID 是什麼搞清楚。我一直覺得,在 SAP Fiori Launchpad 中快速定位 Tile ID 不只是排查前端顯示缺失的第一步,更是理解目錄、角色、套餐(Semantic Object/Action)之間關係的一把鑰匙。
如果你正被「Tile 不顯示」「權限配了卻沒生效」「不知道去哪裡改某個瓦片的屬性」這些問題困擾,這篇文章就是寫給你的。我會從前端日誌、Fiori 目錄設計器、後端角色維護三個方向,把定位 Tile ID 的完整路徑拆開講透。包括我在實戰中踩過的坑、常用的調試技巧,以及能直接照抄的排查流程。內容面向 SAP 顧問、BASIS 人員和 Fiori 開發者,即使你只負責運維,照著步驟也能上手。
1. 先理清概念:Tile ID、目錄、角色之間的鏈條
很多人一上來就翻配置,結果越找越亂,因為沒把 Fiori Launchpad 背後的層級關係捋順。這裡我先用一個生活化的比喻建立整體框架,再逐個解釋關鍵術語。
1.1 一句話理解 Tile ID 是什麼
Tile 就是你在 Launchpad 首頁看到的每一個瓷磚塊,它綁定了一個前端應用(或者一個 URL、一個 Analytical Report)。而 Tile ID,說白了就是這個瓷磚在系統裡的身份證號。它同時存在於兩個地方:一是在 Fiori 目錄(Catalog)的定義表裡,二是前端實際顯示時 OData 服務返回的 JSON/XML 結構裡。
後端表的核心是 AGR_TCDT(角色與 Tile 關聯)和 AGR_1251 這類權限對象表,但真正定義 Tile 本身資訊的,主要由目錄視圖 UI2/PB_CUST、UI2/PB_TILE 體系維護。這裡不用先背表名,你只要記住一個結論:Tile ID 是全球唯一的小寫字串,一般由命名空間加下劃線組成,比如 Z_MY_APP_TILE 或標準的 F3022_CREATE_SO。 它在 URL 參數、OData 響應體、後端目錄表中都以 id 欄位出現。
1.2 看懂 Fiori 的層級鏈:Target → Tile → 目錄 → 角色
Fiori Launchpad 的顯示邏輯是這樣一層層嵌套的:
- 角色(Role):通過 PFCG 維護,分配給用戶之後,決定用戶能看到哪些目錄。
- 目錄(Catalog):一組 Tile 和 Target Mapping 的集合,類似一個文件夾,表現在後端是一組配置實體。
- Tile:用戶看到的瓷磚,包含標題、子標題、圖標、綁定的 Target 信息。
- Target Mapping(ASR):把 Tile 上的點擊動作映射到實際的前端應用。
所以,當你點某個 Tile 沒反應,問題可能出在 Target Mapping;當你根本看不到這個 Tile,問題多數出在角色或目錄分配;當你看到 Tile 但內容空白,問題可能在前端 OData 調用。定位 Tile ID 之所以重要,是因為它是你在這條鏈上反查所有節點的唯一抓手。 只要拿到 ID,就能去目錄設計器裡查它是怎麼定義的,去角色裡查它有沒有被分配出去,去後端調試裡查它調用了哪個 OData 服務。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 從前端日誌快速鎖定 Tile ID
如果你手邊只有瀏覽器和 Fiori Launchpad 的訪問權限,最快拿到 Tile ID 的方法就是開瀏覽器開發者工具。這條路徑適用於一切場景,哪怕是沒有後台配置權限的普通用戶,也可能通過日誌看到自己這個 Tile 對應的 ID。
2.1 F12 開發者工具:看 Network 面板裡的哪個請求
打開 Launchpad 首頁,按下 F12,切到 Network(網絡)選項卡,刷新頁面。你會看到一大堆請求,但真正包含 Tile 資訊的,是標記為 UI2 命名空間的 OData 調用,尤其是路徑包含 /sap/bc/ui2/flp 的請求。
以我的經驗,最值得關注的請求是:
code复制GET /sap/bc/ui2/flp?sap-language=EN&... → 返回當前用戶所有可見的 Tile 清單
這個請求的響應體是一個 JSON 結構,裡面有 apps 數組,每個元素就是一個 Tile 的完整定義。結構大概長這樣(簡化示意):
json复制{
"apps": [
{
"id": "Z_CUSTOM_TILE",
"title": "我的自定義應用",
"subTitle": "測試用",
"icon": "sap-icon://home",
"intent": "#Z-myApp-show",
"target": "ZmyApp",
"action": "show",
"catalogs": ["ZCUSTOM_CATALOG_1"]
}
]
}
字段 id 就是 Tile ID。要是這個請求返回的數據裡沒有你要找的那個 Tile,說明當前用戶的角色裡就沒分配對應目錄,不再需要接著往下查了。
2.2 從 OData 響應結構中提取 ID:三種常見形態
在實戰中,Tile ID 不一定都坐在 apps[].id 欄位上。標準 Fiori 組件比較規整,但自定義或舊版配置會有多種變體,你得學會認。
第一種是最常規的,就是直接讀 id 字段。第二種,如果這個 Tile 綁定的是舊式 URL(比如 SAP GUI 事務或 Web Dynpro),響應體裡可能只有 url 而沒有 id,那你就得從 intent 參數反推,#Transaction-show 這種格式裡 Transaction 就是 Semantic Object,show 是 Action,兩者配合後端目錄配置才定位到具體 Tile ID。第三種是 multipleCatalogs 裡列出多個目錄 ID,此時同一個 Tile 可能在不同目錄都有定義,你需要記下全部目錄編號,後面排查角色分配時很有用。
如果你的 Tile 在首頁但是點擊後行為不對,也可以在 Network 面板查找 launchpad 或 preview 關鍵詞,這些請求會攜帶實際調用的 Target 資訊。通過這些資訊,你能判斷 Target Mapping 是否配置成功。
2.3 用 Console 日誌和 UI 技巧輔助定位
Network 面板是最直接的,但有時響應體太大,幾千個 Tile 返回來找半天也不是事兒。這裡分享幾個我常用的加速技巧。
技巧一,切到 Console,直接執行一段 JavaScript 把響應體打印成表格,比如:
javascript复制// 在 Network 面板找到 flp 請求後,在 Console 中獲得響應體
// 視情況先點中該請求,再執行:
fetch('/sap/bc/ui2/flp', { headers: { 'Content-Type': 'application/json' } })
.then(r => r.json())
.then(data => console.table(data.apps.map(a => ({ id: a.id, title: a.title, intent: a.intent }))))
這段代碼可以在不複製整個響應的前提下,把所有 Tile ID 和標題濃縮成表格。實測下來,Launchpad 上幾百個 Tile 也只在幾百毫秒內就能處理完。
技巧二,用瀏覽器的網絡過濾功能,只顯示 Fetch/XHR 類型的請求,再在篩選框輸入 flp 或 catalog,能快速縮小範圍。因為 Launchpad 首屏加載時還有很多圖片、CSS 請求,不去過濾會看得眼花。
技巧三,如果你要找的是特定應用,先記住該 Tile 的標題文字,然後在 Console 裡用 document.body.innerText.includes('標題') 確認它確實渲染出來了,再回去看網絡請求裡哪個響應對應這個標題。這一步看似笨,但在 Tile 數量多的系統裡反而最不容易出錯。
3. 從目錄側排查:用 Fiori Launchpad Designer 和後端視圖確認 Tile ID
前端日誌能拿到 ID,但要確認這個 ID 在目錄裡是怎麼定義的、歸屬哪個目錄,還得回到目錄側。最常見的入口是 Fiori Launchpad Designer,其次是後端的表格視圖。
3.1 Fiori Launchpad Designer 的目錄入口與檢索技巧
Fiori Launchpad Designer 是 SAP Fiori Frontend Server(或嵌在 NetWeaver Gateway 中)提供的配置工具,訪問地址一般是:
code复制https://<host>:<port>/sap/bc/ui2/flp
登入之後,在右上角的人頭圖標附近找到 Configure Launchpad(或後台直接訪問 /sap/bc/ui2/flp#Shell-LaunchpadDesigner)。進入後你會看到三個主選項區:目錄(Catalogs)、群組(Groups)、Target Mapping(目標映射)。
要在這裡定位 Tile ID,我建議不要直接翻目錄列表,而是先利用瀏覽器搜索功能:按住 Ctrl+F,輸入前面拿到的 Tile ID 或標題片段。Designer 是典型的 SAPUI5 界面,瀏覽器級別的查找在部分版本不能命中延遲加載的數據,更穩妥的辦法是進入對應目錄後,在右側的 Tile 列表裡點 Tiles 標籤,然後用左側的過濾器輸入 ID 前綴。
進入某個目錄的詳細頁後,點擊具體 Tile,能看到它的 General Information 區塊,這裡的 ID 字段就是最終確認的 Tile ID。這個頁面同時顯示了該 Tile 綁定的 Semantic Object、Action、Target 信息,以及你後續改標題、圖標所需的入口。
3.2 後端目錄視圖與表格查詢:沒有 Designer 權限時的替代方案
有些客戶出於權限控制,普通顧問或開發者沒有訪問 Launchpad Designer 的權限,而只給了後端 SE16N 或 SE80 的權限。這種情況下,直接查後端表也能拿到幾乎等價的信息。
我最常用的後端視圖和表有:
UI2/PB_CUST——自定義目錄的配置視圖,能查到目錄 ID、目錄類型。UI2/PB_TILE——Tile 定義視圖,包含 Tile ID、標題、綁定的 Target 信息。AGR_TCDT——角色與 Tile 的關聯表(更準確地說是角色與事務/服務的關聯,Fiori 場景下也能通過它追蹤)。
舉個例子,在 SE16N 中查 UI2/PB_TILE,輸入你知道的目錄 ID(比如 ZCUSTOM_CATALOG_1),就能看到這個目錄下所有 Tile 的定義。每個 Tile 的 ID 清晰可見,同時你還能順帶檢查 TILE_KEY 等字段的一致性。要注意的是,標準目錄的 Tile 往往由 SAP 預置,存在 UI2/PB_C_V 這一類視圖中;如果你改動了標準目錄中的 Tile,Trace 起來會更加複雜。
如果你需要在後端確認某個角色分配了哪些目錄,推薦用事務碼 SUIM 或直接查 AGR_1251(角色與目錄的關聯)和 AGR_TCDT(角色與 Tile 的關聯)。這兩個表配合起來,就能知道特定角色實際包含了哪些目錄以及目錄下哪些 Tile。
3.3 標準目錄與自定義目錄的差異及對排查的影響
實戰中,很大一部分排查痛點來自標準目錄(SAP 預置目錄)與自定義目錄(Z 開頭或客戶自建)之間的混用。標準目錄中的 Tile ID 看起來很有規律,比如 F0023_ORDERS 這種,但同一 Tile 可能在不同目錄中都存在副本,只是綁定了不同的 Target Mapping。這種情況最容易造成「兩個環境看到的 Tile 行為不一致」的錯覺。
我的建議是,在開始排查之前,先用後端視圖確認你要找的 Tile ID 是否只有一個目錄擁有。如果它同時出現在標準目錄和自定義目錄中,後端調試時就會看到冗餘的 OData 調用,前端顯示也可能出現重複。定位 Tile ID 之後,務必檢查它到底屬於哪個目錄,再繼續沿著角色鏈往下查。
4. 角色排查:往後端查「為什麼沒分配」
拿到了 Tile ID,找到了目錄,接著的關鍵一步就是確認角色鏈。如果 Tile 沒有出現在某個用戶的 Launchpad 上,幾乎可以肯定和角色分配有關。
4.1 用 PFCG 檢查角色與目錄的分配
事務碼 PFCG 是 Fiori 權限配置中繞不開的工具。打開後輸入角色名,進入 Menu 標籤頁,這裡會顯示該角色包含的目錄與 Tile 的樹狀結構。直接展開樹節點,你能看到 Catalog 下的各目錄,以及其中每個 Tile ID。
實際操作中我會這樣做:
- 打開 PFCG,輸入了角色名。
- 切到
Menu頁籤,展開「Catalogs」節點。 - 根據前面鎖定的目錄 ID,逐層展開,確認該角色是否包含這個目錄。
- 如果角色裡有目錄但目錄裡找不到 Tile,說明目錄本身被調整過,需要回到上一步的目錄配置中去查。
- 如果角色裡根本沒有目標目錄,就說明角色分配缺失,要麼補目錄,要麼換用另一個已包含目標目錄的角色。
這裡有個常見誤區:不少人在 PFCG 的 Menu 樹裡看到的是「事務碼」或「服務」,而非直觀的 Tile ID。這是正常的,因為 Fiori Tile 在角色維護中表現為 Catalog + Tile Key 的組合,有時顯示為 SAP UI2 Tile 條目。你需要展開該節點才能看到真正的 Tile ID,或者雙擊屬性查看綁定的目錄信息。
4.2 角色同步與緩存:比目錄配置更常見的坑
在真實項目裡,出現「明明角色裡有目錄,用戶還是看不到 Tile」的情況,十有八九是緩存或同步問題。光在 PFCG 裡改了角色不發布,等於沒改。 角色修改後,必須點擊頂部的「生成」(Generate)或「保存並發布」按鈕,讓權限數據寫入實際的授權緩衝區。
另外,Fiori Launchpad 有前端緩存,即使後端角色已經發布,用戶端瀏覽器仍可能載入舊的 Tile 資訊。這時候的經典解決辦法是強制刷新:按住 Ctrl+F5,或者在 Launchpad URL 後面加參數 ?sap-ui-xx-fakeOS=... 強制加載。如果系統組態了 UI2/CL_AGR 這類後端類的緩存,可能還需要執行 SICF 服務的緩存清理,或者重啟前端伺服器,具體要看版本和架構。
我在項目上還遇到過一次比較隱蔽的情況:用戶的 Launchpad 角色來自於多個角色疊加,其中兩個角色都包含了同一個目錄,但目錄的版本不同。結果前端顯示的 Tile ID 來自於較舊的目錄定義,後端角色裡看到的卻是新定義。排查這種問題要沿著「用戶 → 角色 → 目錄 → Tile」全鏈路對比,任何一環不一致都會導致最終顯示錯誤。
5. 定位 Tile ID 之後的延伸排查:常見問題與速查
ID 定位只是起點,後續的問題大多圍繞「權限」「顯示異常」「重複項」展開。我把實際項目中頻率最高的幾個問題整理成了速查表,方便你現場對照。
| 現象 | 可能原因 | 快速驗證方式 | 解決方向 |
|---|---|---|---|
| Launchpad 上完全看不到 Tile | 角色未包含目標目錄 | PFCG 展開目錄樹查找 | 補充目錄到角色並生成 |
| Tile 出現但點擊報錯 | Target Mapping 映射錯誤 | 檢查 Designer 中 Tile 綁定的 Target | 修正 Target 或調整 Semantic Object/Action |
| Tile 出現但內容空白 | OData 服務報錯或權限不足 | Network 中查看 OData 請求狀態碼 | 檢查後端服務與數據源權限 |
| 多個目錄中存在同名 Tile | 標準目錄與自定義目錄冗餘 | 後端視圖查重複 Tile ID | 刪除冗餘目錄中的副本或停用 |
| 角色生成後用戶仍看不到 | 緩存未刷新或角色未發布 | 強制刷新瀏覽器後再試 | 清理前端緩存,重新發布角色 |
| 角色有目錄但目錄內無目標 Tile | 目錄配置版本過舊 | 對比目錄的建立/修改時間 | 更新目錄配置,或重新匯入標準目錄 |
5.1 典型場景一:Tile 沒顯示,卻在 OData 響應裡找到了 ID
這種情況我遇到過很多次。用戶說「我有這個應用權限,但 Launchpad 上看不到」,我一查 /sap/bc/ui2/flp 的響應體,發現 Tile ID 確實存在返回結果裡,只是被前端過濾掉了。為什麼?因為該 Tile 綁定的 Target 對應的應用沒有被激活,或者該應用依賴的 Component 在 Fiori Frontend Server 上未註冊。
這種場景很容易被忽略,因為大家習慣把「響應有數據」等同於「顯示正常」。其實前端有一套自己的過濾邏輯:如果它在一段時間內沒有收到某個 Tile 的元數據,就會把該 Tile 隱藏。所以,看到 ID 不代表問題解決,必須確認應用本身在 Fiori Launchpad 的應用清單裡是 active 狀態。這種就得到後端 SICF 或 /sap/bc/ui2/start_up 中進一步確認。
5.2 典型場景二:角色裡有目錄,但 Tile 依然無權限
還有一類場景是 Tile 能見,但點進去提示「無權限」。問題不在 Launchpad 本身,而在後端 OData 服務的權限對象。Tile ID 定位完成後,你甚至能反推出這個 Tile 調用了哪個 OData 服務,再去對照該服務的權限對象是否被分配給用戶的角色。
比如你通過前端日誌看到 Tile ID 是 Z_SALES_ORDERS,該 Tile 綁定的 Target 映射到 /sap/opu/odata/sap/ZSRV_SALES,那麼你要查的就是 ZSRV_SALES 這個服務的權限。這種情況下,光在 Launchpad 層面調試沒用,必須配合後端調試,用 /n/IWFND/ERROR_LOG 查 Gateway 錯誤日誌。很多權限類問題的根因,隱藏在後端服務而非前端配置,但你能夠快速定位 Tile ID,等於是把排查範圍縮小了一半。
6. 我個人的一套高效排查流程與避坑建議
最後分享一段我自己的日常操作流程。它不一定適合所有項目,但對於網路上能查到的常見 Fiori 問題,十有八九都能快速收斂。
我的順序是:先開瀏覽器 DevTools 抓 /sap/bc/ui2/flp 的響應,拿到疑似 Tile ID;再去後端 SE16N 查 UI2/PB_TILE,確認這個 ID 在系統中屬於什麼目錄、綁定了什麼 Target;然後到 PFCG 裡對照角色是否包含該目錄;最後確定問題落在哪一層。這個鏈條下來,正常情況不會超過十五分鐘。
避坑建議有三條:
第一,不要把 Tile ID 和應用 ID 混為一談。實戰中很多人把 Fiori 應用的 Component 名稱(比如 sap.suite.ui.generic.template.AnalyticalListPage)當成 Tile ID,結果在目錄裡怎麼搜都搜不到。記住,Tile ID 是目錄定義層的標識,而不是前端 Component 名。
第二,前端日誌的響應體拷貝出來後要格式化,不然根本沒法讀。/sap/bc/ui2/flp 返回的 JSON 有時是壓縮後的單行字符串,直接肉眼找 ID 是災難。建議先複製到任何支持 JSON 格式化的工具裡,或者用 Console 的 console.log(JSON.stringify(data, null, 2)) 展開看,省時省力。
第三,排查前先確認你操作的是前端伺服器還是後端系統。Fiori 標準架構下,Fiori Frontend Server 存目錄和角色配置,後端系統存業務數據和 OData 服務。如果你連的是後端系統,從 SAP GUI 去查目錄表,很可能查出來的是空表,因為配置在前端伺服器上。這種架構性混淆,是我見過最浪費時間的排查失誤。
如果你能把上面這些思路串起來,遇到 Launchpad 的 Tile 顯示問題時,就有了清晰的打法。我也建議你在項目上做一個小筆記,記錄每次排查中用到的 Tile ID、目錄 ID、角色名和最終結論。用不了多久,你會發現手裡這張「ID 對照表」比任何調試文件都管用,因為它代表著你對這套系統權限鏈路的理解已經不再是表面一層。後續做 Fiori 的內容遷移、標準應用擴展、或者把某個舊需求改成新 Tile,都只需要按圖索驥就能搞定。
