Oracle : ROLLUP Extension to GROUP BY

การจัดกลุ่มข้อมูลด้วย GROUP BY เมื่อต้องการจัดกลุ่มข้อมูล เราสามารถใช้ประโยค GROUP BY เพื่อทำการแบ่งออกเป็นรายการย่อย ๆ การคิวรีที่รวมประโยค GROUP BY จะเรียกว่าการคิวรีแบบกลุ่ม เพราะว่ามันจะรวมกลุ่มข้อมูลจากคำสั่ง SELECT แล้วสร้างเป็นเร็คคอร์ดสรุปเพียงเร็คคอร์ดเดียวให้กับแต่ละกลุ่ม  ส่วนขยาย ROLLUP  ในการคิวรีข้อมูลเราสามารถค้นหาแถวข้อมูลผลรวมของแต่ละกลุ่ม รวมถึงสรุปผลรวมที่มาจากผลลัพธ์ทั้งหมดในตอนท้ายของการคิวรีอีกทีได้ โดยใช้ส่วนขยายที่เรียกว่า ROLLUP ซึ่งมีรูปแบบการใช้งานดังนี้ ROLLUP Syntax SELECT…GROUP BY ROLLUP(grouping_column_reference_list) ตัวอย่างการใช้งาน สมมติเรามีข้อมูลคะแนนภาษาอังกฤษของนักศึกษาใหม่ซึ่งประกอบด้วย 6 ฟิลด์ข้อมูลแสดงดังตัวอย่างด้านล่าง ข้อมูล: ตาราง TEST_NEW_STUDENT เป็นตัวอย่างข้อมูลคะแนนภาษาอังกฤษของนักศึกษาใหม่จำนวน 16 รายการ โจทย์ เราต้องการนับจำนวนนักศึกษาใหม่แยกตามคณะที่นักศึกษาสังกัด และรหัส สน.ที่สอบได้ เราสามารถใช้ประโยค GROUP BY เพื่อแก้ปัญหาข้อนี้ ดังตัวอย่างคิวรีต่อไปนี้ SELECT fac_id, sn_code, COUNT (*) NUM_STUDENT FROM test_new_student GROUP BY fac_id, sn_code ORDER BY fac_id, sn_code; ผลลัพธ์ที่ได้ : แสดงจำนวนนักศึกษาแยกตามคณะที่สังกัด และรหัส สน.ที่สอบได้ แสดงเรียงตามรหัสคณะ และรหัส สน.ที่สอบได้ โจทย์ หากเราต้องการนับจำนวนนักศึกษาใหม่แยกตามคณะที่นักศึกษาสังกัด และรหัส สน.ที่สอบได้ พร้อมทั้งแสดงผลรวมของนักศึกษาแต่ละคณะ และหาผลรวมของนักศึกษาทั้งหมดด้วย เราสามารถใช้ส่วนขยายที่เรียกว่า ROLLUP เพื่อแก้ปัญหาข้อนี้ ดังตัวอย่างคิวรีต่อไปนี้ SELECT fac_id, sn_code, COUNT (*) NUM_STUDENT FROM test_new_student GROUP BY ROLLUP (fac_id, sn_code) ORDER BY fac_id, sn_code; ผลลัพธ์ที่ได้ : แสดงจำนวนนักศึกษาแยกตามคณะที่สังกัด และรหัส สน.ที่สอบได้ แสดงเรียงตามรหัสคณะ และผลรวมของนักศึกษาแต่ละคณะ และผลรวมนักศึกษาทั้งหมด ลองใช้งานกันดูนะคะ  สำหรับส่วนขยาย ROLLUP เพื่อหาสรุปผลรวมที่มาจากผลลัพธ์ทั้งหมดในตอนท้ายของการคิวรี

Read More »

Automation Testing

ในการพัฒนา application ในปัจจุบันที่มีความเปลี่ยนแปลงอย่างรวดเร็ว ปัญหาที่จะพบตามมาด้วยก็คือ bug ของตัวระบบอันเนื่องมาจากความเร่งรีบในการพัฒนา ซึ่งการที่จะลด bug ที่อาจจะเกิดขึ้นก็จำเป็นที่จะต้องมีการทดสอบ (testing) ในส่วนต่างๆทั้งหมดเพื่อหาความผิดพลาด หรือผลกระทบที่เกิดขึ้นจากการเปลี่ยนแปลง เพิ่มเติม code ใหม่ๆ เข้าสู่ระบบหรือ application การทำ testing ส่วนต่างๆซ้ำทั้งหมดเพื่อหาความผิดพลาดที่เกิดขึ้นจากการเปลี่ยนแปลง เพิ่มเติม code ใหม่ๆ ต้องใช้เวลาค่อนข้างมาก อาจจะทำให้ผู้พัฒนาเลือกที่จะทำการ testing เฉพาะส่วน และนั่นอาจนำมาซึ่ง bug ที่เกิดจากส่วนอื่นๆที่ไม่ได้ทดสอบ การทำการทดสอบแบบอัตโนมัติทำให้สามารถลดเวลาใน testing ลงแต่ยังคงไว้ซึ่งการทดสอบ ส่วนต่างๆทั้งหมด สิ่งจำเป็นที่ควรจะรู้ในการทำ automation test คือการเขียนชุดทดสอบโดยเฉพาะ unit test ที่ดี แต่ละ test case ต้องทำงานได้รวดเร็ว แต่ละ test case มีความเป็นอิสระแก่กัน นั่นคือแต่ละ test case จะไม่เกี่ยวข้องกัน ทำให้สามารถทดสอบแบบสุ่มและแบบขนานได้ แต่สิ่งที่พบเจอเป็นประจำคือ ผลจาก test case ที่ 1 เป็น input ของ test case ที่ 2 แล้วผลจาก test case ที่ 2 เป็น input ของ test case ที่ 3 และ …. ซึ่งถ้าเป็นแบบนี้หมายความว่าแต่ละ test case ผูกมัดกันไปหมด และต้องทำงานแบบเรียงลำดับกันด้วย อีกสิ่งหนึ่งที่สำคัญคือ แต่ละ test case จะต้องไม่มีการทำงานร่วมกับระบบ Network และ Database ใด ๆ ทั้งสิ้น และใช้ Mock หรือ Fake ทำการควบคุมสิ่งที่ควบคุมไม่ได้ ทำให้สามารถเขียน test case ได้ดีขึ้น เนื่องจากการทำงานกับ Network และ Database อาจเกิดเหตุการณ์ที่ไม่สามารถควบคุมได้ทำให้ ผลของการทดสอบผิดพลาด ซึ่งแต่ละ test case ต้องสามารถทำงานซ้ำ ๆ และควรได้ผลเหมือนเดิมทุกครั้ง ไม่ใช่ทำงานผ่านบ้างไม่ผ่านบ้าง ไม่มีความน่าเชื่อถือ สุดท้ายก็จะเลิกใช้ เลิกทำและกลับไปทำแบบเดิมก่อนหน้านี้ โครงสร้างของชุดการทดสอบต้องดีด้วย เริ่มตั้งแต่ชื่อของ test case ต้องสื่อถึงสิ่งที่ต้องการจะทดสอบ ทั้ง input และ expected result ชื่อยาวไม่มีปัญหากับเรื่องของ performance ว่าจะช้าเนื่องจากมันอยู่ในส่วนของการทดสอบไม่ใช่ระบบงานจริง โครงสร้างหลัก ๆ ของแต่ละ test case ควรประกอบไปด้วย การกำหนดหรือจัดการค่าเริ่มต้นที่ต้องการ, การกระทำที่ต้องการทดสอบ และ ตรวจสอบผลการทำงานว่าเป็นไปตามที่คาดหวังหรือไม่ อย่าลืมว่าชุดการทดสอบ มันคือเอกสารชนิดหนึ่งที่ใช้อธิบายการทำงานภายในของระบบ ทั้ง class และ function ต่าง ๆ เพื่อให้คนอื่น ๆ เข้ามาอ่านอีกด้วย การคิดก่อนทำ นั่นคือก่อนที่จะเริ่มต้นทำ จะต้องเข้าใจปัญหาหรือมีเป้าหมายก่อน จากนั้นจึงแบ่งปัญหาใหญ่ออกเป็นปัญหาย่อยเพื่อให้แก้ไขปัญหาได้ง่ายขึ้น การทดสอบจะง่ายหรือไม่นั้นสิ่งที่สำคัญมาก ๆ คือโครงสร้างของ code ที่พัฒนานั้นได้คิดหรือออกแบบการทดสอบกันอย่างไรหรือไม่ ซึ่งถ้าไม่ได้คิดถึงการทดสอบตั้งแต่แรก การทดสอบจะทำได้ยากมาก   แหล่งอ้างอิง : http://www.somkiat.cc/write-automation-test/

Read More »

การบริหารโครงการโดยใช้เครื่องมือ Team Foundation Server (Phase 3 : ขั้นตอนการคัดเลือกความต้องการ และความหมายของ State)

จากบทความ การบริหารโครงการโดยใช้เครื่องมือ Team Foundation Server (Phase 2 : การบันทึกความต้องการ) ผู้เขียนได้กล่าวถึงการบันทึกความต้องการโดยใช้เครื่องมือ TFS ไปแล้ว สำหรับบทความครั้งนี้ ผู้เขียนจะกล่าวถึงขั้นตอนหลังจากรับความต้องการเข้ามา และจะเข้าสู่ขั้นตอนการคัดเลือกความต้องการ และการกำหนด State ในเครื่องมือ TFS การคัดเลือก Backlog items (Backlog items) หลังจากขั้นตอนการรวบรวมความต้องการ หรือ Backlog items จากลูกค้ามาแล้วนั้น Backlog items ที่ได้ทุกข้อจะถูกบันทึกเข้าสู่ TFS ซึ่ง Backlog items ที่ได้มาทั้งหมด อาจจะไม่ถูกเลือกให้ดำเนินการ หรือไม่ต้องดำเนินการด้วยเหตุผลต่างๆ ขึ้นอยู่กับการตกลงกันระหว่างผู้จัดโครงการ กับลูกค้า สำหรับเครื่องมือ TFS นำมาช่วย Project Manager ในขั้นตอนการคัดเลือก Backlog Items โดยการ Update State ของแต่ละ Backlog Items เพื่อให้ทราบว่า  Backlog item อยู่ใน State ใด ตามความหมายดังนี้ รูปที่ 1 จากรูปที่ 1 นะค่ะ New : คือ Backlog items ที่เข้ามาใหม่ ยังไม่ผ่านการพิจารณา หรือยังไม่ผ่านขั้นตอนการคัดเลือก Approved คือ Backlog items ที่ผ่านการคัดเลือก แต่ยังไม่ดำเนินการในรอบปัจจุบัน ซึ่งอาจจะรอในรอบการพิจารณาถัดไปเพื่อให้ดำเนินการ Commited คือ Backlog items ที่ผ่านการคัดเลือก และตกลงให้แล้วเสร็จในรอบปัจจุบัน ซึ่งจะต้องประเมินเรื่องของความเหมาะสมของเวลาด้วย ว่าสามารถดำเนินการได้กี่ Backlog items Done คือ Backlog items ที่ผ่านการคัดเลือก และดำเนินการเสร็จเรียบร้อยแล้ว หรือ คือ Backlog items ที่ผ่านการคัดเลือกแต่ไม่ถูกให้ดำเนินการให้ทำ (ซึ่งจะมีการบันทึกไว้ใน หมายเหตุ หรือ History) ในบทบาทของ Project Manager คือ หลังจากได้ตกลงกับลูกค้าและร่วมกันคัดเลือกความต้องการแล้วแล้ว Project Manager จะทำการ Update State ของ Backlog item แต่ละข้อตามข้อตกลง สร้างรอบการพัฒนา หรือ Iteration ระบุ Backlog items ที่ทำการ Commited เข้าสู่รอบ Iteration ที่ต้องการ ทำการวางแผนย่อย (Tasks) ต่อไป วิธีการสร้างรอบการพัฒนา หรือ Iteration จาก Link ของ TFS   รูปที่ 2 เลือก Configuration หมายเลข 1 ในรูปที่ 2 เพื่อเข้าไปจัดการเกี่ยวกับโครงการ จะปรากฎหน้าจอดังรูปที่ 3  รูปที่ 3 ในรูปที่ 3 จะแสดงโครงการ หรือ Project ทั้งหมดที่รับผิดชอบ ให้ทำตามขั้นตอน คือ เลือกโครงการ ตามหมายเลข 1 จะปรากฎรายละเอียดด้านขวา เลือก Link ตามหมายเลข 2 เพื่อเข้าไปทำการจัดการเกี่ยวกับรายละเอียดของโครงการที่เลือก จะปรากฎหน้าจอดังรูปที่ 4   รูปที่ 4 จากรูปที่ 4 ทำตามขั้นตอนเพื่อสร้างรอบการพัฒนา หรือ Iteration ดังนี้ กดเลือก หมายเลข 1 Iterations เพื่อจัดการเกี่ยวกับรอบการพัฒนา หรือ Iterations กดเลือกหมายเลข 2 เพื่อเลือก Release ที่ต้องการ ซึ่งอาจจะมีหลาย Release ขึ้นอยู่กับข้อตกลงกับลูกค้า หรือขึ้นอยู่กับความต้องการที่ได้รับ กดเลือกหมายเลข 3 เพื่อทำการสร้างรอบการพัฒนา ของ Release 1 โดยจะปรากฎหน้าจอขึ้นมา เพื่อให้กำหนดรายละเอียดของรอบการพัฒนา หมายเลข

Read More »

Angular : Directives

Directives คือ สิ่งที่เราเพิ่มเข้าไปใน Tag ของ HTML ซึ่งจะไปสร้าง behavior ให้กับ DOM หรือ เปลี่ยนรูป DOM จะแบ่งออกเป็น 2 ประเภทใหญ่ๆ ได้แก่ 1. Built-in Directive ซึ่งส่วนใหญ่ขึ้นต้นด้วย *ng ที่ Angular มีมาให้ก็จะมีมากมาย อาทิเช่น ng-app : ฺบอกให้ Bootstrap เริ่มทำงาน Angular กับ element ไหน ng-controller : จะใช้ controller จัดการกับ view ไหน ng-model : binding ค่าเข้า view กับ model ng-show/ ng-hide : เพื่อแสดง/ซ่อน element ngFor : ใช้ในการวนลูป ngIf : ใส่เงื่อนไขเช็คค่า 2. Custom Directive ที่เราสามารถกำหนดเอง จะแบ่งเป็น HTML DOMS element – เราสามารถสร้าง element ใหม่ของเราขึ้นมาเองได้ เช่น <ma-directive></ma-directive> attribute เราสามารถสร้าง attribute ให้กับ element เช่น <div ma-directive=”test”></div> class name ตั้งชื่อคลาส เช่น <div class=”ma-directive: test;”></div> comment เช่น <!–directive: ma-directive test –> เราจะมาลองทำทั้งสองแบบ ก่อนอื่นสร้าง component ใหม่ชื่อ user โดยใช้คำสั่งดังภาพที่ 1 และใส่เพิ่ม tag <app-user></app-user> ในหน้า app.component.html ภาพที่ 1 สร้าง user component จากนั้นเปิดไฟล์ user.component.ts เพิ่มโค้ดดังภาพที่ 2 ซึ่งเป็นการกำหนดตัวแปรชื่อ users เก็บข้อมูลแบบ array แต่ละ user ประกอบไปด้วย name, code และ status ซึ่งเราจะนำไปวนลูปแสดงข้อมูล ภาพที่ 2 สร้าง array ของ users การใช้ Built-in Directive ในที่นี้จะยกตัวอย่าง ngFor สำหรับการวนลูป ซึ่งเราสามารถนำไปใส่ใน HTML Tag หรือ HTML Element นั้นๆได้เลยในไฟล์ user.component.html และหากต้องการใส่เงื่อนไข เราสามารถใช้ ngIf เพื่อเช็คค่าต่างๆ ดังภาพที่ 3 ภาพที่ 3 ตัวอย่างการใช้ ngFor และ ngIf จากภาพที่ 3 เราใช้ ngIf เพื่อตรวจสอบสถานะของ user โดยถ้าสถานะเป็น single จะแสดงรูปดาว และสถานะ married จะแสดงรูปหัวใจ เมื่อรันหน้าเว็บจะปรากฎหน้าจอดังภาพที่ 4 ภาพที่ 4 ผลลัพธ์ที่ได้ สำหรับตัวอย่างการทำ Custom Directive เราจะมาสร้าง highlight เมื่อเอาเมาส์ไปชี้ที่ชื่อ user โดยใช้คำสั่งดังภาพที่ 5 เพื่อสร้างDirective ชื่อ highlight ภาพที่ 5 คำสั่งสร้าง Custom Directive จากนั้นเปิดไฟล์ highlight.directive.ts ดังภาพที่ 6 ซึ่ง selector เป็นตัวบอกว่าคอมโพเน้นของเราจะมีชื่อเป็นอะไรเมื่อไปปรากฎที่ HTML Element หรือ Attribute ส่วนการเรียกใช้งานก็ให้อ้าง

Read More »

Angular : Data Binding & 2-Way Data Binding

Data Binding เป็นการติดต่อสื่อสารกันระหว่าง Business Logic หรือไฟล์ที่เป็นนามสกุล .ts กับ .html เราจะทดลองสร้างคอมโพเนนท์ใหม่ ชื่อ Calculator ดังภาพที่ 1 ภาพที่ 1 คำสั่งสร้างคอมโพเนนท์ และแก้ไขไฟล์ app.component.html ให้แสดงเฉพาะคอมโพเนนท์ calculator โดยการลบโค้ดทั้งหมดในไฟล์และใส่โค้ดดังภาพที่ 2 ภาพที่ 2 เพิ่ม Tag app-calculator ในไฟล์ calculator.component.html (ภาพที่ 3) เราจะใส่ property binding ใน HTML Tag ให้เป็นไปตามที่เราต้องการโดยการใช้เครื่องหมาย [ ] ซึ่งเราจะลองทำให้ตัวแปรกำหนดการ disabled ปุ่ม และในไฟล์ calculator.component.ts (ภาพที่ 4) เราจะกำหนดตัวแปรชื่อ isAllowed เป็น true ก็จะสามารถกดปุ่มได้ แต่หากเป็น false จะเป็นการ disable ปุ่ม ซึ่งตรงนี้เราเป็นการใช้ property binding ภาพที่3 property binding ใน HTML Tag   ภาพที่ 4 สร้างตัวแปร Binding ต่อไปเราจะสร้าง events เช่น การกดปุ่ม การคลิ๊ก เป็นต้น เราจะใช้เครื่องหมาย ( ) ในการกำหนด โดยเราจะเพิ่ม Event Binding ลงในปุ่ม CALCULATE ในไฟล์ calculator.component.html ดังภาพที่ 5 ภาพที่ 5 เพิ่ม events และสร้างตัวแปร result กับ ฟังก์ชั่น calculate() ไว้ใน calculator.component.ts ซึ่งเมื่อเรามีการกดปุ่ม แอพจะไปเรียก calculate() ขึ้นมาดังภาพที่ 6 ภาพที่ 6 เขียนฟังก์ชั่น calculate หลังจากนี้เราจะมาทำ 2-Way Binding ซึ่งก็คือการนำค่าของตัวแปรมาผูกกับค่าขอ HTML Form ต่างๆ ทำให้เมื่อแก้ไขค่าใน Form นั้นๆ แล้วค่าของตัวแปรจะเปี่ยนทันที โดยจะใช้สัญลักษณ์ [( )] ในตัวอย่างต่อไปเราจะสร้างตัวแปรสองตัวและนำค่ามาแสดง โดยสามารถเปลี่ยนค่าได้จาก Textbox เปิดไฟล์ calculator.component.html ขึ้นมารับค่า input 2 ตัว ดังภาพที่ 7 ภาพที่ 7 สร้าง input รับค่า และเปิดไฟล์ calculator.component.ts สร้างตัวแปรเก็บค่าชื่อ num1และ num2 และ addResult เก็บค่าผลบวกของทั้งสองตัวเพื่อเอามาแสดงใน result เมื่อกดปุ่ม calculate จะไปเรียกฟังก์ชั่น calculate() ดังภาพที่ 8 และเมื่อรันแอพขึ้นมาจะปรากฏหน้าจอดังภาพที่ 9 ภาพที่ 8 เขียนโค้ดบวกค่า input ทั้งสอง และแสดงผล   ภาพที่ 9 แสดงผลการรันแอพ

Read More »