รายงาน (Report)

รายงานถือเป็นส่วนที่สำคัญที่สุดอีกส่วนหนึ่งของระบบงาน การสร้างโปรแกรมสำหรับพิมพ์รายงานโดยหลักทั่วๆไปแล้วจะประกอบไปด้วยส่วนประกอบ 3 ส่วนคือ

                1. ส่วนของการรับข้อมูล ส่วนนี้ส่วนใหญ่จะเป็นฟอร์มที่จะรอรับข้อมูลที่ผู้ใช้งานป้อนเข้าไปตามเงื่อนไขที่กำหนด เพื่อที่จะนำข้อมูลที่ป้อนไปประมวลผลในการออกรายงาน
                2. ส่วนของการประมวลผลข้อมูล ในส่วนนี้จะเป็นการนำข้อมูลที่ผู้ใช้ป้อนข้อมูลจากฟอร์ม มาประมวลผลเพื่อให้ได้ข้อมูลตามต้องการ
                3. ส่วนของรายงาน เป็นการนำข้อมูลที่ได้จากการประมวลผลแล้วแสดงออกมาในรูปแบบต่างๆตามที่ต้องการ เช่นแสดงที่จอภาพ ,เครื่องพิมพ์ หรือ เก็บเป็นแฟ้มข้อมูล

จากที่กล่าวมาข้างต้นรายงานบางแบบอาจมีวิธีการนอกเหนือจากนี้ก็ได้

เริ่มต้นสร้างรายงาน
ตัวอย่างรายงานต่อไปนี้จะเป็นรายงานแสดงสรุปยอดการสั่งซื้อของลูกค้าโดยให้ทำการเรียงลำดับตามยอดการสั่งซื้อจากมากไปหาน้อย(Ranking) มีวิธีการดังนี้
c9501.gif (4730 bytes)
ทำการสร้างฟอร์มตามตัวอย่าง
    1. ที่ command windows ป้อนคำสั่ง
        SET DEFA TO C:\MYAPP
        MODIFY COMMAND MYPROJECT
        (โปรเจ็ก myproject คุณสามารถ download โปรแกรมตัวอย่างได้ที่ เริ่มสร้างระบบงาน)
    2. คลิ๊กที่แท็ป Docs คลิ๊กที่ Forms แล้วเลือก New จากนั้นให้ทำการคลิ๊กที่ New Form
    3. กำหนด form properites โดยคลิ๊กเมาส์ปุ่มขวา แล้วเลือก properties กำหนดคุณสมบัติของฟอร์ม ดังนี้
                 Autocenter = .T.
                 Caption = รายงานสรุปยอดการซื้อสินค้า
                 Controlbox = .F.

    4.  ทำการสร้าง Text Box ตัวแรก แล้วกำหนด property ดังนี้
               Name = cFromCust_ID
               Inputmark = XXXXX
    5. สร้าง  Text Box ตัวที่สอง แล้วกำหนด Property ดังนี้
               Name = cToCust_ID
               Inputmark = XXXXX
    6. สร้าง  Option Group แล้วกำหนด Property ดังนี้
               ที่ Optiongroup1
                Name = optSelect
        ทำการป้อนคำสั่งในแท๊ป Method ใน Click Event ดังนี้
                IF This.Value = 1
                    Thisform.cFileName.Enabled =.T.
                ELSE
                    Thisform.cFileName.Enabled =.F.
                ENDIF

               ที่ Optiongroup1 -> Option1
                Name = optPreview
               ที่ Optiongroup1 -> Option2
                Name = optPrint
               ที่ Optiongroup1 -> Option3
                Name = optFile
    7.  สร้าง  Text Box ตัวที่สาม แล้วกำหนด Property ดังนี้
               Name = txtFileName
               Inputmark = XXXXXXXX
               Enabled = .F.
    8.  สร้าง  Command Button ตัวแรก แล้วกำหนด Property ดังนี้
               Name = cmdPrint
   Caption = พิมพ์
   FontName = MS Sans Serif
        ทำการป้อนคำสั่งในแท๊ป Method ใน Click Event ดังนี้

* Check Error Entry
IF Thisform.cFromCust_ID.Value < Thisform.cToCust_ID.Value
    =MESSAGEBOX("จากรหัสลูกค้าต้องน้อยกว่าถึงรหัสลูกค้า","ผิดพลาด")
    Thisform.cFromCust_ID.Setfocus
    RETURN
ENDIF

IF Thisform.optSelect.Value = 3 AND EMPTY(Thisform.cFileName.Value)
    =MESSAGEBOX("กรุณาป้อนชื่อแฟ้ม","ผิดพลาด")
    Thisform.cFileName.Setfocus
    RETURN
ENDIF

* Select Data
cFrom = ALLTRIM(Thisform.cFromCust_ID.Value)
cTo = ALLTRIM(Thisform.cToCust_ID.Value)

SELECT C.cust_id, C.name, C.creditlmt,;
C.sales_id, sum( D.quantity* D.unitprice) as Total ;
FROM mydatabase!customer C ;
LEFT OUTER JOIN mydatabase!inv_head H;
INNER JOIN mydatabase!inv_dtl D ;
ON H.inv_no = D.inv_no ;
ON C.cust_id = H.cust_id;
WHERE (C.cust_id BETWEEN (cFrom) AND (cTo)) OR ;
        (EMPTY(cFrom) AND EMPTY(cTo)) ;
GROUP BY C.cust_id ;
ORDER BY Total DESC ;
INTO CURSOR MYCURSOR

IF _TALLY=0
    =MESSAGEBOX("ไม่มีข้อมูล","ผิดพลาด")
    Thisform.cmdCancel.Click
ELSE   
    * Print Report
    DO CASE
        CASE Thisform.optSelect.Value = 1
            REPORT FORM CUSTRPT.FRX PREVIEW NOCONSOLE
        CASE Thisform.optSelect.Value = 2
            REPORT FORM CUSTRPT.FRX TO PRINTER PROMPT NOCONSOLE
        CASE Thisform.optSelect.Value = 3
            REPORT FORM CUSTRPT.FRX TO ;
                FILE (Thisform.cFileName.Value) ASCII NOCONSOLE
    ENDCASE   
    Thisform.cmdCancel.Click
ENDIF

    9.  สร้าง  Command Button ตัวแรก แล้วกำหนด Property ดังนี้
               Name = cmdCancel
   Caption = ยกเลิก
   FontName = MS Sans Serif
        ทำการป้อนคำสั่งในแท๊ป Method ใน Click Event ดังนี้
           Thisform.Release
    10. เสร็จแล้วทำการบันทึกฟอร์ม โดยคลิ๊กที่เมนู Form แล้วเลือก Save ใส่ชื่อแฟ้มว่า CUSTRPT

ทำความรู้จักกับ Report Designer
การสร้างรายงานนั้น Visual FoxPro ได้เตรียมเครื่องมือที่ช่วยในการสร้างรายงานไว้ให้แล้ว ซึ่งก็คือ Report Designer เราสามารถเข้าไปสร้างรายงานได้โดยใช้คำสั่ง
            CREATE REPORT ชื่อไฟล์
หรือ คลิ๊กที่เมนู File เลือก New แล้วคลิ๊กที่ Report จากนั้นก็คลิ๊กที่ปุ่ม New File

ก่อนอื่นเรามาทำความรู้จักกับ ลักษณะของรายงานประเภทต่างๆที่ Visual FoxPro ได้เตรียมไว้ ซึ่งมีดังนี้

c9503.gif (3711 bytes)

    Column report        เป็นรายงานที่แสดง 1 เรคคอร์ดต่อ 1 บรรทัด เช่น รายงานรายชื่อลูกค้า รายงานสรุปยอดการซื้อสินค้า
    Row report            เป็นรายงานที่ในหนึ่งหน้าจะมีเพียง คอลัมน์เดียว โดยที่ฟิลด์แต่ละฟิลด์จะเรียงลงมา
    One-to-meny report เป็นรายงานที่ 1 เรคคอร์ดจะประกอบด้วยตารางหลายตารางมาเชื่อมความสัมพันธ์กัน เช่น ใบส่งสินค้า
    Multi-column          เป็นรายงานที่ใน 1 หน้าจะมีหลายๆ คอลัมน์ และฟิลด์แต่ละฟิลด์จะเรียงลงมา
    Label                     เป็นรายงานที่ใช้พิมพ์ป้ายฉลาก

สำรวจ Report Designer
เมื่อทำการสร้างรายงานโดยใช้คำสั่ง CREATE REPORT แล้วเราก็จะได้พบกับ  Report Designer ซึ่งเป็นเครื่องมือที่ช่วยในการสร้างรายงานของ Visual FoxPro เรามาทำการสำรวจดูก่อนว่าใน report designer ประกอบไปด้วยส่วนต่างๆอะไรบ้าง

c9504.gif (6160 bytes)

แถบ ลักษณะการพิมพ์พิมพ์ คำสั่ง
Title พิมพ์ครั้งเดียวในรายงาน เมื่อเริ่มต้นรายงาน คลิ๊กที่เมนู Report เลือก Title/Summary คลิ๊กที่ Title band
Page Header พิมพ์เมื่อขึ้นหน้าใหม่ ปรากฎตอนสร้าง Report
Column Header พิมพ์เมื่อขึ้นหน้าใหม่ ตามคอลัมน์ คลิ๊กที่เมนู File เลือก Page Setup ในช่องของ Columns ให้กำหนด Number มากกว่า 1 (จำนวนของคอลัมน์ที่ให้แสดงในรายงาน)
Group Header พิมพ์เมื่อเปลี่ยนกลุ่มข้อมูล คลิ๊กที่เมนู Report เลือก Data Grouping... แล้วกำหนดฟิลด์ที่ต้องการให้แบ่งกลุ่ม
Detail พิมพ์ตามเรคคอร์ด ปรากฎตอนสร้าง Report
Group Footer พิมพ์เมื่อเปลี่ยนกลุ่มข้อมูล คลิ๊กที่เมนู Report เลือก Data Grouping... แล้วกำหนดฟิลด์ที่ต้องการให้แบ่งกลุ่ม
Column Footer พิมพ์ตอนสิ้นสุดหน้า ตามคอลัมน์ คลิ๊กที่เมนู File เลือก Page Setup ในช่องของ Columns ให้กำหนด Number มากกว่า 1 (จำนวนของคอลัมน์ที่ให้แสดงในรายงาน)
Page Footer พิมพ์เมื่อเปลี่ยนกลุ่มข้อมูล ปรากฎตอนสร้าง Report
Summary พิมพ์ครั้งเดียวในรายงาน ตอนสิ้นสุดของรายงาน คลิ๊กที่เมนู Report เลือก Title/Summary คลิ๊กที่ Summary band

 

แนะนำ ในรายงานถ้าต้องการกำหนดฟอนต์(font) ทั้งรายงาน หลังจากที่เข้าสู่ Report Designer ให้คลิ๊กที่ เมนู Report เลือก Default Font... แล้วทำการกำหนดฟอนต์ตามต้องการ

ทำการสร้างรายงานสรุปยอดการซื้อสินค้า
c9505.gif (6564 bytes)

    1. คลิ๊กที่แท็ป Docs คลิ๊กที่ Reports แล้วเลือก New จากนั้นให้ทำการคลิ๊กที่ New Report
    2. กำหนด Defalut Font โดยคลิ๊กที่เมนู Report เลือก Defalut Font... กำหนดฟอนต์เป็น  CordiaUPC ขนาด 14
    3. ทำการกำหนดข้อความในส่วนของ Page Header โดยการคลิ๊กที่  c9506.gif (908 bytes)ใน Report controls แล้วทำการคลิ๊กในตำแหน่งที่ต้องการแล้วป้อนข้อความตามต้องการ
ในกรณีที่ต้องการแก้ไขข้อความที่ป้อนผิด ให้คลิ๊กที่ c9506.gif (908 bytes) จะเป็นรูปบุ๋มลงไปแล้วก็ไปคลิ๊กที่ข้อความที่ต้องการแก้ไข แล้วทำการแก้ไขข้อความตามต้องการ
การสร้างเลขลำดับที่
    4. ลำดับที่ของรายงานเราอาจจะใช้ ฟังก์ชัน RECNNO() แต่บางกรณีก็ไม่สามารถใช้งานได้ ให้คุณทำการสร้างตามดังนี้
                ให้ทำการคลิ๊กที่เมนู Report แล้วเลือก Variables...
            ที่ช่อง Variables กำหนดตัวแปร ให้ชื่อว่า NO
            ที่ช่อง Caculates กำหนดเป็น Count  แล้วคลิ๊กปุ่ม OK
    5. ทำการกำหนดฟิลด์หรือตัวแปรที่ต้องการพิมพ์ออกในรายงานในส่วนของ Detail โดยการคลิ๊กที่ c9507.gif (920 bytes) แล้วไปคลิ๊กในตำแหน่งที่ต้องการ แล้วป้อนชื่อตัวแปรหรือฟิลด์ในช่อง Expression แล้วกำหนดรูปแบบการพิมพ์ที่ช่อง Format แล้วคลิ๊กปุ่ม OK
            ที่ช่อง Expression กำหนดตัวแปรชื่อ no ที่ช่อง Format   กำหนดรูปแบบการพิมพ์เป็น 9999
            ที่ช่อง Expression กำหนดฟิลด์ชื่อ cust_id
            ที่ช่อง Expression กำหนดฟิลด์ชื่อ name
            ที่ช่อง Expression กำหนดฟิลด์ชื่อ creditlmt   ที่ช่อง Format กำหนดรูปแบบการพิมพ์เป็น @Z 999,999,999.99
            ที่ช่อง Expression กำหนดฟิลด์ชื่อ total  ที่ช่อง Format กำหนดรูปแบบการพิมพ์เป็น @Z 999,999,999.99
            ที่ช่อง Expression กำหนดฟิลด์ชื่อ์ sales_id
                ในรายงานที่เราทำการสร้างขึ้นนี้จะไม่มีการอ้างถึงตารางของมูลดังนั้นฟิลด์ที่ใช้งานเราจะอ้างมาจาก ตารางชั่วคราวของคำสั่ง SELECT-SQL ที่ได้สร้างไว้ใน ฟอร์มก่อนหน้า ดังนั้นชื่อฟิลด์ต่างๆก็ให้ตั้งชื่อตามชื่อฟิลด์ใน SELECT-SQL
    6. สร้างยอดรวมของรายงานโดยทำการคลิ๊กที่เมนู Report เลือก Title/Summary แล้วคลิ๊กที่ช่อง Summary band คลิ๊กปุ่ม OK เราก็จะได้แถบ Summary ขึ้นมาในส่วนของ Report Designer
            ทำการคลิ๊กที่ c9507.gif (920 bytes) ที่ช่อง Expression กำหนดชื่อฟิลด์ที่พิมพ์ชื่อ total ที่ช่อง Format กำหนดรูปแบบการพิมพ์เป็น @Z 999,999,999.99 แล้วทำการคลิ๊กที่ ปุ่ม Calculations... ที่ช่อง Calculate ให้คลิ๊กที่ Sum

หลังจากที่คุณได้ทำการตกแต่งรายงานเป็นที่พอใจแล้วทำการ save รายงานโดยคลิ๊กที่เมนู File แล้วเลือก Save ตั้งชื่อว่า CUSTRPT หลังจากนั้นให้คุณเรียกฟอร์มขึ้นมาใช้งานแล้วพิมพ์รายงานดู....

แนะนำ รายงานพิมพ์เป็นแฟ้มเก็บไว้ สามารถที่จะพิมพ์ออกทางเครื่องพิมพ์ได้โดยใช้คำสั่ง RUN COPY /b ชื่อไฟล์ LPT1:

การพิมพ์รายงานใน Visual FoxPro เราสามารถกำหนดให้มีการพิมพ์หรือไม่พิมพ์ฟิลด์บางฟิลด์ หรือกำหนดไม่ให้มีการพิมพ์บรรทัดที่เป็นช่องว่าง ได้โดยการเข้าไปกำหนดที่ฟิลด์นั้นๆ เช่น ที่ฟิลด์ Total เราจะไม่ให้มีการพิมพ์ข้อมูลถ้าข้อมูลนั้นมีค่าเป็น .NULL. (ค่า null จะเกิดขึ้นตอนที่เราสร้างความสัมพันธ์ระหว่างตาราง ซึ่งตารางที่นำมาสร้างความสัมพันธ์กันนั้นอาจจะไม่มีข้อมูลที่มีความสัมพันธ์ซึ่งกันและกันจึงเกิดค่า null ขึ้นมา)
        1. ให้ทำการเรียกรายงาน CUSRPT มาทำการแก้ไขโดยพิมพ์คำสั่งที่ Command Window ดังนี้
                    MODIFY REPORT CUSRPT
        2. ที่ Report Designer ให้ทำการคลิ๊กเมาส์ปุ่มขวาที่ฟิลด์ Total แล้วเลือก Properites...
        3. ที่ Report Expression ให้ทำการคลิ๊กที่ปุ่ม Print When...
        4. ในช่อง Print only when expression is true: ให้ป้อนเงื่อนไขว่า
                    .NOT.ISNULL(TOTAL)
            เป็นการสั่งให้โปรแกรมไม่ทำการพิมพ์ข้อมูลของฟิลด์ TOTAL ถ้าฟิลด์มีค่าเป็น .NULL.
        5. ในส่วนนี้คุณสามารถที่จะกำหนดว่าถ้าเรคคอร์ดใดที่ว่างเปล่าไม่ให้มีการพิมพ์ออกมาโดยทำการคลิ๊กที่   Remove line if blank
            จากนั้นให้คลิ๊ก OK ต่อมาที่ Report Expression. ให้ทำการคลิ๊กปุ่ม OK

เลือกข้อมูลแล้วนำมาพิมพ์
ในบางครั้งการพิมพ์รายงานอาจไม่จำเป็นที่จะต้องพิมพ์ตามกฏเกณท์ก็ได้ เช่นต้องการพิมพ์รายการที่ 1 และรายการที่ 8 ถึง 10 เป็นต้น ดังนั้นเราก็ต้องมีการสร้างฟอร์มเพื่อรอรับข้อมูลที่ได้ทำการเลือกแล้วนำมาพิมพ์ ออกในรายงาน ตัวอย่างที่จะกล่าวต่อไปนี้เป็นเพียงแนวทางที่จะให้ท่านสามารถนำไปประยุกต์ใชงานในด้านอื่นๆ ไม่เพียงแต่รายงานอย่างเดียว

การทำงาน จะแสดงรายการทั้งหมดที่ฟอร์มแล้วให้ทำการ เลือกรายการโดยกดปุ่ม Shift หรือปุ่ม Ctrl ค้างไว้แล้วลากแถมแสงคลุมรายการที่ต้องการ จากนั้นก็สั่งให้โปรแกรมพิมพ์รายงานออกมาตามข้อมูลที่ได้เลือกเอาไว้ ซึ่งการเลือกข้อมูลต่างๆเก็บไว้เราจะอาศัยตัวแปรอะเรย์เป็นตัวช่วยในการเก็บข้อมูล แล้วนำข้อมูลนั้นมาเป็นเงื่อนไขในการออกรายงาน

        1. ให้ทำการสร้างรายงานก่อนโดยพิมพ์คำสั่งที่ command window ดังนี้
                    CREATE REPORT CUSTRPT2
        2. คลิ๊กเมาส์ปุ่มขวาที่ report designer แล้วเลือก Data Environment
        3. คลิ๊กเมาส์ปุ่มขวาที่ Data Environment แล้วเลือกตาราง Customer จากนั้นก็คลิ๊กที่ปุ่ม Close
        4. คลิ๊กที่ report designer จากนั้นคลิ๊กที่เมนู Report แล้วเลือกรายการ Quick Report เมื่อสร้างรายงานเสร็จก็ทำการ save รายงาน
        5. ให้สร้างฟอร์มโดยพิมพ์คำสั่งท   command window ดังนี้
                    CREATE FORM CUSTRPT2
        6. ที่ Form  Designer ให้คลิ๊กที่เมนู Form เลือก New Property พิมพ์ที่ช่อง Name ว่า AChosen[1] จากนั้นก็คลิ๊กปุ่ม Close
        7. ให้นำ List Box จาก Form Control มาใส่ไว้ใน Form แล้วกำหนด properties ดังนี้
                    RowSourceType = 2
                    RowSource = Customer
                    ColumnCount = 2
                    ColumnWidths = 50,250
                    MultiSelects = .T.
                    Name = LStcust_id
        8. สร้าง Command Button แล้วกำหนด properties ดังนี้
                    Caption = Run Report
               Click Event ป้อนคำสั่งดังนี้

lnCounter = 0
DIMENSION ThisForm.achosen[ThisForm.lstCust_id.ListCount]
WITH ThisForm
FOR i = 1 TO .lstCust_id.ListCount
IF .lstCust_id.Selected(i)
lnCounter = lnCounter + 1
.achosen[lnCounter] = .lstCust_id.List[i]
ENDIF
ENDFOR
ENDWITH
IF lnCounter = 0
WAIT WINDOW "No Records Chosen !"
ELSE
DIMENSION ThisForm.achosen[lnCounter]
REPORT FORM CustRpt2 FOR ASCAN(ThisForm.achosen,cust_id) > 0 PREVIEW
ENDIF

จากนั้นก็ทำการ Save แล้วลองเรียกขึ้นมาใช้งานดู...จะสังเกตได้ว่าการเลือกรายการมาพิมพ์นั้นเราใช้ตัวแปรอะเรย์มาเป็นเงื่อนไขในการเลื่อกข้อมูล เมื่อคุณเข้าใจการใช้งานตัวแปรอะเรย์นี้แล้วก็นำไปไช้งานอย่างอื่นได้อีกนะจะบอกให้

รายงาน กับ การพิมพ์
ในอดีตกาลที่ผ่านมา ถ้าท่านผู้อ่านได้เคยสัมผัสกับ FoxPro for DOS มาก่อนการกำหนดลักษณะการพิมพ์ให้กับรายงานนั้นจะไม่ยุ่งยากเหมือนกับ Visual FoxPro เช่นถ้าเราจะกำหนดขนาดของหน้ากระดาษ กำหนดจำนวนบรรทัดต่อหน้าที่จะพิมพ์ เราก็สามารถที่จะกำหนดได้ใน report designer นั้นได้เลย หรือจะกำหนดระยะหางระหว่างบรรทัดเราก็ใช้คำสั่ง Escape Code ของเครื่องพิมพ์ก็ได้อีก หรือถ้าจะทำรายงานแบบพิศดาลก็เขียนโปรแกรม   .PRG ขึ้นมาเองเลย แต่พอมายุค Windows วิธีการดังกล่าวท่านจงลืมไปได้เลย นำมาใช้ บ่ ได้ ทีนี้เราก็มาเข้าเรื่องของ Visual FoxPro ที่ละเรื่อง แล้วค่อยรวมเล่มอีกที...

    ใน Visual FoxPro การจะกำหนดค่าของเครื่องพิมพ์นั้นมันจะไปอิง อะชิตะกับ Printers ที่กำหนดไว้ใน windows เสมอ เช่นถ้าเราต้องการเปลี่ยนแปลงขนาดของกระดาษก็ต้องไปแก้ไขใน หน้า properties ของเครื่องพิมพ์ หรือถ้ามีกระดาษที่มีขนาดไม่เหมือนกับที่ Windows กำหนดมาให้ ถ้าเราจะกำหนดขนาดของหน้ากระดาษก็ต้องไปกำหนดที่ เมนูใน Windows ที่ Start -> Setting -> Printer แล้วคลิ๊กขวาเลือก Properties เพื่อเข้าไปทำการแก้ไขขนาดของกระดาษ ในส่วนของแท๊ป Paper แล้วเลือกขนาดเป็น Customs ดังภาพ

c9508.gif (9345 bytes)

จะเห็นได้ว่ากว่าจะทำได้นั้นมันยุ่งยากขนาดไหน หรือถ้าจะให้ผู้ใช้กำหนดเองตอนจะพิมพ์รายงานแล้วสั่งให้โปรแกรมแสดงหน้าจอ printer setup ขี้นมาให้กำหนดก็สามารถทำได้ (ยกเว้นการกำหนดขนาดแบบ custom) ถ้าเป็นไปได้ผมก็อยากให้ผู้ใช้ออกรายงานโดยที่ไม่ต้องมายุ่งกับ printer setup เลยจะดีกว่า ถ้าอยากรู้ว่าจะทำอย่างไรตามมาเลยครับ

สำรวจรายงานกันก่อน

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

ให้ทำการเปิดไฟล์รายงานขึ้นมาโดยทำดังนี้

           USE ชื่อรายงาน.FRX


เช่น     USE CUSTRPT2.FRX
           LOCATE FOR OBJTYPE = 1 AND OBJCODE = 53
           BROWSE

เมื่อคุณทำการ browse ดูคุณก็จะเห็นเรคคอร์ดที่ทำการเก็บสถานะต่างๆของรายงาน ซึ่งก็ดูไม่รู้เรื่อง   ให้คุณทำการ คลิ๊กเมาส์ 2 ครั้งที่ ฟิลด์ Expr คุณก็จะพบกับค่าที่ไว้สำหรับเซ็ตค่าของเครื่องพิมพ์ของรายงาน

 c9509.gif (9257 bytes)

จากภาพเป็นสถานะของเครื่องพิมพ์ Epson LQ-1050 ซึ่งในรายงานของคุณอาจได้ค่าที่แตกต่างจากนี้ขึ้นอยู่กับชนิดของเครื่องพิมพ์ที่ใช้อยู่

สิ่งที่เราจะต้องแก้ไข เราต้องแก้ไขที่ฟิลด์ memo ของ Expr ที่มีเงื่อนไขเป็น Objtype = 1 และObjcode = 53 โดยการเปลี่ยนแปลงค่าไปเป็นค่าที่เราต้องการ แล้วจะทำอย่างไรหรือครับ? ผมคงไม่ให้คุณเข้ามาแก้ตรงนี้หรอกครับเดี๋ยวมันก็เปลี่ยอีกถ้ามีใครไปแก้รายงานแล้ว save รายงานนั้นค่าของเครื่องพิมพ์ที่ไม่พึงประสงค์จะกลับมาเยือนอีก

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

คำสั่ง GETPRINTER() เป็นคำสั่งที่ใช้แสดงรายชื่อของเครื่องพิมพ์ แล้วให้เราทำการเลือกเครื่องพิมพ์ที่ต้องการและจะทำการส่งค่าที่เป็นชื่อของเครื่องพิมพ์ที่ได้เลือกไว้ เช่น

cPrinterName = GETPRINTER()

คำสั่ง APRINTER() เป็นคำสั่งที่ใช้สร้างตัวแปรอะเรย์แล้วจะทำการเก็บชื่อของเครื่องพิมพ์ไว้ในตัวแปรอะเรย์ที่สร้างขึ้น เช่น

APRINTER(cPrinter)

คำสั่ง PRTINFO() เป็นคำสั่งที่ใช้บอกถึงค่าของเครื่องพิมพ์ที่ใช้อยู่ ซึ่งค่าที่ได้มานี้เราจะสามารถนำมากำหนดหรือเปลี่ยนแปลงค่าในฟิลด์ Expr ของไฟล์รายงานที่เราจะทำการแก้ไข โดยที่ค่าที่มีอยู่จะมีทั้งสิ้น 13 ชนิดคือ (ดูรายละเอียดของค่าที่ส่งกลับมาใน help)

        PRTINFO(1)     จะแสดงค่าของ      ORIENTATION
        PRTINFO(2)     จะแสดงค่าของ     PAPERSIZE         ถ้าค่าเป็น 256 ขนาดของกระดาษเป็นแบบ custom
        PRTINFO(3)     จะแสดงค่าของ      PAPERLENGTH เป็นขนาดความยาวของกระดาษที่กำหนดเป็นแบบ custom
        PRTINFO(4)     จะแสดงค่าของ     PAPERWIDTH     เป็นขนาดความกว้างของกระดาษที่กำหนดเป็นแบบ custom
        PRTINFO(5)     จะแสดงค่าของ     SCALE
        PRTINFO(6)     จะแสดงค่าของ     COPIES
        PRTINFO(7)     จะแสดงค่าของ      DEFAULTSOURCE
        PRTINFO(8)     จะแสดงค่าของ      PRINTQUANTITY
        PRTINFO(9)     จะแสดงค่าของ     COLOR
        PRTINFO(10)     จะแสดงค่าของ     DUPLEX
        PRTINFO(11)     จะแสดงค่าของ      YRESOLUTION
        PRTINFO(12)     จะแสดงค่าของ     TTOPTION
        PRTINFO(13)     จะแสดงค่าของ     COLLATE

คำสั่ง SET PRINTER TO เป็นคำสั่งที่ใช้กำหนดเครื่องพิมพ์เพื่อใช้ออกรายงาน เช่น

        SET PRINTER TO NAME (cPrinterName)

หลังจากที่คุณได้ทำความเข้าใจเกี่ยวกับคำสั่งข้างต้น (แบบงงงง) แล้วผมจะขอยกตัวอย่างเพื่อให้ลองศึกษาแล้วนำไปประยุกต์ใช้เองดู อาจจะสร้างไฟล์ .DBF เก็บค่าต่างๆไว้ หรือใช้ text file เก็บค่าไว้ก็ได้ แล้วสร้างฟังก์ชันขึ้นมาจัดการอีกก็ได้ ...อันนี้ก็ขึ้นอยู่กันท่านทั้งหลายแล้วละครับ

    1. ให้คุณทำการสร้างรายงานขึ้นมาดังนี้

            CREATE REPORT MYREPORT1

    2. คลิ๊กเมาส์ปุ่มขวาที่ตัวรายงานแล้วเลื่อก Data Environment... ที่หน้าต่างของ Data Enviroment ให้คลิ๊กเมาส์ปุ่มขวาเลือกรายการ Add.. เลือกไฟล์ customer.dbf จากนั้นก็คลิ๊กที่ปุ่ม Close

    3. คลิ๊กเมาส์ที่รายงาน แล้วเลือกเมนู Report เลือก Quick Report... จากนั้นคลิ๊กปุ่ม OK

    4. ทำการ save รายงานโดยกดปุ่ม Ctrl-W

    5. ทำการสร้างไฟล์เพื่อเก็บสถานะของการพิมพ์ คุณอาจจะสร้างไฟล์เป็น .DBF หรือ text file ก็ได้ ในตัวอย่างนี้จะของให้คุณทำการสร้างโดยใช้ text file โดยทำการพิมพ์คำสั่งที่ command window ดังนี้

            MODIFY FILE MYPRINT

        จากนั้นทำการพิมพ์ค่าต่างๆดังนี้

        DEVICE=Epson LQ-1050     
        OUTPUT=LPT1:
        PAPERSIZE=256
        PAPERLENGTH=4162
        PAPERWIDTH=1256
        DEFAULTSOURCE=8

        ทำการ save โดยกดปุ่ม Ctrl-W คุณก็จะได้ไฟล์เก็บสถานะการพิมพ์ชื่อ MYPRINT.TXT สิ่งที่ผมกำหนดไว้ประกอบด้วย

        DEVICE จะเป็นชื่อของเครื่องพิมพ์ที่ใช้ออกรายงาน ถ้าไม่ใส่บรรทัดนี้จะเป็นการใช้เครื่องพิมพ์ของ Windows ที่เซ็ตเป็น Default ไว้

        OUTPUT บอกถึง output ของรายงาน

        PAPERSIZE กำหนดขนาดของกระดาษ 256 คือ custom size ซึ่งคุณต้องกำหนดความกว้างและยาวของกระดาษด้วย

        PAPERLENGTH กำหนดความยาวของกระดาษมีหน่วยเป็น n x .01 ซม. เช่น 1200 * .01 = 12 เซนติเมตร

        PAPERWIDTH กำหนดความกว้างของกระดาษ

        DEFAULTSOURCE กำหนดเป็น 8 คือใช้ tractor feed

ส่วนค่าอื่นๆที่จะเซ็ตก็ตามสบาย กระดาษตามแนวนอนเซ็ตอย่างไร?

    6. เมื่อเราทำสิ่งต่างเป็นที่เรียบร้อยเราต้องเขียนคำสั่งควบคุมการทำงานอีกที โดยการสร้างโปรแกรม .PRG ดังนี้

        MODIFY COMMAND MYPRINT

        ทำการป้อนคำสั่งดังนี้

        SET PRINTER TO NAME Epson LQ-1050    && กำหนดเครื่องพิมพ์ที่จะใช้พิมพ์รายงาน ชื่อที่กำหนดอาจเป็นชื่อ network printer ก็ได้
        USE MYREPORT1.FRX
        LOCATE FOR OBJTYPE = 1 AND OBJCODE = 53
        REPLACE Tag WITH "" , Tag2 WITH "" && เป็นการล้างค่าของ printer ที่รายงานเซ็ตไว้
        APPEN MEMO Expr FROM MYPRINT.TXT OVERWRITE   && นำค่าที่กำหนดไว้มาใส่ไว้ในรายงาน
        USE
        REPORT FORM MYREPORT1 PREVIEW     && TO PRINT

    ทำการ save แล้วลองเรียกโปรแกรมดูว่าเกิดอะไรขึ้น เสร็จแล้วคุณลองแก้ไข text file ที่เก็บค่าที่ใช้กำหนดสถานะการพิมพ์แล้วลองเรียกรายงานดูว่าเกิดการเปลี่ยนแปลงอย่างไร?

การกำหนดให้ PRIN PERVIEW มีขนาดใหญ่คับจอ
(ใช้ได้กับ VFP 6 ขึ้นไป)

ลักษณะทั่วไปของ Visual FoxPro นั้นถ้าเราทำการกำหนดขนาดของหน้าต่าง ทูลบาร์ หรือสิ่งต่างๆ ทาง VFP จะเก็บค่าเหล่านั้นไว้ในไฟล์ foxuser.dbf ให้ พอเวลาเราทำการเรียกใช้งานครั้งต่อไป VFP ก็จะจำสิ่งเหล่านั้นได้
เช่นเดียวกันถ้าเรากำหนดขนาดของ preview ให้ใหญ่เต็มจอ ครั้งต่อไปเมื่อเข้าสู่ VFP การ preview ก็จะมีขนาดเต็มจอเหมือนครั้งก่อน

ตัวอย่างนี้จะเป็นการสร้างหน้าต่าง preview รายงานแบบเต็ม Windows ครับท่านผู้ชม

    1.ให้คุณสร้างฟอร์มขึ้นมา ดังนี้

            CREATE FORM MYPREVIEW

    2. กำหนด Property ดังนี้

            TitleBar = 0
            Name = MyPreview
            ShowWindow = 2
            WindowState = 2

        จากนั้นก็ทำการ Save

    3. ที่โปรแกรมสำหรับพิมพ์รายงานให้ใส่คำสั่งดังนี้

            ....
            DO FORM MYPREVIEW NAME MYPREVIEW
            REPORT FORM MYREPORT1 PREVIEW IN WINDOWS MYPREVIEW
            MYPREVIEW.RELEASE
            ....

จากนี้ไปก็จะใหญ่คับจอ.... Version ต่ำกว่านี้ลองแล้วไม่ผ่าน ต้องใช้ คำสั่ง KEYBOARD '{CTRL+F10}' แทนตรงคำสั่ง DO FORM...