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

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

 

 

 

 

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

 

[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

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

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

 

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

clip_image002[5]

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

[KB] วิธีการขอ License Key สำหรับ K2

คำเตือน…สำหรับมือเก๋าข้ามบทความนี้ได้เลยนะ

หลังจากมีทั้งลูกค้าและ partner ใหม่ ๆ ถามหาวิธีการขอ license key ของ K2 เลยไปค้นเจอเอกสาร official เกี่ยวกับวิธีการขอและการจัดการ license key ของ K2 สามารถโหลดได้จากลิ้งค์ด้านล่างครับ

โหลดได้ที่ -> Download

สำรอง -> How_to_obtain_and_manage_K2_License_Keys

สำหรับpartner เจ้าเก่า อาจจะ download ไว้เพื่อส่งต่อให้ลูกค้าได้เลยครับ