5 extensions น่าใช้และฟรี!! ใน K2 Community (ภาคสอง)

จากที่ได้รวบรวม 5 extensions น่าใช้และฟรี!! ใน K2 Community (ภาคหนึ่ง) ไปใน blog ก่อนหน้า ซึ่งได้แนะนำ extensions ส่วนใหญ่ที่เป็น control ไว้ใช้งานที่หน้าบ้าน blog นี้จะขอรวม extension หลังบ้านบ้างครับ ไปดูกันเลยว่ามีตัวไหนน่าสนใจบ้าง

ลำดับที่หนึ่ง: File service broker V2.0 (Download link)

Broker ตัวนี้ช่วยให้คุณสามารถเก็บไฟล์ลงบน server หรือ shared drive แทนที่จะเก็บลง database ได้อย่างง่ายดาย ใน version 2.0 นี้ยังเพิ่มความสามารถในการ ดึงไฟล์มาทั้ง folder ได้อีกด้วยนะ

FileSystem.png

ลำดับที่สอง: Excel Import and Excel Export

รวมมากัน 2 รายการเลยทีเดียว สำหรับการทำงานร่วมกับ Excel ไฟล์ เริ่มด้วย Excel Import (Download Link) เอาไว้สำหรับ upload file excel เข้า smart object  จากตัวอย่างในรูป เราจะเอาข้อมูลในไฟล์ TestData.xlsx ไปเข้า smartobject ชื่อ soExcelTest

excel

หลังจากมีการ import เข้า smartobject ไปแล้ว บางครั้งเราก็ต้องการเอาข้อมูลออกมาในรูปแบบของ Excel file เพื่อเอาไปใช้ทำงานต่อ ก็ใช้งานผ่านตัวนี้ได้เลย Excel Export (Download Link) ตัวนี้เป็น Control บน smartform นะ

แถมอีกตัว Excel Service Broker (Download Link) ข้างในจะมี method ให้ใช้งานประกอบไปด้วย GetCellValue, SaveCellValue, GetWorksheetNames และ GetWorksheetValues ตัวนี้จะต่างจากตัวที่ import excel เข้ามาเพราะเป็นการดึงค่าหรือบันทึกค่าตรง ๆ ลง excel file เลย

ลำดับที่สาม: Datafield Editor (Download Link)

Datafield เป็นตัวแปรที่เราสร้างขึ้นเพื่อไว้เก็บค่าต่าง ๆ ในการทำงานบน workflow ทั้งดึงค่ามาใช้ผ่าน smartobject หรือคำนวณค่าต่าง ๆ ใน workflow เอง ทีนี้ถ้า start workflow ไปแล้วเกิดมีการทำงานดึงค่าผิดขึ้นมา แล้วเรายังอยากให้ workflow นี้ทำงานต่อได้ เราสามารถใช้โปรแกรมนี้ในการเข้าไปแก้ไขค่านี้ตรง ได้เลย (แต่ทางที่ดี ก็ควรแก้ workflow ให้มันทำงานถูกต้องนะ จะได้ไม่ต้องมาตามแก้ทุกงาน)

datafield edtior

ลำดับที่สี่: ODBC Service Broker (Download Link)

จาก Blog [Smart Object] – K2 & MySQL (แบบไทย) ก่อนหน้าที่จะดึงข้อมูลจาก MySQL ก็ใช้ความสามารถของ ODBC เป็นตัวกลางในการเชื่อมต่อนีแหล่ะ

clip_image0025.jpg

ลำดับที่ห้า: Worklist service broker (Download Link)

สุดท้ายกับ Worklist Service Broker ตัว extension นี้ช่วยให้เราสามารถดึงข้อมูล worklist ขึ้นมาผ่าน smartobject ได้ นอกจากนี้ยังสามารถสั่ง action หรือ reditect ได้อีกด้วย

WorklistService

แต่งานส่วนใหญ่ที่เอา extension นี้มาใช้เพื่อทำ worklist ที่ต้องการแสดงคอลัมน์ที่เก็บไว้ในฐานข้อมูลอื่นมาแสดงด้วย ไว้วันหลังมีโอกาสจะมาเขียนวิธีการทำให้ดูนะครับ

ของใน Community โหลดมาใช้งาน ถ้าเจอบั๊ก เปิด ticket ไม่ได้นะ แต่สามารถโพสต์ถามใน community, Email ไปถามเจ้าของ extension หรือส่วนใหญ่เจ้าของก็มักจะแจก source code ให้เรามาด้วยอยู่แล้ว จะเอามา debug เพื่อแก้หรือเขียนเพิ่มไปเลยก็ได้ครับ

ไว้ถ้าได้ไปเจอ extension ตัวไหนน่าสนใจอีก จะนำมาแชร์กันอีกนะครับ วันนี้ลาไปก่อน สวัสดีครับ 🙂

Advertisements

Consume REST Services with K2

สวัสดีครับ เนื่องจากใน K2 4.7 มี broker ใหม่เพิ่มเข้ามา และเป็น broker ที่เราน่าจะได้ใช้กันเยอะในอนาคต broker ตัวนี้ก็คือ REST service broker นั่นเอง

การเชื่อมต่อ REST service ใน K2 จะแตกต่างจากการเชื่อมต่อ web service อื่นๆ อยู่ตรงที่ เรารู้แค่ url ของ web service นั้นไม่พอ สิ่งที่ต้องมีถัดไปคือ descriptor file ใน format ของ JSON ถ้าเป็น REST service ที่เราเขียนเองก็อาจจะไม่ยาก เพราะเราสามารถ generate JSON ออกมาจาก swagger ที่เราเขียนได้ แต่ถ้าไม่ได้เขียนเองมี option ตามด้านล่าง

โดยในส่วนที่อยู่ใน blog นี้จะเป็นการเขียนเอง

ถ้าจะเขียน descriptor เอง เราควรรู้อะไรบ้าง?

  • Format ที่ REST Service response ออกมา
  • Swagger syntax ที่จะใช้เขียน เพื่อทำ mapping กับ service ที่เราจะใช้

ผมเลือก service จาก Accuweather (https://developer.accuweather.com) มาลองดู สามารถสมัครมาลองใช้ได้ฟรี แต่ service ก็จะ limit หน่อย (ถ้าใครอยากลอง ก็ไปสมัครแล้ว register app ก็จะได้ API Key ที่ต้องใช้ในมา) ใช้ได้ไม่กี่อัน แต่หลักๆ ของ service ที่มีให้คือ การพยากรณ์ต่างๆ

Weather API

ที่เราจะใช้กันคือ Location API เพื่อหาพื้นที่ที่ต้องการ กับ Forecast API เพื่อดูพยากรณ์ (จริงๆ อยากใช้ Weather Alerts มากกว่า แต่แบบฟรีใช้ไม่ได้ T-T)  อย่างที่บอก เริ่มแรกคือ ต้องไปลองเรียก REST Service เพื่อให้ return response มาซะก่อน

API Response

พอได้ response เราก็เอามาเขียน swagger เพื่อที่จะ generate เป็น descriptor กัน รายละเอียดเกี่ยวกับ swagger ลองอ่านดูตาม link ด้านล่างนะครับ

Tool ที่ผมใช้ในการเขียน swagger ก็มาจาก swagger.io นี่แหละ ใช้เป็นแบบ online เลยง่ายดี สามารถเข้าไปได้ที่ http://editor.swagger.io  ถ้าเขียนเสร็จแล้วก็น่าจะได้ format แบบด้านล่างนี่ล่ะ

Swagger UI

สิ่งที่ควรระวังตอนเขียน swagger คือ ในบางกรณีที่เรามีการเรียกใช้ reference object ซ้อนๆ กัน การประกาศบางแบบอาจจะเรียกใช้ไม่ได้ใน K2 นะครับ แบบที่ใช้ได้จะมีตัวอย่าง file swagger ที่เขียนให้ download ตอนท้ายบทความครับ

เมื่อเขียนเรียบร้อย เราสามารถ generate JSON file ได้โดยเลือกเมนู File -> Download JSON

Download JSON

พอได้ file มา เราก็เอามา register กับ K2 โดยผ่าน SmartObject Service Tester

02-Register REST

03-Register 2

หลังจาก register แล้ว เราก็จะเห็น object ที่สามารถเรียกได้ตามด้านล่าง

04-After Regist

จะเห็นว่า มี method พวก Serialize กับ Deserialize มาด้วย method พวกนี้จะเป็น method สำหรับดึงค่าจาก type ที่ return มาเป็น structure เหมือนกับที่เราใช้ K2 ต่อกับ SAP หรือ web service อื่นๆ จากนั้นลองสร้างเป็น smartobject แล้วทดสอบดู

05-Test City Search

อย่างแรกเลยคือ call City Search เพื่อหาเมือง เพิ่งรู้นะเนี่ยว่า กรุงเทพฯ มีที่อินโดนีเซียด้วย พอได้แล้ว ผมก็เอา Key ไปใช้เพื่อหา forecast ของ 5 วันข้างหน้า

06-5 day forecast

ใน method นี้จะ return Headline หรือคือ พาดหัวข่าวสำคัญ เช่น ฝนจะตกหนักวันไหน กับรายละเอียด forecast มาเป็น object ส่วนที่เราต้องทำถัดไปคือ เอา xml ยาวๆ ที่ได้ ไป call method Deserialize เพื่อให้แสดงผลออกมาเป็น property ออกมา

ส่วนของ Headline ผมได้ xml ตามด้านล่างออกมา

{“$type”:”Accuweather.k2RESTidentifier_Headline, Accuweather, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null”,”EffectiveDate”:”2017-08-13T01:00:00+07:00″,”Text”:”A thunderstorm late Saturday night”,”Category”:”thunderstorm”,”Link”:”http://www.accuweather.com/en/th/bangkok/318849/daily-weather-forecast/318849?lang=en-us”}

ผลหลังจากการ call โอ๊ะ!!! ฝนตกหนักคืนวันเสาร์ตอนดึกๆ

07-Headline Call

ส่วนของพยากรณ์จะได้เป็น array ออกมา

{“$type”:”Accuweather.k2RESTidentifier_DailyForecast[], Accuweather, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null”,”$values”:[{“$type”:”Accuweather.k2RESTidentifier_DailyForecast, Accuweather, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null”,”Date”:”2017-08-10T07:00:00+07:00″,”Link”:”http://www.accuweather.com/en/th/bangkok/318849/daily-weather-forecast/318849?day=1&lang=en-us”},{“$type”:”Accuweather.k2RESTidentifier_DailyForecast, Accuweather, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null”,”Date”:”2017-08-11T07:00:00+07:00″,”Link”:”http://www.accuweather.com/en/th/bangkok/318849/daily-weather-forecast/318849?day=2&lang=en-us”},{“$type”:”Accuweather.k2RESTidentifier_DailyForecast, Accuweather, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null”,”Date”:”2017-08-12T07:00:00+07:00″,”Link”:”http://www.accuweather.com/en/th/bangkok/318849/daily-weather-forecast/318849?day=3&lang=en-us”},{“$type”:”Accuweather.k2RESTidentifier_DailyForecast, Accuweather, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null”,”Date”:”2017-08-13T07:00:00+07:00″,”Link”:”http://www.accuweather.com/en/th/bangkok/318849/daily-weather-forecast/318849?day=4&lang=en-us”},{“$type”:”Accuweather.k2RESTidentifier_DailyForecast, Accuweather, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null”,”Date”:”2017-08-14T07:00:00+07:00″,”Link”:”http://www.accuweather.com/en/th/bangkok/318849/daily-weather-forecast/318849?day=5&lang=en-us”}]}

ผลหลังจากการ call ก็เป็นตามด้านล่าง

08-DailyForecast Call

จริงๆ ค่าที่ REST return มามีมากกว่าที่ผมเอามาแสดง แต่ผมเขียน swagger เพื่อเอาค่ามาเฉพาะที่ต้องการเท่านั้น (ขี้เกียจนั่นเอง = =’) ถ้าใครอยากดูตัวอย่างการเขียน swagger กับ file JSON ที่ generate ออกมาได้สามารถ download ได้ตาม link ด้านล่างนะครับ

สำหรับคราวนี้ก็ขอลาแต่เพียงเท่านี้ พบกันใหม่คราวหน้าครับ 🙂

 

 

 

 

[K2 SmartForms] – Using Field Property

สวัสดีครับ หายไปนานกับ blog ของ K2 Ranger พอดีวันนี้มีคำถามเข้ามาทาง page K2 Thailand เกี่ยวกับการเลือก field ที่ผูกกับ data source เลยเอามาเขียนให้อ่านกัน

ในส่วนแรกให้เราสร้าง property field เพิ่มใน file .cs

public string Field

{

get

{

return base.GetOption<string>(“Field”, string.Empty);

}

set

{

base.SetOption<string>(“Field”, value, string.Empty);

}

}

จากนั้นก็ไปเพิ่ม property ใน file definition.xml ของ control

<Prop ID=”Field” mappable=”false” friendlyname=”Field” category=”Detail” refreshdisplay=”false” type=”complex” InitializeServerControl=”initializeFieldPropertyConfig” ClearServerControl=”clearFieldConfig” ServerControl=”SourceCode.Forms.Controls.Web.FieldConfiguration.FieldPropertyConfig,SourceCode.Forms.Controls.Web” />

เพิ่มแล้วเรียบร้อยให้ลอง build แล้ว deploy ใหม่ดู เราก็จะสามารถดึง field ที่อยู่ใน SmartObject ที่ผูกกับ view นี้ออกมาได้

Field

FieldSelection

จะมองเห็นเฉพาะ field type ที่ control นี้สามารถใช้งานได้ด้วย

   ส่วนวิธีเอาค่าจาก Field property ไปใช้ต่อ ก็ใช้วิธีเดียวกันกับการดึงค่าใน property อื่นๆ ไปใช้นะครับ สำหรับรอบนี้ขอลาไปเท่านี้ครับ 🙂

 

K2 OnPremise + SharePoint Online

สวัสดีครับชาว K2 Ranger ทุกท่าน

พอดีได้มีโอกาสทำการเชื่อมต่อระหว่าง K2 On Premise กับ SharePoint 365 จึงอยากมาแชร์ช้อมูลครับ

Scenario

  1. มี K2 On Premise
  2. มี SharePoint Team Site อยู่บน Office 365  (เคสนี้ยังไม่ได้ทำ Office 365 เป็นแบบ Hybrid)
  3. ต้องการสร้าง Approval Workflow ในกรณีที่ต้องการเปลี่ยนเบอร์โทรศัพท์ใน Contact List

โดยสิ่งที่เราทำ ก็คือ เราเชื่อมต่อ K2 กับ SharePoint ด้วยการใช้ SharePoint Contant Broker ในการสร้าง Service Instance

K2SPO

ทริกเล็กน้อยคือ การกำหนดค่า “Office 365 – Required”  ให้เป็น “true”  (ค่า default จะเป็น false)

K2SPO-00

หลังจากนั้นก็เหมือนวิธีการปกติเลยครับ ซึ่งจะมีการกำหนด System Name, Display Name, Description, GUID ของ Service Instance แบบที่เคยทำกัน และเราก็จะสามารถสร้าง SmartObject เชื่อมต่อกับ List บน SharePoint Online ได้แล้ว

K2SPO-01

ซึ่งนี้เป็นขั้นตอนที่สำคัญที่สุดแล้วครับ หลังจากการเชื่อมต่อได้แล้ว เราก็จะสามารถเชื่อมกับ List ผ่าน SmartObject ได้ พอเราสร้าง SmartObject ในการเชื่อมต่อได้แล้ว สิ่งที่เหลือก็เพียงแค่การสร้าง SmartForm, Workflow บน K2 On Premise ครับ

K2SPO-02

เพียงเท่านี้ เราก็สามารถ update ค่าจาก K2 SmartForm ของเราไป Update ค่าบน SharePoint 365 ได้ล่ะ

K2SPO-04

K2SPO-03

หวังว่าจะมีประโยชน์บ้างครับ กับลูกค้าที่มี K2 และใช้ SharePoint Online หรือ Office 365

Amornthep Chanajarunwit

Business Development Consultant

[K2 SmartForms]+[SmartObject]-เปลี่ยน SmartBox Services เป็น SQL Server Services

สวัสดีครับ…หลายๆ คนที่เคยเห็นหรือเคยทำ K2 คงจะคุ้นเคยกับ SmartBox services ไม่มากก็น้อย ข้อดีของ SmartBox services ก็คือ ใช้งานง่าย และสร้าง data structure ได้อย่างรวดเร็ว แต่ก็มีข้อเสียสำคัญอยู่ก็คือ data structure ที่สร้างด้วย SmartBox services นั้นจะโดนสร้างอยู่ใน database K2 เลย ในระยะยาวจะทำให้ database K2 ใหญ่ขึ้นเรื่อยๆ และไม่สามารถ archive เฉพาะ data ของ SmartBox service ใน database K2 ออกไปได้ ซึ่งจะมีผลทำให้ performance แย่ลง และ maintain database ยากขึ้น

เราอาจจะมีคำถามว่า แต่ถ้าใช้ไปแล้วจะทำอย่างไรล่ะ?? สิ่งที่เรารู้สึกน่าจะเป็นเพลง จะกลับตัวก็ไม่ได้~ ให้เดินต่อไปก็ไปไม่ถึง~  แต่เดี๋ยวก่อน!!! เรามีทางออกให้คุณอยู่ 3 แบบด้วยกัน

  1. สร้างใหม่หมด – อันนี้เป็นในกรณีที่สร้างไว้ไม่เยอะ และคิดว่า สร้างใหม่ง่ายกว่า
  2. สร้าง SmartObject ทับของเดิม – ทางนี้ง่ายตอนสร้าง SmartObject แต่จะต้องตามไปแก้ rule ใน SmartForms ที่เรียกใช้ด้วย วิธีนี้ใช้ วิธีเดียวกับที่เราใช้ตอนเปลี่ยนแปลง data structure ของ table นั่นเอง
  3. แก้ method ใน SmartObject ให้ชี้ไปที่ใหม่ – ยากกว่าตอนสร้าง SmartObject แต่ไม่ต้องตามไปแก้ rule ใน SmartForms (ในเคสที่ผมทดสอบแบบง่ายๆ ไม่ต้องแก้ แต่ว่าถ้าเป็น application ที่ซับซ้อนยังไม่ได้ทดสอบนะครับ) *แนะนำให้ใช้วิธีนี้จะดีกว่าครับ

 

Common Step

ในการทำทั้งวิธีที่ 2 และ 3 สิ่งที่ต้องทำก่อนจะมีตามนี้ครับ

  • Generate script สร้าง table ที่เราต้องการจะย้ายออกมาจาก SmartBox services ซึ่งสามารถไปดูได้ใน database K2 schema dbo
  • ได้ script มาแล้ว ก็เอามาสร้างใหม่ใน database ที่ต้องการ
  • Register SQL Service Instance ที่เชื่อมต่อกับ database นั้นให้เรียบร้อย

 

สร้าง SmartObject ทับของเดิม

เมื่อทำตาม Common step เรียบร้อยแล้ว ก็ถึงเวลามาแก้ SmartObject ของเรากัน

  • เปิด SQL Service Instance ที่ต้องการ
  • Click ขวาที่ table ที่ต้องการ แล้วเลือก “Create SmartObject”

Create SMO

  • ที่หน้าสร้าง SMO ให้ใส่ชื่อให้ตรงกับ SmartObject เดิม และกดปุ่ม “Get Exisint Guid” เพื่อดึง Guid ของ SmartObject เดิมมา แล้วก็กดปุ่ม “Publish SmartObject”

Get existing GUID

  • เมื่อสร้างเรียบร้อยแล้ว ถ้ามาลองใช้งาน application ดู จะพบว่า บาง action จะ error เป็นเพราะว่า ชื่อ method ของ SmartObject ที่มาจาก SmartBox กับ SQL Service จะใช้คนละชื่อกัน (อย่างเช่น Get List กับ List, Save กับ Update)

Error Get List

  • สิ่งที่ต้องทำถัดไปก็คือ ไปแก้ใน Rule ของ Form และ View ที่เราใช้งาน (จะมี error บอกอยู่หน้า action ที่ต้องแก้) และหลังจากเลือก method ใหม่แล้วก็ต้องมา configure mapping ใหม่ด้วย

Error In Rule

Error In Rule 2

  • เมื่อแก้ไขเสร็จแล้ว application ก็จะใช้งานได้เหมือนเดิมครับ

 

แก้ method ใน SmartObject ให้ชี้ไปที่ใหม่

มาถึงอีกวิธีที่เราแนะนำกันดีกว่า

  • มี 2 วิธีที่จะแก้ method ของ SmartObject คือ แก้ตรงๆ ผ่าน K2 Designer บน web เลย หรือแก้ผ่าน K2 Studio / Visual Studio โดยผมจะแนะนำวิธีแก้ผ่าน K2 Studio / Visual Studio เป็นหลักนะครับ เพราะสามารถทำ composite SmartObject ได้ด้วย (ในกรณีที่มีการทำ Composite SmartObject ไว้ก่อนย้าย)
  • ก่อนอื่นให้ download file SmartObject .sodx ออกมาก่อน โดย click ขวาที่ SmartObject ที่ต้องการแล้วเลือก “To Sodx”

To sodx

  • เมื่อได้ file มาแล้วก็เอามาเปิดโดยใช้ K2 Studio / Visual Studio ให้กดเลือก method ที่ต้องการแก้ไขและกดปุ่ม “Edit”

Edit method

  • ที่หน้า Wizard หน้าแรกให้เลือก “Run the wizard in Advanced Mode”

Advanced Mode

  • ให้กด “Next” ไปจนถึงหน้าเลือก Service Object จะเห็นว่ามี Service Object เดิมอยู่ในกดปุ่ม “Remove” เพื่อลบ Service Object เดิม

Remove

  • เมื่อลบแล้วให้กดปุ่ม “Add” แล้วเลือก Service Object Method ที่ต้องการ

Select Method

  • เมื่อเลือกแล้ว จะมี list ของ property ที่มีใน method ที่เลือกมา ให้กดปุ่ม “Auto Map” เพื่อ map property ของ SmartObject เข้ากับ property ของ Service Object ได้เลย *ที่ใช้ Auto Map ได้ เพราะว่า ชื่อ Property ควรจะเหมือนเดิม แต่ถ้าเรามีแก้ชื่อ field ใน table อาจจะใช้ Auto Map ไม่ได้นะครับ

Auto map

  • ทำเสร็จแล้วก็กดปุ่ม “OK” และ “Finish” จากนั้นก็ทำอย่างนี้กับทุก method จนครบ
  • เมื่อแก้ method เรียบร้อยแล้ว ให้มาดูที่ SmartObject Property  ถ้ายังมี Property ที่ถูกเลือกเป็น Smart Box อยู่ ให้ uncheck ให้หมด

Uncheck SmartBox

  • จากนั้นก็ Deploy SmartObject ที่แก้แล้ว และลองทดสอบ Application ดูครับ

 

K2 version ที่ใช้ทดสอบในบทความนี้เป็น K2 4.6.11 นะครับ แต่คิดว่า น่าจะใช้งานได้ทุก version เพราะ concept จะเหมือนๆ กัน สำหรับคราวนี้ก็ขอลาไปเพียงเท่านี้ครับ 🙂

 

 

[K2 SmartForms]-Upload File แบบใหญ่ๆ

สวัสดีครับ กลับมาเจอกันอีกแล้วในปลายปีที่เหมาะกับการไปเที่ยว แต่หลายๆ คนก้ไม่ได้ไปเที่ยว ยังต้องนั่งทำงานอยู่ (เหมือนผม T^T)  คราวนี้เราจะพูดถึงเรื่องที่เกือบทุก application ต้องใช้ นั่นก็คือ ไฟล์แนบ

โดยปกติไฟล์แนบที่ใช้กันใน application จะมีทางเลือกในการเก็บไฟล์ตามด้านล่าง

  1. เก็บไฟล์ใน database => สะดวก, สามารถแยก archive ได้ แต่ถ้าเก็บเยอะๆ หรือไฟล์ขนาดใหญ่ ก็จะมีปัญหาเรื่อง performance
  2. เก็บไฟล์ใน share path => เก็บไฟล์ขนาดใหญ่ได้ แต่ archive ลำบาก และในส่วนของ K2 จะต้องลง component เพิ่มเพื่อเก็บ file ลง share drive
  3. เก็บไฟล์ใน system อื่น => ที่เคยเจอมาก็เป็น SharePoint (แต่สุดท้ายก็ลงใน database อยู่ดี), WebService (ที่ไม่รู้เอาไปเก็บปลายทางไว้ที่ไหน) หรืออาจจะเป็น Document Management อย่างอื่นๆ

ในด้าน Document Management Solution ที่เกี่ยวกับ K2 ปกติจะเป็นการใช้ K2 + SharePoint โดย K2 จะเป็นตัวช่วยในการทำ application และ SharePoint จะเป็น storage ในการเก็บไฟล์ ถ้าเป็นไฟล์ขนาดเล็ก ก็คงไม่ค่อยมีปัญหาอะไร แต่ถ้าต้องเก็บไฟล์ขนาดใหญ่ล่ะ จะทำอย่างไรดี???

มาดูในฝั่ง K2 กันก่อน จาก recommendation K2 จะรองรับไฟล์ขนาดประมาณ 300 MB (ผ่านการเรียก SmartObject เพื่อ save ไฟล์ลง database) แต่ถ้าเกินกว่านี้ ไม่แนะนำ และอาจจะเจอ error ได้ ดังนั้น option ที่มีคือ การเก็บไฟล์ตรงไปที่ destination ตรงๆ เลย พอคิดได้แล้ว ก็จะมีคำถามอยู่ในใจว่า เราจะสามารถเอา file มาจาก file attachment control ของ SmartForms มา upload ได้อย่างไร?

การทำงานของ file attachment control ก็จะเหมือน control สำหรับทำ file attachment ทั่วไป คือ จะ load file ไปวางไว้ใน temporary folder ซักที่หนึ่ง แล้วค่อยเอา file ไปใช้งานต่อ โดยจะใช้ temporary folder structure ตามด้านล่าง

TempFilePath Info

(A) – เป็น fix path อยู่ใน C:\ProgramData\IsolatedStorage

(B) – จะต่างกันไปตามแต่ละ server

(C) – จะเหมือนกันในทุก server คือ StrongName.sv3o0piwfpl3mmnmzxoxnb4xggpgeagc\AssemFiles

(D) – จะ generate ใหม่ทุกครั้งที่แนบ file สามารถหาได้จาก file attachment control

TempFilePath

เมื่อเลือก file เพื่อ upload ไปแล้ว เวลาดึงข้อมูลออกมาจาก file attachment control จะได้มาในรูปของ xml ตามด้านล่าง

<collection>TestC.txt4uko05zx.hsd\TestC.txt</collection>

โดยตัวที่ผมทำเป็นตัวหนาไว้ ก็คือค่า (D) นั่นเอง สำหรับ solution ที่ผมได้ทดลองทำจะเป็นการ upload file ขึ้น SharePoint สิ่งที่ผมทำมีดังนี้

  1. เอา xml ที่เห็นด้านบน มาตัด เพื่อหาชื่อ file และมาต่อกับ temporary folder เพื่อสามารถเปิดอ่าน file ขึ้นมาได้

//fileInfo คือ

string fileName = fileInfo.Substring(fileInfo.IndexOf(“‘FileName’><value>”) + 18, (fileInfo.IndexOf(“</v”) – fileInfo.IndexOf(“‘FileName’><value>”) – 18));

string fileExtension = fileName.Substring(fileName.IndexOf(“.”));

string currentDate = DateTime.Now.ToString(“yyyyMMddHHmmssff”);

//Rename file name to be unique => ใส่วันที่ และเวลาเพื่อให้ชื่อ file ไม่ซ้ำ
fileName = fileName.Replace(fileExtension, “”) + “-” + currentDate + fileExtension;

 

string filePath = fileInfo.Substring(fileInfo.IndexOf(“‘FilePath'”));
filePath = filePath.Substring(filePath.IndexOf(“‘FilePath’><value>”) + 18, (filePath.IndexOf(“</v”) – filePath.IndexOf(“‘FilePath’><value>”) – 18));

//หา file path มาแล้ว ต่อด้วย .temp เพราะตอน file ถูกใส่ใน temporary folder control จะ add .temp ให้หลังชื่อ file
filePath = tempFilePath + filePath + “.temp”;

2.  ใช้ FileStream class สำหรับอ่าน file ขึ้นมาเป็น stream

FileStream contentStream = new FileStream(filePath, FileMode.Open, FileAccess.Read);

3.  Upload file ขึ้น SharePoint

//Url ที่ใช้ต้องเป็น url ถึงระดับ site ที่ต้องการ เช่น http://portal/sites/TestSite

ClientContext ctx = new ClientContext(sharePointUrl);

Web web = ctx.Web;

FileCreationInformation flciNewFile = new FileCreationInformation();
flciNewFile.ContentStream = contentStream;
flciNewFile.Url = fileName;
flciNewFile.Overwrite = true;

List docs = web.Lists.GetByTitle(libraryName);
Microsoft.SharePoint.Client.File uploadFile = docs.RootFolder.Files.Add(flciNewFile);
ctx.Load(uploadFile);
ctx.ExecuteQuery();

หลังจากสร้างเป็น class เรียบร้อย เราก็สามารถเอา class นี้ไปเรียกใช้ผ่าน SmartObject ได้เป็นอันเสร็จพิธี 🙂  แล้วพบกันใหม่คราวหน้าครับ

อนึ่ง. ได้ทดลองและทดสอบกับ K2 4.6.9 + SharePoint Foundation 2013 ถ้าเอาไปใช้กับ version อื่น โปรดตรวจสอบความถูกต้องก่อนใช้

อสอง. reference link ของ SharePoint upload large file มาจาก https://msdn.microsoft.com/en-us/library/office/dn904536.aspx

[K2API] SmartObject Error ว่า Exception of type ‘SourceCode.SmartObjects.Client.SmartObjectException’ was thrown.???

วันนี้เรากลับมานำเสนอ KB สำหรับเหล่าชาวขาเดฟผู้เรียกใช้งาน K2 API ในส่วนของการต่อ SmartObjects กันบ้างนะครับ

เริ่มด้วยตัวอย่างจากโค้ดข้างล่าง เป็นการดึงข้อมูลจาก SmartObjects ที่ชื่อว่า Comments ขึ้นมาเก็บใน DataTable

SMOGetList1

ทำงานไปก็ใช้งานได้ปกติครับ แต่วันดีคืนร้าย เกิดมี error ขึ้นมาในส่วนนี้จะทำยังไง …ไม่ต้องตกใจเราเขียน try-catch ให้มี exception ออกมาแล้วนี่นา เดี๋ยวไปเช็คใน log เอาละกัน

SMOGetListError0

SMOGetListError

อ่าว..แย่ล่ะสิ Exception ที่ใช้กันมานมนาน ฟ้องว่า “Exception of type ‘SourceCode.SmartObjects.Client.SmartObjectException’ was thrown.” แต่ดันไม่ได้บอกว่ามัน error ที่ไหน ใน InnerException ก็ไม่มีซะด้วย

พระเอกข้างเราคือโค้ดด้านล่างนี้เลยครับ เอาไปใส่แทน catch (Exception ex) ไปเลย

catch (SmartObjectException soe)
 {
 StringBuilder errorMessage = new StringBuilder();
 foreach (SmartObjectExceptionData smartobjectExceptionData in soe.BrokerData)
 {
 string message = smartobjectExceptionData.Message;
 string service = smartobjectExceptionData.ServiceName;
 string serviceGuid = smartobjectExceptionData.ServiceGuid;
 string severity = smartobjectExceptionData.Severity.ToString();
 string innermessage = smartobjectExceptionData.InnerExceptionMessage;
 errorMessage.AppendLine("Service: " + service);
 errorMessage.AppendLine("Service Guid: " + serviceGuid);
 errorMessage.AppendLine("Severity: " + severity);
 errorMessage.AppendLine("Error Message: " + message);
 errorMessage.AppendLine("InnerException Message: " + innermessage);
 }
 throw soe;
 }

มาทดสอบใหม่อีกครั้งกันครับ

SMOGetListError2

คราวนี้เห็นรายละเอียดครบเลย ว่า error ที่ SmartBoxService และ error ฟ้องว่าชื่อคอลัมน์ของ smartobjects ที่ชื่อ “Comments” มันไม่ถูกนะ ..สงสัยจะมีคนเปลี่ยนชื่อคอลัมน์ใน database

หวังว่าจะช่วยให้ debug กันง่ายขึ้นครับ ผมขอไปหาคนที่มาเปลี่ยนชื่อคอลัมน์ก่อน -“-