แก้ปัญหา SmartObjects สร้างข้อมูลซ้ำ

มาจากคำถามจากทางบ้านอีกเช่นกันครับ สำหรับปัญหาที่ว่าสร้างข้อมูลจาก SmartObjects แล้วพบว่ามีข้อมูลเข้าไป 2 records

ถ้าใครเจอปัญหานี้เหมือนกันให้ลองตรวจสอบว่าเราได้ตั้งค่าหรือมีอาการตามนี้หรือไม่

  1. SmartObjects ต่อกับ Stored procedure ใน SQL
  2. Method ใน SmartObjects ที่ใช้สร้างข้อมูลเป็น type แบบ List
  3. ทดสอบเรียกผ่าน SmartObjects Services Tester แล้วพบว่าสร้าง 1 record แต่ถ้าเรียกผ่าน SmartForm แล้วเข้าไป 2 records

methodList.png

ถ้าใครเจอว่ามีอาการดังกล่าว แสดงว่าน่าจะมาจากสาเหตุเดียวกันแล้วครับ ให้ลองตรวจสอบเพิ่มอีกครับว่าเราได้ไปเปิดการแสดงผล paging ใน List View ด้วยหรือไม่

วิธีตรวจสอบง่าย ๆ คือไปเปิด List View ขึ้นมานะ ว่ามีแสดง paging หน้าสุดท้ายหรือไม่ (ถ้าไม่ได้เปิดจะไม่มีในวงเล็บ) แต่ถ้ามีก็ชัดเลยครับ ไปอ่านวิธีแก้กันต่อด้านล่างได้เลย (ส่วนวิธีการเปิดเคยเขียนไว้ใน blog นี้ -> ว่าด้วยเรื่องการแสดง Paging ใน Listview)

listview3.png

สาเหตุของอาการนี้มีสองอย่างด้วยกัน คือเพราะ method ใน SmartObject เป็นแบบ List และมีการเปิด SmartObject.RuntimeListViewRowCount ไว้ ทำให้ทุก method ที่เป็น List จะถูกเรียกสองครั้งเสมอ

วิธีแก้มีสองวิธีครับ

  1. แบบง่าย: ก็คือไปปิดการแสดง paging ของ List View ซะ (SmartObject.RuntimeListViewRowCount = false) แต่ถ้าเรายังอยากได้ทั้งการแสดงผลแบบนี้ และยังสร้าง record ให้ไม่ซ้ำด้วย ไปทำตามข้อสองครับ
  2. แบบยาก: ต้นเหตุคือตัว stored procedure ส่งประเภท method มาเป็น List อยู่ เราต้องไปแก้ stored procedure ให้ส่งมาเป็นประเภท Execute แทน โดยการเพิ่มบรรทัด SET FMTONLY ON ใน stored procedure แนะนำให้อ่านวิธีแก้เต็ม ๆ ใน KB นี้ครับ -> Determined SmartObject method ‘List’ or ‘Execute’ when SmartObject was created from SQL Store Procedure

ST136024.jpg

Advertisements

Workflow Schedule ของเล่นบน Management Site ที่แอบซ่อนอยู่

สวัสดีครับ วันนี้ก็จะมาแนะนำ Feature ที่น่าสนใจอีกหนึ่งตัวนะครับ นั่นก็คือ Workflow Schedule ซึ่งเจ้านี้ความสามารถก็คือเราสามารถตั้ง Job Schedule สั่งให้ Start workflow ได้ตามใจชอบนั่นเอง ก็คือมันมาช่วยเราโดยที่เราไม่ต้องมานั่งเขียน coding เพื่อสร้าง Batch ขึ้นมาแหละครับ แล้วเราจะสร้างมันได้ที่ไหนต้องบอก Feature นี้จะติดมากับ K2 Management Site บน K2 Version 4.7 ครับ

1
ถ้าจะถามว่า Management Site คืออะไรมันถ้าเทียบง่ายๆมันคล้ายกับ workspace เดิมของเรานี่แหละ คร่าวๆก็จะมีกาเราก็สามารถจัดการ Permission workflow , Manage Instance workflow , Goto Activity และอื่นๆครับ ที่นี่มาถึงตัว Workflow Schedule  ที่เราพูดถึงกันมาดูวิธีการสร้างกันครับ
เมื่อเข้ามาใน Management site เมนูนี้จะอยู่ภายใต้ workflow Server นะครับ เมื่อเรากด New พร้อมที่จะเริ่มสร้างละ มาดูกันครับว่าเราต้องใส่อะไรบ้างถ้าอยากจะสร้าง Schedule
1. ScheduleName  ชื่อของ Job ที่เราจะสร้าง
2. เลือก Workflow ที่จะให้ Job  เลือกเพื่อสั่ง StartWorkflow
3. Workflow Detail  ในกรณีที่เรามี Data Field ที่จะส่งเข้าไป workflow เราสามารถส่งค่าเข้าไปได้ครับ

2

4.  Folio เลือกได้ว่าใช้เป็นวันที่ หรือ Text ที่ต้องการครับ
5.  Pattern  เลือกรูปแบบของ Job ที่ต้องการได้ เช่น ทำงานวันละครั้ง , เดือนละครั้ง หรือถ้าเป็น               Interval สามารถเลือกได้ว่าจะให้รันทุกๆนาที ชั่วโมง หรือวัน

4

6. Range   เลือกได้ว่าจะเริ่มรันวันไหน หรือจะให้สิ้นสุดวันไหน ครับ

เมื่อกำหนดค่าแล้วก็กด OK ได้เลยครับ เราจะได้ Schedule พร้อมทำงานกันแล้วครับ โดยสังเกตุที่ Enable นะครับ จะเป็น True คือพร้อมทำงาน จากนั้นก็รอเวลาตามที่ Config ไว้เลยครับ

5

เมื่อครบกำหนดเวลาลองเช็คที่ Column Success ดูนะครับ จะมี Result แจ้งอยู่ว่ามีการทำงานไปทั้งหมดกี่ครั้งครับ จากตั้วอย่างก็จะมี 2 Items คือมีการสั่ง Start workflow ไปแล้ว 2 ครั้ง

6

หรือจะเช็คที่ Instance ใน workflow ก็ได้นะครับ

7

ทั้งหมกก็คือเจ้าตัว Workflow Schedule นะครับ ก็หวังว่า Feature นี้อาจจะเข้ามาเป็นตัวช่วยให้สะดวกมากขึ้นนะครับ หากต้องพบเจอเงื่อนไขโปรแกรมในลักษณะที่เป็น job การทำงานที่ต้องมาสั่ง Start Workflow ครับ ขอบคุณครับ

ทำหน้า Search View เพื่อสนับสนุนการ Search พร้อมกันหลาย fields ด้วย Store Procedure Smart Object

ในกรณีที่เราต้องการสร้าง Search View จาก Smart Object ของ K2 นั้น ในกรณีปกติ เราก็จะสร้าง list view ซึ่งก็จะสามารถ Search ได้ด้วยการใช้ Filter หรือ Quick Search ที่จะให้เราเลือก Field ได้

แต่ในกรณีที่เราต้องการสร้างหน้า Search form ที่ต้องการให้ Search ได้หลายๆ Field พร้อมกันล่ะ ต้องทำยังไง

เมื่อลองคิดไปคิดมา ก็จะเห็นว่า Solution ที่ตรงไปตรงมาที่สุดก็คือ ไปสร้าง View ที่มี textbox หลายๆตัว แล้วก็เขียน Rules ครอบ ว่าถ้า textbox ไหนมีค่า ก็เอามา AND แล้ว Search พร้อมกัน

แต่เมื่อคิดดีๆ วิธีนี้จะยุ่งยากมาก ตอนที่เขียน rules ยิ่งมี Field เยอะ rules ยิ่ง complex

วันนี้เรามาเสนอทางวิธีการสร้าง Search View แล้วใช้ Store Procedure Smart Object ช่วย

วิธีทำมีดังนี้

  1.  ไปสร้าง Store Procedure ที่รับ Parameter หลายๆ Field ใน MSSQL (ใน SQL Management Studio มี tools ที่ช่วยสร้าง Store procedure อยู่แล้ว)

2. เมื่อเราสร้างและทดสอบ Store procedure ของเราแล้ว ว่าเวลารับ parameter มา query ได้ถูกต้อง งานของเราก็เสร็จไปแล้วกว่า 50%

(ความคิดเห็นส่วนตัว: เราสามารถเขียน Store Procedure handle กรณีที่มีหลายๆ Field ได้ดีกว่าไปเขียน Rules บน K2 เช่น จากตัวอย่างข้างล่าง คือถ้ามีค่า ก็เอาไป And ไม่มีค่า ก็ set เป็น NULL)

3. เรา Create SmartObject ผ่าน Store Procedure ที่เราสร้างผ่าน Smart Object Service Tester (SQL Server Service -> Stored Procedures -> Create Smart Object

4. เมื่อเราได้ Smart Object เราก็ไปสร้าง view ได้ ซึ่งจะมี Method List ไว้ให้เราใช้

5. พอเราสร้าง Form เสร็จ เราก็ไปสร้าง Rules ตอนที่ กด submit Search ให้เอาค่าจาก textbox แต่ละช่องไปเป็น Parameter ใน View ที่เราสร้างมาจาก Store Procedure Smart Object

ซึ่งผลที่ได้ก็คือเป็นการ Execute View Method ที่รับ Parameter ได้หลายตัวนั้นเอง

เราก็เลยทำ Search View แบบหลายๆ Field ได้สะดวกมากๆ

ปล. รูปและเนื้อหาส่วนใหญ่ในนี้เอามาจาก http://community.k2.com/t5/K2-blackpearl/Filter-List-View-based-on-Text-Box-Value/td-p/82761 ซึ่งเขียนดีอยู่แล้ว ไปอ่านกันได้เลย

ย้อน version ของ K2 component ยังไงกันนะ?

Blog นี้เริ่มจากคำถามจากทางบ้านนะครับ ว่าในการพัฒนา K2 เห็นมีการเก็บ version ไว้ ทั้ง Workflow , SmartForm และ SmartObject

version.png

แต่ยังหาวิธีการย้อน version ไม่เจอว่าต้องทำยังไง ใน blog นี้เลยจะบอกวิิธีการของแต่ละส่วนครับ

1. Workflow

เริ่มด้วยการย้อน version ของ workflow ก่อนนะครับ เพราะเป็นส่วนที่ทำได้ง่ายที่สุดแล้ว เราสามารถเข้าไปดู version ของ workflow ได้ผ่านทาง K2 Workspace หรือ K2 Management (สำหรับ version 4.7 ขึ้นไป)

สำหรับ K2 Workspace ไปที่เมนู [Server name] -> Workflow Server -> Processes -> [Process Name] -> Versions

processVersion.png

สำหรับ K2 Management ไปที่ Workflow Server -> [Workflow name] แล้วกดที่ tab Versions

processVersion47

โดยในทั้งสองไซต์ เราสามารถเลือกย้อน version ในการทำงานของ workflow ได้โดยเลือกกดที่ Set as default (มีผลเฉพาะกับ workflow ที่ยังไม่ start มานะครับ) และสามารถเลือก Download workflow version นั้น มาแก้ไขได้อีกด้วย

2. SmartForm

การย้อน version ของ smartform สามารถทำได้โดยใช้ stored procedure ที่ชื่อ Form.mRevertToVersion โดยสามารถย้อนได้ทั้ง View และ Form

สามารถตามไปอ่านวิธีการ step by step ได้ที่ -> How to roll back to a deleted or previous version of a View or a Form

3. SmartObjects

SmartObject นั้นเก็บโครงสร้างอยู่ที่ database ของ K2 แยกตาม version ที่ deploy ไป ดังนั้นการย้อน version SmartObject นั้นต้องทำตรงที่ database เลย โดยไม่ได้มี stored procedure ช่วย เหมือนการย้อน SmartForm

วิธีการทำก็คือ ต้องใช้ SQL Command ในการ update โดยนำ XML ใน SmartObjectXML ของ version ที่ต้องการย้อนกลับไป นำมาอัพเดทให้ version ล่าสุดนั่นเอง

smoVersion.png

ย้อน version SmartForm กับ SmartObject เป็นการทำงานตรงกับ database ของ K2 ซึ่งอาจมีโอกาสเกิดความผิดพลาดกับ database แนะนำว่าไม่ควรทำบนเครื่อง Production และให้ backup database K2 ทั้งก้อน ก่อนจะเริ่มทำนะครับ

การสร้าง 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 ขั้นตอนก็มีดังที่กล่าวไปข้างต้น รวมถึงมีทั้งข้อดีข้อเสีย ทั้งนี้ขอให้เลืิอกนำไปใช้ให้เหมาะสมกับงานของเราครับ 🙂

5 extensions น่าใช้และฟรี!! ใน K2 Community (ภาคสอง)

จากที่ได้รวบรวม 5 extensions น่าใช้และฟรี!! ใน K2 Community (ภาคหนึ่ง) ไปใน blog ก่อนหน้า ซึ่งได้แนะนำ extensions ส่วนใหญ่ที่เป็น control ไว้ใช้งานที่หน้าบ้าน blog นี้จะขอรวม extension หลังบ้านบ้างครับ ไปดูกันเลยว่ามีตัวไหนน่าสนใจบ้าง

ลำดับที่หนึ่ง: File service broker V2.0 (Download link)

Broker ตัวนี้ช่วยให้คุณสามารถเก็บไฟล์ลงบน server หรือ shared drive แทนที่จะเก็บลง database ได้อย่างง่ายดาย ใน version 2.0 นี้ยังเพิ่มความสามารถในการ ดึงไฟล์มาทั้ง folder ได้อีกด้วยนะ

FileSystem.png

ลำดับที่สอง: Excel Import and Excel Export

รวมมากัน 2 รายการเลยทีเดียว สำหรับการทำงานร่วมกับ Excel ไฟล์ เริ่มด้วย Excel Import (Download Link) เอาไว้สำหรับ upload file excel เข้า smart object  จากตัวอย่างในรูป เราจะเอาข้อมูลในไฟล์ TestData.xlsx ไปเข้า smartobject ชื่อ soExcelTest

excel

หลังจากมีการ import เข้า smartobject ไปแล้ว บางครั้งเราก็ต้องการเอาข้อมูลออกมาในรูปแบบของ Excel file เพื่อเอาไปใช้ทำงานต่อ ก็ใช้งานผ่านตัวนี้ได้เลย Excel Export (Download Link) ตัวนี้เป็น Control บน smartform นะ

แถมอีกตัว Excel Service Broker (Download Link) ข้างในจะมี method ให้ใช้งานประกอบไปด้วย GetCellValue, SaveCellValue, GetWorksheetNames และ GetWorksheetValues ตัวนี้จะต่างจากตัวที่ import excel เข้ามาเพราะเป็นการดึงค่าหรือบันทึกค่าตรง ๆ ลง excel file เลย

ลำดับที่สาม: Datafield Editor (Download Link)

Datafield เป็นตัวแปรที่เราสร้างขึ้นเพื่อไว้เก็บค่าต่าง ๆ ในการทำงานบน workflow ทั้งดึงค่ามาใช้ผ่าน smartobject หรือคำนวณค่าต่าง ๆ ใน workflow เอง ทีนี้ถ้า start workflow ไปแล้วเกิดมีการทำงานดึงค่าผิดขึ้นมา แล้วเรายังอยากให้ workflow นี้ทำงานต่อได้ เราสามารถใช้โปรแกรมนี้ในการเข้าไปแก้ไขค่านี้ตรง ได้เลย (แต่ทางที่ดี ก็ควรแก้ workflow ให้มันทำงานถูกต้องนะ จะได้ไม่ต้องมาตามแก้ทุกงาน)

datafield edtior

ลำดับที่สี่: ODBC Service Broker (Download Link)

จาก Blog [Smart Object] – K2 & MySQL (แบบไทย) ก่อนหน้าที่จะดึงข้อมูลจาก MySQL ก็ใช้ความสามารถของ ODBC เป็นตัวกลางในการเชื่อมต่อนีแหล่ะ

clip_image0025.jpg

ลำดับที่ห้า: Worklist service broker (Download Link)

สุดท้ายกับ Worklist Service Broker ตัว extension นี้ช่วยให้เราสามารถดึงข้อมูล worklist ขึ้นมาผ่าน smartobject ได้ นอกจากนี้ยังสามารถสั่ง action หรือ reditect ได้อีกด้วย

WorklistService

แต่งานส่วนใหญ่ที่เอา extension นี้มาใช้เพื่อทำ worklist ที่ต้องการแสดงคอลัมน์ที่เก็บไว้ในฐานข้อมูลอื่นมาแสดงด้วย ไว้วันหลังมีโอกาสจะมาเขียนวิธีการทำให้ดูนะครับ

ของใน Community โหลดมาใช้งาน ถ้าเจอบั๊ก เปิด ticket ไม่ได้นะ แต่สามารถโพสต์ถามใน community, Email ไปถามเจ้าของ extension หรือส่วนใหญ่เจ้าของก็มักจะแจก source code ให้เรามาด้วยอยู่แล้ว จะเอามา debug เพื่อแก้หรือเขียนเพิ่มไปเลยก็ได้ครับ

ไว้ถ้าได้ไปเจอ extension ตัวไหนน่าสนใจอีก จะนำมาแชร์กันอีกนะครับ วันนี้ลาไปก่อน สวัสดีครับ 🙂

[K2 for SharePoint] – Configuration Tip สำหรับ SharePoint 2016

สวัสดีครับ รอบนี้ได้ configure K2 4.7 กับ SharePoint 2016 มาเลยมี tip เพิ่มเติมจาก blog รอบที่แล้ว (ดูได้ที่นี่) มาให้อ่านกัน

ก่อนลง SharePoint 2016 จะเหมือนกับ 2013 คือ ต้องลง prerequisite installer ก่อน แต่ในรอบนี้ ถึงแม้ server เราจะต่อ internet ได้แต่ก็ไม่สามารถ download อะไรได้เลย สุดท้ายก็ต้องมา download เอง แต่เดี๋ยวก่อน!! ถ้าเรา download มาเองแล้วมาลงเอง อาจจะ error ใน step configure SharePoint ได้ ใน step นี้ แนะนำ http://nikcharlebois.com/installing-the-sharepoint-2016-prerequisites-offline-using-powershell/ ให้ download file จากในนี้ได้เลย และให้ใส่ command ตาม เป็นอันจบ

Step หลังจากนี้ ก็ทำเหมือนกับ SharePoint 2013 เลย หลังจากลงเสร็จก็ enable service ตามด้านล่าง (แนะนำให้ใช้ command line ทั้งหมด เพราะว่า ถ้าทำผ่าน UI จะ set บางส่วนไม่ได้)

  • Subscription Service

    $account = Get-SPManagedAccount <Account Name>
    $appPoolSubSvc = New-SPServiceApplicationPool -Name SettingsServiceAppPool -Account $account
    $appSubSvc = New-SPSubscriptionSettingsServiceApplication -ApplicationPool $appPoolSubSvc -Name SettingsServiceApp -DatabaseName <Database Name>
    $proxySubSvc = New-SPSubscriptionSettingsServiceApplicationProxy -ServiceApplication $appSubSvc

  • App Management Service

    $account = Get-SPManagedAccount <Account Name>
    $appPoolAppSvc = New-SPServiceApplicationPool -Name AppServiceAppPool -Account $account
    $appAppSvc = New-SPAppManagementServiceApplication -ApplicationPool $appPoolAppSvc -Name AppServiceApp -DatabaseName <Database Name>
    $proxyAppSvc = New-SPAppManagementServiceApplicationProxy -ServiceApplication $appAppSvc

  • User Profile Service

    $appPool = New-SPServiceApplicationPool -Name HostedAppPool -Account (Get-SPManagedAccount “<Account Name>“)
    $app_UPA = New-SPProfileServiceApplication -Name UPA -PartitionMode -ApplicationPool $appPool

    ตรงนี้จะมีความต่างจาก SharePoint 2013 นิดหน่อย ตรงที่ไม่มี User Profile Synchronization Service ให้ start แต่ในมุมของเราให้สร้าง User Profile Service ให้เรียบร้อย พอสร้างแล้วจะมีปุ่มให้กด Manage

UPS01

Configure Synchronization Connections ให้เรียบร้อย ก็จะใช้งานได้ปกติ

UPS02

UPS03

  • Enable NetBIOS สำหรับ User Profile Service Name ให้ไปดูที่หน้า App Management Service แล้วใส่ชื่อตาม

    $UserProfileServiceApp = Get-SPServiceApplication -name <User Profile Service Name>
    $UserProfileServiceApp.NetBIOSDomainNamesEnabled = 1
    $UserProfileServiceApp.Update()

  • Shell Admin grant SPShellAdmin ให้ user ที่จะเป็นคนรัน app deployment

    Add-SPShellAdmin -UserName <Account Name>
    Get-SPDatabase | ?{$_.Name -eq “<WSS Content DB>“} | Add-SPShellAdmin -Username <Account Name>
    Get-SPDatabase | ?{$_.Name -eq “<SharePoint Admin DB>“} | Add-SPShellAdmin -Username <Account Name>
    Get-SPDatabase | ?{$_.Name -eq “<SharePoint Config DB>“} | Add-SPShellAdmin -Username <Account Name>
    Get-SPDatabase | ?{$_.Name -eq “<App Management Service DB>“} | Add-SPShellAdmin -Username <Account Name>
    Get-SPDatabase | ?{$_.Name -eq “<User Profile Service DB>“} | Add-SPShellAdmin -Username <Account Name>
    Get-SPDatabase | ?{$_.Name -eq “<User Profile DB>“} | Add-SPShellAdmin -Username <Account Name>

ถ้าทำเรียบร้อยก็ให้รัน K2 for SharePoint App Deployment ได้เลย 🙂

5 extensions น่าใช้และฟรี!! ใน K2 Community (ภาคหนึ่ง)

อีกหนึ่งความสามารถของ K2 คือส่วนของ Extension หรือการ customize ความสามารถในการทำงานของ K2 เช่น การเขียน custom control ดังที่เคยเขียนไปใน blog ก่อนหน้า

แต่เดี๋ยวก่อน…ก่อนจะเริ่มลงมือเขียนตั้งแต่ต้น ผมขอแนะนำให้ไปส่องดูที่ K2 Community ดูก่อน ว่ามีคนทำไว้แล้วหรือไม่ จะได้ไม่ต้องเริ่มเองใหม่ทั้งหมดเนอะ โดย Blog ภาคแรกนี้ได้รวม extension น่าใช้งานในส่วนของ control หน้าบ้านเอาไว้ 5 ลำดับ (ตามความชอบใจของผู้เขียน)

ลำดับที่หนึ่ง: Highchart (Download Link)

แจ่มแจ๋วและน่าใช้สุด ๆ กับ Highchart Control ที่ช่วยสร้าง report จาก smart object ได้ง่ายดาย ดึงข้อมูลขึ้นมาผ่าน ADO.Query นะครับ (ใช้ไม่ยากหรอกนา เขียนคล้ายๆ SQL Statement นั่นแล)

Example_LineChart

***  Hightchart requires a license for commercial use ***

ลำดับที่สอง: K2 Menu System (Download Link)

K2 นั้นมี Workdesk ที่เป็นลักษณะของ portal ที่รวมเมนูให้ใช้งานกันได้ฟรี ๆ อยู่แล้ว แต่ถ้าเราอยากลองใช้เมนูที่มีลูกเล่นมากขึ้น, แสดงเมนูได้ทั้งด้านบน ด้านข้าง, เปลี่ยน stylesheet ได้มากกว่าเดิม… K2 Menu system เป็นอีกหนึ่งตัวเลือกในการทำ portal ของคุณได้อย่างแน่นอน

original

ลำดับที่สาม: Form Progress Bar (Download Link)

“View flow ดูบน IE ไม่ได้?” , “View flow ดูแล้วเข้าใจยากจัง มีที่ดูง่ายกว่านี้มั้ย?”

คำตอบคือ มีครับ 🙂 ไป download มาติดตั้งตาม link ข้างบนได้เลย หน้าตาจะเป็นลักษณะรูปขั้นตอนการทำงาน สีเขียวคือทำไปแล้ว และสีฟ้าคือรอการพิจารณาอยู่ ทำให้เราสามารถเช็คได้ว่างานไปค้างอยู่ที่ไหนแบบไม่ซับซ้อนและเข้าใจได้ง่ายดี

9-23-2015 12-12-22 PM.png

ลำดับที่สี่: Digital Signature V2 (Download Link)

ถ้าสวมหมวก developer คุยกัน…กี่ครั้งแล้วที่เราบอกผู้ใช้งานว่ามี digital signature ในระบบเรา แล้วเราก็เอารูปลายเซ็นต์มาแปะที่หน้าจอ… ครั้งนี้แหล่ะครับ เราจะได้ให้เค้าเซ็นต์จริงๆ แล้วนะ

sign

และลำดับที่ห้า: Multilingual smartforms (Download Link)

อยากใช้งานหน้าจอ smartform ได้หลายภาษา ทำยังไงดูตัวอย่างการ configure และการใช้ตาม video เลย

ทุก extension จะมีคู่มือการติดตั้งและการใช้งานให้ อ่านก่อนใช้นะจ้ะ

Note: ของใน Community โหลดมาใช้งาน ถ้าเจอบั๊ก เปิด ticket ไม่ได้นะ แต่สามารถโพสต์ถามใน community, Email ไปถามเจ้าของ extension หรือส่วนใหญ่เจ้าของก็มักจะแจก source code ให้เรามาด้วยอยู่แล้ว จะเอามา debug เพื่อแก้หรือเขียนเพิ่มไปเลยก็ได้ครับ

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&#8221;}

ผลหลังจากการ 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&#8221;},{“$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&#8221;},{“$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&#8221;},{“$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&#8221;},{“$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&#8221;}]}

ผลหลังจากการ call ก็เป็นตามด้านล่าง

08-DailyForecast Call

จริงๆ ค่าที่ REST return มามีมากกว่าที่ผมเอามาแสดง แต่ผมเขียน swagger เพื่อเอาค่ามาเฉพาะที่ต้องการเท่านั้น (ขี้เกียจนั่นเอง = =’) ถ้าใครอยากดูตัวอย่างการเขียน swagger กับ file JSON ที่ generate ออกมาได้สามารถ download ได้ตาม link ด้านล่างนะครับ

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

 

 

 

 

List View Scroll bar with JS

หลายคนคงเคยเจอปัญหากับการแสดงผลของ list view ในกรณีที่มีคอลัมน์ใช้งานเยอะๆ คอลัมน์จะมีความกว้างน้อยทำให้การใช้งานค่อนข้างสะดวกจะไม่สะดวก ซึ่งผมก็เจอปัญหานี้เช่นกันโดยผมใช้เจ้าตัว Java Script เข้ามาช่วยเพื่อให้ UI ของเรา มีหน้าตาที่ดูง่ายยิ่งขึ้น ซึ่งผมมีปัญหากับ List view ที่ต้อง
แสดงผลคอลัมน์เป็นจำนวน 20 คอลัมน์ ซึ่งเมื่อแสดงผลก็เป็นอย่างที่เห็นแหละครับ ดูกันไม่รู้เรื่องเลยว่าอะไรเป็นอะไร

SB1

อย่ารอช้ามาดูวิธีกันเลยครับว่าจะเอาเจ้า JS มาช่วยยังไง

  1. ไปที่ฟอร์มที่มีการใช้งาน List View สร้าง Data Label ขึ้นมาหนึ่งตัวครับSB2
  2.  จากนั้นให้ดำเนินการใส่ Expression ให้กับตัว Data Label ที่เราสร้างขึ้นมานะครับ โดยใน Expression เราจะใส่ JS เข้าไปนี่แหละSB3
  3. ดำเนินการใส่ Script ได้เลยครับSB4

Script ที่เราจะใช้คือ

SB9

สำหรับ  name=’ScollBar.Form Area Item‘ จะเป็น name ของ view ที่เราต้องการจะให้มี scroll bar นะครับ ซึ่งถ้าเราหาไม่เจอว่าไอเจ้าชื่อ name ของ view เนี่ยอยู่ตรงไหนให้ดูที่หน้าฟอร์มได้นะครับ โดยจะอยู่ในส่วนของ Properties ด้านขวามือครับ สามารถ copy ไปวางใน script ได้เลยครับ

SB5

เมื่อดำเนินการใส่ Script ที่ Expression เสร็จเรียบร้อยแล้วให้ดำเนินการในขั้นตอนถัดไปได้เลยครับ

4. ให้เลือกไปที่ List View นะครับ โดยขั้นตอนนี้เราจะใส่ความกว้างของ List View ครับ โดยเราสามารถใส่ได้ตามใจชอบนะครับ ว่าอยากให้ List View ของมีความกว้างเท่าไร โดยสามารถปรับความกว้างได้ที่ Properties ของ List View ครับ  ซึ่งจากตัวอย่างผมใส่เป็น 2400px ครับ เพราะผมมีคอลัมน์ค่อนข้างเยอะ ยังไงก็ลองปรับให้เข้ากับหน้าจอที่จะนำไปใช้งานดูครับ

SB6

เสร็จแล้วก็ถึงเวลา RUN Test ดูครับ จะเห็นว่าจะมี Scroll Bar เกิดขึ้นอยู่ด้านล่าง และ คอลัมน์ขยายความกว้างตาม Header ซึ่งก็ค่อนข้างดูง่ายขึ้นกว่าเดิม ยังไงถ้าท่านใดเจอปัญหาการแสดงผลของ list view แบบนี้ลองนำไปใช้ดูกันนะครับ หวังว่าคงจะเป็นประโยชน์กันนะครับ

SB7

SB8