EBS po.plsql.PO_RELGEN_PKG.CREATE_RELEASES code: -20001

今天的系統在CREATE RELEASES時出現error,但是PO卻有成功建立,log只有一行訊息:
po.plsql.PO_RELGEN_PKG.CREATE_RELEASES.100 exception; SQL code: -20001

看不出來是什麼原因造成error,從Google查也查不出什麼結果,只好從Metalink找看看有沒有相關訊息。
Metalink上文檔 ID 271864.1 提到Inventory Organization missing in Receiving Options,
並提供一段SQL檢查沒有設定Receiving Parameter的organization id(SQL我有修改過):
select organization_id,name from HR_ORGANIZATION_UNITS_V
    where organization_id in (select h.organization_id
    from APPS.HR_ORGANIZATION_INFORMATION_V h
    where h.ORG_INFORMATION1_MEANING = 'Inventory Organization'
      and not exists ( select 1 from rcv_parameters r
           where r.organization_id = h.organization_id) );
 
檢查的結果有一個最近剛剛新增的organization沒有設定到Receiving Parameter,
到Setup->Organizations->Organizations內去設定Receiving Information就可以了。


Solaris 無法刪除有權限的檔案

今天在Solaris上要刪除一個檔案時出現錯誤:
rm: aa.txt not removed: Permission denied

先查aa.txt的權限,都有讀寫的權限。
-bash-3.2$ ls -l aa.txt
-rw-rw-rw-   1 test01  users  9 Apr 18 08:59 aa.txt

雖然我是用test02登入,但是同屬於users群組,更何況權限是666,
應該沒有什麼問題才是。

檢查上一層目錄的權限
-bash-3.2$ cd ..
-bash-3.2$ ls -ld US
drwxr-xr-x   2 test01  users  134 Apr 18 09:42 US

原因在於上一層目錄的權限不足,更改目錄權限就可以了。
雖然找到原因很快就解決了問題,但是為了找到這個原因,在google找了好幾篇文件,
就是沒有提到,也沒有想到可能是目錄的問題,所以自己記錄下來。

EBS GL Date within an open purchasing period

今天在測試區PO模組測試收料時,出現下列的訊息:GL Date within an open purchasing period

原因是GL Date沒有設定為Open,如下圖更改日期的Status為Open即可

EBS MRP的Planning Manager一直是Running的狀態

今天遇到一個問題,就是MRP執行出來的結果有問題,同事檢查後發現是Planning Manager一直在running,
原則上這支程式很快就會結束,而這支程式沒有正常完成會讓MRP產生有問題的結果。

從Concurrent Request開啟log,直接拉到最後看看執行到哪裡卡住了,
原因是「Could not lock mrp_recommendations rows」,因為無法lock mrp_recommendations,導致錯誤。



由下列的SQL找出mrp_recommendations被誰Lock住。
select vlo.session_id,vlo.object_id,owner,object_name,object_type,locked_mode,
          process,oracle_username,os_user_name
    from v$locked_object vlo,
            dba_objects vdo
    where  vlo.object_id=vdo.object_id
    and object_name =upper('mrp_recommendations');

最後發現是一個Session ID為224的使用者lock住這個表格,同事打電話詢問才知道使用者程式已經當掉,
而使用者就這樣一直放任不管,強制刪除Session之後就順利成功了。

EBS GL Date within an open purchasing period

今天在測試區PO模組測試收料時,出現下列的訊息:GL Date within an open purchasing period

原因是GL Date沒有設定為Open,如下圖更改日期的Status為Open即可

EBS 找指定responsibility包含哪些forms


--選單樹狀結構
Declare

   v_check   number :=0;
 
   v_space   varchar2(200) :='';
 
   i                number :=0;
 
   v_top_responsibility  varchar2(50) := <權限模組名稱> ;

  cursor cur1 is
      select a.menu_id,b.sub_menu_id,b.prompt
          from fnd_menus_vl a,FND_MENU_ENTRIES_VL b
          where a.menu_id=b.menu_id
              and a.menu_name='FM_NAVIGATE_10G'
              and B.sub_MENU_ID not in (select action_id from FND_RESP_FUNCTIONS a,
                                                                       fnd_application_vl b,
                                                                       fnd_responsibility_vl c
                                                                     where a.application_id=b.application_id
                                                                         and c.responsibility_id=a.responsibility_id
                                                                         and c.responsibility_key = v_top_responsibility
                                                                         and rule_type='M') ;

    r1 cur1%rowtype;

   Procedure Get_function (v_level number,v_sub_menu number ) is     --傳入層級,子選單ID
 
      Cursor Cur2  is
          select sub_menu_id,prompt
                 from FND_MENU_ENTRIES_VL  where  menu_id=v_sub_menu
                 and function_id not in (select action_id from FND_RESP_FUNCTIONS a,
                                                                  fnd_application_vl b,
                                                                  fnd_responsibility_vl c
                                                                  where a.application_id=b.application_id
                                                                  and c.responsibility_id=a.responsibility_id
                                                                  and c.responsibility_key =v_top_responsibility
                                                                  and rule_type='F') ;
               
       r2   cur2%rowtype;

   Begin
 
     --dbms_output.put_line('aaaa');
   
     v_space :='';
   
      for i  in  0..v_level
            loop
                    v_space :='  '||v_space ;
      end loop;

      For r2 in Cur2 Loop

             select count(1)  into  v_check
                 from FND_MENU_ENTRIES_VL  where sub_menu_id is not null and menu_id=v_sub_menu
                 and function_id not in (select action_id from FND_RESP_FUNCTIONS a,
                                                                  fnd_application_vl b,
                                                                  fnd_responsibility_vl c
                                                                  where a.application_id=b.application_id
                                                                  and c.responsibility_id=a.responsibility_id
                                                                  and c.responsibility_key = v_top_responsibility
                                                                  and rule_type='F');


            If v_check > 0 then

                insert into tmp_ddd(a,b) values (v_level,v_space|| r2.prompt);
                Get_function (v_level+1,r2.sub_menu_id);

            else
         
                 insert into tmp_ddd(a,b) values (v_level,v_space || r2.prompt);
                 --dbms_output.put_line('Top Item_Number:' ||r2.prompt);

             end if;

      End Loop;

   End;
 
Begin

    for r1 in cur1 loop
        insert into tmp_ddd(a,b) values (0,r1.prompt);
       Get_function (1,r1.sub_menu_id);
    end loop;
 
    commit;
 
End;


Cancel PO時出現錯誤Please undo the changes to the document in current revision

有一個standard PO要Cancel時,出現下列的錯誤訊息,已經確認沒有其他人在使用這張PO,
因為這張PO是由一支客製程式經INTERFACE拋轉出來的,可能是一個bug。

我們的做法是先修改PO Line的其中一筆資料,例如將數量改為1後儲存,重新appoved,
再執行一次cancel就成功了。


Solaris x64 出現錯誤 /usr/lib/extendedFILE.so.1: open failed

用useradd新增了帳號test01、test02之後,登入test01並用su時,出現了下列:
-bash-3.2$ su - test02
ld.so.1: su: warning: /usr/lib/extendedFILE.so.1: open failed: illegal insecure pathname

到google查了一下,發現國外的文件上提到這是因為環境變數設定的關係。

在登入到test01的命列下執行:
-bash-3.2$ env | grep LD_PRELOAD_32
LD_PRELOAD_32=/usr/lib/extendedFILE.so.1

-bash-3.2$ export LD_PRELOAD-32=
-bash-3.2$ su - zoe
Password: 

這樣問題就解決了,再將「export LD_PRELOAD-32=」寫到.profile即可。

取消Solaris上帳號已設定密碼到期日

有一個帳號test01已經設定密碼到期日,有兩個方法可以清除。

# cat /etc/shadow | grep test01
test01:$1$1jgzqgOq$AZrtLDm9oSyFrm0.ugLZC.:16170:1:2:3:6::

1、直接修改/etc/shadow,並將相關欄位清除後儲存

2、以參數 -x 來清除設定,並指定值為-1。
      # passwd -x -1 test01

驗證:
# cat /etc/shadow | grep test01
test01:$1$1jgzqgOq$AZrtLDm9oSyFrm0.ugLZC.:16170::::6::

solaris 10 密碼原則

一、記錄歷史密碼功能

它會記錄使用者使用過的密碼,最多可以記錄26組。
如果啟用這個功能後,在變更密碼時將不允許重複之前已使用過的密碼。

編輯/etc/default/passwd,將HISTORY前的註解#移除,並且給予一個大於零的值如下,
HISTORY=5  --> 表示記錄曾使用過的五組密碼

例子:
$ passwd
passwd: Changing password for keven
Enter existing login password:
New Password:
passwd: Password in history list.  -->提示新密碼已被使用過


被記錄的密碼放在/etc/security/passhistory,每行的最前面是帳號,後面使用過的加密密碼,
以「:」來區分各組密碼
# cat /etc/security/passhistory
keven:30mTqC53LX0Fg:YpysbwM605wh6:


二、限制密碼錯誤次數的功能

編輯 /etc/security/policy.conf,將LOCK_AFTER_RETRIES的值設定為YES,並將註解#字移除以啟用功能。
編輯/etc/default/login,設定RETRIES的值並將註解#移除,限制密碼最多輸入幾次錯誤,便將帳號鎖住。

另外在/etc/default/login中還有一個SYSLOG_FAILED_LOGINS,是設定幾次登入錯誤後才會送訊息給syslog,
如果設成0,則每次的錯誤都會送訊息給syslog。

使用者在登入失敗後,/etc/shadow中密碼那一欄的最前面會被加上*LK*,即表示這個帳號被鎖住了,如下:
test01:*LK*gRTCELbBZ4Bko:16170::::::6

可以使用passwd -u <USER_NAME>來解開被鎖住的帳號,或者是手動把/etc/shadow裡的*LK*移除就可以了。
# passwd -u test01
passwd: password information changed for test01

這個功能是全域設定,也就是一旦啟用,所有的帳號都適用,如果想排除針對其中一個帳號,
則可以編輯/etc/user_attr並且加入<USER_NAME>::::lock_after_retries=no,例如:
test01::::lock_after_retries=no


三、密碼最小長度

編輯/etc/default/passwd,修改參數PASSLENGTH的值,例如改為最小長度為8
PASSLENGTH=8

以帳號test01來測試
$ passwd
passwd: Changing password for test01
Enter existing login password:
New Password:  --> 輸入 root123
passwd: Password too short - must be at least 8 characters.
會提示輸入的密碼太短了。


四、設定帳號到期天數

以test01為例,先執行下列指令
# usermod -f 6 test 01
# passwd -n 1 -x 2 -w 3 test01

參數說明:

usermod
-f 密碼到期後寬限天數

passwd
-n 限制密碼變更相隔天數
-x 密碼到期天數
-w 密碼過期前警告天數


接著可以觀察/etc/shadow中test01的設定
test01:$1$1jgzqgOq$AZrtLDm9oSyFrm0.ugLZC.:16170:1:2:3:6::

格式:name:password:last_change_date:min:max:warn:inactive:expire_date:none
格式說明:Login_Name:Password:更改密碼的最後時間:限制密碼變更相隔天數:密碼到期天數:
          密碼過期前警告天數:密碼到期後寬限天數:失效日期:保留欄位

各欄位說明

Login_Name:
這是使用者名稱,與另一個帳號檔/etc/passwd相應

Password:
使用者加密後的密碼

更改密碼的最後時間:
單位是日,由1970/1/1開始起算天數。
例如 (1970/1/1) + 16170 = (2014/4/10),表示test01最後在2014/4/10變更過密碼

限制密碼變更相隔天數:
例如1表示密碼隨時更改後必須經過一天才能再更改。

密碼到期天數:
變更密碼多少天後就必須要設定新密碼,否則這個帳號將會失效。
例如上面的2,表示密碼2天後會到期。

密碼過期前警告天數:
系統預設值是7天,上面的3表示密碼到期日3天前會提示更換密碼

密碼到期後寬限天數:
例如6,代表密碼過期後6天,帳號就會失效。

失效日期:
帳號會在指定日期之後失效。
一樣是以1970/1/1來計算天數,如:(2014/4/10) - (1970/1/1) = 16170

保留欄位:
最後一個欄位是保留的。

Solaris 10 密碼的加密安全性

原來Solaris 10 支援四種帳號密碼加密的演算法,如下面的說明:

識別字 演算法 說明 Man manual
1 crypt_bsdmd5 MD5演算法(與BSD、Linux相容),密碼最長可達255個字元。 crypt_bsdmd5(5)
2a crypt_bsdbf Blowfish演算法(與BSD相容),密碼最長可達255個字元。 crypt_bsdbf(5)
md5 crypt_sunmd5 Solaris的MD5,比BSD及Linux更為安全,密碼最長可達255個字元。 crypt_sunmd5(5)
__unix__ crypt_unix Unix傳統演算法,密碼最長為8個字元。 crypt_unix(5)


但是Solaris預設是使用最不安全的加密法__unix__,密碼的長度限制為8個字元,
但是有趣的是輸入的密碼可以超過8個字元。
例如新增一個使用者test01並將其密碼設定為0123456789
# useradd test01
# passwd test01

切換到另一個帳號來測試
# su - keven
Sun Microsystems Inc. SunOS 5.10  Generic January 2005
$ id
uid=100(keven) gid=1(other) -->已經切換到另一個帳號
$ su test01
Password:  -->輸入0123456789
$ id
uid=102(test01) gid=1(other)
$ exit
$ id
uid=100(keven) gid=1(other)
$ su test01
Password:  -->輸入01234567
$ id
uid=102(test01) gid=1(other)

Solaris 10演算法的設定是放在/etc/security/policy.conf裡面,找一下兩個參數:

CRYPT_ALGORITHMS_ALLOW=1,2a,md5,5,6
此參數是設定可以使用哪些演算法,填入的是識別字,
系統預設已經都填進去了,所以我們不需要改。

CRYPT_DEFAULT=__unix__
預設要使用哪一個演算法,這裡要修改成想要用的演算法識別字。

雖然已經修改CRYPT_DEFAULT,但是由於CRYPT_ALGORITHMS_ALLOW設定允許多種演算法,
所以舊有的密碼還是使用舊的演算法,除非移除CRYPT_ALGORITHMS_ALLOW內的某一項加密法,
否則就是要重新設定新密碼,才能將密碼改為新的加密法。

用Excel 2010製作免費甘特圖

用Excel 2010製作免費甘特圖,以下是完成圖,其實是用圖表的功能加上修改圖表的選項來仿製甘特圖,
並非真正的甘特圖,如果要用免費的甘特圖軟體,可以下載GanttProject,有支援中文。
官方網址:http://www.ganttproject.biz/

首先將任務、開始日期、天數、完成日期填入工作表中,完成計劃後將資料全選,並在工具列上找到橫條圖。
一定要將資料全選起來,不然Excel有可能會判斷錯誤,畫出不符我們需求的圖表
(日期我算錯了,不過不影響製作,可以事後再修改)

圖表出現之後,修改資料的範圍(藍色框的部份),將資料由D6拉到C6。
「完成日期」只是為了讓Excel一開始不要判斷錯誤而產生錯誤的圖表。

在「藍色線條」上按滑鼠右鍵,選擇「資料數列格式」

依下圖點選「無填滿」,把藍色的線條變成透明,讓圖表看起來像是甘特圖。

接著我們要修改欄、列的參數,在下面日期的部份點選滑鼠右鍵,選「座標軸格式」

下方列是日期,所以選「日期」,並選擇一個類型

再來到「座標軸選項」中設定最小、最大值,讓圖表看起來更像甘特圖,其中最小值、最大值的數字,
是由1900/1/1到指定日期的總天數,例如:2014/4/9-1900/1/1=41737天(可用Excel直接相減得出數值)
「主要刻度間距」改為1,也就是間距為1天

接著回到圖表上,在左方任務列上按滑鼠右鍵,選擇「座標軸格式」

這次只選「類別次序反轉」,會把任務上下翻轉。

最後再將圖表的寬度、長度做一個調整就完成了。

補充說明:
如果遇到下列的情形,圖表的內容相反的話,可以按下「切換列/欄」來改變


Solaris 10 FTP設定

因為系統由HP-UX移至Solaris,所以FTP的需要重新設定,下面是我的做法:

檢查是否有啟用FTP,state是online表示已正常啟用
bash-3.2# svcs -l ftp
fmri         svc:/network/ftp:default
name         FTP server
enabled      true
state        online
next_state   none
state_time   Fri Mar 28 16:41:14 2014
restarter    svc:/network/inetd:default
contract_id

目標一:讓使用者ftp登入後只能在家目錄操作,這樣使用者就無法跳到不該瀏覽的目錄
編輯/etc/ftpd/ftpaccess,並加入下列一行:
restricted-uid *

「*」表示所有的帳號都適用,也可以只限制某些帳號(如t01、t02):
restricted-uid  t01,t02

目標二:限制密碼輸入錯誤的次數
編輯/etc/ftpd/ftpaccess,修改下列的值:
loginfails      3
上列表示密碼輸入錯誤三次,FTP就會中斷。

目標三:禁止root登入ftp,原則上預設就是無法登入。
檢查root有無在/etc/ftpd/ftpusers,內容如下,則root無法登入
bash-3.2# cat ftpusers
# ident "@(#)ftpusers   1.6     11/08/02 SMI"
#
# List of users denied access to the FTP server, see ftpusers(4).
#
root
daemon
bin
...(略)

目標四:在使用者登入後,顯示訊息
檢查/etc/ftpd/ftpaccess,確認訊息檔的位置
message         /etc/ftpd/welcome.msg   login
接著在/etc/ftpd中,新增/修改welcome.msg,把欲顯示的訊息填入


目標五:允許ftp登入、拒絕ssh登入
    首先在/etc下新增檔案shells,把允許的shell及路徑寫入檔案shells,
/etc/shells主要記錄允許ftp登入的shell。
例如/etc/shells的內容如下:
/usr/bin/bash
/usr/bin/false

有兩個帳號在/etc/passwd如下:
t01:x:110:102::/export/home/t01:/usr/bin/bash
    t02:x:111:102::/export/home/t02:/usr/bin/false

所以t01可以登入SSH,也可以登入FTP;t02不可以登入SSH,可以登入FTP

其他詳細的用法可以參考 man ftpaccess

Xmanager無法用xdmcp連線Solaris 10

我是用VirutalBox安裝Solaris 10,但是要在Windows 7中想以xmanager連到Solaris時,
卻一直無法連線,顯示連線失敗,但是印象中Solaris 10預設會啟用xdmcp

在文字介面下,可以用下列的指令重新啟用
[root@sol oswbb]# svcadm enable -r cde-login

相反想要停用可下
[root@sol oswbb]# svcadm disable cde-login

先檢查Process是否有被啟用
# ps -ef |grep dtlogin
    root   950   938   0 08:02:55 ?  0:00 /usr/dt/bin/dtlogin -daemon
    root   938     1   0 08:02:48 ?  0:00 /usr/dt/bin/dtlogin -daemon
檢查的結果是有啟用的,但是xmanger還是無法連線

檢查Xmanager配置,應該也沒有什麼問題。
xdmcp Conection Method : XDM Query
xdmcp Host:  Solaris Server IP
xdmcp Port:177
xdmcp Local Address: Auto Select

最後在網路上有人提到Windows的防火牆的可能性,所以去檢查Win7的設定值
先到 「控制台\所有控制台項目\網路和共用中心」,檢視作用中的網路
VirutalBox的網卡VirtualBox Host-Only Network屬於「公用網路」

再到「控制台\所有控制台項目\Windows 防火牆\允許的程式」,終於找到原因,
原來xmanager在「公用網路」是不被允許的,勾選之後就可以連線了。

EBS INV - No open period found for date entered

今天在測試區有一支客製程式是利用INV Interface報廢料號時,發現沒有成功,
錯誤的訊息是NO open period found for date entered,這是因為日期沒有open的緣故

INV--> Accounting Close Cycle -->Inventory Accounting Periods

因為現在已經是四月份,但是可以發現四月的Status是Future,所以按下「Change status...」,
將四月的status改為Open就可以了

Oracle SQL Loader 使用範例

SQL Loader可以快速將大量的資料匯入Oracle的Table中。

例如有一個檔案test01.csv的資料要上傳到tmp_a的Table上。


一、在資料庫中建立名稱為tmp_a的Table

SQL> create table tmp_a
    ( a varchar2(20),
      b varchar2(10),
      c varchar2(10) ) ;


二、準備要匯入的資料,以逗點「,」作為每一欄位的分隔,每一行則為每一筆資料。
    至於副檔名可用.csv,好處是excel可以直接開啟並編輯.csv的檔案,儲存之後也是.csv的格式。

test01.csv內容如下:
------------------------
John,boy,001
May,Girl,002


三、準備好SQL*Loader Control File,也就是告訴Oracle要如何匯入的設定檔

import.ctl
------------------------------------------
load data
 infile 'test01.txt'
 into table tmp_a
 fields terminated by ","
 ( a,b,c )

說明如下:
infile 上傳檔案的路徑及檔名,上面表示與Control File相同目錄
into table 要載入到那一個table,上面表示要載入tmp_a
fields terminated by 欄位與欄位的分隔符號
(a,b,c) 要填入資料的表格欄位名稱


四、執行sqlldr,下列是以Linux為作業系統測試
語法:sqlldr DB帳號/密碼 control=控制檔名

$ sqlldr oracle/password control=import.ctl

SQL*Loader: Release 11.2.0.2.0 - Production on Tue Apr 1 10:43:59 2014
(c) Copyright 1999 Oracle Corporation.  All rights reserved.
Commit point reached - logical record count 3
Commit point reached - logical record count 6

預設會在相同的目錄下產生一個與控制檔名相同的log檔,例如import.log,
如有問題,可檢查log內容的錯誤訊息

驗證一下資料是否成功匯入tmp_a中
SQL> select * from tmp_a ;