顯示具有 NAV 2009 標籤的文章。 顯示所有文章
顯示具有 NAV 2009 標籤的文章。 顯示所有文章

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月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作群組加總的動作。



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