PIXNET Logo登入

oracle園地

跳到主文

這裡是到處搜括來的ORACLE技術及文章,也有自己發表的文章,希望大家可以互相討論! PS-若有侵權,請告知哦.

部落格全站分類:職場甘苦

  • 相簿
  • 部落格
  • 留言
  • 名片
  • 7月 29 週三 200917:41
  • 提交處理事務處理介面請求

--- 提交處理事務處理介面請求
l_request_id := FND_REQUEST.SUBMIT_REQUEST(
APPLICATION => 'INV',
PROGRAM => 'INCTCM'
);
IF ( l_request_id = 0 ) THEN
RAISE E_SUBMIT_FAILED;
RETURN;
ELSE
COMMIT;
L_REQUEST_FLAG := FND_CONCURRENT.WAIT_FOR_REQUEST(
REQUEST_ID => L_REQUEST_ID,
INTERVAL => 5,
MAX_WAIT => 0,
PHASE => L_PHASE,
STATUS => L_STATUS,
DEV_PHASE => L_DEV_PHASE,
DEV_STATUS => L_DEV_STATUS,
MESSAGE => L_MESSAGE
);
END IF;
COMMIT;
EXCEPTION
WHEN E_SUBMIT_FAILED THEN
ERRCODE := '1';
ERRMSG := '提交處理事務處理介面請求失敗!'||SUBSTR(SQLERRM,1,100);
FND_FILE.PUT_LINE(FND_FILE.LOG,ERRMSG);
ROLLBACK;
RETURN;
END;
今天關注到這個問題,將找到的資料收集在這裏:
1、關於fnd_request.submit_request的用法
fnd_request.submit_request的用法:
FND_REQUEST.SUBMIT_REQUEST 函數是用來提交一個請求的,它返回一個NUMBER值.具體調用如下
:result := fnd_request.submit_request(application CHAR, --AP模快
program CHAR, --應用程式
description CHAR, --請求說明(可選)
start_time CHAR, --RUN 時間(可選)
sub_request BOOLEAN, --立刻提交請求
argument1 CHAR, --參數1
argument2 CHAR, --參數2
argument3 CHAR, --參數3
argument4 CHAR, --參數4
argument5 CHAR, --參數5.......
argument100 CHAR);
英文說明(zt oracle) :
Parameters are as follows:
application - Short name of the application associated with the concurrent
request to be submitted.
program - Short name of the concurrent program (not the executable) for which
the request should be submitted.
description - Description of the request that is displayed in the Concurrent
Requests form (Optional.)
start_time - Time at which the request should start running, formatted as HH24:
MI or HH24:MI:SS (Optional.)
sub_request - Set to TRUE if the request is submitted from another request and
should be treated as a sub-request.
argument1...100 - Arguments for the concurrent request; up to 100
arguments are permitted. If submitted from Oracle Forms, you must specify all
100 arguments.
補充說明:
在用fnd_request.submit_request的時候,第五個參數用false,不要被參數名稱誤導;
這個函數有105個參數,前面五個定義請求本身,後面100個是傳遞給請求的具體參數,都是Char類型,
我們需要轉換,預設值是chr(0),代表這個參數不用傳遞給調用的請求;
在Package裏面調用只需要傳遞需要的參數個數,因為它有預設值指示結束;
在form裏面則不行,要寫滿105個,而且我們參數結束之後要用一個chr(0)來表示結束
例
fnd_request.submit_request('AR',
'SVAINEX_P',
'',
'',
FALSE,
:parameter.invoice_store,
chr(0),
'','','',
'','','','','','','','','','','','','','','','','','','','',
'','','','','','','','','','','','','','','','','','','','',
'','','','','','','','','','','','','','','','','','','','',
'','','','','','','','','','','','','','','','','','','','',
'','','','','','','','','','','','','','','');
2、Oracle Erp等待報表運行機制
主要是用到了Fnd_concurrent.wait_for_ruqest這個function.
Fnd_concurrent.wait_for_request返回Boolean值,主要參數如下:
function FND_CONCURRENT.WAIT_FOR_REQUEST
(request_id IN number default NULL, --請求ID
interval IN number default 60, --檢查時間間隔
max_wait IN number default 0, --最大等待時間
phase OUT varchar2,
status OUT varchar2,
dev_phase OUT varchar2, --請求運行階段
dev_status OUT varchar2, --各個階段狀態
message OUT varchar2 --運行完成後輸出資訊)
return boolean;
dev_phase有Pending,Running,Complete,Inactive等幾種,每種對應不同的Dev-Status,比如Complete階段後就有Normal,Error,Warning,Cancelled,Terminated等幾種狀態。
例如: l_request_status := Fnd_Concurrent.Wait_For_Request(l_request_id,
5,
0,
l_phase,
l_status,
l_dev_phase,
l_dev_status,
l_message);
IF l_request_status THEN
IF l_dev_status = 'NORMAL' THEN
NULL;
ELSE
Fnd_Message.Debug('請求運行不成功:'||l_dev_status);
RETURN;
END IF;
ELSE
Fnd_Message.Debug('請求未完成,無法查看報表內容!');
RETURN;
END IF;
Editor_Pkg.Report(l_request_id,'Y');
總結:FND_REQUEST.SUBMIT_REQUEST是一種通過後臺方式提交請教的方法,可以在pkg和form中使用,在form中使用要將參數寫全。 FND_CONCURRENT.WAIT_FOR_REQUEST是一個等待當前請求運行完畢的程式,可以利用這個等待當前的請求程式運行完畢再運行下面的程式。

 

(繼續閱讀...)
文章標籤

oracleD2K 發表在 痞客邦 留言(15) 人氣(5,540)

  • 個人分類:Oracle Form
▲top
  • 3月 17 週二 200916:13
  • SET_BLOCK_PROPERTY - DEFAULT_WHERE應用

假設我們現在要查 員工編號在 1000~2000 之間,且姓王的員工

<
查詢畫面>
Block Name : B_QUERY_FIND
Item Name : emp_name "
員工姓名" , emp_no_beg "員工編號起" , emp_no_end "員工編號迄"

<
主畫面>
Block Name : B_MAIN
Item Name : emp_name "
員工姓名" , emp_no "員工編號"

因為兩個 Block 的員工姓名資料是可以 maping 的,
在 B_MAIN 的 block level trigger : PRE-QUERY 中加上
copy( :B_QUERY_FIND.EMP_NAME , 'B_MAIN.EMP_NAME' );

如此不管在 :B_QUERY_FIND.EMP_NAME 打完整名稱,或以 % 來查詢都可以

因為員工編號的查詢條件是以區間來查詢,所以在  FIND Button 中處理
declare
   ls_where         varchar2(1000);
   ls_this_where    varchar2(1000);
begin
   if     :b_query_find.emp_no_beg is null
      and :b_query_find.emp_no_end is null
   then
      :parameter.g_query_find := 'FALSE';
      Fnd_Message.Set_Name('FND','You Must Enter Employee Number !!');
      Fnd_Message.Error;
   else
      ls_where := GET_BLOCK_PROPERTY('B_MAIN',DEFAULT_WHERE);
      if  ls_where is null
      then
         ls_this_where := '1=1 ';
      else
         ls_this_where := ls_where;
      end if;
      if    :b_query_find.emp_no_beg is not null
      then
         ls_this_where := ls_this_where||' and emp_no >= :b_query_find.emp_no_beg';
      end if;
      if    :b_query_find.emp_no_end is not null
      then
         ls_this_where := ls_this_where||' and emp_no <= :b_query_find.emp_no_end';
      end if;
      SET_BLOCK_PROPERTY(''B_MAIN',DEFAULT_WHERE,LS_THIS_WHERE);
      app_find.find('B_MAIN');
      SET_BLOCK_PROPERTY('B_MAIN',DEFAULT_WHERE,LS_WHERE);
   end if;
end;
:parameter.g_query_find := 'FALSE';

以此例而言 :
:B_QUERY_FIND.EMP_NAME := '
王%'
:B_QUERY_FIND.EMP_NO_BEG := '1000'
:B_QUERY_FIND.EMP_NO_END := '2000'

(繼續閱讀...)
文章標籤

oracleD2K 發表在 痞客邦 留言(0) 人氣(3,715)

  • 個人分類:Oracle Form
▲top
  • 3月 02 週一 200916:17
  • FORM 簡易開發流程(轉)

製作登入、資料登錄畫面,按鈕觸發:      
      When-Button-Pressed  
        要實現下面幾個功能。        1。保存功能   :   輸入資料以後,按此按鈕保存到對應變數裏。  
        2。消除功能   :   消除所有輸入,恢復到原始狀態  
        3。輸出功能   :   將此表輸出到C:\aaa  
        4。翻頁功能   :   pageup   翻到上個畫面,pagedown下個畫面。  
        5。數據登入   :   順序排列,比如輸入   D,B,C,A   登陸時候按照A,B,C,D   排列  
        6。條件判斷   :   比如A項必須填寫,否則彈出錯誤對話方塊;如果填寫B項,但是資料庫裏面沒有B,也彈出對話方塊。  
        7。可能出現的錯誤、問題和bug。  


   第一步   當然是建表了  
  example   :   --   create   table    
  drop   table   t_tname;  
  create   table   t_tname(xh     number(2),                  --   序號  
           xm      varchar2(10),                            --   姓名  
           csrq     date,                                       --   出生日期  
           bz       varchar2(100),                           --   備註  
          constraint   pk_t_tname   primary   key(xh));  


  下面以表格   t_tname   為例  
   
  第二步   就是實現功能了  
  打開form   builder   前期準備工作  
  首先要有一個畫布、視窗(假如將其名字名為cc_main,w_main)兩者必須對應,然後就是添加資料塊(就是選擇你建立的表格)佈局畫面,按照提示一步一步完成了,最後將你需要實現什麼功能添加功能按鈕,放在另外一個非資料庫塊  
   
  然後就是代碼編寫了。  
  1.WHEN-NEW-FORM-INSTANCE(進入FROM時執行)   所要做的就是初始化視窗和一些自己需要的查詢  
      1.1   將初始化視窗寫成一個過程  
   
  PROCEDURE   Prc_Init_Windows   IS  
   
  BEGIN  
      Set_Window_Property(Forms_Mdi_Window,TITLE,'WINDOW_NAME');             --設置多文檔視窗標題  
      Set_Window_Property(Forms_Mdi_Window,WINDOW_STATE,maximize);           --設置多文檔視窗最大化  
      Set_Window_Property('W_Main',WINDOW_STATE,maximize);                        --設置主視窗最大化  
      :System.Message_Level:='15';                                                             --設置資訊提示級別  
  END;  
  然後直接調用過程在WHEN-NEW-FORM-INSTANCE觸發器裏  
  --   code    
  Prc_Init_Windows;  
  GO_BLOCK('t_tname');  
  SET_BLOCK_PROPERTY('t_tname',INSERT_ALLOWED,PROPERTY_false);  
  SET_BLOCK_PROPERTY('t_tname',UPDATE_ALLOWED,PROPERTY_false);  
  execute_query;     --   內置副程式執行查詢(查詢所有記錄)  
   
  2.添加   (所要做的就是保證序號不能為空,關鍵字)  
  兩種操作方法一種直接在介面上輸入,二種彈出另外一個視窗進行操作  
  就講第一種吧,定義一個form參數p_xh   (在物件導航器裏面定義)  
  declare  
      nXH NUMBER(2);  
  BEGIN  
   
      GO_BLOCK('t_tname');  
      SET_BLOCK_PROPERTY('t_tname',INSERT_ALLOWED,PROPERTY_TRUE);  
      SET_BLOCK_PROPERTY('t_tname',UPDATE_ALLOWED,PROPERTY_false);  
      last_record;  
      create_record;  
      select   max(xh)   into   nXH   from   t_tname;  
      :parameter.p_xh   :=   nXH;  
      :t_tname.xh   :=   :parameter.p_xh;  
   
  END;  
   
  在t_tname資料塊中添加WHEN-NEW-RECORD-INSTANCE觸發器  
      if   get_block_property('t_tname',insert_allowed)   =   'true'   then  
          if   :t_tname.xh   is   null   then  
              :parameter.p_xh   :=   :parameter.p_xh   +   1;  
              :t_tname.xh   :=   :parameter.p_xh;  
          end   if;  
      end   if;  
   
  3.修改  
      GO_BLOCK('t_tname');  
      IF   :t_tname.XH   IS   NOT   NULL   THEN  
          SET_BLOCK_PROPERTY('t_tname',INSERT_ALLOWED,PROPERTY_FALSE);  
          SET_BLOCK_PROPERTY('t_tname',UPDATE_ALLOWED,PROPERTY_TRUE);  
      END   IF;  
   
  4.刪除  
       
      GO_BLOCK('t_tname');  
      IF   :t_tname.XH   IS   NOT   NULL   THEN  
          SET_BLOCK_PROPERTY('t_tname',delete_ALLOWED,PROPERTY_true);  
          delete_record;  
          commit;  
          SET_BLOCK_PROPERTY('t_tname',delete_ALLOWED,PROPERTY_false);  
      END   IF;  
   
  5.保存  
      GO_BLOCK('t_tname');  
      COMMIT;  
      SET_BLOCK_PROPERTY('t_tname',delete_ALLOWED,PROPERTY_FALSE);  
      SET_BLOCK_PROPERTY('t_tname',INSERT_ALLOWED,PROPERTY_FALSE);  
      SET_BLOCK_PROPERTY('t_tname',UPDATE_ALLOWED,PROPERTY_FALSE);  
   
  6.撤銷  
  DECLARE  
      P_WHERE       VARCHAR2(200);  
  BEGIN  
      GO_BLOCK('t_tname');        
      CLEAR_BLOCK(NO_COMMIT);  
      P_WHERE   :=   GET_BLOCK_PROPERTY('t_tname',DEFAULT_WHERE);  
      SET_BLOCK_PROPERTY('t_tname',DEFAULT_WHERE,P_WHERE);  
      EXECUTE_QUERY;  
  END;  
   
  7.查詢  
   
  以姓名和出生日期為欄位進行查詢,從新添加一個視窗和畫布,一個查詢非資料塊(例如塊名為BLK_QUERY)  
   
  DECLPARE  
      P_WHERE       VARCAHR2(200)   :=   '1=1';  
  BEGIN  
      IF   :BLK_QUERY.XM   IS   NOT   NULL   THEN  
          P_WHERE   :=   P_WHERE||'   AND   XM   =   '||CHR(39)||:BLK_QUERY.XM||CHR(39);  
      END   IF;  
      IF   :BLK_QUERY.CSRY   IS   NOT   NULL   THEN  
          P_WHERE   :=   P_WHERE||'   AND   TO_CHAR(CSRY,''YYYYMMDD'')   =           '||CHR(39)||TO_CHAR(:BLK_QUERY.CSRY,'YYYYMMDD')||CHR(39);  
      END   IF;  
   
      GO_BLOCK('t_tname');  
      CLEAR_BLOCK(NO_VALIDATE);  
      SET_BLOCK_PROPERTY('t_tname',DEFAULT_WHERE,P_WHERE);  
      EXECUTE_QUERY;  
  END;  

(繼續閱讀...)
文章標籤

oracleD2K 發表在 痞客邦 留言(9) 人氣(9,494)

  • 個人分類:Oracle Form
▲top
  • 2月 17 週二 200916:15
  • 查詢FORM中F11,F12按鈕功能的小探討

查詢FORM中F11,F12按鈕功能的小探討

     在咱們ERP系統中,F11和F12按鈕是大家經常使用的,它們給查詢工作帶來了很多方便。但是在開發的查詢FORM中若不做任何設置,F11和F12按鈕的作用就沒有完全體現出來了。

如當你輸入了查詢條件點擊“FIND”按鈕後得到了你想要的一些記錄,然後針對這些記錄我們想繼續進行相關條件的查詢(F11按鈕功能)或者想查詢記錄的數目(F12按鈕功能)。但如果未做任何設置,F11和F12功能將在查詢結果塊所在資料源的範圍內查詢而不是你輸入查詢條件查到的結果內查詢,這顯然沒有實現我們想要的功能。

     一般情況下,我們開發的查詢FORM均是在資料塊QUERY_FIND按鈕項FIND的WHEN-BUTTON-PRESSED觸發器中寫入(例如查詢結果塊名為“RESULT”):

     :parameter.G_query_find := 'TRUE';

(繼續閱讀...)
文章標籤

oracleD2K 發表在 痞客邦 留言(0) 人氣(1,834)

  • 個人分類:Oracle Form
▲top
  • 12月 17 週三 200816:47
  • D2K FORM 讀存檔

讀檔

PROCEDURE echo_file_contents IS
in_file Text_IO.File_Type;
linebuf VARCHAR2(1800);
filename VARCHAR2(30);
BEGIN
filename:=GET_FILE_NAME(’c:\temp\’, File_Filter=>’Text Files (*.txt)|*.txt|’);
in_file := Text_IO.Fopen(filename, ‘r’);
LOOP
Text_IO.Get_Line(in_file, linebuf);
:text_item5:=:text_item5||linebuf||chr(10);
END LOOP;
EXCEPTION
WHEN no_data_found THEN
Text_IO.Put_Line(’Closing the file…’);
Text_IO.Fclose(in_file);
END;

存檔


DECLARE
out_file Text_IO.File_Type;
output_patch VARCHAR2(30);
BEGIN
output_patch:=’c:\temp\test.xls’;
out_file := Text_IO.Fopen (output_patch, ‘w’);
Text_IO.Put(’new line’);
Text_IO.New_Line(out_file, 1);
EXCEPTION
WHEN OTHERS THEN
Text_IO.Fclose(out_file);
END;

(繼續閱讀...)
文章標籤

oracleD2K 發表在 痞客邦 留言(7) 人氣(5,719)

  • 個人分類:Oracle Form
▲top
  • 9月 08 週一 200816:09
  • 在server run 修改D2K程式的步驟

 在server run 修改D2K程式的步驟 :

1.先將檔案上傳至ORACLE SERVER上
  例 : /oracle/testmgr1/cherpdv1appl/au/11.5.0/forms/US
   ps: 必須是fmb的檔案

2.在開始WINDOWS→執行→輸入CMD→畫面將打開DOS
  2.1 輸入Telnet 10.12.25.23
      ps: 10.12.25.23 為oracle主機檔案存放的ip位置,在此為例
  2.2 輸入登入的帳號及密碼
      ps: 登入oracle主機伺服器的帳密
  2.3 輸入檔案路徑
      cd $AU_TOP/forms/US
  2.4 輸入要compiler的檔名
      例 : tinvcom 檔名
      ps : tinvcom模組名稱

tinvcom script file內容,把tinvom製成script file上傳至server,副檔名為sql
#clear
echo 'now compiler Form $1.fmb....'
date
rm $INV_TOP/forms/US/$1.fmx
ls -l $1.fmb
$ORACLE_HOME/bin/f60gen module=$AU_TOP/forms/US/$1.fmb userid=APPS/APPS output_file=$INV_TOP/forms/US/$1.fmx module_type=form batch=YES compile_all=special
ls -l $1.err
ls -l $INV_TOP/forms/US/$1.fmx

  2.5 當compiler完成後,會出現三行
      fmb
      err
      fmx
      當系統產生fmx就表示compiler成功

(繼續閱讀...)
文章標籤

oracleD2K 發表在 痞客邦 留言(0) 人氣(1,539)

  • 個人分類:Oracle Form
▲top
  • 9月 08 週一 200813:46
  • LOV在欄位上的應用

1.透過PL-SQL直接叫系統已設的LOV用法 :
 DECLARE
a_value_chosen BOOLEAN;
BEGIN
go_block('sis_registration');
enter_query(no_validate);
a_value_chosen := Show_Lov('lovreg');
IF NOT a_value_chosen THEN
Message('You have not selected a value.');
RAISE Form_Trigger_Failure;
else
execute_query;
END IF;
END;

 

2.

取消LOV: 
 set_item_property('attendance_detail.employee_id',lov_name,'');  

不能使用: 
set_item_property('attendance_detail.employee_id',lov_name,null);  
  
分配LOV: 
set_item_property('attendance_detail.employee_id',lov_name,'employee_lov'); 

(繼續閱讀...)
文章標籤

oracleD2K 發表在 痞客邦 留言(0) 人氣(1,745)

  • 個人分類:Oracle Form
▲top
  • 9月 08 週一 200813:39
  • Oracle ERP系統工具欄上ZOOM按鈕的開發

 在 ERP 標準 custom.pll 文件中,填寫下麵類似代碼:
FUNCTION zoom_available RETURN BOOLEAN IS
form_name  varchar2 ( 30 ) := name_in( 'system.current_form' );
 block_name varchar2 ( 30 ) := name_in( 'system.cursor_block' );
BEGIN
 if (form_name = 'WIPDJMDF' ) then
return TRUE ;
 elsif (form_name = 'POXSCASL' and block_name = 'ASL_SUPPLIERS' ) then
return TRUE ;
else
return FALSE ;
end if ;
 END zoom_available; 上段代碼表示我們在 form_name 為:“ WIPDJMDF ”,“ POXSCASL ”的時候 ZOOM 按鈕可用 ;
 然後在自己定義的 pll 文件中響應 ZOOM 按鈕:
procedure event(event_name varchar2 ) is
Form_Name  Varchar2 ( 30 ) := Name_In( 'system.current_form' );
Block_Name  Varchar2 ( 30 ) := Name_In( 'system.current_block' );
Item_Name  Varchar2 ( 30 ) := Name_In( 'system.current_item' );
Form_Status  Varchar2 ( 30 ) := Name_In( 'system.form_status' );
 l_Record_Status Varchar2 ( 30 ) := Name_In( 'system.record_status' );
v_Stage Varchar2 ( 1000 );
v_item_id number ;
V_vendor_name varchar2 ( 300 );
 Begin /*when form. instance*/
DEFAULT_VALUE( null , 'GLOBAL.XXUTS_MFG_REVISION_MPN' );  /* 全局參數 */
 if (event_name = 'ZOOM' and form_name = 'POXSCASL' ) then
v_item_id:=Name_In( 'ASL_ITEMS.ITEM_ID' );
 FND_FUNCTION. EXECUTE ( /* 調用另一 Form*/
function_name=> 'XXUTS_MFG_ITEM_REVISION' ,
 other_params => 'INVENTORY_ITEM_ID =' ||v_item_id);
End if ;
 If (form_name = 'POXSCASL' )  and (event_name = 'WHEN-NEW-ITEM-INSTANCE' ) THEN
if NAME_IN( 'GLOBAL.XXUTS_MFG_REVISION_MPN' ) is not null then
copy(name_in( 'global.XXUTS_MFG_REVISION_MPN' ), 'ASL_SUPPLIERS.PRIMARY_VENDOR_ITEM' );
COPY( null , 'global.XXUTS_MFG_REVISION_MPN' );
end if ;
end if ;
end event;

(繼續閱讀...)
文章標籤

oracleD2K 發表在 痞客邦 留言(0) 人氣(1,206)

  • 個人分類:Oracle Form
▲top
  • 6月 26 週四 200811:41
  • 如何判斷 execute_query 查詢結果是否有記錄?

如何判斷 execute_query 查詢結果是否有記錄? 
IF :SYSTEM.BLOCK_STATUS = 'NEW' THEN
  message('沒有查詢到所要的記錄!!!'); 
END IF;

(繼續閱讀...)
文章標籤

oracleD2K 發表在 痞客邦 留言(2) 人氣(763)

  • 個人分類:Oracle Form
▲top
  • 6月 26 週四 200811:23
  • 在text檔裡,判斷多少筆數.

在text檔裡,判斷多少筆數.

                                11111
                                22222
                                33333
                                44444

begin  
       text_io.get_line(v_in_file,v_linebuf);   
       exit when v_linebuf is null;  
       exception  
       when no_data_found then  
        text_io.fclose(v_in_file);  
           
      exit;         
    end;  
     v_total_count := v_total_count+1;  
  end loop;  

(繼續閱讀...)
文章標籤

oracleD2K 發表在 痞客邦 留言(0) 人氣(628)

  • 個人分類:Oracle Form
▲top
12»

部落格文章搜尋

近期文章

    文章彙整

    文章分類

    toggle Oracle Tools (3)
    • Oracle Form (18)
    • Oracle Trigger (5)
    • Oracle 工具安裝 (2)
    toggle Oracle SQL (3)
    • Oracle SQL (15)
    • Oracle PL/SQL (15)
    • ORACLE DBA 指令 (3)
    toggle 教學影音檔 (1)
    • 教學影音檔 (12)
    toggle ORACLE ERP (8)
    • 財務模組 (1)
    • 製造模組 (2)
    • 庫存模組 (2)
    • 業務模組 (2)
    • 專業知識 (2)
    • 其它常用表結構 (1)
    • 採購模組 (2)
    • 工具下載 (1)
    • ORACLE INV (1)
    • 其它應用 (1)
    • 未分類文章 (1)

    誰來我家

    參觀人氣

    • 本日人氣:
    • 累積人氣:

    姓名學