2015年12月21日 星期一

使用Excel Buffer內的Function建立Excel文件

在Table 370可以看到 Excel Buffer 這張Table,主要是將欄位資料存放到這張Buffer Table,然後輸出成Excel檔

建立Excel比較常用的Function有這些:

CreateBook, CreateSheet, GiveUserControl, NewRow, AddColumn

這邊以Report 6 Trial Balance為例

執行這隻Report的時候,可以看到Option Tab有Print to Excel 這個功能,也就是將Report輸出為Excel格式


在Report - OnPreReport()的Trigger

IF PrintToExcel THEN  //如果Print to Excel有打勾的話,會呼叫MakeExcelInfo這個Function
  MakeExcelInfo;


AddInfoColumn主要是將報表的資訊放到Information Sheet,這邊可以看個人習慣,有些人喜歡將報表資訊跟資料放在同一頁,那就不需要用到AddInfoColumn


MakeExcelInfo Function在最尾巴的地方有呼叫到MakeExcelDataHeader Function

在這邊可以看到這個Function使用到AddColumn來加入表頭的欄位

結果如下:


以上圖第一個欄位為例
AddColumn("G/L Account".FIELDCAPTION("No."),FALSE,'',TRUE,FALSE,TRUE,'');
需要傳幾個參數給AddColumn這個Function,依序是
(欄位的Value, 是否為公式, 加入註解文字(滑鼠移到欄位上會顯示註解文字), 是否為粗體, 是否為斜體, 是否有底線, 儲存格的數值格式代碼)



加入註解文字這邊特別介紹一下,如果在第三個參數輸入test
AddColumn("G/L Account".FIELDCAPTION("No."),FALSE,'test',TRUE,FALSE,TRUE,'');
今天當我滑鼠移到欄位上會顯示註解文字,也就是我輸入的test



儲存格的數值格式代碼的話,主要是用在當你希望儲存格依照你的Data Type來顯示的話,可以修改儲存格格式,例如Customer No.為001,但是儲存格的數值格式代碼為空的話,輸出到Excel會顯示1而不是001

可以在AddColumn("G/L Account".FIELDCAPTION("No."),FALSE,'',TRUE,FALSE,TRUE,'@');使用@符號來更改儲存格的格式

Header表頭已經介紹完畢,那麼Body的部分跟Header差不多,只要將欄位使用AddColumn來加入欄位即可

要注意的是,因為Header的Function沒有使用到換行的Function,若是要換行的話,可以使用NewRow,透過NewRow來達到換行的動作

然後將Body的Function放在Body - OnPostSection()的Trigger裡面

最後在Report - OnPostReport()加入

IF PrintToExcel THEN
  CreateExcelbook;  //呼叫CreateExcelbook Function



這個Function主要是將擺放在Excel Buffer資料表內的資料輸出到Excel檔

CreateBook建立Excel
CreateSheet建立工作表
GiveUserControl主要是讓系統產生Progress Bar,直到進度條結束為止,才顯示Excel檔

這邊有個地方需要注意,就是在你的Report要將ExcelBuf變數設成Temporary暫存表,這樣才可以在多台電腦上面執行Create Excel的動作,如果沒有設定的話,會Lock Excel Buffer Tabl這張表,導致當你在Create Excel的時候,其他使用者無法Create Excel


先介紹到這邊,下次來介紹如何使用Excel的Automation來建立圖表

2015年12月14日 星期一

如何使用NAV發送郵件的功能

在NAV的標準功能中,有SMTP Mail這隻Codeunit來協助我們發送Email

首先需要設定SMTP伺服器

到Form 409 或 Page 409 SMTP Mail Setup設定

在SMTP Server輸入您的郵件伺服器地址,圖中只是一個範例,若是您的郵件伺服器沒有設定權限,在Authentication選擇Anonymous即可,下方帳號密碼可以不必填寫


接下來可以開啟Codeunit 400 SMTP Mail看到以下Function

這邊挑幾個常用到的Function來說明

CreateMessage是用來建立Email的Funciton

需要傳的參數依序是寄件者名稱、寄件者Email Address、收件者Email Address、信件主旨、信件內容、是否使用HTML格式


AddRecipients是用來加入第二個以上的收件人的Funciton

AddCC是用來加入副本收件人的Funciton

AppendBody是用來加入額外信件內容的Funciton,因為在CreateMessage的Body只有1024的長度,所以若是信件內容過長,可以利用此Function

AddAttachment是用來加入附件的Funciton,可以透過此Function夾帶檔案

在以上Function傳入參數後,最後利用Send Function來發送Email


以下為介紹如何使用Codeunit 400

首先新增一個Codeunit,然後在Global Variables宣告Codeunit 400的變數SMTP

然後呼叫以下Function,最後執行這隻Codeunit即可寄出Email


2015年12月9日 星期三

Codeunit 介紹

這次為各位介紹什麼是Codeunit

Codeunit也就是眾多Function的集合

開發者可以透過呼叫Codeunit裡面定義的Function來達成想要的功能



這邊用簡單的加減乘除做介紹




首先在Codeunit裡面定義Function

這邊我定義了四個Function,由上至下分別是加減乘除,需要傳入2個參數,然後利用這兩個參數做計算,最後回傳結果,除法比較麻煩一點,需要先做分子和分母的判斷,如果其中一個為0的話,在做計算時會產生錯誤

然後再開一個新的Codeunit,輸入以下程式碼,可以看到我傳入10跟5兩個數字到這些Function中,Math需先在Global variable先宣告連結到Codeunit 50000 Math,然後就可以利用這個Codeunit的Function來做計算

最後得到的結果為


這就是Codeunit的功用,你可以不用一直重複寫一樣的程式碼,只要將需要的功能寫入Codeunit儲存起來,以後想要使用該功能時,再去Codeunit呼叫就好





2015年12月3日 星期四

NAV 2009 Report 利用Integer來達到Group的效果

今天來為各位做Integer Group的介紹,我覺得一個程式開發者,一定要了解什麼是Integer,因為它可以幫助開發者做到很多事情。而為什麼會以NAV 2009來做Demo,因為我覺得NAV 2009以後的版本,因為多了RTC介面,而且Report的設計已經改為在Microsoft Visual Studio上去設計,而NAV 2009因為有 Classic版本,所有的介面Form、Report都在同一個平台上面做開發的動作,以一個程式初學者來說的話,會比較容易上手。

下面開始介紹Integer:

在NAV 2009中雖然有GroupTotalFields的 Properties可以設定

但是Group的欄位必須是Key

以Table 32 Item Ledger Entry為例

這張表的Key如下圖所示


如果今天想使用Location Code來做Group的話,若以不更動這張表的Key為前提,可以透過Integer來做Group的動作

首先宣告Record變數,這邊要設定Temporary屬性為Yes,將TempILE設為暫存資料表,也就是說你可以將TempILE當作是一個系統內的虛擬資料表,可以讓你自由的存取這張資料表,因為他一開始是沒有資料的,你可以將資料暫時存放在此


在Item Ledger Entry - OnPreDataItem()先將TempILE這張虛擬的資料表清空,避免資料一開始不是空的



然後在Item Ledger Entry - OnAfterGetRecord()可以看到我對TempILE的"Location Code"這個欄位下篩選條件,利用"Item Ledger Entry"在OnAfterGetRecord()會迴圈執行的流程,將"Item Ledger Entry"的"Location Code"去尋找TempILE的"Location Code",如果沒有在TempILE找到這筆資料,才會做新增資料的動作,達到以Location Code做Group,若是要同時Group兩個欄位以上的話,額外增加Filter的行數即可。

這邊可以看到我新增了NextEntry這個變數,因為Item Ledger Entry的主鍵是Entry No.,所以這個欄位必須要有值,所以只要每新增一筆資料到TempILE,我就會將NextEntry加一,避免重複插入資料。

在END之後的程式碼主要是用來做Group累加的動作

TempILE.Quantity += "Item Ledger Entry".Quantity;
TempILE."Remaining Quantity" += "Item Ledger Entry"."Sales Amount (Actual)";
TempILE."Invoiced Quantity" += "Item Ledger Entry"."Cost Amount (Actual)";

這邊因為"Sales Amount (Actual)"和"Cost Amount (Actual)"是FlowField,所以不能直接用暫存表累加,這邊透過其他閒置的欄位,像是Remaining Quantity和Invoiced Quantity這種不是FlowField的欄位來代替。

然後新增一個Integer的DataItem來將TempILE的資料用迴圈的方式顯示在Report上


在Integer - OnPreDataItem()可以看到,首先將剛剛新增的資料做一個RESET的動作,將資料全部顯示,然後針對Integer這個DataItem下一個條件,執行1~TempILE的資料數


如果是第一筆資料的話,顯示TempILE的第一筆資料,之後就顯示TempILE的下一筆資料

最後將先前說到的Remaining Quantity和Invoiced Quantity指派回TempILE的"Sales Amount (Actual)"和"Cost Amount (Actual)"欄位

Section的部分,因為是透過Integer這個DataItem顯示資料,所以要利用Integer的Body顯示TempILE的資料


看一下最後執行Report 顯示的結果,將Item Ledger Entry這張資料表相同的Location Code做一個Quantity, Sales Amount, Cost Amount作群組加總的動作。



2015年12月2日 星期三

利用Word來客製化NAV 2015 的Report Part 2

在先前已經為各位介紹過 如何利用Word來客製化NAV 2015 的Report Part 1
http://brian-ren.blogspot.tw/2015/12/wordnav-2015-report-part-1.html

這篇來為各位介紹更進階的客製化Report的方式,像是怎麼使用Word的XML Mapping工具來增加Report 欄位資料

Step1.
1.打開 Report Layout Selection
路徑:  Departments/Administration/IT Administration/Reports/Report Layout Selection
 


2.在 Filter 欄位輸入 Report ID : 1306 按下 Enter ,可以看到Report Name : Sales Invoice ,然後點擊功能表區的 Custom Layout,開啟 Custom Report Layout 頁面


3.選擇之前已經客製的Report,然後點擊功能表區的 Copy 複製現有的客製化 Report , Description 修改為 My Layout Advanced ,然後點擊功能表區的 Export Layout
 

4.匯出儲存為 "Default.docx"
 



Step2.
1.開啟 "Default.docx"

2.選擇 Word 內的任一個項目 例如: Customer Address3 ,然後點擊上方的版面配置 > 檢視格線
 



Step3.
1.在版面配置按右鍵,然後選擇 "自訂功能區"
 


2.將開發人員打勾,按下確定
 


3.在功能表區點擊 XML Mapping  (附註:Word 2007 / 2010 需要額外安裝XML Mapping功能
附檔下載: https://www.dropbox.com/s/76nl8w37cksx0p1/XmlMappingTaskPane.exe?dl=0   ,Word 2013 則在安裝時就內建此功能 )
 


若是遇到安裝問題,請找到此路徑

 


將該資料夾的屬性唯讀取消打勾即可

 

3.打開 XML Mapping,可以在右方選單找到urn:microsoft-dynamics-nav/reports/Mini_Sales_Invoice/1306選項
 


4.展開 Header 資料夾,可以看到Label與欄位資料,找到要擺放的位置,在右方Lable資料找到 Shipment_Lbl 按右鍵,Insert content control > Text,就會插入到左方 Word 內

 

5.再找到另一個要擺放的位置,在右方欄位資料找到 ShipmentDate 按右鍵,Insert content control > Text,就會插入到左方 Word 內
 


6.選取這兩個欄位,右鍵 > 表格內容
 


7.點擊框線及網底 > 找到網底頁籤 > 選擇填滿的顏色,按確定,即可看到這兩個欄位的背景色改變,儲存 Word
 



 
8.回到 Custom Report Layout 頁面,點擊功能表區的Import Layout,選擇剛才編輯的 Word 檔案
 



Step4.
1.在 Custom Report Layout 頁面 點擊功能表區的 Run Report 來確認改變
 



 


2.套用 Custom Report Layout 到 Nav2015 RTC 上

 

利用Word來客製化NAV 2015 的Report Part 1

Step1.
1.打開 Report Layout Selection 
路徑:  Departments/Administration/IT Administration/Reports/Report Layout Selection 
  

2.在 Filter 欄位輸入 Report ID : 1306 按下 Enter ,可以看到Report Name : Sales Invoice 

3.點擊功能表區的 Custom Layout,開啟 Custom Report Layout 頁面
  

4.點擊功能表區的 New ,勾選Insert Word Layout,建立新的 Custom Report Layout
  


Step2.


1.在 Description 修改為 My Layout,然後點擊功能表區的 Edit Layout
  

2.在 Word 裡面做一些簡單的改變,例如文字顏色、表格樣式修改,然後儲存 Word
  

3.匯入改變到 Nav2015,選擇Yes
  

Step3.
1.在 Custom Report Layout 頁面 點擊功能表區的 Run Report 來查看改變結果


  
2.套用 Custom Report Layout 到 Nav2015 RTC 上



  
  
Copyright © 2015. Brian的Dynamic Nav學習筆記 - All Rights Reserved | Powered by Blogger | Template Design by Cool Blogger Tutorials | Published by Templates Doctor