กระทู้เก่าบอร์ด อ.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
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
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
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
- ที่ตาราง 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
Time: 0.2411s
สำเนาหนึ่งก็ให้เป็นไทย 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