免費線上建立流程圖 Draw.io

網址:https://www.draw.io/

不用註冊,免費的一個線上建立流程圖,而且介面還是中文,下圖是試作的結果,
就像Visio一樣,只要用滑鼠拖拖拉拉就可以快速建立。



從「檔案」-->「Download as」,可以直接匯出許多的格式,非常方便後續的利用。


在「更多圖形」的選項中,可以開啟更多的元素類型。
例如:平面佈置的元素、伺服器元素、電子元素等…


輸入網址之後,只要三個的步驟就可以馬上使用。
首先選擇要儲存的位置


接著選擇新增(Create new diagram)或開啟舊檔(Open existing diagram)

如果上個步驟選擇新增,就會出現下列的步驟,要求輸入filename及選擇Templates,
Templates預設有許多不同的類型,也可以選擇Basic,就是空白頁。
按下「Create」之後,就可以開始使用了。


另外有兩個線上編輯流程圖的網站,不僅有免費版本可以註冊,還可以協同作業,有興趣也可以註冊來使用




執行Gather Schema Statistics錯誤:ORA-20005: object statistics are locked

新的Oracle 11g資料是由datapump移轉過來的,在執行Gather Schema Statistics時發生錯誤:
ORA-20005: object statistics are locked (stattype = ALL)



解決方案:
This problem can occur on any platform.
DataPump Import without data (CONTENT=METADATA_ONLY) locks statistics.
Executing the DBMS_STATS.GATHER_TABLE_STATS to collect the statistics on the table imported, it fails with:
The statistics are locked during a DataPump Import if export or import were performed with CONTENT = METADATA_ONLY.
This is because automatic statistics gathering is enabled by default in 10g. Therefore, the imported statistics, if not locked, are lost the next time the auto-stats job runs
To avoid the ORA-20005:
- Unlock the table statistics after the import:
   execute DBMS_STATS.UNLOCK_TABLE_STATS('<user name>','<table name>');
OR
- Do not import the table statistics (EXCLUDE=TABLE_STATISTICS impdp parameter)



執行下列的語法來解決問題

指定Table:
exec DBMS_STATS.UNLOCK_TABLE_STATS('OWNER', 'TABLE_NAME');

指定Schmea:
exec dbms_stats.unlock_schema_stats('SCHEMA_NAME');

檢查是否還有其他的Statistics Lock的Table:
SQL> select owner, table_name, stattype_locked from dba_tab_statistics where stattype_locked is not null;
no rows selected

重新執行Gather Schema Statistics就成功了。

有趣的沉默螺旋理論(Spiral of Silence)

由德國伊莉莎白於20世紀70年代提出的理論假設,概念基本描述了一個現象:
組織中如果存在主流意見,當人們發現自己的意見不同於強勢意見時,可能因為害怕,
便會選擇沈默,最後主流意見的聲音愈來愈大,而弱勢意見的聲音逐漸消失。
而主流意見可能不表示正確,也不一定代表多數,而是對「強勢」意見趨同之故。
當然有也有人指出:該理論過分強調「害怕孤立」這一社會心理因素,
而忽了其他導致社會行為的因素,也有可能在衡量「利害」之後,做出激烈的行為。

在努力看了幾篇文章之後,個人覺得這個理論真的說中了不少的現象,
小從班級討論,大至國家議題,都有可能看見沉默螺旋理論。
沒想到其實很多看起來不以為意的事件,背後都有一個可以統計的理論,
難怪為什麼巨量資料的收集及處理會越來越重視。

在幾次的工作流程改善專案中,發現如果有強勢或權位較高的人在場,
往往一、兩個小時的討論之後,會漸漸趨同強勢或權位較高的人的意見,
漸漸的強勢意見就會變成主流意見,而其他人對主流意見都開始說他沒意見。
可是有趣的是,開完會後閒聊之中,有時會發現多數的意見卻是相反的,
或是少數不同意見的人並沒有認同,只是做無言的抗議。
可能是因為不再想再爭論或認為爭論無用,被人貼標籤等因素而轉向沈默,
而持續提出相反意見的人發現支持的人變少了,也逐漸轉為沈默;
而強勢意見的人見到越來越多人開始「默許」,也就越來越堅持己見。

之前在一個國外的節目裡看到一個專門研究民俗傳聞的專家提到,
往往新聞或報紙都會擷取網路上或地方的某些傳言加以報導,
而這些傳言大多數都是虛假或憑空想象出來的,只是透過不斷地報導,
可能就會讓傳言變為主流意見而逐漸變成是真實的消息。

Office文件轉成PDF

有幾位朋友問我要如何把Word轉成PDF,是不是要另外安裝程式。
其實Office在版本2010之後,不必再安裝其他的增益集就可以直接轉成PDF,
換句話說,就是把PDF轉檔的功能直接內建在Office內,所以之前用PDF虛擬印表機就可以省了。
但是如果其他的程式也要轉成PDF,那就還是要用PDF虛擬印表機才行。

作法也很簡單,只要在「檔案」-->「另存新檔」,再選擇PDF格式儲存之後就可以了。


Solaris 10 設定網路印表機(Remote Printer)

因為Oracle ERP是用RPM來管理眾多的印表機,所以要在Solaris 10上面建立一個新的remote printer。

新增:lpadmin -p 名稱 -s IP/主機名稱 -D 註解
# lpadmin -p MIS_01_A4H -s 192.168.1.35 -D "MIS Printer"

用lpstat來查詢印表機,可以發現已經新增了MIS_01_A4H
# lpstat -s

scheduler is not running
no system default destination
system for MIS_01_A4H: 192.168.1.35 (as lpd://192.168.1.35/printers/MIS_01_A4H#Solaris)

此時可以丟一個測試檔案來測試印表機:lp -d 印表機  檔案
# lp -d MIS_01_A4H /export/home/test/aa.txt

如果想要刪除印表機的話,加上-x的參數:
# lpadmin -x MIS_01_A4H

紅米卡刷的步驟(無圖)

紅米手機提示有新版本的ROM,依照手機指示下載並重新開機後就成功升級了,過程中完全不必手工介入,非常容易且方便。
但是我同事就沒有這麼幸運了,自動更新好幾次都是失敗,還好紅米會自動Recovery回來,沒有變成磚塊。
最後同事是用卡刷的方式解決了無法更新的問題,先將它記錄下來,也許以後我也遇到需要卡刷的情形。


紅米卡刷的步驟:

一、先到官網下載ROM:http://tw.miui.com/download.php#hm,並將ROM檔上傳至紅米手機,
    檔案直接複製到根目錄就好,不要放到資料夾內。

二、進入Recover Mode
    (注1:手機側面有三個鍵,由上而下是「增加音量鍵」、「減少音量鍵」、「電源鍵」
    (注2:接下來所有的操作中,「增加音量鍵」表示確定;「減少音量鍵」表示移動選項)
   
手機關機後,同時按下「電源鍵」、「減少音量鍵」,出現選單畫面後,有三個選項
選擇Recovery Mode,再按下「減少音量鍵」;如果要正常開機,就選擇Nomat Boot

進入Recovery Mode後會出現一個Android的機器人圖示,按一下「電源鍵」即可進入Recovery操作介面。

    按「減少音量鍵」,選擇「wipe date/factory reset」,再按「增加音量鍵」確認,等待清除完成。
按「減少音量鍵」,選擇「wipe cache partition」,再按「增加音量鍵」確認,等待完成。
(建議執行這兩個步驟,刷機比較容易成功,但是資料及APP記得先行備份)

三、開始刷ROM
    回到選單畫面後,選擇「apply update from sdcard」,這是紅米內建的記憶體。
如果您是將ROM檔放在外接的SD CARD上,則選擇「apply update from sdcard2」

進入「apply update from sdcard」,找到ROM檔之後執行,要有耐心等待完成。

Oracle 11g Table名稱大小寫的影響

因為Oracle DB從9i升到11g,所以廠商幫我們做table statistics時,出現了錯誤,
錯誤的原因是找到三個表格,但是這三個表格在DB是存在的,原來是名稱大小寫的原故。

在建立表格的預設上都會變成大寫的名稱,但是可能有其他的工具或在表格名稱的前後加上雙引號,
例如:create table "test01"…,因為表格名稱帶有雙引號,所以DB會建立小寫的表格名稱。
偏偏11g認為大小寫名稱是屬於不同的表格,而table statistics只找大寫名稱,當然就會找不到,
所以在備份完資料之後,直接用drop的語法來將它刪除,但是語法一執行卻又出現錯誤了,
原來是我在表格名稱的前後沒有加上雙引號,以致DB找不到大寫的表格,加上雙引號之後再執行語法就可以了。

解決被「搜狗」綁架的首頁

昨天開啟Chrome瀏覽器時,首頁出現了「搜狗」的首頁,檢查Chrome的設定,沒有發現有任何的異常。
上網找到一個方法可以解決,就順便記錄下來。

在Chrome的捷徑圖示上,點選滑鼠右鍵,選取內容,檢查「目標路徑」的欄位是否被修改成:
"C:\Program Files\Google\Chrome\Application\chrome.exe www.laoguangtou.com/u.php?id=99"
後面是否有被加上「搜狗」的首頁網址。如果有,則把網址刪除就可以了,恢復成如下:
C:\Program Files\Google\Chrome\Application\chrome.exe
一切就恢復正常



為此我也依此方法順便去檢查IE,果然IE也被植入網址列,如果還有其他的瀏覽器,建議也要檢查一下。

Excel取代換行(Alt+Enter)的方法

在Excel的欄位中要使用換行的功能時,會按下Alt+Enter。
但是在某些情形之下,必須取消換行的情況時,像我就需要轉成csv
,再上傳到資料庫中,如果不取消換行,匯入就會失敗,
只有少數資料時,還可以一筆一筆修改,但這不是個好辦法。
其實可以按Ctrl+H開啟取代的視窗,再「尋找目標」處按下Ctrl+J,
雖然在畫面上看不見任何的變化,但是其實已經鍵入Alt+Enter的特殊碼了,
但是要注意如果之前在「尋找目標」處已有按下過Ctrl+J,則要用退回鍵(Backspace)
刪除它,不然如果我們再按一下Ctrl+J,會變成有兩個Alt+Enter的特殊碼,這樣是查詢不到的。


Forms 6i 無法在win7、win8中開啟 help

今天在開發 Oracle Forms Developer 6i的時候,想查詢一個函數,於是開啟 help,
卻出現一個只能按ok,並提示Form Error錯誤的視窗。

原來Vista以後已經不支援舊式的help文件(.hlp),也就是不再內建WinHlp32.exe,
因此如果真的有需要開啟舊式的.hlp文件,則可以到微軟的下載中心去找更新檔。

各作業系統的更新檔如下:http://support.microsoft.com/kb/917607/zh-tw



依自己的作業系統版本,下載完後直接點選安裝後就可以正常開啟幫助文件了。


scratch 適合國小、中學習邏輯的程式設計

網址:http://scratch.mit.edu/

Scratch 是麻省理工學院發展的一個免費積木式程式語言專案,
最初開發的對象是針對8至16歲的孩子,但是現在已涵蓋各年齡的人,
它把程式語法變成一個個積木,只要以堆疊的方式,就能拼出一段程式。
所以不必學習困難的程式語法,就能在設計的過程中學習程式的邏輯。
同時這個程式亦適合製作互動式故事或遊戲,讓小朋友發揮寫程式的創意。


如下圖,只要用拼圖的概念就可以開發程式,而且圖片的缺角就像真的拼圖一樣 ,
只有相符的缺角才能拼湊起來,程式才能順利執行。

Scratch 可以直接在網頁上拼湊程式,也有離線下載的安裝檔,
自己測試的結果,建議一定要安裝Scratch2.0以上的版本,不要安裝1.4版。
其實網頁上的Scratch在開發上已經很流暢,建議直接在網頁上編輯就可以了。

Scratch有支援多國語言,要更改為繁體中文如下圖點選「地球」,再往下找就可以找到了。

離線的安裝檔(2.0),會自動安裝 Adobe AIR:
http://scratch.mit.edu/scratch2download/

進入下載頁後,如下圖點選紅色圈選處就可以開始安裝


教育部校園自由軟體已有列出教學的網站,網址如下,點選「軟體教學」:
http://ossacc.moe.edu.tw/modules/ck2_software/view.php?sw_sn=101


MK808B(Android)+網樂通+WonderBox + BT來觀賞影片

自從上次把網樂通改為NextNAS for wheezy版後,
用BT下載了幾部測試電影。

家裡的MK808B是以HDMI連接到電視,再以無線網路連線上網。

首先開啟網樂通的WonderBox管理網頁,裡面會有WonderBox的Service ID,記錄下來。

接著到Google Play下載並安裝Android版的WonderBox

開啟WonderBox for Android,設定剛剛記錄下來的Service ID


設定完成後,就可以在MK808B點選圖示進入網樂通的WonderBox,點選影片後,
開啟一個選擇播放軟體的視窗,點選您的播放軟體後就會線上直接播放影片。
如果影片字幕是外掛的檔案,則WonderBox會將字幕檔下載到MK808B,
這樣就可以順利播放有字幕的影片了。

目前為止播放影片都還蠻順利(區網播放),沒有LAG的現像,
只有一部MP4的電影無法播放,不過這不是Wonderbox的問題,
而是Android上的播放軟體無法支援之故,



Excel 2003利用SUMPRODUCT()來加總符合多條件的值

因為Excel 2003沒有sumifs()的函數,所以必須以其他的函數替代,這裡範例使用sumproduct()函數

如下圖,想要計算同一料號,同一廠商,同一卡號在不同時間收料的總數量。
所以在J欄的公式如畫面:

SUMPRODUCT(($A$2:$A$11=G2)*1,($B$2:$B$11=H2)*1,($C$2:$C$11=I2)*1,D2:D11)
公式的邏輯是先判斷單欄的資料是否有符合指定的值,並且三個欄位回傳的值必須同時為1,才傳回D欄的值,最後加總。

使用 SUMPRODUCT 函數中的每一個判斷結果(True 或 False),在乘以1之後,其結果為1或0。
(True X 1 ) * (True X 1 ) = 1 * 1 = 1 (True)
(True X 1 ) * (False X 1 ) = 1 * 0 = 0 (Fasle)
(False X 1 ) * (True X 1 ) = 0 * 1 = 0 ( Fasle)
(Fasle X 1 ) * (Fasle X 1 ) = 0 * 0 = 0 ( Fasle)

以第2列的資料(aa,aa01,aa02,10)與G2、H2、I2來比對為範例
($A$2:$A$11=G2)*1=1
($B$2:$B$11=H2)*1=1
($C$2:$C$11=I2)*1=1
因為三個條件都為1,所以傳回10

以第3列的資料(cc,cc01,cc02,30)與G2、H2、I2來比對為範例
($A$2:$A$11=G2)*1=0
($B$2:$B$11=H2)*1=0
($C$2:$C$11=I2)*1=0
只要有一個條件是0,就會傳回0

這樣就可以替代sumifs()函數了。


EBS自動拋轉INV Interface的範例

DECLARE
   p_organization_id   mtl_system_items_interface.organization_id%TYPE   := 168;
   p_user_id           fnd_user.user_id%TYPE;
   p_set_process_id    mtl_system_items_interface.set_process_id%TYPE    := 5000;
  
   CONC_ID NUMBER;   
    rc                  number;
    rt                  boolean;
    outcome             varchar2(200) := NULL;
    message             varchar2(200) := NULL;
    timeout             number:= 3000;
    LB_RETURN           BOOLEAN;
    LS_PHASE            VARCHAR2(100);
    LS_STATUS           VARCHAR2(100);
    LS_DUMMY1           VARCHAR2(100);
    LS_DUMMY2           VARCHAR2(100);
    LS_DUMMY3           VARCHAR2(100);
    V_DUMMY             NUMBER := 0;
   
    v_request_id    number;
    errbuf    varchar2(500);
   
    l_num_user_id    number;
    l_num_resp_id    number;
    l_num_resp_appl_id   number;
   

   CURSOR cur IS
       SELECT distinct d.inventory_Item_id,d.segment1
          FROM MTL_SYSTEM_ITEMS D               
          WHERE d.organization_id=168          
           and  d.segment1='XX-1234';
  
   BEGIN
  
   FOR rec IN cur LOOP
       --將欲修改的資料寫入INTERFACE
       INSERT INTO mtl_system_items_interface
                (
                   process_flag , set_process_id
                 , transaction_type, inventory_item_id               
                 , organization_id
                 , last_update_date
                 , last_updated_by , last_update_login
                 ,FIXED_DAYS_SUPPLY
                  )
         VALUES (
                  1 , p_set_process_id
                 ,'UPDATE' , rec.inventory_item_id               
                 , p_organization_id
                 , SYSDATE                
                 ,-1,-1
                 ,1
                  );
   END LOOP;

   COMMIT;

   --找初始化環境所需的資料  
   SELECT user_id
          INTO l_num_user_id
           FROM applsys.fnd_user
          WHERE user_name ='TEST_USER';
         
   SELECT responsibility_id
           INTO l_num_resp_id
           FROM apps.fnd_responsibility_vl
          WHERE responsibility_name ='INVENTORY';
         
   SELECT application_id
           INTO l_num_resp_appl_id
           FROM applsys.fnd_application
          WHERE application_short_name = 'INV';

   --初始化必要的環境變數
   fnd_global.apps_initialize (
            user_id       => l_num_user_id, 
            resp_id       => l_num_resp_id,
            resp_appl_id  => l_num_resp_appl_id
            );                                    

   --如果成功會回傳Request ID,失敗傳回0              
   v_request_id:=Fnd_Request.submit_request (
            application   => 'INV',
            Program       => 'INCOIN',
            description   => '',
            start_time    => '',
            sub_request   => FALSE,
            argument1     => '168',
            argument2     => '1',           
            argument3     => '1',  --Group ID option (All)
            argument4     => '1',  -- Group ID Dummy
            argument5     => '1',  -- Delete processed Record 
            argument6     => p_set_process_id,  -- Set Process id                   
            argument7     =>'2'   -- Update item
                            );  
   COMMIT ;      
      
    dbms_output.put_line( v_request_id) ;
      
    IF p_set_process_id = 0 THEN
      errbuf := 'Call INCOIN Error';
      rollback;
      return;
    END IF;
   
    lb_return := fnd_concurrent.wait_for_request(
            p_set_process_id
           ,3        -- interval
           ,7200     -- max_wait
           ,ls_phase
           ,ls_status
           ,ls_dummy1
           ,ls_dummy2
           ,ls_dummy3
            );
    IF TRIM(ls_phase) = 'Completed' AND TRIM(ls_status) NOT IN ('Normal','Warning') THEN
        errbuf :='Batch Submit item error';
        return;
    END IF;       

END;

Oracle DB HWM(high water mark)對查詢的效能影響

HWM高水位是指一個segment(Table/Index)中已使用與未曾使用的Block分界線,
也就是說在HWM之下的Block是已使用(包含曾使用),在HWM之上的Block是未曾使用。
當不斷地insert資料時,HWM也會跟著向上移動,但是Delete資料,HWM卻不會往下移動,
就像飲料一樣,在裝杯時水量不斷增加,但是開始喝飲料時,水量就下降,
但是最高的水痕依然留在杯上,沒有降低。
而Oracle在執行Table的full scan時並不是只讀取有資料的Block,
而是從HWM以下的Block都會讀取(無論是否有資料),所以會影響查詢的時間。
如果有大量空的已使用Block就表示該Segment有大量的碎片,浪費大量的空間。

例如我有一個暫存各種資料的暫存表,有一次新增了三百多萬筆的資料
SQL> select count(1) from tmp_ddd;

  COUNT(1)
----------
   3705682

SQL> delete tmp_ddd;

3705682 rows deleted.

SQL> commit;

Commit complete.

SQL> select segment_name,segment_type,blocks FROM dba_segments  WHERE segment_name='TMP_DDD';

SEGMENT_NA SEGMENT_TY     BLOCKS
---------- ---------- ----------
TMP_DDD    TABLE           42912

SQL> SELECT table_name,num_rows,blocks,empty_blocks FROM dba_tables  WHERE table_name='TMP_DDD';

TABLE_NAME      NUM_ROWS   BLOCKS     EMPTY_BLOCKS
--------------- ---------- ---------- ------------
TMP_DDD                  0      42636            8
由上可知雖然已經將資料刪除,但是BLOCKS還是有這麼多

查詢Table的大小
SQL> select segment_name, bytes/1024/1024 "表大小MB" from dba_segments where segment_name='TMP_DDD';

SEGMENT_NAME   表大小MB
-------------- ----------
TMP_DDD            335.25

查詢Table的實際大小
SQL> select table_name, AVG_ROW_LEN ,NUM_ROWS,AVG_ROW_LEN*NUM_ROWS/1024/1024 "表實際大小MB",LAST_ANALYZED from dba_tables where table_name='TMP_DDD';

SEGMENT_NAME   表實際大小MB
-------------- -------------
TMP_DDD               .00494

碎片公式:(1-表實際數據大小/表大小)
(1-0.00494/335.25) = 99.9%

對於查詢的影響
SQL> set timing on;
SQL> select * from tmp_ddd;

no rows selected

Elapsed: 00:00:05.24
沒有任何資料,查詢花費5秒鐘。

所以可以利用truncate Table,把HWM降低。
(也可以利用alter table table_name move、drop再重建或10g以後還可以用shrink)
SQL> truncate table cusadmin.tmp_ddd;

Table truncated.

SQL> select segment_name,segment_type,blocks FROM dba_segments  WHERE segment_name='TMP_DDD';

SEGMENT_NA SEGMENT_TY     BLOCKS
---------- ---------- ----------
TMP_DDD    TABLE              16

SQL> analyze table cusadmin.tmp_ddd compute statistics;

Table analyzed.

SQL> SELECT table_name,num_rows,blocks,empty_blocks FROM dba_tables  WHERE table_name='TMP_DDD';

TABLE_NAME   NUM_ROWS     BLOCKS EMPTY_BLOCKS
---------- ---------- ---------- ------------
TMP_DDD             0          0           16

再次查詢,不到1秒鐘
SQL> select * from tmp_ddd;

no rows selected

Elapsed: 00:00:00.01

FND_REQUEST.SUBMIT_REQUEST的用法說明(提交Request)

FND_REQUEST.SUBMIT_REQUEST函數是用來送出一個Request,傳回一個NUMBER的值。
如果成功,會傳回Request ID的值,失敗則傳回0。

此函數一共有105個參數,前五個參數是定義fnd_request.submit_request自己,
後面的參數則是定義要傳給Concurrent Request的值。而第五個參數要特別注意,
false表示立刻提交,不要被參數名稱給誤導。
如下圖,第六個參數開始設定的值,會依序把值傳給Concurrent Program Parameters

注意:
1、Package使用只需要傳遞需要的參數個數,它會自帶結束的預設值。
2、form則要寫滿105個參數,而且參數結束之後要用一個chr(0)來表示結束。
3、在Toad、PL/SQL Developer、SQL puls等工具內使用,必須初始化global variables。
   也就是利用fnd_global.apps_initialize函數來初始化
4、如果提交Request時,一直傳回0,則檢查是否有初始化環境
5、傳給Concurrent Request的參數個數與定義,可以查詢Request的定義,如下圖:

語法:
Request_id := fnd_request.submit_request(
                  application CHAR, --模組
                  program CHAR,      --應用程式
                  description CHAR,   --說明(可省略)
                  start_time CHAR,    --RUN 時間(可省略)
                  sub_request BOOLEAN, --是否立刻送出Request
                  argument1 CHAR,   --傳給Request的參數1
                  argument2 CHAR,   --傳給Request的參數1
                  argument3 CHAR,   --傳給Request的參數1
                  ....(略)
                  argument100 CHAR);
       
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.


一、查application(模組)與program(應用程式)名稱的方法
       
方法一:由ERP介面查詢(查Import Items)

由下圖可以得知Short Name就是我們要的Program
位置:「Application Developer」->「Concurrent」->「Program」

依上圖的Application可以找到Short Name,就是我們要的application
位置:「Application Developer」->「Application」->「Register」
   
方法二:執行下列SQL查詢(查Import Item)
SELECT DISTINCT
       fa.APPLICATION_SHORT_NAME, --application(模組)
       fat.APPLICATION_NAME,
       fcp.CONCURRENT_PROGRAM_NAME, --program(應用程式)
       fcpt.USER_CONCURRENT_PROGRAM_NAME,
       fcpT.DESCRIPTION,
       fcpt.LANGUAGE
  FROM fnd_application_tl fat,
       fnd_application fa,
       fnd_concurrent_programs_tl fcpt,
       fnd_concurrent_programs fcp,
       fnd_executables fe
WHERE fat.APPLICATION_ID = fa.APPLICATION_ID
       AND fat.LANGUAGE = fcpt.LANGUAGE
       AND fa.APPLICATION_ID = fcp.APPLICATION_ID
       AND fcpt.CONCURRENT_PROGRAM_ID = fcp.CONCURRENT_PROGRAM_ID
       AND fcp.executable_id = fe.executable_id
       AND fcpt.USER_CONCURRENT_PROGRAM_NAME='Import Items'; --報表名稱
   
   
二、範例,Import Item(mtl_system_items_interface)

1、在Forms內使用

//在Forms中,初始化可以用GLOBAL變數代入
APPS.FND_GLOBAL.apps_initialize(
    user_id =>APPS.FND_GLOBAL.user_id,
    resp_id =>APPS.FND_GLOBAL.resp_id,
    resp_appl_id =>APPS.FND_GLOBAL.resp_appl_id) ;
   
//定義完變數後必須以CHR(0)來表示參數已結束,但是仍然要填滿105個  
v_request_id := fnd_request.submit_request(
    'INV',
     'INCOIN',
     '',
     '',
     FALSE,
    84 ,'1','1','1','1',set_process_id,'2',CHR(0),
     '','','','','','','','','','','',
    '','','','','','','','','','',
    '','','','','','','','','','',
    '','','','','','','','','','',
    '','','','','','','','','','',
    '','','','','','','','','','',
    '','','','','','','','','','',
    '','','','','','','','','','',
    '','','','','','','','','','');

2、在Package中使用

//初始化參數只能由SQL中查詢
SELECT user_id
  INTO l_num_user_id
  FROM applsys.fnd_user
  WHERE user_name ='AA123'; --帳號
       
SELECT responsibility_id
   INTO l_num_resp_id
   FROM apps.fnd_responsibility_vl
   WHERE responsibility_name ='Inventory'; --Responsibility Name
       
SELECT application_id
   INTO l_num_resp_appl_id
   FROM applsys.fnd_application
   WHERE application_short_name = 'INV'; --application name

fnd_global.apps_initialize (user_id => l_num_user_id,
                            resp_id => l_num_resp_id,
                            resp_appl_id => l_num_resp_appl_id
                            );

//只需填入需要個數的參數,會自動帶入結束符號。                                
v_request_id:=Fnd_Request.submit_request (
    application   => 'INV',
    Program       => 'INCOIN',
    description   => '',
    start_time    => '',
    sub_request   => FALSE,
    argument1     => 84,
    argument2     => 1,          
    argument3     => 1,
    argument4     => 1,
    argument5     => 1,  -- Delete processed Record
    argument6     => 5000,  -- Set Process id                  
    argument7     => 2   -- Create/Update item
     );
   

三、查詢Request執行狀態的函數

主要是用Fnd_concurrent.wait_for_ruqest函數來得知目前Request執行的狀態。

Fnd_concurrent.wait_for_request會傳回Boolean值,主要參數如下:
function FND_CONCURRENT.WAIT_FOR_REQUEST
    (request_id IN number default NULL, --Request 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;


例如:
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('Request執行失敗:'||l_dev_status);
        RETURN;
    END IF;
  ELSE
    Fnd_Message.Debug('Request執行失敗');
    RETURN;
END IF;

Excel 2010利用SUMIFS()來加總符合多條件的值

出廠加工的料號,但是會分批入廠,所以設計兩個表格,一個記錄每次入廠的資料,
一個記錄出廠時的資料如下圖,已收數量必須同時符合單號、料號、廠商之加總,
所以用SUMIFS()來計算,公式如下:
=SUMIFS($D$2:$D$7,$A$2:$A$7,G2,$B$2:$B$7,H2,$C$2:$C$7,I2)
第一個參數是指定欲加總的欄位,當然就是收料數量,後面的參數都是兩兩一對,
例如:「$A$2:$A$7,G2」、「$B$2:$B$7,H2」、「$C$2:$C$7,I2」
前面是要被篩選的欄位範圍,後面是要篩選的條件,例如要篩選單號A001的資料,
範圍就是A2:A7,條件就是G2。
因為有設定三組「$A$2:$A$7,G2」、「$B$2:$B$7,H2」、「$C$2:$C$7,I2」參數,
表示必須同時滿足三組條件的資料才會被篩選出來加總。

Drupal 7 找user_access()所需的權限字串

因為程式中有使用到user_access()來檢查權限,此函數必須帶入權限名稱的字串。
例如:
if  (user_access('edit page content', $user)) {
     print '有權限' ;

但是不確定權限名稱,所以在網路上搜尋解答。
網路上有一段語法可以把權限秀出來,我把這段語法加在區塊中,果然就解決了。
從秀出來的訊息中,就可以找到權限名稱。
foreach (module_list(FALSE, FALSE, TRUE) as $module) {
  print_r($module);
  if ($permissions = module_invoke($module, 'permission')) {
    print_r($permissions);
  }
}


Drupal 7 利用函數l()設定URL

目的要串成下列的URL,以便在view可以設定編輯的連結
http://drupal_test/drupal-7.26/?q=node/25/edit&destination=meeting-v01

一開始是簡單用下列的方式取得URL,但是實際連結後卻發現部份的字元變成亂碼
$linkurl= l(t('編輯'), 'node/'.$nid.'/edit&destination=meeting-v01') ;
print $linkurl ;

實際上的URL變為 node/25/edit%26destination%3Dmeeting-v01,
其實它並不是亂碼,只是在URL中傳遞這些特殊符號時要使用編碼。
編碼的格式為:%加字元的ASCII碼,即一個百分號%,
後面跟對應字元的ASCII(16進位)碼值。所以空格的編碼值是「%20」。
不過這樣的URL實際應用在Drupal中是無法正確連結的。

因此對於函數l(),必須加上一些參數,以呈現正確的URL,程式碼如下:
$linkurl = l(t('編輯'), 'node/'.$nid.'/edit',array(
        'query' =>  
            array(
              'destination' => 'meeting-v01'
            ),
        'html' => TRUE
  )  );
print $linkurl;

'query'的陣列表示要附在「&」 後面的變數,其格式為「變數名稱」=> 「值」,
由上可知'destination' => 'meeting-v01'指的是destination=meeting-v01,
可以設定多個變數,只要將變數設定在'query'的陣列之中就可以了。

'html'表示啟用html格式

這樣就可以得到正確的node/25/edit&destination=meeting-v01的連結


EBS因為Folder而引發無法查詢(找不到資料)

使用者確定當日有入庫及倉移轉,但是以Material Transactions卻查不到任何資料,
但是其他人都可以正常查詢到資料。

原來是使用者有設定Folder的緣故,只要請使用者自行刪除Folder就可以了

也可以由管理者來刪除使用者的Folder

如下圖紅色圈選處,輸入使用者帳號,也可以由其他選項來找出Folder。

找到欲刪除的Folder,按下刪除就可以了。


Drupal 7 取得URL網址的參數(例如nid)

有時候需要取得URL上附掛的參數,如node id,可利用arg()來取得。
例如URL是http://drupal_test/node/25
則arg(0)='node'、arg(1)=25
例如URL是http://drupal_test/view01/24
則arg(0)='view01'、arg(1)=24

所以如果nid是位於URL的第二個參數,則以arg(1)取得nid的值,
程式碼如下:
if (arg(0) == 'node' && is_numeric(arg(1))) {
  $nid = arg(1);
  if ($nid) {
    $node = node_load($nid);
    /** do something **/
  }
}


Drupal 7 利用view來加入新增、編輯、刪除,並連結到自訂的view

這次的目標是要用view來完成下圖有新增、編輯、刪除的功能,並且將標題連結到自訂的view中,而不是連結到預設的頁面。

下圖是按下標題「社區大會」所呈現的內容,是自訂的view


為了達到上面的功能,需要兩個view,meeting-v01就是上圖的列表,
meeting-v02就是明細的view。


下圖是meeting-v01在view中的設定


欄位部份加入「內容:Nid」,但是設定它為不顯示,注意順序必須在「內容:標題」之前,
否則在設定「內容:標題」連結的時候,會找不到nid。

點選「內容:Nid」,再勾選該項目就不會顯示了。


回到設定頁面,點選「內容:標題」,將下列的項目取消勾選以啟用覆寫。
(勾選表示不啟用,不勾選才是啟用,才能覆寫欄位的連結)

還需要勾選下列的項目來覆寫預設的連結,連結路徑設為「meeting-v02/[nid]」,
[nid]表示會將點選的標題文章的nid附到網址的後面,例如:「社區大會」的nid是25,
當點選標題「社區大會」時,其傳送的網址是http://drupal_test/meeting-v02/25


在meeting-v01的欄位中加入「內容:編輯連結」及「內容:刪除連結」,
就可以直接增加「編輯」、「刪除」的功能


meeting-v01中,在頁首的部份加入「全域:多行文字欄位」,並在設定的內容內加入程式碼,
以增加「新增」的功能


下圖是meeting-v02的設定主畫面,重點在「上下文過濾器」,加入「內容:Nid」,
如此便可在網址上時取得nid的值,例如由meeting-v01點選標題之後,
meeting-v02的url就像http://drupal_test/meeting-v02/25,
而meeting-v02就可以自動取得nid的值,並且只取得nid=25的內容。