ว่าด้วยเรื่องการแสดง Paging ใน Listview

วันนี้มาว่ากันด้วยเรื่อง paging ใน listview นะครับ โดยปกติในหน้าจอ View Settings ของ listview เราสามารถใส่ paging ได้ (ใครหาไม่เจอ เข้าหน้า design listview แล้วหารูปเฟืองนะครับ) ตามรูปด้านล่างผมใส่ให้แสดง 10 รายการต่อ 1 หน้า

setting

ตอนที่ใช้งานมีข้อสังเกตว่า ด้านล่างของ list view มีเลขบอกนะ ว่าเปิดอยู่หน้าไหนอยู่ แต่ไม่ได้แสดงหน้าทั้งหมดที่มี และไม่สามารถกระโดดข้ามไปหน้าสุดท้ายได้เลย

listview

กลไกการทำงานส่วนนี้ ทำเพื่อเพิ่มความเร็วในการโหลดหน้าจอครับ ซึ่งถ้าเราใส่ไว้ว่าให้โหลดหน้าละ 10 รายการ ตอนดึงข้อมูลมาจากฐานข้อมูล ก็จะดึงแค่ 10 รายการ แต่กรณีที่เราต้องการให้แสดงจำนวนหน้าทั้งหมดจริงๆ เราสามารถไปปรับ setting ได้ โดยไปแก้ไขที่ไฟล์ C:\Program Files (x86)\K2 blackpearl\K2 smartforms Runtime\web.config (อย่าลืม backup ไฟล์ทุกครั้งก่อนแก้ไขนะครับ)

<add key=”SmartObject.RuntimeListViewRowCount” value=”false” />

แก้เป็น

<add key=”SmartObject.RuntimeListViewRowCount” value=”true” />

Save ไฟล์ และทดสอบผล แสดงจำนวน page ทั้งหมด แล้ว 🙂

listview2

แต่เดี๋ยวก่อน!! ทดสอบแล้วอย่าเพิ่งรีบเอาไปใช้จริงนะครับ ขอให้อ่าน note ตามนี้ก่อนใช้งานครับ

  1. เวลาที่ใช้ในการโหลดหน้าจอจะเพิ่มขึ้น อย่างที่บอกไปตอนต้นว่ากลไกนี้มีเพื่อเพิ่มความเร็วในการโหลด ผมลองจับเวลาในการโหลด list view 2 ชุดข้อมูล
    • Listview แสดง 2 column จำนวน 20,000 กว่ารายการ พบว่าใช้เวลาเฉลี่ยในการเปิดหน้าจอเปิดขึ้นจาก 1.59 วินาทีเป็น 1.76 วินาที (เพิ่มราว ๆ 10%)
    • Listview แสดง 4 column จำนวน 100,000 กว่ารายการ พบว่าใช้เวลาเฉลี่ยในการเปิดหน้าจอเปิดขึ้นจาก 4.58 วินาทีเป็น 6.02 วินาที (เพิ่มราว ๆ 30%)
  2. Setting ตัวนี้เป็น setting กลาง แปลว่าถ้าแก้ไปแล้วจะมีผลกับทุก ๆ หน้าจอครับ (list view, รวมไปถึง picker control ด้วย)

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

Test with K2 4.6.11

[K2 SmartForms] – วิธีทำให้ click หรือ double click ที่ worklist control เพื่อเปิด Form

วันนี้ขออธิบายอย่างมาไวไปเร็ว ถึงวิธีที่ทำให้ worklist control สามารถกดเพื่อเปิดงานได้เลย โดยไม่ต้องกดที่เมนูแล้วเลือก Open Form นะครับ

worklist3

  1. สร้าง form แล้วลาก worklist control ไปแปะ
  2. Configure Rule ตามรูปเลยครับ
      • When Worklist is Clicked
      • Navigate to URL

    worklist1

  3. เข้าไป configure ใน rule Navigate to URL
      • ใน Context Browser ให้ไปที่ Form -> Control -> Worklist -> Data แล้วหา field ชื่อ Worklist item URL มาลากใส่ใน Base URL
      • Open In แก้เป็น New Window (or Tab)

    worklist2

  4. เสร็จแล้วครับ 🙂 ทดสอบดูแล้ว …ไม่ว่าเรากดที่ field ไหนใน worklist control ก็จะเปิดหน้า form มาให้เราทำการอนุมัติได้ครับ

*ทดสอบบน K2 4.6.11 นะครับ

[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 ข้ออื่น ๆ มานำเสนออีกครับ ส่วนวันนี้…สวัสดีครับ 🙂

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

 

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

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

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

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

สำรอง -> How_to_obtain_and_manage_K2_License_Keys

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

[Trouble Shooting] – K2 ส่ง Notification Email ไม่ได้ #ภาคสอง

จากบทความที่แล้วเรื่อง [Trouble Shooting] – K2 ส่ง Notification Email ไม่ได้ วันนี้มาต่อภาคสอง ลงลึกกันอีกนิดนึง สำหรับการส่งแจ้งเตือน (notification) แล้ว Email ไม่ออกนะครับ(ใครยังไม่ได้อ่านตอนแรก ย้อนไปอ่านก่อนนะ)

  1. ตรวจสอบใน K2 Workspace -> Management Console -> Environment Library > … > [Environment Name] > Environment Fields
      • ตรวจสอบว่าใน Mail Server กับ From Address มีค่าใน Value และ Default เป็น True

    workspace

  2. ใช้คำสั่ง telnet จากเครื่อง K2 ไปยังเครื่อง Mail Server ตาม port ที่ใช้งาน (โดยปกติ smtp จะใช้ port 25 หรือ 587)
      • telnet [mail server name] [port]

    telnet

    • ถ้าขึ้นตามรูปคือ ไม่สามารถ ต่อไปยัง mail server ได้ ให้ลองติดต่อทีมที่ดูแล network หรือ firewall ให้เปิด port ดูครับ
    • เพิ่มเติม วิธีลง telnet client
  3. เข้าเครื่อง database ของ K2 ไปตรวจสอบที่ตารางตามนี้
      • EventBus.CustomEvent: ตารางนี้จะเก็บ ชื่อ process และ activity name ที่เราเรียกใช้งาน notification ให้ลองหาดูว่ามีชื่อ process ที่เรา deploy หรือไม่ ถ้าไม่เจอให้เปิดโปรเจคมา configure ตัว event ที่เรียกใช้งาน notification ใหม่และ deploy อีกที

    db-customevent

      • EventBus.ClientRecorderError: ตารางนี้จะเก็บ error ที่เกิดขึ้นตอนจะส่งอีเมล์ผ่าน MSMQ ถ้าเจอ error อะไรประหลาด ๆ ให้เอาไปหาในอากู๋ต่อครับ

    db-recordError

สุดท้ายถ้ายังไม่ได้รับอีเมล์ ขอยกประโยคเดิมมาอีกที

ถ้าทำตามด้านบนทั้งหมดแล้วยังไม่หาย ก็เปิด ticket เถอะครับ และบอกไปใน ticket ด้วยว่า เราทำอะไรไปบ้างแล้ว

หวังว่าทุกท่านจะได้รับอีเมล์นะครับ สวัสดีครับ 🙂