ถึงท่านอาจารย์ สันติสุข ค่ะ
กระทู้เก่าบอร์ด อ.Yeadram

 16,951   91
URL.หัวข้อ / URL
ถึงท่านอาจารย์ สันติสุข ค่ะ

คำถามต่อเนื่องนะคะอาจารย์ พอดีที่หนูหายไปหนูแอบไปรับปริญญามาค่ะ
ข้อที่ 1 เรื่องการค้นหาข้อมูลจากกล่องComboค่ะ

หนูได้นำCodeที่อาจารย์ให้ไปวางตามนี้ค่ะ

Option Compare Database
Option Explicit


Sub SetDefaultShippingAddress()
    If IsNull(Me![Customer ID]) Then
        ClearShippingAddress
    Else
       
        Dim rsw As New RecordsetWrapper
        If rsw.OpenRecordset("Customers Extended", "[ID] = " & Me.Customer_ID) Then
        Me.[InvoiceNO] = DMax("[InvoiceNumber]", "[Orders]") + 1
            With rsw.Recordset
               Me![Ship Name] = ![Contact Name]
               Me![Ship Address] = ![Address]
               End With
        End If
    End If
End Sub


Private Sub cmdDeleteOrder_Click()
    If IsNull(Me![Order ID]) Then
        Beep
    ElseIf Me![Status ID] = Shipped_CustomerOrder Or Me![Status ID] = Closed_CustomerOrder Then
        MsgBoxOKOnly CannotCancelShippedOrder
    ElseIf MsgBoxYesNo(CancelOrderConfirmPrompt) Then
        If CustomerOrders.Delete(Me![Order ID]) Then
            MsgBoxOKOnly CancelOrderSuccess
            eh.TryToCloseObject
        Else
            MsgBoxOKOnly CancelOrderFailure
        End If
    End If
End Sub


Private Sub cmdClearAddress_Click()
    ClearShippingAddress
End Sub


Private Sub ClearShippingAddress()
    Me![Ship Name] = Null
    Me![Ship Address] = Null
    Me![Ship City] = Null
    Me![Ship State/Province] = Null
    Me![Ship ZIP/Postal Code] = Null
    Me![Ship Country/Region] = Null
End Sub


Private Sub cmdCompleteOrder_Click()
    If Me![Status ID] <> Shipped_CustomerOrder Then
        MsgBoxOKOnly OrderMustBeShippedToClose
    ElseIf ValidateOrder(Closed_CustomerOrder) Then
        Me![Status ID] = Closed_CustomerOrder
        eh.TryToSaveRecord
        MsgBoxOKOnly OrderMarkedClosed
        SetFormState
    
    End If
End Sub


Private Sub cmdCreateInvoice_Click()
    Dim OrderID As Long
    Dim InvoiceID As Long

    OrderID = Nz(Me![Order ID], 0)
    
    ' Gracefully exit if invoice already created
    If CustomerOrders.IsInvoiced(OrderID) Then
        If MsgBoxYesNo(OrderAlreadyInvoiced) Then
       
        CustomerOrders.PrintInvoice Me.Customer_ID, OrderID
       
        End If
    ElseIf ValidateOrder(Invoiced_CustomerOrder) Then
       
        ' Create Invoice Record
        If CustomerOrders.CreateInvoice(OrderID, 0, InvoiceID) Then
            
            ' Mark all Order Items Invoiced
            ' Need to change Inventory Status to SOLD from HOLD
            Dim rsw As New RecordsetWrapper
            With rsw.GetRecordsetClone(Me.sbfOrderDetails.Form.Recordset)
               While Not .EOF
                    If Not IsNull(![Inventory ID]) And ![Status ID] = OnHold_OrderItemStatus Then
                        rsw.Edit
                        ![Status ID] = Invoiced_OrderItemStatus
                        rsw.Update
                        Inventory.HoldToSold ![Inventory ID]
                    End If
                    rsw.MoveNext
               Wend
            End With
            
            ' Print the Invoice
          CustomerOrders.PrintInvoice Me.Customer_ID, OrderID

       
            SetFormState
        End If
    End If
End Sub



Private Sub cmdShipOrder_Click()
    If Not CustomerOrders.IsInvoiced(Nz(Me![Order ID], 0)) Then
        MsgBoxOKOnly CannotShipNotInvoiced
    ElseIf Not ValidateShipping() Then
        MsgBoxOKOnly ShippingNotComplete
    Else
        Me![Status ID] = Shipped_CustomerOrder
    
        If IsNull(Me![Shipped Date]) Then
            Me![Shipped Date] = Date
        End If
        eh.TryToSaveRecord
        SetFormState
    End If
End Sub


Private Sub Customer_ID_AfterUpdate()
    Me.sbfOrderDetails.Form.[Product ID].RowSource = "SELECT Inventory.[Product ID], Inventory.[Product Code], Inventory.[Qty Available] from Inventory where [Product Code] like '*" & Customer_ID & "*'"

    SetFormState False
    If Not IsNull(Me![Customer ID]) Then
        SetDefaultShippingAddress
    End If
End Sub
Private Sub Customer_ID_Current()
     If Not Me.NewRecord Then
       Me.sbfOrderDetails.Form.[Product ID].RowSource = "SELECT Inventory.[Product ID], Inventory.[Product Code], Inventory.[Qty Available] from Inventory where [Product Code] like '*" & Customer_ID & "*'"

     End If
End Sub



Private Sub Customer_ID_KeyUp(KeyCode As Integer, Shift As Integer)

    Me.Customer_ID.RowSource = "SELECT [ID], [Company], [Address For Ship], [ID] FROM [Customers Extended]where [Company], [Address For Ship], [ID] like '*" & Me.Customer_ID.Text & "*' order by [Company], [Address For Ship]"
    Me.Customer_ID.Dropdown
End Sub


Private Sub Form_Current()
    
    SetFormState
   
End Sub


Private Sub Form_Load()
    SetFormState
End Sub


Function GetDefaultSalesPersonID() As Long
    GetDefaultSalesPersonID = GetCurrentUserID()
End Function

Function ValidateShipping() As Boolean
   If Nz(Me![Shipping Fee]) = "" Then Exit Function
    ValidateShipping = True
End Function

Function ValidatePaymentInfo() As Boolean
    If IsNull(Me![Payment Type]) Then Exit Function
    If IsNull(Me![Paid Date]) Then Exit Function
    
    ValidatePaymentInfo = True
End Function


Sub SetFormState(Optional fChangeFocus As Boolean = True)
    If fChangeFocus Then Me.Customer_ID.SetFocus
    Dim Status As CustomerOrderStatusEnum
       
    Status = Nz(Me![Status ID], New_CustomerOrder)

    TabCtlOrderData.Enabled = Not IsNull(Me![Customer ID])
    Me.cmdCreateInvoice.Enabled = (Status = New_CustomerOrder)
    
    Me.cmdShipOrder.Enabled = (Status = New_CustomerOrder) Or (Status = Invoiced_CustomerOrder)
   
    Me.cmdDeleteOrder.Enabled = (Status = New_CustomerOrder) Or (Status = Invoiced_CustomerOrder)
    Me.cmdCompleteOrder.Enabled = (Status <> Closed_CustomerOrder)
    
    
    Me.[Order Details_Page].Enabled = (Status = New_CustomerOrder)
    Me.[Shipping Information_Page].Enabled = (Status = New_CustomerOrder)
    Me.[Payment Information_Page].Enabled = (Status <> Closed_CustomerOrder)
    
    Me.Customer_ID.Locked = (Status <> New_CustomerOrder)
    Me.Employee_ID.Locked = (Status <> New_CustomerOrder)
    Me.sbfOrderDetails.Locked = (Status <> New_CustomerOrder)

End Sub


Function ValidateOrder(Validation_OrderStatus As CustomerOrderStatusEnum) As Boolean
    If IsNull(Me![Customer ID]) Then
        MsgBoxOKOnly MustSpecifyCustomer
    ElseIf IsNull(Me![Employee ID]) Then
        MsgBoxOKOnly MustSpecifySalesPerson
    ElseIf Not ValidateShipping() Then
        MsgBoxOKOnly ShippingNotComplete
    Else
        If Validation_OrderStatus = Closed_CustomerOrder Then
            If Not ValidatePaymentInfo() Then
               MsgBoxOKOnly PaymentInfoNotComplete
               Exit Function
            End If
        End If

        Dim rsw As New RecordsetWrapper
        With rsw.GetRecordsetClone(Me.sbfOrderDetails.Form.Recordset)
            ' Check that we have at least one specified line items
            If .RecordCount = 0 Then
               MsgBoxOKOnly OrderDoesNotContainLineItems
            Else
               ' Check all that all line items have allocated inventory
               Dim LineItemCount As Integer
               Dim Status As OrderItemStatusEnum
               LineItemCount = 0
               While Not .EOF
                    
                    LineItemCount = LineItemCount + 1
                    Status = Nz(![Status ID], None_OrderItemStatus)
                    If Status <> OnHold_OrderItemStatus And Status <> Invoiced_OrderItemStatus Then
                        MsgBoxOKOnly MustBeAllocatedBeforeInvoicing
                        Exit Function
                    End If
                    rsw.MoveNext
               Wend
                                        
               ValidateOrder = True
            End If
        End With
    End If
End Function


ผลที่ได้คือเวลาพิมหาแล้วขึ้นกล่องว่าเปล่าค่ะ

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

1 @R13740
หนูได้ใส่ข้อมูลตามนี้นะคะ



และถ้าเราไม่พิมพ์อะไรในช่องกล่องก็จะขึ้นแบบนี้ค่ะ



รบกวนอาจารย์ช่วยแนะนำหน่อยค่ะ พอหนูกดค้นหาไปก็ว่างเปล่าเลยค่ะ
ขอบพระคุณค่ะ
2 @R13741
ภาพเล็กมาก รบกวนอาจารย์เปิดจากlinkนะคะ
3 @R13742
Private Sub Customer_ID_KeyUp(KeyCode As Integer, Shift As Integer)

    Me.Customer_ID.RowSource = "SELECT [ID], [Company], [Address For Ship], [ID] FROM [Customers Extended]where [Company], [Address For Ship], [ID] like '*" & Me.Customer_ID.Text & "*' order by [Company], [Address For Ship]"
    Me.Customer_ID.Dropdown
End Sub

ถ้าเราจะค้นจาก ID เท่านั้น ส่วนที่เป็นสีแดงจะไม่มีนะครับ มันผิด syntax และหน้าคำว่า "where" ต้องมีช่องว่างคั่นนะครับ ก็จะเป็น

FROM [Customers Extended] where

แต่ถ้าต้องการค้นจากทั้ง 3 ฟิลด์ ก็ต้องเขียนเป็น

... where ([Company] like '*" & Me.Customer_ID.Text & "*') or ([Address For Ship] like '*" & Me.Customer_ID.Text & "*') or ([ID] like '*" & Me.Customer_ID.Text & "*' order by ...

ปล. ช่วงนี้ บางทีอาจตอบช้าหน่อยนะครับ
4 @R13743
แก้ไขเป็น

... where ([Company] like '*" & Me.Customer_ID.Text & "*') or ([Address For Ship] like '*" & Me.Customer_ID.Text & "*') or ([ID] like '*" & Me.Customer_ID.Text & "*') order by ...
5 @R13744
แล้วเรื่องเลือกพิมพ์เป็นภาษาไทย/อังกฤษ ถ้ายังทำไม่ได้ เอาโค้ดของ

Function PrintInvoice( .....

มาให้ดูหน่อยครับ
6 @R13747
รายงานผลค่ะ ค้นหาได้แล้วค่ะอาจารย์ ขอบพระคุณค่ะ

เรื่องภาษาเริ่มกันใหม่อีกรอบนะคะ

หนูสร้างฟิลด์ชื่อว่าLanguageไว้ที่ตารางcustomerนะคะกำหนดเป็น2ค่าคือ TH,ENG และ เขียนfunction print invoice ไว้ที่moduls customerorder

Function PrintInvoice(Customer_ID As String, OrderID As Long) As Boolean
Dim Result
Result = dlookup("[Language]", "Customers", "[Customer ID]='" & Customer_ID & "'")
If Result = "TH" Then
DoCmd.OpenReport "InvoiceTH", acViewPreview, , "[Order ID]=" & OrderID, acDialog
Else
DoCmd.OpenReport "InvoiceEN", acViewPreview, , "[Order ID]=" & OrderID, acDialog

End If

End Function



ทำยังไงๆก็ออกมาเป็นreportภาษาไทยค่ะ แล้วหนูก็เอาคำว่าcustomer_ID ไปใส่ไว้ที่ form orderdetail แล้วนะคะ


Private Sub cmdCreateInvoice_Click()
    Dim OrderID As Long
    Dim InvoiceID As Long

    OrderID = Nz(Me![Order ID], 0)
    
    ' Gracefully exit if invoice already created
    If CustomerOrders.IsInvoiced(OrderID) Then
        If MsgBoxYesNo(OrderAlreadyInvoiced) Then
       
        CustomerOrders.PrintInvoice Me.Customer_ID, OrderID
       
        End If
    ElseIf ValidateOrder(Invoiced_CustomerOrder) Then
       
        ' Create Invoice Record
        If CustomerOrders.CreateInvoice(OrderID, 0, InvoiceID) Then
            
            ' Mark all Order Items Invoiced
            ' Need to change Inventory Status to SOLD from HOLD
            Dim rsw As New RecordsetWrapper
            With rsw.GetRecordsetClone(Me.sbfOrderDetails.Form.Recordset)
               While Not .EOF
                    If Not IsNull(![Inventory ID]) And ![Status ID] = OnHold_OrderItemStatus Then
                        rsw.Edit
                        ![Status ID] = Invoiced_OrderItemStatus
                        rsw.Update
                        Inventory.HoldToSold ![Inventory ID]
                    End If
                    rsw.MoveNext
               Wend
            End With
            
            ' Print the Invoice
          CustomerOrders.PrintInvoice Me.Customer_ID, OrderID

       
            SetFormState
        End If
    End If
End Sub



รบกวนท่านอาจารย์พิจารณาค่ะ
7 @R13748
อีก 2 เรื่องสุดท้ายและท้ายสุดจริงๆสำหรับงานนี้ค่ะ

1.หนูเอาไฟล์ไปลงในคอมอีกเครื่องซึ่งเครื่องนั้นเป็นaccess v.ภาษาอังกฤษค่ะ ทำให้ยอดเงินที่เป็นภาษาไทยกลายเป็นภาษาต่างดาวซึ่งหนูเคยแก้ไขโดยเปลี่ยนfontภาษาตรง tools>>>>option>>editor format ให้เป็นformatไทยแล้วแก้ได้แต่ครั้งนี้ ตรงส่วนcodeภาษาต่างดาวกลายเป็นภาษาไทยแล้ว แต่ว่าหน้าreportยังคงออกมาเป็นภาษาต่างดาวอีก อาจารย์มีวิธีแก้ไหมคะ ครั้งแรกทำได้แต่ครั้งนี้แก้แล้วทำไมยังเป็นอยู่ไม่แน่ใจว่าสาเหตุเกิดจากตรงไหนอะค่ะ

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



ขอบพระคุณมากๆนะคะ ท่านอาจารย์
8 @R13749
เรื่องรายงานดูแล้วก็ไม่น่าจะมีอะไรผิด คุณลองใส่คำสั่งเพื่อให้โชว์ค่าของ Result ออกมาหน่อย โค้ดจะเป็น

Result = dlookup("[Language]", "Customers", "[Customer ID]='" & Customer_ID & "'")
Msgbox "Result = " & Result
If Result = "TH" Then

แล้วลองสั่งพิมพ์ลูกค้าที่จะให้พิมพ์เป็นภาษาอังกฤษดูครับ ว่า Msbox จะแสดงคำว่าอะไรออกมา

------------------------------------

พูดถึงใน VB Editor ก่อนนะครับ ... แม้ตัวอักษรที่ปรากฏใน VB Editor จะอ่านไม่ออกเพราะใช้ font ผิด แต่เนื่องจากเราเอาไฟล์ที่เดิมโค้ดของมันเขียนด้วย font ภาษาไทย ดังนั้นรหัสของภาษาไทยจะยังติดไปกับโค้ดนั้นด้วย

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

------------------------------------

ที่ OnClick event procedure ให้เขียนโค้ดลักษณะเดียวกันกับการหาค่าของฟิลด์ [Language] เพื่อเลือกพิมพ์รายงานครับ

    If InputBox("ป้อนรหัสผ่าน") <> DLookup("ฟิลด์รหัสผ่าน", "เทเบิลรหัสผ่าน", "เงื่อนไข'") Then
        ' รหัสผ่านไม่ถูกต้อง จะทำอะไรก็ว่าไป
    End If
9 @R13750
รับทราบค่ะ กำลังนำไปแก้ไขค่ะ
10 @R13752
สั่งปริ้นลูกค้าที่เป็นภาษาอังกฤษแล้วค่ะ แต่msgboxขึ้นมาบอกว่า result = TH ค่ะ :(
11 @R13754
ก็แปลว่าลูกค้ารายนั้น คุณกำหนดเป็น TH

เช็คดีๆครับว่าใส่อะไรในเทเบิลผิดหรือเปล่า โค้ดไม่น่าผิดอะไรแล้ว น่าจะเส้นผมบังภูเขานะ
12 @R13755
อาจารย์คะcode bathtext หนูยังคงเป็นภาษาต่างดาวด้วยค่ะ :(
13 @R13756
14 @R13757
ทำได้แล้วค่ะขอบพระคุณมากค่ะอาจารย์

เรื่องReportภาษาหนูเปลี่ยนค่าเป็นENแทบจะทั้งหมดแต่resultก็ยังคง=TH อยู่ดีไม่ทราบว่าไปจดจำค่ามาจากส่วนไหนหรือเปล่าอะค่ะ เพราะตารางLanguageหนูให้รับค่ามาจากform new customer เกี่ยวไหมค่ะ? เวลาเพิ่มลูกค้าใหม่หนูให้ลงว่าลูกค้าคนนี้ใช้ภาษาอะไรอะค่ะ แล้วค่านั้นค่อยส่งไปที่ตารางLanguage

แต่ว่าหนูลองสร้างตารางใหม่มาแล้วเพิ่มค่าลงไปเอง ก็ไม่ได้อยู่ดีค่ะ กลายเป็นว่าผลที่ออกมาคือ Result = ว่างเปล่า งงสุดๆค่ะอาจารย์ ระหว่างนี้หนูจะพยายามหาวิธีต่อไป ขอบพระคุณค่ะ
15 @R13758
Updateค่ะ อาจารย์คะหนูลองเปลี่ยนเป็น EN หมดเลย Result = EN แล้วค่ะ แต่พอหนูเปลี่ยน ลูกค้า1คนเป็น TH ตรงresult ก็ดันกลายเป็น EN ถ้าอย่างงี้เกี่ยวกับปริมาณของEN ที่มากกว่าเลยหาEN เจอหรือเปล่าค่ะ
16 @R13759
หนูค้นพบว่าคำสั่งที่ค้นหาอะค่ะจารย์ จะ result ออกมา เท่ากับลูกค้าคนแรก!!! ถ้าคนแรกหนูใส่ EN result ก็จะ = EN ตลอด แต่ถ้าใส่ TH result ก็จะ = TH ตลอด
17 @R13760
ถ้าเทเบิล Customers ลิงค์มาจากฐานข้อมูลอื่นอีกทีนึง แน่ใจหรือไม่ว่ามาจากฐานข้อมูลที่ถูกต้อง

แน่ใจนะว่าฟิลด์ [Language] อยู่ในเทเบิล Customers ไม่ใช่เทเบิล [Customers Extended]

ฟิลด์ Customer_ID ในเทเบิล Customers มี data type เป็นอะไร (Text, AutoNumber, Integer, Long)

ใน VB Editor ให้คุณกด Ctrl-G เพื่อเปิด Immediate Window แล้วป้อนคำสั่ง
? Dlookup("ฟิลด์ชื่อลูกค้า หรือฟิลด์อื่นๆที่ไม่ใช่ฟิลด์ [Language]", "Customers", "[Customer ID] = '30'") มันควรให้คำตอบเป็นของ รร.มณเฑียร ใช่หรือไม่
18 @R13761
หนูเปลี่ยน code เป็น

Function PrintInvoice(Customer_ID As String, OrderID As Long) As Boolean
Dim Result
Result = dlookup("[First Name]", "Customers", "[Customer ID]='" & Customer_ID & "'")
MsgBox "Result = " & Result
If Result = "TH" Then
DoCmd.OpenReport "InvoiceTH", acViewPreview, , "[Order ID]=" & OrderID, acDialog
Else
DoCmd.OpenReport "InvoiceEN", acViewPreview, , "[Order ID]=" & OrderID, acDialog

End If

End Function


เลือกชื่อลูกค้าคนนึง ผลออกมาเป็นอีกคนนึง ผลออกมาก็คือชื่อลูกค้าคนแรกเท่านั้นอะค่ะ
19 @R13762
หนูกด Ctrl-G แล้วป้อนคำสั่ง
Dlookup("ฟิลด์ชื่อลูกค้า หรือฟิลด์อื่นๆที่ไม่ใช่ฟิลด์ [Language]", "Customers", "[Customer ID] = '30'") มันออกมาเป็นตามรูปค่ะ

20 @R13763
ต้องมีเครื่องหมายคำถามด้วยครับ

? Dlookup(...
@ ประกาศใช้งานเว็บบอร์ดใหม่ => บอร์ดเรียนรู้ Access สำหรับคนไทย
แล้วจะใส่ลิ้งอ้างอิงมาที่โพสต์เก่านี้หรือไม่ก็ตามสะดวกครับ
Time: 0.2800s