2014年3月19日 星期三

毛利,毛利率計算公式

參考引用 1
參考引用 2
--
1.你賣一樣東西的售價減掉這樣東西的相關成本後所得出來的金額就是『毛利』,毛利率則是以毛利當分子除以售價,則為『毛利率』。

2.將單項商品整月總銷售金額減掉單項商品整月銷售相關成本(包括買進成本及一些可達銷售狀態的成本』即為單項商品的月毛利,月毛利除以整月銷售金額即可得出毛利率。

3.如賣一個包,售價250-成本150(進貨100+其他相關成本50,如倉儲人員薪資、倉租等等)=毛利100
毛利率=100/250 =0.4 亦即40%

4.掌握毛利率才知道你自己是否有賺錢,不然有可能賣越多賠越多!

--
商品成本15.1元 配料7元 其他14元
售價175元 最後毛利79.3元

銷貨成本15.1+7+14=36.1
銷貨毛利=175-36.1=138.9
銷貨毛利率=138.9/175=79.37%


--
POS:
銷售金額-(銷售量 x平均成本)=>毛利

月加權平均成本,移動加權平均成本

請參考來源:存貨計價方法
--

2014年3月18日 星期二

MSSQL 索引鍵重新命名,判斷索引鍵是否存在

參考引用:MSDN重新命名索引
--

EXEC sp_rename N'Purchasing.ProductVendor.IX_ProductVendor_VendorID', N'IX_VendorID', N'INDEX';

以指令變動資料表的主索引鍵時,要先判斷索引是否存在
--


[SQL]以指令變動資料表的主索引鍵時,要先判斷索引是否存在
先判斷是否已經設定主索引鍵值

IF EXISTS (SELECT name FROM sysindexes WHERE name = '索引名稱') --索引名稱預設為 PK_資料表名稱

然後在對索引作異動

刪除主索引鍵

ALTER TABLE 資料表名稱 DROP CONSTRAINT  索引名稱;

新增主索引鍵

ALTER TABLE 資料表名稱 ADD PRIMARY KEY  索引名稱 ;


基因改魚實例問答八十一題 (分1,2)

請參考來源:基因改魚實例問答八十一題(1)
請參考來源:基因改魚(2)實例問答八十一題
-- 

vb.net panel load form

參考引用來源
---
Dim formToShow As New Form2
formToShow.TopLevel = False
formToShow.WindowState = FormWindowState.Maximized
formToShow.FormBorderStyle = Windows.Forms.FormBorderStyle.None
formToShow.Visible = True
Panel1.Controls.Add(formToShow)



Windows Mobile 6 & 6.5 SDK 下載

Core Downloads for Windows Mobile
--

VB.net Firebird

Firebird - VB.net
--
不錯的blog , 內有一些技術文章!

Resizing Window Form control

參考引用來源
--
Private Sub Test_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load

    Dim widthRatio As Single = Me.Size.Width / 300.0F
    Dim heightRatio As Single = Me.Size.Height / 300.0F
    Dim scale As New SizeF(widthRatio, heightRatio)
    Me.Scale(scale)
    For Each control As Control In Me.Controls
        control.Scale(scale)
        control.Font = New Font(control.Font.FontFamily,   control.Font.SizeInPoints * widthRatio * heightRatio)
    Next
End Sub

2014年3月17日 星期一

Windows Server 2003 和 Windows 2000 提供大型記憶體支援

請參考微軟:Windows Server 2003 和 Windows 2000 提供大型記憶體支援
--
部分引用(詳細請參考微軟):


下列範例是已加入 PAE 參數的 Boot.ini 檔:
[boot loader]
timeout=30
default=multi(0)disk(0)rdisk(0)partition(2)\WINDOWS
[operating systems]
multi(0)disk(0)rdisk(0)partition(2)\WINDOWS="Windows Server 2003, Enterprise" /fastdetect /PAE

2014年3月14日 星期五

SA、SD、SE 區分

參考引用來源
--

做軟體開發專案規劃時,常會碰到助理問我一個問題,SA、SD和SE的差別在那裡 ?

    這個問題我以前也有過,還頗為困擾,系統分析和系統設計及系統工程到底有什麼差別 ? SA和SD的工作又有何不同 ? 這兩者的養成教育又有何差異 ?在過去,SA,SD及SE的確很難區分,甚至這些角色常常會透過軟體工程師來混合發展。

隨著IT領域的發展,SA,SD及SE漸漸的成為了大型專案必需要的專業分工,這三者間是有相當的差異的,不管是養成過程,甚或是未來的發展,都大相徑庭,而要成為一名稱職的PM,是要能區分出這三者的差異,才能妥善的安排工作的。

[SA,系統分析師]如果要轉載本文請注明出處,免的出現版權紛爭,我不喜歡看到那種轉載了我的作品卻不注明出處的人QQ9256114

     SA是 System Analysis 的縮寫,一般稱為系統分析,主要的工作就是透過一系列的分析工作,把客戶想要的結果產生方式,以各種文件表達出來,讓開發團隊可以根據這些文件實作出這個結果。

這樣的解釋比較文縐縐一點,用個通俗一點的方式比喻,就像是要做出一道宮保雞丁時,就會有食譜一樣,裡面會介紹需要的材料及做菜的順序,然後裡面也會強調要以怎樣手法才能產生出某種效果,以促進色香味。

這樣的過程裡,SA是較為偏重於在工作流程和處理邏輯的,透過SA,開發團隊才可以理出整個系統的架構,一種做事的脈絡,以及系統和工作間的關連性,最重要的,是這些結果都會被SA呈現在文件中,而非放在少數人的腦袋裡。

SA不僅止是要針對電腦裡的東西去運作及規劃,還包括了現實世界裡的實體流程及組織。在很多的情況下,配合新系統的組織及流程,是要由SA來執行的。總結起來,在一個開發案裡,SA執行以下的工作:

· 藉由系統需求書,使用者的現有標準作業流程來建立出符合期望的新作業流程及搭配流程的系統功能及模組規劃
· 依據功能及模組規劃案,定出初步的資料庫內容及系統與使用者間的權限搭配規範
· 定出各個軟體零件的規範,如物件,函數庫,...等等
· 設計新的標準作業流程,並把系統功能或模組綁入這些流程中
· S.A依據客戶的環境及需求,尋找合適的SD來搭配

而SA也有以下的特色:
· 對於系統在怎樣的環境及用什麼開發工具,並不十分在意,良好的S.A產生出來的文件,使用不同的開發工具都應該可以完成,產生相同的結果,但那一種最合適,由SD決定
· SA偏重於流程及執行邏輯的表達
· SA著重於軟體邏輯,對開發工具的學習並不是十分重要,所以會一種語言即可,主要是以該語言工具來實踐邏輯觀。
· SA一定要有全局觀,也就是不能拘泥於一個角度或是一個局部去思考問題,這一點是尋找優秀SA時最困難的。因為在規劃模組及功能時,一定要同時考量到所有直接相關及間接相關的程序及邏輯問題,因此要有全局觀。

相較於SD,SA更側重在邏輯及工作順序搭配的表達,SA並不需要去關切使用什麼作業系統或是什麼開發工具,如前特色所述,好的SA文件,可以用任何一種開發工具來實現。當然,SA不受限於IT技術,但卻會有專業領域的限制。

很少有SA同時專精於數個領域的,熟悉汽車業運作規範的SA,在金融業的開發案裡,就很難討好,反之亦然。但SD沒有這種限制,基本上SD可以和任何行業的專案開發團隊配合運作。

會如此的原因是SA是偏重於流程及管理分析及重新再造工作的。而作業流程,除了少數領域裡共通性高,在核心流程上,是需要長期鑽研的。前面提及的汽車及金融業就是一例。

所以,一個SA必需具備以下的能力,資歷及專業訓練:

1. 至少熟悉一種程式開發語言
2. 熟悉軟體工程,對於開發工具的元素及特色熟悉
3. 對管理制度或作業流程設計熟悉
4. 熟悉UML或類似的系統描述工具
5. 邏輯能力良好
6. 良好的溝通能力,主要作為瞭解需求之用
7. 相關的業界熟悉度

在三者之中,SA是最接近PM的,所以SA在做生涯規劃時,不妨以PM做為下一個發展的專業目標。

[SD,系統設計師]如果要轉載本文請注明出處,免的出現版權紛爭,我不喜歡看到那種轉載了我的作品卻不注明出處的人QQ9256114

     一般來說,SD在生涯規劃裡,並不是SA或是PM。當然,一定要硬來一次也沒有什麼不可以,但要走這條路,就要趁早轉職,因為SD畢竟是較為幕後的工作,在與客戶的溝通協調上,並不會有太高的要求,也較不需要公司管理層面的全局觀。

表 面上看起來,SD沒有SA那麼多的工作要求,但實際上SD是最需要天賦的工作,不管是畫面的構成,操作的手順及調整,甚至於元件的定義及物件的規範,全都 需要一些天賦。很多軟體,功能很強,但怎麼看怎麼不順眼,或者怎麼用就怎麼憋扭,功能帶來的效益,全都被這些毛病給遮蓋掉了,這就是SD的問題。

另外,SD也扮演了系統最佳化的推手。SA所規劃出來的要求及佈置,都只是邏輯上的構思,在不同的工具上,可能有更好的方法可以表現,也可能會難以展示,這都需要藉由SD對使用環境及開發工具的瞭解,來進行調整和規劃。

舉 例來說,同樣是一套財務軟體,在WINDOWS XP,MAC,X WINDOWS下,就會有很不一樣的展現模式和技巧。如果再搭配上不同的開發工具,如C++,JAVA,.NET,PHP,...那差異更多。對SA而 言,這些東西他都不用去考慮,但SD就不同了,這些不同的地方,並不僅僅只是如此而已,有時還會包括了開發成本及時間問題,SD的重要度,由此可知。

在一個客製化專案裡,SD的工作內容如下:

· 設計畫面元素規範
· 設計頁面結構及規則
· 設計系統操作畫面,並編定欄位規範及防呆處理
· 設計權限管理與系統操作機制
· 撰寫使用手冊
· 調整DB之各項定義,使其符合畫面欄位規範及操作搭配
· 配合SA撰寫系統開發文件,供程式師CODING之用
· 撰寫UI(使用者介面)測試計劃書

而做為一名稱職的SD,以下的條件,是必要的:

1. 至少對一個作業系統極為熟悉,對於這個作業系統的各個元件特性及API,有充分的瞭解
2. 熟悉2種以上的開發工具,而專案所需的工具,必需是其擅長的之一,其熟悉度包含了標準安裝裡的各個函數庫,系統常數,物件定義,語法,主要的輔助工具開發廠商,及重要的工具使用方法
3. 具一定的美學感
4. 至少能使用一種繪圖工具軟體
5. 曾經擔任職業軟體工程師三年以上

可以這樣說,SA給了系統靈魂和神經系統,SD則是給了系統軀體和外觀,兩者的結合,才能產生出正確,美觀又好用的系統。如果你覺得自己是個不太愛和太多人打交道的IT人,又對使用者介面有那麼點執著及天賦,那麼,SD絕對是適合你的好選擇。

[SE,系統工程師]

     就某種角度來看,SE對PM而言,算是萬金油,只要做IT專案,那就一定用得上,差別只是要選那一個專業的SE而已。系統建置安裝要SE,使用者環境要SE,甚至到硬體選擇及佈建,都要用到SE,有什麼IT專案跟這個沒有關係呢 ?

當然,雖然SE是到處都吃得開,但相對的也是專案裡面最沈默及少有聲音的一群。他們的工作基本上就是建構出一個可以執行系統的環境,系統要如何展現,SE可以給SA和SD一些建議,但建議時機通常都是在系統運行出了些非系統可以掌握的問題後。

系統工程師基本條件上,和SD最為接近,但有一點不同,就是不需要有很好的軟體開發經驗,也就是不太需要會寫程式。但要對作業系統,服務器系統,網路運用環境有相當程度的瞭解。

SE通常是三者中最為博學一員,好的SE雖然不一定要程式寫的呱呱叫,但卻不能對編程一無所知,對作業系統及開發工具也要有一定的熟悉度,甚至部份網管有關的工作也要有所涉獵,所以算得上是專案裡的萬金油。

在專案裡,SE所要執行的工作如下:

· 規劃及建置系統執行環境
· 安裝及設定使用者端環境
· SERVER安裝及設定
· 提供環境設置竟見給SA及PM
· 最佳化系統可靠度及效度
· 撰寫可靠度及效能測試計劃書
· 對電腦及相關週邊設備有一定熟悉度

而一名SE則有下列基本要求:

1. 至少熟悉一種作業系統,尤其是讓系統的設定及微調等相關技術
2. 至少熟悉一種網路伺服器作業系統,對如何設定及最佳化熟悉
3. 曾任軟體工程師職務一年以上或熟悉一種開發工具
4. 對網路環境有一定的認識,尤其是一些通訊設置
5. 熟悉可靠度及效能的評估方法,並瞭解與系統環境相關之設定

基本上,如果擁有了像SD一樣的技術背景及個性,但在美學上實在令人不敢恭維,那麼SE算是極佳的選擇了。一般而言,SE的下一個生涯規劃,會比較偏重於技術性兵種,像是DBA或是網管,對於IT產品比較有狂熱或愛好的人,SE是極佳的出路。

[在專案中的運用時機]

基 本上SE是萬金油,只要是IT的案子裡就一定要塞一個SE進去,因為沒有IT專案不需要使用工程技術的,差別只在使用何種工程技術而已。在套裝軟體的導入 專案裡,SE負責處理軟體使用環境,解決非系統性問題,安置及調整資料庫和網路環境,然後安裝啟動。所有系統運行所需要的條件,都要由SE來解決和處理, 但這些工作全都不會出現在眾人的面前,但卻又重要無比,算得上是幕後的英雄。

會同時運用到SA,SD及SE的專案,還是以客製化開發為主的。

在開發型專案裡,SA團隊要負責初期的需求調查及整體架構的規劃,將所有的系統開發工作內容轉化成井井有條的文件,並且適度的分割及派送,並確保未來這些被分割的開發結果能夠在未來可以正確運作。

SD 則在SA的文件中去尋求系統呈現的一致性,易用性及保證開發工具可以正確無誤的展現SA的要求結果。所以SD要負責操作界面的外觀設計,訂定一致的展現規 範,設計系統操作畫面及操作手順,同時配合SA完成系統開發文件。基本上,開發文件中,是包含系統使用手冊初稿的。

SD在設計時,必需與SA充分配合,以確保設計的系統符合需求及運作要求。

除了上述的工作內容外,這三者都要撰寫測試計劃,SA著重在於資料的流動符合原先規劃的順序及結果測試,SD則著重在操作畫面中的防呆測試及操作介面的正確性,而SE則在系統可靠度上進行規劃。

[軟體工程師何時轉職 ?]

每一個寫程式的人心裡都明白,這工作不可能做一輩子。不單單是體力及腦力問題,最重要的是寫程式,經濟價值實在有限。

我不會否認有很多的程式高手,但重點不在於你有多優秀,而是有多少老闆願意付出和你努力成正比的薪資來顧用你。不是沒有這種工作,而是如同鳳毛麟角,而且,這種工作通常你也做不久,因為壓力太大,消耗青春太劇烈了。

退一步來說,你也不值得付出這麼多,在良好的SA及SD的規劃下,工程師只要達成一般標準,就可以解決掉九成以上的軟體開發需求,除非是機緣巧合,或是你很有興趣,否則另外那一成的工作,你是很難有機會碰上,或者,就算碰上,也沒法子養活你一輩子。

軟體工程師總有一天要轉職的,這是他們的宿命。

當 要轉職時,他們有幾個選擇,SA,SD,SE,出去當老闆及換一行等諸多選擇。看起來雖多,但其實晚景淒涼,因為寫程式都是關起來寫,長期自閉的結果,當 他們想轉職時,很難擁有足夠的人脈來支撐他們換個前途光明的事業。一般人羨慕IT人的高薪,卻不曉得只是寅支卯糧,沒有妥善的規劃,後勢看跌的。

前面的五個選項,基本上最後兩項只是充場面,只有少數人才能選那兩個,大多數軟體工程師還是要在前三者中選一個來發展的。

SA看起來最風光,未來也是潛力最好的,但很遺憾的,軟體工程師裡,只有少數人適合這個職務。因為這個工作是很需要和別人打交道的,而好的軟體工程師通常這一點非常不擅長。

因此,如果你自認為擅於溝通,三姑六婆都是你的紅顏知己,邏輯能力不錯,又對管理有興趣,那麼SA是你很好的選擇,程式功力並不是你要考慮的重點。

相對的,你對使用者介面很有心得,而且在美感上也獲得了同事的一致讚賞,程式功力也有那麼一點自信,討厭和不是搞IT的人打屁聊天,那不要懷疑,SD是你最佳的歸宿。

最後,你覺得IT的世界對你充滿了吸引力,無論是作業系統,開發工具或是軟體及IT設備都是如此的吸引你,人與人的接觸對你來說並不是人生的首要需求,層出不窮的IT科技讓你陶醉其中,那麼,SE絕對是你的首選。

要 如何轉職,每一個軟體工程師是要誠實面對自己的,而不是依前途來決定自己要選什麼職務,如果你依這種方式選,以我個人在職場生涯的經驗,這樣的人很難散發 出光芒,也難以有他期望的成就。所以,現在在寫程式,正在想要轉職的工程師,請謹慎而且誠實的面對自己,做出恰當的選擇。

[結語]

以上是個人提供給對於SA,SD及SE或到困惑的朋友,做為參考及工作分配的依據。這三者的產生,其實也是源於目前IT技術的成長過於快速,所以必需針對軟體工程進行適切的分工,才能應付好日益複雜的IT環境。

2014年3月12日 星期三

取得 SQL Server 資料庫正在執行的 T-SQL 指令與詳細資訊

參考引用來源
--
SELECT      r.scheduler_id as 排程器識別碼,
            status         as 要求的狀態,
            r.session_id   as SPID,
            r.blocking_session_id as BlkBy,
            substring(
ltrim(q.text),
r.statement_start_offset/2+1,
(CASE
                 WHEN r.statement_end_offset = -1
                 THEN LEN(CONVERT(nvarchar(MAX), q.text)) * 2
                 ELSE r.statement_end_offset
                 END - r.statement_start_offset)/2)
                 AS [正在執行的 T-SQL 命令],
            r.cpu_time      as [CPU Time(ms)],
            r.start_time    as [開始時間],
            r.total_elapsed_time as [執行總時間],
            r.reads              as [讀取數],
            r.writes             as [寫入數],
            r.logical_reads      as [邏輯讀取數],
            -- q.text, /* 完整的 T-SQL 指令碼 */
            d.name               as [資料庫名稱]
FROM        sys.dm_exec_requests r
CROSS APPLY sys.dm_exec_sql_text(sql_handle) AS q
LEFT JOIN sys.databases d ON (r.database_id=d.database_id)
WHERE       r.session_id > 50 AND r.session_id <> @@SPID
ORDER BY    r.total_elapsed_time desc

Alter Index All Tables

參考引用來源
--
SELECT
    RowNum = ROW_NUMBER() OVER(ORDER BY t.TABLE_NAME)
    ,TableName = t.TABLE_SCHEMA + '.' + t.TABLE_NAME
    ,AlterMe = 'ALTER INDEX ALL ON [' + t.TABLE_SCHEMA + '].[' + t.TABLE_NAME + '] REBUILD;'
INTO #Reindex_Tables
FROM INFORMATION_SCHEMA.TABLES t
WHERE TABLE_TYPE = 'BASE TABLE'


DECLARE @Iter INT
DECLARE @MaxIndex INT
DECLARE @ExecMe VARCHAR(MAX)

SET @Iter = 1
SET @MaxIndex =
(
    SELECT COUNT(1)
    FROM #Reindex_Tables
)

WHILE @Iter < @MaxIndex
BEGIN
    SET @ExecMe =
    (
        SELECT AlterMe
        FROM #Reindex_Tables
        WHERE RowNum = @Iter
    )
 
    EXEC (@ExecMe)
    PRINT @ExecMe + ' Executed'
 
    SET @Iter = @Iter + 1
END


參考引用來源2
select avg_fragmentation_in_percent, avg_fragment_size_in_pages, fragment_count, avg_page_space_used_in_percent
    from sys.dm_db_index_physical_stats (DB_ID(), object_id('[dbo].[YourTableName]'), NULL, NULL, 'DETAILED')

    -- Cursor going over each table and rebuilding every index of database.
    DECLARE @TableName VARCHAR(255)
    DECLARE @sql NVARCHAR(500)
    DECLARE @fillfactor INT
    SET @fillfactor = 80
    DECLARE TableCursor CURSOR FOR
    SELECT OBJECT_SCHEMA_NAME([object_id])+'.'+name AS TableName
    FROM sys.tables
    OPEN TableCursor
    FETCH NEXT FROM TableCursor INTO @TableName
    WHILE @@FETCH_STATUS = 0
    BEGIN
    SET @sql = 'ALTER INDEX ALL ON ' + @TableName + ' REBUILD WITH (FILLFACTOR = ' + CONVERT(VARCHAR(3),@fillfactor) + ')'
    EXEC (@sql)
    FETCH NEXT FROM TableCursor INTO @TableName
    END
    CLOSE TableCursor
    DEALLOCATE TableCursor
  

How to rebuild all the indexes of a database in SQL Server

參考引用來源
--

SQL Server 2000
=============

--Rebuild all indexes with keeping the default fill factor for each index
USE [DATABASE_NAME]
EXEC sp_MSforeachtable @command1="print '?' DBCC DBREINDEX ('?')"

--Rebuild all indexes with specifying the fill factor
USE [DATABASE_NAME]
EXEC sp_MSforeachtable @command1="print '?' DBCC DBREINDEX ('?', ' ', [FILL_FACTOR_PERC])"


SQL Server 2005/2008
=================

You can either use the syntax provided above for SQL Server 2000 or:

--Rebuild all indexes online with keeping the default fill factor for each index
USE [DATABASE_NAME]
EXEC sp_MSforeachtable @command1="print '?'", @command2="ALTER INDEX ALL ON ? REBUILD WITH (ONLINE=ON)"

--Rebuild all indexes offline with keeping the default fill factor for each index
USE [DATABASE_NAME]
EXEC sp_MSforeachtable @command1="print '?'", @command2="ALTER INDEX ALL ON ? REBUILD WITH (ONLINE=OFF)"

--Rebuild all indexes online with specifying the fill factor
USE [DATABASE_NAME]
EXEC sp_MSforeachtable @command1="print '?'", @command2="ALTER INDEX ALL ON ? REBUILD WITH (FILLFACTOR=[FILL_FACTOR_PERC],ONLINE=ON)"

--Rebuild all indexes offline with specifying the fill factor
USE [DATABASE_NAME]
EXEC sp_MSforeachtable @command1="print '?'", @command2="ALTER INDEX ALL ON ? REBUILD WITH (FILLFACTOR=[FILL_FACTOR_PERC],ONLINE=OFF)"

2014年3月11日 星期二

簡報系統 (影片)


本系統可應用在:醫美.汽車.髮廊.婚沙.服飾.場合式表演...等等須圖片式說明產品的報告或是客人自行瀏覽產品等!

相關詳細請參考:進銷存,租書,批發,軟體設計::池龍工作室::POS系統

2014年3月10日 星期一

簡報系統 樣板

系統預設為5種樣板,亦可依照尺寸自行調配顏色底圖
---




vbnet 如何設置datagridview的背景色為透明

參考引用來源:如何设置datagridview的背景色为透明
--
 For i As Integer = 0 To dataGridView.Rows.Count - 1
  dataGridView.Rows(i).DefaultCellStyle.BackColor = Colors.Transparent
 Next

vb.net datagridview background image

參考引用來源:
--
 Imports System
Imports System.Collections.Generic
Imports System.Linq
Imports System.Text
Imports System.Windows.Forms
Imports System.Drawing

Namespace testproject
Public Class imagedgv
Inherits DataGridView
Private img As Image
Public Property Img() As Image
Get
Return img
End Get
Set
img = value
End Set
End Property

Public Sub New()
MyBase.New()
SetStyle(ControlStyles.OptimizedDoubleBuffer, True)
End Sub

Protected Overloads Overrides Sub OnSizeChanged(e As EventArgs)
MyBase.OnSizeChanged(e)
img = New Bitmap(img, Me.Width - Me.RowHeadersWidth, Me.Height - Me.ColumnHeadersHeight)
End Sub

Protected Overloads Overrides Sub PaintBackground(graphics As Graphics, clipBounds As Rectangle, gridBounds As Rectangle)
MyBase.PaintBackground(graphics, clipBounds, gridBounds)
graphics.DrawImage(img, New Point(Me.RowHeadersWidth, Me.ColumnHeadersHeight))
End Sub

Protected Overloads Overrides Sub OnCellPainting(e As DataGridViewCellPaintingEventArgs)
MyBase.OnCellPainting(e)
If e.ColumnIndex > -1 AndAlso e.RowIndex > -1 Then
If Me(e.ColumnIndex, e.RowIndex).Style.BackColor <> Color.Red Then
Me(e.ColumnIndex, e.RowIndex).Style.BackColor = Color.Transparent
Else
Me(e.ColumnIndex, e.RowIndex).Style.BackColor = Color.Red
End If
End If
End Sub

Protected Overloads Overrides Sub OnMouseClick(e As MouseEventArgs)
Dim hti As DataGridView.HitTestInfo = Me.HitTest(e.X, e.Y)
If hti.Type = DataGridViewHitTestType.Cell Then
Dim c As DataGridViewCell = Me(hti.ColumnIndex, hti.RowIndex)
If c.Style.BackColor = Color.Red Then
c.Style.BackColor = Color.Transparent
c.Style.SelectionBackColor = Color.Transparent
Else
c.Style.BackColor = Color.Red
c.Style.SelectionBackColor = Color.Red
End If
End If
MyBase.OnMouseClick(e)
End Sub
End Class
End Namespace

2014年3月8日 星期六

AVI Trimmer免費的影片剪輯軟體

官網:Free video editor, free movie editor, AVI editor / AVI Trimmer + MKV

introduction 簡報系統



--------
 introduction 簡報系統(單機版)
■簡報系統(單機版)安裝程式 v 1.0.0 【下載】 試用帳號/密碼:0000
■作業系統必須安裝 【framework 3.5 sp1或以上】
■作業系統支援 【WinXP,Win7,Win8】等作業系統
■試用版:限1筆簡報資料
■簡報系統支援線上更新,請善加利用功能[檢查版本]即可自動偵測最新版本並自動更新

運用行業等簡報:
醫美.汽車.髮廊.婚沙.服飾.場合式表演...等等須圖片式說明產品的報告或是客人自行瀏覽產品等!

簡報系統並非一般的圖文檔模式,主要為管理圖(照)片等;運用資料庫管理層面來達到方便管理和對客戶的簡介說明產品等呈現方式!
若想對照片管理,也可以使用! 此產品就看怎運用及發揮應用!
歡迎下載試用! 

vbnet Download File Asynchronously With ProgressBar (正確沒問題版)

參考引用
--
Private Sub btnStartDownload_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnStartDownload.Click
    Dim client As WebClient = New WebClient
    AddHandler client.DownloadProgressChanged, AddressOf client_ProgressChanged
    AddHandler client.DownloadFileCompleted, AddressOf client_DownloadCompleted
    client.DownloadFileAsync(New Uri("SomeURL"), "SomePlaceOnHardDrive")
    btnStartDownload.Text = "Download in Progress"
    btnStartDownload.Enabled = False
End Sub

Private Sub client_ProgressChanged(ByVal sender As Object, ByVal e As DownloadProgressChangedEventArgs)
    Dim bytesIn As Double = Double.Parse(e.BytesReceived.ToString())
    Dim totalBytes As Double = Double.Parse(e.TotalBytesToReceive.ToString())
    Dim percentage As Double = bytesIn / totalBytes * 100

    progressBar.Value = Int32.Parse(Math.Truncate(percentage).ToString())
End Sub

Private Sub client_DownloadCompleted(ByVal sender As Object, ByVal e As System.ComponentModel.AsyncCompletedEventArgs)
    MessageBox.Show("Download Complete")
    btnStartDownload.Text = "Start Download"
    btnStartDownload.Enabled = True
End Sub

vbnet Net.WebClient downfile

引用來源#1
--
Public Class Form1
    Friend WithEvents MyWebClient As New Net.WebClient

    Private Sub MyWebClient_DownloadProgressChanged(ByVal sender As Object, ByVal e As System.Net.DownloadProgressChangedEventArgs) Handles MyWebClient.DownloadProgressChanged
        ProgressBar1.Value = e.ProgressPercentage
    End Sub

    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
        MyWebClient.DownloadFileAsync(New Uri("http://myweb.com/myfile.zip"), "C:\myfile.zip")
    End Sub
End Class

參考引用來源#2
--
Dim wc As System.Net.WebClient
    Private Sub btnButton1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnButton1.Click
        wc = New System.Net.WebClient()
        AddHandler wc.DownloadProgressChanged, AddressOf OnDownloadProgressChanged
        AddHandler wc.DownloadFileCompleted, AddressOf OnFileDownloadCompleted
        wc.DownloadFileAsync(New Uri("http://url.com/file.zip";), "C:\Downloads\file.zip")

    End Sub
    Private Sub OnDownloadProgressChanged(ByVal sender As Object, ByVal e As System.Net.DownloadProgressChangedEventArgs)

        Dim totalSize As Long = e.TotalBytesToReceive
        Dim downloadedBytes As Long = e.BytesReceived
        Dim percentage As Integer = e.ProgressPercentage
        'Put your progress UI here, you can cancel download by uncommenting the line below
        'wc.CancelAsync()

    End Sub
    Private Sub OnFileDownloadCompleted(ByVal sender As Object, ByVal e As System.ComponentModel.AsyncCompletedEventArgs)

        If e.Cancelled Then
            'Cancelled
        ElseIf Not e.Error Is Nothing Then
            'Error occured
        Else
            'File Downloaded Successfuly
        End If

    End Sub

引用來源#3
--
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
        Dim wClient As New WebClient
        AddHandler wClient.DownloadProgressChanged, AddressOf DownloadProgressChanged
        AddHandler wClient.DownloadStringCompleted, AddressOf DownloadStringCompleted
        wClient.DownloadStringAsync(New Uri(TextBox1.Text))
    End Sub

    Private Sub DownloadProgressChanged(ByVal sender As Object, ByVal e As DownloadProgressChangedEventArgs)
        ProgressBar1.Value = e.ProgressPercentage
    End Sub

    Private Sub DownloadStringCompleted(ByVal sender As Object, ByVal e As DownloadStringCompletedEventArgs)
        Dim wClient As WebClient = DirectCast(sender, WebClient)
        RemoveHandler wClient.DownloadProgressChanged, AddressOf DownloadProgressChanged
        RemoveHandler wClient.DownloadStringCompleted, AddressOf DownloadStringCompleted

        ProgressBar1.Value = 0

        If e.Error IsNot Nothing Then
            MessageBox.Show(e.Error.Message)
        ElseIf e.Cancelled Then
            MessageBox.Show("Download cancelled by the user")
        Else
            ' e.Result contains the downloaded string.
            MessageBox.Show(e.Result)
        End If
    End Sub
 

偵測 My.Computer.Network.DownloadFile 被中斷

引用來源
請參考:Download and Upload using VB.NET 
--
 Dim FilenameMP3 As String = "http://ap.a168a.com/test/您要下載的位址檔名"
        Dim SaveLocation As String = "d:\001test.zip" '要存放的檔案位置
        Try
            My.Computer.Network.DownloadFile(FilenameMP3, SaveLocation, "", "", True, 8000, True, FileIO.UICancelOption.ThrowException)
        Catch ex As System.OperationCanceledException
            MsgBox("下載被取消")
        End Try

如何使用VB.net下載網路上的檔案.

引用來源
--
 本文使用VB.net 2005 Express進行下載:
下載的方式有二:

(一)使用System.Net.WebClien下載,

範例如下:

Dim 網址 as String = "Http://yahoo.com.tw/a.jpg"
Dim 存檔路徑 as String = "C:\"
Dim 存檔檔名 as String = "a.jpg"

Dim strFilePath As String = 存檔路徑 + "\" + 存檔檔名
Dim dwl As New System.Net.WebClient()

dwl.DownloadFile(網址, strFilePath)
dwl.Dispose()

(二)使用My.Computer.Network.DownloadFile下載*:

語法如下:

My.Computer.Network.DownloadFile(address, destinationFileName, username, password, showUI,connectionTimeout, overwrite)

範例:
My.Computer.Network.DownloadFile("http://192.168.1.1/download.ini", "C:\Program Files\download.ini", "", "", True, 500, True)

2014年3月6日 星期四

DATATABLE和XML互相转换

參考引用來源
--


  '''
    ''' DATATABLE转为XML格式的字符串
    '''
    '''
    '''
    '''
    Private Function CreateXmlToString(ByVal dt As DataTable) As String
        Dim settings As New XmlWriterSettings
        settings.Indent = True
        settings.NewLineOnAttributes = True
        Dim strxml As New StringBuilder()
        Dim writer As XmlWriter = XmlWriter.Create(strxml, settings)


        Try
            If dt IsNot Nothing AndAlso dt.Rows.Count > 0 Then
                writer.WriteStartDocument()
                writer.WriteStartElement("expenditure")
                writer.WriteStartElement("FYDATA")
                writer.WriteAttributeString("name", "费用明细字符串")
                For i As Integer = 0 To dt.Rows.Count - 1
                    writer.WriteStartElement("item")
                    writer.WriteAttributeString("CustomerID", dt.Rows(i).Item("CustomerID"))
                    writer.WriteAttributeString("CompanyName", dt.Rows(i).Item("CompanyName"))
                    writer.WriteAttributeString("ContactName", dt.Rows(i).Item("ContactName"))
                    writer.WriteAttributeString("ContactTitle", dt.Rows(i).Item("ContactTitle"))
                    writer.WriteAttributeString("Address", dt.Rows(i).Item("Address"))
                    writer.WriteEndElement()
                Next
                writer.WriteEndElement()
                writer.WriteEndElement()
                writer.WriteEndDocument()
                writer.Flush()
                writer.Close()
            End If
        Catch ex As Exception
            Throw ex
        End Try
        Return strxml.ToString()
    End Function


 '''
    ''' XML格式的字符串转为DATASET
    '''
    '''
    '''
    '''
    Private Function DataToXml(ByVal strxml As String) As DataSet
        Dim result As New DataSet
        Try
            If strxml.Trim.Length > 0 Then
                '读取成流文件
                Dim stream As StringReader = New StringReader(strxml)
                '对xml流文件的只进只读访问
                Dim xread As XmlTextReader = New XmlTextReader(stream)
                '把数据读入DATASET中
                result.ReadXml(xread)
            End If
        Catch ex As Exception
            Throw ex
        End Try
        Return result
    End Function

2014年3月4日 星期二

vb net xsd dataset

MSDN:從 XML 載入 DataSet 結構描述資訊
MSDN:將 DataSet 結構描述資訊寫為 XSD
MSDN:將 DataSet 內容撰寫成 XML 資料
--
(1)XML(XSD) 載入 dataset
Dim dataSet As DataSet = New DataSet
dataSet.ReadXmlSchema("schema.xsd")

Dim xmlStream As System.IO.StreamReader = New System.IO.StreamReader ("schema.xsd");
Dim dataSet As DataSet = New DataSet
dataSet.ReadXmlSchema(xmlStream)
xmlStream.Close()


(2)dataset 寫入 XSD (XML)

dataSet.WriteXmlSchema("Customers.xsd")

Dim writer As System.IO.StreamWriter = New System.IO.StreamWriter("Customers.xsd")
dataSet.WriteXmlSchema(writer)
writer.Close()

Dim schemaString As String = dataSet.GetXmlSchema()

(3)將 DataSet 內容撰寫成 XML 資料
Dim xmlSW As System.IO.StreamWriter = New System.IO.StreamWriter("Customers.xml")
custDS.WriteXml(xmlSW, XmlWriteMode.WriteSchema)
xmlSW.Close()

vbnet DataGridView 檢查 NULL

參考引用來源
--
  If Not IsDBNull(gv.Rows(i).Cells(1).Value) AndAlso gv.Rows(i).Cells(1).Value.ToString.Length <> 0 Then
 ' YourCode
 End If

2014年3月3日 星期一

關於DataGridView中嵌入圖片處理

參考部份引用來源
--
重點在 ##3 這段的處理 (縮圖)

##1
Public Partial Class Form1
    Inherits Form
    Private dgv As DataGridView = Nothing

    Public Sub New()
        InitializeComponent()

        '初始化动态产生数据表等字段
        dgv = New DataGridView()
        dgv.Parent = Me
        dgv.Dock = DockStyle.Fill

        Dim dt As New DataTable()
        dt.Columns.Add("Name", GetType(String))
        dt.Columns.Add("Image", GetType(Byte()))
        dt.Rows.Add("Test1", File.ReadAllBytes("d:\test.jpg"))
        dgv.AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.AllCells
        dgv.AutoSizeRowsMode = DataGridViewAutoSizeRowsMode.AllCells
        dgv.DataSource = dt
    End Sub
End Class

##2
Public Partial Class Form1
    Inherits Form
    Private dgv As DataGridView = Nothing

    Public Sub New()
        InitializeComponent()

        '初始化动态产生数据表等字段
        dgv = New DataGridView()
        dgv.Parent = Me
        dgv.Dock = DockStyle.Fill

        Dim dt As New DataTable()
        dt.Columns.Add("Name", GetType(String))
        dt.Columns.Add("Image", GetType(String))
        dt.Rows.Add("Test1", "d:\test.jpg")
        dgv.AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.AllCells
        dgv.AutoSizeRowsMode = DataGridViewAutoSizeRowsMode.AllCells
        dgv.Columns.Add(New DataGridViewTextBoxColumn() With { _
            Key .HeaderText = "Name", _
            Key .DataPropertyName = "Name" _
        })
        dgv.Columns.Add(New DataGridViewImageColumn() With { _
            Key .HeaderText = "Image", _
            Key .DataPropertyName = "Image" _
        })
        AddHandler dgv.CellFormatting, AddressOf New DataGridViewCellFormattingEventHandler(AddressOf dgv_CellFormatting)
        dgv.DataSource = dt
    End Sub

    Private Sub dgv_CellFormatting(sender As Object, e As DataGridViewCellFormattingEventArgs)
        If e.ColumnIndex = 1 AndAlso e.RowIndex <> dgv.NewRowIndex Then
            e.Value = File.ReadAllBytes(dgv.Rows(e.RowIndex).Cells(1).Value.ToString())
        End If
    End Sub
End Class

##3
Public Partial Class Form1
    Inherits Form
    Private dgv As DataGridView = Nothing

    Public Sub New()
        InitializeComponent()

        '初始化动态产生数据表等字段
        dgv = New DataGridView()
        dgv.Parent = Me
        dgv.Dock = DockStyle.Fill

        Dim dt As New DataTable()
        dt.Columns.Add("Name", GetType(String))
        dt.Columns.Add("Image", GetType(Byte()))
        dt.Rows.Add("Test1", File.ReadAllBytes("d:\test.jpg"))
        dgv.AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.AllCells
        dgv.AutoSizeRowsMode = DataGridViewAutoSizeRowsMode.AllCells
        AddHandler dgv.CellFormatting,AddressOf New DataGridViewCellFormattingEventHandler(AddressOf dgv_CellFormatting)
        dgv.AllowUserToAddRows = False
        dgv.DataSource = dt
    End Sub

    Private Sub dgv_CellFormatting(sender As Object, e As DataGridViewCellFormattingEventArgs)
        If e.ColumnIndex = 1 Then
            Using oldms As New MemoryStream(DirectCast(e.Value, Byte()))
                Dim img As Image = Image.FromStream(oldms)
                Dim bt As New Bitmap(img, New Size(100, 100))
                Using newms As New MemoryStream()
                    bt.Save(newms, ImageFormat.Jpeg)
                    e.Value = newms.ToArray()
                End Using
            End Using
        End If
    End Sub
End Class

##4
Public Partial Class Form1
    Inherits Form
    Private dgv As DataGridView = Nothing

    Public Sub New()
        InitializeComponent()

        '初始化动态产生数据表等字段
        dgv = New DataGridView()
        dgv.Parent = Me
        dgv.Dock = DockStyle.Fill

        Dim dt As New DataTable()
        dt.Columns.Add("Name", GetType(String))
        dt.Columns.Add("Image", GetType(String))
        dt.Rows.Add("Test1", "d:\test.jpg")
        dgv.AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.AllCells
        dgv.AutoSizeRowsMode = DataGridViewAutoSizeRowsMode.AllCells

        dgv.Columns.Add(New DataGridViewTextBoxColumn() With { _
            Key .HeaderText = "Name", _
            Key .DataPropertyName = "Name" _
        })
        dgv.Columns.Add(New DataGridViewImageColumn() With { _
            Key .HeaderText = "Image", _
            Key .DataPropertyName = "Image" _
        })
        AddHandler dgv.CellFormatting,AddressOf New DataGridViewCellFormattingEventHandler(AddressOf dgv_CellFormatting)
        dgv.AllowUserToAddRows = False
        dgv.DataSource = dt
    End Sub

    Private Sub dgv_CellFormatting(sender As Object, e As DataGridViewCellFormattingEventArgs)
        If e.ColumnIndex = 1 Then
            Dim bytes As Byte() = File.ReadAllBytes(e.Value.ToString())
            Using oldms As New MemoryStream(bytes)
                Dim img As Image = Image.FromStream(oldms)
                Dim bt As New Bitmap(img, New Size(100, 100))
                Using newms As New MemoryStream()
                    bt.Save(newms, ImageFormat.Jpeg)
                    e.Value = newms.ToArray()
                End Using
            End Using
        End If
    End Sub
End Class

vbnet OpenFileDialog 多選

引用來源
--
OpenFileDialog1.Multiselect = True '多選檔案
If Not e.Cancel Then
   Dim i As Int16
   ListBox1.Items.Clear()
   For i = 0 To OpenFileDialog1.FileNames.Length - 1
       ListBox1.Items.Add(OpenFileDialog1.FileNames(i))
   Next
End If

2014年3月2日 星期日

SQLite 取左右字串


select SUBSTR('1234',5,-2)  --取右字串
select SUBSTR('1234',1,2)  --取左字串

select length('1234')   -- 取字串長度

2014年3月1日 星期六

selectcommand 不支援 updatecommand 動態 sql 的產生

參考引用來源
--
 原因應該是你select出來的資料沒有Primary Key,所以第一個先要確認select出來的結果有包含主鍵欄位。不過看你寫select *,看來這個資料表應該是沒有建立,你可以考慮替這個資料表建立主鍵,要不然你得在程式碼中為DataTable指定主鍵欄位,範例程式可以看這一篇MSDN文件的解說與範例程式碼。希望這個solution有幫到你。

--
SQLite 一定須要PK 才能運用 updatecommand

VB.Net code to read data from excel 2003, 2007 and 2010

參考引用來源:VB.Net code to read data from excel 2003, 2007 and 2010
--

' Get Data from Excel 2003


Public Function GetExcel2003Data(ByVal PrmPathExcelFile As String, ByVal DataGrid1 As DataGrid)
 Dim MyConnection As System.Data.OleDb.OleDbConnection
 Try
  '' Fetch Data from Excel
  Dim DtSet As System.Data.DataSet
  Dim MyCommand As System.Data.OleDb.OleDbDataAdapter

  MyConnection = New System.Data.OleDb.OleDbConnection("provider=Microsoft.Jet.OLEDB.4.0; " & _
  "data source='" & PrmPathExcelFile & " '; " & "Extended Properties=Excel 8.0;")
 
  ' Select the data from Sheet1 of the workbook.
  MyCommand = New System.Data.OleDb.OleDbDataAdapter("select * from [sheet1$]", MyConnection)

  MyCommand.TableMappings.Add("Table", "Attendence")
  DtSet = New System.Data.DataSet
  MyCommand.Fill(DtSet)
 
  DataGrid1.DataSource = DtSet.Tables(0)

 Catch ex As Exception
  Throw ex
 Finally
  MyConnection.Close()
 End Try
End Function




' Get Data from Excel 2007 or Excel 2010 ()


Public Function GetExcel2003Data(ByVal PrmPathExcelFile As String, ByVal DataGrid1 As DataGrid)
 Dim MyConnection As System.Data.OleDb.OleDbConnection
 Try
  '' Fetch Data from Excel
  Dim DtSet As System.Data.DataSet
  Dim MyCommand As System.Data.OleDb.OleDbDataAdapter

  MyConnection = New System.Data.OleDb.OleDbConnection("provider=Microsoft.ACE.OLEDB.12.0; " & _
  "data source='" & PrmPathExcelFile & " '; " & "Extended Properties=Excel 12.0;")
 
  ' Select the data from Sheet1 of the workbook.
  MyCommand = New System.Data.OleDb.OleDbDataAdapter("select * from [sheet1$]", MyConnection)

  MyCommand.TableMappings.Add("Table", "Attendence")
  DtSet = New System.Data.DataSet
  MyCommand.Fill(DtSet)
 
  DataGrid1.DataSource = DtSet.Tables(0)

 Catch ex As Exception
  Throw ex
 Finally
  MyConnection.Close()
 End Try
End Function

sqlite 檢查table是否存在

select count(*) from sqlite_master where table=***

SELECT count(*) FROM sqlite_master WHERE type='table' and name='" + TableName+ "'";

相關可參考:Caton + OO + Google =?: Sqlite
--
 

C# 压缩 SQLite 数据库


C# 压缩 SQLite 数据库
当从SQLite数据库中删除数据时, 未用的磁盘空间将会加入一个内部的“自由列表”中。 当你下次插入数据时,这部分空间可以重用。磁盘空间不会丢失, 但也不会返还给操作系统。

如果删除了大量数据,而又想缩小数据库文件占用的空间,执行 VACUUM 命令。 VACUUM 将会从头重新组织数据库。这将会使用数据库有一个空的“自由链表”, 数据库文件也会最小。但要注意的是,VACUUM 的执行会需要一些时间 (在SQLite开发时,在Linux上,大约每M字节需要半秒种),并且, 执行过程中需要原数据库文件至多两倍的临时磁盘空间。

在SQLite ADO.Net中可以使用以下代码压缩SQLite数据库文件:SQLiteCommand cmd = new SQLiteCommand("VACUUM",sQLiteConnection);
cmd.ExecuteNonQuery();

壓縮SQLite的資料檔案

參考引用來源:壓縮SQLite的資料檔案
--
在使用SQLite資料庫時,發現程式執行刪除操作時,資料庫檔大小並沒有減小。查了相關資料後發現,當從 SQLite 刪除資料之後,未使用的磁碟空間被添加到一個內在的“空閒清單”中用於存儲你下次插入的資料。磁碟空間並沒有丟失,但是也不向作業系統返回磁碟空間。 如果想要減小資料庫檔,可以設置auto_vacuum標記,當開啟auto_vacuum,提交一個從資料庫中刪除資料的事務時,資料庫檔自動收縮。需要注意的是只有在資料庫未創建任何表時才能改變auto_vacuum標記。
在創建資料庫後首先執行以下語句,即可設置auto_vacuum標記。
m_db.execDML(_T("PRAGMA auto_vacuum = 1"));//(m_db為CppSQLite3DB物件)



還有另一種方法是執行vacuum命令


即時的插入和刪除會使得資料庫檔結構混亂,減慢對資料庫內容訪問的速度。 VACUUM命令複製主要資料庫檔到臨時資料庫並從臨時資料庫重新載入主要資料庫,以整理資料庫檔。這將除去空白頁,使表資料彼此相鄰排列,並整理資料庫檔結構。


代碼示例:


CString strSql = _T("VACUUM;");
m_db.execQuery(strSql);// (m_db為CppSQLite3DB物件)


兩個方法的區別在於:使用auto_vacuum僅僅是將空閒的頁除去,並不會像VACUUM那樣對資料庫進行磁碟重組,或是壓縮資料庫頁。


示例比較表:單位(位元組)


初始資料庫大小 插入5000條資料後 刪除所有資料


未做任何處理 7168 250880 250880


auto_vacuum標記 8192 252928 8192


執行vacuum命令 7168 250880 7167


備註:設置auto_vacuum標記後,資料庫會在內部存儲一些資訊以便支援這一功能,這使得資料庫檔比不開啟該選項時稍微大一些。