[K2 Five] – New Identity Service for K2 5.2

สวัสดีครับช่วงนี้มากันบ่อยหน่อย เพราะมีของออกใหม่เยอะ คราวนี้เป็นคิวของ Identity Service ใหม่ที่ออกมาใช้กับ K2 5.2 กันบ้าง โดย Identity Service จะเป็น service ที่ K2 เชื่อมต่อไปยัง Identity Providers (IdP) ต่างๆ เพื่อดึงข้อมูล user ที่ใช้งานมาเก็บเป็น cache ไว้ใน K2

ทำไมถึงต้องเปลี่ยนเป็นแบบใหม่

  • ในการเข้า K2 ครั้งแรก มีโอกาสที่จะเข้าใช้ได้ช้ามาก ถ้า profile ของ user นั้นยังไม่ได้ sync
  • ในบางกรณีข้อมูล identity ไม่ได้มีการ update อย่างที่ควรจะเป็น เช่น มีการเปลี่ยนข้อมูลบางอย่าง แต่บน K2 ยังเป็นของเดิม ในกรณีนี้เราต้องไปรัน script refresh identity cache และ restart K2 service
  • version เดิมมีการทำงานที่ไม่จำเป็น เช่น ไม่ได้มีการเปลี่ยนข้อมูล profile แต่ก็ยังต้อง sync มาใหม่

Concept ของแบบใหม่

  • เพิ่มการ queries แบบ Differential
  • มี logic ในการ sync ข้อมูลที่ดีขึ้น
  • backward compatibility กับ UM SmartObjects เดิม

ขั้นตอนในการใช้งาน

  • Install หรือ Update เป็น K2 5.2
  • ลง Fix Pack ล่าสุดเท่าที่ทำได้ (ณ ตอนเขียนเป็น FP03)
  • ลง New Identity Service ถ้าเป็น server farm ให้ลงที่เครื่องเดียวก็พอ เครื่องอื่นๆ ใน farm แค่ restart K2 service หลังจากลงเรียบร้อยแล้ว

Enable New Identity Service.png

  • เมื่อลงแล้ว เราจะได้ SmartObject มา 1 ชุดที่เกี่ยวกับการทำ identity service สามารถหาได้โดย search คำว่า sync ในเมนู Integration

Sync SMO

  • ให้เราเลือกที่ “Provider Instance” method “List Provider Instances”

Provider Instance

  • SmartObject จะแสดงข้อมูลออกมาให้ดูว่า เรามีการเชื่อมต่อไปยัง IdP อะไรบ้าง อย่างในตัวอย่างเครื่องผมมีแค่ต่อกับ domain DENALLIX อย่างเดียว

Provider Instance List

  • จากนั้นให้ไปเลือกที่ SmartObject “Operation” method “Start Sync” ใส่ Provider Name เป็น K2 กับ Provider Instance Name เป็น DENALLIX

Operation Start Sync

  •  หลังจากรันแล้วจะได้หน้า result ตามด้านล่าง

Operation Start Sync Result

  • ให้เราไปลองดูใน SmartObject “Run History” method “Get Run History Entries By Date Range” ลองใส่ข้อมูลเพื่อดูว่า เรารันแล้ว sync มาได้กี่ object จะเห็นว่า ได้มา 126 objects

Run History1

Run History Result1

  • จากนั้นให้ลองไปดึงข้อมูลจาก SmartObject “UMUser” ดูรายละเอียดของ user

Get UMUser1Get UMUser Result1

  • ขั้นต่อไป เราจะลองดูว่า ถ้าเรามีการ update ข้อมูลใน AD เราต้องทำอย่างไรบ้าง อย่างแรกคือ ไป update ใน AD ก่อน

AD Update.png

  • จากนั้นเราก็ไปรัน SmartObject “Operation” method “Start Sync” และลองดูผลผ่าน “Run History” อีกรอบ จะเห็นว่า รอบที่สองมีการ sync มาแค่ 1 object ที่มีการ update

Run History2

  • มาลองดูผลผ่าน “UMUser” อีกรอบ จะเห็นว่า ข้อมูล update เรียบร้อยแล้ว

Get UMUser Result2

สิ่งที่ควรรู้เกี่ยวกับแบบใหม่

  • User ที่จะเข้าใช้งาน K2 ได้ ต้องถูก cache ไว้ก่อน โดย K2 จะไม่ได้เก็บ password ของ user ไว้ แต่จะเอา cache ไว้ตรวจสอบตัวตนของ user ถ้ามีตัวตนถึงจะทำการ call ไปหา AD เพื่อลดความช้าของการเข้าใช้งานครั้งแรก
  • ในกรณีที่ไม่ต้องการทำ sync แบบ manual เราสามารถสั่งให้ทำ recurring sync job ผ่าน SmartObject “Operation” method “Set Provider Schedule” ได้ แนะนำว่า ควรทำไว้ด้วย

Set Recurring

  • Support all K2 Five user managers (AD, AAD, SharePoint – on prem and online, LDAP, ADFS, SQLUM, custom UM)
  • มีแค่ AD, AAD และ SharePoint – on prem and online ที่ support Differential queries ถ้าเป็นอย่างอื่นจะทำ Full queries ทั้งหมด ดังนั้นถ้าเราจะทำ schedule อันที่ไม่ support Differential ให้ set เวลานานกว่า provider ที่ทำ Differential ได้
  • ใน version K2 5.2 เราต้องทำ Full Sync ครั้งแรก และตั้ง schedule สำหรับทำ Differential เอง แต่ใน K2 5.3 จะมีทำ Full sync และตั้ง schedule ไว้ให้ตอนลง
  • การทำงานอะไรบ้างที่ใช้ cache ที่เรา sync ไว้
    • UM SmartObjects
    • User connections
    • Designer and Management user browsing
    • WF destination group resolving
    • Worklist
    • Roles
    • Autorization
  • การทำงานอะไรบ้างที่ดึงข้อมูลจาก IdP โดยตรง
    • AD & AAD SmartObjects
    • SharePoint Management SmartObjects
    • People picker control using AD, AAD and SP SmartObjects

ใครที่ upgrade ไปเป็น K2 5.2 แล้ว ก็ลองลงกันดูได้นะครับ โดยส่วนตัวชอบตรงที่เราไม่ต้องรอเวลาให้ K2 sync เอง สามารถสั่ง sync ผ่าน SmartObject ได้เลย โดยไม่ต้อง restart service กับมี log ให้ดูว่า sync ไปเมื่อไหร่ และได้กี่อัน ถ้าเทียบกับอันเดิมที่ดูค่อนข้างยาก (เพราะต้องไปดูเป็นราย record) ถือว่า ดีกว่าเดิมเยอะทีเดียว 🙂

Advertisements

[K2 Five] – Server Side Events

สวัสดีครับ วันนี้เราจะมาพูดถึง server side event ที่เป็น feature ที่มีมาตั้งแต่ K2 5.1 ว่า ทำอะไรได้บ้าง และจะช่วยอะไรเราได้บ้าง

อย่างแรกเลย Server Side Event ที่มีมาให้ จะมีอยู่ 5 แบบด้วยกัน โดยจะเป็นเกี่ยวกับการ load ข้อมูลทั้งหมด

serverside01

ก่อนหน้านี้เวลาเรา load form เราจะทำผ่าน event Initializing หรือ Initialized ก็ให้เปลี่ยนมาใช้ When the server loads แทน เรามาดูผลการทดสอบกันว่า มีผลยังไงบ้าง

หน้าแรกเราใช้ View Initializing แบบปกติ กับข้อมูล 300 records ใช้เวลาในการ load 726 ms

serverside02

หน้าที่สองเราเปลี่ยนไปใช้ When server loads a View ใช้เวลาลดลงเหลือ 393 ms

serverside03

จะเห็นว่า ลดเวลาลงไปได้ประมาณครึ่งนึงเลย ถ้าใคร upgrade เป็น K2 5.1 หรือ 5.2 แล้ว ก็แนะนำให้เปลี่ยนมาใช้เป็น When server loads แทนครับ 🙂

Trick เล็กๆ เพื่อ UX ที่ดี

สวัสดีครับไม่ได้อัพเดทบทความมานานเลย วันนี้มี Tick เล็กๆ ในการทำให้หน้า UI ของ Smartform ให้ ประทับใจลูกค้ามาฝากกันครับ

สำหรับ K2 developer แล้ว ทราบกันดีกว่า K2 Smartform มี Theme ที่ ทำให้ K2 Smartorm ทำงานแบบ responsive เพื่อปรับการแสดงผลบน browser บน desktop/laptop หรือ mobile ได้อย่างเหมาะสม แบบนี้

ListViewUX01.png
ภาพเวลาแสดงผลผ่าน Desktop/ Laptop browser

ภาพเวลาแสดงผ่าน Mobile Browser จะเห็นว่าภาพทางซ้าย ส่วน List View มีการปรับ layout ให้สวยงาม แต่ ทางขวามือ  List View จะเบียดๆ กัน ซึ่งปกติ List View จะไม่เหมาะสมในการแสดงบน Mobile device

แต่… เรามีเทคนิคในการแก้ไขได้ ด้วยการใช้ Feature ของ K2 Smartform เองด้วยคือ

  1. K2 Smartform รองรับ View ได้มากกว่าหนึ่ง View บน Form และยังมี Rule “Show a View”, “Hide a View”
  2. K2 Smartform สร้างมาตรเช็ค condition ต่างๆ ได้ เช่น Client Platform / Screen Width และอื่นๆใ
  3. List View สามารถสร้าง Custom Column เพิ่มเติมได้
  4. มี Expression ที่ใช้ในการจัดการข้อมูล ผ่าน Data Label ที่มี Option “Warp Text” และ “Literal”

มาถึงตรงนี้ เพื่อนๆ ก็น่าจะร้อง อ๋อ กันแล้วใช่มั้ยครับ 🙂  ด้วย feature และ option ด้านบน จะทำให้ หน้าจอ List View บนฟอร์ม ที่เปิดด้วย mobile browser สวยงามขึ้นแล้วแบบภาพนี้ครับ

ListViewUX06.png

หาก เพื่อนๆ สนใจว่าขั้นตอนการสร้างเป็นอย่างไร แบบละเอียด ลองคอมเมนท์ไว้นะครับ ผมจะหาเวลาเป็นเป็น วีดีโอไว้ให้เห็นาแบบละเอียดยิบได้เลย หวังว่า Trick ง่ายๆ ตัวนี้จะทำให้ เรามีหน้าจอ ที่ตอบโจทย์ผู้ใช้งาน ที่อยาก ดูข้อมูลแบบ List บน หน้าจอขนาดเล็กแล้วนะครับ

สำหรับวันนี้ สวัสดีครับ

เปลี่ยนใจมาเขียนเพิ่ม
ขั้นแรก ให้ สร้าง View เพิ่มก่อนครับ (คลิกที่รูป ดูภาพใหญ่ๆ ชัดๆ นะครับ)
ListViewUX07-1.png

ใน Expression ก็เขียนประมาณนี้ ประกอบ HTML ปกติ
ListViewUX07-2.png

เอา วิวมาวางที่ฟอร์มเดียวกับ (ตรงนี้ ต้องคำนึงเรื่องการ execute list view ที่เกี่ยวข้องก็พอนะครับ ให้เช็คดีๆ ไม่งั้นจะทำให้ ช้าเพราะโหลดคู่
ListViewUX08

ใน Rule กำหนด แบบนี้
ListViewUX09

ใน “an advance condition” เราก็เช็ค เงื่อไขประมาณนี้ได้ หรืออาจจะเพิ่มเงื่อนไขอื่นๆ ที่เหมาะสม
ListViewUX10
ลองทดลองกันดูนะครับผม 🙂

[K2 Five] – 5.2 New Feature Overview

สวัสดีครับ ห่างหายกันไปนานสำหรับ blog ของ K2 ranger วันนี้ผมจะมาเขียนถึง K2 5.2 ที่เพิ่งออกมาเมื่อวันที่ 16 Oct 2018 ว่า มีอะไรเพิ่มเติมมาให้ใช้กันบ้าง ติดตามได้ตามด้านล่างเลยครับ

New Feature

  • Workflow policy – กำหนดได้ว่า workflow instance หรือ step instance มีการ start เยอะกว่าจำนวนที่กำหนด จะทำให้ workflow instance ที่สร้างมาใหม่กลายเป็น error ไป อันนี้เอาไว้ใช้ป้องกันเรื่อง infinite loop ได้ แต่ก็ต้องระวังถ้าเราตั้งใจให้ทำ loop อยู่แล้ว อาจจะมีโอกาสไปเข้า policy นี้ได้

126

  • Workflow Conditional Start Rule – สามารถกำหนด rule สำหรับ start workflow ได้ ถ้า rule ไม่เป็นจริง จะมี error แจ้งเตือนตอน start workflow และ workflow จะไม่ถูก start

001

  • SmartBox Property Indexing – เราสามารถกำหนดได้ว่า จะให้ property ไหนของ SmartBox มี index
  • Save a form as a draft – สามารถ save draft ตอนใช้ K2 mobile แบบ offline mode ได้
  • Permission Delete – สามารถกำหนดได้ว่า ใครสามารถลบ SmartObjects, Views หรือ Forms ไหนได้ (แยกมาจากของเดิมที่ delete จะรวมอยู่ใน modify)

Enhancements

  • Call Sub Workflow – สามารถ start sub workflow แบบ multiple ได้แล้ว และสามารถสร้าง variable จากหน้าต่าง property mapper ได้เลย โดยที่ไม่ต้องเปิด context browser

003

  • Task Step – เพิ่มให้ notification สามารถ CC และ BCC ให้ user คนอื่นได้ และสามารถใส่ information ของ task เช่น link to worklist item, standard action etc. ใน reminder email ได้
  • Move Line Labels – สามารถย้าย label ของ line ได้
  • Data Fields now Variables – ใน workflow ของ K2 Five data field เดิมจะกลายเป็น variable แต่จะมี text บางอย่างที่เปลี่ยนไม่ครบ ตอนนี้ก็เปลี่ยนครบแล้ว เช่น set datafield step เปลี่ยนเป็น set variables
  • SmartObject Get List Custom Filter – สามารถใส่ custom filter ได้ในการเรียก Get List method ของ SmartObject จากเดิมที่มีแค่ return first row กับ all

001-2

  • Server-Side Rule Execution – สามารถเรียกใช้งาน action แบบ server side ได้ จะช่วยทำให้ performance ดีขึ้น เพราะ execute มาจาก server เลย ไม่ต้องสั่งมาจากฝั่ง client
  • Form and View overlay opacity – ทำให้ Form หรือ View จางลงตอนที่ยัง load ข้อมูลไม่เสร็จได้
  • SmartObject Data Access – สามารถกำหนดได้ว่า user ไหนจะเห็นข้อมูลใน SmartObject ได้บ้าง เป็น feature เฉพาะ SmartBox SmartObject
  • K2 Designer Rights – กำหนดสิทธิ์การเข้า site designer ได้

kb002722-1

  • SharePoint Service Instance – หลักๆ คือทำให้ reuse กับ site ที่มี structure เหมือนกันได้ง่ายขึ้น รายละเอียดยาวๆ อ่านต่อเองได้ใน help นะครับ
  • Salesforce Service Instance – เพิ่มการเชื่อมต่อกับ Salesforce sandbox ทำให้เทสได้ง่ายขึ้น
  • Exchange Online Service Instance – สามารถใช้ On Behalf parameter สำหรับการสร้าง appointment และ task
  • REST Broker – เพิ่ม service key ที่ทำให้ customize header token ได้ และ support numeric operationID ที่ทำให้ใช้ swagger จาก Microsoft Cognitive Services APIs ได้แบบไม่มี error
  • Application Forms – ไม่ต้องย้าย folder ในการวาง form แล้ว แค่เลือกให้เป็น Application Form ก็พอ
  • Deployment Validation – ในส่วนของการ deploy SmartObject ต่อกับ SharePoint ก่อนหน้านี้จะไม่ยอมให้ deploy ถ้า structure ไม่ตรงกันทุกอย่าง แต่ใน version นี้จะยอมให้ deploy เช่น list เดิมมี id, description ส่วน list ใหม่มี id, description, sort จะ deploy ได้ โดย map แค่ columns ที่ตรงกันให้
  • Deployment logging – เป็น log ของการ deploy package เข้าระบบ ดูได้จาก stored procedure ใน database

093

  • View Flow – Click to reports – ก่อนหน้านี้ View Flow ของ K2 Five จะกดอะไรไม่ได้ ตอนนี้เวลากดจะเปิดหน้า report ที่เป็นรายละเอียดของ flow instance นั้น

สำหรับ K2 5.2 ในตอนที่ออกมา มี Fix Pack 1 ออกมาพร้อมกันด้วยนะครับ ถ้าใครจะลงก็ให้ลง Fix Pack 1 หลังจากลง K2 5.2 ด้วยนะครับ สำหรับรายละเอียดแบบเต็มๆ สามารถดูได้ใน link ด้านล่างครับ

https://help.k2.com/onlinehelp/k2five/userguide/5.2/default.htm#Whats-New-Five/Whats-New-Five.htm

ถ้าได้ลองกันแล้วมี feedback อะไรก็มา post คุยกันได้นะครับ ไว้เจอกันใหม่คราวหน้าครับ

How to use K2 Menu with Role Permission

ในกรณีปกติแล้ว K2 Menu สามารถกำหนด Permission ในการเห็นแต่ละ Menu ได้ 3 ลักษณะคือ

  1. Everyone
  2. Active Directory Group
  3. Custom Security

Reference: https://www.dropbox.com/s/k5alk0if414lxxz/K2%20Menu%20System%20User%20Manual%20v1.0.1.pdf?dl=0

ซึ่งในบางกรณี เรามีความต้องการที่จะ Set K2 Menu Permission ตาม K2 Roles ที่เรามีการ Set อยู่แล้ว เราจะทำอย่างไรดี

Blog นี้จะเป็น Walk through Step ว่าเราจะเปลี่ยนจาก Custom Security มาเป็น K2 Roles ได้อย่างไร

Assumption

ควรจะมีความเข้าใจการทำงานของ Custom Security ของ K2 Menu ก่อน

K2Menu

หลักการสรุปของ K2 Menu Permission แบบ Custom Security ก็คือ เราสามารถ set ค่าว่าในแต่ละ menu จะต้องมี Custom Security อะไร ตอน Set menu

แล้วก็เราต้องเอาชื่อคนไป Resolve Table Permission อะไรซักอย่างเพื่อดูว่าคนๆนั้นมีค่า Permission ตรงกับ Menu มั้ย เช่น เรา set Menu A มีค่า custom security = 1,2 แล้วเราไป resolve ชื่อคนๆนั้น ว่ามี permission เป็น 1 เมื่อเอา 2 ค่านี้มาเปรียบเทียบกัน คนๆนี้ ก็จะสามารถเห็น Menu A ได้

เมื่อเราเข้าใจหลักการนี้ ก็ง่ายล่ะ เราก็แค่เปลี่ยนค่า 1,2 พวกนั้นเป็นชื่อ K2 Roles แทน แล้วตอน resolve ว่าคนๆนั้นมี permission อะไร ก็ไป resolve ว่าคนๆนั้น อยู่ Role อะไรแทน … เอ้าเริ่ม

  1. เปลี่ยนจากค่า Custom Security เป็นค่า Role โดยไปแก้ที่ K2MenuSystem.Level1MenuItems View โดยให้ไป get ค่า roles แทน ซึ่งอ้างอิง UMRole ได้เลย ฝั่ง setting ก็ทำแค่นี้

GetRoles

UMROLE2.

2. ฝั่ง resolve คนว่าอยู่ group ไหน ต้องอาศัย StoreProcedure นิดหน่อย ซึ่งมีเขียนใน K2Ranger ไว้แล้ว ตามนี้

CREATE PROCEDURE [dbo].[sp_FindRoleByUser] (

@pUserName NVARCHAR(447)

) AS

BEGIN

SELECT i.[Name]

FROM   [K2].[Identity].[Identity] i

INNER JOIN    [K2].[Identity].[RoleItem] r

ON     i.ID = r.IdentityID

WHERE  i.[Type] = 2

AND    r.[FQN] = @pUserName

END

เมื่อเราสร้าง Store Procedure นี้เสร็จ ก็ไปสร้าง SmartObject แล้วก็เอาคนไป Resolve เป็น Role ผ่าน Template View ที่ชื่อว่า K2MenuSystem.UserMemberShipCheck

membershipcheck

เท่านี้ก็ได้แล้ว คือหลังบ้าน set เป็น roles ส่วนหน้าบ้านก็เอาคนไป resolve กลับมาเป็น Roles

ถ้าใครเคยทำ Custom Security แบบปกติ… อ่าน blog นี้ก็น่าจะทำ Custom Security แบบ Roles ได้ไม่ยากเลยยยยย

How to update Folio from workflow management dll

พอดีได้ Requirements จากลูกค้ามาว่า ต้องการที่จะ Update Folio ของ Process Instance ที่วิ่งอยู่ในกระบวนการ เพื่อให้คนที่ได้รับงาน สามารถรับทราบถึง Status ของงานผ่าน Folio ได้ จึงได้มาศึกษาเรื่องของการใช้ dll เพื่อไป Update Folio

ซึ่ง dll ที่จะต้องใช้มีประมาณนี้ครับ

  • SourceCode.HostClientAPI เอาไว้ใช้ในการสร้าง Connection String และ Open Connection ไปหา K2 Server
  • SourceCode.SmartObject.Client เอาไว้ใช้ Query ข้อมูล SmartObject
  • SourceCode.Workflow.Client เอาไว้ใช้ในการเข้าถึงข้อมูลของแต่ Process Instance เพื่อทำการ Update ค่าต่างๆ
  • SourceCode.Workflow.Management เอาไว้ใช้ในการจัดการ Process Instance เช่น Start, Delete Process

ใน Requirements นี้ ได้ตัดสินใจไปใช้แนวทางสร้าง Custom Assembly ขึ้นมา เพื่อทำการ Update ครับ

เริ่มแรก เมื่อเราสร้าง Class Library project ขึ้นมาแล้ว ก็ให้ Add Reference ที่บอกข้างต้น โดย dll เหล่านี้ อยู่ที่ %K2_Home%/Bin

ต่อสร้าง ConnectionString จาก Object SCConnectionStringBuilder ประมาณนี้

SCConnectionStringBuilder K2Con = new SCConnectionStringBuilder();
K2Con.Host = “localhost”;
K2Con.Port = 5252;
K2Con.IsPrimaryLogin = true;
K2Con.Integrated = true;

สังเกตว่าจะใช้ Port 5252 เพราะว่า Port 5252 นี้จะเชื่อมต่อกับ Port Workflow Management

ในกรณีที่เราต้องการเชื่อมต่อ SmartObject ก็ใช้ Port 5555 ตามปกติครับ

หลังจากนั้นทำการเปิด Connection ไปหา K2 Server ด้วย Connection String ที่ set ไว้

SourceCode.Workflow.Client.Connection connection = new SourceCode.Workflow.Client.Connection();
connection.Open(“localhost”, K2Con.ToString());

ต่อมาก็ get Process Instance ที่ต้องการ โดยจะต้องอ้างอิง ID แล้วก็สั่ง update ได้ตรงๆเลย

SourceCode.Workflow.Client.ProcessInstance processInstance = connection.OpenProcessInstance(processInstanceID);
processInstance.Folio = “NEW FOLIO”;
processInstance.Update();

สุดท้ายอย่าลืม add try catch แล้วก็ปิด Connection ทุกครั้งด้วยนะครับ

พอเราได้ dll ตัวนี้มาแล้ว ก็เอาเข้าไป Register กับ EndPointAssembly แล้วก็สร้าง SmartObject มาใช้งานได้เลย

ของแถม

บางกรณีเราต้องการ Delete Process Instance บ้าง วิธีทำก็คล้ายๆข้างต้นเลยครับ แต่ต้องใช้ SourceCode.Workflow.Management เพราะเป็นตัวจัดการ ของแต่ละ Process Instance

วิธีทำก็สร้าง Connection String และ  Open Connection คล้ายๆเดิม

SourceCode.Workflow.Management.WorkflowManagementServer wms = new SourceCode.Workflow.Management.WorkflowManagementServer();
wms.Open(K2ConProcess.ToString());

หลังจากนั้นก็ลบได้เลยยยยยย

wms.DeleteProcessInstances(deleteProcessInstanceID, true);

วันนี้ก็พอแค่นี้ครับ น่าจะสามารถ update folio, ลบ Process Instance ผ่าน dll กันได้ล่ะ

[K2 Five] – How to start multiple sub workflow [TH]

สวัสดีครับ พอดีช่วงนี้มีคำถามเกี่ยวกับการ start sub workflow ตามจำนวนของงานที่เราเก็บไว้ใน database เข้ามา ถ้าใครเคยทำใน version เก่าอยู่ก็จะงงๆ อยู่ เพราะไม่เหมือนเดิมเลย แต่ก่อนที่เราจะไปถึงวิธีทำ มาพูดถึง scenario ที่ทำไม่ได้ก่อนดีกว่า

ใน workflow version เก่า เราสามารถ start sub workflow หลายๆ workflow พร้อมกัน ทั้งแบบ sync (รอ sub workflow ตอบกลับ) และ async (ไม่รอ sub workflow ตอบกลับ) โดย sub workflow ทั้งหมดจะถูก start พร้อมๆ กัน แต่ใน version K2 Five จะ start sub workflow พร้อมๆ กัน ได้แค่เคสของ async นะครับ ถ้าเป็นเคส sync จะ start แล้วรอให้ทำ sub workflow จบ ถึงจะ start อันถัดไปได้

มาเริ่มกันเลยดีกว่า สิ่งที่เราต้องมีก็ตามด้านล่าง

  • SmartObject ที่ต่อกับ table ที่เราจะดึงข้อมูลออกมา
  • Sub Workflow (แน่ล่ะ ไม่งั้นจะ start อะไร)
  • Main Workflow

SmartObject

จะเป็น structure แบบไหนก็ได้ แต่ควรจะมี status, ชื่อคนที่เราจะส่งงานให้ กับ id ของ main (ในที่นี้ผมใช้เป็น HeaderID) เอาไว้ filter เพื่อ start sub workflow

SMO

Sub Workflow

หลัง start workflow ก็จะมี update status และส่งงานไปหา user ที่เรากำหนดใน table

Sub Workflow

ส่วนที่เราต้องมีก็คือ variable สำหรับรับค่ามาจาก Main Workflow

Variables

Main Workflow

Main Workflow

Create Reference Step

สิ่งแรกที่เราต้องมีคือ step Create Reference เราจะต้องเลือก SmartObject นำมาเป็น reference เพื่อให้ step Loop เอาไปใช้

CreateReference1

ใน Filter เราใส่เพื่อดึงเอาเฉพาะ record ที่ Status = New และ HeaderID เท่ากับค่าที่ใส่มาใน Variable HeaderID

ที่ด้านล่างจะมีส่วนที่เรียกว่า Fill Reference ให้เรากด Create designer จะสร้าง Reference ให้เรา เป็นอันจบการ set reference

Loop Step

มาต่อกันที่ loop เมื่อลาก loop step แล้ว จะมีให้เราเลือกว่า จะ loop จาก reference อันไหน ให้เราเลือก reference ที่เราสร้างไว้

Loop1

หลังจากเลือก reference แล้ว K2 จะสร้าง reference เพิ่มให้เราอีกอัน เป็น reference ของ current row ที่เรากำลัง loop อยู่ คือ TaskAssignment.SMO Item ตามรูปด้านล่าง

Loop2

Call Sub Workflow Step

มาถึง Call Sub Workflow ให้เราเลือก Workflow ที่เราต้องการใช้งาน, ไม่เลือก Wait for sub workflow to complete และเอาข้อมูลจาก current item มาส่งเข้าไปใน variables ที่เราสร้างไว้ (มีใส่ id ไว้ใน folio ด้วย จะได้แยกออกว่า อันนี้เป็น sub workflow อันไหน)

CallSubworkflow

Test

เมื่อทำเสร็จแล้วก็มาทดสอบกัน โดยใส่ข้อมูลไว้ตามด้านล่าง

TestSubWorkflow1

ไปที่ Management Site ในการทดสอบ ผมใช้ HeaderID = 3

มาดูผลกันในหน้า report จะเห็นว่า เรา start Main workflow และมี IPC ที่เกี่ยวข้อง 2 instances

TestSubWorkflow4

TestSubWorkflow5

TestSubWorkflow6

ตัวอย่างนี้ทำด้วย K2 5.1 นะครับ แต่สำหรับ K2 5.0 วิธีทำก็จะเหมือนๆ กันครับ หวังว่า จะเป็นประโยชน์สำหรับคนที่ต้องทำนะครับ 🙂

K2 5.1 New Feature Overview

สวัสดีครับ ในช่วงก่อนหน้านี้ K2 ได้ release version ใหม่ที่เป็น K2 5.1 ออกมา มีหลายคนถามมาว่า มีอะไรใหม่ๆ บ้าง เลยขอรวบรวมมาเขียนใน blog รอบนี้ซะเลย ลองดูได้ตามด้านล่างแล้วกันครับ 🙂

  • K2 App

จะแบ่งเป็น 2 ส่วน ส่วนแรกคือ pre-built application ที่สามารถ download และ deploy เพื่อใช้งานได้เลย ก่อนหน้านี้เราจะรู้จักกันในชื่อ Smart Starter หรือถ้าก่อนหน้านั้นอีกจะชื่อ Application Accelerators กับอีกส่วนที่ เราสามารถเลือก form หรือ workflow ที่เป็นแบบ template มาสร้าง application ซึ่งอันนี้จะเรียกว่า App Wizards โดยเราเลือกยังสามารถ customize บางส่วนเพิ่มเติมได้ด้วย สามารถดูรายละเอียดเพิ่มเติมได้ที่ https://help.k2.com/onlinehelp/k2five/userguide/5.1/default.htm#Apps/Create/Create-Apps.htm%3FTocPath%3DCreate%7CApps%7C_____0

016

ตัวอย่างหน้าจอการเลือก template ของ App Wizards

  • Exchange Service Type

ต่อกับ Exchange Server ผ่าน REST service (ต่างจากตัวเดิมที่ต้อง configure ผ่าน setup manager แต่อันนี้ new ในผ่าน SmartObject Service Tester หรือ Management Site ได้เลย สามารถจัดการ appointment, email, attachment ต่างๆ ได้ รายละเอียดเพิ่มเติมดูได้ที่ https://help.k2.com/onlinehelp/k2five/userguide/5.1/default.htm#ServiceBrokers/Exchange/Exchange.htm%3FTocPath%3DAdminister%7CK2%2520Management%7CIntegration%7CService%2520Types%7C_____10

  • Salesforce Service Type

เป็นตัว update จาก Salesforce service type เดิม รายละเอียดเพิ่มเติมดูได้ที่ https://help.k2.com/onlinehelp/k2five/userguide/5.1/default.htm#ServiceBrokers/SalesForce/SalesforceInstance.htm%3FTocPath%3DAdminister%7CK2%2520Management%7CIntegration%7CService%2520Types%7C_____17

  • Workflow Designer

ทำ Undo/Redo กับ Cut/Copy/Paste ได้ กับจะมีการแจ้งเตือนเป็นรูปเครื่องมือข้างล่าง ถ้าเราเขียน workflow เป็น looping แบบรูปด้านล่าง

Loop

  • Theme

เพิ่ม theme responsive ใหม่คือ Blue Void กับ Grey Void

  • Server-side Rule

เพิ่ม server-side rule เพื่อให้ทำงานแบบที่ไม่ต้องมี round-trip จาก client ไป server เช่น พวก set control properties

Server-side rule

  • Export to Excel ใน List View

เพิ่ม function export ข้อมูลจาก list view ไป excel โดยจะเป็น method ที่ผูกติดอยู่กับทุก list view เลย

Export to excel

  • Smartbox Data Encryption

สามารถ encrypt data ใน SmartObject ที่ใช้ Smartbox ได้ โดยสามารถเลือกเป็นบาง properties ใน SmartObject ได้

  • Smartbox SmartObject Property Settings

มี setting เพิ่มสำหรับบาง datatype

Text – Constant Size, Maximum Size

Time – Precision

Decimal – Decimal Places

  • Smartbox Own Schema

การสร้าง table ของ Smartbox ไม่ได้สร้างที่ dbo แล้ว แต่จะเป็น Schema ชื่อ SmartboxData แทน

  • Service Method Links

สำหรับ Composite SmartObject เราสามารถ set up Service Method Link ได้แล้ว (ซะที)

  • App Switcher

ที่ด้านบนซ้ายของ site Management กับ Workspace จะมี link ให้กดสำหรับเปลี่ยนไป Site อื่น หรือ App อื่นใน Workspace ได้

Switcher

  • Multi-select Process Instances

ทำ Stop, Delete หรือ Restart ได้หลาย Instance พร้อมกัน

  • Delete Category

สามารถ delete ทั้ง category ได้แล้ว ถึงแม้จะมี object อยู่ใน category นั้นก็ตาม (เมื่อก่อนต้องลบ object ให้หมดก่อน)

Delete Category

  • Authorization Framework

มี permission สำหรับ K2 object เช่น

View – ดู object ตอน design time ได้

Execute – ใช้ object ตอน runtime

Modify – Edit, delete, rename object

Security – ให้สิทธิกับ user อื่นๆ ได้

รายละเอียดเพิ่มเติม ดูได้ที่ https://help.k2.com/onlinehelp/k2five/userguide/5.1/default.htm#AuthorizationFramework/Authorization-Framework-Overview.htm?Highlight=authorization%20framework

  • API

เพิ่ม OAuth authentication สำหรับ Odata กับ Workflow API มี version แล้ว (สำหรับทำ backward compatibility ในอนาคต เพราะอาจจะมีการเปลี่ยน method หรือข้อมูลอย่างอื่นได้)

 

สำหรับ K2 5.1 New Feature Overview ก็มีเท่านี้นะครับ พบกันใหม่คราวหน้าครับ 🙂

How to use “Workflow management service” (K2 Five)

สวัสดีเพื่อน ๆ ชาว K2 Ranger ทุกท่านครับ วันนี้มีโอกาสได้รับบทความจากคุณเบนซ์ Thattaporn Setsittichoke มาช่วยเขียน blog แชร์ประสบการณ์ การทำงานบน K2 Five

จะมี feature อะไรใหม่บน K2 Five มาช่วยเราทำงานกันบ้าง เชิญติดตามได้เลยครับผม


ผมจะมาแชร์บทความที่บางคนอาจจะรู้อยู่แล้วนะครับ (ที่เคยลองใช้งาน) ซึ่ง k2 management เท่าที่จำได้ และใช้งานมาจะมีเกิดขึ้นตั้งแต่ Version 4.7 ขึ้นไปครับ แต่มันพิเศษตรงที่ มี Service Object (ไม่แน่ใจนะครับว่าก่อนหน้านี้มีให้ใช้ไหม ถ้ามีต้องขออภัย) ให้เราใช้งานด้วย

ซึ่งแต่ก่อนเราจะต้องทำการพึ่งพา API เช่นตัวที่ผมมีการใช้งานคือพวก Redirect, Delegate หรือ Goto Activity ต่างๆ ต้องทำการ Custom เพื่อช่วยการทำงานในส่วนนี้ เช่นการ Goto Activity จะต้องเขียนแบบนี้เป็นต้น (หลายคนคงเคยทำเหมือนกัน)

b1.png

แต่ใน SmartObjects – Service – Tester (หลายคนคงเคยใช้แล้วจะอยู่ใน C:\Program Files (x86)\K2 blackpearl\Bin นะครับ) มีให้ใช้งานกันแล้วครับ ซึ่งมีอะไรให้ใช้งานบ้างสามารถเข้าไปดูกันได้เลยครับ ดังภาพ

b2

จะมี method GotoActivity ให้ใช้ได้เลย ไม่ต้องเขียน API เองแล้ว 🙂

S__6545428.jpg

นอกจาก Workflow ที่ผมเข้า ยังมีตัวอื่นอยากให้ลองเอาไปใช้งานตามชื่อที่ต้องการได้เลยครับ มีให้ใช้งานเยอะมากครับ กันอีกเยอะเลยนะครับลองเล่นกันดูครับ และสามารถนำมาแชร์กันได้ครับ

เพิ่มเติมนะครับ ถ้ามีเกิดคำถามขึ้นว่า แล้วนำไปใช้งานยังไง? สามารถที่จะ Create เป็น SmartObject ตาม Category ที่ต้องการได้เลยครับ โดยการคลิกขวา และทำการ Create Smart Object ครับ

b3.png

หวังว่าบทความนี้เป็นประโยชน์ครับ และไม่ต้องเสียเวลาในการมา Custom กันครับ (ซึ่งผมทำได้เสียเวลาทำไปแล้ว 555)

ใครมีตัวไหนที่ใช้งานเจ๋งๆและมีประโยชน์ บอกกันด้วยนะครับ ขอบคุณครับ ^^


สุดท้ายนี้ ขอขอบคุณเบนซ์อีกรอบ สำหรับบทความดีๆ แบบนี้ครับ

benz

รูปประกอบคุณเบนซ์ เผื่อเจอหน้าจะทักทาย สอบถามได้เต็มที่ครับ 🙂

[Management] – Search Role in K2 [EN Version]

Today we’ll take about role in K2. We know that K2 Role use to manage group of user when we didn’t use AD group. We can create and manage role using Management console in workspace (K2 version prior to K2 Five) or using K2 Management site (K2 version 4.7 and K2 Five). But the thing that still missing is search function.

Imagine that if we have more than 100 roles in system and want to add/remove user in role or want to know which user belong to which role? How can we solve this problem? Today I got a tool for you. Please follow below step

  • Create stored procedure using script below in any database that can reach K2. You can also create in K2 database but please be aware. Because when we upgrade version or patch the stored procedure may be disappear.

CREATE PROCEDURE [dbo].[sp_FindRoleByUser] (

@pUserName NVARCHAR(447)

) AS

BEGIN

SELECT i.[Name]

FROM   [K2].[Identity].[Identity] i

INNER JOIN    [K2].[Identity].[RoleItem] r

ON     i.ID = r.IdentityID

WHERE  i.[Type] = 2

AND    r.[FQN] = @pUserName

END

After deploy you can use form at {url}/Runtime/Runtime/Form/UserRole.Form/

Hope this can help you when working with role 🙂