การสร้าง Custom Worklist แบบ Step by step (No coding)

การใช้งาน K2 กับ Worklist เป็นของคู่กันมานานนม ตั้งแต่สมัยใช้งานบน workspace จนมาถึงปัจจุบันก็มี worklist control ใน SmartForms ให้ใช้

โดยปกติ worklist control มี field ที่เกี่ยวกับการทำงานของ workflow เช่น Folio, Activity Name, Task Start Date และอื่น ๆ ให้เลือกแสดงได้อยู่แล้ว ซึ่งการใช้งานจริงเรามักอยากได้ worklist ที่มีข้อมูล ของระบบนั้นมาแสดงด้วย โดยทางออกที่เรามักจะทำกันคือการใส่ค่าแปะไว้ใน folio ของ workflow บางที Folio มันก็จะยาว ๆ หน่อยอ่ะนะ (- -“)

Leave00.png

แต่ในวันนี้มานำเสนออีกช่องทางครับ เป็นวิธีการทำ worklist ที่สามารถดึงข้อมูลระบบอื่นมาแสดงด้วย ในตัวอย่างจะเป็น worklist ของ ระบบ Leave request โดยจะมีข้อมูลประเภทการลา วันที่เริ่มลาจนถึงวันที่สิ้นสุด มาแสดงใน worklist ได้ด้วย ผลลัพท์ได้มีหน้าตาตามนี้ครับ

Leave11.png

สิ่งที่ใช้ในการทำ: Worklist Service Broker, Composite SmartObjects

Step by step

  1. ติดตั้ง Worklist Service Broker (ตามไป download ได้ตามลิ้งค์ด้านบนครับ)
    • WorklistService
  2. เพิ่ม field ProcessInstanceID ในตาราง leave request (ใน workflow เพิ่ม SmartObjects Event ให้ไป update ค่า ProcessInstanceID หลังจากส่งงานเข้า workflow ไปแล้วด้วย)
    •  Leave-table
  3. สร้าง composite SmartObject เชื่อมกันระหว่าง Leave Request  และ WorklistService
    • เปิด K2 Studio, สร้าง SmartObject ตั้งชื่อ LeaveRequestWorklist
    • Leave1.png
    • กด Add Method, เลือก Run the wizard in Advance Mode แล้ว กด Next
    • Leave6.png
    • ตั้งชื่อ method ว่า Get Leave Request Worklist แล้วกด Next
    • Leave3.png
    • ในหน้า Configure Method Parameter กด Next (ไม่ต้องสร้าง parameter)
    • ในหน้า Service Method Object กด Add
    • Leave13.png
    • ในหน้า Add Service Method กด Add เลือกไปที่ Service Object Server -> [SQL Service Instance Name] -> Table -> Leave Request -> List
    • Leave4.png
    • กด Create All เพื่อสร้าง properties แล้วกด OK
    • Leave3.png
    • โปรแกรมจะกลับมาที่หน้า Service Method Object กด Add อีกครั้ง
    • Leave12.png
    • ในหน้า Add Service Method กด Add เลือกไปที่ Service Object Server -> Worklist Server -> Basic Worklist Item -> Get Worklist Items
    • Leave7.png
    • กด Create All เพื่อสร้าง properties แล้วกด OK
    • กด Next
    • ในหน้า Setup Service Method Link กด Add
    • Leave9.png
    • ในหน้า Add Service Method Link เลือกปรับค่าดังนี้
      • Service Object Method: Leave Request.List
      • Link Type: Matching Value in both objects
      • Service Object Method: Worklist Service.GetWorklistItems
    • ในส่วนของ Property Name เลือกไปที่ ProcessInstanceID แล้วกด Assign เลือกไปที่ Process InstanceID ตามรูป
    • Leave10.png
    • กด OK
    • กด Next, กด Finish
    • Deploy SmartObjects
  4. ทดสอบและนำ SmartObjects ไปสร้าง ListView, form ต่อเพื่อใช้งาน
    • ตอนเรียกใช้งานก็เรียกผ่าน method ที่เราสร้างขึ้นครับ มันจะได้เฉพาะงานจาก worklist เท่านั้น แล้วจะไป join กับ field จากตาราง Leave Request
    • Field ที่ใช้ฝั่งของ worklist จะมีดังนี้ครับ
      • Link: เป็น URL ที่ส่งมาจาก workflow สำหรับเปิดหน้าฟอร์มเข้าไปอนุมัติ
      • Folio: ชื่อ folio ของ workflow นั้น ๆ
    • Leave11

 

สรุปข้อดีของการทำ custom worklist

  • เพิ่ม field จากฐานข้อมูลมาแสดงผลได้
  • สามารถใช้ฟังก์ชั่นของ list view ได้ เช่น การ sorting, filter, paging

แต่ก็มีข้อจำกัดของการทำ custom worklist นะ

  • ไม่สามารถใช้ function ที่ติดมากับ worklist control ได้ เช่น  Redirect, Delegate, Out of office (ทำได้แต่ต้องเขียนเพิ่มเอง)
  • ต้องสร้าง SmartObjects และ form แยกสำหรับแต่ละระบบ

 

การสร้าง custom worklist ขั้นตอนก็มีดังที่กล่าวไปข้างต้น รวมถึงมีทั้งข้อดีข้อเสีย ทั้งนี้ขอให้เลืิอกนำไปใช้ให้เหมาะสมกับงานของเราครับ 🙂

Smartform Thought: ซ่อนแสดงทำแบบไหนดี?

สวัสดีครับ หลังจากปล่อยให้ Ranger ท่านอื่นเขียนเรื่องหนักมานาน วันนี้เรามาเรื่องเบาๆ บ้างดีกว่า วันนี้เรามาเบาๆ เกี่ยวกับ การใช้ Rule เพื่อให้เหมาะสมตามสถานะการณ์กันครับ

Continue reading Smartform Thought: ซ่อนแสดงทำแบบไหนดี?

[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 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

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

[K2 SmartForms] – Filter Data ใน Check Box List

สวัสดีครับ ห่างหายกันไปซักพัก คราวนี้กลับมาด้วยคำถามที่เกิดจากโปรเจคที่ตัวเองทำอยู่ ในบางครั้งเราจะเจอโจทย์ในการออกแบบหน้าจอแบบที่เป็นตัวเลือกที่เลือกได้หลายๆ ตัวเลือก control ที่เราใช้ก็คงไม่พ้น check box list, picker หรือ multi-select control โดยที่นิยมที่สุดก็จะเป็น check box list เพราะใช้งานง่าย และเห็นตัวเลือกทั้งหมดตั้งแต่แรก

ที่นี้ถ้าเราต้องแสดง check box list ธรรมดาคงไม่ใช่ปัญหา แต่ถ้าต้องนำค่าใน check box list ที่เราเลือกไว้ ไป filter ข้อมูลใน control อื่นล่ะ จะใช้วิธีไหนดี?

วิธีแรกที่นึกถึงคือ สร้างเป็น stored procedure ที่ส่ง list ของค่าที่เลือก และส่งข้อมูลกลับออกไปแสดงผล แต่วิธีนี้จะใช้ได้ผลเฉพาะข้อมูลที่อยู่ใน database

วิธีที่สอง ในเมื่อต้องดึงข้อมูลจากที่อื่น ก็เขียน web service ขึ้นมาซะเลย แต่วิธีนี้ก็ต้องมี effort ในการเขียน web service และมีปัญหาเรื่อง performance อยู่บ้างถ้ามีข้อมูลเยอะๆ

วิธีที่สาม ซึ่งเป็นวิธีที่จะแนะนำใน blog รอบนี้ นั่นก็คือ upgrade K2 ไปเป็น version 4.6.9 และใช้ for each!!! แต่วิธีนี้ ตัวเลือกที่จะนำมา filter ต้องไปมากจนเกินไปนะครับ ส่วนเหตุผลว่า ทำไมต้องไม่มากจนเกินไปจะเฉลยอยู่ในวิธีทำครับ

ผลลัพธ์ที่อยากได้จากการทำงานนี้ก็คือ เราอยากเลือกภาค โดยใช้ check box list อันบน และแสดงผลจังหวัดใน check box list ด้านล่าง

Testing

อันดับแรก เราต้องวาง layout ซะก่อน สิ่งที่ต้องมีคือ check box list 2 อันสำหรับใส่ตัวเลือก และ data label จำนวนเท่ากับตัวเลือกที่จะมา filter

Layout

หลังจากเรา set SmartObject สำหรับดึงข้อมูลภาค และจังหวัดในกับ check box list แล้ว (ตรงนี้ผมไม่ได้ capture ให้ดูนะครับ เพราะน่าจะทำกันได้อยู่แล้ว ถ้ายังทำไม่ได้ให้ลองดูใน help ของ SmartForms นะครับ) ให้เข้าไป disable rule สำหรับ populate จังหวัดใน rule initialize ก่อน

View Initialize

Disable Province

จากนั้นให้สร้าง Rule ใหม่ขึ้นมา แต่ไม่ต้องเลือก Event ที่จะผูกกับ Rule นั้น แค่ให้ตั้งชื่อ Rule ไว้ (สามารถ double click ตั้งชื่อได้ ตรงตำแหน่ง CheckdlbRegion6 ในรูปด้านล่าง) ให้ใส่ condition เพื่อตรวจสอบว่า data label ตัวสุดท้ายมีค่าหรือไม่ ถ้ายังไม่มีให้ทำ action transfer data

CheckdlbRegion6

ใน action transfer data ให้เรานำ property ที่ต้องใช้จาก check box list ที่จะนำมา filter มาใส่ไว้ใน data label

dlbRegion6 Transfer

เมื่อเสร็จแล้วก็ให้กด Finish rule และให้สร้าง Rule เพิ่มขึ้นอีก เพื่อตรวจสอบ data label ตัวรองสุดท้าย (ในกรณีของผมคือ ตัวที่ 5) วิธีการตรวจสอบก็จะเหมือนเดิม คือ ตรวจสอบว่า data label มีค่าหรือไม่ ถ้าไม่มีค่า ให้ transfer property ของ check box list มาใส่ใน data label แต่มีส่วนเพิ่มคือ ถ้า data label มีค่าแล้ว ให้ไปเรียก rule สำหรับตรวจสอบ data label ตัวถัดไป โดยใช้ action execute another rule

CheckdlbRegion5

ให้ทำซ้ำแบบนี้ไปเรื่อยๆ จนครบจำนวน data label ที่เรามีก็จะได้ rule ขึ้นมาตามด้านล่าง จะเห็นว่า ยิ่งเรามีตัวเลือกในการ filter มาก จะต้องสร้าง data label มากขึ้น และ rule ตรงนี้ก็จะเยอะขึ้น

After Add Checkdlb Rule

ในขั้นถัดไป เราก็จะ add rule ที่จะทำงานตอน check box list ที่เก็บข้อมูลภาคเปลี่ยนแปลงกัน ให้เลือก event change ของ check box list จากนั้นใช้ action transfer data เพื่อเคลียร์ข้อมูลออกจาก data label ที่เราไว้ใช้เก็บข้อมูล โดยเลือก check box ด้านหน้า control และปล่อยตรงส่วนค่าที่ต้อง set เป็นว่างๆ ไว้ตามด้านล่าง

Set Blank Data

จากนั้นให้ใช้ for each ซึ่งจะอยู่ใน tab condition มาต่อกับ transfer data ที่ใช้เคลียร์ข้อมูล data label

For Each

ให้เลือก state ของ items เป็น Checked (ซึ่งหมายถึง เราจะวน loop ไปทุก item ที่เราเลือก) ใน control check box list ตัวที่เป็น filter โดยใน for each ให้ใส่ action execute another rule ที่เป็น rule ที่เราเอาไว้ตรวจสอบว่า data label มีข้อมูลหรือไม่ และหลังจาก for each ให้ใส่ action สำหรับ populate data เข้าไปที่ check box list อันที่สอง และให้เรากด configure เพื่อ set condition ในการ populate data

Configure

ให้กดไปที่ tab Filter และเลือก Advanced Option จากนั้นให้ใส่ filter เพื่อ filter data จาก data label โดยใช้ condition Or

Advanced Filter

Set Or

ส่วนสุดท้ายที่แนะนำให้ทำ (แต่ไม่ได้จำเป็น) คือ ให้เปลี่ยน then ไป also ในส่วนที่ highlight ไว้ การเปลี่ยนจาก then เป็น also จะทำการ lock หน้าจอให้ user กดเลือกอะไรเพิ่มเติมไม่ได้ในขณะที่ rule ทำงานอยู่ แต่ถ้าไม่ต้องการ lock ตรงนี้สามารถใช้เป็น then ได้นะครับ (แต่ก็อาจจะทำให้การทำงานผิดพลาดได้เหมือนกัน)

Change To Also

โดยสรุปการทำงานทั้งหมดที่ set ไปด้านบนจะเป็นตามด้านล่างครับ

1. นำข้อมูลจาก check box list อันแรกออกมาเป็น for each มาพักใส่ data label ไว้

2. นำข้อมูลใน data label ที่มี ไป filter data เพื่อแสดงข้อมูลให้ถูกต้องใน check box list อันที่สอง

ทำซะยาว สรุปได้แค่ 2 ข้อซะงั้น…สำหรับคราวนี้อาจจะยาวหน่อย และไม่แน่ใจว่า จะเขียนแล้วอ่านกันเข้าใจไหม ยังไงถ้าไม่เข้าใจสามารถสอบถามได้นะครับ เจอกันใหม่คราวหน้าครับ 🙂