Query Encrypted SmartBox SmartObject from Reporting Service

ในกรณีที่เราต้องการเก็บค่า Data Encryption เราสามารถสร้าง SmartBox และ Enable Encryption Option ได้ คำถามต่อมาก็คือว่า แล้วเราจะสามารถ Query Data ที่มันถูก Encrypt จาก Application อื่นที่ไม่ใช่ K2 ได้อย่างไร เช่น เราต้องการนำ Reporting Service มา Query ที่ Table นี้

วิธีการคือ เราสามารถ Query โดยอ้างอิง Certificate และ SCSSOKey ที่ทาง K2 Auto Generate ไว้ให้เราได้ ตามรูปด้านล่าง

Certificate Name = SCHostServerCert

Symmetric Keys = SCSSOKey

พอเราทราบ 2 ค่านี้ เราสามารถมาเขียน query ได้ประมาณนี้ (จากตัวอย่างคือ query ข้อมูล password ที่ encrypt ไว้)

Open symmetric key SCSSOKey
Decryption by certificate SCHostServerCert
select [Password], Username, convert(varchar, DECRYPTBYKEY([Password])) as ‘DecryptedPassword’
from [SmartBoxData].[TestEncryption]
Close symmetric key SCSSOKey

ขอมอบ Credit นี้ให้พี่หนู VenTek เทพ SQL & Reporting นะครับ 🙂

Deploy Package แล้ว Form ไม่แสดงใน Designer

ปัญหานี้อาจจะมีสาเหตุจากการ Deploy ครั้งแรก แล้ว Disk Space เครื่องเต็ม ทำให้ตัว Deployment Error กลางคัน แล้วพอมาทำการ Deploy ใหม่ก็สามารถ Deploy ได้ปกติ ไม่มี Error

อย่างไรก็ตาม เมื่อเข้าผ่าน K2 Designer กลับไม่เห็น Form / View ที่ Deploy ไป

ถ้าเจอปัญหาแบบนี้ ให้ลอง Deploy อีกครั้งนึง แต่แทนที่จะเลือก Option ว่า Use Existing Form ให้เลือก Create New แทน ก็จะสามารถแก้ปัญหานี้ได้ครับ

เรียก Store Procedure ผ่าน SMO ได้ค่าไม่เหมือนกันกับการเรียก Store Procedure ตรงๆ

เนื่องจากได้เจอปัญหาที่ค่อนข้างแปลก กล่าวคือ เมื่อลองเรียก SMO ที่ถูกสร้างมาจาก Store Procedure กลับไปผลไม่เหมือนกันกับที่ลองเรียก Store Procedure ตรงๆ ทั้งที่มีการส่ง Parameter เหมือนกันเป้ะๆ

สิ่งที่ได้ลองแล้วไม่แก้ปัญหาคือ

  1. Refresh ทั้ง SMO และ Service Instance
  2. Refresh ฝั่ง Store Procedure

โดยสิ่งที่สามารถช่วยแก้ปัญหาได้คือ จะต้องทำการสร้าง Store Procedure ใหม่ โดย Copy จาก Store Procedure เดิม แล้วจึง Recreate SMO โดยใช้ GUID เดิม ให้ไปชี้ที่ Store Procedure ใหม่แทนครับ

หลังจากการทำแบบนี้ แล้วลองเรียก SMO ใหม่ก็ได้ค่าเหมือนกันแล้วครับ

ต้องขอบคุณ คุณเอก, K.Sumit, K.Susy และ คุณกายที่ช่วยแนะนำมาทาง Line Group ด้วยนะครับ

ปล. ทางคุณกายแนะนำว่า ถ้าเจอปัญหานี้ อาจจะลอง Restart SQL ก็น่าจะสามารถช่วยแก้ปัญหาได้เหมือนกัน

วิธีการส่งข้อความจาก K2 ไปยัง Line Notify

วันนี้ได้รับการแชร์อีกหนึ่ง solution ดี ๆ จาก K.Susy มาแชร์ ว่าถ้าเราต้องการ ส่งข้อความจาก K2 ไปยัง Line Notify จะทำได้อย่างไร

วิธีการส่งข้อความจาก K2 ไปยัง Line Notify

การออกแบบ SW ปัจจุบันนอกจากจะออกแบบให้ใช้งานง่าย ผลลัพธ์ถูกต้อง ประมวลผลได้รวด มีความสวยงาม แล้วยังมีอีกสิ่งหนึ่งที่เราต้องคำนึงถึงคือ พฤติกรรมของ User ปัจจุบัน User โดยส่วนใหญ่มัก Check Line บ่อยครั้งมากกว่า E-mail บริษัทเสียอีก ดังนั้นวันนี้ขอยกตัวอย่างแบบง่ายๆ ไม่ Advance จนเกินไปแล้วค่อยนำไปประยุกต์ใช้กันค่ะ (ถ้าทำแบบ Advance ใช้โดย Control Picker อันนี้ต้องเขียน Store Procedure FOR XML PATH  และ for each item ใน K2)  เพื่อเป็นการไม่เสียเวลาเรามาทำแบบง่ายๆ ตามขั้นตอนดังนี้ค่ะ

1.ขอ Token Line ตัวอย่างการขอลองทำตามคลิปนี้ดูค่ะ  

https://www.youtube.com/watch?v=zEuclsztXFA

2.เมื่อได้ Token ก็นำ Token ไปเก็บไว้ที่ DB

3.เปิด Visual Studio เพื่อสร้าง C# Class Library (.NET Framework 4.6.1)  แล้วนำ Source Code นี้ไปวาง  หลังจากนั้นให้ทำการ Build Solution เพื่อให้ได้ class.dll ซึ่งสามารถเข้าไป Copy ใน Folder …\bin\Debug ได้ตาม Path Project ที่เราสร้างไว้

using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Net;
using System.Text;
using System.Threading.Tasks;

namespace IA_LineNotify
{
    public static class LineNotify
    {
        public static void lineNotify(string msg, string Token_user)
        {
            try
            {
                var request = (HttpWebRequest)WebRequest.Create("https://notify-api.line.me/api/notify");
                var postData = string.Format("message={0}", msg);
                var data = Encoding.UTF8.GetBytes(postData);

                request.Method = "POST";
                request.ContentType = "application/x-www-form-urlencoded";
                request.ContentLength = data.Length;
                request.Headers.Add("Authorization", "Bearer " + Token_user);

                using (var stream = request.GetRequestStream()) stream.Write(data, 0, data.Length);
                var response = (HttpWebResponse)request.GetResponse();
                var responseString = new StreamReader(response.GetResponseStream()).ReadToEnd();
            }
            catch (Exception ex)
            {
                Console.WriteLine(ex.ToString());
            }
        }
    }
}

4. Copy File .dll ไปวางไว้ใน Server

5.สร้าง Service Type ให้เปิด K2 Management>Integration>Service Types>New>Service:เลือก AssemblyServiceBroker

6.สร้าง Service Instance ให้เปิด K2 Management>Integration>Service Instances>New>และให้เลือกตามตัวอย่างภาพ

7.เปิด K2 Designer สร้างแบบ Advance Smart Object เพื่อทำ smo Line Notify ตามภาพ

8. สร้าง Store/View/เรียกผ่าน Table โดยตรงก็ได้ขึ้นอยู่กับความเหมาะสม ตัวอย่างนี้เราเรียกผ่าน Store procedure เมื่อสร้างเสร็จอย่าลืม Refresh Service Instance ด้วยค่ะ

9.สร้าง Smart Object เพื่อให้   K2 Connect Store Procedure ให้เปิด K2 Designer แล้วทำสร้าง Advance Smart Object

10. เปิด K2 Designer เพื่อสร้าง Item View ตัวอย่างตามรูป

11. สร้าง Rule ให้กับ Button ตัวอย่างเช่น

12. Run View แล้วลองกดปุ่ม Send Line Notify ดูกันนะคะ

ก็จบไปสำหรับเนื้อหาในการต่อ K2 เข้ากับ Line notify แล้วนะครับ ต้องขอบคุณและชื่นชมคุณ Susy จริง ๆ ใครยังไม่ได้อ่าน บทความก่อนหน้าเรื่อง How to Export From Listview to Excel Template ไปตามอ่านได้ในลิ้งค์นะครับ

ถ้าท่านไหนมีเทคนิคการใช้งานดี ๆ แบบนี้ก็สามารถแชร์มาให้กับ community ได้นะครับ

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

How to Export From Listview to Excel Template

สำหรับ K2 Five ตั้งแต่ version 5.1 ขึ้นไป จะมีความสามารถในการ Export List to Excel อยู่แล้วครับ แต่ในกรณีที่เราต้องการ export excel แบบมีการเตรียม format ไว้ก่อน ต้องทำอย่างไรบ้าง วันนี้ได้รับเกียรติจาก K.Susy มาแชร์ ว่าต้องทำอย่างไรบ้าง เชิญติดตามได้เลยครับ

           สวัสดีค่ะวันนี้เรามาแชร์ประสบการณ์ดีๆ  ใน K2 กันคะ คุณเคยเจอไหมที่ลูกค้าอยากได้   Report  Excel สวยงามแบบนี้ เรามาดูขั้นตอนการทำกันเลยค่ะ

 ขั้นตอนที่ 1 การติดตั้ง และตั้งค่าใน K2 Management

1.1 ติดตั้ง  “Microsoft Access Database Engine.exe”  ซึ่งเป็น Service ให้ SQL Server ติดต่อกับ Excel  ได้เราสามารถ download ที่ https://www.microsoft.com/en-us/download/details.aspx?id=13255

ภาพที่ 1 ติดตั้ง  Microsoft Access Database Engine

1.2 Config K2 ใน  Management ส่วนที่เป็น Service Instance กำหนดให้ Suppress Transection = True  และ User ที่ Connect DB ต้องเป็น Admin นะคะ ไม่งั้นเวลาเรา Execute  Store Procedure ผ่าน K2 จะ   Error   ค่ะ

ภาพที่ 2 การ Config  K2 Service Instance

1.3 ติดตั้ง Excel/CSV Import File Service Broker สามารถ download ได้ที่

https://community.nintex.com/t5/K2-Five-blackpearl/Excel-CSV-Import-Service-Broker/ta-p/176973 (เมื่อโหลดเสร็จจะมีตัวอย่างการตั้งค่า K2 Management อย่าลืมทำกันนะคะ)

ภาพที่ 3 ติดตั้ง Service File Broker และการ Add Service Type

ขั้นตอนที่ 2 การออกแบบ Excel Template ตามที่เราต้องการ

การออกแบบ Template Excel นั้นสิ่งสำคัญคือ Data Type ใน Excel ต้อง Match กับ Data Type ใน DB หากไม่ได้นำไปใช้คำนวณสูตรใดๆ แนะนำ Set  Column เป็น Text ไปเลยค่ะ  ส่วนที่เป็น Input data ที่จะนำข้อมูลจาก ListView มาแสดงนั้น ไม่ควรตีตาราง/หรือตีเส้น ต้องปล่อยให้เป็น Cell ว่างๆ เพราะจะทำให้ข้อมูลที่ส่งมาจาก DB ถูกต่อท้ายที่เรากระทำการใส่สี/ตีเส้นทันที 

ภาพที่ 4 ตัวอย่าง Excel Template

หากกรณีเราถ้าต้องการให้ส่วนที่เป็น  Input data ตีเส้น/ใสสีให้สวยงามแนะนำให้ใช้ Rule วันนี้เราก็มี ตัวอย่างการใช้ Rule มาดูกันเลยค่ะ

ภาพที่ 5 วิธีการตีเส้นให้กับตาราง Input data ด้วย Rule

*Highlight  Column ที่ต้องการก่อนเลือก “Conditional Formatting”

ภาพที่ 6 วิธีการเปลี่ยน สีพื้นหลัง row เมื่อ data ใน Row ไม่เหมือนกับ Row ด้านบน

Highlight  Column ที่ต้องการก่อนเลือกแล้วไปที่  “Conditional Formatting”  วิธีนี้เราจะใช้เทคนิคการ MOD แต่ใน Excel เราจะสร้าง Column MOD รองรับไว้ก็พอไม่ต้องเขียนสูตร MOD ใน Excel เพราะเราจะไปทำใน DB แทน และอย่าลืม Hide Column MOD ด้วยนะคะ

ขั้นตอนที่ 3 สร้าง Folder ใน Server  และ Copy Excel Template ที่เราเตรียมไว้

 เมื่อเราทำการสร้าง Excel Template เสร็จแล้วให้นำไฟล์ Excel ไปวางไว้ใน Server Path ที่เราต้องการได้เลยค่ะ ในที่นี้จะทำ 2 Folder ค่ะ (Folder หนึ่งไว้สำหรับเก็บ Template Excel ต้นฉบับ และ อีก Folder ไว้เก็บไว้ Excel ที่ Gen เสร็จแล้วค่ะ)  

ภาพที่ 7 ตัวอย่างการนำ Excel Template ไปวางไว้ใน Server

ขั้นตอนที่ 4 การเขียน Store Procedure ใน K2 Designer

ตัวอย่าง การเขียน SQL Command ใน Store Procedure
*ข้อควรระวังหาก Module นี้มี User ใช้มากกว่า 1 คนชื่อ File ที่ Genไม่ควรซ้ำกัน แนะนำไปประยุกต์ใช้กันเองนะคะอันนี้เป็นแค่ตัวอย่าง และอย่าลืมตั้ง Password ให้ยากต่อการเดาด้วยนะคะเพราะเราจะเปิด Cmdshell ใช้งาน

USE [Your_DBNAME]
GO
/****** Object:  StoredProcedure [dbo].[Procedure_ExportToExcelTemplate]    Script Date: 9/25/2021 12:03:34 AM ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO

ALTER PROCEDURE [dbo].[Procedure_ExportToExcelTemplate]  AS
begin
-----กรณี cmdshell เขียนถูกต้องแต่ error ให้ run คำสั่งนี้
--exec sp_configure 'show advanced options', 1
--reconfigure
--exec sp_configure 'xp_cmdshell', 1
--reconfigure
--exec sp_configure 'show advanced options', 0
--reconfigure

-----กรณี Openrowset excel เขียนถูกต้องแต่ error ให้ run คำสั่งนี้
--sp_configure ‘show advanced options’, 1;
--RECONFIGURE;
--sp_configure ‘Ad Hoc Distributed Queries’, 1;
--RECONFIGURE;
--GO

--คำสั่ง Copy File จาก Excel Template ไปเก็บไว้อีก Floder เพื่อเก็บไว้ที่ Gen เสร็จเรียบร้อย
exec master..xp_cmdshell 'del C:\K2\TestExcelTemplate\FileGenerate\FileGenerateExcel.xlsx'
exec master..xp_cmdshell 'copy  C:\K2\TestExcelTemplate\Template\FileGenerateExcel.xlsx C:\K2\TestExcelTemplate\FileGenerate'  
--คำสั่ง Query ข้อมูลจาก DB แล้วนำไป insert ข้อมูลใส่ Excel Template
insert into 
OPENROWSET('Microsoft.ACE.OLEDB.12.0','Excel 12.0 Xml; HDR=yes; Database=C:\K2\TestExcelTemplate\FileGenerate\FileGenerateExcel.xlsx',[Sheet1$])
--query ข้อมูลให้ตรง Column ใน Excel
select 
 [Year] 
,[field_id]
,[Field_Name] 
,[Field_Name_abbr] 
,[FieldQue_Name]
,[Score] 

--*MOD หาค่า เศษ 1 กับ 0 แต่ในที่นี้เราจะแปลง 0=A ,1=B เนื่องจากถ้าเราใช้ 0,1 Column ที่เป็นค่าว่างจะถูกเทสีไปด้วยซึ่งเราไม่ต้องการ
--เทคนิคง่ายๆ ก็คือ แปลงให้เป็น A,B
,CASE
  WHEN (DENSE_RANK() OVER (ORDER BY a.[field_id])%2)= 0
  THEN 'A'
  ELSE 'B'
END  as [MOD] 
FROM  [Plan_MT_Question_Field] a

end;

ขั้นตอนที่ 5 สร้าง SmartObject ใน K2 Designer

5.1 สร้าง Smart Object ไว้สำหรับให้ K2 Execute Store Procedure

5.2 สร้าง SmartObject เพื่อเรียกใช้ File Service Broker ที่ใช้สำหรับ Download File จาก Server

5.3 สร้าง SmartObject ให้ ListView

ขั้นตอนที่ 6 สร้าง View ใน K2 Designer

6.1 สร้าง View เพื่อแสดงข้อมูล

6.2 สร้าง View ให้ File Broker

ขั้นตอนที่ 7 การสร้าง Form ใน K2 Designer

ผลลัพธ์ไฟล์ Excel ออกมาสวยงามในแบบที่เราสั่งได้

Sync custom Active Directory Fields to K2 SmartObject

ปกติแล้ว เวลาเราจะ Sync user properties จาก Active Directory ใน K2 เราก็มักจะใช้ Service Broker ที่ชื่อว่า AD Service2 แล้วก็เรียกใช้ Method GetUsers / GetUserDetails จาก AD User SmartObject

AD user

ซึ่งเราก็จะได้ Field มาตรฐานที่ใช้กันบ่อยๆ ประมาณนึง เช่น

ad user prop

ปัญหาคือ ถ้าใน Active Directory เรามีการสร้าง Custom Field เช่น EmployeeID แล้วเราต้องการเอา Field นั้นมาใช้งานใน K2 เราจะทำได้อย่างไร

นี่เป็นที่มาของการใช้ Dynamic Active Directory Service Broker ซึ่งสามารถโหลดได้ผ่าน Community ที่นี้เลย

โดยหลักการทำงานของ Service Broker นี้จะเปิดทางให้เราสามารถ Add Custom Field ได้ผ่าน Tools ที่ชื่อว่า Service Schema Configurator

service schema

โดยเมื่อเราทำการ Add Field ที่เราต้องการแล้วก็ให้ Save Schema แล้วก็ Refresh Service Broker นี้อีกครั้ง เราก็จะเห็น Field ใหม่มากับ SmartObject ล่ะ

DynamicADSMO

ถึงขั้นนี้เราก็สามารถนำ SmartObject นี้ไปใช้งาน พร้อมทั้งเห็นค่า Field Custom ที่เรา Config ไว้ได้แล้วนั้นเอง