บทความ

Print VFP Report with .NET application

รูปภาพ
สั่งพิมพ์รายงาน FRX บน .NET Framework การสร้างรายงานด้วยชุด Visual Studio บน .NET มักเลือกใช้ CR (Crystal Report) เป็นหลัก สำหรับ CR นี้จะมีอยู่ในชุด Professional ขึ้นไป เนื่องจากภาษาบน .NET ไม่มี VFP ดังนั้นหากต้องการอัปเกรดระบบงานที่พัฒนาด้วย VFP ไปรันบน .NET Framework ก็จำเป็นต้องเขียนโปรแกรมกันใหม่ทั้งหมด อย่างไรก็ตาม เราสามารถเรียกใช้รายงานต่าง ๆ (*.frx) ที่พัฒนาด้วย VFP จาก .NET โดยตรงก็ได้ ซึ่งวิธีการนี้ก็จะไม่ต้องเสียเวลาแปลงรายงานเป็น CR กันใหม่ทั้งหมด คนที่ใช้ฟอกส์สามารถประยุกต์ใช้สร้างรายงานบน .NET กับ Visual Studio ชุด Express ที่ไม่มี CR ก็ได้น่ะ :-) ทำไมต้อง .NET หลักการพัฒนาแอปพลิเคชันที่ไม่ต้องสนใจระบบปฎิบัติการ (OS) ไม่ต้องสนใจแพลตฟอร์ม (Platform) คอนเซ็ปท์เดียวกับ Java นั่นล่ะ ขอให้เครื่องนั้นมี .NET Framework ติดตั้งอยู่เท่านั้น สังเกตว่า Win7 แถม .NET ติดตั้งมาพร้อม ส่วนวินโดวส์อื่นก็ต้องหา .NET Framework มาติดตั้งเพิ่มเติม เพื่อให้เข้าใจง่าย ๆ ก็ให้มองว่า .NET Framework เหมือนกับ Runtime Libraries เพียงแต่มันเอาทุกอย่างมาอัดรวมไว้ทีเดียว เปรียบเสมือนก้

Data Entry Form แบบ Client/Server

รูปภาพ
หลากหลายวิธีในการสร้างฟอร์มป้อนข้อมูลแบบ Client/Server (1) วิชวลฟอกส์โปรมีเครื่องมือจัดการกับฐานข้อมูลแบบ Client/Server ให้เลือกใช้งานหลากหลายแบบ ก่อนอื่นต้องเข้าใจก่อนว่า ฐานข้อมูลของเรานั้นสนับสนุน OLEDB หรือ ODBC เพราะว่า เครื่องมือแต่ละตัวออกแบบมาให้ใช้งานไม่เหมือนกัน สรุปง่าย ๆ ดังตารางต่อไปนี้ เครื่องมือ ODBC OLEDB Native DBF ADO (ActiveX Data Object) Yes Yes No SPT (SQL Pass Thru) Yes No No Remote View Yes No Yes CA (Cursor Adapter) Yes Yes Yes จากตารางข้างต้นจะเห็นได้ว่า เราสามารถเลือกเขียนคำสั่งติดต่อกับฐานข้อมูลตามที่เราถนัดแบบไหนก็ได้ ถ้าเคยใช้พวก ADO ใน Visual Basic มาก่อน ก็สามารถเขียนคำสั่งกับออปเจ็กต์ของ ADO ในฟอกส์โปรได้เลย หากต้องการใช้คำสั่ง Native DBF ของฟอกส์โปร เช่น GO, SKIP, LOCATE, APPEND, TABLEUPDATE ฯลฯ ก็เลือกใช้ CA หรือ Remote View ตามถนัด เพราะส่วนใหญ่ฐานข้อมูลจะมี ODBC มาให้อยู่แล้ว ส่วน SPT นั้นเป็นการเขียนคำสั่ง SQL กับฐานข้อมูลผ่าน ODBC โดยตรง กล่าวคือ มักใช้กับคำสั่ง SQL ที่ไม่ได้เป็นมาตรฐานนั่นล่ะ แต่ละตัวมักไม่เหมือนกัน เช่น คำสั่ง SELECT

Subtotal at top of group report

รูปภาพ
แสดงยอดรวมในส่วนหัวของแต่ละกลุ่มในรายงาน ปกติลักษณะรายงานข้างต้น มักใช้วิธี Query หายอดรวมก่อนแล้วค่อยแสดงในรายงาน ซึ่งมีข้อดีคือ ใช้ได้กับทุกเวอร์ชัน แต่อย่างไรก็ตาม Report Writer ในวิชวลฟอกส์โปรเวอร์ชัน 9 นั้นมีลูกเล่นในการทำรายงานมากกว่าเวอร์ชันก่อน สามารถแสดงยอดรวมในรายงานดังกล่าวได้อย่างง่ายดาย โดยการสร้าง Detail Band เพิ่มขึ้นมา แล้วก็สร้าง Header/Footer ของ Detail Band หลังจากนั้นก็ใส่ยอดรวมไว้ใน Footer ของ Detail Band ลักษณะดังรูป วิธีการสร้างรายงานข้างต้นดังกล่าว สามารถทำได้ดังนี้ :- ระบุคีย์ฟิลด์เพื่อสร้างกลุ่มของข้อมูลในรายงาน เพิ่ม Detail Band 2 ดับเบิลคลิก Band แถบสีเทาที่ Detail 1 ระบุ Target คือ Alias() และคลิกเลือก Associated header and footer bands ดับเบิลคลิก Band แถบสีเทาที่ Detail 2 ระบุเพียง Target คือ Alias() จะเห็น band ต่างๆในรายงาน มีลักษณะดังรูป สร้างฟิลด์ข้อมูลต่างๆของกลุ่มใส่ไว้ใน Detail Footer 1 สร้างฟิลด์ข้อมูลรายการต่างๆใส่ไว้ใน Detail 2 ดับเบิลคลิกฟิลด์ที่ต้องการสรุปยอดรวม ตัวอย่าง order_amt (สีแดง) ใน Detail Foote

หลายหลายวิธีแสดงข้อมูลด้วย Grid

รูปภาพ
หลักการนำข้อมูลจากฐานข้อมูลต่างๆแสดงในกริด (Grid) โดยทั่วไปคือ เลือกช่วงข้อมูลจากฐานข้อมูลด้วยคำสั่ง SELECT SQL เก็บไว้ในเคอร์เซอร์ (Cursor) ชั่วคราวก่อน หลังจากนั้นก็นำเคอร์เซอร์ดังกล่าวไปใส่ในกริด โดยระบุชื่อเคอร์เซอร์ดังกล่าวใน RecordSource Property ของกริดเท่านั้นเอง แต่เนื่องจากวิชวลฟอกซ์โปรมีความสามารถในการติดต่อกับฐานข้อมูลได้หลากหลาย ดังนั้นหลายท่านจึงมักสับสนว่า ควรใช้งานเมื่อไร อย่างไร สรุปให้ง่ายๆก็คือ ให้ท่านเลือกใช้ตามความชอบและความถนัดของท่าน ตัวอย่าง แสดงรายชื่อพนักงานจากฐานข้อมูลตัวอย่าง Tastrade ใน Grid 1 Native ใช้กับไฟล์ฐานข้อมูลของฟอกส์โปรโดยตรง ให้ดูประโยคคำสั่ง SELECT... INTO CURSOR cPath = HOME(2) + "Tastrade\Data\tastrade.dbc" OPEN DATABASE (cPath) SELECT * FROM employee INTO CURSOR c_data THISFORM.Grid1.RecordSource = "c_data" 2 SQL-Passthru (SPT ผ่าน ODBC) ใช้กับฐานข้อมูลอะไรก็ได้ผ่าน ODBC ให้ดูประโยคคำสั่ง =SQLEXEC( "SELECT....", "Cursor" ) ประโยคการเชื่อมต่อกับฐานข้อมูลต่างๆ * DSN cStrConn

วิธีตรวจและซ่อมแซมไฟล์ Foxpro ด้วย CM Table Repair

รูปภาพ
ตัวอย่างในบทความนี้เเลือกใช้ CM Table Repair เวอร์ชัน 2009a ดาวน์โหลดได้ที่ cmstory.com โปรดอ่าน : ก่อนทำทุกครั้งต้องสำรอง (Backup) ไฟล์ข้อมูลของเราก่อนทุกครั้ง !!! รัน VFP (ถ้าต้องการติดตั้ง VFP ไว้บน USB Disk ดูวิธีทำ Portable VFP ใน Tips ) เปิดหน้าต่าง Command Windows (Ctrl+F2) รันคำสั่ง DO ? เลือกไฟล์ cmRepair.app ถ้าหากมุมบนซ้ายไม่ใช่โฟลเดอร์ที่เก็บไฟล์ข้อมูลของเราให้คลิกปุ่ม Select Folder ตัวอย่าง D:\Test\Data คลิกที่ปุ่ม Check Folder เลือก Normal Mode ให้สังเกตว่า ถ้าทุกอย่างปกติต้องมี x เฉพาะแถวแรก (Checked) เท่านั้น ถ้าพบว่ามี x ในคอลัมภ์ 2 แสดงว่า ไฟล์นั้นเสีย (Corrupted) ให้คลิกปุ่ม Check Folder เลือก Auto-repair mode เพื่อลองซ่อมไฟล์ทั้งหมดในโฟลเดอร์แบบอัตโนมัติก่อน คลิกที่ปุ่ม Check Folder เลือก Normal Mode อีกครั้ง หากยังพบ x (Corrupted) ตรงชื่อไฟล์ไหนอีกก็ให้คลิกปุ่ม Select Table เลือกไฟล์นั้นมาซ่อมทีละไฟล์ โดยคลิกปุ่ม Change เพื่อให้ตัวเลขทางขวา (Reported) เท่ากับทางซ้าย (Change to) ::: Good Luck :::

ใส่ Comment หลายบรรทัด

VFP ไม่มีคอมเมนต์หลายบรรทัดหรือ /* */ อย่างเช่นภาษาตระกูลซี อย่างไรก็ตาม เราสามารถใช้เทคนิค Preprocessor Directive มาแทนได้ สมมติว่า ต้องการใส่คอมเมนต์ชุดคำสั่งทั้งหมด เช่น * lcSqlcmd = "SELECT * FROM t_stmas ORDER BY 1" * rs = SQLEXEC(cn, lcSqlcmd, "stmas") * IF rs>0 * SELECT stmas * BROWSE * ENDIF แทนที่จะต้องเสียเวลาใส่ * ทีละบรรทัดข้างต้นก็ให้ใส่ #IF ... #ENDIF คร่อมไว้ทำนองเดียวกับ /* */ ของ C #IF .F. lcSqlcmd = "SELECT * FROM t_stmas ORDER BY 1" rs = SQLEXEC(cn, lcSqlcmd, "stmas") IF rs>0 SELECT stmas BROWSE ENDIF #ENDIF พูดเป็นนัยว่า แทนที่จะสั่งให้บรรทัดนั้นเป็นคอมเมนต์ ก็สั่งไปเลยว่า ไม่ต้องคอมไพล์ชุดคำสั่งข้างต้นนั่นล่ะ ลองนำเทคนิคนี้ไปประยุกต์ใช้กับภาษาอื่น ๆ ที่ใส่คอมเมนต์ได้ทีละบรรทัดได้น่ะ :-)

คำสั่ง Transaction ใน Visual Foxpro

Transaction มักนำมาใช้กับการอัปเดทข้อมูลหลายตารางพร้อมกัน ประโยชน์ก็คือ หากมีความผิดพลาดในระหว่างการอัปเดทตารางใดตารางหนึ่ง ก็สามารถยกเลิกการอัปเดทตารางทั้งหมดได้ ส่วนมากก็มักใช้กับการประมวลผลของเอกสารประเภท Parent-Child พูดเป็นนัยว่า ตารางข้อมูลมีความสัมพันธ์เชื่อมโยงเกี่ยวข้องกัน อย่างเช่น ใบรับของ ใบสั่งซื้อ ใบกำกับสินค้า เป็นต้น ตัวอย่าง เพิ่มข้อมูลใน 2 ตาราง (ถ้าหากมีข้อผิดพลาดในระหว่างการอัปเดทก็ให้ยกเลิกการอัปเดททั้งหมด) Native-SQL LOCAL ex AS Exception BEGIN TRANSACTION TRY INSERT INTO Table1 ( . . .) VALUES ( . . .) INSERT INTO Table2 ( . . .) VALUES ( . . .) END TRANSACTION MESSAGEBOX("Updated completed.") CATCH TO ex ROLLBACK MESSAGEBOX(STR(ex.ErrorNo)+" "+ex.Message) ENDTRY Native-DBF (Unbuffer) LOCAL ex AS Exception BEGIN TRANSACTION TRY APPEND BLANK IN Table1 REPLACE . . . WITH . . . IN Table1 APPEND BLANK IN Table2 REPLACE . . . WITH . . . IN Table2 END TRANSACTION MESSAGEBOX("Updated com