2012年3月14日

SQL進行全文搜索,找出所有Table相關字的欄位出來

應該有很多人感到非常的不便就是找尋資料庫的所有 Table ,可能是在某個欄位的資料。
TIPTOP 標準不含 synonym 的話也有 3千多個 Table ,總不能一個一個去 SELECT 吧~
另外 5.X 版就開始有所謂的營運中心,也就是 Table 欄位會多了 PLANT、LEGAL 欄位,
也有許多非 PLANT、LEGAL 的欄位記錄著營運中心的資料。
所以複製到測試資料庫時,當測試資料進行"還原"時,會有可能造成還原到正式的資料庫。
EX:測試資料庫在 AP刪除時,會還原正式資料庫的 rvv20 欄位,變成未匹配。

遇到此狀況時測試資料庫就需要好好的"檢視"一番..........

以下是將資料庫進行全文的檢索 SQL 語法。

create table xxxx as select imk01,imk02,imk09 from imk_file where rownum = 0;   --先建一個暫存 xxx 的 Table 存放搜尋出來的值

declare
    str varchar2(1000);
    num number;
    begin
    for i in(select column_name,table_name from user_tab_cols where data_type in('CHAR','VARCHAR','VARCHAR2'))       -- 列出此 OWNER 的所有欄位出來
    loop
      str:='insert into xxxx select '''||i.table_name||''','''||i.column_name||''',count(*) from '||i.table_name||' where '||i.column_name||'='||'''DS1''';              -- 將查詢有DS1的欄位筆數寫入暫存 xxx Table
      execute immediate str ;                                   -- 轉換並執行
      commit;
   end loop;
   end;

接下來只要執行以下的查詢 SQL 指令,就可以知道有多少筆資料存在那些 Table 裡面了。
再進行整批的資料更新,將營運中心改為測試資料庫的營運中心。

select 'update '||imk01||' set '||imk02||'= ''DS1'';',imk09 from xxxx
where imk09 <> 0
order by imk09

隨著資料庫越來越大,當然要把資料量大的 Table 獨立出來更新,不然會造成資料庫 IO 滿載,系統會變很慢,以下是用迴圈的方式更新資料,減少資料大批量更新。

declare nums number;
begin
for i in(select distinct tlf01 from TLF_FILE)
loop
   update TLF_FILE set TLF20 = 'DS1' where TLF01 = i.tlf01;
commit;
end loop;
end;

這樣完全不會影響到正式資料庫的測試資料就完成囉~

2011年10月13日

讓 TIPTOP Web-GDC 也可以修改字型大小

有些人會認為 TIPTOP 的字怎麼這麼小(預設是9 pt),是可以讓 GDC 預設字型大小改為更大一點,只要在 gdc.exe 後面加上參數 –a即可,不過如果是 Web ActiveX GDC呢,就不能用參數去改了。
 
有找到如何可以改 GDC 參數的功能。
/u1/genero/gas/tpl/fglgdcdefault.html 檔,有以下的參數提供修改。

    function configureGDC() {
      //uncomment following line to enable Admin Mode
      gdc.setAdmin(true);          // 開啟 Option 功能 

      //uncomment following line to enable Debug Mode
      //gdc.setDebug(true);         // 開啟 Debug功能

      //uncomment and modify the following line if you want to change the ping timeout (120 sec by default)
      //gdc.setPingTimeOut(120);   // 開啟 ping time out 功能

       //uncomment and modify the following line if you want to change the proxy (using system settings by default)
      //gdc.setProxy("proxy:3128")  // 開啟 proxy 功能

      // this is to ensure that any popup window will appear in front of the browser
      gdc.setFocus();             // 設為視窗動作中
    }


存檔後重新開啟。
就可以修改文字大小囉~~

讓 Oracle 也可以連結 SQL Server 讀取資料

要如何讓Oracle也可以整合 MS SQL Server ? Oracle有提供一套工具,10g版本稱之為 Oracle Transparent Gateway,到了11g之後改名為 Oracle Database Gateway,如果有購買Oracle DB的話,官方是可以免費提供使用的,不需額外購買,主要是讓Oracle可以做 DB-Link 。提供了許多異質資料庫的整合,詳細可查閱 Oracle Database Gateway 文件說明檔。

Oracle 官方網站下載,然後安裝 Oracle Database Gateway,選擇你所需要連結的資料庫類型。

再來就是預設會幫你建立一個連結設定

然後直接安裝就可以了,要一段時間

再來就是修改二個重要的檔案,首先是在 oracle\product\11.2.0\ts_1\dg4msql\admin,會有一個initdg4msql.ora檔。
修改為
HS_FDS_CONNECT_INFO=127.0.0.1//ERP
HS_FDS_TRACE_LEVEL=OFF
HS_FDS_RECOVERY_ACCOUNT=RECOVER
HS_FDS_RECOVERY_PWD=RECOVER
然後再修改檔案名稱initdg4msql.ora改為自已喜歡的 initerp.ora
第二個檔案就是修改 oracle\product\11.2.0\tg_1\NETWORK\ADMIN\ 裡面的listener.ora檔。
直接在最下面加上
SID_LIST_LISTENER=
  (SID_LIST=
      (SID_DESC=
         (SID_NAME=erp)
         (ORACLE_HOME=D:\Oracle\product\11.2.0\tg_1)
         (PROGRAM=dg4msql)
      )
  )
 之後再重新啟動 LISTENER

lsnrctl stop (停止)
lsnrctl start (啟動)
這樣就完成了 Oracle Database Gateway 的安裝和設定了。
再來就是第二部份,Oracle主機的部份。
首先就是要先建立連線服務的名稱,修改Oracle主機 oracle\product\11.2.0\dbhome_1\network\admin tnsnames.ora檔。
在最底下增加
ERP  =
  (DESCRIPTION=
    (ADDRESS=(PROTOCOL=tcp)(HOST=127.0.0.1)(PORT=1521))
    (CONNECT_DATA=(SID=erp))
    (HS=OK)
  )
 最後就是建立DB-Link,在SQL PLUS下指令,我試sa帳號好像不能使用,不過還是建議建立一個帳號比較好。
CREATE PUBLIC DATABASE LINK ERP CONNECT TO user IDENTIFIED BY password USING 'erp';
測試看看吧~~
select * from table_name@erp;
有結果啦~~

需要注意 Oracle 的所有 Object 英文是不區分大小寫的,但是 SQL Server 是有大小寫之分,
當執行 SQL 指令時, Oracle 會自動轉換為大寫的方式來執行,
必需要加上雙引號 " 的方式才能夠找到正確的 Table 名稱。
select * from "table_name"@erp;

2011年5月17日

fglWrt - 查詢 Tiptop 線上使用人數和狀況

要如何查詢目前有誰在 TIPTOP 系統線上呢?
還有目前總共有多少人在用,
當上線人數已滿的話,要如何把沒有在使用的 User 踢掉呢?

我想這個是 Tiptop 系統維護人員有時會很頭大吧!

fglWrt 指令可以做到以上這幾個問題喔~~
以下是 fglWrt 的所有參數:

Usage  : fglWrt [options]
 -l [license]: Installs a license.
 -v|-V       : Shows version information.
 -u          : Checks active users.
 -k key      : Installation key for license validation.
 -d          : Deletes current license.
 -i          : Clears the list of registered user sessions.
 -a opt      : Check or view options, possible options are:
               ps           : Shows processes on this machine.
               env          : Shows current environment.
               cpu          : Shows number of CPU in the computer.
               hostname     : Shows name of this machine.
               info license : Shows license information.
               info stat    : Shows statitics of license server.
               info users   : Shows all registered active users.
               info up      : Shows if license server is up.

查詢目前的線上人數和使用者:
fglWrt -a info users

要踢掉沒有在使用的 User :
fglWrt -i  

注意:我是直接使用這個指令,把 session 全部清除,正在 key 單的人會跳開,
所以執行前需看有沒有人 lock table 才能執行。
只是清除 server 上 genero 的 session 數而已,
所以不會影響已登入的 User (不會斷線或關閉程式),
這時就通知比較好的 User 快搶 session 吧~~~

2011年5月11日

重新建立 TIPTOP 測試區的環境

相信小地方修改,或是日積月累的修改程式,或是變更 Database Schema 時,
正式區和測試區的 4GL 程式和 Database Schema 會有不一樣的情況,
這時要如何快速的把正式區完全的蓋到測試區呢?

首先,把正式區的程式整個目錄 copy 到測試區的目錄,
記得不能全部複製喔~~ 只能複被各模組、共用程式、副程式。

1. \cp -r /u1/topprod/tiptop/a* /u1/toptest/tiptop  (先前一定要加 \ 喔,不然會一直問要不要覆蓋)
2. \cp -r /u1/topprod/tiptop/lib /u1/toptest/tiptop
3. \cp -r /u1/topprod/tiptop/sub /u1/toptest/tiptop
4. \cp -r /u1/topprod/tiptop/qry /u1/toptest/tiptop
5. \cp -r /u1/topprod/tiptop/g* /u1/toptest/tiptop

再來就是把全部客製程式都 copy 過去。

6. \cp -r /u1/topprod/topcust/c* /u1/toptest/topcust

程式的部份,這樣就不需要再重新 rebuild 囉~~整個動作應該是不會超過 5 分鐘。

接下來就是資料庫的部份:

首先把所有的測試資料庫都刪除吧~~ (包含 ds)
在 sqlplus 下執行 drop user ds cascade

還原正式區的 ds 資料庫到測試區的 ds 資料庫。
1. 建立空的 ds 資料庫: createdb ds 1
2. 匯入正式區 ds 備份檔到測試區的 ds DB:
       imp system/manager@toptest fromuser=ds touser=ds ignore = y file=ds.dmp log=ds.log
3. 匯入公司的資料到測試區,步驟同 1~2 。
4. 要記得修改 /u1/genero.run/etc/fglprofile.test 喔~~
    通常 createdb 參數是 1 的話,fglprofile.xxxx 檔是不會修改的。
dbi.database.aaa.source= "toptest"
dbi.database.aaa.username= "aaa"
dbi.database.aaa.password= "aaa"
dbi.database.aaa.schema= "aaa"
dbi.database.aaa.ora.prefetch.rows = 1
5. 完成,記得重新登入 udm7 試試看吧~

如果不行的話,要修改 zx_file 的 zx08 欄位,看預設的營運中心是否和測試資料庫一致。

資料庫要看資料的大小而定,不過應該是1個小時內可以搞定吧~~~

TIPTOP 程式/ Oracle 資料庫備份-集中備份篇

還記得之前有一篇文章:TIPTOP 主機定期備份 Oracle 資料 & TIPTOP 程式, 備份篇 嗎?
相信應該足夠使用了吧,
但還是有不足的部份,需要將 TIPTOP 主機設定 cron job ,然後再 cr 主機再設定排程工作,
實在是不符合統一集中備份的方式。

其實只要安裝 Oracle Client ,就可以將 Oracle 資料 export 到遠端的電腦,
這樣就可以一個指令,就可以完整的將全部的資料都在遠端的電腦上執行囉~~

以下是備份 Oracle 資料的批次檔,先轉換 Database 的字集,會有警告訊息,但還是可以正常匯出資料。

set NLS_LANG=TRADITIONAL CHINESE.AL32UTF8
exp system/sys_dsc@topprod owner=%1 log=d:\backup\tiptop\exp\%1.log file=d:\backup\tiptop\exp\%1.dmp

再來就是用 ftp 軟體去抓取 Tiptop 主機的程式檔案到本機電腦。

最後就是執行 RAR 的批次指令囉,
就可以在專屬的備份主機,主動的抓取 TITPOP 程式和 Oracle 資料庫來備份啦~

2011年3月23日

Oracle 如何還原已刪除的 Table / 清除回收筒

從 Oracle 10g 開始, 就開始提供有 recyclebin 的功能 (資源回收筒) ,
所以一旦不小心 drop table 刪錯了, 而且已經 commit ,
由於在 Oracle 10g 裡面的運作, 只是把原本的 Table 名稱換成 BIN$1234567890==$0 ,
沒關係, 只要把 recyclebin 裡面的物件還原就好啦~~
總是會有不小心的時候嘛~~
也由於沒有釋放 Tablespace 的空間, 也因此查詢 tablespace 佔用大小時就會越來越慢 ,
所以建議還是固定時間去清理一下 ,

以下就是整個還原會用到的相關指令 :

1. 查看目前有那些 Table
select * from tab

2. 查看資源回收有那些物件
select * from recyclebin;

select * from dba_recyclebin
或 SQLPLUS 的
SQL> show recyclebin

3. 再來就是還原指令
FLASHBACK TABLE [被刪除的 Table Name] TO BEFORE DROP;

如果是刪除 Table  不要放到 recyclebin 呢?
drop table recycletest purge;

當然囉, 也可以指定那些物件確定要清除 recyclebin
purge table recycletest;

要清空資源回收筒:
purge recyclebin;

purge dba_recyclebin;

要注意喔~ 建議用 BIN$1234567890==$0 當作 Table 名稱的方式來還原,
因為有可能建立重複的 Table 名稱, 到時候還原的方式是以後刪除的先還原,
BIN$1234567890==$0 數字越大表示越晚刪除的物件.

遇到重複 Table 的情況時, 可以還原的時候變更 Table 的名稱,
flashback table [刪除的 Table 名稱] to before drop rename to [要還原的 Table 名稱];

當然也可以打開或關閉資源回收筒的功能:
alter session set recyclebin = off;
alter system set recyclebin = off;

因 TIPTOP 執行批次作業或是報表的時候,都會產生暫存 Table 的,
像是 TT 開頭+一串數字+_文字 的 Table 就是暫存時產生的資料,以後也不會再用到了。
有時候也不會 DROP 掉一直存留著,或是就算 DROP 也會一直留在回收筒,
只要在 Oracle 建立排程,定時把這些垃圾都清一清吧~
declare
    str varchar2(1000);
    num number;
    begin
   --刪除 TEMP TABLE
    for i in(select table_name from user_tables ,user_objects where table_name like 'TT%' and created <= sysdate - 3 and table_name = object_name and object_type = 'TABLE' and tablespace_name = 'TEMPTABS')
    loop
    str:='drop table '||i.table_name||' purge ';
    execute immediate str ;
    commit;
   end loop;
   --清空回收筒
    for i in(select object_name,droptime from user_recyclebin where droptime < to_char(sysdate-3,'YYYY-MM-DD hh:mm:ss') and type= 'TABLE' order by droptime)
    loop
    str:='purge table "'||i.object_name||'" ';
    execute immediate str ;
    commit;
   end loop;
   end;

2011年3月16日

TIPTOP 和其他系統整合的架構

說到系統整合, 大家應該是惟恐不及吧~~
變成盡量讓其他的系統廠商去思考如何和 ERP 系統來整合,
但越來越多系統的話, 不就有越來越多的整合方式, 在管理上或問題釐清就變的複雜了.

在整合外部多種系統後發現, 比較容易和確實的就屬中介 Table 是最好的方式,
可以避免外部的系統直接寫入 ERP 的資料庫, 可以建立存取權限.
也讓系統整合能夠有足夠資料去稽核正確性.

再來就是系統整合的架構囉~

建立外部系統的 Oracle user account , 並在此 DB 帳號建立要讀取 ERP 的 readonly view ,
之後要取得 ERP 系統的資料, 就可以直接連到資料庫去 Select .
如果是要存入或異動資料到 ERP Database, 需要透過中介 Table 方式進行,
外部系統先寫入到中介 DB 的 Table (需先跟廠商溝通好整合的資料 Schema) ,
然後再由 ERP 用 cron job 或是手動的方式執行程式去建立或異動資料,
確認資料異動正確或錯誤, 回寫狀態碼給中介 DB 的 Table,
外部程式再去 Check 整合資料是否完整和正確.

整合系統讓權責能夠區分清楚, 避免以後維護和責任確認可以比較清楚和容易.

以 APS 的範例如下:
1. 和 APS 系統整合, 所以建立在 Oracle 建立 aps 的帳號名稱.
    使用 sys 帳號和 sysdba 方式登入
    conn sys/sys_dsc as sysdba;
    --create user
   CREATE USER aps
     IDENTIFIED BY aps
     DEFAULT TABLESPACE DBS1
     TEMPORARY TABLESPACE TEMP
     PROFILE TIPTOPGP
     ACCOUNT UNLOCK;
     -- 2 Roles for aps
     GRANT RESOURCE TO aps;
     GRANT TIPTOPGP TO aps;
     ALTER USER aps DEFAULT ROLE ALL;
     -- 5 System Privileges for aps
     GRANT UNLIMITED TABLESPACE TO aps;
     GRANT CREATE VIEW TO aps;
     GRANT CREATE TABLE TO aps;
     GRANT CREATE SYNONYM TO aps;
     GRANT CREATE SESSION TO aps;
     -- 1 Object Privilege for aps
     GRANT SELECT ON SYS.V_$SESSION TO aps;

2. 建立 aps 所要讀取 ERP 的 Table 資料 readonly view .
    我假設是全部 DS 裡面的 table 都可以讀取.
    select 'CREATE OR replace view aps.' || table_name || ' as
               select * from ds.' || table_name || ' with read only;'
      from  dba_tables
    where owner = 'DS'
    order by 1
   
    再把 SQL 執行後的資料, 全部複製再執行.
    或一個一個 table 加上去
    CREATE OR replace view aps.XXX_FILE as select * from ds.XXX_FILE with read only;

3. 在 aps Database 中建立中介 Table 的 Schema . 
    APS 會回寫工單和請購單, 所以我就叫 aps_sfb_file 和 aps_pml_file .

4. 使用者完成外部 APS 系統後, 回寫工單和請購單的資料到 ERP 系統,
    新增 APS 接口的程式, 去讀取中介 Table 和產生 ERP 的單號 .
    完成後回寫狀態到中介 Table .

2011年3月9日

TIPTOP Genero 呼叫本機的程式來執行

TIPTOP 導入之後, 再來就是一連串的外部程式整合囉~~
能夠提供公司全資訊化的服務, 才是 IT 價值所在.

最近想辦法整合條碼的設計軟體,
讓 TIPTOP 能夠抓取資料, 呼叫外部條碼軟體並丟參數值, 由條碼軟體列印出來.
這樣可以讓設計條碼的人就不是 IT 囉~~(這才是我的目的~~)
也簡化了作業的流程, 和日後的維護工作.

不過要如何做呢??
可以參考 cl_client_app.4gl 的程式,
就可以發現 GDC 是可以呼叫 Genero 稱之為"前端"的程式段, ( ui.Interface.frontCall )
只要在要呼叫外部軟體的程式上,加上 cl_open_prog("Shell的程式名稱","參數") ,
如果是多參數的話用 | (pipe) 來分隔.

以範例來說, 我是呼叫"記事本" (notepad) ,
然後檔案的位置在本機的 C:\TIPTOP\xxxxx.TXT ,
加上:

LET status = cl_open_prog("notepad","C:\\TIPTOP\\xxxxx.TXT")

這樣就完成啦~~~試試看吧~~~

2011年2月28日

多角貿易拋轉多倉儲批出貨收貨入庫單的問題

應該都知道出貨單可以多倉儲批出貨吧~
但收貨和入庫單是否可以多倉儲批呢?
當然是不行啦~ 只有出貨才能多筆倉儲批的數量合併成出貨單的同一項次.
所以拋轉到收貨單時變成了倉儲批的欄位是空白的. (那多角貿易就不能確保批號一致了)

問題來了, 這樣多角貿易不就不能用多倉儲批出貨了嗎?
難道要在出貨單一筆一筆 key 要出貨的資訊 ?
如果是鼎新的標準程式, 這是必然的, 必須出貨單產生多項才能避免此問題發生.
因為出貨單的項次和拋轉後的收貨入庫單項次是鎖死的. 必須要一致.
唉~

不過我們可以做以下的修改, 修改 saxmp900.4gl 的程式,
多抓 ogc_file ,並項次能夠是依 ogc_file 排序來自動編號, 這樣不就好了嗎?

1. 首先需要增加抓取 ogc_file 的資訊, 並只在中斷點的時候才做拆多倉儲批控管.

 2. 再來就是自動編號和產生多倉儲批的資訊囉~

3. 試拋看看吧. 看似很難其實很簡單吧.

要注意喔~ 修改確認段時, 就要注意取消確認段, 當然拋轉的程式也要注意拋轉還原囉~
所以記得也要改拋轉還原的程式啦~ 不然標準程式可是會拋轉還原失敗的.

2011年2月22日

請採購部門費用預算管控機制

相信每一家公司都是以營利為目的是吧?
不止要開源-增加訂單和出貨量,節流-控制部門的花費也是必要的管理手段.

如何讓 TIPTOP 實現公司部門費用的預算管理機制呢?
其實只是把功能打開就可以用囉~~
不過最重要的還是: 請購人員需要知道購買何種商品或是服務,
需要入到那一個費用的"會計科目",
入錯費用或是隨意輸入的話,當然就沒有管控的意義啦~

再來就是預算是以"年"為單位,
所以跨年度的預算的請購單, 當然最好是重 key 囉~ (有寫入年度的欄位就不能再續用了.)

如何開啟預算的呢?

1. 先匯入部門預算的資料. (相信應該原本就有在維護了吧~)

2. 會計科目開啟部門預算的控管.

3. 再來就是針對單別來做預算的功能開啟.

4. 之後就是各單位請購單, 記得在單身要維護部門的預算資料囉~~

PS : 部門費用預算的管制, 流程上會有一些程序上的問題,
       盡量能夠保有管控的機制才有意義.

2011年2月21日

如何查詢 TIPTOP 系統的所有欄位的內容和定義

我們在維護 TIPTOP 程式的時候, 會發現 SQL 指令要查詢那一個欄位.
用 p_zta 實在是不方便, 工作效率也不佳.

TIPTOP 在資料庫有紀錄欄位定義的 Table ,
以後只要查詢這一個 Table 就好啦~ 就可以快速查到你要的欄位定義和內容了.

範例參考 :
select * from ds.gaq_file
where gaq02 = '0'   --語言別
and gaq01 like '%ima%'   --Table 的代號
order by 1

是不是就方便許多了呢?

依不同國家的使用者設定不同時區

因 TIPTOP 系統是屬於 Clinet-Server 的架構, 如圖所示 :

也就是說, 所有的使用者端都是連線到伺服端裡面來執行程式,
伺服端執行完成後, 再把執行的結果的畫面傳回到使用者端,
所以 TIPTOP 登入的時間也就不是使用者本機的設定了,
而是 TIPTOP 主機 User profile 的設定.

要如何針對使用者讓顯示的時間是正確的呢?
很簡單, 只要針對 user 在 .profile 檔裡,
加入一行 export TZ=GST+8 就可以了 (以美國西岸為例) ,
再看時區為何來調整要加減多少.

但要注意喔~ .profile 檔不能是 link 的 file , 不然就所有使用者全部跟著改啦~
所以 .profile 檔要先移除 ln 再重新建立.

2011年2月17日

TIPTOP 主機定期備份 Oracle 資料 & TIPTOP 程式, 備份篇

相信 TIPTOP 主機的備份, 大多還是都存在 /u1/backup 目錄裡面,
而且只放一週的資料而已吧~~備份資料還有包含在正式區的測試資料庫...等。
再加上 TIPTOP GP 5.x 開始, 報表轉為 Crysal Report ,
需另外新增一台 IIS Web Service 的 CR 報表伺服器,
備份資料變的分散無法集中,再加上 Linux 沒有開啟 Samba 的服務,  (也比較安全一點)
備份上更是難以管理和紀錄.

好加在還有 FTP 的功能,提供資料上傳和下載的工具將資料移轉到另一台主機.
方便的做法當然是利用 CR 主機的 IIS 服務, 另外再加掛 ftp server 的功能囉~~
這樣備份就變的輕鬆而完整啦~~

TIPTOPGP 主機 --------經由 ftp-------->  CR 主機 ----------> 磁帶或遠端儲存媒體.
 (tar 程式 + exp Oracle DB)              (cr 報表檔)          (可以利用 rar 進行壓縮)

隨著時代不斷的進步,硬碟容量也比以前大很多囉,所以備份到硬碟也是可行的方法之一.
以下就是我的備份方式.皆用排程的方式來自動執行.省時又省力.

1. 上傳 ftp 的指令

2. 自動備份 Oracle 的匯出指令,首先要載入環境變數,讓排程會自動執行

3. 備份資料,可以排除一些 patch 和比較沒有用的資料檔, 節省備份時間和空間

4. 再來就是設定工作排程囉~~用 root 帳號登入後, 執行 crontab -e 來設定排程作業,
    範例說明是設定為早上 7 點自動執行.

5. 再補充一個 rar 的指令,讓資料能夠壓縮起來,資料庫的檔案大小可是差異很大的喔~~~
    可以壓縮大概 80% 的容量...100 MB 壓縮起來剩 20 MB 的磁碟空間大小.

當然囉~~市面上也有很多備份工具可以提供完整的 solution, 不過經濟又實惠的作法也是值得參考的.


2011年2月1日

如何用一個 SQL 來查 BOM -- 遞迴查詢

常常在設計連結資料庫程式的時候, 階層式架構的 Table 大致上都是母子在同一行的樣式來設計,                

資料庫 Table 是容易設計,不過呢? 要把所有的階層展開時,程式就不容易寫,且執行效能也低落,
其實 SQL 是可以做遞迴查詢的,不但不用寫程式一直 WHILE 跑迴圈 , 而且執行效率更快.

以下是 TIPTOP 5.x 的多階 BOM 的 Oracle 範例:

select level,bmb02,bmb01,bmb03,bmb04,bmb05 from bmb_file,bma_file,ima_file
where (bmb05 > sysdate or bmb05 is null)
  and (bmb04 < sysdate or bmb04 is null)
  and bma01 = bmb01 and bmaacti = 'Y'
  and bma01 = ima01
connect by  bmb01 = prior bmb03 and (bmb05 > sysdate or bmb05 is null) and (bmb04 < sysdate or bmb04 is null) and bmaacti = 'Y'
start with ima01 = '料件編號' and (bmb05 > sysdate or bmb05 is null) and (bmb04 < sysdate or bmb04 is null) and bmaacti = 'Y'

抓取最新的 BOM , 有生失效日的判斷 , 重點是還有階層數喔~~
可以試試看.

再提供一些相關的指令:
LEVEL:階數
SYS_CONNECT_BY_PATH(欄位,符號):可以列出整個路徑出來,符號用 -> 會比較清楚
CONNECT_BY_ISLEAF:可以判斷是不是最底層
CONNECT_BY_ROOT(欄位):顯示最上層的資料欄位
CONNECT_BY_ISCYCLE:判斷是否有迴圈
NOCYCLE:加在 CONNECT BY 後面有迴圈的就不繼續往下,可配合 CONNECT_BY_ISCYCLE 使用

2011年1月18日

同步不同 DB 的 Table -- 設定/取消 Oracle 的 Synonym 連結

公司有時需要每一個資料庫的 Table 都參考到 ds 或是母公司的資料庫,
像是權限管理預設就是 zx_file、zy_file、zw_file 都參考 ds 的資料庫,

因此要如何設定 Synonym 呢??

1. 先把原本的 table 刪除
    drop table xxx_file;

2. 再建立 synonym
    CREATE OR replace synonym DBUSER.xxx_file for ds.xxx_file;

那如果是要取消 synonym 呢??

1. 先把原本的 synonym 取消
    drop synonym  DBUSER.xxx_file;

2. 再把 table 建立回來,再加上設定為 PUBILC 可以讓其他 user 存取
    (使用 DB table 複製的功能會比較快)
    create table DBUSER.xxx_file as select * from ds.xxx_file where rownum = 1;
    delete DBUSER.xxx_file;
    grant all on sfa_file to public;

2011年1月1日

Crystal Report 在 IE 8 跳頁會錯亂

當多個 CR 報表產出顯示在 IE 8 時, 任一報表按下一頁,
結果會發現怎麼 A 報表下一頁會接到 B 報表 ??
原來是因為 IE 8 的核心預設是會共同 Frame 的關係.

共同 Frame 好處,記憶體的耗用會比較低 (還記得之前的 KKMAN,類似的作法),
不過現在電腦都 1G , 2G 以上的 RAM 了, 對 IE 差不多只需 30~40 MB 的記憶體,已經相當足夠了,因此可以把 Frame 區分開來.

加入 Register 到電腦後,重新開機即可生效.

把下面文字的部份,儲存成 xxx.reg ,再執行.

Windows Registry Editor Version 5.00
[HKEY_CURRENT_USER\Software\Microsoft\Internet Explorer\Main]
"FrameMerging"="0"

2010年12月15日

查出所有 TIPTOP 使用者的所有程式權限清單

公司可能有規定需要定期去檢視 TIPTOP 系統權限是否設定正確.
因此提供 SQL 指令把所有人員的 TIPTOP 系統權限清單列示出來,
就方便各主管去檢視囉~~

參考以下指令 :
select zx01,zx02,zx03,zx04,'','',zxw04,gaz03,zxw05 from zx_file,zxw_file,gaz_file
where zx01 = zxw01
and zxw03 = 2
and zxw04 = gaz01(+)
and (gaz02 = 0 or gaz02 is null)
union
select zx01,zx02,zx03,zx04,zy01,zw02,zy02,gaz03,zy03 from zx_file,zxw_file,zw_file,zy_file,gaz_file
where zx01 = zxw01
and zxw03 = 1
and zxw04 = zy01
and zxw04 = zw01
and zy02 = gaz01(+)
and (gaz02 = 0 or gaz02 is null)
order by 1,5

2010年12月1日

職委會在 TIPTOP 如何建置 ?? 多帳別設定.

相信每一間公司都有職委會慰勞大家在辛苦的工作能放鬆一下心情,
不過職委會是現金流入流出制的會計原則,
一般只會在總帳切傳票做流水帳記錄,
新增一個資料庫區分 BU 反而顯的殺雞用牛刀的感覺,
可以試試看 TIPTOP 5.x 版以上的多帳別的功能,
輕輕鬆鬆就可以達成囉~~沒事跟會計人員泡茶聊天吧~~

步驟:
1. agli101 帳別資料維護, 新增福委會帳別.

2.agli102 科目資料明細維護,加入職委會所需的會計科目.

3.重點來了,如何讓會計人員可以輸入傳票呢??
   在 p_zz 加入新程式, 記得要帶參數,以範例職委會帳別是 02

4.之後就有專屬於職委會的傳票作業囉~~~所有報表也可以輸入帳別 02 即可以執行.

簡單吧~~

2010年11月25日

新進 IT 人員的 TIPTOP 系統帳號設定

公司應該很少 TIPTOP 系統從頭到尾都交由一個人負責吧~~
ERP 系統算起來也是一套大型的系統.
因此當新增 IT 幫手的時候, 權限要如何設定才比較好呢?
又可以避免非 IT 人員隨意的存取 TIPTOP 檔案或是資料.

記得要先把 TiptopGP 主機的 ftp 登入帳號設限喔~~只能允許 IT 人員 FTP 登入而已.
修改 /etc/vsftpd/vsftpd.conf 加上兩行設定
userlist_enable=YES
userlist_deny=NO
userlist_file=/etc/vsftpd/user_list
新增文字檔, 並將 IT 人員帳號加入 /etc/vsftpd/user_list 檔案中.

加入 IT 人員的 TIPTOP 維護帳號步驟如下 :

1. 新增 Linux 帳號和 Tiptop 帳號 (p_zx).

2. 加入 FTP 登入的權限
     編輯 /etc/vsftpd/user_list

3. 加入 oracle group 的權限
      usermod -G dba USER_NAME
4. 置換 .profile 檔
      不是用 cp /u1/usr/tiptop/.profile . 的指令來蓋掉喔~~
      如果有設 link .profile 檔案的話..就出包啦~~
      所以要先執行 rm .profile , 把 .proifle 的 ln 刪掉.
      再來就是 cp /u1/usr/tiptop/.profile . 才會有專屬於 IT 人員此帳號的 .profile

5. 最後就是 vsftpd 重啟囉~~
     /etc/init.d/vsftpd restart