Oracle Apps R12——報表入門2:單表——報表開發流程

☆開發思路

? ? ? ? 開發表報代碼流程中有幾個重要的組件和重要的知識點需要搞懂,才能得心應手。報表通常是通過表格的形式來存在的,我們一般在開發代碼的時候在【輸出】中打印HTML,Css格式的表格,并把查詢到的數據插入其中,即可完成一個報表的生成,至于這個表格是如何生成和到處為csv等等,其實像這樣的很多細節,系統都是自動化的,我們只需要在EBS系統中簡單的設置一下即可,后面娓娓道來。

????????開發報表代碼主要有3個重要組件,開發中需要定義:

  1. ①臨時表:ptian_table :是一個臨時表(或中間表),用來存儲從主表查詢出來的符合條件的XX數據。
  2. ②游標: cur_items:定義了一個用于遍歷 ptian_table 中的數據。
  3. ③存儲過程:自己定義名字,接收ERP參數數據和編寫業務邏輯用的。主要用于接收來自EBS ERP界面輸入的參數(定義存儲過程的時候,可以自定義傳入的參數。),并且可以根據參數從主表查詢數據和一系列業務邏輯編寫,插入臨時表 ptian_table

數據流處理步驟

  1. 存儲過程接收參數。
  2. 根據參數從主表 ?查詢符合條件的數據。
  3. 將查詢結果插入臨時表 ptian_table
  4. 游標 cur_items 查詢臨時表數據。
  5. 逐條輸出HTML表格行。

步驟1 定義存儲過程(Procedure)

1.1 ptian_table模板?

-- 刪除舊表(如果存在)
BEGINEXECUTE IMMEDIATE 'DROP TABLE ptian_table PURGE';
EXCEPTIONWHEN OTHERS THENIF SQLCODE != -942 THEN -- 忽略表不存在錯誤RAISE;END IF;
END;
/-- 創建新表
CREATE TABLE ptian_table (description            VARCHAR2(4000),segment1               VARCHAR2(100),long_description       VARCHAR2(4000),primary_unit_of_measure VARCHAR2(100),creation_date          DATE
);

?1.2 核心代碼模板

-- 創建或替換存儲過程 QUERY_INVENTORY_ITEMS
-- 功能:查詢庫存物料信息,并將結果生成HTML格式輸出
-- 參數說明:
--   errbuf  : 輸出參數,用于返回錯誤信息
--   retcode : 輸出參數,返回狀態碼(0成功,1失敗)
--   p_segment1 : 輸入參數,物料編碼
--   p_item_type : 輸入參數,物料類型
CREATE OR REPLACE PROCEDURE QUERY_INV_ITEMS (errbuf               OUT VARCHAR2,retcode              OUT VARCHAR2,p_segment1           IN  VARCHAR2,p_item_type          IN  VARCHAR2
) IS-- 定義常量lv_api_name,用于記錄當前API名稱(用于日志標識)lv_api_name CONSTANT VARCHAR2(30) := 'QUERY_INV_ITEMS ';-- 定義變量lv_count,用于統計插入臨時表的記錄數lv_count NUMBER := 0;-- 定義游標cur_items,用于從臨時表ptian_table中讀取數據-- 查詢字段:物料說明、編碼、長描述、主單位、創建時間CURSOR cur_items ISSELECT description, segment1, long_description, primary_unit_of_measure, creation_date FROM ptian_table;BEGIN-- 記錄開始執行的日志(包含時間戳和API名稱)fnd_file.put_line(fnd_file.log, to_char(systimestamp, 'yyyy-mm-dd hh24:mi:ssxff6') || chr(9) || lv_api_name || ' 開始執行');-- 清空臨時表ptian_table,確保每次查詢都是最新數據DELETE FROM ptian_table;-- 記錄清空表操作的日志fnd_file.put_line(fnd_file.log, to_char(systimestamp, 'yyyy-mm-dd hh24:mi:ssxff6') || chr(9) || '清空ptian_table表數據');-- 將MTL_SYSTEM_ITEMS_FVL表中的數據插入臨時表ptian_table-- 篩選條件:物料編碼、物料類型,創建日期范圍(當前被注釋,可按需啟用)INSERT INTO ptian_table (description, segment1, long_description, primary_unit_of_measure, creation_date)SELECTDESCRIPTION,SEGMENT1,LONG_DESCRIPTION,PRIMARY_UNIT_OF_MEASURE,CREATION_DATEFROMMTL_SYSTEM_ITEMS_FVL MSIFWHERESEGMENT1 = p_segment1               -- 按物料編碼過濾AND MSIF.ITEM_TYPE = p_item_type;   -- 按物料類型過濾-- AND CREATION_DATE BETWEEN p_creation_date_from AND p_creation_date_to; -- 日期范圍條件(已注釋)-- 獲取插入的記錄數,并記錄到日志中lv_count := SQL%ROWCOUNT;fnd_file.put_line(fnd_file.log, to_char(systimestamp, 'yyyy-mm-dd hh24:mi:ssxff6') || chr(9) || '插入ptian_table記錄數: ' || lv_count);-- 生成HTML輸出(以下為HTML頭部結構)-- 輸出HTML文檔聲明與基礎結構fnd_file.put_line(fnd_file.output, '<html xmlns:v="urn:schemas-microsoft-com:vml" ' ||'xmlns:o="urn:schemas-microsoft-com:office:office" ' ||'xmlns:x="urn:schemas-microsoft-com:office:excel">');fnd_file.put_line(fnd_file.output, '<head>');-- 設置字符集為UTF-8,確保中文顯示正常fnd_file.put_line(fnd_file.output, '<meta http-equiv="Content-Language" content="zh-cn">');fnd_file.put_line(fnd_file.output, '<meta http-equiv="Content-Type" content="text/html;charset=utf-8">');fnd_file.put_line(fnd_file.output, '<title>物料信息查詢結果</title>');-- 定義CSS樣式,美化表格顯示fnd_file.put_line(fnd_file.output, '<style>');fnd_file.put_line(fnd_file.output, 'body {background-color:#FFFFFF; font-family:Verdana; font-size:10pt; color:#000000;}');fnd_file.put_line(fnd_file.output, 'table {border-collapse:collapse; width:100%;}');fnd_file.put_line(fnd_file.output, 'th, td {border:1px solid #000000; padding:5px; text-align:left;}');fnd_file.put_line(fnd_file.output, 'th {background-color:#BBBBBB;}');  -- 表頭灰色背景fnd_file.put_line(fnd_file.output, '</style>');fnd_file.put_line(fnd_file.output, '</head>');fnd_file.put_line(fnd_file.output, '<body>');-- 輸出標題“物料信息查詢結果”,居中顯示fnd_file.put_line(fnd_file.output, '<h3 align="center">物料信息查詢結果</h3>');-- 輸出表格結構fnd_file.put_line(fnd_file.output, '<table>');-- 輸出表頭行,包含5列:物料、說明、長描述、計量單位、創建時間fnd_file.put_line(fnd_file.output, '<tr>');fnd_file.put_line(fnd_file.output, '<th>物料</th>');fnd_file.put_line(fnd_file.output, '<th>說明</th>');fnd_file.put_line(fnd_file.output, '<th>長描述</th>');fnd_file.put_line(fnd_file.output, '<th>計量單位</th>');fnd_file.put_line(fnd_file.output, '<th>創建時間</th>');fnd_file.put_line(fnd_file.output, '</tr>');-- 遍歷游標cur_items中的每一條記錄,生成表格行FOR rec IN cur_items LOOPfnd_file.put_line(fnd_file.output, '<tr>');-- 輸出物料編碼(segment1)fnd_file.put_line(fnd_file.output, '<td>' || rec.segment1 || '</td>');-- 輸出物料說明(description)fnd_file.put_line(fnd_file.output, '<td>' || rec.description || '</td>');-- 輸出長描述(long_description)fnd_file.put_line(fnd_file.output, '<td>' || rec.long_description || '</td>');-- 輸出主單位(primary_unit_of_measure)fnd_file.put_line(fnd_file.output, '<td>' || rec.primary_unit_of_measure || '</td>');-- 輸出創建時間(格式化為yyyy-mm-dd hh24:mi:ss)fnd_file.put_line(fnd_file.output, '<td>' || TO_CHAR(rec.creation_date, 'yyyy-mm-dd hh24:mi:ss') || '</td>');fnd_file.put_line(fnd_file.output, '</tr>');END LOOP;-- 結束HTML表格和文檔fnd_file.put_line(fnd_file.output, '</table>');fnd_file.put_line(fnd_file.output, '</body></html>');-- 設置成功狀態errbuf := NULL;     -- 錯誤信息置空retcode := '0';     -- 返回碼設為0表示成功-- 記錄成功結束的日志fnd_file.put_line(fnd_file.log, to_char(systimestamp, 'yyyy-mm-dd hh24:mi:ssxff6') || chr(9) || lv_api_name || ' 執行成功結束');EXCEPTION-- 異常處理塊WHEN OTHERS THENerrbuf := SQLERRM;          -- 捕獲錯誤信息retcode := '1';             -- 返回碼設為1表示失敗-- 記錄異常日志,包含錯誤詳情fnd_file.put_line(fnd_file.log, to_char(systimestamp, 'yyyy-mm-dd hh24:mi:ssxff6') || chr(9) || lv_api_name || ' 異常:' || errbuf);-- 在HTML輸出中顯示錯誤信息fnd_file.put_line(fnd_file.output, '執行失敗,錯誤信息:' || errbuf);
END QUERY_INV_ITEMS;
/

? ? ? ? 上面提供一個了模板,包含以下幾個步驟,我們一一分析和解釋:
(1) 建立臨時表★★★★★

-- 刪除舊表(如果存在)
BEGINEXECUTE IMMEDIATE 'DROP TABLE ptian_table PURGE';
EXCEPTIONWHEN OTHERS THENIF SQLCODE != -942 THEN -- 忽略表不存在錯誤RAISE;END IF;
END;
/-- 創建新表
CREATE TABLE ptian_table (description            VARCHAR2(4000),segment1               VARCHAR2(100),long_description       VARCHAR2(4000),primary_unit_of_measure VARCHAR2(100),creation_date          DATE
);

(2)數據準備:★★★★★

  • 清空臨時表 ptian_table,確保每次查詢的數據都是最新的,避免歷史數據干擾。
  • 建立存儲過程代碼,用于接收參數和傳出參數,以及編寫業務邏輯(報表)給ERP系統
  • 記錄清空操作日志。
-- 創建或替換存儲過程 QUERY_INVENTORY_ITEMS
-- 功能:查詢庫存物料信息,并將結果生成HTML格式輸出
-- 參數說明:
--   errbuf  : 輸出參數,用于返回錯誤信息
--   retcode : 輸出參數,返回狀態碼(0成功,1失敗)
--   p_segment1 : 輸入參數,物料編碼
--   p_item_type : 輸入參數,物料類型
CREATE OR REPLACE PROCEDURE QUERY_INV_ITEMS (errbuf               OUT VARCHAR2,retcode              OUT VARCHAR2,p_segment1           IN  VARCHAR2,p_item_type          IN  VARCHAR2
) IS
-- 定義常量lv_api_name,用于日志標識
lv_api_name CONSTANT VARCHAR2(30) := 'QUERY_INV_ITEMS';
-- 定義變量lv_count,用于統計插入記錄數
lv_count NUMBER := 0;-- 記錄存儲過程開始執行的日志(包含時間戳和API名稱)
fnd_file.put_line(fnd_file.log, to_char(systimestamp, 'yyyy-mm-dd hh24:mi:ssxff6') || chr(9) || lv_api_name || ' 開始執行');-- 清空臨時表ptian_table,確保每次查詢都是最新數據
DELETE FROM ptian_table;-- 記錄清空表操作的日志
fnd_file.put_line(fnd_file.log, to_char(systimestamp, 'yyyy-mm-dd hh24:mi:ssxff6') || chr(9) || '清空ptian_table表數據');

(3)數據查詢與插入★★★★★

  • 從主表 MTL_SYSTEM_ITEMS_FVL 根據輸入參數(物料編碼、物料類型)篩選數據。
  • 將篩選結果插入臨時表 ptian_table
  • 統計插入的記錄數,并寫入日志。
-- 將MTL_SYSTEM_ITEMS_FVL表中的數據插入臨時表ptian_table
INSERT INTO ptian_table (description, segment1, long_description, primary_unit_of_measure, creation_date)
SELECT
-- 查詢到數據后想要展示的列名,這些都是要查詢的數據DESCRIPTION,    SEGMENT1,LONG_DESCRIPTION,PRIMARY_UNIT_OF_MEASURE,CREATION_DATE
FROMMTL_SYSTEM_ITEMS_FVL MSIF
WHERESEGMENT1 = p_segment1               -- 按物料編碼過濾AND MSIF.ITEM_TYPE = p_item_type;  -- 按物料類型過濾-- AND CREATION_DATE BETWEEN p_creation_date_from AND p_creation_date_to; -- 日期范圍條件(已注釋)-- 獲取插入的記錄數
lv_count := SQL%ROWCOUNT;-- 記錄插入記錄數日志
fnd_file.put_line(fnd_file.log, to_char(systimestamp, 'yyyy-mm-dd hh24:mi:ssxff6') || chr(9) || '插入ptian_table記錄數: ' || lv_count);

(4)生成HTML格式的查詢結果

  • 輸出HTML文檔的頭部信息,包括字符集、標題和樣式,確保頁面美觀且支持中文。
  • 輸出表格結構和表頭,定義展示字段(物料、說明、長描述、計量單位、創建時間)。
  • 遍歷臨時表數據,逐條生成表格行,填充對應字段內容。
  • 關閉表格和HTML文檔標簽。
-- 輸出HTML文檔聲明與基礎結構
fnd_file.put_line(fnd_file.output, '<html xmlns:v="urn:schemas-microsoft-com:vml" ' ||'xmlns:o="urn:schemas-microsoft-com:office:office" ' ||'xmlns:x="urn:schemas-microsoft-com:office:excel">');
fnd_file.put_line(fnd_file.output, '<head>');
-- 設置字符集為UTF-8,確保中文顯示正常
fnd_file.put_line(fnd_file.output, '<meta http-equiv="Content-Language" content="zh-cn">');
fnd_file.put_line(fnd_file.output, '<meta http-equiv="Content-Type" content="text/html;charset=utf-8">');
fnd_file.put_line(fnd_file.output, '<title>物料信息查詢結果</title>');
-- 定義CSS樣式,美化表格顯示
fnd_file.put_line(fnd_file.output, '<style>');
fnd_file.put_line(fnd_file.output, 'body {background-color:#FFFFFF; font-family:Verdana; font-size:10pt; color:#000000;}');
fnd_file.put_line(fnd_file.output, 'table {border-collapse:collapse; width:100%;}');
fnd_file.put_line(fnd_file.output, 'th, td {border:1px solid #000000; padding:5px; text-align:left;}');
fnd_file.put_line(fnd_file.output, 'th {background-color:#BBBBBB;}');  -- 表頭灰色背景
fnd_file.put_line(fnd_file.output, '</style>');
fnd_file.put_line(fnd_file.output, '</head>');
fnd_file.put_line(fnd_file.output, '<body>');
-- 輸出標題“物料信息查詢結果”,居中顯示
fnd_file.put_line(fnd_file.output, '<h3 align="center">物料信息查詢結果</h3>');-- 輸出表格結構和表頭
fnd_file.put_line(fnd_file.output, '<table>');
fnd_file.put_line(fnd_file.output, '<tr>');
fnd_file.put_line(fnd_file.output, '<th>物料</th>');
fnd_file.put_line(fnd_file.output, '<th>說明</th>');
fnd_file.put_line(fnd_file.output, '<th>長描述</th>');
fnd_file.put_line(fnd_file.output, '<th>計量單位</th>');
fnd_file.put_line(fnd_file.output, '<th>創建時間</th>');
fnd_file.put_line(fnd_file.output, '</tr>');
-- ,逐條生成表格行,填充對應字段內容。
FOR rec IN cur_items LOOPfnd_file.put_line(fnd_file.output, '<tr>');fnd_file.put_line(fnd_file.output, '<td>' || rec.segment1 || '</td>');                 -- 物料編碼fnd_file.put_line(fnd_file.output, '<td>' || rec.description || '</td>');              -- 物料說明fnd_file.put_line(fnd_file.output, '<td>' || rec.long_description || '</td>');         -- 長描述fnd_file.put_line(fnd_file.output, '<td>' || rec.primary_unit_of_measure || '</td>');  -- 計量單位fnd_file.put_line(fnd_file.output, '<td>' || TO_CHAR(rec.creation_date, 'yyyy-mm-dd hh24:mi:ss') || '</td>');  -- 創建時間fnd_file.put_line(fnd_file.output, '</tr>');
END LOOP;

(5)?結束處理與狀態返回

  • 設置輸出參數 errbuf 為空,retcode 為0,表示成功。
  • 記錄成功結束的日志。
-- 關閉HTML表格和文檔標簽
fnd_file.put_line(fnd_file.output, '</table>');
fnd_file.put_line(fnd_file.output, '</body></html>');-- 設置輸出參數,表示存儲過程執行成功,錯誤信息為空。寫日志記錄成功結束。
-- 設置成功狀態
errbuf := NULL;     -- 錯誤信息置空
retcode := '0';     -- 返回碼設為0表示成功-- 記錄成功結束的日志
fnd_file.put_line(fnd_file.log, to_char(systimestamp, 'yyyy-mm-dd hh24:mi:ssxff6') || chr(9) || lv_api_name || ' 執行成功結束');

(6)?異常處理

  • 捕獲所有異常,獲取錯誤信息。
  • 設置錯誤返回碼和錯誤信息輸出。
  • 記錄異常日志,方便定位問題。
  • 在HTML輸出中顯示錯誤提示,保證調用方能看到錯誤信息。
EXCEPTIONWHEN OTHERS THENerrbuf := SQLERRM;          -- 捕獲錯誤信息retcode := '1';             -- 返回碼設為1表示失敗-- 記錄異常日志,包含錯誤詳情fnd_file.put_line(fnd_file.log, to_char(systimestamp, 'yyyy-mm-dd hh24:mi:ssxff6') || chr(9) || lv_api_name || ' 異常:' || errbuf);-- 在HTML輸出中顯示錯誤信息fnd_file.put_line(fnd_file.output, '執行失敗,錯誤信息:' || errbuf);
END QUERY_INVENTORY_ITEMS;

1.3 查詢具體報錯信息的代碼

?????????當你在Oracle數據庫中創建或編譯存儲過程(Procedure)、函數(Function)、包(Package)等PL/SQL對象時,Oracle會對代碼進行語法和編譯檢查。

????????如果代碼中存在語法錯誤或編譯錯誤,Oracle不會直接報錯阻止創建,但會將錯誤信息記錄在user_errors視圖中。

????????這時,存儲過程雖然“創建”成功,但實際上是無效的,無法正常執行。

????????因此,必須查詢user_errors視圖,查看是否存在編譯錯誤,才能確認代碼是否正確。

SELECT line, position, text
FROM user_errors
WHERE name = 'QUERY_INV_ITEMS'
ORDER BY line, position;

步驟2 定義Executable(可執行文件/程序)

? ? ? ? 切換到職責:”應用開發”職責,【并發->可執行】,重點都用箭頭標明和解釋了:

?步驟3 定義Concurrent Program(并發程序)

3.1 填寫Program基本信息

? ? ? ? 還是“應用開發”這個職責,【并發->程序】

3.2 Program參數定義

? ? ? ? 還記得我們寫的Procedure存儲過程的代碼嗎,我們定義了一個存儲過程:

-- 創建或替換存儲過程 QUERY_INVENTORY_ITEMS
-- 功能:查詢庫存物料信息,并將結果生成HTML格式輸出
-- 參數說明:
--   errbuf  : 輸出參數,用于返回錯誤信息
--   retcode : 輸出參數,返回狀態碼(0成功,1失敗)
--   p_segment1 : 輸入參數,物料編碼
--   p_item_type : 輸入參數,物料類型
CREATE OR REPLACE PROCEDURE QUERY_INV_ITEMS (errbuf               OUT VARCHAR2,retcode              OUT VARCHAR2,p_segment1           IN  VARCHAR2,p_item_type          IN  VARCHAR2,
) IS
... 下面的無關ERP的傳參

? ? ? ? ?只有輸入參數需要設定,標紅的設置是必須要填入的字段,不然無法創建第二個參數,

??點擊序號前面的豎杠即可創建下一個參數例如創建第三個參數

步驟4:綁定Concurrent Program到Request Group?

?切換職責到“系統用戶”,【安全性->責任->請求】,選中【組】這個文本框,然后點擊左上角的手電筒:

? ? ? ? 找到想要把Program分配給的請求組,例如我想把剛剛定義的Program分配給INV reports請求組(一個專門管理庫存模塊報表的請求組)。?

? ? ? ? ?直接回車,就會自動跳轉到:

? ? ? ? 選中“請求”下面的表格任意一行后,再次點擊“手電筒”左邊的“新建”功能,是一個文件帶著一個+號:

? ? ? ? ?成功把新的程序加入到對應的請求組中,成為了一個新的請求,并且分配給了INV reports請求組,任意一個擁有該請求組權限的“責任”,都可以運行這個請求。

步驟5:切換到對應責任,運行Program

? ? ? ? 這里就是根據自己的需求來切換了,切換到擁有權限——你把程序綁定的請求組的權限的“責任”,

%制造%項目%

-- 個人需求所用,參考者忽略?

然后【請求->運行】,運行程序:?

? ? ? ? ? ? ? ? ?繼續選中名稱,然后“手電筒”,搜索我們的Program名稱,他現在由于綁定到了請求組中,已經成為了一個請求,但是名字不變。

? ? ? ? 彈出我們設定的2個輸入參數,我們輸入我們想要查詢的指定數據,比如我的數據源頭表可以從代碼看到的是,我們輸入的兩個值p_segment1和p_item_type被用作于篩選的條件。只有數據表中SEGENT1 = p_segment1 和 ITEM_TYPE=p_item_types才會查詢,返回指定的數據。而我們現在要做的就是填寫這兩個輸入參數。

  INSERT INTO ptian_table (description, segment1, long_description, primary_unit_of_measure, creation_date)SELECTDESCRIPTION,SEGMENT1,LONG_DESCRIPTION,PRIMARY_UNIT_OF_MEASURE,CREATION_DATEFROMMTL_SYSTEM_ITEMS_FVL MSIFWHERESEGMENT1 = p_segment1               -- 按物料編碼過濾AND MSIF.ITEM_TYPE = p_item_type;   -- 按物料類型過濾

隨后直接點擊提交即可。

步驟6? 查看運行的請求和生成的報表

運行完畢,EBS頂部的側邊欄找到【請求->查看】,選擇”請求(R)“,打開后界面如下:

? ? ? ? ?點擊“查找”,隨后跳轉:
? ? ? ? ?選中這條運行完成的請求,然后點擊查看輸出(P),緊接著點擊查看瀏覽器,另外一個是直接下載Excel,如果有需求也可以用這個,但是查看結果的話最好是瀏覽器,確認沒問題了就導出來Excel。

? ? ? ? 得到報表,完成!?

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/bicheng/82161.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/82161.shtml
英文地址,請注明出處:http://en.pswp.cn/bicheng/82161.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Servlet的繼承關系和生命周期

1.繼承關系&#xff1a; javax.servlet.Servlet接口->javax.servlet.GenericServlet抽象類 ->javax.servlet.http.HttpServlet抽象子類 2.相關方法&#xff1a; javax.servlet.Servlet&#xff1a; &#xff08;1&#xff09;void init(config) -初始化方法 &…

PEFT庫PromptTuningConfig 配置

PEFT庫 PromptTuningConfig 配置 "Prompt Tuning"的參數高效微調 PromptTuningConfig 核心參數解析 1. task_type="CAUSAL_LM" 作用:指定任務類型為因果語言模型(Causal LM)。說明:因果語言模型從左到右生成文本(如GPT系列),這與任務需求匹配(模…

【438. 找到字符串中所有字母異位詞】

Leetcode算法練習 筆記記錄 438. 找到字符串中所有字母異位詞 438. 找到字符串中所有字母異位詞 思路就是我們要找和p相同的詞&#xff0c;可以先排個序&#xff0c;每次取一個和p的size長度相同的窗口去滑動&#xff0c;符合就記錄&#xff0c;不符合繼續滑動。 public List&l…

React Hooks底層執行邏輯詳解、自定義Hooks、FiberScheduler

React Hooks底層執行邏輯詳解 React Hooks 在表面上看像普通的函數調用&#xff0c;背后卻隱藏著一套復雜而高效的運行時機制。要理解 React Hooks 的底層執行邏輯&#xff0c;需要從 React 如何管理組件的狀態與副作用入手。 &#x1f9e0; 一、React 為什么引入 Hooks&#…

Windows命令實用工具——tcping 命令工具安裝及基礎使用

Windows命令實用工具——tcping 命令工具安裝及使用 一、tcping 命令簡介二、tcping 的安裝1、tcping 官網下載安裝包2、將軟件包復制到 Windws 系統的 System32 目錄下面3、查看 tcping 命令是否安裝成功 三、tcping 工具簡單使用方法 一、tcping 命令簡介 tcping 的主要功能…

智慧化工園區安全風險管控平臺建設方案(Word)

1 項目概況 1.1 園區概況 1.1.1 XX化工園區簡況 1.1.2 企業現狀 1.1.3 園區發展方向 1.1.4 園區信息化現狀 1.2 項目建設背景 1.2.1 政策背景 1.3 項目建設需求分析 1.3.1 政策需求分析 1.3.2 安全生產監管需求分析 1.3.3 應急協同管理需求分析 1.3.4 工業互聯網安…

【動手學深度學習】2.3. 線性代數

目錄 2.3. 線性代數1&#xff09;標量2&#xff09;向量3&#xff09;矩陣4&#xff09;張量5&#xff09;張量的基本性質6&#xff09;降維7&#xff09;點積8&#xff09;矩陣-向量積9&#xff09;矩陣-矩陣乘法10&#xff09;范數11&#xff09; 小結 2.3. 線性代數 本節將…

如何在項目當中使用redis進行范圍搜索

目錄 如何將地理位置數據保存到 Redis 中以支持范圍查詢 Redis 中的 GEO 類型是什么&#xff1f; 如何保存 GEO 數據到 Redis 分段解釋&#xff1a; RedisKey.POSTS_ANIMALS_LOCATIONS new Point(longitude, latitude) 如何進行范圍搜索 Redis GEO 范圍搜索核心語句 1…

物聯網低功耗保活協同優化方案:軟硬件與WiFi網關動態聯動

目錄 一、總體方案概述 二、架構組成 2.1 系統拓撲 2.2 硬件端(MCU + WiFi 模組) 2.3 WiFi 網關 2.4 云端服務器 三、低功耗保活技術設計模式 3.1 模式一:定時喚醒 + MQTT 保活 3.1.1 設備端 3.1.2 優勢 3.2 模式二:網關保活代理 + 本地網絡喚醒 3.2.1 網關功能…

UniApp+Vue3微信小程序二維碼生成、轉圖片、截圖保存整頁

二維碼生成工具使用uqrcode/js&#xff0c;版本4.0.7 官網地址&#xff1a;uQRCode 中文文檔&#xff08;不建議看可能會被誤導&#xff09; 本項目采用了npm引入方式&#xff0c;也可通過插件市場引入&#xff0c;使用上會略有不同 準備工作&#xff1a; 安裝&#xff1a;pnpm…

Zenmap代理情況下無法掃描ip

原因是開了代理會報錯 error “only ethernet devices can be used for raw scans on Windows” 在掃描參數后加 -sT -Pn&#xff0c;但會導致結果太多 例如&#xff1a;nmap -sT -T4 -A -v -Pn 10.44.2.0/24 如果你只是想找沒人用的IP&#xff0c;你不需要搞復雜的原始層掃描&…

將多個值關聯到同一個 key的map(key可以重復的map)示例

在 Java 中&#xff0c;標準的 Map 接口要求 key 必須唯一&#xff0c;如果需要 key 可重復 且保持 插入順序 的數據結構&#xff0c;可以使用以下方案&#xff1a; 1. 使用 List<Map.Entry<K, V>> 最直接的方式是用鏈表存儲鍵值對&#xff0c;允許重復 key&…

Arthas(阿爾薩斯)

一、Arthas 是什么&#xff1f; Arthas&#xff08;阿爾薩斯&#xff09;是阿里巴巴開源的一款 Java 在線診斷工具&#xff0c;基于 Java Agent 和字節碼增強技術實現。它無需重啟 JVM&#xff0c;即可動態追蹤代碼執行、實時查看 JVM 狀態、修改代碼邏輯&#xff0c;是生產環…

深入解讀Qwen3技術報告(三):深入剖析Qwen3模型架構

重磅推薦專欄&#xff1a; 《大模型AIGC》 《課程大綱》 《知識星球》 本專欄致力于探索和討論當今最前沿的技術趨勢和應用領域&#xff0c;包括但不限于ChatGPT和Stable Diffusion等。我們將深入研究大型模型的開發和應用&#xff0c;以及與之相關的人工智能生成內容&#xff…

UE4游戲查找本地角色數據的方法-SDK

UE4中&#xff0c;玩家的表示通常涉及以下幾個類&#xff1a; APlayerController: 代表玩家的控制邏輯&#xff0c;處理輸入等。 APawn: 代表玩家在世界中的實體&#xff08;比如一個角色、一輛車&#xff09;。APlayerController 控制一個 APawn。 ACharacter: APawn 的一個…

springboot+vue實現服裝商城系統(帶用戶協同過濾個性化推薦算法)

今天教大家如何設計一個服裝商城 , 基于目前主流的技術&#xff1a;前端vue3&#xff0c;后端springboot。 同時還帶來的項目的部署教程。 系統最大的亮點是使用了兩個推薦算法: 1. 基于Jaccard算法的用戶瀏覽歷史推薦。 2. 基于用戶的協同過濾算法個性化推薦。 還有核心的商…

ERROR: Could not install packages due to an OSError: [WinError 5] 拒絕訪問

有可能是設置了代理 unset ALLPROXY 或者注釋掉 當然也有可能是其他原因 權限不足?? 以管理員身份運行 CMD/PowerShell&#xff0c;或使用 --user 安裝 ??文件被占用?? 關閉殺毒軟件或重啟電腦 Python 環境損壞?? 重新安裝 Python 或使用虛擬環境 ?? 殺毒軟件阻止…

【深尚想!愛普特APT32F1023H8S6單片機重構智能電機控制新標桿】

在智能家電與健康器械市場爆發的今天&#xff0c;核心驅動技術正成為產品突圍的關鍵。傳統電機控制方案面臨集成度低、開發周期長、性能瓶頸三大痛點&#xff0c;而愛普特電子帶來的APT32F1023H8S6單片機無感三合一方案&#xff0c;正在掀起一場智能電機控制的技術革命。 爆款基…

一個.NET開源、輕量級的運行耗時統計庫

前言 在.NET開發中&#xff0c;為了準確統計對應方法的執行時間&#xff0c;我們最常用的方式是手動使用 Stopwatch 來顯式編寫計時邏輯&#xff0c;但是假如你需要大量的使用 Stopwatch 來進行耗時統計的話不利于保持代碼的整潔和增加代碼的維護成本。 項目介紹 MethodTime…

嵌入式鴻蒙openharmony應用開發環境搭建與工程創建實現

各位小伙伴大家好,本周開始分享鴻蒙開發相關的內容,從基礎的配置方法到各種功能的實現,探索國產操作系統的奧秘。 第一:觀察結果 第二:開源語言 ArkTS是鴻蒙應用開發中使用的TypeScript超集,提供了一套豐富的API來構建應用界面和邏輯。 第三:環境搭建 步驟 1 通過如…