ขอวิธีการดึงข้อมูลจากตารางมาไว้ที่ฟอร์มค่ะ
กระทู้เก่าบอร์ด อ.Yeadram

 12,865   27
URL.หัวข้อ / URL
ขอวิธีการดึงข้อมูลจากตารางมาไว้ที่ฟอร์มค่ะ

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


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

1 @R11019
หลังจากที่กดปุ่มแล้วก็จะมีฟอร์มขึ้นมาอีกฟอร์มค่ะ ดังรูป




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

ส่วนที่หนูต้องการคือ จะต้องสร้างปุ่มและเขียนโค๊ดอย่างไรค่ะ ให้ดึงข้อมูลจากทั้งข้อมูลด้านบนที่ใช้สำหรับโชว์ข้อมูลของตารางที่เก็บข้อมูลของการส่งสินค้าไปแปรรูปสินค้า และข้อมูลที่กรอกข้อมูลเพิ่มทางด้านล่างของฟอร์มที่สองในรูปนี้ ไปบันทึกอยู่ในตารางใหม่ที่เตรียมไว้ได้ค่ะ ขอบคุณค่ะ
2 @R11020
ถามใหม่ค่ะ ต้องขอโทษด้วยนะคะ คำถามอาจจะไม่เคลีย หนูไปศึกษาในสิ่งที่ต้องการแล้ว จึงขอถามคำถามใหม่นะคะ



จากภาพนะคะ ฟอร์มของหนูคือ FmAccounting ฟอร์มนี้ใช้อ้างอิงข้อมูลมาจากข้อมูลของตาราง TbOutStockHistory ซึ่งเป็นตารางที่ใช้เก็บข้อมูลของการจัดส่งสินค้าให้ลูกค้าในแต่ละวันค่ะ จากรูปนะคะจะเห็นว่าฟอร์มจะเป็นลิสรายการลงมาทีละบรรทัดเรื่อยๆ และด้านหน้าของข้อมูลในแต่ละบรรทัดจะมีปุ่มอยู่ 1 ปุ่มค่ะ ปุ่มนี้หนูอยากให้การทำงานของมันคือ

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

อยากทราบว่าต้องเขียนโค๊ดอย่างไร หรือพอจะมีวิธีไหนสามารถทำได้บ้างค่ะ

3 @R11021
ใน _OnClick event procedure ของปุ่มด้านหน้า ให้ใส่โค้ด

Dim DB as DAO.Database
Dim RS as DAO.Recordset

set DB = CurrentDB
set RS = DB.OpenRecordset("TbAccoun",,dbAppendOnly)
With RS
   .AddNew
   !ชื่อฟิลด์ที่หนึ่ง = Me.ชื่อเท็กซ์บ็อกส์ของฟิลดที่หนึ่งบนหน้าฟอร์ม
   ...
   ...
   ...
   .Update
End With
RS.Close : Set RS = Nothing

แต่จะมีปัญหาต่อไปคือ ถ้าเทเบิล TbAccoun มี primary key หรือ unique key แล้วผู้ใช้คลิกที่บรรทัดเดิม 2 ครั้ง ก็จะเกิด Error ในครั้งที่ 2 ได้จากการที่ค่าคีย์ซ้ำกัน ตรงนี้คุณออกแบบไว้หรือไม่ว่าจะให้ทำอย่างไรต่อไป
4 @R11022
ขอบคุณมากค่ะ อาจารย์สันติสุข.... ในตาราง TbAccoun ของหนู หนูออกแบบไว้เพื่อนำข้อมูลเฉพาะเรคคอร์ดที่หนูต้องการมาพักไว้ค่ะ โดยที่หนูไม่ได้กำหนด primary key หรือ unique key ไว้เลยค่ะ เพราะหนูต้องการนำเรคคอร์ดเฉพาะที่หนูต้องการมาใส่ราคาขายเข้าไปเพื่อที่จะนำไปคำนวนผลออกมาในคิวรี่ค่ะ เสร็จแล้วก็จะเขียนคิวรี่ท้ายสุดไว้ลบข้อมูลเดิมในตาราง TbAccoun ออกไปเพื่อที่เตรียมรับข้อมูลใหม่เข้ามาค่ะ ปกติหนูจะใช้วิธีนี้ในการอัพเดทตาราง History ต่างๆไว้ ฟอร์มอื่นๆ หนูคีย์ข้อมูลเข้าไปปกติ แต่ฟอร์มนี้ต้องดึงข้อมูลจากตาราง History ที่เก็บไว้แล้วออกมา หนูเลยคิดว่าจะใช้วิธีนี้ทำออกมาน่ะค่ะ

ไม่ทราบว่าวิธีที่หนูทำถูกต้องไหมค่ะ และถ้าหนูไม่ได้กำหนด primary key หรือ unique key จะเกิดปัญหาการ Error ไหมค่ะ รบกวนชี้แนะด้วยค่ะ
5 @R11023
ไม่กำหนด primary key ก็ไม่เกิด error แต่ก็จะเกิดเรคอร์ดซ้ำ ดังนั้นก็คงผิดวัตถุประสงค์

โดยส่วนตัวแล้วคิดว่าควรกำหนด แล้วก็ไปเช็คจาก primary key ใน TBAccoun ก่อน ว่ามีเรคอร์ดนั้นแล้วหรือยัง ถ้ายังไม่มีก็ค่อยผ่านไปขั้นตอนการเขียนเรคอร์ดต่อไปครับ

set DB = CurrentDB
set RS = DB.OpenRecordset("Select Count(*) as Cnt from TbAccoun where [ชื่อฟิลด์ Primary Key] = " & Me..ชื่อเท็กซ์บ็อกส์ของฟิลดที่เป็น Primary Key บนหน้าฟอร์ม )   ' จุดนี้ถ้า Primary Key ประกอบไปด้วยหลายฟิลด์ คุณก็ต้องเชื่อมนิพจน์ด้วย AND ด้วย
If RS!Cnt > 0 then
   RS.Close: Set RS = Nothing
   Exit Sub
End If

set RS = DB.OpenRecordset("TbAccoun",,dbAppendOnly)
With RS
...
...
...
6 @R11028
ขอบคุณค่ะอาจารย์ เดี๋ยวหนูลองทำตามอาจารย์สันติสุขชี้แจ้งนะคะ ได้ผลประการใดจะแจ้งให้ทราบเจ้าค่ะ...
7 @R11039
เรียนอาจารย์ค่ะ...หนูลองทำตามที่อาจารย์สันติสุขชี้แนะแล้วค่ะ แต่ขึ้น ERROR ขึ้นมาค่ะ ขึ้นมาว่า   

   Compile error
   Type mismatch

อธิบายเพิ่มนะคะ หนูสร้าง primary key อยู่ด้วยกัน 4 ฟิลด์ค่ะ ได้แก่

AcCus, AcDoc, AcSto, AcBar, ค่ะ ส่วนนี่คือโค๊ดที่หนูเขียนขึ้นมาค่ะ


Private Sub Command40_Click()
Dim DB As DAO.Database
Dim RS As DAO.Recordset

Set DB = CurrentDb
Set RS = DB.OpenRecordset("Select Count(*) as Cnt from TbAccounting where [AcCus] = " & Me.OHCus) And [AcDoc] = " & Me.OHDoc)" And [AcSto] = " & Me.OHSto)" And [AcBar] = " & Me.OHBar)"    
If RS!Cnt > 0 Then
   RS.Close: Set RS = Nothing
   Exit Sub
End If

Set RS = DB.OpenRecordset("TbAccounting", , dbAppendOnly)
With RS
.AddNew
!AcCus = Me.OHCus
!AcDoc = Me.OHDoc
!AcSto = Me.OHSto
!AcBar = Me.OHBar
.Update
End With
RS.Close: Set RS = Nothing
End Sub

ไม่ทราบว่าหนูเขียนผิดตรงไหนคะ รบกวนชี้แนะด้วยค่ะ
8 @R11040
Error ตรงบรรทัดไหนช่วยบอกด้วย

ยังไงก็ตาม บรรทัดข้างล่างนี้เขียนได้มั่วดี ส่วนที่ถูกจะเป็นอย่างไรนั้นขึ้นกับประเภทของข้อมูลของทั้ง 4 ฟิลด์ที่เป็น PK (Primary Key) ช่วยบอกมาด้วยครับว่าเป็นข้อมูลประเภทไหน เช่น Text, Integer, ... เป็นต้น

Set RS = DB.OpenRecordset("Select Count(*) as Cnt from TbAccounting where [AcCus] = " & Me.OHCus) And [AcDoc] = " & Me.OHDoc)" And [AcSto] = " & Me.OHSto)" And [AcBar] = " & Me.OHBar)"

9 @R11043
ขอบคุณค่ะอาจารย์สันติสุข และต้องขออภัยด้วยค่ะที่มั่วไปหน่อย

คือขอมูลของทั้ง 4 ฟิลด์มีดังนี้ค่ะ

AcCus เป็นฟิลด์รายชื่อลูกค้าลักษณะเป็น Text ค่ะ
AcDoc เป็นฟิลด์เลขที่เอกสารค่ะลักษณะเป็น Text ค่ะ
ACSto เป็นฟิลด์โกดังสินค้าค่ะลักษณะเป็น Text ค่ะ
ACBar เป็นฟิล์บาร์โค๊ดค่ะลักษณะเป็นไฟล์ Text ค่ะ

ส่วน Error จะมีแถบสีน้ำเงินครอบที่บรรทัดนี้ค่ะ .OpenRecordset

รบกวนท่านอาจารย์ช่วยชี้แนะด้วยนะคะ
10 @R11044
เพิ่มเติมนะคะ .OpenRecordset ที่มีแถบสีน้ำเงินครอบจะอยู่ในส่วนของ

Set RS = DB.OpenRecordset("Select Count(*) as Cnt from TbAccounting where [AcCus] = " & Me.OHCus) And [AcDoc] = " & Me.OHDoc)" And [AcSto] = " & Me.OHSto)" And [AcBar] = " & Me.OHBar)"

ค่ะ (ขออภัยค่ะลืมบอกบรรทัดที่ Error ไปค่ะ)
11 @R11045
ประเภทข้อมูลที่เป็น text จะต้องถูกครอบด้วย single quote หรือ double quote ดังนั้น SQL Select statement ที่จะต้องสร้างจริงๆก็มีรูปแบบเป็น (แบบ single quote)

Select Count(*) as Cnt from TbAccounting where [AcCus] = 'ค่าของ Me.OHCus'   And [AcDoc] = 'ค่าของ Me.OHDoc'   And [AcSto] = 'ค่าของ Me.OHSto'   And [AcBar] = 'ค่าของ Me.OHBar'

พอเราต้องมาสร้างเป็นนิพจน์ของ text ก็จะได้ออกมาเป็น

Set RS = DB.OpenRecordset("Select Count(*) as Cnt from TbAccounting where [AcCus] = '" & Me.OHCus & "' And [AcDoc] = '" & Me.OHDoc & "' And [AcSto] = '" & Me.OHSto & "' And [AcBar] = '" & Me.OHBar & "' ")
12 @R11046
ขอบคุณมากเลยค่ะอาจารย์สันติสุข... ได้ตามแบบที่หนูต้องการเลยค่ะ หนูรบกวนขอถามอีกคำถามนะค่ะ ถ้าเราต้องการให้เปิดอีกฟอร์มขึ้นมาด้วยหลังจากที่ข้อมูลเข้าไปอยู่ในตาราง TbAccounting แล้ว ฟอร์มใช้ชื่อ FmAccounting02 หนูต้องเขียนโค๊ดว่าอย่างไรแล้วไปวางไว้ตำแหน่งไหนคะ
รบกวนด้วยนะคะ

13 @R11047
ถ้าหมายถึงบันทึกลง TbAccounting ปั๊ป ก็ให้เปิดฟอร์ม FmAccounting02 และแสดงเรคอร์ดที่เพิ่งบันทึกไปทันที ก็เขียนโค้ดอย่างนี้

...
...
...
RS.Close: Set RS = Nothing
DoCmd.OpenForm "FmAccounting02",,,"[AcCus] = '" & Me.OHCus & "' And [AcDoc] = '" & Me.OHDoc & "' And [AcSto] = '" & Me.OHSto & "' And [AcBar] = '" & Me.OHBar & "' "

End Sub
14 @R11048
ได้แล้วค่ะ ขอบคุณอาจารย์สันติสุขมากๆเลยค่ะที่คอยช่วยชี้แนะหนู ขอบพระคุณค่ะ
15 @R11049
ประสบปัญหาอีกแล้วค่ะ... ต้องขออภัยท่านอาจารย์สันติสุขด้วยนะคะที่รบกวนบ่อยๆ จากที่ท่านอาจารย์สันติสุขได้ชี้แนะหนูจนสามารถทำได้ตามที่หนูต้องการทุกอย่างแล้ว หลังจากนั้นหนูก็ทำตามวิธีที่อาจารย์ได้แนะนำและได้มีการเพิ่มการทำงานเข้าไปดังนี้

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

2. หนูได้ทำการเขียนคิวรี่ขึ้นมาโดยตั้งค่าเป็น"แบบสอบถามใช้ผนวกข้อมูล"โดยที่หนูตั้งค่าให้ผนวกข้อมูลจากตาราง TbAccounting ผนวกข้อมูลเข้ากับตาราง TbOutStockHistory ใช้ชื่อว่า QAccoun02 พร้อมกับสร้างมาโครขึ้นมาโดยใส่คิวรี่ QAccoun02 ไว้ในมาโครและใชชื่อว่า"RunQAcc02"   หลังจากนั้นหนูก็สร้างปุ่มขึ้นมา 1 ปุ่มบนฟอร์ม FmAccounting02 ชื่อว่าปุ่ม"บันทึก" ในปุ่มนี้หนูก็กำหนดคุณสมบัติในส่วน"เมื่อคลิ๊ก..."แล้วก็ใส่มาโคร RunQAcc02 เข้าไปค่ะ

หลังจากที่ทดลองการทำงานของปุ่มแล้วปรากฎว่า Access ไม่ยอมให้ทำการบันทึกข้อมูลเข้าตาราง TbOutStockHistory ค่ะ

หนูจึงคิดว่า ถ้าเราสร้างการทำงานโดยการที่เมื่อกดปุ่ม "บันทึกแล้ว" ให้ลบเรคคอร์ดเก่าจากตาราง TbOutStockHistory ก่อน เสร็จแล้วค่อยบันทึกเรคคอร์ดใหม่เข้าไปในตาราง TbOutStockHistory จะสามารถทำได้ไหมค่ะ ไม่ทราบว่าหนูคิดถูกหรอเปล่า หนูไม่ทราบว่าต้องเขียนโค๊ดอย่างไร รบกวนท่านอาจารย์ด้วยนะคะ ขอบคุณค่ะ
16 @R11050
1) ...หลังจากที่ทดลองการทำงานของปุ่มแล้วปรากฎว่า Access ไม่ยอมให้ทำการบันทึกข้อมูลเข้าตาราง TbOutStockHistory ค่ะ ...

ประโยคลอยๆอย่างนี้มาอีกแล้ว     "Access ไม่ยอม" มันไม่ยอมยังไง   มันมีข้อความ error อะไร หรือ error รหัสอะไร ? ลองเช็คว่ามีเรคอร์ดใน TbAccounting ที่อาจก่อให้เกิด duplicate key ใน TbOutStockHistory หรือไม่ หรือมีฟิลด์อะไรใน TbOutStockHistory ที่ต้องการข้อมูล แต่คิวรี่ไม่ได้ใส่ข้อมูลให้แก่ฟิลด์นั้นหรือไม่

2) ลบเรคคอร์ดเก่าจากตาราง TbOutStockHistory ก่อน เสร็จแล้วค่อยบันทึกเรคคอร์ดใหม่เข้าไปในตาราง TbOutStockHistory จะสามารถทำได้ไหมค่ะ

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

3) ตกลงคิวรี่ Close_Ac นี่เกี่ยวอะไรกับปัญหานี้หรือเปล่า อ่านแล้วเหมือนไม่เกี่ยว
17 @R11051
ต้องขออภัยอาจารย์ด้วยค่ะ ที่ถามคำถามลอยๆ ขอโทษด้วยค่ะ

คือพอกดปุ่มมันขึ้นฟ้องอย่างนี้ค่ะ

"โปรแกรมสต๊อกสินค้า ได้ตั้งค่า 0 เขตข้อมูลเป็น Null เนื่องจากความล้มเหลวในการแปลงชนิดและไม่ได้เพิ่ม, 1 ระเบียนไปยังตารางเนื่องจากการละเมิดของคีย์, 0 ระเบียนเนื่องจากการละเมิดการล็อก และ 0 ระเบียน เนื่องจากละเมิดกฎการตรวจสอบ" ค่ะ หนูใส่ทุกฟิลด์แล้วนะคะ ไม่ทราบว่าเพราะอะไรค่ะ

ส่วนวัตถุประสงค์จริงๆของหนูนั้นคือ ต้องการเพิ่มฟิลด์ที่ได้จากการคำนวณในคิวรี่ บันทึกลงไปเพิ่มเติมในเรคคอร์ดเดิม เนื่องจากหนูเว้นฟิลด์ที่ใส่ผลลัพท์การคำนวณไว้ค่ะ เพราะทางเจ้านายหนูต้องการให้คนคีย์ข้อมูลตัดสต๊อกสินค้า 1 คนและให้คนคีย์ข้อมูลบัญชีจากการตัดสต๊อกสินค้าในแต่ละวันอีก 1 คนค่ะ ลักษณะเป็นแบบนี้ค่ะ

คนคีย์ข้อมูลตัดสต๊อก

วันที่        เลขที่เอกสาร       บาร์โค๊ด          จำนวน        ทุน       ขาย      กำไร
21-9-54     11111               1234               50           3.2        -           -

พอคีย์เสร็จแล้วจะไปบันทึกอยู่ในตาราง TbOutStockHistory ค่ะ



คนคีย์ข้อมูลบัญชี ต้องดึงข้อมูลจากตาราง TbOutStockHistory ออกมาค่ะ

วันที่        เลขที่เอกสาร       บาร์โค๊ด          จำนวน        ทุน       ขาย      กำไร
21-9-54   11111               1234               50            3.2       4.5        65

จากตัวอย่างคนคีย์ข้อมูลบัญชีต้องดึงข้อมูลของคนคีย์ข้อมูลตัดสต๊อกออกมาเพื่อที่จะคีย์ฟิลด์ ขาย เข้าไปเพื่อที่จะให้คิวรี่ในการคำนวณผลลัพท์ในฟิลด์ กำไร ออกมาและกลับไปบันทึกในตาราง TbOutStockHistory ในส่วนของฟิลด์ ขายและกำไร ที่ยังว่างอยู่ค่ะ

เนื่องจากหนูยังไม่ค่อยเก่งทางด้านเขียน Access เท่าไร หนูจึงได้คิดวิธีออกมาในลักษณะนี้ค่ะ ส่วน Close_Ac ไม่ได้เกี่ยวข้องกันค่ะ รบกวนท่านอาจารย์ด้วยนะคะ ขอบคุณค่ะ
18 @R11052
"1 ระเบียนไปยังตารางเนื่องจากการละเมิดของคีย์" นี่แหล่ะคือสาเหตุของปัญหา ข้อความนี้บอกว่ามีการเพิ่มเรคอร์ดลงใน TbOutStockHistory แต่เรคอร์ดนั้นทำให้ค่าคีย์ PK หรือ AK (Alternate Key) อื่นๆที่เป็น Unique Key ใน TbOutStockHistory เกิดซ้ำกันอยู่ 1 เรคอร์ด นั่นแสดงว่า PK หรือ AK ใน TbOutStockHistory ไม่เหมือนกับใน TbAccounting ลองไปเช็คดูนะครับ

แต่ด้วยวัตถุประสงค์ที่จะให้ฝ่ายบัญชีป้อนข้อมูลขาย ก็ยังไม่เห็นว่าทำไมต้องแยกออกมาเป็นเทเบิล TbAccounting ทำไมไม่ป้อนลงใน TbOutStockHistory โดยตรงไปเลย เพราะยังไงเราก็กำหนดได้ว่าจะให้คิวรี่หรือฟอร์มที่ป้อน แสดงหรือไม่แสดงฟิลด์อะไรก็ได้นี่ครับ
19 @R11053
แก้เขียนผิด

แต่ด้วยวัตถุประสงค์ที่จะให้ฝ่ายบัญชีป้อนข้อมูลขาย ก็ยังไม่เห็นว่าทำไมต้องแยกออกมาเป็นเทเบิล TbOutStockHistory ทำไมไม่ป้อนลงใน TbAccounting โดยตรงไปเลย เพราะยังไงเราก็กำหนดได้ว่าจะให้คิวรี่หรือฟอร์มที่ป้อน แสดงหรือไม่แสดงฟิลด์อะไรก็ได้นี่ครับ
20 @R11059
ขอบคุณค่ะอาอารย์สันติสุข เดี๋ยวหนูจะลองทำตามที่อาจารย์แนะนำดูนะคะ ได้ผลอย่างไรจะแจ็งให้ทราบค่ะ ยอบคุณค่ะ
@ ประกาศใช้งานเว็บบอร์ดใหม่ => บอร์ดเรียนรู้ Access สำหรับคนไทย
แล้วจะใส่ลิ้งอ้างอิงมาที่โพสต์เก่านี้หรือไม่ก็ตามสะดวกครับ
Time: 0.3264s