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

 52,252   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 2

21 @R13764
และที่ผมถามไปใน (R13760) ช่วยตอบให้หมดด้วย ตอบไม่หมด ผมไม่รู้จะเอาข้อมูลที่ไหนมาวิเคราะห์แก้ปัญหาให้

อีกอย่าง ให้ import เฉพาะเทเบิล Customers และ [Customers Extended] เอามาใส่ในไฟล์ .mdb (format 2002-2003) แล้วส่งเข้า accboard@gmail.com
22 @R13765


ออกมา เป็นแบบนี้ค่ะ :(
23 @R13766

แน่ใจนะว่าฟิลด์ [Language] อยู่ในเทเบิล Customers ไม่ใช่เทเบิล [Customers Extended] >>> Language อยู่ ในทั้ง 2 Table ค่ะ Customers เป็นตาราง Customer Extended เป็น แบบสอบถามค่ะ

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


เดี๋ยวหนูส่ง mail ไปนะคะ ขอบคุณค่ะ
24 @R13767
data type เป็น AutoNumber มันจะเทียบเท่าประเภท Long ดังนั้นให้เปลี่ยนโค้ดเป็น

Result = dlookup("[Language]", "Customers", "[Customer ID]=" & CStr(Customer_ID))

ผมเน้นแล้วว่าให้ import มาเป็นไฟล์ .mdb แต่ที่ส่งมาก็ยังเป็นไฟล์ .accdb ผมไม่มี Access เวอร์ชั่น 2007-2010 ครับ ยังไงลองแก้ตามนี้ก่อน ถ้าไม่ได้ก็ค่อยส่งไฟล์มาทางเมล์อีกที
25 @R13770
รับทราบคะอาจารย์
26 @R13773
แก้ไขcodeแล้วค่ะแต่ก็ยังเป็นเหมือนเดิมค่ะ หนูส่งไฟล์เข้าmailอาจารย์ไปใหม่แล้วนะคะ ขอโทษที่กดบันทึกผิดค่ะ รอบนี้ไม่ผิดแน่นอนค่ะ
27 @R13775
ฟิลด์คุณชื่อว่า ID นี่ครับ ไม่ใช่ Customer_ID ดังนั้นโค้ดก็ควรจะเป็น ถ้าแก้ได้หล่ะก็ เส้นผมบังพระอาทิตย์เลย ไม่ใช่แค่บังภูเขา

Result = dlookup("[Language]", "Customers", "[ID]=" & CStr(Customer_ID))

ถ้ายังไม่ได้อีก ก็ไม่รู้แล้วครับ แต่ก็สงสัยว่าเมื่ออ้างถึงชื่อฟิลด์ [Customer_ID] ที่ไม่มีอยู่จริง ทำไมมันไม่แสดง error message ?!?
28 @R13776
ทำได้แล้ววววววววววววค่ะะะะะะะะ ดีใจมากเลยยยยยยยยยยยยยยยยยย ขอบพระคุณค่ะ ท่านอาจารย์ ตอนแรกหนูเคยใช้[ID]แล้ว:( มันฟ้องerror หนูเลยใช้customer id และมันไม่ฟ้อง ก็เลยเข้าใจว่าต้องใช้ตัวนี้ แต่ตอนนี้ได้แล้วค่ะ


ถ้าไม่มีอาจารย์หนูคงทำไม่ได้ ขอบพระคุณมากนะคะ
29 @R13790
อาจารย์คะ หนูมีคำถามเพิ่มอีก2 ข้อค่ะ ;( อธิบายยาก หนูเลยส่งข้อมูลเข้าเมลล์ให้อาจารย์พิจารณานะคะ ถ้าอาจารย์พอมีเวลา รบกวนเวลาท่านอาจารย์อีกหน่อยนะคะ ขอบพระคุณมากค่ะ
30 @R13796
สำหรับคนอื่นที่มาดู นี่คือคำถามนะครับ



คำตอบ

- ในคอมโบบ็อกซ์ Product ID ของฟอร์ม sbfOrderDetails ให้เปลี่ยน RowSource จาก

SELECT Inventory.[Product ID], Inventory.[Product Code], Inventory.[Qty Available] FROM Inventory ORDER BY Inventory.[Product Code];

ไปเป็น

SELECT I.[Product ID], I.[Product Code], I.[Qty Available], P.[Discount] FROM Inventory AS I INNER JOIN PRODUCTS AS P ON I.[Product Code] = P.[Product Code] ORDER BY Inventory.[Product Code]; (หวังว่าค่าใน I.[Product Code] และ P.[Product Code] คือค่าเดียวกัน ถ้าไม่ใช่ ก็ต้องเปลี่ยนเป็นฟิลด์อื่นที่มีค่าเหมือนกันๆ)

- เปลี่ยน ColumnCount จาก 3 เป็น 4

- ปรับ ColumnWidth ให้รองรับ 4 คอลัมน์ด้วยความกว้างของคอลัมน์ตามที่ต้องการ

- แล้วใน Product_ID_AfterUpdate event procedure คุณก็เอา P.[Discount] ไปแปะไว้ที่เท็กซ์บ็อกซ์ Discount ด้วยคำสั่ง
Me.Discount = Me.Product_ID.Column(3)

เอาแค่นี้ก่อน อีกคำถามไว้มีเวลาแล้วจะเข้ามาตอบอีกที

หมายเหตุ : คุณใช้ฟิลด์ที่มีประเภทข้อมูลเป็น Autonumber เป็น Primary Key ทุกเทเบิล ระวังไว้นะครับ วันนึงระบบอาจจะมีปัญหาได้ และยิ่งถ้ามีเทเบิลอื่นอ้างอิงถึงค่าของฟิลด์ Autonumber นี้ อาจมีปัญหาตามมามากในอนาคตได้ เพราะค่าในฟิลด์นี้มันอาจเปลี่ยนไปได้เมื่อเราจำเป็นต้อง import เรคอร์ดเข้าไปในเทเบิลอื่น เช่น กรณีที่ฐานข้อมูลเดิมเสียหาย

http://www.thai-access.com/suphap.php?topic_id=436
http://www.thai-access.com/yeadram_view.php?topic_id=2639
31 @R13803
รับทราบค่ะ จะนำไปดำเนินการแก้ไข ขอบพระคุณค่ะ ^^
32 @R13833
อาจารย์คะ หนูลองทำแล้ว เหมือนช่อง Discount ไม่ยอมรับค่าจากตาราง P อะค่ะ มันขึ้นแบบในรูป คือ ค่าเป็น Null และรายการใน Combo box ก็โชว์แต่ชื่อสินค้า,ID, code ที่มาจาก ตาราง I เท่านั้นค่ะ :(
33 @R13834
แก้ SQL ไปเป็น

SELECT P.[Product ID], P.[Product Code], I.[Qty Available], P.[Discount] FROM PRODUCTS AS P LEFT JOIN Inventory AS I ON P.[Product Code] = I.[Product Code] ORDER BY P.[Product Code];

แล้วแก้โค้ดเป็น

Me.Discount = Nz(Me.Product_ID.Column(3), 0)
34 @R13838
อาจารย์คะ คือ หนูเอาcodeของอาจารย์ไปใส่ในprogramแล้ว พอใส่เสร็จออกมา มันมีช่องdiscountโชว์แบบในรูปขวานะคะ แต่พอเลือกสินค้าแล้วช่องdiscountก็ยังเป็น0พอหนูเข้าไปตรวจดูในสูตรที่ฟอร์ม ก็มีตัวเลขที่หนูป้อนไว้ เช่น Me.Discount = Nz(Me.Product_ID.Column(3), 0)ตัวนี้บอกว่า=2
แล้วคะ แต่ในฟอร์มไม่ขึ้นก็ยังคงเป็น 0%

ต่อมาหนูก็ออกมาเปิดinvoiceใหม่ปรากฎว่า ช่องdiscountในproduct ID ไม่ขึ้นเลย หายไปเลยเหมือนรูปซ้ายอะค่ะ
35 @R13839
update ค่ะ ตอนนี้ พอเลือกสินค้าตัวเลขdiscountไปขึ้นที่ช่องdiscount แล้วค่ะ ติดตรงที่ พอเริ่มเปิด invoice ใหม่ ช่องdiscหายไปไม่ขึ้นตรงฟอร์ม product ID แบบรูปซ้ายค่ะ :(
36 @R13841
update 2 ค่ะ ส่วนของDiscount ทำได้หมดแล้วค่ะท่านอาจารย์ เหลือแต่ เรื่องProduct คำถามข้อที่ 2 แล้วค่ะ :)
37 @R13843
- ในคอมโบบ็อกซ์ Combo47 (คอมโบบ็อกซ์ของ Company) ให้กำหนด RowSource เป็น SELECT [ID], [Company], [Address For Ship], [Language] FROM [Customers Extended] WHERE [ID]<>Nz(Form!ID,0) ORDER BY [Company], [Address For Ship]; (เนื่องจากไม่ได้ให้โครงสร้าง [Customers Extended] มา ก็หวังว่าจะมีฟิลด์ชื่อ [Language] อยู่ในนั้น) , เปลี่ยน ColumnCount เป็น 4 , เปลี่ยน ColumnWidth ให้รองรับ 4 คอลัมน์

- ใน Private Sub Combo47_KeyUp ให้เพิ่มฟิลด์ Language เข้าไปใน SQL Statement เหมือนข้างบนด้วย

- ใน Private Sub Combo47_AfterUpdate ให้ใส่โค้ด
Me.[Product Name] = NULL
Me.[Product Code] = NULL
Call SetProductNameByLanguage

- ใน Private Sub Form_Current ให้ใส่โค้ด
If Not Me.NewRecord then Call SetProductNameByLanguage

- เพิ่ม
Private Sub SetProductNameByLanguage
If Me.Combo47.Column(3) = "TH" then
      Me.[Product Name].RowSource = "SELECT ProductName FROM ProductStandard"
Else
      Me.[Product Name].RowSource = "SELECT ProductNameENG FROM ProductStandard"
End If
End Sub

- ในคอมโบบ็อกซ์ Product Name ให้เปลี่ยน ColumnCount เป็น 1

- ส่วนช่อง Unit/Thai, Unit/Eng ผมไม่เข้าใจครับว่าต้องการอย่างไรกันแน่ ทำไมต้องมี 2 ช่องบนหน้าจอ และทั้ง 2 ช่องก็ไม่ได้ bound เข้ากับฟิลด์ใดๆเลย (ControlSource เว้นว่างไว้)

หมายเหตุ : บอกได้คำเดียวว่าออกแบบฐานข้อมูลได้สับสนมากครับ การตั้งชื่อฟิลด์ก็มีการใช้สัญญลักษณ์และช่องว่าง รวมทั้งมีภาษาไทยเข้ามาปนด้วย แม้ว่าระบบจะทำได้ แต่ก็ไม่ควรทำครับ
38 @R13844
ในช่อง unit thai กับ unit eng หนูเพิ่งสร้างขึ้นมาใหม่ ค่ะ หนูต้องการให้ เหมือนกับชื่อ code อะค่ะ ถ้าลูกค้าใช้ภาษาไทย เวลาเรา add product ชื่อ ของ product code ก็จะเป็น id ต่อด้วยชื่อสินค้าที่เป็นภาษาไทย และตรงช่องข้างล่างก็เป็น unit thai ที่รับค่ามาจากตาราง product standard เช่นเดียวกัน เมื่อเจอว่าลูกค้าเป็นอังกฤษ ตรงช่อง product code ก็จะ ขึ้น id ต่อด้วยชื่อภาษาอังกฤษ ตามด้วยช่อง unit eng เป็นภาษาอังกฤษ โดยข้อมูลทั้งหมดนี้ มาจาก product standard แค่ตัวเดียว ที่add ไว้ ทั้งชื่อ ไทย,อังกฤษ,unitthai,uniteng ค่ะ และหนูได้สร้างฟิลด์ ในตาราง Product ที่รอรับค้า unit thai , unit eng จาก form เรียบร้อยแล้วค่ะ และ ได้ สร้างtext box เพื่อนรอรับค่า ใน report thai และ reprot eng แล้ว อาจารย์ช่วยแนะนำด้วย นะคะ

ปล.ขอบพระคุณอาจารย์มากๆค่ะ ที่ช่วยเหลือ หนูตลอดมา ทางบริษัทของหนูเป็นบริษัท ที่มีสินค้าจุกจิกมาก และ ลูกค้าแต่ละคนก็ซื้อของต่างราคากัน โปรแกรมที่ใช้อยู่เป็น oracle และซับซ้อนมากๆ รวมถึงคนที่ต้องใช้โปรแกรมนี้ ก็ อายุเยอะ เขาต้องการโปรแกรมที่ คล้ายๆโปรแกรมเก่าซึ่ง ทำได้ยากมากทำให้หนูต้องแก้ไปแก้มาให้คล้ายกับโปรแกรมเดิมมากที่สุด ค่ะ แก้จาก โปรแกรมที่ได้ออกแบบมาเสร็จแล้ว ให้จุกจิกๆ ราคาลดบ้าง ภาษาบ้าง ถ้าหนูไม่มีอาจารย์ หนูแย่แน่ๆค่ะ
39 @R13849
- แก้ไขโค้ดใน Private Sub SetProductNameByLanguage ให้เป็น

If Me.Combo47.Column(3) = "TH" then
      Me.[Product Name].RowSource = "SELECT ProductName, [Unit Name /Thai] FROM ProductStandard order by ProductName""
Else
      Me.[Product Name].RowSource = "SELECT ProductNameENG, [Unit Name / Eng] FROM ProductStandard order by ProductNameENG"
End If

- ในคอมโบบ็อกซ์ [Product Name] แก้ ColumnCount กลับมาเป็น 2 และเปลี่ยน ColumnWidth ให้รองรับ 2 คอลัมน์

- แก้ไขโค้ดใน Private Sub Product_Name_AfterUpdate() ให้เป็น

Me.[Product Code] = Trim(Nz(Combo47, "") & " " & Nz(Me.[Product Name], ""))
End Sub
If Me.Combo47.Column(3) = "TH" then
   Me.[unit thai] = Me.[Product Name].Column(1)
   Me.[unit end] = NULL
Else
   Me.[unit thai] = NULL
   Me.[unit end] = Me.[Product Name].Column(1)
End If



- อะไรเอ่ย... คนซื้อไม่ได้ใช้ คนใช้ไม่ได้ซื้อ
    ตอบ ... โรงศพ และ โปรแกรมขนาด[SIZE=4]ยักษ์[SIZE=5]ใหญ่[/font][/FONT]
40 @R13851
อ่อ... ขาดตกบกพร่องไปหน่อย ต้องถามว่า

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