วันอาทิตย์ที่ 13 กุมภาพันธ์ พ.ศ. 2554

7: ACCESS กับไฟล์รอบตัว

ACCESS กับไฟล์รอบตัว

วัตถุประสงค์

แนะนำคำสั่งพิเศษใน Access ที่ใช้ในการติดต่อกับไฟล์ ต่างๆ การทำงานร่วมกับ ระบบปฏิบัติการ

เนื้อหา

                บทนี้ผมจะพาท่านไปพบกับการใช้งาน ACCESS ในการติดต่อกับไฟล์ต่างๆ ในเครื่อง  ต้องเรียนว่าความสามารถตรงนี้ เป็นความสามาารถ VB แท้ของ ACCESS ครับ แต่เราใช้ประโยชน์บ่อย  เช่นต้องเขียนโปรแกรมสร้าง Text ไฟล์ เงินเดือน ให้ธนาคาร โปรแกรม Import Text ไฟล์มาเข้า Database หรือ แม้กระทั่ง การดูแล Web Site ที่ต้องการสร้าง Web Page เยอะๆ แบบ อัตโนมัติ 
การทำงานกับ File
ขอใช้พื้นที่เล็กๆ ตรงนี้ แนะ คำสั่งสำหรับใช้งานติดต่อกับไฟล์ในระบบกันก่อนนะครับ
คำสั่งเกี่ยวกับ File
§         Dir
เป็นคำสั่งสำหรับค้นหา File หรือ List ไฟล์ เหมือนกับ Dir บน Dos   มีรูปแบบคำสั่งคือ
 =Dir[(pathname[, attributes])]
 
คำสั่งนี้มี tip นิดหน่อย คือตอนเราสั่งครั้งแรก จะต้องระบุ File ที่ต้องการค้นหา โดยระบุเป็น String patแบบเดียวกับที่ใช้บน Dos เช่น “C:\*,MDB” เป็นต้น   เมื่อทำสั่งครั้งแรกแล้ว คำสั่ง Dir ครั้งต่อๆไป ไม่ต้องมีการใส่ค่า pathname อีก Dir จะใช้ Pathname เดิม แล้วค้นหารายการต่อไป  ส่วน attributes เป็นค่า Paramter ที่ใช้ระบุสิ่งที่ต้องการจะหา  ดูตามตารางได้เลยครับ

ค่าคงที่ของ Attribute
ค่าจริง
คำอธิบาย
vbNormal
0
ไม่ระบุการค้นหาพิเศษ จะ Scan เฉพาะไฟล์ปกติ
VbHidden
2
ระบุให้รวม ไฟล์ที่เป็นสถานะ Hidden ด้วย
VbSystem
4
ระบุให้รวม System ไฟล์ เพื่อการค้นหาด้วย
VbVolume
8
สำหรับต้องการอ่านชื่อ Volume label ของ Disk
VbDirectory
16
สำหรับค้นหาเฉพาะ Directory

ค่า Paramter ที่กำหนด สามารถกำหนดพร้อมกัน หลายๆค่าได้ เนื่องจากเป็นเลขฐาน  2  สมมุติว่าต้องการค้นหาไฟล์ ทั้งที่เป็น Hidden และะ System File จะใช vbNormal + vbHidden + vbSystem
ตัวอย่างการอ่านชื่อไฟล์ใน C:\
   Sub GetCFile()
      Dim tmpStr, i
      i = 0
       tmpStr = Dir("C:\*.*")
       Do Until tmpStr = ""
          i = i + 1
          Debug.Print tmpStr
         tmpStr = Dir
      Loop
      MsgBox ("Total: " & i & " files")
End Sub
ตัวอย่างข้างต้นจะหาชื่อไฟล์ทั้งหมด แล้วพิมพ์ออกที่ Debug Windows ทำเสร็จแล้วลงกด ctrl+G ดูนะครับ  หากต้องการให้มีการ Scan ทั้ง Hidden และ System ไฟล์ จะใช้
tmpStr = Dir("C:\*.*",vbNormal + vbHidden + vbSystem)
ตัวอย่างการอ่านชื่อ Volume จะต้องระบุชื่อ Dir ตามตัวอย่าง
MsgBox (Dir("C:", vbVolume))
§         FileDatetime
ใช้สำหรับตรวจสอบวันที่ของ File  Return ค่าเป็นวันที่
 =FileDateTime(PathName)
ระบุชื่อ File ลงที่ pathName  ตัวอย่างการอื่น วันที่ของ C:\COMMAND.COM
 Sub GetFileDatetime
      Dim tmpDate
      TmpDate =FileDateTime(“C:\Command.Com”)
      Msgbox(TmpDate)
 End Sub
§         FileLen
ใช้สำหรับตรวจสอบขนาดของ File ค่าที่ Return เป็น Long Integer  หน่วนเป็น Byte
 =FileLen(PathName)
ระบุชื่อ File ลงที่ pathName  ตัวอย่างการอื่น วันที่ของ C:\COMMAND.COM
 Dim tmpSize
 TmpSize =FileLen(“C:\Command.Com”)
 Msgbox(TmpSize)
§         FileCopy
เป็นคำสั่งสำหรับ Copy File เหมือนคำสั่ง Copy บน Dos  ไม่สามารถใช้ WildCard ได้นะครับ มี 2 Input คือ File ต้นทาง และ File ปลายทาง
 Filecopy  SrcPathName , DestPathName
ตัวอย่างการ Copy ไฟล์จาก C:\ ไปไว้ที่  tmpBackup
 Sub CopyAuto()
     Dim tmpStr
     On Error Resume Next
     MkDir "C:\tmpBackup"
     On Error GoTo 0
     
     tmpStr = Dir("C:\*.*")
     Do Until tmpStr = ""
        FileCopy "C:\" & tmpStr, "C:\tmpBackup\" & tmpStr
        tmpStr = Dir
     Loop
 End Sub
§         Kill
เป็นคำสั่งสำหรับลบ File สามารถระบุเป็น wild card ได้ ควรระมัดระวังในการใช้งาน เพราะหากสั่งไม่ดี อาจลบทั้ง Directory ได้
 Kill PathName ( Wild Card Allow )
ตัวอย่างการลบ File ที่ได้ทำไว้ในตัวอย่างไฟล์ Copy
Sub KillAuto()
     Dim tmpStr
     tmpStr = Dir("C:\tmpBackup\*.*")
     Do Until tmpStr = ""
        Kill "C:\tmpBackup\" & tmpStr
        tmpStr = Dir
     Loop
 End Sub
การเรียกโปรแกรมอื่นๆ
บ่อยครั้งที่ เราต้องบังคับโปรแกรมของเรให้ออกไปเรียกโปรแกรมอื่นๆ ขึ้นมาทำงานต่อเนื่องจากโปรแกรมที่เราทำงานอยู่ เช่น ทำการ Copy ข้อมูลแล้ว ก็จะต้องทำการ Zip ไฟล์ และ Copy ไปลงที่ Drive A เป็นต้น ตรงนี้เราอาจต้องเรียก Bat ไฟล์ที่ทำไว้
§         Shell
ใช้สำหรับเรียกโปรแกรมอื่นให้มาทำงาน  มีรูปแบบคำสั่งคือ
 Shell(pathname[,windowstyle])
PathName เป็นชื่อโปรแกรมที่ต้องการเรียก ส่วน WindowStyle เป็นการระบุสถานะ Windows ของ Application ที่ถูกเรียก 

Constant
Value
Description
VbHide
0
เรียก Application แต่ให้อยู่ใน Hide Mode ไม่ถูก Focus
VbNormalFocus
1
ทำงานโดยถูก Focus จากระบบ และอยู่ใน Mode Windows ปกติ
VbMinimizedFocus
2
อยู่ในสถานะ Minimize ( Icon ) แต่ได้รับ Focus
VbMaximizedFocus
3
อยู่ในสถานะ Maximize และได้รับ Focus
VbNormalNoFocus
4
เปิด Windows ขึ้นมาทำงาน โดยใช้สถานะ Windows ตามปกติ แต่ไม่ต้อง Focus
VbMinimizedNoFocus
6
อยู่ในสถานะ Minimize ( Icon ) และไม่ได้รับ Focus


การเรียกด้วยคำสั่ง Shell ติดกัน Access จะประมวณผลต่อเนื่อง  ไม่เหมือนกับ BAT ไฟล์บน Dos  ที่ประมวลผลที่ละคำสั่ง หากเรากำลังใช้ Shell ไปเรียก Application ที่ทำงานต่อเนื่องกัน อาจเกิดปัญหาได้ เพราะลำดับที่ทำก่อหน้า ตัวอย่างเช่น การทำ Zip ไฟล์ต่อไปนี้
 Sub TestBatX()
     Dim x
     x = Shell("pkunzip a:test.zip c:\tmp", VbNormalFocus)
     x = Shell("command.com /crename C:\tmp\test.mdb test2.mdb", VbNormalFocus)
End Sub
ชุดโปรแกรมนี้ ไม่สามารถทำการ Rename ไฟล์ได้ เนื่องจาก เมื่อ Access เรียก pkunzip แล้ว จะไป บรรทัดต่อไปทันที คือการ Rename ซึ่ง โปรแกรม Unzip ยังอาจทำงานไม่เสร็จ 
วิธีแก้ปัญหากรณีดังกล่าว ควรทำ Bat ไฟล์ที่เก็บคำสั่งทั้ง 2 ไว้ แล้วเรียก Bat ไฟล์นี้ เพียงครั้งเดียว
 Sample.BAT
 -----------------
 pkunzip a:test.zip c:\tmp
 rename C:\tmp\test.mdb test2.mdb
 -----------------
 Sub TestBatX()
     Dim x
     x = Shell("sample.bat", VbNormalFocus)
 End Sub
§         AppActivate
ใช้สำหรับเรียกโปรแกรมที่ Run แล้ว ซึ่งจะสังเกตุจาก TaskBar ให้ขึ้นมาเป็น Application ที่รับ Focus แทน   เราต้องมีการเรียก Applicationดังกล่าว ด้วย Shell ก่อนเสมอ เพราะถ้าเราเรียก AppActivate โดยไม่มี Application มาก่อน อาจเกิด Error ได้
 AppActivat title[,wait])
Title เป็นชื่อโปรแกรมที่ต้องการเรียก เป็นชื่อที่ปรากฎบน TaskBar  ส่วน wait เป็นการระบุให้ Application ที่เรียกได้รับ Focus ทันทีWindowStyle เป็นการระบุสถานะการอ เป็น True หรือ False เป็นการบอกให้ Application  ที่ถูกเรียกได้รับ Focus ทันที ( False เป้นค่า Default หากไม่ระบุ )  หรือ รอให้ Windows ของผู้เรียก ได้รับ Focus ก่อน แล้วจึง ให้ Windows ของ Application ได้รับ Focus (True )
 Sub TestAppActivate()
     Dim x
     On Error Resume Next
     AppActivate "Calculator"
     If Err Then
         x = Shell("Calc.exe")
         AppActivate "Calculator"
     End If
 End Sub
ตัวอย่างข้างต้น จะทำการทดสอบการ Activate โดยไม่ระบุการ Shell ก่อน เผื่อว่า Calculator ได้รับการ Run แล้ว หาก พบว่า Error จะทำการเรียก Shell ก่อน แล้วเรียก AppActivate อีกครั้ง
การอ่านเขียน File
โดยปกติ Utilities ที่มา Access ก็เพียงพอในการ Convert Text ไฟล์ได้ แต่ในสถานะการณ์จริง เราพบว่าของที่มากับ Access จะใช้ดิบๆ ตรงๆ ไม่ค่อยได้  จำเป็นมากมาก ที่เราต้องอ่านเขียน ไฟล์เองเป็น การอ่านเขียนก็จะเริ่มจากการเปิดไฟล์ ซึ่งต้องเริ่มจากการ ขอเปิดไฟล์ผ่าน Function Freefile ของ Access เพื่อขอเลขที่ไฟล์ที่ทำการเปิด  หลังจากนั้นเวลาที่เราทำอะไรกับไฟล์ ก็จะอ้างเลขทีนี้  เวลาเปิดไฟล์ขึ้นมา ไม่ว่า จะอ่านหรือ เขียน อย่าลืมปิดทุกครั้งนะครับ     คำสั่งในการเปิดคือ
Open [filename]  For [mode]  As [fileno]
[mode] มี 3 แบบคือ
-        Input: เปิดเพื่ออ่าน,
-        Output: สร้างไฟล์ใหม่ ถ้ามีแล้วให้ทับไฟล์เดิม
-        Append: เปิดมาเพื่อเพิ่มรายการ จากเดิมทีมีอยู่แล้ว
Mode: input
ตัวอย่างข้างล่างเป็นการเปิด Text ไฟล์ AUTOEXEC.BAT มาอ่านค่าในไฟล์นะครับ  สำหรับท่านที่มช้ XP คงไม่มี autoexec.bat แล้ว  ลองเปลี่ยนเป็น c:\boot.ini ก็ได้นะครับ  ส่วนผลก็แสดงที่ debug windows
 Sub ReadAutoExec()
     Dim Filex, tmpStr
     Filex = FreeFile
     
     Open "C:\AUTOEXEC.BAT" For Input As Filex
     Do Until EOF(Filex)
         Line Input #Filex, tmpStr
         Debug.Print (tmpStr)
                       ‘--- another process
                      
                      
             Loop
      Close Filex
         End Sub
        
-   ขั้นตอนตามปกติในการเปิดไฟล์คือ
.  อ่านค่า FreeFile มาเก็บไว้ในตัวแปร เพื่อให้เราทราบว่า ตอนนี้เราได้ลำดับที่ File ที่เท่าไร
.  ใช้คำสั่ง Open ในการเปิด ระบุชื่อ File ตามด้วย Mode ที่การเปิดในที่นี้ คือการ Input และระบุลำดับที่ File
.  ทำการ Do loop โดยใช้ ฟังก็ชั่น EOF ซึ่งจะต้องระบุเลขที่ลำดับไฟล์ที่ขอจากระบบ ในที่ก็คือค่าที่เก็บไว้ใน Filex
.  ใช้คำสั่ง Line Input ในการอ่านไฟล์เข้ามาพักไว้ในตัวแปร ที่ละบรรทัด
.  นำตัวแปร ซึ่งขณะที่เก็บข้อมูลในแต่ละบรรทัดที่อ่านได้ไว้ไปทำการต่อ
.  ปิดไฟล์ เมื่อทำงานเรียบร้อย
Mode: Output
สำหรับขั้นตอนการสร้างไฟล์ใหม่ ก็ใช้วิธีการเดียวกัน เพียงแต่เปลี่ยน Mode การ Open จาก Input เป็น Output  และ ใช้คำสั่ง Print แทนคำสั่ง Write ทดลองดูตัวอย่างต่อไปนี้ เป็นการ อ่าน File Autoexec.bat  หรือ Boot.ini มาสร้างเป็น WebPage
 Sub GenAutoExecHtm()
     Dim Filex, FileHtm, tmpStr, I
     Filex = FreeFile
     Open "C:\AUTOEXEC.BAT" For Input As Filex
     FileHtm = FreeFile
     Open "C:\AUTOEXEC.HTM" For Output As FileHtm
     
     Print #FileHtm, "<HTML>"
     Print #FileHtm, "<BODY BGCOLOR = WHITE>"
     Print #FileHtm, "<Font Size = +3>Your Autoexec.bat is</font><br>"
     Print #FileHtm, "<TABLE>"
     i = 1
     Do Until EOF(Filex)
         Line Input #Filex, tmpStr
         Print #FileHtm, "<TR><TD>" & i & "): </TD><TD> " & tmpStr & "</TD></TR>"
         i = i + 1
     Loop
     Print #FileHtm, "</TABLE>"
     Print #FileHtm, "</BODY>"
     Print #FileHtm, "</HTML>"
     
     Close Filex
     Close FileHtm
     
         End Sub
        
Mode: Append
Append ต่างกับ Output ตรงที่ Append จะไม่ลบไฟล์เดิม  เมื่อสั่ง Print จะทำการ Write ข้อมูลต่อจากไฟล์เดิม  แต่คำสั่งต่างๆ เหมือนกันครับ
              สร้าง Database เก็บรายชื่อไฟล์
              เราจะเอาคำสั่งต่างๆที่แนะนำไป มาสร้างโปรแกรมที่ค้นหารายชื่อไฟล์ใน Directory ที่ต้องการพร้อมกับ ขนาดไฟล์ กันดูนะครับ   ก่อนอื่น  ขอให้สร้าง Table ชื่อ FILELIST มี 2 FIELD ครับ คือ FILENAME เป็น TEXT(255),  FileSize เป็น Double ใช้ ฟิลด์ FILENAME เป็น Primary Key ก็ได้นะครับ
.             
    Sub genFilelist()
        Dim SDir
        Dim x
        SDir = InputBox("Enter Folder Name")
        If SDir = "" Then
           MsgBox "Nothing to search "
           Exit Sub
        End If
        x = Dir(SDir & "\*.*", vbDirectory + vbHidden + vbSystem)
        DBEngine(0)(0).Execute "delete from filelist"
        Do Until x = ""
           DBEngine(0)(0).Execute "insert into FileList(filename,  filesize) " & _
                                  " values('" & x & "'," & FileLen(SDir & "\" & x) & ")"
           x = Dir
        Loop
 End Sub
        
        
โปรแกรมนี้จะถาม Directory ที่ต้องการหาขนาดไฟล์ จากนั้นก็ใช้คำสั่ง Dir แต่มีการต่อ *.* เข้าไปเพื่อให้หาไฟล์ทุกๆ ไฟล์  ทำการลบข้อมูลเดิมทิ้งก่อน   รายการไฟล์จะได้จากคำสั่ง Dir ไฟล์ที่หาเจอ ก็นำไปเพิ่มใน Table FILELIST  เราใช้ Filelen ในการอ่านขนาด     
ลองทำต่ออีกนิดนะครับ แทนที่จะเพิ่มข้อมูลอย่างเดียว ลองนำไปสน้างเป็น HTML แบบตัวอย่างในการ Gen ไฟล์ด้วยก็ได้นะครับ 


ไม่มีความคิดเห็น:

แสดงความคิดเห็น