แก้ปัญหา 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

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

 

[Smartform] – Cached กับ การแสดงผลตอน Runtime

สวัสดีคับ วันนี้ได้รับคำถามมาว่าเวลาตอนทำงานบน Design time ก็แสดงถูกต้องนะ แต่พอตอน Runtime กับไม่เหมือน ไม่เหมือนยังไง มาดูกัน

Runtime-wronglayout

เห็นหน้าจอไปแล้ว แน่นอนว่า ไม่มีใครออกแบบหน้าจอแบบนี้แน่นอน ถึงแม้ว่าจะ อินดี้แค่ไหนก็ตาม ก่อนจะไปถึงการแก้ปัญหา เราต้องทราบก่อนว่า ตัว Smartform ที่สร้างขึ้นมีการเก็บ definition เอาไว้ใน database และเพื่อประสิทธิภาพในการแสดงผล ก่อนที่จะนำไปแสดงผลจะมีการ pack ไฟล์ต่างๆ ที่เกี่ยวข้องลงไปในหนึ่งไฟล์ และมีการทำ Cached เอาไว้ แต่ด้วยบุญไม่พาวาสนาไม่ส่ง ทำให้การแพ็คนั้นผิดพลาด (ซึ่งเกิดขึ้นน้อยมากกกกกกกก…) ดังนั้นตอนที่ มันแสดงผลแล้วผิด ทำยังไงมันก็ไม่หายเพราะมัน cached ตัวที่ผิดไว้นั้นเอง

วิธีแก้ไขเบื้องต้น คือ เข้าไปแก้ไข ค่า Forms.CombinedResources.Cache.Enabled จาก True เป็น False ใน file  web.config ทั้งในส่วนของ Runtime และ Designtime พอแสดงผลได้ถูกต้องแล้ว ก็เปลี่ยนค่ากลับ เท่านั้นเอง ก็จะได้หน้าตา form กลับมาแสดผลอย่างถูกต้องแล้วครับ

Runtime-CorrectLayout

หมายเหตุ Leave Application ที่เห็นเป็น Application ที่มากับชุด K2 Application Accelerator สามารถเข้าไปโหลดมาใช้ได้ฟรีครับ

[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 ด้วยว่า เราทำอะไรไปบ้างแล้ว

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

[Trouble Shooting] – K2 ส่ง Notification Email ไม่ได้

ไม่ได้เขียน blog เกี่ยวกับ K2 ซะนาน ตั้งแต่ k2underground.com เปลี่ยนเป็น community.k2.com ก็ไม่มีที่เขียนอีกเลย ถ้าใครเคยติดตาม blog เก่า (จะมีไหมเนี่ย 555) จะรู้ว่า ผมชอบเขียนเกี่ยวกับปัญหาที่มีคนถามเข้ามาว่า เจออย่างนี้แก้อย่างไร วันนี้ก็เช่นกัน

เนื่องจากการส่ง email ของ K2 หลักๆ มี 2 แบบ คือ ส่งแจ้งเตือน (notification) เวลาที่มีงานมาถึง และส่งด้วย email event (จริงๆ มีอีกทางที่ส่งจาก SmartForms แต่ไม่ขอพูดถึง เพราะเท่าที่เคยลองยังไม่ค่อยเสถียรเท่าไหร่) หลายๆ คนเคยมีคำถามว่า ทำไมสามารถส่ง email โดยใช้ email event ได้ แต่ทำไม email จาก notification ส่งไม่ได้ อาจจะมี case กลับกันบ้าง แต่ก็ไม่เยอะเท่า case นี้ ก่อนจะไปถึงช่วงการตรวจสอบเพื่อแก้ปัญหา เราต้องรู้กันก่อนว่า การทำงานของ notification ต่างกับ email event อย่างไร…

email event จะทำการส่ง email ผ่าน smtp ที่เราทำการ set ไว้ตรงๆ เลย ดังนั้นถ้าเราส่ง email ไม่ออกในกรณีที่ส่งด้วย email event การหาปัญหาจะทำได้ง่ายกว่า เพราะจะมี error ใน workflow อยู่ใน error profile ซึ่งจะมี error message ชัดเจน การแก้ปัญหาในกรณีนี้ ส่วนใหญ่จะเป็นการดูว่า K2 server สามารถเชื่อมต่อกับ smtp server ได้ไหม โดยใช้ telnet กับการตรวจสอบ setting ของ smtp ผ่าน tool connectionstringeditor ของ K2 (อยู่ใน {install directory}\K2 blackpearl\Host Server\Bin)

ส่วนของ notification จะทำงานผ่าน MSMQ และ MSMQ จะเป็นคนส่งให้ smtp อีกรอบหนึ่ง (จริงๆ ใน process มีเยอะกว่านี้ ถ้าสนใจรายละเอียดดูได้จาก http://help.k2.com/onlinehelp/k2blackpearl/userguide/4.6.8/webframe.html#reference_-_notification_event_overview.html#tracksearch=msmq) ดังนั้นจะไม่มี error ใน error profile แต่ถ้าส่งไม่ได้ จะไม่ได้ email เลย ซึ่งปัญหาส่วนใหญ่ที่เจอคือ MSMQ ทำงานไม่ปกติ อาจจะเนื่องจากการ setting หรือจากการทำงานของ windows server เอง ถ้าเจออย่างนี้ให้ทำการแก้ปัญหาตาม step ด้านล่าง

1. ตรวจสอบว่า MSMQ ได้ถูก configure ไว้ใน server อย่างถูกต้องหรือไม่ โดยตรวจสอบตาม step การ setup ตาม http://help.k2.com/onlinehelp/k2blackpearl/icg/4.6.8/webframe.html#msmq.html#tracksearch=msmq และ http://help.k2.com/onlinehelp/k2blackpearl/icg/4.6.8/webframe.html#msmq_settings.html#tracksearch=msmq

2. ให้ดูใน Public Queues ของ Server ว่า Queue Eventbus และ Eventbus Error ถูกสร้างขึ้นมาหรือไม่

public queue

3. ตรวจสอบสิทธิ์ใน Public Queues ว่า K2 service account มีสิทธิ์ Full Control ใน queue หรือไม่

permission

4. ตรวจสอบ MSDTC ว่า configure ไว้ถูกต้องหรือไม่ โดยตรวจสอบได้ตาม http://help.k2.com/onlinehelp/k2blackpearl/icg/4.6.8/webframe.html#MSDTC.html

5. ถ้าตรวจสอบว่า ด้านบน configure ไว้ถูกต้องแล้ว ให้ลอง restart server ดู เพราะเคยเจอ case ที่ MSMQ มีปัญหาจากการทำงานของ windows เมื่อทำการ restart MSMQ สามารถกลับมาทำงานปกติได้

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

หวังว่า บทความนี้จะช่วยอะไรได้บ้าง แล้วพบกันใหม่คราวหน้าครับ 🙂