[Management] – Search Role ใน K2 [TH Version]

สวัสดีครับ ไม่ได้มา update blog ซะนาน วันนี้มาด้วยเรื่องของ role ใน K2 หลายๆ คนคงทราบอยู่แล้วว่า Role ไว้ใช้เวลาที่เราอยากส่งงานไปหาคนหลายๆ คน แต่เราไม่มี group บน AD ก็เลยมาใช้ระบบจัดการใน K2 แทน วิธีใช้งานก็ไม่ยาก สามารถเข้าไปเพิ่ม Role ผ่านหน้า workspace (ก่อน K2 Five) หรือผ่านหน้า Management (K2 4.7 และ K2 Five) ได้เลย แต่สิ่งที่หายไปสำหรับ Role ใน K2 นี้ก็คือ ไม่มี function ในการ search นั่นเอง

ลองนึกถึงเวลาที่เรามี Role เยอะๆ มากกว่า  100 ขึ้นไป (จริงๆ แค่ประมาณสิบปลายๆ ก็แย่แล้ว) แล้วต้องการเข้าไปแก้ไขคนใน role หรืออยากจะรู้ว่า user นี้อยู่ใน Role ไหนบ้าง จะทำยังไงดี?? วันนี้เรามี tool มีนำเสนอ โดยทำตาม step ด้านล่าง

  • สร้าง stored procedure ตาม script ด้านล่างใน database ที่เห็น database K2 จะสร้างไว้ใน database K2 ก็ได้ แต่ว่า ถ้ามีการ upgrade version หรือ patch stored procedure นี้อาจจะหายไปได้

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

เมื่อ deploy แล้วสามารถใช้งาน form ได้ที่ {url}/Runtime/Runtime/Form/UserRole.Form/

หวังว่า จะช่วยทำให้ชีวิตในการใช้ Role ของทุกคนง่ายขึ้นนะครับ 🙂

Advertisements

[K2 smartform] VLog – ตัวอย่างการใช้งาน BarCode/ QRCode

สวัสดีครับไม่ได้เขียน Blog มาซักพักนึงวันนี้ เอาตัวอย่างการประยุกต์ใช้งาน BarCode reader control ที่สามารถอ่าน ได้ทั้ง Barcode และ QR Code มาให้ลองดูกันเล่นๆ ครับ ลองไปดูกันเลย

Continue reading [K2 smartform] VLog – ตัวอย่างการใช้งาน BarCode/ QRCode

[K2 smartform] เพิ่ม Select All check box ให้กับ List View

สวัสดีครับเพื่อนๆ จากคราวที่แล้ว ที่คุณกายได้มาแชร์เรื่อง การทำ Check Box บน List View ก็มีคำถามเพิ่มเติมเข้ามาว่า แล้วอยากทำ Select All จะมีแนวทางอย่างไร คุณกายเลยเพิ่มเติมเข้ามาให้ครบ ลองมาดูกันครับผม

การเพิ่ม Select All

เพิ่ม Rule ไปที่ ChkAll

การตรวจสอบวันหยุดจาก “Special & Exception Dates”

สวัสดีครับเพื่อนๆ วันนี้มีบทความ Trick & Tip มาฝากเพื่อนๆ อีกเช่นเคย บทความนี้ได้รับการแบ่งปันมาจาก “คุณกาย” แห่งห้อง K2 Technical Rock ครับ หากเพื่อน สนใจอยากส่งบทความเข้ามาบ้างสามารถแจ้งมาได้ที่ narapat@k2.com ได้เลยนะครับผม

สำหรับ การตรวจสอบวันหยุดจาก “Special & Exception Dates” จะทำได้ยากง่ายอย่างไรนั้นเชิญทัศนาได้ ณ บัดนาวว

Continue reading การตรวจสอบวันหยุดจาก “Special & Exception Dates”

[k2 smartform] การทำ Check Box บน List View

สวัสดีครับเพื่อนๆ สำหรับ K2 Ranger วันนี้ เราได้รับเกียรติจาก “คุณกาย” K2 Champion ที่คอยช่วยตอบปัญหาด้านเทคนิค ให้กับพี่ๆ น้องๆ ในห้อง K2 Technical Rock อยู่สม่ำเสมอ ทาง K2 Ranger ทีมเลยขอส่งเทียบเชิญให้ช่วยเขียนบทความให้กับคอมมูนิตี้ของเราครับ

และตอนนี้ คุณกายได้ส่งมาให้เรียบร้อยแล้ว K2 Ranger ขอขอบคุณ “คุณกาย” มา ณ ที่นี้ด้วยครับ

Sky - K2 Technical Rock
คุณกายกับหนุ่มน้อย

Continue reading [k2 smartform] การทำ Check Box บน List View

K2 Google G Suite Integration [EN Version]

Credit of this blog goes to withsp

Hello today we’ll talk about integration between K2 and Google GSuite. Pre-requisite as below

  • K2 Five version 5.0001.1000.1 or above (version date is 28 Nov 2017)
  • Google account

Firstly, we need to prepare google service that we want to intergrate with. Url for enable service is https://console.developers.google.com/apis. You need to signin with google account. Click Library tab on the left.

google01

In our example we’ll use Google Drive API.

google02

Click Enable button

google03

Then go to tab Credentials and select OAuth consent screen. Select your email and enter Product Name

google05

After Save click at Credentials again and select Create credentials => OAuth client ID

google06

In Create client ID screen select Application Type as Web application and input Name. Input Authorised JavaScript origins as your K2 site url and Authorised redirect URIs as K2 site url append with /identity/token/oauth/2

google07

After created, we’ll get Client ID and Client secret. These will use to register with K2. So we’ll finish setup Google side.

google08

Open your K2 management site and navigate to Authentication => OAuth => Resource Types. Create your new OAuth Resource Type

google10

Next step is create Resource Type Parameters at the bottom view

google11

After finish, navigate to OAuth => Resources. Create your new OAuth Resource and select Resource Type as your created resource from previous step. Input Authorization Endpoint as https://accounts.google.com/o/oauth2/auth and Token Endpoint as https://accounts.google.com/o/oauth2/token

google12

Next step is configure parameter for OAuth Resource

  • client_id and client_secret input information that we got from Google.
  • response_type input Authorization Value as code
  • scope input as https://www.googleapis.com/auth/drive
  • redirect_uri input Authorization Value and Token Value as K2 site url append with /identity/token/oauth/2
  • grant_type input Token Value as authorization_code
  • access_type input Authorization Value and Token Value as online

google13

After finish we’ll have OAuth resource ready to use in service instance configuration. For configure REST service instance we need to have json of service that we want to use. For Google Drive we can search at  https://apis.guru/browse-apis/

google14

Next step we’ll register REST service. Select Authentication Type as OAuth and select our OAuth Resource from previous step

google15

google16

If we found above error, don’t be panic. After you finish OK, system will open browser for you to authentication with google. After you input username password and follow instruction on screen. You will navigate to Authorization Successful screen.

google17

Try adding service instance again. You should be able to create new service instance. Then you can create SmartObject to get data from Google Drive as expected.

google18

Step for create OAuth in K2 reference from https://help.k2.com/kb001702. Google API document can found in google website that you for enable services. If you have question, please feel free to ask. See you next time 🙂

 

K2 Google G Suite Integration [TH Version]

บทความนี้ขอมอบ credit ให้ withsp

สวัสดีครับ วันนี้เราจะมาคุยกันเรื่อง integration ระหว่าง K2 กับอย่างอื่นที่ไม่ใช่ตระกูล Microsoft กันบ้าง นั่นคือ Google GSuite นั่นเอง เรามาดู pre-requitsite กันก่อน

  • K2 Five version 5.0001.1000.1 ขึ้นไป (version นี้ออกวันที่ 28 Nov 2017)
  • Google account

อย่างแรกเลย เราต้องมาเตรียมตัวในฝั่ง Google กันก่อน ให้เข้าไป enable service ที่เราต้องการผ่าน ให้ login เข้าไปด้วย google account ของเราเอง ที่ url https://console.developers.google.com/apis จากนั้นให้กด tab Library ทางด้านซ้าย

google01

ให้เลือก library ที่เราต้องการใช้ ในตัวอย่างนี้เราจะใช้ Google Drive กัน

google02

ให้กดปุ่ม Enable

google03

จากนั้นให้กดที่ tab Credential และเลือก OAuth consent screen ให้เลือก email แล้วก็ใส่ Product Name เป็นอะไรก็ได้

google05

เมื่อกดปุ่ม Save แล้วให้กดกลับไปที่ Credentials แล้วเลือก OAuth client ID

google06

ในหน้า Create client ID ให้เลือก Application Type เป็น Web application และตั้งชื่อ client เป็นอะไรก็ได จากนั้นใส่ Authorised JavaScript origins เป็น url ของเครื่อง K2 กับ Authorised redirect URIs ให้ใส่เป็น url เครื่อง K2 ต่อด้วย /identity/token/oauth/2

google07

เราจะได้ Client ID กับ Client secret มาเพื่อเอาไป register กับ K2 ต่อไป เป็นอันเสร็จสิ้นกระบวนการฝั่ง Google

google08

มาที่ฝั่ง K2 บ้าง ให้เข้าไปที่ site management กดไปที่ Authentication => OAuth => Resource Types ให้สร้าง Resource Type ใหม่ขึ้นมา

google10

เมื่อสร้างเสร็จให้สร้าง Resource Type Parameters ที่ tab ด้านล่าง

google11

จากนั้นให้ไปกดที่ OAuth => Resources ให้สร้าง OAuth Resource ใหม่ขึ้นมา โดยเลือก Resource Type ที่เราสร้างไว้แล้ว และใส่ Authorization Endpoint เป็น https://accounts.google.com/o/oauth2/auth และ Token Endpoint เป็น https://accounts.google.com/o/oauth2/token

google12

กดสร้าง OAuth Resource แล้วก็ไปกำหนดค่า parameter กัน

  • client_id กับ client_secret ให้ใส่ค่าที่ได้มาจาก Google โดย client_secret จะใส่แค่ Authorization Value กับ Token Value
  • response_type ใส่ Authorization Value เป็น code
  • scope ใส่เป็น https://www.googleapis.com/auth/drive
  • redirect_uri ใส่ Authorization Value กับ Token Value เป็น url ของ K2 ต่อด้วย /identity/token/oauth/2
  • grant_type ใส่ Token Value เป็น authorization_code
  • access_type ใส่ Authorization Value กับ Token Value เป็น online

google13

ถ้าทำเสร็จเรียบร้อย เราจะได้ OAuth ที่พร้อมสำหรับเอาไปใช้ register service instance แล้ว ในการจะ register REST service ให้ K2 เราจำเป็นจะต้องมี json ของ service ที่เราจะใช้งาน จะไปเขียน swagger เองก็ได้ แต่ด้วยความที่ Google API เป็นอะไรที่ค่อนข้างจะดัง เราเลยสามารถไปหามาจากที่อื่นได้ ผมไปหามาจาก https://apis.guru/browse-apis/ เราก็จะได้ json มาใช้แล้ว

google14

ขั้นต่อไปให้ไปที่ SmartObject Service Tester หรือใน Management site ก็ได้ แล้วกด Register REST Service เลือก Authentication Type เป็น OAuth และเลือก OAuth Resource เป็นอันที่เราสร้างไว้

google15

google16

ถ้าเจอ error นี้ไม่ต้องตกใจ เมื่อกด OK tester จะเปิด browser ให้เพื่อ authenticate กับ Google ให้ ใส่ username และ password จนถึงหน้า Authorization Successful

google17

ให้กด Add Service Instance อีกที จะสามารถสร้าง Service Instance ได้ จากนั้นก็จะสามารถสร้าง SmartObject เพื่อดึงข้อมูลจาก Google Drive ได้

google18

วิธีการสร้าง oAuth ใน K2 reference มาจาก https://help.k2.com/kb001702 ส่วน api ของ google ดู document ได้จากใน web API ของ Google เลย สำหรับคราวนี้ก็จบเพียงเท่านี้ เจอกันใหม่คราวหน้าครับ 🙂

 

[Authentication] – Using LDAP with K2

สวัสดีครับ ช่วงนี้ได้มีโอกาสทำอะไรใหม่ๆ อีกอย่างเลยเอามาเขียนเป็น blog ซะหน่อย นั่นคือ configure K2 ให้มองเห็น LDAP ที่ไม่ใช่ LDAP ของ AD แต่ถ้าเป็น LDAP ของ AD ก็น่าจะใช้ได้เหมือนกัน โดย step ที่ต้องทำมีตามด้านล่าง

  • Register Security label ของ LDAP
  • Configure Claim ใน SmartForms

 

เรามาเริ่มจาก Register Security label ของ LDAP ให้เปิด database K2 ที่ table HostServer.SecurityProvider

provider

ให้ copy GUID ของ ProviderClassName ที่เป็น SourceCode.Security.Providers.LdapProvider.Trusted.Ldap เอามาใส่ใน script ด้านล่าง ส่วนที่เป็นตัวแปร AuthSecurityProviderID

ส่วนอื่นที่ต้องเปลี่ยนจะมีหลายอันตาม highlight สีน้ำเงิน สามารถไปดูรายละเอียดได้จาก https://help.k2.com/onlinehelp/k2blackpearl/icg/4.7/default.htm#Configure/UM-LDAP-config.htm%3FTocPath%3DConfigure%7CUser%2520Managers%7C_____3 นะครับ

DECLARE @SecurityLabelName NVARCHAR(20) = ‘K2LDAP‘; –Update as needed
DECLARE @XmlConfig XML =
‘<AuthInit><LdapConnection LdapServer=”Server Name” LdapServerPort=”389” LdapSsl=”false” LdapAuthTypeConnect=”Basic” LdapAuthTypeAuthenticateUser=”Basic” LdapResolveAuthenticationUserToDistinguishedName=”true” LdapAutoBind=”false” LdapScope=”Subtree” LdapConnectIntegrated=”false” LdapConnectUserName=”uid=username,ou=People,dc=xxx,dc=xxx” LdapConnectUserPassword=”password” LdapTimeout=”0″ LdapProtocolVersion=”3″ LdapServerCertificatePath=”” /><LdapUserBaseObject>ou=People,dc=xxx,dc=xxx</LdapUserBaseObject><LdapUserSearchFormatString>(uid={0})</LdapUserSearchFormatString><LdapUserGroupSearchFormatString>(memberOf={0})</LdapUserGroupSearchFormatString><LdapUserAttributes><K2LdapMapping K2Name=”ID” LdapName=”uid” ObjectType=”System.String” /><K2LdapMapping K2Name=”Name” LdapName=”uid” ObjectType=”System.String” /><K2LdapMapping K2Name=”Email” LdapName=”mail” ObjectType=”System.String” /><K2LdapMapping K2Name=”CommonName” LdapName=”cn” ObjectType=”System.String” /><K2LdapMapping K2Name=”UserPrincipalName” LdapName=”uid” ObjectType=”System.String” /><K2LdapMapping K2Name=”DisplayName” LdapName=”cn” ObjectType=”System.String” /><K2LdapMapping K2Name=”Mobile” LdapName=”mobile” ObjectType=”System.String” /></LdapUserAttributes><LdapGroupBaseObject>ou=Group,dc=xxx,dc=xxx</LdapGroupBaseObject><LdapGroupSearchFormatString>(uid={0})</LdapGroupSearchFormatString><LdapGroupMemberSearchFormatString>(cn={0})</LdapGroupMemberSearchFormatString><LdapGroupAttributes><K2LdapMapping K2Name=”ID” LdapName=”cn” ObjectType=”System.String” /><K2LdapMapping K2Name=”Name” LdapName=”cn” ObjectType=”System.String” /><K2LdapMapping K2Name=”Email” LdapName=”mail” ObjectType=”System.String” /><K2LdapMapping K2Name=”Member” LdapName=”member” FullOnly=”true” SearchQuery=”(&amp;(objectCategory=Person)(objectCategory=User))” SearchResultProperty=”cn” ObjectType=”System.Collections.ArrayList” /></LdapGroupAttributes></AuthInit>’
DECLARE @SecurityLabelID UNIQUEIDENTIFIER = NEWID(); –Assigning new GUID
DECLARE @AuthSecurityProviderID UNIQUEIDENTIFIER = ‘EE554827-1C61-46EF-9146-293CE74E55C9‘;
DECLARE @AuthInit XML = @XmlConfig;
DECLARE @RoleSecurityProviderID UNIQUEIDENTIFIER = @AuthSecurityProviderID;
DECLARE @RoleInit XML = @XmlConfig;
DECLARE @DefaultLabel BIT = NULL; –1 = true, NULL and 0 = false

DELETE FROM [SecurityLabels] WHERE SecurityLabelName = @SecurityLabelName;
INSERT INTO [SecurityLabels] VALUES (@SecurityLabelID, @SecurityLabelName, @AuthSecurityProviderID, @AuthInit, @RoleSecurityProviderID, @RoleInit, @DefaultLabel)

จะมีบางอันที่อาจจะหาลำบากคือ ldapname กับ userbaseobject แนะนำให้ใช้พวก ldap browser เช่น http://www.ldapadministrator.com หรือ http://www.ldapadmin.org เพื่อหาข้อมูลที่ถูกต้องได้

ldap browser

เมื่อได้ script เรียบร้อย เราก็เอาไปรันใน database K2

LDAP Register

เสร็จแล้วให้ restart service K2 และเราก็พร้อมที่จะทำ step ถัดไป คือการ configure claim ให้เข้าไปที่ management site ของ K2 ไปที่ Authentication => Claims => Claims แล้วกด New

02

ใส่ข้อมูลตามด้านล่าง

03

กดปุ่ม OK แล้วไปทดสอบด้วยการ login ผ่าน form ได้เลย

Login

ถ้าใครไปลองแล้วติดอะไรก็สอบถามได้นะครับ ในส่วนของ blog นี้ ใช้ได้กับทั้ง K2 Five และ K2 blackpearl นะครับ ลองแล้วใช้งานได้ทั้ง 2 version ครับ ไว้เจอกันใหม่คราวหน้าครับ 🙂

[K2 Five] – Workflow REST & SMO OData

สวัสดีครับ วันนี้เราจะมาพูดถึง API ที่เราน่าจะได้ใช้กันบ่อยๆ คือ REST service ของ Workflow และ SmartObject

Workflow REST API

โดยสิ่งที่จะต้องทำเป็นอย่างแรกเลยคือ ไป enable service ใน Management site ก่อน

Workflow REST API Setting

หลังจากเปิดแล้วจะได้ตามด้านล่าง

Workflow REST API Setting Enable

เราสามารถทดสอบ API ได้จาก Swagger URL ด้วย

Workflow Swagger URL

Workflow Swagger Result

โดยตัวอย่างการใช้งานโดยเรียกจาก application อื่นๆ สามารถดูได้จาก https://help.k2.com/onlinehelp/k2five/DevRef/5.0/default.htm#Runtime/WF-REST/REST-Samples.htm

SmartObject OData API

เหมือนกับ Workflow REST API ต้องไปเปิดใน management site ก่อน (ถ้าเป็น version ก่อนๆ เราจะต้องไปเปิดใน config ตามวิธีใน  https://help.k2.com/onlinehelp/k2blackpearl/DevRef/4.7/default.htm#Configuration2.html)

SMO Service Setting

หลังจากเปิดแล้วจะเป็นตามด้านล่าง เราสามารถเลือก SmartObject ที่ต้องการ exposed เป็น REST service ได้ด้วย

SMO Server Setting Enable

ทีนี้พอเปิดแล้วเราก็มาลองกันซักหน่อย วิธีง่ายที่สุดคือ ใช้ Excel โดยเลือก Import Data From OData Data Feed

Excel OData

ใส่ link และ credential

Excel Data Connection Wizard

ใน wizard จะมี SmartObject ให้เลือก

List SMO

จากนั้นจะให้เลือก Import Data เป็นแบบไหน

Excel Import Data

จากนั้นก็จะได้ข้อมูลอย่างที่เราต้องการ 🙂

Excel

สำหรับรายละเอียด สามารถดูเพิ่มเติมได้จาก https://help.k2.com/onlinehelp/k2five/DevRef/5.0/default.htm#Runtime/SmO-REST/SmORESTServices.htm%3FTocPath%3DRuntime%2520APIs%2520and%2520Services%7CSmartObjects%7CSmartObject%2520REST%2520Services%7C_____0 ครับ

10 เทคนิคที่ทำให้ List View ของคุณโหลดเร็ว!!

List View เป็นการแสดงข้อมูลแบบหลาย records (ใครเขียน coding จะคล้ายๆ Grid view ใน C#) ในที่นี้จะขอรวมเทคนิคในการทำให้การเปิด List View ของคุณนั้นเร็วขึ้นมาอย่างแน่นอน

1. เรียกใช้ rule ในการ List แบบ Asynchronous

เปลี่ยนการเรียก execution block จาก then เป็น asynchronous ช่วยให้เรียก rule ได้อย่างรวดเร็วไม่ต้องรอจนทำงานเสร็จก่อนเรียก rule ถัดไป

execution block

ตอนแก้เสร็จก็ทดสอบก่อนนะ บางครั้งเราต้องรอข้อมูลก่อนหน้าให้โหลดเสร็จ แบบนี้ก็ต้องใช้ then ไปเนอะ

2. เปิด option ให้แสดงผลแบบ Paging

เปิด paging ใน list view แล้วจำกัดจำนวน item ที่จะเห็นในหน้าจอ จะช่วยลดปริมาณข้อมูลที่ต้องดึงมาแสดงผลที่หน้าจอได้

setting

ไม่ได้มีเลขเป๊ะ ๆ ว่าควรแสดงกี่รายการ แต่ส่วนใหญ่ที่ทำมักจะใช้ในช่วง 10 – 50 รายการต่อหน้าจอครับ

3. ลดการใช้งาน Association

ปกติจะใช้ร่วมกับ List Display ในกรณีที่เราเก็บ ID เป็น reference ไว้ แล้วต้องการไปดึงค่า Value ออกมาแสดงโดยอ้างอิงจาก ID

ถ้าเราอยากให้ performance ในการโหลด List View เร็วขึ้น สามารถทำได้โดยการทำการ join ในข้อมูลตั้งแต่ data source เองเช่น การเขียน Stored procedure หรือเขียน view ใน SQL ก็จะช่วยลดการทำงานในส่วนของ List Display และ association นี้ลงได้ (แต่ถ้าไม่ได้ช้ามาก ใช้ association ก็สะดวกดีครับ)

4. ลดจำนวน Column ที่แสดงใน List View

จำนวน column ที่แสดงน้อยลงจะทำให้ตอน bind เข้า List view สามารถแสดงผลได้รเ็วขึ้นไปอีก อ่อ..ต้องลบออกนะครับ ไม่ใช่แค่ซ่อนด้วย Visible = false

removeColumn

5. ลดจำนวน Properties ที่ส่งกลับมาจาก SmartObjects

โดยปกติถ้าเราสร้าง SmartObjects จากตารางบนฐานข้อมูล ใน SmartObjects จะมีจำนวน Properties เท่ากับจำนวนคอลัมน์ในตารางเลย ซึ่งเราสามารถไปลบ properties นี้ออก หรือเลือกให้ส่งกลับมาเฉพาะ properties ที่เราจะใช้ก็พอ

bind.png

หรือถ้ามีคนอื่นใช้ method นี้อยู่ด้วย ไปสร้าง method แยกไว้สำหรับหน้านี้โดยเฉพาะก็ยังได้ครับ

6. แสดงไฟล์ใน List View ด้วยลิงค์สำหรับดาวน์โหลด แทนที่จะแสดง file content

กรณีถ้าเราต้องโหลดไฟล์ขนาดใหญ่หรือไฟล์เล็ก ๆ จำนวนมากใน 1 หน้าจอก็ตาม การแสดงผลด้วย data type เป็น File จะโหลดไฟล์จริงขึ้นมาด้วย ถ้ายิ่งไฟล์มีขนาดใหญ่ ก็จะใช้ระยะเวลานานในการโหลดข้อมูล

fileListView.png

เราสามารถเปลี่ยนวิธีการเก็บไฟล์ไปอยู่บน shared network path หรือ Content Management System (CMS) เช่น SharePoint แทนได้ และแสดงผลเป็นลิ้งค์แทน เมื่อผู้ใช้งานต้องการเปิดไฟล์ ค่อยกดลิ้งค์ที่เราแสดงเพื่อไปโหลดไฟล์นั้นตรงจากที่ที่เราเก็บไฟล์ไว้ได้

7. ใช้ Input Properties ในการดึงข้อมูลแทนที่จะใช้ Filter

Filter นั้นมีความสามารถในการช่วยกรองข้อมูลที่จะแสดงใน List View ได้ด้วยเงื่อนไขต่าง ๆ แต่คุณรู้หรือไม่ว่าการใช้ Filter นั้นทำให้การแสดงผลใน List View ช้าลง เพราะข้อมูลจะถูกดึงมาทั้งหมดก่อนจึงจะมากรองออกด้วย Filter เพื่อแสดงผลในหน้าจอ

filter.png

การใช้ Input properties นั้นหลังบ้านมันคือการใส่ Where casue ว่า Input properties = ‘Value’ นั่นเอง ทำให้สำหรับหลายกรณี เจอว่า Input Properties นั้นไม่เพียงพอ เพราะต้องการค้นหาด้วยเงื่อนไขอื่นเช่น Contains, Greater than บ้าง

วิธีปรับคือพยายามควรป้อนข้อมูลใน Input properties ได้มากที่สุดก่อนเพื่อลดปริมาณข้อมูลที่ต้องโหลดขึ้นมา แล้วจึงเลือกใช้ Filter ต่ออีกทีเพื่อใส่เงื่อนไขแบบซับซ้อนลงไป หรือถ้าพบยังไม่เพียงพอ ผมก็จะใช้ View หรือ stored procedure มาช่วยรองรับเงื่อนไขแบบซับซ้อนครับ

8. ตรวจสอบว่าไม่โหลดข้อมูลซ้ำ 2 รอบ

ในการสร้าง List View ต่อกับ SmartObjects จะมี option ที่หน้า general ตรงด้านล่างว่าจะให้ Call this method when the form loads เลยหรือไม่

ถ้าไปติ๊กเลือก option นี้ระบบจะไปสร้าง rule Get List ไว้ใน View Initilize และถ้าลากไปใช้ใน Form Method Get List นี้ก็จะถูกเรียกใน Form Initilizing ด้วย (นอกจากนี้ด้วยค่า default ไม่ได้ใส่ input properties เลยทำให้มันจะดึงข้อมูลขึ้นมาทั้งหมด!!)

ListViewsGet.png

เคสที่เคยเจอคือมีไปเลือก option นี้ใน View ทำให้มีการโหลดข้อมูลแบบทั้งหมดขึ้นมา และเพิ่ม rule ใน Form initilzing ต่อ โดยโหลดข้อมูลแบบใส่ input properties ทำให้ตอนทดสอบแสดงผลที่หน้าจอถูกนะ แต่กว่าจะเปิดขึ้นมาทีช้ามาก วิธีแก้คือไปเอา rule นี้ออกซะ หรือเพิ่มเงื่อนไขให้เช็คก่อนใน View Initilize

9. ปิดการใช้ SmartForm ListView Row Count

จากที่เคยเขียน Blog ว่าด้วยเรื่องการแสดง Paging ใน Listview และ แก้ปัญหา SmartObjects สร้างข้อมูลซ้ำ หลังบ้านมีการทำงานโดยไปเรียก List method ขึ้นมา 2 ครั้งเพืื่อหาจำนวน page และเพื่อแสดงรายการ ทำให้เวลาในการโหลดข้อมูลนานขึ้น การไปตั้งค่า SmartObject.RuntimeListViewRowCount = false ก็จะช่วยให้ List method ต่าง ๆ ทำงานได้เร็วขึ้น

10. Tuning data source

ข้อนึงที่มักจะมองข้ามกัน คือการตรวจสอบที่ data soruce ตั้งต้นด้วยครับ ว่าเรียกใช้งานตรงๆ (ด้วยค่า input เดียวกับที่เราเรียกใน List view) ใช้ระยะเวลาเท่าไหร่ ถ้าระยะเวลาในการโหลดนานย่อมส่งผลต่อการเรียกผ่าน List View ไปด้วย

ส่วนวิธีแก้ให้ทำการปรับแต่งตั้งแต่ที่ data source ด้วยครับ เช่นการใส่ index ใน view หรือ table, การแก้ logic ที่ web service หรือ stored procedure ให้ทำงานเร็วตั้งต้นทาง

สำหรับเทคนิคที่ได้แนะนำไปมีทั้งทำง่าย ๆ ปรับตามได้เลย จนไปถึงยากมีต้องใช้ effort ในการทำที่มากน้อยต่างกันไป ขอให้ลองเลือกใช้ให้เหมาะสมนะครับ ว่าจะเลือกปรับตามข้อไหนและความเร็วที่ได้จากการ tuning นั้นคุ้มค่ากับที่เราลงแรงทำไปหรือเปล่า