รบกวนถามเรื่อง เก็บข้อมูลทั้งหมดครับ
กระทู้เก่าบอร์ด อ.Yeadram

 2,728   10
URL.หัวข้อ / URL
รบกวนถามเรื่อง เก็บข้อมูลทั้งหมดครับ

จากการค้นหาที่
http://www.thai-access.com/yeadram_view.php?topic_id=586

ซึ่งผมนำมาใช้แล้ว มันจะทำได้ทีละฟิล์ดที่ เรคคอร์ดในฟอร์ม(FmProduct)ที่โฟกัสอยู่

ภาพที่1.แสดงตัวอย่างที่ทำแล้ว เปลี่ยน1เรคคอร์ด



ภาพที่2.เข้าเปดูในเทเบิ้ลที่ให้เปลี่ยน ถูกเปลี่ยนไปจริง



โค๊ตที่ปุ่มที่ใช้
Dim sql As String
sql = "Update TbProduct Set BringPIS = " & Me.InStock & " where ProductID = '" & Me.ProductID & "';"
CurrentProject.Connection.Execute sql

หากผมต้องการแก้ให้เปลี่ยน หรือปรับปรุงใน Tabelชื่อTbProduct ฟิล์ดBringPIS(สินค้าคงเหลือยกมา)ทั้งหมด ตามProductIDทุกRecord โดยใช้ฟอร์ม หรือวิธีใดๆก็ได้ โปรดแนะนำด้วยนะครับ

-เพิ่มเติม ฟอร์มที่เปิดตามตัวอย่าง เป็นการใช้รวมผลลัพธ์จาก QrOrderDetailครับ คล้ายๆไฟล์ stocktest ที่เคยโฟลกในเว็บนี้ครับ

ขอบคุณครับ

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

1 @R04649
ไปสร้างคิวรี่ใหม่ ไม่ต้องทำในฟอร์ม (เพราะมันจะใช้ Me. ไม่ได้ การใช้ Me. เป็นการระบุถึงข้อมูลในเรคคอร์ดเดียว คือเรคคอร์ดที่เคอร์เซอร์อยู่เท่านั้น ดังนั้นมันจึงอัพเดตได้แค่ที่ละรายการ)
ในคิวรี่อันใหม่ก็เขียนประมาณนีครับ แล้วสั่งรันได้เลย

Update TbProduct Set BringPIS = [ชื่อฟิลด์สินค้าขาเข้า] - [ชื่อฟิลด์สินค้าขาออก];
2 @R04651
ขอบคุณครับผม
ตอนนี้ผมทำแล้ว แต่ปรากฏว่าไม่เปลี่ยนแปลงครับ ไม่ทราบว่าเกี่ยวกับว่า ผมไม่มีชื่อฟิลด์สินค้าขาเข้า และ ชื่อฟิลด์สินค้าขาออก ในTableProductหรือเปล่า เพราะฟอร์มที่แสดงในรูปที่1 ใช้Queryชื่อG_Qr_Product_Show_Stock_All

ซึ่งมีฟิล์ดคำนวนInBQuantity: (select sum(BQuantity) from TbOrderDetail where ProductID = TbProduct.ProductID And OrderBuild = 'บิลดี')

และฟิล์ดคำนวนOutQuantity: (select sum(Quantity) from TbOrderDetail where ProductID = TbProduct.ProductID And OrderBuild = 'บิลดี')

นำมาลบกันแล้วเท่ากับ ฟิล์ดคำนวนInStock: ([InBQuantity]-[OutQuantity])

ซึ่งฟิล์ดดังกล่าวเป็นฟิล์ดที่ดังผลรวมข้อมูลมาลบกันในQueryครับ ส่วนในTableProductไม่มีฟิล์ดเหล่านี้เลยครับ

ตอนนี้ผมใช้แบบนี้ครับ
Update TbProduct Set BringPIS = [InBQuantity] - [OutQuantity];
แล้วสั่งRun ขึ้นParameterตามรูปครับ

รูปที่1


รูปที่2


ผมเลยลองใหม่ ให้ไปดึงจากTbOrderDetailมาครับ
Update TbProduct Set BringPIS = (select sum(BQuantity) from TbOrderDetail where ProductID = TbProduct.ProductID And OrderBuild = 'บิลดี')-(select sum(Quantity) from TbOrderDetail where ProductID = TbProduct.ProductID And OrderBuild = 'บิลดี')
แล้วสั่งRun ขึ้นParameterตามรูปครับ

รูปที่3


ไม่ทราบว่าต้องแก้ไขอย่างไรครับอาจารย์
3 @R04657
มันอัพเดตโดยคิวรี่ไม่ได้แล้วละครับ ถ้าเป็นอย่างนี้ เพราะยอดรวมของขาเข้าหรือขาออก มันมาจากคิวรี่ ซึ่งมีการใช้ Group By

คิวรี่ที่มีการใช้ Group by หรือ Having มันจะเป็นคิวรี่ที่ไม่สามารถใช้ Update ได้ครับ ต้องเขียนเป็นฟังก์ชันเอาครับ เขียนไว้ในโมดูล เรียกใช้จากปุ่มคำสั่งหรือจากเมนูที่สร้างเอง

แต่ในเมื่อคุณ BenTen สามารถดูยอดคงเหลือได้จากคิวรี่แล้ว (G_Qr_Product_Show_Stock_All) ผมไม่เห็นความจำเป็นที่จะต้องมีฟิลด์ InStock ในตารางสินค้าอีกนะครับ แต่ก็เอาเถอะในเมื่ออยากสร้างก็ต้องลำบากมาคอย อัพเดตมันละครับ   การอัพเดตแต่ละครั้งอาจใช้เวลาพอสมควรนะครับ คุณอาจะตั้งชื่อปุ่มหรือชื่อเมนูว่า "คำนวนยอดสินค้าคงเหลือใหม่"

Function UpdateStockOnHand()
dim Rs as new adodb.recordset
dim Conn as new adodb.connection

screen.mousepointer=11
set Conn = Currentproject.connection

Rs.open "G_Qr_Product_Show_Stock_All",conn,1
if rs.eof and rs.bof then goto exx
do while not rs.eof
Conn.execute "Update TbProduct Set BringPIS = " & RS("InBQuantity") - RS("OutQuantity") & " Where tbProduct.ProductID ='" & RS("ProductID") & "';"
rs.movenext
loop

Msgbox "Update Stock Completed"

exx:
if rs.state<>0 then
rs.close
set rs=nothing
set Conn=nothing
end if
Screen.mousepointer=0
End Function

4 @R04659
ขอบคุณมากครับอาจารย์
ผมกำลังคิดว่าอยากจะลองหาวิธี เก็บงานก่อนจะ Backup น่ะครับ
แต่ไม่ทราบว่าจะสามารถทำได้หรือเปล่า จะได้สะดวกตอนเริ่มใช้ใหม่น่ะครับ
เดี๋ยวจะลองทำดูครับ ขอบพระคุณครับ
5 @R04660
รบกวนอีกครั้งครับ
ผมสลับตรงเครื่องหมายฟันหนู และอื่นๆ อยู่นานครับ ไม่ทราบว่าผมพิมพ์ผิดตรงไหนหรือเปล่าครับ มันขึ้นตัวแดงตลอดเลย โดยเฉพาะ Where ครับ
6 @R04665
ผมพิมพ์ผิดไปแต่แรก ครับ แก้ให้แล้วรอบหนึ่ง ลองดูอีกทีหรือยังครับ
7 @R04668
ขอบคุณมากครับ
โค๊ตนี้เป็นฟังชั่น ผมเลยไปเขียนไว่ใน Module ชื่อ Mod_Update_KeepPIS
ไม่ทราบว่าผมต้องเขียน Event Onclickที่ปุ่ม ว่าอย่างไรครับ

หอดีผมลองไปใส่ที่ปุ่มแล้วคลิ๊ก มันยังไม่ได้ครับ แต่ตัวหนังสือไม่แดงแล้วครับ

8 @R04675
ลองไล่ Debug ดูครับ
- เบรคบรรทัดคำสั่ง Screen.Mouse.... ไว้ก่อนก็ดีครับ
- ใต้คำสั่ง Rs.Open... ลองให้มี msgbox เช็คจำนวนเรคคอร์ดว่ามีมาหรือไม่
- ตรวจสอบให้แน่ใจว่า ในคิวรี่ที่ดึงมา (G_Qr_Product_Show_Stock_All) มีฟิลด์ต่อไปนี้หรือไม่; InBQuantity, OutQuantity, ProductID
- ลอง Mark จุดให้โค๊ดมันเบรคตัวเองที่คำสั่ง RS.MoveNext เมื่อสั่งรันแล้ว ดูว่ามันเบรคตรงนั้นหรือไม่
    ถ้าไม่ แสดงว่ามันไม่ได้เข้าทำงานในลูป ต้องย้อนเช็คเรื่อง จำนวนรายการในคิวรี่
    ถ้ามันเบรค ให้ลองเอาเม้าส์พ้อยเตอร์วางแถวๆ ค่าตัวแปรแต่ละตัว ดูว่า VBA มันขึ้น Tooltips มาเป็นค่าที่ถูกต้องหรือไม่

หาสาเหตุที่แท้จริงให้เจอ แล้วแก้ไปทีละเปลาะครับ
9 @R04678
ครับเดี๋ยวผมลองไล่ดูครับ ขอบพระคุณอาจารย์มากครับ ที่สละเวลาเขียนโค๊ตตัวอย่างมาแนะนำครับผม
10 @R04686
ได้แล้วครับอาจารย์
เนื่องจากผมใช้ Access2007 จึงต้องไปเปิดใช้ ActiveXด้วยครับ รูปประมาณนี้ครับ


และโค๊ต

Private Sub Command152_Click()
Beep
On Error Resume Next
Dim Rs As New ADODB.Recordset
Dim Conn As New ADODB.Connection

Screen.MousePointer = 11
Set Conn = CurrentProject.Connection

Rs.Open "Qr_Product_Show_Stock_All", Conn, 1
If Rs.EOF And Rs.BOF Then GoTo exx
Do While Not Rs.EOF
Conn.Execute "Update TbProduct Set BringPIS = " & Rs("InBQuantity") - Rs("OutQuantity") & " Where TbProduct.ProductID ='" & Rs("ProductID") & "';"
Rs.MoveNext
Loop

MsgBox "Update Stock Completed"

exx:
If Rs.state <> 0 Then
Rs.Close
Set Rs = Nothing
Set Conn = Nothing
End If
Screen.MousePointer = 0

End Sub

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