2015年3月4日 星期三

AngularJS

  • 要套用AngularJS必須於網頁script中引用下段文字

<script src="http://ajax.googleapis.com/ajax/libs/angularjs/1.2.26/angular.min.js"></script>

  • ng指令(ng-directives):ng打頭的html屬性

ng-app:定義此頁面為AngularJS Application,並指定此為root element,一個頁面只能有一個,告訴AngularJS 包在<div>的是"owner",需要解譯。
ng-init:初始化值變數
ng-controller:是一Javascript Object,定義controller,在page load時執行。 
ng-model:Bind application data到HTML controls  
ng-bind:Bind application data 到 HTML view 
ng-repeat:告訴AngularJS這是一個重複性的element,如選單中的選項。 
ng-disable:將其他element屬性設成disable 
ng-show:顯示或隱藏html element 
ng-hide:隱藏或顯示html element 
ng-click:定義click event

  • Expressions:寫在{{ expression }}中

必須要包在ng-app中,寫法與javascript類似,包含literals、operators、和variables。
例如:{{ 5 + 5 }} 、 {{ firstName + " " + lastName }}、{{ quantity * cost }}
Filters:基本的格式化
currency 金錢格式filter 取subitemlowercase 轉小寫orderBy 排序uppercase 轉大寫

  • XMLHttpRequest($http.get):讀遠端server資料


2014年7月4日 星期五

將DataSet轉成Excel


整個是一個Application
Book1是一個活頁簿
Sheet1是一個工作表
ColumnName是標題1、標題2、標題3
Cell是裡面的表格




使用套件Microsoft.Office.Interop.Excel;

//new 一個 Excel
Application application = new Application();
//在excel中加入新的活頁簿
Workbook wBook = application.Workbooks.Add(Type.Missing);

for (int z = 0; z < dsData.Tables.Count; z++)
{
    //建立新的工作表
    Worksheet workSheet = (Worksheet)wBook.Worksheets.Add(Type.Missing, Type.Missing, Type.Missing, Type.Missing);
    workSheet.Name = dsData.Tables[z].TableName;

    //column headings
    for (int i = 0; i < dsData.Tables[z].Columns.Count; i++)
    {
        Range headRange = (Range)workSheet.Cells[1, i + 1];
        headRange.Font.Bold = true; //粗體
        headRange.Value2 = dsData.Tables[z].Columns[i].ColumnName;
    }

    //rows
    for (int i = 0; i < dsData.Tables[z].Rows.Count; i++)
    {
        //cells
        for (int j = 0; j < dsData.Tables[z].Columns.Count; j++)
        {
            workSheet.Cells[(i + 2), (j + 1)] = dsData.Tables[z].Rows[i][j];
        }
    }
}

wBook.SaveAs(filePath, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing,
    XlSaveAsAccessMode.xlShared, XlSaveConflictResolution.xlLocalSessionChanges, false, Type.Missing, Type.Missing, Type.Missing);

application.Quit();


其中Workbook.SaveAs的參數可參考以下連結:

2014年6月19日 星期四

Crystal Report 錯誤 - (0x8002000B): 無效的索引。

System.Runtime.InteropServices.COMException (0x8002000B): 無效的索引。 (發生例外狀況於 HRESULT: 0x8002000B (DISP_E_BADINDEX)) CrystalDecisions.ReportAppServer.DataDefModel.FieldsClass.get_Item(Int32 Index) CrystalDecisions.CrystalReports.Engine.ParameterFieldDefinitions.get_Item(Int32 index) CrystalDecisions.CrystalReports.Engine.ParameterFieldDefinitions.get_Item(String fieldName) CrystalDecisions.CrystalReports.Engine.ReportDocument.SetParameterValue(String name, Object val) 

以上很明顯看出是設定參數時發生錯誤。

報表的欄位可以分很多種,如下圖:

//這裡是設定資料庫欄位的綁定
rpDoc.SetDataSource(dtFinall);
//這裡是設定參數欄位的綁定
rpDoc.SetParameterValue("formno", dtFinall.Rows[0]["formno"].ToString());
rpDoc.SetParameterValue("orderno", dtFinall.Rows[0]["orderno"].ToString());
rpDoc.SetParameterValue("budget_code", dtFinall.Rows[0]["budget_code"].ToString());
rpDoc.SetParameterValue("batchno", dtFinall.Rows[0]["batchno"].ToString());
rpDoc.SetParameterValue("vat_num", dtFinall.Rows[0]["vat_num"].ToString());
rpDoc.SetParameterValue("supp_nm", dtFinall.Rows[0]["supp_nm"].ToString());
rpDoc.SetParameterValue("addr", dtFinall.Rows[0]["addr"].ToString());
rpDoc.SetParameterValue("work", dtPur_Basic.Rows[0]["purchaser_nmc"].ToString());

而錯誤主要是找不到參數欄位,明明有formno、orderno等欄位,但是在參數欄位中卻沒有設定,程式match不到就出錯了。

This error occurs when your parameters not matched in both reports & coding. May be your parameter name is wrong. So verify the parameters & parameter names are same in report & your coding.

2013年9月24日 星期二

超義科技 Power Process BPM Suite 6.0

最近工作上用到的開發簽核輔助工具,包括流程引擎、流程設計工具、流程管理平臺、使用者申請及簽核的BPM工作區,還有整合其他系統所需的整合管理伺服器等。

該套系統主要的概念是透過組織設定、流程設計抓取組織的設定,然後進行簽核。我沒有使用他所提供的簽核頁面,而是自己開發表單(ASP.Net)透過該公司提供的Web Service、再串流程設計工具,進行開發。

我的流程很簡單,但執行起來不簡單,細節很多:




功能增改申請單簽核流程













期間碰到不少問題,目前終於克服,進入最後細節修正階段。

  1. 開發的API文件相當不齊全,很多都只能用猜測的或問廠商窗口。
  2. 流程設計、管理平台、Web Service提供的模組不一致,導致debug困難。
  3. 流程設計中的程式撰寫,使用Javascript及Java混合體,很難判斷該用什麼語言,容易混淆,而且沒有debug工具,語法檢測沒什麼效用,不會告知程式有沒有錯誤。
  4. Web Service的建置有問題,廠商處理速度很慢,還一直覺得是我引用錯誤的問題。
  5. 呼叫web service錯誤產生的錯誤訊息不夠明確,很難判斷是程式錯還是web service錯。
  6. 子流程的部分,因為我要傳出所有分析人,其中可能有加簽者,不太好解。
  7. 組織沒有設定部門主管,只有用角色層級去做區分,故簽核人員可能無法直接選取,造成比較大的麻煩(這是本公司的問題)。
  8. 整體而言,套用該套工具,要對提供的模組夠熟悉才能節省時間,但是因為教育訓練不夠深入,再加上文件相當不齊全,很多問題都是實作時產生,進入的門檻相對高。

補充:
  1. 20131007,因為是呼叫既定的web service,無法設定tracsaction的起始和結束點,可能我系統已經存檔了,但是流程引擎exception會難以處理。

2013年7月11日 星期四

DataSet建立DataRelation

DataRelation的基本觀念在於,DataTable與DataTable之間,如果要建立關聯性,必須存在於同一個DataSet,再將DataTable加入分為Parent及Child的概念,建立關聯性程式碼如下:
 
private void CreateRelation() 
{
    // 建立Parent的關聯欄位
    DataColumn parentColumn = DataSet1.Tables["Customers"].Columns["CustID"];
    // 建立Chlid的關聯欄位
    DataColumn childColumn = DataSet1.Tables["Orders"].Columns["CustID"];
    // 建立關連性
    DataRelation rel = new DataRelation("CusOrd", parentColumn, childColumn);
    // 將關聯性置於DataSet中
    DataSet1.Relations.Add(rel);
}
 
讀取資料的方是如下:
 
//由Parent角度讀取Child資料
for(DataRow row in DataSet1.Tables["Customers"].Rows)
{
    //多筆->回傳陣列
      DataRow[] dr = row.GetChildRows("CustomersOrders");
      for(int i=0; i< dr.count; i++)
      {
            //process dr (即關聯中的Orders)資料
      }
}
 
//由Child角度讀取Parent資料
foreach(DataRow row in DataSet1.Tables["Orders"].Rows)
{
    //單筆
    DataRow parentRow = row.GetParentRow("CustomersOrders");
}


2013年6月19日 星期三

Crystal Report無法載入檔案或組件System.Web.Extensions

Crystal Report在執行時期出現以下錯誤:

無法載入檔案或組件 'System.Web.Extensions, Version=2.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35' 或其相依性的其中之一。 找到的組件資訊清單定義與組件參考不符。 (發生例外狀況於 HRESULT: 0x80131040)

 找了很久以為是參考的dll檔版本錯誤,結果發現dll並沒有直接相關,後來找到原因是web.config的<runtime>(組件繫結)設定要修改,由原本的1.1.0.0改為2.0.0.0,如下:

 <!--組件繫結-->
<runtime>
    <!--組件版本重新導向和組件位置-->
    <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
        <!--封裝組件的繫結原則和組件位置-->
        <dependentAssembly>
            <!--包含有關組件的識別資訊-->
            <assemblyIdentity name="System.Web.Extensions" publicKeyToken="31bf3856ad364e35"/>
            <!--將一個組件版本重新導向為另一個版本-->
            <bindingRedirect oldVersion="1.0.0.0-2.0.0.0" newVersion="3.5.0.0"/>
        </dependentAssembly>
    </assemblyBinding>
</runtime>