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 ด้านล่างนะครับ

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

 

 

 

 

Advertisements

[Patch] – K2 4.7 Release Note แบบไทยๆ

สวัสดีครับ หายหน้าหายตาไปนาน รอบนี้กลับมาพร้อมกับ major release ของ K2 ซึ่งก็คือ K2 4.7 นั่นเอง สำหรับรอบนี้ผมอาจจะเขียนเป็น overview ก่อนว่า K2 มีอะไรใหม่ๆ ออกมาบ้าง และค่อยไปลงลึกในแต่ละส่วนใน blog ถัดๆ ไป (จะได้เขียนไหม 555) แล้วกัน ถ้าใครอยากดู release note แบบเต็มๆ ก็สามารถดูได้ที่ http://help.k2.com/kb001745 และสำหรับ compatible matrix ของ K2 4.7 สามารถดูได้ที่ http://help.k2.com/blackpearl/support-matrix ครับ

 

    OS and Software Support

  •     OS – ไม่ support Windows 2008 R2 แล้ว ส่วนฝั่ง client ก็ต้องเป็น Windows 8.1 ขึ้นไป

server-support

client-support

  •    SQL – Support Azure SQL Database แล้ว minimum เป็น Azure SQL S2 และ recommend เป็น Azure SQL P1 ซึ่งจะ support เฉพาะการลง K2 ใหม่เท่านั้น ไม่สามารถนำ database เก่าจาก SQL version อื่นมา restore แล้ว upgrade ได้  ถ้าเป็น on-premise support SQL Server 2016 เรียบร้อย ส่วน SQL Server 2008 R2 ไม่ support แล้วตามๆ กันไปกับ Windows 2008 R2

sql-support

  • SharePoint –  Support SharePoint 2016 แล้ว ส่วน SharePoint 2010 หมดการ support
  • Visual Studio – Support Visual Studio 2015 และ 2013
  • .NET Framework – Require ว่าต้องลง 4.6.1 แต่ตรงนี้ควรระวังนิดนึงนะครับ เพราะ K2 4.6.11 ไม่ support .NET Framework 4.6.1 ดังนั้น ถ้า upgrade ต้องดู step rollback ดีๆ
  • Exchange – Support Exchange 2013 – 2016
  • InfoPath – ไม่มี support แล้วใน K2 4.7
  • Oracle – Support Oracle 12c (Release 1) ลงไปถึง Oracle 11g (Release 1)
  • Browser – ทั้ง Design time และ Runtime support IE 11 อย่างเดียว ไม่มีวี่แววของ Microsoft Edge โดยรายละเอียดของ version support ตามด้านล่าง

Internet Explorer 11.0.10240.17071
Chrome 53.0.2785.101 m
Firefox 48.0.2
Safari Version 9.1.2 (Windows support deprecated. Latest Safari version is only supported on Mac)

 What’s New

K2 blackpearl

  • REST Endpoint Broker with Swagger support
  • Package and Deployment
    • สามารถทำการ Package by Reference ได้ ซึ่ง feature นี้จะทำให้ไม่ต้อง package ทุก items ลงไปใน package เดียวกัน
    • Performance enhancement
    • Package Analyzer – ไม่มีให้เลือก Full Analysis กับ Partial Analysis อีกต่อไป และ ‘Automatically analyse after each change’ จะไม่เป็น default option ซึ่งจะช่วยให้ performance ในการทำงานเร็วขึ้น
  • K2 Workspace – Management console ใน K2 Workspace จะมี site แยกมาเป็น K2 Management Site (Management console เดิมจะยังสามารถใช้งานได้ใน K2 4.7 แต่ recommend ให้เปลี่ยนไปใช้ K2 Management Site แทน เพราะต่อไปน่าจะถูกเอาออก)

4-7-dashboard

  • Out of Office Notification – มีการส่ง email notify ให้คนที่ถูก forward งานไปให้จากการทำ Out of Office
  • Activity and Event System Name – ตอนนี้ Activity กับ Event มีการใช้ concept ของ System Name แล้ว เพื่อให้ไม่มีปัญหาตอนทำ package and deployment กรณีที่มีการเปลี่ยนแปลงชื่อ Activity หรือ Event

K2 smartforms

  • Dependencies – เพิ่ม dependencies check report สำหรับดูว่า มี item อะไรที่มีปัญหา หรือต้องทำการแก้ไขก่อนการทำ package
  • Controls
    • Barcode – Capture barcode ผ่าน K2 Mobile app (iOS)
    • Image Annotation – ถ่ายรูปแล้วใส่ annotation ผ่าน K2 Mobile app (iOS)
    • Tree Control – เพิ่ม keyboard navigation, search, Async loading
    • Worklist Control – Sorting Status column ได้
  • Runtime performance improvement
  • SmartForms email – ปรับไปใช้ configure เดียวกับของ K2 blackpearl และถ้า error จะมี log อยู่ใน hostserver log แล้ว
  • Installer – K2 SmartForms Control Pack ถูก merge เข้ากับ K2 SmartForms แล้ว ทำให้ run setup ครั้งเดียวได้

 

จะเห็นว่า ส่วนที่น่าสนใจและน่าจะกระทบกับการทำงานเยอะๆ จะเป็น K2 Management Site, Dependencies check report ของ SmartForms และ Package Deployment ที่มีการปรับปรุงให้ดีขึ้น แล้วจะมาเขียนรายละเอียดให้อ่านกันอีกรอบนะครับ สำหรับวันนี้ขอจบแต่เพียงเท่านี้ครับ 🙂

[K2 Blackpearl] Performance enhance โดย K2 Archiving

สวัสดีครับ วันนี้ขอนำเสนออีกหนึ่ง feature ของ K2 ที่ไม่ค่อยได้กล่าวถึงและใช้งานกันสักเท่าไหร่นะครับ ซึ่ง feature นี้ก็คือ K2 Archiving ตามหัวข้อนั่นเอง

เมื่อเราใช้งาน K2 ไปสักระยะหนึ่ง ขนาดไฟล์ของ database K2 นั้นก็จะเพิ่มขึ้นไปตามปริมาณการใช้งานไปด้วย การลดขนาดของ database ได้นั้นจะช่วยให้การทำงานโดยภาพรวมของระบบเร็วขึ้นทั้งส่วนของ K2 และส่วนของ MS SQL Server ด้วย  Archiving เป็น feature ที่มีเพื่อทำการย้ายข้อมูลของ process ของ K2 ที่จบการทำงานแล้วเท่านั้น ไปไว้ใน database อีกก้อนนึง

เรามาดูขั้นตอนการทำ archiving กันครับ

  1. สร้าง database ก้อนใหม่ใน MS SQL Server (ต้องอยู่ใน instance เดียวกันกับ K2) ในตัวอย่างผมตั้งชื่อว่า K2Archive01-CreateArchivingDB
  2. เข้า K2 workspace ไปที่เมนู Management Console -> [K2 Server Name]  -> Workflow Server -> Archiving02-ArchivingMenu
  3. ในส่วนของ Archive Database ให้กด Select แล้วเลือก database ที่เราสร้างไปในข้อที่ 103-SelectDB
  4. เลือกวันที่ From Date และ To Date (ตรงนี้แนะนำให้เก็บของปีปัจจุบันไว้ครับ เช่น เลือกตั้งแต่ 01/01/2014 – 31/12/2015)
  5. กด Archive แล้วรอจนขึ้นว่า Archiving completed successfully  ระยะเวลานั้นจะขึ้นอยู่กับปริมาณข้อมูลครับ บางที่ถ้าข้อมูลเยอะ อาจะต้องใช้เวลาเป็นชั่วโมง

หลังจากทำการ Archiving เสร็จสิ้น ลองเข้ามาตรวจสอบในหน้า Process Overview ดู ก็จะพบว่าปริมาณงานในหน้ารายงานนี้จะลดลงไป รวมข้อขนาดก้อนของ database ก็ลดลงด้วยเช่นกัน

04-Completed

Process ที่ถูก archive ไปแล้วจะไม่สามารถดูรายงานได้  เพราะฉะนั้นจึงแนะนำให้เลือกช่วงเวลาย้อนหลังไปหน่อย เพื่อย้ายงานที่เก่าที่ไม่ต้องการดูรายงานหรือไม่ต้อง audit แล้วเท่านั้น อย่างไรก็ตามเราสามารถที่จะนำข้อมูลที่ archive ไปแล้ว มา restore กลับคืนใน database ของ K2 ได้ โดยใช้หน้าจอเมนูเดียวกันครับ

ส่วนของการทำ Archiving ก็จบลงเพียงเท่านี้ครับ หวังว่าจะมีประโยชน์ต่อการทำ enhance performance นะครับ ต่อไปถ้ามีโอกาสจะนำเทคนิคการ tuning performance ข้ออื่น ๆ มานำเสนออีกครับ ส่วนวันนี้…สวัสดีครับ 🙂

[K2 blackpearl] – หาชื่อคนทำ action ใน activity

สวัสดีครับ กลับมาอีกครั้งกับ blog ของ K2 Ranger คราวนี้เป็นคำถามเกี่ยวกับ workflow โดยปกติ K2 จะมี log อยู่แล้วว่า ใครทำอะไร และทำเมื่อไหร่ ซึ่งสามารถดูได้จาก report ของ K2 หรือใช้ SmartObject ชื่อ “Activity Instance Destination” (อยู่ใน category Workflow Reports -> Workflow General ดึงข้อมูลออกมาแสดง)

Activity Instance Destination

แต่ทีนี้มีคำถามว่า ถ้าเราอยากดึงข้อมูลใน workflow ณ ขณะนั้นหลังจาก user ทำ action มาเลยได้ไหม??? เพราะเราอยากจะส่ง email ไปแจ้งเตือนว่า มีคนทำ action นี้ หรือบางกรณีเพื่อเก็บชื่อคน action ใน activity นี้ส่งไปทำงานใน activity ถัดไป

อย่างแรกที่ต้องทำคือ set plan ใน Destination Rule Options เป็น “All at once” ซึ่งการเปลี่ยน plan ตรงนี้ต้องกดเข้า Advance Mode ของ Destination Rule ก่อน

All at Once

จากนั้นขึ้นกับว่า เราจะอยากได้ข้อมูลอะไรของ user ที่ใช้บ่อยๆ ก็จะเป็น Name (SAMAccount name ใน AD), Email หรือ FQN ไปเก็บไว้ที่ไหน ในรูปจะเป็นการ transfer FQN ของ user ใส่ datafield เพื่อนำไปใช้ต่อผ่าน Data Event แต่เราก็สามารถเอาไป save ลงใน database ผ่าน SmartObject event ก็ได้เช่นกัน โดยต้องเอา Data Event หรือ SmartObject Event นั้นใส่ไว้ใน activity เดียวกันกับ activity ที่ user ทำ action

Activity

Activity Destination Instance

ถ้าเราไม่ได้เข้า Advance Mode แล้วเปลี่ยน plan เป็น “All at once” การดึงข้อมูล user ตรงนี้จะได้เป็นข้อมูล service account หรือได้ค่าว่าง (จำได้ว่า ก่อน 4.6 จะเป็นค่าว่าง แต่มีคนเทสตอนเป็น 4.6.11 แล้วได้ service account)

สำหรับคราวนี้ขอจบแต่เพียงเท่านี้ครับ สวัสดีครับ

 

[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 กันง่ายขึ้นครับ ผมขอไปหาคนที่มาเปลี่ยนชื่อคอลัมน์ก่อน -“-

 

[K2 for SharePoint] – Configuration Checklist

สวัสดีครับ ช่วงที่ผ่านมาได้มีโอกาส configure K2 for SharePoint 2013 แบบจริงจัง (คือ ปกติไม่จริงจัง ใช่ไหม = =’) และพบปัญหาในการทำค่อนข้างเยอะ เพราะ step ในการ configure ส่วน SharePoint ที่ต้องทำเยอะจนจำไม่ไหว เลยอยากจด step คร่าวๆ เพื่อเป็นแนวทางสำหรับผู้ที่สนใจ อยากลอง หรือโดนบังคับให้ทำ (ซึ่งคิดว่า กลุ่มหลังสุดน่าจะเยอะกว่า 555) และเผื่อกันลืม (จริงๆ สาเหตุที่เขียนน่าจะเป็นอันหลังนี่แหละ)

 

ต้องขอเกริ่นก่อนว่า (ข้างบนยาวๆ นี่ไม่ใช่รึ??) การ configure K2 for SharePoint 2013 จะต่างกับ K2 for SharePoint 2010 ค่อนข้างเยอะ อย่างแรกคือ ไม่จำเป็นที่จะต้องไปลง program K2 for SharePoint ที่เครื่อง SharePoint อีกต่อไป สิ่งที่ต้องทำก็คือ ลง K2 for SharePoint ที่เครื่อง K2 และไป run โปรแกรม Application Deployment บนเครื่อง SharePoint App อย่างที่สองคือ ไม่ support SharePoint foundation แล้ว (เพราะ Microsoft ไม่ได้เปิดให้ 3rd party tool เข้าไป connect) แต่ถ้าใช้เป็น SharePoint 2010 site บน SharePoint 2013 ก็ยังจะสามารถใช้ feature บางส่วนของ K2 for SharePoint ได้

 

มาเริ่มกันที่ส่วนแรก ก่อนที่จะ configure User ที่จะใช้ run Application Deployment ต้องเตรียม permission ตามด้านล่าง

  • Local Administrator บน SharePoint Server
  • K2 Administrator (ให้สิทธิ์ Admin บน Server Rights ของ K2)
  • Site Collection Administrator บน App Catalog Site Collection
  • db_owner บน database SharePoint_Config
  • SharePoint Shell Access role (grant role SharePoint Shell Access ให้ user ดูวิธีได้ตามนี้ https://technet.microsoft.com/en-us/library/ff607596(v=office.15).aspx)
  • User ที่ใช้ run ต้องไม่เป็น SharePoint Service Account หรือเป็น Application pool account ของ SharePoint site ใดๆ

 

SharePoint Service ที่ต้องใช้สำหรับการทำ Application Deployment

App deployment

  • App Management Service
  • Subscription Setting Service
  • User Profile Service

สำหรับ App Management Service และ Subscription Setting Service สามารถทำตาม step ใน link นี้ได้เลย https://technet.microsoft.com/en-us/library/fp161234(v=office.15).aspx  *บางคนที่คุ้นเคยกับ help ของ Microsoft ปกติจะมีวิธีทำมาให้ 2 แบบคือ ผ่าน UI หรือ command แต่สำหรับ article นี้ ส่วนที่ใช้ power shell command จะต้อง run นะครับ ไม่มี UI มาให้ ดังนั้นห้ามข้าม step ครับ

สิ่งที่จะเป็นคำถามแรกหลังจากเปิดหน้านี้คือ DNS กับ CNAME ถ้าเรามี permission สำหรับสร้าง DNS ก็จะสบายหน่อย แต่ถ้าไม่มีสิ่งที่ทำได้คือ ให้ fix ชื่อ ของ application ที่จะใช้ไว้ใน host file ของ SharePoint server ก่อน เพื่อให้สามารถ configure ได้ ซึ่งสิ่งที่เราต้องรู้ใน step นี้ 2 อย่างคือ domain name และ prefix

Domain name แนะนำให้ใช้ชื่อเดียวกับ domain ที่เราอยู่ ส่วน Prefix จะเป็นอะไรก็ได้ แต่ถ้าให้ดูง่ายก็ควรจะเป็น Apps นำหน้า และใส่ environment ตามหลัง เช่น AppsDev (แต่ถ้าเป็น production อาจจะใช้ Apps เลยก็ได้) ในส่วนนี้ถ้าเราต้องใส่ url ใน host file ไว้ก่อน ให้ใส่เป็น -K2Test ไว้ด้วย เพราะตัว Application Deployment จะพยายาม ping ชื่อ App ที่เป็น -K2Test เพื่อทดสอบว่า DNS set ไว้ถูกต้องหรือไม่ แต่หลังจาก configure เสร็จเรียบร้อยแล้ว ยังไงก็ต้อง set DNS นะครับ เพราะตอนสร้าง App ใช้จริงๆ SharePoint จะสร้างเป็น url Prefix + Generate ID + Domain Name ซึ่งไม่สามารถเดาได้ว่า url จะเป็นชื่ออะไรครับ

Host Fix

ตัวอย่างการ fix ใน host

  สำหรับ User Profile Service สามารถทำตาม step ใน link นี้ https://technet.microsoft.com/en-us/library/ee721049(v=office.15).aspx  *ทำถึง Phase 2 – Create a synchronization connection to a directory service ก็พอ จากนั้นให้ grant permission ให้ user ที่จะเอาไป run Application Deployment เป็น Full Control ใน User Profile Service 

 

Check list

  • ลง K2 for SharePoint บนเครื่อง K2 โดยใช้ K2 service account
  • ตรวจสอบ Service ของ SharePoint ที่เปิดว่า เปิดครบหรือไม่
  • Create app catalog บน SharePoint และ grant Contribute permission ให้ user ที่จะ deploy
  • run Application Deployment ในเครื่อง SharePoint โดย login ไปด้วย user ที่เรา set permission ไว้ด้านบน (ใช้ K2 service account และ grant สิทธิให้ตามด้านบนก็ได้ แต่เหมือนเคยอ่านเจอว่า ควรจะแยกให้เป็น user อีกอันไปเลย) สามารถดู step โดยละเอียดได้ที่นี่ http://help.k2.com/onlinehelp/K2ForSharePoint/ICG/4.6.11/default.htm#Install_Topics/OnPrem/On-Premises_Installation.htm%3FTocPath%3DInstall%7CSharePoint%25202013%2520(On-Prem)%2520Installation%7C_____0
  • สร้าง site ใหม่สำหรับทดสอบ และลองหา K2 for SharePoint app จาก App catalog และกด Add เข้า site

 

หลังจากผ่าน step มามากมาย เราก็จะได้เห็นหน้านี้จนได้ T^T

K2 for SharePoint

 

หวังว่า จะเป็นประโยชน์กับคนที่ต้องทำนะครับ สำหรับวันนี้ขอลาไปก่อนครับ

[K2 blackpearl] – Serial Number ข้อสงสัยที่ทุกคนอยากรู้

สวัสดีครับ ห่างหายกันไปซะนาน สำหรับ blog เรื่องนี้จะเขียนนานแล้วก็ดองไว้ซะจนเปรี้ยวได้ที่เลย

ตอนเริ่มทำ K2 ใหม่ๆ หลายคนคงสงสัยว่า เวลา K2 ส่งงานไปหาคนที่ต้องทำงานอย่างไร?? ถ้าสังเกตกัน ตอนที่เราผูก workflow กับ form ต่างๆ K2 จะแปะ querystring เพิ่มเข้ามาใน url สิ่งนั้นคือ Serial Number นั่นเอง คนที่ทำตั้งแต่ version เก่าๆ คงจะคุ้นๆ กับ querystring SN กัน แต่หลังๆ มีการเปลี่ยนไปใช้ querystring ชื่อที่ยาวขึ้นเป็น SerialNo โดย K2 จะใช้ Serial Number อันนี้เป็นตัวตรวจสอบสิทธิ์ของ user ที่เปิด form เข้ามาใช้งาน

คำถามที่ผมพบบ่อยๆ คือ ถ้าไม่ได้เปิดจาก worklist ของ K2 หรือจาก link ได้ email เราจะหา Serial Number นี้ได้อย่างไร

  1. หาจากการใช้ API เปิด worklist เพื่อหา worklistitem ออกมา จะมี property ที่ชื่อ “SerialNumber”
  2. ถ้าไม่ได้ใช้ API SerialNumber คือ ProcessInstanceID + _ + ActivityDestinationInstanceID ดังนั้น เราสามารถสร้าง SerialNumber ได้จาก 2 ค่านี้ ถ้าเป็นใน workflow เราจะหาได้ตามรูปด้านล่าง (อันนี้ส่วนใหญ่จะเป็นกรณีสร้าง link ส่งโดยใช้ mail event)

WFProc

แต่ถ้าเราไม่ได้ใช้ workflow ในการหา Serial Number ล่ะ??? เราก็สามารถหาได้จาก SmartObject ชื่อ “Activity Instance Destination” โดยวิธีนี้สิ่งที่เรา ควรจะต้องรู้เป็นตามด้านล่างครับ

  • ตอนที่ start process ให้เก็บ process instance id ไว้ใน record ของ transaction
  • นำ process instance id ที่ได้ มา query โดยใช้ Process Instance ID ที่เก็บไว้ และ Destination (จะใช้หรือไม่ใช้ก็ได้ แต่ถ้าในกรณีแจกงานไปหลายๆ คน แนะนำให้ใช้ เพราะว่า serial number จะต่างกัน) โดย Destination จะต้องใช้ในรูป SecurityLabel:Domain\UserName นะครับ สามารถดึง current user มาแล้วเอา label กับ : ต่อข้างหน้าได้เลย
  • เมื่อ query แล้ว ให้นำ Process Instance ID + “_” + Activity Instance Destination ID ก็จะได้ Serial Number ครับ ถ้าจากตัวอย่างในรูปด้านล่าง Serial Number คือ 8_35

SMO

หวังว่า จะเป็นประโยชน์นะครับ สำหรับคราวนี้ขอลาไปเท่านี้ครับ 🙂

[Patch] – K2 4.6.10 Release Note แบบไทยๆ

สวัสดีครับ หายกันไปนานพอสมควรเนื่องจากภารกิจค่อนข้างเยอะในช่วงนี้ พอดีวันนี้มีคำถามมาจากหลายๆ คนเนื่องมาจากการออก patch ของ K2 version ใหม่ซึ่งก็คือ 4.6.10 ว่า มีอะไรใหม่บ้าง ผมเลยสรุปส่วนที่น่าสนใจ (แปลหมดไม่ไหว เพราะเยอะจัด หลักๆ จะแปลส่วนที่เป็น New Feature และ consideration สำหรับการ upgrade ไว้นะครับ ส่วนใครรอ bug fix ลองไป search หาดูได้ใน fixed list หรือลองดูใน ticket ที่เคยเปิดไว้ก็ได้ครับ จะมี update บอกว่า จะออกใน patch ไหน) ไว้ตามด้านล่างนะครับ (โดย official release note สามารถดูได้ที่ http://help.k2.com/kb001700 ครับ)

มารอบนี้ K2 มาแปลกพอสมควร มีการออกเป็น patch upgrade ต่างหามาให้คนที่ใช้ version 4.6.9 download ด้วย โดยตัว patch update จาก 4.6.9 จะขนาด 241 MB แต่ full installation package จะเป็นขนาด 758 MB ซึ่งตัว patch update จะสะดวกกว่า เพราะว่า ไม่ต้อง run installation หลายๆ file แต่ถ้ายังอยาก run จากตัว full installation package ก็ยังสามารถทำได้เหมือนเดิมครับ (แต่ต้อง run หลาย file เหมือนเดิม)

New Feature List

K2 blackpearl

  • Comment and Attachment – ก่อน version 4.6.10 เวลาเราจะทำ comment หรือ file attachment จะต้องทำที่เก็บเอง ตอนนี้มีมาให้ใน workflow แล้ว และสามารถดู comment และ file attachment ผ่าน view flow ได้ด้วย
  • Broker – เพิ่ม OData Endpoint broker สำหรับต่อกับ REST API และ Docusign broker สำหรับต่อกับ Docusign ที่เป็น software ทำ digital signature
  • Integration – เพิ่ม Wizard สำหรับทำงานกับ Docusign
  • Package and Deployment – ปรับปรุง message ที่แสดงตอนตรวจสอบให้ดีขึ้น (เข้าใจว่า ทำให้อ่านรู้เรื่องมากขึ้นนะครับ)

K2 SmartForms

  • Offline Forms – จากที่ version 4.6.9 เรามี offline form มาให้ใช้ ของ version 4.6.10 เพิ่มความสามารถในการตรวจสอบ offline mode ใน rule ของ SmartForms ขึ้นมา
  • Anonymous View – ตอนนี้เราสามารถ set view ให้เป็น anonymous ได้แล้ว (version ก่อนๆ ทำได้แต่ระดับ form)
  • Browser Support – IE 9, 10, 11, Chrome 43.02357.124 m, Firefox 38.0.5, Safari 7.0.6 or greater (และไม่ support Safari บน Windows แล้วนะครับ ใช้ได้เฉพาะบน Mac)

K2 SmartForms Control Pack

  • Controls – เพิ่ม ListBox control ใช้สำหรับแสดงและเลือกรายการต่างๆ และ Location Based Services control สำหรับแสดงตำแหน่งปัจจุบัน (ListBox control รูปบน และ Location Based Services control รูปล่าง)

LB11

Loc01

K2 for SharePoint

  • Package and Deployment – สามารถ pack SmartBox data ใน SharePoint Package and Deployment UI ได้

Important Considerations and Breaking Changes

K2 blackpearl

  • K2 Setup Manager – ต้องใช้ .NET Framework 4.5 เพื่อ run installer
  • Non AD Installation – K2 admin account ต้องมี SQL Server login และต้องมี public role membership บน SQL Server
  • Legacy databases – ถ้าเรา patch มาจาก version ก่อน 4.6 K2 จะยังมี 14 databases อยู่ แนะนำให้ใช้ consolidation tool สำหรับรวม database เป็น database เดียว สำหรับstructure ที่เป็น 14 databases ยังคงใช้ได้ใน version นี้อยู่ครับ แต่เพื่อ performance และการ upgrade ในอนาคตแนะนำให้รวม database จะดีกว่า

การออก patch 4.6.10 มารอบนี้จะยังไม่มี update ของ K2 connect เพิ่มจากเดิมที่มี update ใน versio 4.6.9 ดังนั้นใครที่ใช้ K2 connect อยู่ และอยากจะ patch หลังจากทดสอบ patch แล้ว แนะนำให้ลองเรียก SmartObject ต่างๆ ให้ครบนะครับ เพื่อทดสอบการทำงาน เพราะเคยเจอใน patch ก่อนๆ ว่า มี behavior change สำหรับการ call BAPI ใน SAP ถึงรอบนี้ไม่มีแต่ก็ควรจะทดสอบอยู่ดีครับ สำหรับครั้งนี้ขอลาไปก่อนครับ พอกันใหม่คราวหน้าครับ 🙂

[Smart Object] – K2 & MySQL (แบบไทย)

 

สวัสดีครับ ก่อนอื่นต้องขอต้อนรับ นักเขียนหน้าใหม่ ซึ่งขอเป็น Ranger สีดำ คุณโอ๋ แห่งค่าย Venteck นะครับ พอดีคุณโอ๋ มาขอไกด์ไลน์การต่อกับ MySQL แล้วไปลองดู พอได้ความก็เลยเขียนมาเล่าให้เราฟัง เราเห็นว่ามีประโยชน์ดี ก็ไม่รอช้า (จริงๆ ก็นานแล้วแต่เพิ่งมีเวลา) นำมาแปะไว้โดยไว  เชิญเสพโดยพลัน

clip_image002[5]

Continue reading [Smart Object] – K2 & MySQL (แบบไทย)