รบกวนถามผู้รุ้ เรื่อง ภาษา ค่ะ
กระทู้เก่าบอร์ด อ.Yeadram

 1,840   6
URL.หัวข้อ / URL
รบกวนถามผู้รุ้ เรื่อง ภาษา ค่ะ

ปัญหาที่มีอยู่ตอนนี้ คือ การทำใบinvoice อะค่ะ ลูกค้าบางที่ ใช้ ภาษาไทย บางที่ ใช้ อังกฤษ ตอนนี้เลยแก้ปัญหาไปว่า ที่ไหน ใช้ ไทยก็ add ข้อมูลภาษาไทย ที่ไหนใช้ อังกฤษก็ add ข้อมูลอังกฤษ แต่ติด ปัญหาที่ จำนวน เงิน แบบตัวอักษรที่ถามไปในกระทู้ก่อนอะค่ะ ว่ามี Code ที่ เปลี่ยนตัวเลขเป็น ตัวอักษร ภาษาอังกฤษโดยมีเศษ สตางค์ด้วยรึเปล่าอะค่ะ(ตอนนี้ก็ยังไม่ได้code นั้นค่ะ) และอีกปัญหานึงตอนนี้ก็คือเวลา สั่งปริ้น ภาษาไทย อยากให้ จำนวน เงิน ที่เป็นตัวอักษร ออกเป็นภาษาไทย ทำยังไงค่ะ เพราะ ตอนนี้เอาCode ไปวางมันออกมา สองภาษา อะค่ะ ต้องไปตั้งค่า ตรงไหนค่ะ ตั้งค่าจากตางราง customer ได้ไหมค่ะ ว่าคนนี้ invoice เขา ต้อง ยอดเงิน เป็นไทย อะไรประมาณนี้อะค่ะ รบกวนหน่อยนะค่ะ ขอบพระคุณมากๆเลยค่ะ

6 Reply in this Topic. Dispaly 1 pages and you are on page number 1

1 @R12798
สำเนารายงาน เป็น 2 สำเนา
สำเนาหนึ่งก็ให้เป็นไทย rp_Invoice_TH ทุกคำในหน้ารายงานก็เป็นไทยให้หมด ตรงที่แสดงคำอ่านค่าเงินก็เรียกใช้ฟังก์ชั่น แปลงค่าเงินไทย
อีกสำเนาก็ให้เป็น rp_Invoice_En ภาษาอังกฤษทั้งหมด ฟังก์ชั่นแปลงคำอ่านค่าเงิน ก็ให้เลือกใช้ฟังก์ชั่น คำอ่านภาษาอังฤษ

ในตารางลูกค้าก็เพิ่มฟิลด์อีกซักฟิลด์ เพื่อจะระบุว่า ลูกค้าคนนี้ ต้องใช้ Invoice ตัวไหนเป็นรายงาน
เวลาจะสั่งปริ๊นท์ ก็ใช้ if .. then .. else เอาครับ เช่น

dim Result
Result= dlookup("Report_Lang","tbCustomer","[CustomerID] ='" & me.tCustomer & "'")
if Result = "TH" then
rpName="rp_Invoice_TH"
else
rpName="rp_Invoice_EN"
end if
docmd.openreport rpName.............................อาร์กิวเมนต์อื่นๆ ก็ว่ากันไปตามจำเป็น

ส่วนฟังก์ชั่นแปลงคำอ่าน ต่างๆ สมัยผมเริ่มต้นเรียนรู้ Access ผมก็ตามเก็บจากตรงนั้นบ้างตรงนี้บ้าง จนปัจจุบันจำไม่ได้แล้วว่าเอามาจากไหน ใครเป็นคนเขียน ที่แน่ๆ ผมไม่ได้เขียนเองหรอกครับ (ต้องขออภัยที่ไม่ได้ให้เครดิตสำหรับเจ้าของฟังก์ชั่น)
ผมเก็บไว้และนำมาใช้ตลอดเท่าที่จำเป็นครับ ตามนี้เลย

Mod_WordCurrency


Function SayNo(ByVal N As Currency) As String
    Const Thousand = 1000@
    Const Million = Thousand * Thousand
    Const Billion = Thousand * Million
    Const Trillion = Thousand * Billion

    If (N = 0@) Then SayNo = "Zero": Exit Function

    Dim Buf As String: If (N < 0@) Then Buf = "Negative " Else Buf = ""
    Dim Frac As Currency: Frac = Abs(N - Fix(N))
    If (N < 0@ Or Frac <> 0@) Then N = Abs(Fix(N))
    Dim AtLeastOne As Integer: AtLeastOne = N >= 1

    If (N >= Trillion) Then
        Buf = Buf & SayNoDigitGroup(Int(N / Trillion)) & " Trillion"
        N = N - Int(N / Trillion) * Trillion
        If (N >= 1@) Then Buf = Buf & " "
    End If

    If (N >= Billion) Then
        Buf = Buf & SayNoDigitGroup(Int(N / Billion)) & " Billion"
        N = N - Int(N / Billion) * Billion
        If (N >= 1@) Then Buf = Buf & " "
    End If

    If (N >= Million) Then
        Buf = Buf & SayNoDigitGroup(N \ Million) & " Million"
        N = N Mod Million
        If (N >= 1@) Then Buf = Buf & " "
    End If

    If (N >= Thousand) Then
        Buf = Buf & SayNoDigitGroup(N \ Thousand) & " Thousand"
        N = N Mod Thousand
        If (N >= 1@) Then Buf = Buf & " "
    End If

    If (N >= 1@) Then
        Buf = Buf & SayNoDigitGroup(N)
    End If

    If (Frac = 0@) Then
        Buf = Buf
    ElseIf (Int(Frac * 100@) = Frac * 100@) Then
        If AtLeastOne Then Buf = Buf & " and "
        Buf = Buf & Format$(Frac * 100@, "00") & "/100"
    Else
        If AtLeastOne Then Buf = Buf & " and "
        Buf = Buf & Format$(Frac * 10000@, "0000") & "/10000"
    End If

    SayNo = Buf
End Function

Private Function SayNoDigitGroup(ByVal N As Integer) As String

    Const Hundred = " Hundred"
    Const One = "One"
    Const Two = "Two"
    Const Three = "Three"
    Const Four = "Four"
    Const Five = "Five"
    Const Six = "Six"
    Const Seven = "Seven"
    Const Eight = "Eight"
    Const Nine = "Nine"
    Dim Buf As String: Buf = ""
    Dim Flag As Integer: Flag = False

    Select Case (N \ 100)
        Case 0: Buf = "": Flag = False
        Case 1: Buf = One & Hundred: Flag = True
        Case 2: Buf = Two & Hundred: Flag = True
        Case 3: Buf = Three & Hundred: Flag = True
        Case 4: Buf = Four & Hundred: Flag = True
        Case 5: Buf = Five & Hundred: Flag = True
        Case 6: Buf = Six & Hundred: Flag = True
        Case 7: Buf = Seven & Hundred: Flag = True
        Case 8: Buf = Eight & Hundred: Flag = True
        Case 9: Buf = Nine & Hundred: Flag = True
    End Select

    If (Flag <> False) Then N = N Mod 100
    If (N > 0) Then
        If (Flag <> False) Then Buf = Buf & " "
    Else
        SayNoDigitGroup = Buf
        Exit Function
    End If

    Select Case (N \ 10)
        Case 0, 1: Flag = False
        Case 2: Buf = Buf & "Twenty": Flag = True
        Case 3: Buf = Buf & "Thirty": Flag = True
        Case 4: Buf = Buf & "Forty": Flag = True
        Case 5: Buf = Buf & "Fifty": Flag = True
        Case 6: Buf = Buf & "Sixty": Flag = True
        Case 7: Buf = Buf & "Seventy": Flag = True
        Case 8: Buf = Buf & "Eighty": Flag = True
        Case 9: Buf = Buf & "Ninety": Flag = True
    End Select

    If (Flag <> False) Then N = N Mod 10
    If (N > 0) Then
        If (Flag <> False) Then Buf = Buf & "-"
    Else
        SayNoDigitGroup = Buf
        Exit Function
    End If

    Select Case (N)
        Case 0:
        Case 1: Buf = Buf & One
        Case 2: Buf = Buf & Two
        Case 3: Buf = Buf & Three
        Case 4: Buf = Buf & Four
        Case 5: Buf = Buf & Five
        Case 6: Buf = Buf & Six
        Case 7: Buf = Buf & Seven
        Case 8: Buf = Buf & Eight
        Case 9: Buf = Buf & Nine
        Case 10: Buf = Buf & "Ten"
        Case 11: Buf = Buf & "Eleven"
        Case 12: Buf = Buf & "Twelve"
        Case 13: Buf = Buf & "Thirteen"
        Case 14: Buf = Buf & "Fourteen"
        Case 15: Buf = Buf & "Fifteen"
        Case 16: Buf = Buf & "Sixteen"
        Case 17: Buf = Buf & "Seventeen"
        Case 18: Buf = Buf & "Eighteen"
        Case 19: Buf = Buf & "Nineteen"
    End Select

    SayNoDigitGroup = Buf

End Function
Function fnThaiBaht(My_Money As Double) As String
Dim My_Input As String
Dim Str_Tmp As String
Dim TBaht1 As String
Dim TBaht2 As String
Dim TStang As String
Dim Stang As String
If InStr(Str(My_Money), ".") = 0 Then
   My_Input = LTrim(Str(My_Money))
Else
   My_Input = LTrim(Format(My_Money, "#########0.00"))
End If
If My_Money = 0 Then
   fnThaiBaht = "ศูนย์บาท"
Else
    If InStr(My_Input, ".") > 0 Then
       Str_Tmp = Mid(My_Input, 1, InStr(My_Input, ".") - 1)
        If Len(Str_Tmp) > 6 Then
            If Val(Mid(Str_Tmp, 1, 2)) < 10 Then
               TBaht1 = "หนึ่ง"
            Else
               TBaht1 = fnGetBaht(Mid(Str_Tmp, 1, Len(Str_Tmp) - 6), "2")
            End If
            TBaht1 = TBaht1 + "ล้าน"
            TBaht2 = fnGetBaht(Mid(Str_Tmp, Len(Str_Tmp) - 5), "1")
        Else
            TBaht2 = fnGetBaht(Str_Tmp, "1")
        End If
        If Len(Mid(My_Input, InStr(My_Input, ".") + 1)) = 1 Then
           Stang = Mid(My_Input, InStr(My_Input, ".") + 1) + "0"
        Else
            Stang = Str(Val(Mid(My_Input, InStr(My_Input, ".") + 1)))
        End If
        TStang = fnGetBaht(Stang, "3")
        fnThaiBaht = TBaht1 + TBaht2 + TStang
   Else
        If Len(My_Input) > 6 Then
            TBaht1 = fnGetBaht(Str(Val(Mid(My_Input, 1, Len(My_Input) - 6))), "2") + "ล้าน"
            TBaht2 = fnGetBaht(Mid(My_Input, Len(My_Input) - 5), "1")
        Else
        TBaht2 = fnGetBaht(My_Input, "1")
        End If
        fnThaiBaht = TBaht1 + TBaht2 + "ถ้วน"
    End If
End If
End Function
Function fnGetBaht(I_Str As String, Flag As String) As String
Dim N0 As String
Dim Unit As String
Dim Thai_name As String
Dim Input_Len As Integer
Dim Unit_Str As String
Dim N0_Str As String
Dim My_Num As Integer
Dim i As Integer
N0 = "หนึ่ง" + "สอง " + "สาม " + "สี่ " + "ห้า " + "หก   " + "เจ็ด " + "แปด " + "เก้า "
Unit = "สิบ " + "ร้อย " + "พัน " + "หมื่น" + "แสน " + "ล้าน "
If Val(I_Str) < 10 Then
    If Val(I_Str) > 0 Then
      Thai_name = RTrim(Mid(N0, (Val(I_Str) - 1) * 5 + 1, 5))
    End If
Else
   Input_Len = Len(I_Str)
   For i = 1 To Input_Len
       My_Num = Val(Mid(I_Str, i, 1))
       If My_Num <> 0 Then
          If i <> Input_Len Then
             Unit_Str = RTrim(Mid(Unit, (Input_Len - (i + 1)) * 5 + 1, 5))
          Else
             Unit_Str = ""
          End If
          If (Input_Len - i) + 1 = 2 And My_Num = "1" Then
              N0_Str = ""
          Else
               If (Input_Len - i) + 1 = 2 And My_Num = "2" Then
                    N0_Str = "ยี่"
               Else
                    If (Input_Len - i) + 1 = 1 And My_Num = "1" And Mid(I_Str, Len(I_Str) - 1, 1) <> "0" And Val(I_Str) <> 1 Then
                        N0_Str = "เอ็ด"
                    Else
                        N0_Str = RTrim(Mid(N0, (My_Num - 1) * 5 + 1, 5))
                    End If
               End If
           End If
          Thai_name = Thai_name + N0_Str + Unit_Str
       End If
   Next i
   End If
   If Flag = "1" Then
      fnGetBaht = Thai_name + "บาท"
   End If
   If Flag = "2" Then
      fnGetBaht = Thai_name
   End If
   If Flag = "3" Then
      fnGetBaht = Thai_name + "สตางค์"
   End If
End Function
2 @R12800
ขอบคุณมากๆๆๆๆๆ นะค่ะ คุณ yeadram ^^
3 @R12803
คุณ Yeadram ค่ะ ตอนนี้ code เป็นแบบนี้ ถ้าจะแก้เรื่องภาษา ที่คุณแนะ นำต้องแก้ code ตรงไหนค่ะ ตอนนี้ เพิ่ม ฟิล ในตารางcustomer แล้ว มี TH กับ ENG แล้ว เพิ่ม สำเนารายงาน เป็น 2 ตัว มี InvoiceTH กับ InvoiceENG อะค่ะ รบกวน อีกทีนะค่ะ ขอบคุณมากจริงๆ ค่ะ




Option Compare Database
Option Explicit

Public Enum CustomerOrderStatusEnum
    New_CustomerOrder = 0
    Invoiced_CustomerOrder = 1
    Shipped_CustomerOrder = 2
    Closed_CustomerOrder = 3
End Enum


Function CreateInvoice(OrderID As Long, Amt As Currency, InvoiceID As Long) As Boolean
    Dim rsw As New RecordsetWrapper
    If rsw.OpenRecordset("Invoices") Then
        With rsw.Recordset
            If Not rsw.AddNew Then Exit Function
            ![Order ID] = OrderID
            ![Amount Due] = Amt
            If rsw.Update Then
               .Bookmark = .LastModified
               InvoiceID = ![Invoice ID]
               CreateInvoice = True
            End If
        End With
    End If
End Function


Function IsInvoiced(OrderID As Long) As Boolean
    IsInvoiced = DCountWrapper("[Invoice ID]", "Invoices", "[Order ID]=" & OrderID) > 0
End Function


Function PrintInvoice(OrderID As Long) As Boolean
    DoCmd.OpenReport "Invoice", acViewPreview, , "[Order ID]=" & OrderID, acDialog
End Function


Function SetStatus(OrderID As Long, Status As CustomerOrderStatusEnum) As Boolean
    Dim rsw As New RecordsetWrapper
    If rsw.OpenRecordset("Orders", "[Order ID] = " & OrderID) Then
        With rsw.Recordset
            If Not .EOF Then
               .Edit
               ![Status ID] = Status
               SetStatus = rsw.Update
            End If
        End With
    End If
End Function


Function Delete(OrderID As Long) As Boolean
    Dim rsw As New RecordsetWrapper
    If rsw.OpenRecordset("Orders", "[Order ID] = " & OrderID) Then
        Delete = rsw.Delete
    End If
End Function

4 @R12805
คุณ Yeadram ค่ะ ตอนนี้ code เป็นแบบนี้ ถ้าจะแก้เรื่องภาษา ที่คุณแนะ นำต้องแก้ code ตรงไหนค่ะ ตอนนี้ เพิ่ม ฟิล ในตารางcustomer แล้ว มี TH กับ ENG แล้ว เพิ่ม สำเนารายงาน เป็น 2 ตัว มี InvoiceTH กับ InvoiceENG อะค่ะ รบกวน อีกทีนะค่ะ ขอบคุณมากจริงๆ ค่ะ




Option Compare Database
Option Explicit

Public Enum CustomerOrderStatusEnum
    New_CustomerOrder = 0
    Invoiced_CustomerOrder = 1
    Shipped_CustomerOrder = 2
    Closed_CustomerOrder = 3
End Enum


Function CreateInvoice(OrderID As Long, Amt As Currency, InvoiceID As Long) As Boolean
    Dim rsw As New RecordsetWrapper
    If rsw.OpenRecordset("Invoices") Then
        With rsw.Recordset
            If Not rsw.AddNew Then Exit Function
            ![Order ID] = OrderID
            ![Amount Due] = Amt
            If rsw.Update Then
               .Bookmark = .LastModified
               InvoiceID = ![Invoice ID]
               CreateInvoice = True
            End If
        End With
    End If
End Function


Function IsInvoiced(OrderID As Long) As Boolean
    IsInvoiced = DCountWrapper("[Invoice ID]", "Invoices", "[Order ID]=" & OrderID) > 0
End Function


Function PrintInvoice(OrderID As Long) As Boolean
เพิ่มฟังชั้น เข้าไปในนี้อะค่ะ ตามชื่อนี้ dim Result
Result= dlookup("Language","Customer","[CustomerID] ='" & me(ตรงนี้งงว่าต้องเติมอะไรค่ะ มันขึ้น error ค่ะ).tCustomer & "'")
if Result = "TH" then
rpName="rp_Invoice_TH"
else
rpName="rp_Invoice_EN"
end if
docmd.openreport rpName.....ตรงนี้เอาตามฟังชั้นข้างล่างได้ไหมค่ะ รบกวนหน่อยนะค่ะ :( ........................


    DoCmd.OpenReport "Invoice", acViewPreview, , "[Order ID]=" & OrderID, acDialog
End Function


Function SetStatus(OrderID As Long, Status As CustomerOrderStatusEnum) As Boolean
    Dim rsw As New RecordsetWrapper
    If rsw.OpenRecordset("Orders", "[Order ID] = " & OrderID) Then
        With rsw.Recordset
            If Not .EOF Then
               .Edit
               ![Status ID] = Status
               SetStatus = rsw.Update
            End If
        End With
    End If
End Function


Function Delete(OrderID As Long) As Boolean
    Dim rsw As New RecordsetWrapper
    If rsw.OpenRecordset("Orders", "[Order ID] = " & OrderID) Then
        Delete = rsw.Delete
    End If
End Function
5 @R12808
ผมก็ไม่รู้ว่าจะละเอียดไปถึงขนาดไหน ถึงจะเข้าใจ

- ที่ตาราง customer ให้เพิ่มฟิลด์ไว้ 1 ตัวเพื่อระบุว่า ลูกค้าคนนี้ ปกติจะใช้ invoice ภาษาไทยหรืออังกฤษ
คุณจะใช้ฟิลด์แบบ boolean หรือ text หรือ number ก็แล้วแต่คุณ เอาเป็นว่าก่อนจะออกรายงาน ก็ใช้ Code ไปเช็คข้อมูลตรงนั้น ว่า



Function PrintInvoice(OrderID As Long) As Boolean
if dlookup(...... อะไรก็ว่ากันไปให้รู้ว่า ลูกค้าคนนี้ หมายถึง คนที่มีรหัสเดียวกันกับชุดข้อมูลที่คุณจะพิมพ์อยู่ ณ ขณะนี้ หรือ Invoice ที่คุณกำลังจะพิมพ์ตอนนี้มันเลขที่อะไร เป็นของลูกค้าคนไหน ก็ให้เช็คของลูกค้าคนนี้แหละ ) = รูปแบบไทย then
    DoCmd.OpenReport "InvoiceTH", acViewPreview, , "[Order ID]=" & OrderID, acDialog
Else
    DoCmd.OpenReport "InvoiceEN", acViewPreview, , "[Order ID]=" & OrderID, acDialog
End if
End Function
6 @R12869
ขอบคุณมากค่ะคุณ yeadram
@ ประกาศใช้งานเว็บบอร์ดใหม่ => บอร์ดเรียนรู้ Access สำหรับคนไทย
แล้วจะใส่ลิ้งอ้างอิงมาที่โพสต์เก่านี้หรือไม่ก็ตามสะดวกครับ
Time: 0.2411s