กระทู้เก่าบอร์ด อ.Yeadram
68,149 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
ผลที่ได้คือเวลาพิมหาแล้วขึ้นกล่องว่าเปล่าค่ะ
ข้อที่ 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
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 ไปนะคะ ขอบคุณค่ะ
แน่ใจนะว่าฟิลด์ [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 ครับ ยังไงลองแก้ตามนี้ก่อน ถ้าไม่ได้ก็ค่อยส่งไฟล์มาทางเมล์อีกที
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 ?!?
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
คำตอบ
- ในคอมโบบ็อกซ์ 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)
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 ไม่ขึ้นเลย หายไปเลยเหมือนรูปซ้ายอะค่ะ
แล้วคะ แต่ในฟอร์มไม่ขึ้นก็ยังคงเป็น 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 เว้นว่างไว้)
หมายเหตุ : บอกได้คำเดียวว่าออกแบบฐานข้อมูลได้สับสนมากครับ การตั้งชื่อฟิลด์ก็มีการใช้สัญญลักษณ์และช่องว่าง รวมทั้งมีภาษาไทยเข้ามาปนด้วย แม้ว่าระบบจะทำได้ แต่ก็ไม่ควรทำครับ
- ใน 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 และซับซ้อนมากๆ รวมถึงคนที่ต้องใช้โปรแกรมนี้ ก็ อายุเยอะ เขาต้องการโปรแกรมที่ คล้ายๆโปรแกรมเก่าซึ่ง ทำได้ยากมากทำให้หนูต้องแก้ไปแก้มาให้คล้ายกับโปรแกรมเดิมมากที่สุด ค่ะ แก้จาก โปรแกรมที่ได้ออกแบบมาเสร็จแล้ว ให้จุกจิกๆ ราคาลดบ้าง ภาษาบ้าง ถ้าหนูไม่มีอาจารย์ หนูแย่แน่ๆค่ะ
ปล.ขอบพระคุณอาจารย์มากๆค่ะ ที่ช่วยเหลือ หนูตลอดมา ทางบริษัทของหนูเป็นบริษัท ที่มีสินค้าจุกจิกมาก และ ลูกค้าแต่ละคนก็ซื้อของต่างราคากัน โปรแกรมที่ใช้อยู่เป็น 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]
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
อ่อ... ขาดตกบกพร่องไปหน่อย ต้องถามว่า
คนซื้อไม่ได้ใช้ คนใช้ไม่ได้ซื้อ และคนใช้ไม่ได้อยากใช้ด้วย
คนซื้อไม่ได้ใช้ คนใช้ไม่ได้ซื้อ และคนใช้ไม่ได้อยากใช้ด้วย
Time: 0.2973s
อีกอย่าง ให้ import เฉพาะเทเบิล Customers และ [Customers Extended] เอามาใส่ในไฟล์ .mdb (format 2002-2003) แล้วส่งเข้า accboard@gmail.com