2012年12月23日 星期日

需要執行物件,才能進行這項操作

人客的環境最近更新的informix ODBC的版本,由原來的3.11換成3.70 TC4。
在做DTS資料轉入時出現了以下的錯誤

步驟錯誤來源: Microsoft Data Transformation Services (DTS) Package
步驟錯誤描述:需要執行物件,才能進行這項操作
 (Microsoft Data Transformation Services (DTS) Package (80040005): 提供者產生的程式碼發生執行例外:  EXCEPTION_ACCESS_VIOLATION)
步驟錯誤碼: 80040005


Step Error Source: Microsoft Data Transformation Services (DTS) Package
Step Error Description:Need to run the object to perform this operation
(Microsoft Data Transformation Services (DTS) Package (80040005): Need to run the object to perform this operation
) (Microsoft Data Transformation Services (DTS) Data Pump (80040005): Code execution exception: EXCEPTION_ACCESS_VIOLATION)
Step Error code: 80040005


一如往常,這個錯誤訊息令人丈二金剛摸不著頭腦,用中文google半天,找不出什麼蛛絲馬跡可以測。換成英文去查,也都和遇到的狀況不太相同。

後來直接VNC過去,看到ODBC的設定才發現原來他的機器中,相同名稱的DSN,一個放在【使用者資料來源名稱】下使用的是舊版的DRIVER,另一個放在【系統資料來源名稱】下使用的是新版的DRIVER。

新舊版本同時存在沒什麼問題,但DSN名稱相同,我想這就讓DTS搞混了吧。


移除掉舊版的DSN,DTS就正常囉。

2012年12月15日 星期六

AS2000, Cannot connect to the repository.

在人客的主機上,做了幾件事
1.更改了sa 的密碼
2.更改DTS封裝檔中,動態屬性工件使用\\127.0.0.1\myWork$ 隱藏目錄 (因為資安限制,要把Server服務關掉了,所以無法再使用網芳)

好不容易把DTS都改完了, 接著要進入分析伺服器進行維護時,
哇列,剉屎....

分析管理員竟然無法連線...出現了以下這個錯誤

Cannot connect to the repository.

OLAP server: MYAS2000

Error:
[Microsoft][ODBC 驅動程式管理員] 找不到資料來源名稱且未指定預設的驅動程式


[Microsoft][ODBC Driver Manager] Data source name not found and no
default driver specified
 
什麼跟什麼啊...
根本還沒動到AS的任何東西啊.
而且關ODBC什麼事啊. AS repository 也不是用sa的帳號進行連線.

另外也測試了一下系統中,讀取MDX的功能, 明明連到AS就很正常..

但要進行partition process或者連線到分析伺服主機時, 就是有錯.

前前後後花了近3個小時GOOGLE...反覆關機開機測試..也把sa密碼改回來..

就是一直出錯.

最後心想,那重裝一下sql sever AS sp4看看好了, 結果竟然就OK了.

TMD. 這是我最後的結論. 但那3個小時實在是讓我嚇了一身冷汗啊。

2013/01/08 後記:
今天在公司的測試環境上,也出現了一樣的狀況,但訊息顯示為
[Microsoft][ODBC 驅動程式管理員] 資料來源名稱太

幸好有之前的經驗,先重裝AS SP4,馬上就解決了.

2012年11月10日 星期六

informix 11.5 charindex

informix 11.5(含)版本以前沒有提供charindex功能.
因為想要依傳入的尋找 字元組合來取得符合的position,所以為了方便,自已寫了一個湊合著用
以下function是區分大小寫尋找的..

--DOP FUNCTION uf_charindex;
/*
in_str:被搜尋的字元

in_delimiter;尋找字元
in_occurence:被找到的次數
in_exact:是否依in_delimiter逐字尋找 

*/

CREATE FUNCTION uf_charindex
(in_str VARCHAR(255),in_delimiter VARCHAR(255)
,in_occurence INTEGER, in_exact CHAR(1) )
RETURNING INTEGER ;

DEFINE q_pos INTEGER;
DEFINE i INTEGER;
DEFINE q_len INTEGER;
DEFINE q_time INTEGER;
DEFINE j INTEGER;
DEFINE q_len_del INTEGER;
DEFINE q_found CHAR(1);
DEFINE q_str VARCHAR(255);
DEFINE q_step INTEGER;

IF nvl(in_occurence,1) <=1 THEN
 LET in_occurence = 1;
END IF;

LET q_time=0;
LET i = 1;
LET q_pos = 0;
LET j = 1;
LET q_found = '0';
LET q_step = 1;
LET q_len = char_length(in_str);
LET q_len_del = char_length(in_delimiter);

--是否依in_delimiter逐字尋找符合字
IF in_exact = '1' THEN --完全符合
    LET q_step = q_len_del;--先記下完整字長度
    LET q_len_del = 1; --最外層只跑一次即可
END IF ;

FOR j = 1 TO q_len_del STEP 1
   LET i = 1;
   LET q_time = 0;
   LET q_pos = 0;
   LET q_found = '0';

   --取比較字(若in_exact='1'則全部符合)
   IF in_exact = '1' THEN
      LET q_str = in_delimiter;
   ELSE --否則逐字找直到找到in_occurence為止
      LET q_str =  substr(in_delimiter,j,1);
   END IF;
   FOR i = 1 TO q_len STEP 1
      IF substr(in_str,i,q_step) = q_str THEN
         LET q_pos = i;
         LET q_time = q_time +1;
         --找到後若與指定出現次數相符則結束
         IF q_time = in_occurence THEN
            LET q_found = '1';
            EXIT FOR;
         END IF;
     END IF;
   END FOR;
   IF q_found = '1' THEN
      EXIT FOR;
   END iF;
END FOR;

RETURN q_pos;

END FUNCTION;




測試一下

SELECT FIRST 1 uf_charindex("臺東縣臺東市","縣市",1,'0') FROM systables;
傳回3

SELECT FIRST 1 uf_charindex("臺北市信義區","縣市",1,'0') FROM systables;
傳回3

SELECT FIRST 1 uf_charindex("臺東縣臺東市","市縣",1,'0') FROM systables;
傳回6

SELECT FIRST 1 uf_charindex("This is a book","book",1,'1') FROM systables;
傳回11

SELECT FIRST 1 uf_charindex("This are a lot of bOOks","O",2,'1') FROM systables;
傳回21


SSRS 2008 R2 網站很慢

下載了Report Builder 3.0進行測試
安裝過程中,需要設定report server
結果在進入 http://servername/reportserver 網頁的過程中,好慢好慢.

試了半天,以為是自已的SSRS 2008 R2安裝有問題.

結果竟是因為防毒軟體NOD32 Web存取防護中,HTTP、HTTPS掃描設定中啟用了HTTP檢查.
雖然試著位址管理想要排除本機HTTP的掃描. 但似乎都無效??

只好先關閉啟用了HTTP檢查的功能.

關閉後,Report Server變得飛快..當然Report Builder  Preview也變快了

另外, 在http://localhost/reports/ 下, 按下報表產生器後, 出現了以下訊息

若使用報表產生器,您必須在此電腦上安裝.Net Framework 3.5 
 
但本機的.net framework明明就是上到了4.0
 
結果在切換成相容性檢視後,就正常了.
 
雖然我之前sql server 2008 r2安裝的是英文版,
但report manger web site的介面是跟著IE的語言設定而定的,所以介面就出現了中文
 
如果想要變回英文,則在IE網際網路選項中, 一般頁籤最下方的語言鍵,新增英文[en]語言,並調整序順到第一位

即可切換為英文介面.

另外,由 http://localhost/reports/ 下安裝報表產生器會自動安裝中文版report builder 3.0
 
若要使用英文版介面,則需再下載安裝英文版report builder後,再自行開啟即可.
 
 
 

2012年10月31日 星期三

informix dateadd


informix 11.5模擬sql server dateadd, 但傳入及傳出皆為國曆日期數字

CREATE FUNCTION ifx_f_dateadd
(in_type varchar(5),in_date integer, in_diff integer )
RETURNING integer ;
DEFINE p_date date;
DEFINE p_day integer;
--轉為西元日期
SELECT (((substr((in_date+19110000)::char(8),1,4))||'-'||
               (substr((in_date+19110000)::char(8),5,2))||'-'||
               (substr((in_date+19110000)::char(8),7,2)))::date)
  INTO p_date
  FROM empty;
--改成以下方式來轉換
--因為上述方式會隨著DB版本或onconfig中日期格式指定而變,可能會有錯誤.

SELECT (TO_DATE((in_date+19110000)::char(8),'%Y%m%d'))
  INTO p_date  FROM empty;


IF UPPER(in_type) IN ('DAY','D') THEN
   SELECT p_date  + in_diff into p_date from empty;
ELSE IF UPPER(in_type) in ('MONTH','M') THEN
   SELECT p_date  + in_diff units MONTH into p_date from empty;
  --改成以下方式,因為1011031 取下月時會有The result of a datetime computation is out of range.的錯誤,
  --以下方法閏年也適用
 SELECT add_months(p_date,in_diff ) into p_date from empty;
ELSE IF UPPER(in_type) IN ('YEAR','Y' ) THEN
   SELECT p_date + in_diff units YEAR  into p_date from empty;
  --以下方法閏年也適用 

SELECT add_months(p_date,in_diff*12) into p_date from empty;

END IF; END IF; END IF;  --這一串END IF; 搞了我一個小時才知道要這樣寫....

  SELECT ((substr(p_date,1,4)::integer)-1911)||
           (substr(p_date,6,2))||(substr(p_date,9,2))
     INTO p_day
     FROM empty;
RETURN p_day;

SELECT TO_CHAR(p_date ,'%Y%m%d')::INTEGER - 19110000
  INTO p_day
  FROM empty;

END FUNCTION; 


測試,

CREATE TABLE empty (col1 INT);
INSERT into empty VALUES(0);

select ifx_f_dateadd('y',1010814,-1)  FROM empty;

回傳1000814

select sr_f_dateadd('m',1011031,1)  FROM empty

回傳1011130

select sr_f_dateadd('y',1010229,-1)  FROM empty

回傳1000228


ps.2012/08/14寫第一版,3個月後,知識長進,大改一番.

sql cluster firewall應開哪些port?

人客的資安開始規定,所有主機都要開啟Windows 防火牆,所有輸入都要以例外的方式來設定.

雖然網管已有一層防火牆,但敵人就在你身邊,自已人也不可靠啊...

主機間有二台主機做sql server cluster (db server name = sql-cluster) , 在開啟了防火牆後, 另一台主機無法以sql-cluster進行連線.
但使用IP連線卻是可以的

試了半天,除了在二台sql cluster db主機要開1434,1433的port之外
還得要加開137,138,139,445 四個port  才能使用server name 來連線

這些port在例外中已有定義,為檔案及印表機共用,只要勾選即可

另外,應在變更領域中加入IP自訂清單比較保險.

2012年10月30日 星期二

IIS Worker Process問題

在一台windows 2003 R2標準版環境,建立了一個.net 4.0的網站.
結果每隔一段期間, 就會出以下的錯誤,

szAppName : w3wp.exe     szAppVer : 6.0.3790.3959     szModName : unknown    
szModVer : 0.0.0.0     offset : 62cbb9ce    

C:\DOCUME~1\ADMINI~1\LOCALS~1\Temp\1\WERdaef.dir00\w3wp.exe.mdmp
C:\DOCUME~1\ADMINI~1\LOCALS~1\Temp\1\WERdaef.dir00\appcompat.txt


1.重啟W3SVC (Net Stop W3SVC and Net Start W3SVC)
2.清除C:Documents and Settings\Administrator\Local Settings\Temp
3.重啟iis (iisreset)

iisreset後,一切又都正常

後來建立一個新的應用程式集區,將網站原來使用的DefaultAppPool改成新的集區後,目前看來正常了...

 我想應該是預設應用程式集區原本是.net 2.0網站使用, 而我的網站是.net 4.0, 二個錯亂了吧??

2012年10月23日 星期二

Informix catalogs 讀取資料表及欄位資訊


 --資料表
SELECT * FROM systables WHERE tabid > 99
;
--資料表及欄位
SELECT * FROM systables a INNER JOIN syscolumns b
    ON a.tabid = b.tabid
WHERE a.tabid > 99
;
--資料表欄位及類型 (參考此dbform此篇討論 )
SELECT t.tabname,c.colno, c.colname[1,20] column,                          
    CASE coltype                                                              
        WHEN 0 THEN 'char(' || TRIM(CAST (c.collength AS CHAR(5))) || ')'     
        WHEN 1 THEN 'smallint'                                                
        WHEN 2 THEN 'integer'                                                 
        WHEN 3 THEN 'float'                                                   
        WHEN 4 THEN 'smallfloat'                                              
        WHEN 5 THEN 'decimal(' ||                                             
            TRIM(CAST(TRUNC(c.collength/256) AS VARCHAR(8)) || ',' ||         
            CAST(c.collength - TRUNC(c.collength/256)*256 AS VARCHAR(8))) || ')'
        WHEN 6 THEN 'serial'                                                  
        WHEN 7 THEN 'date'                                                    
        WHEN 8 THEN 'money(' ||                                               
            TRIM(CAST(TRUNC(c.collength/256) AS VARCHAR(8)) || ',' ||         
            CAST(c.collength - TRUNC(c.collength/256)*256 AS VARCHAR(8))) || ')'
        WHEN 9 THEN 'null'                                                    
        WHEN 10 THEN 'datetime'                                               
        WHEN 11 THEN 'byte'                                                   
        WHEN 12 THEN 'text'                                                   
        WHEN 13 THEN 'varchar(' || TRIM(CAST(c.collength AS CHAR(5))) || ')'  
        WHEN 14 THEN 'interval'                                               
        WHEN 15 THEN 'nchar(' || TRIM(CAST(c.collength AS CHAR(5))) || ')'    
        WHEN 16 THEN 'nvarchar(' || TRIM(CAST(c.collength AS CHAR(5))) || ')' 
        WHEN 17 THEN 'int8'                                                   
        WHEN 18 THEN 'serial8'                                                
        WHEN 19 THEN 'set'                                                    
        WHEN 20 THEN 'multiset'                                               
        WHEN 21 THEN 'list'                                                   
        WHEN 22 THEN 'row'                                                    
        WHEN 23 THEN 'collection'                                             
        WHEN 24 THEN 'rowdef'        
        WHEN 40 THEN 'lvarchar'                                                
        WHEN 256 THEN 'char(' || TRIM(CAST(c.collength AS CHAR(5))) ||        
            ') not null'                                                      
        WHEN 257 THEN 'smallint not null'                                     
        WHEN 258 THEN 'integer not null'                                      
        WHEN 259 THEN 'float not null'                                        
        WHEN 260 THEN 'smallfloat not null'                                   
        WHEN 261 THEN 'decimal('||                                            
            TRIM(CAST(TRUNC(c.collength/256) AS VARCHAR(8)) || ',' ||         
            CAST(c.collength - TRUNC(c.collength/256)*256 AS VARCHAR(8))) ||  
            ') not null'                                                      
        WHEN 262 THEN 'serial not null'                                       
        WHEN 263 THEN 'date not null'                                         
        WHEN 264 THEN 'money(' ||                                             
            TRIM(CAST(TRUNC(c.collength/256) AS VARCHAR(8)) || ',' ||         
            CAST(c.collength - TRUNC(c.collength/256)*256 AS VARCHAR(8))) ||  
            ') not null'                                                      
        WHEN 265 THEN 'null not null'                                         
        WHEN 266 THEN 'datetime not null'                                     
        WHEN 267 THEN 'byte not null'                                         
        WHEN 268 THEN 'text not null'                                         
        WHEN 269 THEN 'varchar(' || TRIM(CAST(c.collength AS CHAR(5))) ||     
            ') not null'                                                      
        WHEN 270 THEN 'interval not null'                                     
        WHEN 271 THEN 'nchar(' || TRIM(CAST(c.collength AS CHAR(5))) ||       
            ') not null'                                                      
        WHEN 272 THEN 'nvarchar(' || TRIM(CAST(c.collength AS CHAR(5))) ||    
            ') not null'                                                      
        WHEN 273 THEN 'int8 not null'                                         
        WHEN 274 THEN 'serial8 not null'                                      
        WHEN 275 THEN 'set not null'                                          
        WHEN 276 THEN 'multiset not null'                                     
        WHEN 277 THEN 'list not null'                                         
        WHEN 278 THEN 'row not null'                                          
        WHEN 279 THEN 'collection not null'                                   
        WHEN 280 THEN 'rowdef not null'                                       
        ELSE CAST(coltype AS CHAR(10))                                        
    END datatype                                                              
FROM systables t INNER JOIN syscolumns c
  ON t.tabid = c.tabid                                        
WHERE t.tabid > 99                                    
ORDER BY 1,2                 
;


2012年10月5日 星期五

Excel openrowset 奇怪的問題(再續)

一段寫在stored procedure 的excel openrowset 今天又出問題了.

無法初始化連結伺服器'(null)'的OLE DB提供者 'Microsoft.Jet.OLEDB.4.0'的資料來源物件

這個問題困擾了好久, 有時重啟sql server 就好, 有時得要重開機.

很困擾.

查到這篇文章

OPENROWSET (T-SQL) – Sometimes You Have to Stop and Smell the Roses
講到權限問題, SQL Server service accounts必需要有TEMP directory的讀寫權限.

查看了一下, SQL SERVER是使用本機帳(local system) 號啟動的.

於是乎,再參考一下這篇文章Location of user account temp dir for service accounts

找到使用者對應
  • Local Service (NT AUTHORITY\LOCAL SERVICE)
  • Network Service (NT AUTHORITY\NETWORK SERVICE)
  • Local System (NT AUTHORITY\SYSTEM)
接著 在C:\Users\user.name\AppData\Local\Temp 安全性的檢查讀寫權限是否都已開放.

相關的討論在napierm 的回文中,也有說明.

So, the fix is to do one of the following:
 - Change the SQL Server's service Log On to "Local System account" OR
 - Provide full access to the "\Documents and Settings\NetworkService\Local Settings\Temp" for any account that needs to run the queries.

 希望這是最後一次搞這個問題了.

2012年9月26日 星期三

桌機 Checking NVRAM

有一台ASUS桌機,歷史優久2003年安裝WINDOWS 2003後使用到現在.

現在想來,這台是當初用來做SQL 2000 第一個BI的案子的, 後來好像都沒有重裝過OS耶,
前幾年他一直靜靜的躺在一旁, 這二年,我把他擦乾淨後,加了2G的RAM後,平常上班時間,就這樣開著.

今天一來把他開起來後, 一直停在Checking NVRAM 的畫面

重開了好幾次也是如此.

後來想說先進去BIOS看一下設定. 結果進入BIOS後再重開,

咦....就自動好了.  真是奇怪

2012年9月18日 星期二

Informix 重設Serial 欄位值

在SQL Server 是下 DBCC CHECKIDENT (youTableName, reseed, 1);

在Informix 找到幾種方法可以做
1.drop table and recreate  (廢話)

2.insert into yourTable(SerialCol)  values(2147483647);
    truncate table  yourTable;
3.alter table yourTable modify(SerialCol integer);
    truncate table yourTable; 
    alter table yourTable modify(SerialCol serial);

2012年9月14日 星期五

informix DBINFO function

--取得主機名稱
SELECT FIRST 1 DBINFO('dbhostname') FROM systables;

--取得informix db 版本 (IBM Informix Dynamic Server Version 11.50.UC7)
SELECT FIRST 1 DBINFO('version','full') FROM systables;

---取得時間, 很特別的是, 前者會取得目前真正的時日
--但CURRENT在同一個stored procedure中,不論使用幾次,都是一樣的
--所以為了log方便,應採用前者
SELECT DBINFO('utc_to_datetime', sh_curtime) , CURRENT  FROM sysmaster:sysshmvals;

--取得Serial 欄位流水號,必需緊接在insert into sql後使用
insert into table values (1,2,3);
SELECT FIRST 1 DBINFO('sqlca.sqlerrd1') from systables;
 
--取得呼叫此方法前最後sql的影響筆數
SELECT FIRST 1 DBINFO('sqlca.sqlerrd2') from systables ;

2012年9月13日 星期四

informix 序號欄位取值

.net 中,如何取得informix table 新增後serial column  的流水號,然後再傳給另一個table進行使用

--建立測試表
create table  bevtest
    ( col1 serial,
      col2 varchar(50) 
    );

begin work;

insert into bevtest values(0,'test');


--此行需緊接著insert into table 後執行
select dbinfo('sqlca.sqlerrd1') as sn from empty into temp tmpsn with no log;

insert into bevtest select 0,sn||' this is sn"  from tmpsn;

drop table tmpsn;

commit work;

2012年9月11日 星期二

informix 時間 to_char

日期加時間格式

SELECT FIRST 1 
 TO_CHAR(CURRENT , '%Y/%m/%d %R:%S') 
,TO_CHAR(CURRENT , '%Y/%m/%d %I:%M:%S %p') 
FROM systables

回傳

2012/09/12 14:06:14    2012/09/12 02:06:14 下午


2012/09/27:

今天把寫好的SP拿到客戶的環境上執行
結果有個FUNCTION一直 出現 Invalid era, could not assign era date
怪怪,公司跑得好好的說.

查了半天之前用舊方法將國曆數字轉成西元日期,遇到客戶的環境沒有指定DBDATE格式,造成以下的寫法一直有問題

 DEFINE p_date date
 SELECT (((substr((in_date+19110000)::char(8),1,4))||'-'||
                    (substr((in_date+19110000)::char(8),5,2))||'-'||
                     (substr((in_date+19110000)::char(8),7,2)))::date)
  INTO p_date  FROM empty;



改成以下寫法就OK

SELECT (TO_DATE((in_date+19110000)::char(8),'%Y%m%d'))
  INTO p_date  FROM empty;



原來一直搞不懂為什麼INFORMIX中,有today 和current 二個方法

直到今天才知道, today的格式是跟隨著DBDATE的設定回傳日期及時間, current則是回傳固定格式的日期及時間 

以下是客戶環境, DBDATE沒指定,所以預設應跟著DB_LOCALE=zh_TW.big5 
todaycurrent
中華民國101年10月3日 星期三      2012-10-03 16:55:28.00

 

 以下是公司環境, DBDATE=Y4MD-
todaycurrent
2012/10/03                                        2012-10-03 16:55:28.00
  

2012年9月9日 星期日

informix error 720

撰寫informix stored procedure 或function真是一件苦差事.

debug的環境只能利用set debug file 的方式.

在用慣windows UI的開發模式後, 在dbaccess terminal mode模式下開發,心中真的有很多無形的排斥感


720: The number of returned values and of SPL variables do not match.

建立stored procedure 沒有錯誤
執行階段,出了這個錯誤, 但也沒告知到底是哪行出的錯誤

原來是我select ... into ...眾多的欄位中,少了一個欄位與變數的mapping

找到我眼花.
 


2012年8月19日 星期日

kkman 更改鍵盤設定

用來telnet到某一台linux,要更改方向鍵盤設定

up 鍵, 原本為^[OA, 改為^[[A
down鍵,原本為 ^[OB, 改為 ^[[B
left鍵, 原本為^[OD , 改為^[[D
right鍵, 原本為 ^[OC , 改為 ^[[C

2012年8月11日 星期六

informix sql new line 換行

在SQL SERVER SQL 中換行為
SELECT '1' + char(13)+char(10) + '2'
結果為
1
2

在INFORMIX SQL中換行則需先執行換行設定後
 EXECUTE PROCEDURE IFX_ALLOW_NEWLINE('t');
再進行換行
select '1' ||'
'||'2'  from empty ;

以上只在當次session中生效.否則就要在$ONCONFIG 中將ALLOW_NEWLINE設定為1

參考來源 http://www.iiug.org/forums/classics/index.cgi/read/4100

後記:

後來建了一個function,在里頭進行折行效果,結果一直無法建立, 出現以下錯誤
 -282 Found a quote for which there is no matching quote

查看informix online help說明,
 Quotes on different lines:

啊明明就有啟用參數啊! WHY WHY WHY?

測了半天,原來要在create function前先啟用 IFX_ALLOW_NEWLINE, 如下

EXECUTE PROCEDURE IFX_ALLOW_NEWLINE('t');
create function fn_bevtest
(i_col1 integer) RETURNING varchar(255);

define v_name varchar(255);
EXECUTE PROCEDURE IFX_ALLOW_NEWLINE('t');
select '1'||'
'||'2' into v_name from empty;

return v_name;
end function;
 


2012年8月7日 星期二

powerdesigner 15 merge model

在powerdesigner 15中,提供了二個PDM的比對後合併.

1.先開啟二個要合併的PDM

2. 在Workspace Test1.pdm上按右鍵點選Merge Model (shift+F6)


3.選擇要合併及被合併PDM後,點選Options


 4.勾選需要比較合併的項目. (因為項目頗多,測了一下, Physical Data Model似乎要選擇最後才  能出現合併項目)

勾選Table及要比較合併的Attributes, 在此我勾選了Code、Comment、DataType及Name
在Collection 則勾選Columns 及Databases

   
勾選Column及要比較合併的Attributes, 在此我勾選了Code、Comment、Name及DataType
在Collections 勾選Database
5.完成後,按下Ok鍵,就會列二個 Model 的差異性,  在此,你可以再決定要合併哪些項目,不需要的可以uncheck

另外,如果你不想保留test1.pdm有但test2.pdm沒有的表格, 則可勾選Test1下的產品檔.(預設是未勾選)

6.最後完成後, 合併就完成了. 是不是很方便呢.



2012年8月4日 星期六

informix 更改IP

將hyper-v 的vhd移到windows 7環境利用virtual box掛載起來後,
因為家里的區域網路是192.168.1.*, 試了一個晚上,家里的router一直無法成功將LAN IP改設成192.168.0.*的網段.
所以只好更改redhat的主機IP.
改了IP後, informix上的IP也要跟著變更.

修改 INFORMIXDIR/etc/sqlhosts 的設定如下紅字
testalias            onipcshm        192.168.1.125   sqlexec
test                     onsoctcp        192.168.1.125   9999
 


另外,在INFORMIX ODBC設定時,由於同一個server設定對應到不同IP會有互蓋的問題
故可將另一個IP的,改用另一個informix 別名來設定.

這樣就可以在使用新舊DB皆有相同server name時,做不同的測試了

設定完畢重啟動Informix Server
onmode -ky
oninit

2012年8月3日 星期五

hyper-v vhd 掛到virutualbox

透過這二篇文章說明,把hyper-v上的redhat linux移到vitualbox了.

先確定原本的hyper-v還沒安裝Hyper-V版的Integration Service的話可以直接參考這篇文章

VirtualBox using Hyper-v VHD image

主要是掛載hyper-v vhd時,要使用IDE控制器掛載,而不要使用SATA控制器
The issue is that hyper-v will only build a bootable IDE hard drive. So when you create your virtual machine you need to make sure that you are not booting the VHD under a SATA Controller 

如果有安裝過 Hyper-V版的Integration Components ,則先參考 


先移除 Hyper-V版  Integration Components 後,就可複制vhd囉.

2012年7月29日 星期日

vs2010 crystal report,和rdl(c)的差異?

之前一直習慣使用微軟的Reporting Service來製作報表(.rdl)
然後再將rdl改命名為rdlc就可以在visual studio使用報表.

所以不懂VS開發程式的同事就可以在BIDS中先做好rdl報表並測試其執行後的報表格式及資料後,再把rdl更改副檔名為rdlc後再給負責開發網站的同事進行coding.
這樣的分工我覺得挺方便的.一來可借助熟DB的同事做好報表,二來也可加快程式員專注在寫code上.

不知crystal report 和reporting service 有何設計上的差異呢?

接下來,我就先建一個小小的下crystal report來測試一下二者差異性吧.

以下就將reporting service 簡稱RS,crystal report 簡稱CR


設計版面:
二者該有的表頭表尾明細群組都有,但CR的layout是free form的任意位置方式,RS的layout則是像Excel方式的表格方.前者的好處應是可以自由擺放報表欄位,後則則是設計方式就如同在操作Excel一樣方便.
個人比較喜歡RS的方式,因為不用一直在那邊對textbox進行上下左右的對齊動作.不過遇到那種複雜版面的報表會比較辛苦.但如果要顯示Grid那種加線條的表格,RS應該是"一塊小蛋糕"吧!










屬性使用:
 CR13.X版報表預覽時,工具列的擺法就和10.X版不一樣. 多了一個主報表的頁籤,舊版似乎是採工具列上的下拉選單.另外GroupTree也預設出現, 因不是很了解這個功能,所以我想把他隱藏起來, Crystal Report Viewer的屬性很令我不直覺,光找一個屬性我就測半天.

RS新舊版的工具列基本上都只有在那一行工具列上變化,屬性使用也很直覺.
下列是個人覺得應設的CR Viewer屬性.
  <CR:CrystalReportViewer ID="crv" AutoDataBind="true" runat="server" PrintMode="ActiveX"
            HasCrystalLogo="false" HasToggleGroupTreeButton="false" ToolPanelView ="None" grouEnableDatabaseLogonPrompt="False"/>

報表來源:
二者報表都是先指定報表名稱,再指定DataSource. 果然是同源產品.

報表呈現:
報表預覽後,CR一直有個地方困擾我, 就是字體看來有點不對齊的感覺,
明明我都設了相同的字體,大小,欄位的高度,也向上對齊 (align tops)
但預覽後的效果,我總是覺在CR中的textbox與資料庫欄位讀出來的textbox對不齊.
像種類:犬, 犬字似乎和種類:沒有平頭對齊??



最後,有一點我也不太理解的是,升級後的有些報表,在執行階段時,一直在
crv.ReportDocument.Load(reportPath)時出現 報表檔案名稱是空的錯誤訊息?雖然檔名及檔案都是正確的.
最後在這篇討論文章找到原因
只要將 ReportDocument.Load(reportPath)改成CrystalReportSource.report.file=reportPath 就OK了

報表工具應該都大同小異,熟悉就好. 不同需求各有擅長. 只要符合需求的都好啦.


vs2010 crystal report,初使用


現在接了一個用vs2005開發的既存在專案,報表的部份需要使用到crystal report.
因為想改用vs2010來開發,而且以前從未使用者這個水晶報表,所以做了以下的測試

首先是環境的建置:
因為vs2010未內建crystal report,所以要先到sap 網站去下載 最後版本,
點選SAP Crystal Reports, version for Visual Studio 2010 - Standard 下載(2012/07/29下載的版本是CRforVS_13_0_4.exe)

如要個別下載及查看release not可到 Crystal Reports for Visual Studio 2010 Updates & Runtime Downloads

安裝完畢後,打開VS2010把原先VS2005專案開啟, 過程中會詢問是否要以較版本crystal reprot進行昇級


選擇轉換方案及備份位置,按下確定
接著詢問是否升級到.net framework  4.0, 這時要按Yes, 因為要昇級為targetFramework=4.0



試著build website,發現有些參考上的錯誤
在任一個已存在的aspx網頁上,由toolbox中將Crystal Report Viewr拖進來後再刪除, web.config就會自動加入相關的assembly定義了 .如下
 <assemblies>
        <add assembly="CrystalDecisions.Shared, Version=13.0.2000.0, Culture=neutral, PublicKeyToken=692fbea5521e1304"/>
        <add assembly="CrystalDecisions.Web, Version=13.0.2000.0, Culture=neutral, PublicKeyToken=692FBEA5521E1304"/>
        <add assembly="CrystalDecisions.ReportSource, Version=13.0.2000.0, Culture=neutral, PublicKeyToken=692FBEA5521E1304"/>
        <add assembly="CrystalDecisions.CrystalReports.Engine, Version=13.0.2000.0, Culture=neutral, PublicKeyToken=692fbea5521e1304"/>
        <add assembly="CrystalDecisions.ReportAppServer.Controllers, Version=13.0.2000.0, Culture=neutral, PublicKeyToken=692FBEA5521E1304"/>
        <add assembly="CrystalDecisions.ReportAppServer.DataDefModel, Version=13.0.2000.0, Culture=neutral, PublicKeyToken=692FBEA5521E1304"/>
        <add assembly="CrystalDecisions.ReportAppServer.ClientDoc, Version=13.0.2000.0, Culture=neutral, PublicKeyToken=692fbea5521e1304"/>
      </assemblies>

如果不想每個頁面註冊crystal report viewer,且統一tagname,則也可在web.config加入以下
 <pages>
      <controls>
        <add tagPrefix="CR" assembly="CrystalDecisions.Web, Version=13.0.2000.0, Culture=neutral, PublicKeyToken=692fbea5521e1304"  namespace="CrystalDecisions.Web" />       
      </controls>
    </pages>

到此,試著把原先的vs2005 + crystal report 10.*的原網站就順利昇級起來了.


2012年7月24日 星期二

Win7 64 bit Informix ODBC測試


在windows 7 64bit 安裝informix ODBC(我是安裝IBM Informix Client-SDK3.50.xC7版 32bit及64bit),幾個重點

1.配合主機DB版本若為32bit,則仍需在win7 64bit環境下安裝 32bit informix connect ,最新版本可到此網址下載

2.若想利用sql server 2008 R2 建立linked db, 因為R2是64 bit,所以win7也必需要安裝64bit informix connect .

3.自已測試了一下, 想要使用 sql server 2008 R2的Import Data 匯入資料, 這時,他又只認32 bit ODBC的設定???

4.再測試了一下, 使用sql server 2008 R2 SSIS 連結ODBC, 也是只認32 bit ODBC的設定??

5.在SSIS data flow中, 建立informix 轉換到sql server 的處理, 結果仍是一樣的超級無敵難用. 透過ADO NET Source轉換時,仍強迫你要做 unicode and non-unicode的轉換.


為什麼不能依照informix 資料庫欄位的定義來做轉換呢??
為什麼不能和sql 2000 DTS 的用法一樣呢??還我原來的odbc provider啊,我不要ADO NET Source...
為什麼我要浪費時間做型別轉換呢??
為什麼經過了2005,2008,2008R2這個鳥問題仍然存在呢??


6.安裝完ODBC後,更改Enviornment 頁籤下的isolation level 為1-Read Uncommitted後, 測試連結,出現
Test connection was NOT successful.[Informix][Informix ODBC Driver][Informix]Transaction not available.
記得先檢查informix db的log mode是否為buffer log.否則無法設定isolation mode



2012年7月17日 星期二

linq dbml IsComposable 屬性

專案是使用linq to sql建立dmbl .

某天由資料庫主機更新某幾個Stored Procedure的dmbl定義後,
某一隻程式在儲存時會呼叫到更新後的Stored Procedure. 結果一直出現下列的錯誤

找不到資料行 "dbo" 或者使用者自訂函數或彙總 "dbo.zspXXXXX",或是名稱模糊不清。

但檢查了資料庫的SP定義和dbml中的定義完全是一樣的啊,怎麼會找不到咧??

於是打開dbml檔的XXXXX.designer.cs 查看, 發現呼叫的SP和其他SP比較後,多了一個屬性的定義 IsComposable="true"如下:

[global::System.Data.Linq.Mapping.FunctionAttribute(Name="dbo.zspXXXX" , IsComposable="true")]
        public int zspXXXX([global::System.Data.Linq.Mapping.ParameterAttribute(DbType="SmallInt")] System.Nullable<short> orgn, [global::System.Data.Linq.Mapping.ParameterAttribute(DbType="SmallInt")] System.Nullable<short> ym , [global::System.Data.Linq.Mapping.ParameterAttribute(DbType="SmallInt")] System.Nullable<short> isAuto)
        {
            IExecuteResult result = this.ExecuteMethodCall(this, ((MethodInfo)(MethodInfo.GetCurrentMethod())), orgn, ym, isAuto);
            return ((int)(result.ReturnValue));
        }


根據MSDN上的定義,

IsComposable 屬性 是取得或設定方法是對應至函式,還是對應至預存程序。如果是函式,則為 true,如果是預存程序,則為 false。 


看來預設是false. 


將這個屬性移除後, 重新compile, 呼叫SP就正常了.

2012年6月4日 星期一

AS2000 MDX , TOP N with member name

人客想要在AS2000找出本年度1月到上月為止排名前10的產品大類名稱、排名及數量

其中
XX02年月為國曆 年月(例10105)
XX10產品為產品維度



//提供本年度1月到上月為止 總計的的TOP N MDX語法
With
MEMBER [X].[XX02年月].[THISYEAR] 
AS ' SUM (LASTPERIODS( IIF(MONTH(NOW() ) = 1 , 12, MONTH(NOW()) -1) ,  STRTOMEMBER ( "[X].[XX02年月].[ALL].[" + CSTR( IIF( MONTH(NOW()) = 1 , YEAR(NOW() ) -1912, YEAR(NOW()) -1911 )  )  + "].[" + CSTR( IIF ( MONTH(NOW()) = 1 ,YEAR(NOW() ) -1912 , YEAR(NOW()) - 1911)  )  +  RIGHT( "00" + CSTR( IIF(MONTH(NOW() ) = 1 , 12, MONTH(NOW()) -1) )  , 2 )  + "] " ) )  ) ' 

SET [ROW] 
AS '   topcount   ( {   [X].[XX10產品].LEVELS(1).ALLMEMBERS }   ,10, [MEASURES].[數量]   )    '

MEMBER [Measures].[排名]  
 AS   '  RANK (   [X].[XX10產品].CurrentMember, [ROW]  )  '

MEMBER [Measures].[產品名稱]  
AS   '   [X].[XX10產品].CurrentMember.Name  '

SET [COL] 
AS ' {  [Measures].[排名]   ,  [Measures].[產品名稱]  , [MEASURES].[數量]  }  '

Select
[COL]    On Columns  ,

[ROW]     On Rows

From CubeProducts

Where (  [X].[XX02年月].[THISYEAR]   )


 人客又反應, 排序怪怪的沒有按照順序排,
所以把 [ROW] 改成以下囉


SET [ROW] 
AS '    ORDER ( TOPCOUNT( {   [X].[XX10產品].LEVELS(1).ALLMEMBERS }   ,10, [MEASURES].[數量]   )  , [MEASURES].[數量]    , DESC  )    '

2012年6月2日 星期六

Microsoft JScript 執行階段錯誤: 物件沒有支援這個屬性或方法 'trim'

在IE9.0.8112 16421 上遇到這個問題
Microsoft JScript 執行階段錯誤: 物件沒有支援這個屬性或方法 'trim' 

有時用中文錯訊息總是google不到有用的解決方法, 所以要拆解一下關鍵字進行搜尋

自已覺得查找過程最快也最有效的方法是使用英文版的google 屢試不爽.

使用Microsoft JScript 'trim' 找到完整的英文訊息

Microsoft JScript runtime error: Object doesn't support this property or method  'trim'

運氣好一點,直接找到了相似的問題,通常就可以知道解決方法.

如這里的討論文 http://osdir.com/ml/jQuery/2009-07/msg02922.html

jQuery's trim is used like:
var str = $.trim(str);


2012年5月29日 星期二

FormsAuthentication.Decrypt 總是回傳 null

修改一個vs2008寫的 專案.
在debug模式下,進行到 FormsAuthentication.Decrypt ( mycookie.value) 時老是回傳null
 但publish後執行卻又很正常?

查到 Tony's Programming Blog 的文章
情況很類似,查看KB 2656351 後,發現作業系統是windows 7的環境, 但我的環境是windows XP!!

使用Google 查找關鍵字 kb 2656351 .net 3.5
找到了KB 2656352適用在windows XP 的安全性更新

下載後執行安裝, 問題就解決了.

2012年5月17日 星期四

使用Data Dictionary Creator

如果是重度使用SQL Server Extended Property來記錄額外的欄位資訊者
Data Dictionary Creator 這個工具一定要下載來用.
方便你建立額外的自定義屬性例如中文名稱,備註,tooltips等等


他預設會顯示MS_Description這個屬性, 如果你有一些自定義屬性也要顯示,
則在Advanced Setting頁籤中,指定這些額外屬性名稱,如下圖,多個屬性用逗點隔開


接著在DocumentDatabase頁籤中,就會出現這些額外屬性的定義了.如下圖:


真方便.

select a.name,b.column_id,b.name,d.value,d.name
 ,c.name,c.xtype,b.max_length,b.is_nullable
  from  sys.tables a inner join  sys.columns b
    on a.object_id = b.object_id inner join sys.systypes c
    on b.system_type_id = c.xusertype left outer join  sys.extended_properties d   
   on a.object_id = d.major_id and b.column_id = d.minor_id
 order by a.name,b.column_id

 這樣也是可以讀取到所有的欄位及屬性

publish error allowDefinition='MachineToApplication'

一個老舊的aspx web form專案,調了一些功能建置成功,但進行部署時顯示以下錯誤。 在應用程式層級之外使用註冊為 allowDefinition='MachineToApplication' 的區段發生錯誤。錯誤的原因可能是虛擬目錄尚未在 IIS 中設定為...