2013-05-28

Access中自動處理NULL變數

null一直都是個令人喜愛又討厭的小東西
物件導向中他可以代表一個物件並沒有被實體化或是變數名沒有指定給某個實體物件
但是用在變數上...尤其是在SQL中,他還真是個惱人的小東西

我遇到的問題,是使用SQL的SUM()來取用一群資料中的合計數
像是下面的SQL命令,取用表Table1裡的個別Total合成為新的TotalSum

SELECT SUM(Total) AS TotalSum FROM Table1


但是如果上面的命令句在加上WHERE限定的狀態下,取不到任何紀錄的情形中
TotalSum的值不會是想定的0,而是NULL!!
但我又不想特地做個IF或是IIF來處理這個NULL,怎麼辦呢?

這時候,Access裡有個內建的小函數Nz()。他可以檢測第一個引數是否為NULL值,如果為NULL的話回傳第二個引數值

例如上面的TotalSum,如果用DAO.Recordset調用,回傳值是NULL的狀態下,我想把他放給另一個參數,可以寫作下面的樣子

Dim myRS AS DAO.Recordset
Set myRS = CurrentDb.OpenRecordset("","SELECT SUM(Total) AS TotalSum FROM Table1 WHERE ID > 100")
Dim TotalSum AS Long
TotalSum = Nz(myRS!TotalSum,0)

這樣,myRS!TotalSum是Null的時候,TotalSum也會被自動填入0而不是Null,方便我們接下來若是要把他拿來INSERT到另一個變數裡的時候好處理

ps.Nz()只適用於Access 2007以後的產品,若是之前的產品...可能你還是得用IIF來達成你的願望囉...

ps2. 官方說明:Nz 函數

2013-05-24

利用7-Zip自製安裝程式打包

7-Zip越來越萬能了阿...


簡單流程如下:
1. 利用7-Zip將程式打包,產生.7z檔
2. 利用7z_extra裡面附屬的7zS.sfx或是7zSD.sfx設定檔產生自解並自動執行檔


相關工具
1. 當然是7-Zip自己啦
7-Zip 公式網站
http://www.7-zip.org/
SourceForge上的7-Zip檔案庫:
http://sourceforge.net/projects/sevenzip/files/7-Zip/

最新的9.22版的連結:

2. 7z_extra.7z追加套裝
7z_extra這個重要的套裝是沒有附在基本檔裡的,需要自己去下載來裝
不過在上面的SourceForge檔案庫裡有公開

以9.22版來說,這個追加檔案是7z922_extra.7z
http://sourceforge.net/projects/sevenzip/files/7-Zip/9.22/7z922_extra.7z/download


步驟1: 利用7-Zip將程式打包
建議使用無壓縮選項,以後再來壓縮就好= =
假如我們有檔案目錄ABC, 要把他打包的命令列指令就如下面所示
7z a ABC.7z ABC\*

步驟2.1準備設定檔
我們需要一個設定檔config.txt來告訴7z我們要怎麼對付調整這個自解檔的動作
config.txt必須是無BOM的UTF-8編碼
以「;!@Install@!UTF-8!」行開始,以「;!@InstallEnd@!」行結束。

ID_String
設定關鍵字串
Description
說明
Title 解壓縮時顯示訊息的標題
BeginPrompt 開始前詢問的字串
Progress 顯示解壓縮進度。可以設定為yes或是no。預設是yes
RunProgram 解壓縮後執行的指令。 預設值是"setup.exe"。子字串 %%T 將會被替代為解壓縮時臨時資料夾的路徑。
Directory RunProgram的資料夾前綴。預設值是".\\"。如果你的壓縮檔裡面又放了層資料夾,你就可以把資料夾名稱設定在此,那執行程式就會順利找到setup.exe檔
ExecuteFile 執行檔名
ExecuteParameters ExecuteFile的執行參數

以上指令並非全部必要。甚至你可以省略config.txt設定檔本身。

有兩種方式可以指定安裝程式:RunProgram或是ExecuteFile
用RunProgram來執行7z壓縮檔裡面的程式
用ExecuteFile來開啟7z壓縮檔裡面的文件檔或是呼叫外部程式來開啟7z壓縮檔裡面的檔案(例如.msi檔之類的)

以下是幾種config.txt的設定例:
;!@Install@!UTF-8!
Title="7-Zip 4.00"
BeginPrompt="Do you want to install the 7-Zip 4.00?"
RunProgram="setup.exe"
;!@InstallEnd@!
;!@Install@!UTF-8!
Title="7-Zip 4.00"
BeginPrompt="Do you want to install the 7-Zip 4.00?"
ExecuteFile="7zip.msi"
;!@InstallEnd@!
;!@Install@!UTF-8!
Title="7-Zip 4.01 Update"
BeginPrompt="Do you want to install the 7-Zip 4.01 Update?"
ExecuteFile="msiexec.exe"
ExecuteParameters="/i 7zip.msi REINSTALL=ALL REINSTALLMODE=vomus"
;!@InstallEnd@!

步驟3,把7z壓縮檔跟自解設定檔放在一起產生執行檔
我們剛剛說了需要7z_extra套件的理由來了
打開套件包,把裡面的7zS.sfx或是7zSD.sfx抓出來,把他放在跟7z壓縮檔同一個目錄中
7zS.sfx跟7zSD.sfx的差別是,一個使用靜態的程式庫連結,一個使用windows的MSVCRT.dll動態程式庫連結。
在命令列打下面的複製指令,把7zS.sfx, config.txt, ABC.7z套成一個ABC.exe自解檔

copy /b 7zS.sfx + config.txt + ABC.7z ABC.exe


大功告成!!

追加步驟:
如果你覺得無壓縮太大了不能承受,在製造7z檔的時候壓縮率加大一點,當然相對的解壓縮的時候會浪費比較多cpu資源跟記憶體。
如果檔案已經壓好了,可以用UPX之類的工具把他在壓過...當然,那又是另一段故事了...

自行打包Access 2010 Runtime with SP1

Access 2010 Runtime已經出來很久了
他的追加補丁SP1也已經出來很久了
但是Access 2010 Runtime with SP1卻遲遲不出現
這對某些沒有網路可以下載的電腦造成了使用上的不便
如果想利用Access 2010的自動封裝功能發布的時候,runtime卻得要另外安裝的窘境

下面告訴你如何自行把MS的公式包打包成為含有SP1的新包


1. 用命令列模式解壓縮Access Runtime 2010
[Access2010Runtime.exe] /extract:[解壓縮目標目錄]
2. 同樣的,解開Sp1並把他放到[解壓縮目標目錄]下的"Updates"目錄下
3. 用打包工具將[解壓縮目標目錄]的內容重新打包成SFX自解檔(當然能夠自動執行更好)

結束

啥?就這麼簡單? 是的,就這麼簡單。




2013-05-20

T-SQL中的日期函數

T-SQL,一個只能用在MS SQL中的語言...

在T-SQL中,提取目前日期時刻時可以使用getdate()函式。

getdate() 所提取的內容與current_timestamp將會相同

SELECT current_timestamp "Standard Timestamp", getdate() 'Transact-SOL datetime'


另外,使用datepart()可以提取getdate()所提供的變數中的特定欄位的內容
比如說datepart(year, getdate())可以提取年份的資料


SQL中的特殊字元(Pattern Matching in SQL)

在SQL中使用LIKE或是NOT LIKE關鍵字代替運算子(諸如=, >, <, ...)時,你可以使用SQL的Pattern Matching功能。

Pattern Matching是什麼東西哩?Pattern Matching是出自正規表現的關鍵字。有些中文網站翻譯作「樣式比對」。搜尋與特定Pattern相符合的字串,或是判斷字串是否符合Pattern的要求。

在SQL中,Pattern Matching是case-sensitive的,意思是,A與a是完全不一樣的單字。

以下是幾個在SQL的Pattern Matching裡具有特殊意義的字元


  • % (百分比符號,percent mark): 相同於windows裡的*萬用字元。0個以上的任何字元。例如:搜索"d%base",  你可以搜尋到dbase, database, 或是dkbase
  • _ (下線, underscore): 相同於windows裡的?萬用字元。任意的1個字元。搜索"A___e",你可以搜尋到Apple, Amaze, 或是任何一個A開頭e結尾的長度5的字彙
  • [] (角括號,square brackets): 包含在特定範圍內的一個特定字元。[a-f]表示a,b,c,d,e,f其中的一個字元。[abcdef]也等同於[a-f]。
  • [^] (內含脫字符號的角括號, square brackets with caret): 表示除了特定範圍內的字元以外的其他字元。"[^a-z]%"表示任何不用小寫字母開始的單字。"de[^l]%"就表示任何以de但是不是del開始的單字。(所以delete就不會出現,但是會出現demark)
在角括號裡,","(逗號)通常不帶有任何意義,只為區分字元。[^S,B,R] = [^SBR]

2013-05-14

Clone records in SQL

使用SQL文重複複製表格內容

以下手法可用於MySQL
並可以使用於任何有自動增加值(AutoIncrease)的表格

CREATE TEMPORARY TABLE temp_table ENGINE=MEMORY SELECT * FROM your_table WHERE id=1;

UPDATE temp_table SET id=NULL; /* Update other values at will. */

INSERT INTO your_table SELECT * FROM temp_table;
DROP TABLE temp_table;


在Access裡,你可以用SELECT INTO標準句來替換
SELECT * INTO temp_table FROM your_table WHERE id=1 ;

UPDATE temp_table SET id=NULL; /* Update other values at will. */

INSERT INTO your_table SELECT * FROM temp_table;

DROP TABLE temp_table;

以上

#DELETED in Access

In Access, if you have a record in form/subform is deleted after you read the data into form, the values will be showen "#DELETED".

to fix it, just force the form to requery.

with VBA, it will be like below:
Me.[SomeControlNameIfThereIsSubForm.Form].Requery


アクセス上のことです。
操作している間に、データがフォームに読み込まれた後に、実際のデータが消された場合、フォーム上で、#DELETEDという文字が出てきます。

解決方法も簡単です。フォームを再クエリしたらいいです。荒々しいが仕方ありません。

GoogleCode-Prettify

SyntaxHighlighter

人気の投稿