แสดงกระทู้

This section allows you to view all posts made by this member. Note that you can only see posts made in areas you currently have access to.


Messages - MyDDT

หน้า: [1]
1
ถ้าจะกำหนดให้ค่า Null เป็น 0 ก็ใช้
Val(Nz(DSum("[Que_Pro] * [Salepre_Pro]","tbl_OrderItemPro","ID_Pro=" & [Qry_TotalOut].[ID_Pro]), 0))
โพสต์นี้ได้รับคำขอบคุณจาก: MyDDT

2
ก็ต้องดูว่าค่าในฟิลด์ไหนที่อาจจะเป็นค่า Null ได้ในฐานข้อมูลเรา แล้วทำให้การคำนวณอาจคำนวณค่ากับฟิลด์อื่นที่มีค่าไม่ได้ก็ให้ใส่ Nz() เข้าไปเพื่อทำให้มันสามารถคำนวณค่าได้ เช่นหากถ้าเป็นไปได้ทุกฟิลด์ในฐานข้อมูลเราจะเป็นค่า Null ได้ทั้งหมด เราก็ต้องใส่ทั้งหมดประมาณนี้ครับ

Val(DSum("Nz([Que_Pro]) * Nz([Salepre_Pro])","tbl_OrderItemPro","Nz(ID_Pro)=" & Nz([Qry_TotalOut].[ID_Pro])))

ซึ่งมันแล้วแต่การออกแบบฐานข้อมูลว่าเรากำหนดให้มันสามารถเกิดค่า Null ได้หรือไม่ในฟิลด์ครับ ปรับใช้ดู
โพสต์นี้ได้รับคำขอบคุณจาก: MyDDT

3
ลองดูตัวอย่างนี้นะครับ
โพสต์นี้ได้รับคำขอบคุณจาก: MyDDT

4
ชื่อของ Field ผมว่าเปลี่ยนไปใช้ภาษาอังกกษดีกว่าครับ จะได้ไม่มีปัญหาภายหลัง
ส่วน error ต่างๆ ให้ส่งไฟล์ที่ทำอยู่มาที่ pinnarong1115@hotmail.com
เดี่ยวผมดูให้ครับ
โพสต์นี้ได้รับคำขอบคุณจาก: MyDDT

5
อ้างถึง
อ่อขอเพิ่มเติมข้อ 2 หน่อยค่ะ คือไม่อยากให้คำนวณช่วงเบรกอ่ะค่ะ 12.00-13.00 จะไม่ให้มันคำนวณออกมาอ่ะค่ะ ต้องเพิ่มเติมโค้ดตรงไหนคะ ขอบคุณค่ะ :confused:

Sub CalTime()
Dim DTime1, Time1, DTime2, Time2 As Variant
Dim MainTime As Long

Time1 = "12:00 PM"
Time2 = "1:00 PM"

MainTime = (DateDiff("h", Me.TimeStart, Me.TimeEnd))

DTime1 = (DateDiff("h", Me.TimeStart, Time1))
DTime2 = (DateDiff("h", Me.TimeEnd, Time2))


If DTime1 > 0 Then
If DTime2 < 0 Then
MainTime = MainTime - 1
Me.CalcTime = MainTime & " ชั่วโมง"
Else
MainTime = MainTime
Me.CalcTime = MainTime & " ชั่วโมง"
End If
End If

If Me.TimeStart > Me.TimeEnd Then
MainTime = (DateDiff("h", Me.TimeStart, Me.TimeEnd) + 24)
Me.CalcTime = MainTime - 1 & " ชั่วโมง"
End If

If DTime1 = 0 Then
If DTime2 < 0 Then
MainTime = MainTime - 1
Me.CalcTime = MainTime & " ชั่วโมง"
End If
End If

If DTime1 < 0 Then
If DTime2 < 0 Then
MainTime = MainTime
Me.CalcTime = MainTime & " ชั่วโมง"
End If
End If

If DTime1 > 0 Then
If DTime2 = 0 Then
MainTime = MainTime - 1
Me.CalcTime = MainTime & " ชั่วโมง"
End If
End If
End Sub

Private Sub TimeEnd_AfterUpdate()
If Not IsNull(Me.TimeStart) And _
Not IsNull(Me.TimeEnd) Then
Call CalTime
End If
End Sub

Private Sub TimeStart_AfterUpdate()
If Not IsNull(Me.TimeStart) And _
Not IsNull(Me.TimeEnd) Then
Call CalTime
End If
End Sub


ลองศึกษาดูครับ
timestart คือ textbox เวลาเริ่มทำงาน
timeend คือ textbox เวลาสินสุด
Calctime คือ textbox ผลลัพท์ที่คำนวนได้คับ
โพสต์นี้ได้รับคำขอบคุณจาก: MyDDT

6
ลบ Tshift = Shift ออกไปครับ พอดีผมลืมลบออกให้ มันเลย เออเร่อ
แก้คำสั่งเป็น
โค๊ด: [Select]
Sub ResetForm()
    On Error GoTo Err_Err
    Dim ctl As Control
   
       
    For Each ctl In Me
        If ctl.ControlType = acComboBox Then
            ctl = Null
        End If
        If ctl.ControlType = acTextBox Then
         ctl = Null
        End If
        If ctl.ControlType = acCheckBox Then
                ctl = False
        End If

    Next ctl
Exit_err:
        Exit Sub
Err_Err:
        MsgBox Error$
         MsgBox "ERROR ResetForm"
        Resume Exit_err

End Sub
โพสต์นี้ได้รับคำขอบคุณจาก: MyDDT

7


อ้างถึง
1.การคำนวณอายุ ถ้าต้องการให้ตอนกรอกประวัติพนักงาน กรอกวันเกิด/วันเริ่มงานเสร็จแล้ว ให้อายุ/อายุงานมันขึ้นเลยได้หรือป่าวคะ หรือถ้าไม่ได้ เราให้มันคำนวณตอนกดเซฟได้หรือป่าวคะ เพราะเมื่อวานลองลงโค้ดคำนวณดู มันเออเร่ออ่ะค่ะ เหมือนตัวเองจะยังไม่ค่อยเข้าใจหลักการของการวางโค้ดเลยค่ะ

 การคำนวนหาช่วงปี เดือน วัน หรือ เวลา เราสามารถใช้ DateDiff ในการหาค่าต่างๆ
เช่น การหาค่าอายุ  และ การหาอายุการทำงาน
ผมกำหนด
textbox ที่จะแสดงอายุชื่อ Age
และ textbox ที่จะระบุอายุชื่อ Birthday
โค้ดประมาณนี้ครับ
โค๊ด: [Select]
Me.Age = Int(DateDiff("m", [Birthday], Now()) / 12) & " ปี " & (DateDiff("m", [Birthday], Now()) Mod 12) & "เดือน " & Int(DateDiff("d", [Birthday], Now()) Mod 12) & " วัน "
การหา อายุงานใช้วิธีการเดียวกันครับ

อ้างถึง
2.คำนวณชั่วโมงการทำงานทั้งหมด อย่างสมมุติ น.ส.สวย เข้างาน= 08.00น. ออกงาน = 17.00น. ชั่วโมงทำงาน = 08.00 ชม. แบบนี้ต้องคำนวณอย่างไร ตั้งชนิดข้อมูลของเข้างาน,ออกงาน เป็น Date/Time นี่คือถูกต้องแล้วใช่มั้ยคะ
ผมสมมุติ textbox  3 อัน ชื่อ Timestart   ,   TimeEnd      ,    CalcTime
โดยจะกำหนดให้คำนวนเวลาทำงาน เมื่อระบุเวลา เริ่มและสินสุดการทำงาน และแสดงใน textbox ชื่อ Calctime
ตัวอย่างโค้ด
โค๊ด: [Select]
Sub CalTime()
If Me.TimeEnd < Me.TimeStart Then
Me.CalcTime = (DateDiff("h", [TimeStart], [TimeEnd]) + 24) & " ชั่วโมง"
Else
Me.CalcTime = DateDiff("h", [TimeStart], [TimeEnd]) & " ชั่วโมง"
End If
End Sub

Private Sub TimeEnd_AfterUpdate()
Call CalTime
End Sub
Private Sub TimeStart_AfterUpdate()
Call CalTime
End Sub

อ้างถึง
3.คือเรามีตารางเก็บข้อมูลการลางานแบบนี้ 01=มาทำงานปกติ 02=ลาป่วย 03=ลากิจ ... ถ้าต้องการให้มีช่อง2ช่อง ช่อง1 เป็นช่องเล็กๆไว้ใส่เลข 01 แล้วช่องที่2 ให้มันเด้งขึ้นมาเองว่า มาทำงานปกติ ประมาณนี้ ถ้าเราเปลี่ยนแปลงตัวเลข ตัวหนังสือก็เปลี่ยนตามไปด้วย ประมาณนี้อ่ะค่ะ ต้องทำอย่างไรคะ

วิธีการคือให้ไปดูการกำหนด แหล่งข้อมูลแถว  ของตัว Combobox นะครับ
สังเกตุดูจะเห็นว่า เราดึง Field ID และ Field Status ลงมาเพื่อใช้เป็น list ของ Combobox
ถ้าเราต้องการให้ กด เลือก ข้อมูลจาก Combobox แล้ว textbox ก็แสดง status ตรงกับ ID นั้น
ก็กำหนดแบบนี้ครับ ที่ Event Afterupdate

โค๊ด: [Select]
Private Sub Combo16_AfterUpdate()
Me.status = Me.Combo16.Column(1)
End Sub

ความหมาย ของ .Column(1) คือการเอา รายการจาก ตัว Combobox คอลัมน์ที่ 2 มาแสดง ใน textbox โดย .Column(0) คือคอลัมน์แรก ส่วน คอลัมน์ ต่อๆไป ก็สามารถระบุ 1 2 3 4 5 ไปเรื่อยๆ ได้ครับ
โพสต์นี้ได้รับคำขอบคุณจาก: MyDDT

8
ที่จริง ถ้าจะให้ Advance อีกนิด เราสามารถสร้าง Control แบบ Unbound น่าจะเวิคนะครับ

ตัวอย่างเพื่อจะนำไปปรับใช้

คำสั่งในการบันทึกข้อมูล
โค๊ด: [Select]
Private Sub Save_Click()
Call AddNewToTable
subform.Requery
MsgBox "บันทึกข้อมูลแล้วค่ะ", vbInformation, "สถานะ"
Call ResetForm
End Sub

โค๊ด: [Select]
Sub AddNewToTable()
On Error GoTo Err_Err
    Dim DB As Database
    Dim rs As Recordset
    Set DB = CurrentDb()
    Set rs = DB.OpenRecordset("BillHead", dbOpenDynaset)
    rs.AddNew
    rs![BillNumber] = Me.BillNumber
    rs![CustomerName] = Me.CustomerName
    rs![CustomerLastName] = Me.CustomerLastName
    rs![Tel1] = Me.Tel1
    rs![Tel2] = Me.Tel2
    rs.Update
Exit_err:
        Exit Sub
Err_Err:
        MsgBox Error$
        MsgBox "Error, ( Add New)!", vbExclamation, "แจ้ง"
        Resume Exit_err
End Sub

คำสั่งทำให้ ข้อมูลจากตัว Control บนฟอร์ม เป็นค่าว่าง
โค๊ด: [Select]
Sub ResetForm()
    On Error GoTo Err_Err
    Dim ctl As Control
   
       
    For Each ctl In Me
        If ctl.ControlType = acComboBox Then
            ctl = Null
        End If
        If ctl.ControlType = acTextBox Then
         ctl = Null
        End If
        If ctl.ControlType = acCheckBox Then
                ctl = False
        End If

    Next ctl
Exit_err:
        Exit Sub
Err_Err:
        MsgBox Error$
         MsgBox "ERROR ResetForm"
        Resume Exit_err

End Sub

ประมาณนี้ครับ
โพสต์นี้ได้รับคำขอบคุณจาก: MyDDT

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

ใช่เลยค่ะ เหมือนบันทึกจากฟอร์มหลักลงฟอร์มย่อยอ่ะค่ะ พอกดบันทึก ช่องก็จะว่างให้เราบันทึก Record ต่อไปได้ อะไรประมาณนี้อ่ะค่ะ


งั้นก็เอา การตั้งค่าตรง หัวข้อที่ 3 ออกไปครับ

Form หลัก และ Form ย่อย ใช้ RecordSource จากตารางเดียวกัน
สมมุติชื่อ ฟอร์มย่อยว่า Subform
ที่ปุ่ม บันทึกใส่แบบนี้ครับ

โค๊ด: [Select]
Private Sub Save_Click()
DoCmd.GoToRecord , , acNewRec
subform.Requery
MsgBox "บันทึกข้อมูลแล้วค่ะ", vbInformation, "สถานะ"
End Sub

ลองดูตัวอย่างนี้ครับ
โพสต์นี้ได้รับคำขอบคุณจาก: MyDDT

10



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

และต้องไปกำหนด ความสัมพันธ์ของตารางด้วยครับ


ตัวอย่างโปรแกรมครับลองนำไปประยุกต์ใช้ดูนะครับ
โพสต์นี้ได้รับคำขอบคุณจาก: MyDDT

11
ตอบข้อ 1
ผมกำหนด combobox สถานะ ชื่อ status
             textbox    วันที่ลาออก ชื่อ DateOut
             combobox สาเหตุการลาออก ชื่อ OutDetail

ที่Event Afterupdate ของ combobox status ใส่โค้ดดังนี้

โค๊ด: [Select]
Private Sub Status_AfterUpdate()
If Me.Status = "ยังทำงานอยู่" Then
Me.OutDetail.Locked = True
Me.DateOut.Locked = True
Me.OutDetail.Enabled = False
Me.DateOut.Enabled = False
Me.OutDetail = Null
Me.DateOut = Null
Else
Me.OutDetail.Locked = False
Me.DateOut.Locked = False
Me.OutDetail.Enabled = True
Me.DateOut.Enabled = True
End If
End Sub

คำสั่งนี้ เราใช้ IF Function เพื่อสร้างเงื่อนไขการทำงานของ Combobox และ Textbox ที่เรากำหนด  ถ้า เราเลือก ยังทำงานอยู่ ซึ่งกำหนดให้ เป็นความจริง ก็จะทำงานตามที่เรากำหนดไว้ แต่ถ้าไม่เป็นจริงก็จะทำงาน ที่ Else ลงมา
Locked คือ ห้ามไม่ให้กรอกข้อมูลได้
Enabled คือ ปิดการใช้งาน
Null คือ ถ้ามีข้อมูลอยู่ก็ทำให้เป็นค่าว่าง

ข้อสองน่าจะกำหนด RelationShip ไม่ถูกต้อง และตั้งค่า เชื่อมต่อ ตรง Link master กับ Link Child Field ไม่ถูกต้องครับ

ตัวอย่างด้านล่าง
โพสต์นี้ได้รับคำขอบคุณจาก: MyDDT

12

สอบถามนิดนึงค่ะว่า ตรง หน้าต่างใส่โค้ด VBA อ่ะค่ะ มันไม่อ่านภาษาไทย ต้องแก้ตรงไหนหรอคะ

ที่หน้าต่างใส่โค้ด ไปที  Tool > Option > Editor Format
ที่ Font กำหนดเป็น Tahoma Bold (Thai)  หรือ ฟ้อนอื่นๆ ที่มีคำว่า(thai) ต่อท้ายอยู่ครับ
โพสต์นี้ได้รับคำขอบคุณจาก: MyDDT

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

ขออีกข้อค่ะ คือทำไมเราสร้าง SubForm ขึ้นมาในตารางบันทึกเวลาทำงานของพนักงาน แล้วลองเทสบันทึกเวลาดู มันไม่เป็นแถวลงไปใน SubForm อ่ะ มันเป็นแบบ พอเราบันทึกใหม่ มันก็เป็นแถวเดิมแต่ข้อมูลใหม่ แล้วไม่โชว์ข้อมูลเก่าที่บันทึกไปก่อนหน้านี้ แบบนี้จะต้องสร้าง SubForm ในรูปแบบใดคะ  :cry:

ปล.ภาพประกอบไม่มี ไฟล์งานอยู่ที่บ้าน ต้องขออภัยด้วยนะคะ

1.คำสั่ง ที่เมื่อกดบันทึกข้อมูลแล้ว แสดงข้อความแจ้ง Code ให้ใส่ Code ในส่วนท้ายของ คำสั่งบันทึกประมาณนี้ครับ
โค๊ด: [Select]
MSGBOX "บันทึกข้อมูลเรียบร้อยแล้ว", vbInformation, "สถานะ"
2.SubForm นั้นต้องมีการเชื่อมโยงเขตข้อมูลหลัก กับ เขตข้อมูลลูก คุณต้องกำหนด การเชื่อมโยงกันด้วยครับ
ปกติจะกำหนด ID ของ ฟอร์มหลัก เชื่อมกับ ID ของฟอร์มย่อย(SubForm)
วิธีการกำหนด สามารถไปกำหนดได้ที่ ส่วนคุณสมบัติของ Subform ตรงส่วนของข้อมูล
โพสต์นี้ได้รับคำขอบคุณจาก: MyDDT

14
ถ้าใช้ฐานข้อมูลนามสกุล .mdb, .mde ตัว Access จะมี User-Level Security เพื่อสร้างผู้ใช้, กลุ่มผู้ใช้ และกำหนดสิทธิ์ได้ว่าจะให้มีสิทธิ์ตามที่ Access ให้มา มากน้อยแค่ไหน หา Google ด้วยคำ Microsoft Access User Level Security มีอธิบายวิธีทำไว้เยอะแยะครับ แต่การเล่นกับระบบ Security อ่านให้เข้าใจดีๆก่อน ถ้าทำอะไรผิดไป เดี๋ยวจะใช้ไฟล์ไม่ได้นะครับ

แต่ถ้านามสกุลเป็น .accdb, .accde  Access ตั้งแต่ 2007 ได้ตัดเอาความสามารถนี้ออกไปแล้ว การสร้างผู้ใช้, กลุ่มผู้ใช้, สิทธิ์ต่างๆ เราต้องเขียนโค้ดเอาเอง ดังนั้นไม่มีอะไรตายตัว มีเทคนิคเยอะแยะแล้วแต่ความซับซ้อน มีทั้งการป้องกันไฟล์ Back-End ที่เป็นฐานข้อมูล และไฟล์ Front-End ที่เป็นไฟล์เก็บหน้าฟอร์ม/รายงานต่างๆ ลองดูตัวอย่างข้างล่าง

- วิธีที่ใช้ Active Directory ของ Windows เอง (เครื่องเราต้องอยู่ในโดเมนเน็ทเวิร์คและมี Active Directory) www.accesssecurityblog.com/post/Securing-Access-databases-using-Active-Directory.aspx link

- วิธีที่สร้างเทเบิลผู้ใช้และกำหนดสิทธิ์เอาเอง (เครื่องเราไม่จำเป็นต้องอยู่ในเน็ทเวิร์ค) www.accesssecurityblog.com/post/2011/04/02/Login-Security-using-Access-VBA.aspx link

- ลองอ่านอันนี้ด้วยครับ มีโปรแกรมที่คุณสมชายทำเป็นตย.เอาไว้ www.thai-access.com/topic_post.asp?CategoryID=1&TopicID=4371

ยังไงก็ตาม โดยส่วนตัวคิดว่าใครก็ตามที่มีสิทธิ์ใช้โปรแกรมนั้น ถ้ามีความรู้ ก็สามารถเจาะเข้าฐานข้อมูลได้อยู่ดี ความปลอดภัยของ Access มีน้อยครับ
โพสต์นี้ได้รับคำขอบคุณจาก: MyDDT

15
เรื่องวุ่นๆ ของออบเจ็กต์และคอนโทรล

สมัยเรียน OOP (Object-Oriented Programming) รู้สึกตัวเองได้เปรียบเพื่อนร่วมชั้นตรงที่ใช้ Access มาก่อนชาวบ้าน เพราะถูกสอนจาก Microsoft ว่า Access น่ะ เป็นโปรแกรมที่ใช้ระบบ OOP
แต่พอเรียน OOP จริงๆ ไม่รู้ทำไมความเชื่อต่างๆ มันค่อย “แฟบ” ลงเรื่อยๆ เพราะยิ่งรู้มาก ก็ยิ่งรู้สึกว่า Access นั้นไม่ใช่ OOP แบบเต็มร้อย แต่ก็ถือว่า “เกือบ” ล่ะ อีกนิดเดียวก็ OOP แล้ว
อธิบายมากไปเดี๋ยวเผลอหยิบเรื่องเครียดมาเล่า ใครอยากรู้ว่า OOP เป็นอย่างไรไปถามอากู๋เอาเอง แต่เลือกเว็บที่น่าเชื่อถือหน่อยนะครับ พวกสถานศึกษาอะไรงี้
เรามาว่าเรื่อง Access กันดีกว่า
ถ้าใครศึกษา Access อย่างจริงจังย่อมหนีไม่พ้นที่จะเจอคำว่า “ออบเจ็กต์” และ “คอนโทรล” อย่างแน่นอน เพราะ Access นั้นถูกออกแบบมาด้วยเทคโนโลยีที่ล้ำกว่า Excel
เรียกว่า Excel นั้นว่าฉลาดแล้วก็จริง เพราะใช้เทคโนโลยีแบบ Neuro ในการออกแบบในสมัยแรกๆ พอมาสมัยหลังๆ ก็เอา XML มาใส่ จนกลายเป็น Excel ฉลาดๆ แบบปัจจุบัน แต่ Access มีมากกว่านั้นครับ คือใส่พวก Database Engine ระดับ OOP เข้าไป ถึงจะใส่ได้ไม่หมดก็เถอะ (แต่ไหงไม่เก่งภาษาไทยก็ไม่รู้)

คราวนี้พอแตะ OOP เข้าไป ก็หลีกไม่ได้ที่เวลาเขียนโค้ด หรือสั่งงานจะมีเรื่องของออบเจ็กต์เข้าไปด้วย
วิธีการมองคือทุกสิ่งอย่างที่เราเห็นได้ด้วยตาในหน้าจอ แบบนี้คือออบเจ็กต์ไม่ว่าจะเป็นตาราง ฟอร์ม รีพอร์ต ฯลฯ ล้วนเป็นออบเจ็กต์
แม้กระทั่ง Text Box, Combo Box อะไรพวกนี้ก็เป็นออบเจ็กต์ครับ
แต่ทีนี้ออบเจ็กต์พวก Text Box, Combo Box นี่ต้องวางอยู่บนออบเจ็กต์พวก ฟอร์มหรือรีพอร์ต
การจะเรียกว่าออบเจ็กต์อาจสร้างความสับสนให้ผู้ใช้งานได้ เขาก็เลยเรียก ออบเจ็กต์พวกที่ต้องวางอยู่บนออบเจ็กต์ว่า “คอนโทรล”
ดังนั้นเวลาพูดถึง “คอนโทรล” ก็จะหมายถึงออบเจ็กต์ที่วางอยู่บนออบเจ็กต์อีกที
แล้วเรื่องพวกนี้ก็เลยติดมาที่การเขียน Code ด้วย ถึงแม้ VBA ของ Access จะอิงกับ VB6 ก็เถอะ
เช่น
Form_frmData.txtDescription.Visible = False
Form_frmData เป็นออบเจ็กต์ประเภทฟอร์มชื่อ frmData
txtDescription เป็นคอนโทรลที่วางอยู่บนฟอร์มนี้
Visible คือ Property หรือคุณสมบัติของคอนโทรล ที่กำหนดให้มีค่าเป็น False
ทีนี้เราก็สามารถแยก “คอนโทรล” กับ “ออบเจ็กต์” ออกจากกันได้แล้วนะครับ
โพสต์นี้ได้รับคำขอบคุณจาก: MyDDT

16
ดยส่วนตัว ผมเป็นคนที่เกลียดเรื่องภาษามาตั้งแต่เด็ก ไม่ว่าจะภาษาไทย ภาษาอังกฤษ สังคม ประวัติศาสตร์ เป็นอะไรที่ต้องใช้ภาษาเยอะๆ นี่อย่าได้หวังว่าจะหันไปเหลียวแลเลยแม้แต่น้อย
วิชาที่ชอบที่สุดคือคณิตศาสตร์กับฟิสิกส์
ไม่รู้ว่าโชคดีหรือโชคร้ายที่เริ่มต้นชีวิตการทำงานในบริษัทฝรั่งที่ทุกอย่างภายในองค์กรเป็นภาษาอังกฤษล้วน ขนาดคีย์บอร์ดคอมพิวเตอร์ยังไม่มีภาษาไทยให้เลย เวลาจะพิมพ์ภาษาไทยทีนี่เป็นเรื่องน่าปวดหัวมาก
แล้วผมก็เริ่มใช้ Access ที่นี่แหละครับ เริ่มที่ Access 2.0 โดยตอนนั้นไม่มีความรู้เรื่อง Access เลย เห็นชื่อคล้าย Excel ก็เลยรับอาสาจะทำฐานข้อมูลให้
พอเปิดโปรแกรม Access ครั้งแรกเท่านั้นแหละ ปิดโปรแกรมแล้วนั่งทำใจอยู่ 2 วัน ก่อนไปหาหนังสือเกี่ยวกับ Access มานั่งอ่านอยู่เป็นอาทิตย์ กว่าจะได้ฐานข้อมูลที่เจ้านายต้องการออกมาก็เป็นเดือน
แล้วผมก็ตกหลุมรัก Access เข้าเต็มเปา
อ้าว! เล่าเรื่องส่วนตัวเยอะไปแล้ว ดึงกลับมาเข้าเรื่องของเราดีกว่า
บ่อยครั้งที่ผมได้รับไฟล์จากใครหลายคนส่งมาให้ผมช่วยเหลือ แล้วพบว่ามีการตั้งชื่อออบเจ็กต์และคอนโทรลเป็นภาษาไทย ซึ่งผมได้แต่แนะนำไปว่าอย่าใช้ภาษาไทยใน Access ก็เชื่อบ้างไม่เชื่อบ้าง
และนี่คือประสบการณ์ตรง เกิดจริง เจ็บจริง อันเกิดจากการใช้ภาษาไทยใน Access ครับ

เรื่องแรก ขัดขาตัวเอง
หลังจากศึกษา Access จนมั่นใจว่าเชี่ยวชาญในระดับนึง เพราะได้อาจารย์หลายท่านช่วยสั่งสอน ช่วงนั้นมีชื่อเสียงโด่งดังถึงขนาด บ.ไมโครซอฟต์ โทรมาหาเพื่อให้ไปเป็นวิทยากรให้เขา ก็เริ่มใช้ภาษาไทยในการตั้งชื่อออบเจ็กต์ต่างๆ จนกระทั่งพบว่า ภาษาไทยเป็นภาษาที่มี 5 ระดับ คือมีพยัญชนะ สระ วรรณยุกต์ ได้ 5 ชั้น แล้ว Access ก็ใช่ว่าจะเก่งภาษาไทยอะไรนักหนา บางครั้งภาษาไทยเหมือนกันเป๊ะ แต่พิมพ์ด้วยขั้นตอนต่างกัน Access ก็ไม่สามารถจัดการได้ ยิ่งเขียน VBA ยิ่งเละกันเข้าไปใหญ่ โดยที่เราเองก็ไม่รู้มันผิดตรงไหน แก้อย่างไรก็แก้ไม่ได้ แถม Access สมัยก่อน เวลาแก้ชื่อออบเจ็กต์แล้วก็ยังต้องไปตามแก้ในฟอร์ม ในรีพอร์ต ในรายงาน ปวดหัวมาก
ไม่เชื่อลองพิมพ์คำว่า “ปู่ปู่” เป็นชื่อตารางดูสิครับ ให้ ไม้เอกมาก่อนสระอู และสระอูมาก่อนไม้เอก Access จะแสดงเหมือนกันทั้งคู่ แล้วอย่างนี้เราจะไว้ใจภาษาไทยใน Access ได้อย่างไร

เรื่องที่ 2 ภาษาไทยกับคอนโทรลใน Access
เรื่องนี้เกิดจากมีบริษัทการเงินแห่งนึง เอาโปรแกรมฐานข้อมูลที่เปิดไม่ได้มาให้ช่วยแก้ไข Bug ให้ที สิ่งที่เจอคือชื่อคอนโทรลทั้งหมดเป็นภาษาไทย ด้วยเหตุแห่งชาตินิยม ดังนั้นจึงตั้งชื่อคอนโทรลเป็นภาษาไทยเพื่อให้สามารถทำการแก้ไขคำสั่งได้ง่าย และดูเหมือนโปรแกรมไม่มีปัญหาอะไร จนกระทั่ง Access 97 มาถึง แล้วทุกสิ่งก็เปลี่ยนไป เมื่อโปรแกรมเปิดมาแล้วเจอ Bug มากมายมหาศาล

เรื่องที่ 3 โปรแกรมจัดการตารางบินที่ตั้งชื่อ Sub เป็นภาษาไทย
เรื่องนี้ก็เกิดกับบริษัทเกี่ยวกับธุรกิจการบินขนาดเล็กที่ใช้ Access ในการเก็บจำนวนชั่วโมงบินของนักบิน หลังจาก Access ถูกเปลี่ยน Version เป็น 2013 แล้วฝันร้ายก็มาเยือน เพราะการทำงานทุกอย่างดูติดขัดไปหมด แถมการคำนวณจำนวนชั่วโมงก็เพี๊ยนไม่เป็นท่า พอส่งโปรแกรมมาให้ผมแก้ไขก็พบว่า ภาษาไทยที่เคยมีอยู่ กลายเป็น ?????? (ใครใช้ Access นานๆ น่าจะเคยเจอเจ้านี่ ? มหาภัย) กว่าจะไล่แก้ไขได้ก็เป็นเดือนครับ

ก็อย่างที่บอกแหละครับ ถึงผมจะไม่ชอบเรื่องภาษา แต่การไปทำงานต่างประเทศนานๆ ทำให้รักภาษาไทยมาก ถึงมากที่สุด เมื่อกลับมาอยู่เมืองไทย ก็เริ่มศึกษาประวัติศาสตร์ชาติไทยอย่างจริงจัง อ่านวรรณคดี นิยาย เรื่องสั้นมากมาย แต่ก็อย่างที่บอกครับ อย่าใช้ภาษาไทยใน Access เลย แม้คุณจะรักภาษาไทยขนาดไหนก็ตาม
โพสต์นี้ได้รับคำขอบคุณจาก: MyDDT

หน้า: [1]