กระทู้เก่าบอร์ด อ.Yeadram
6,726 32
URL.หัวข้อ /
URL
ออกแบบตารางรับฝากเงิน
ใครมีประสบการในการออกแบบตารางรับฝากเงินมั่งครับ
ผมคิดได้ 2 แบบ แต่ไม่แน่ใจว่ามันจะดีไม่ดีต่างกันแบบไหน ใครมีประสบการช่วยแนะนำหน่อยครับ
วิธีแรกก็คือ ช่องจำนวนเงินเป็นฟิลด์เดียวทั้งรับฝากและถอน
วิธีที่ 2 แยกเป็นฟิลด์ฝาก กับฟิลด์ถอน
นั่งคิดอยู่พักหนึ่ง มีข้อดีข้อเสียต่างกัน แต่ ยาวๆ แล้วไม่รู้ว่าอะไรดีกว่าอะไร
ใครมีประสบการณ์ แนะนำกันหน่อยครับ
ผมคิดได้ 2 แบบ แต่ไม่แน่ใจว่ามันจะดีไม่ดีต่างกันแบบไหน ใครมีประสบการช่วยแนะนำหน่อยครับ
วิธีแรกก็คือ ช่องจำนวนเงินเป็นฟิลด์เดียวทั้งรับฝากและถอน
วิธีที่ 2 แยกเป็นฟิลด์ฝาก กับฟิลด์ถอน
นั่งคิดอยู่พักหนึ่ง มีข้อดีข้อเสียต่างกัน แต่ ยาวๆ แล้วไม่รู้ว่าอะไรดีกว่าอะไร
ใครมีประสบการณ์ แนะนำกันหน่อยครับ
32 Reply in this Topic. Dispaly 2 pages and you are on page number 2
22 @R07745
ดูในเมล์แล้ว Private Sub GenBalAmt(MemberCode As String) ส่วนสีนำ้เงินนี้คุณไม่ใส่ครับ แล้วเปลี่ยนจาก MemberCode เป็น ID_Member ด้วยนะครับ
23 @R07746
อาจารย์ครับ มันก็ยัง Error 3265:Item not found in this collection
24 @R07747
อาจารย์ครับมันยัง Error 3265:Item not found in this collection
25 @R07748
มันยัง Error 3265:Item not found in this collection
ครับอาจารย์
ครับอาจารย์
26 @R07749
มันยัง Error 3265:Item not found in this collection
ครับอาจารย์
ครับอาจารย์
27 @R07750
บรรทัด Set RS = DB.Recordsets(SQL) ผมเขียนผิด ให้เปลี่ยนเป็น Set RS = DB.OpenRecordset(SQL)
แล้วข้อมูลของคุณ ให้อ่าน RS เรียงตาม depositAcc (จาก order by depositAcc) ผมว่ามันจะแปลกหรือไม่ เพราะมันจะคำนวนรายการฝากทั้งหมดก่อน (เข้าใจว่าอย่างนั้น) แล้วค่อยไปคำนวนรายการถอนทีหลัง นอกจากนี้ยังไม่ได้กำหนดวันที่ให้เป็นฟิลด์ที่ใช้เรียงข้อมูล ดังนั้น รายการฝากหรือถอนที่อ่านมา ก็จะเรียงไม่แน่นอน แล้วแต่มันเจอรายการไหนก่อน
(ซึ่งไม่จำเป็นต้องเป็นรายการที่ป้อนก่อน) มันก็จะคำนวนก่อน วันหลังถ้าทำรายงานเพื่อดูรายการฝาก-ถอน จะเห็นยอดคงเหลือประหลาดเหมือนไม่เป็นไปตามจริงนะครับ
ถ้าจะกำหนดให้เรียงตามอะไร ก็ไปใส่หลัง order by ได้ครับ มีหลายฟิลด์ก็คั่นด้วย comma ครับ
แล้วข้อมูลของคุณ ให้อ่าน RS เรียงตาม depositAcc (จาก order by depositAcc) ผมว่ามันจะแปลกหรือไม่ เพราะมันจะคำนวนรายการฝากทั้งหมดก่อน (เข้าใจว่าอย่างนั้น) แล้วค่อยไปคำนวนรายการถอนทีหลัง นอกจากนี้ยังไม่ได้กำหนดวันที่ให้เป็นฟิลด์ที่ใช้เรียงข้อมูล ดังนั้น รายการฝากหรือถอนที่อ่านมา ก็จะเรียงไม่แน่นอน แล้วแต่มันเจอรายการไหนก่อน
(ซึ่งไม่จำเป็นต้องเป็นรายการที่ป้อนก่อน) มันก็จะคำนวนก่อน วันหลังถ้าทำรายงานเพื่อดูรายการฝาก-ถอน จะเห็นยอดคงเหลือประหลาดเหมือนไม่เป็นไปตามจริงนะครับ
ถ้าจะกำหนดให้เรียงตามอะไร ก็ไปใส่หลัง order by ได้ครับ มีหลายฟิลด์ก็คั่นด้วย comma ครับ
28 @R07757
ผลที่ได้มันไม่ตรงกับความต้องการเลยครับ
ข้อมูลคงเหลือมันไม่ได้แก้ที่เรคคอดสุดท้ายครับ มันแก้ทั้งหมด ตรงเรียงลำดับ ผมลองเรียงแล้วก็ยิ่งผิดมากกว่าเดิมอีกครับ ลองแก้ตรง SQL โดยเอาไปเปิดใน Query แล้วเอาเข้ามาใส่ใหม่มันก็ Error
ที่ถูกน่าจะเริ่มจาก กรองคนอันดับแรก แล้ว เรียงวันที่น้อยไปมาก แล้วฟิลด์คงเหลือ ก็ต้อง เท่ากับยอดยกมา(คงเหลือสุดท้าย)+ฝาก-ถอน
ซึ่งดูในสูตรของอาจารย์มันก็ถูก แต่บางบรรทัดผมไม่เข้าใจ เลยประยุคไม่ได้ครับ
ข้อมูลคงเหลือมันไม่ได้แก้ที่เรคคอดสุดท้ายครับ มันแก้ทั้งหมด ตรงเรียงลำดับ ผมลองเรียงแล้วก็ยิ่งผิดมากกว่าเดิมอีกครับ ลองแก้ตรง SQL โดยเอาไปเปิดใน Query แล้วเอาเข้ามาใส่ใหม่มันก็ Error
ที่ถูกน่าจะเริ่มจาก กรองคนอันดับแรก แล้ว เรียงวันที่น้อยไปมาก แล้วฟิลด์คงเหลือ ก็ต้อง เท่ากับยอดยกมา(คงเหลือสุดท้าย)+ฝาก-ถอน
ซึ่งดูในสูตรของอาจารย์มันก็ถูก แต่บางบรรทัดผมไม่เข้าใจ เลยประยุคไม่ได้ครับ
29 @R07758
ใช่ครับโค้ดที่ให้ไป เป็นการคำนวนยอดคงเหลือใหม่ทั้งหมดตั้งแต่เริ่มเพราะถ้าคุณแก้ไขหรือลบรายการฝาก-ถอนก่อนรายการสุดท้าย แต่โค้ดคำนวนเฉพาะยอดคงเหลือสุดท้าย มันก็จะผิด
ถ้าเรียงวันที่จากน้อยไปมาก ก็ต้องเป็น order by depositDate แต่มีคำถามว่า ในวันเดียวกัน สามารถฝากถอนได้มากกว่า 1 ครั้งหรือไม่ ถ้าได้ มีฟิลด์อะไรเป็นตัวบอกลำดับว่ารายการไหนเกิดก่อนหลัง เราก็ใช้ฟิลด์นั้นเพิ่มเข้าไป ก็จะเป็น
order by depositDate , ฟิลด์บอกลำดับ
ถ้าเรียงวันที่จากน้อยไปมาก ก็ต้องเป็น order by depositDate แต่มีคำถามว่า ในวันเดียวกัน สามารถฝากถอนได้มากกว่า 1 ครั้งหรือไม่ ถ้าได้ มีฟิลด์อะไรเป็นตัวบอกลำดับว่ารายการไหนเกิดก่อนหลัง เราก็ใช้ฟิลด์นั้นเพิ่มเข้าไป ก็จะเป็น
order by depositDate , ฟิลด์บอกลำดับ
30 @R07759
ด้วยความที่ไม่เข้าใจโคตบางตัว ก็นึกสงสัย ที่อาจจารย์ให้แก้ที่ ORDER BY
ซึ่งผมก็คิดว่า การเรียงลำดับมันจะทำให้การบวก ลบ ถูกได้ยังงัย ก็เลยเสียเวลา ลองผิดลองถูก แก้อยู่ทั้งวัน จนหมดปัญญา เลยลองมาลองดูตามที่อาจารย์บอก ดีว่าไม่ได้ทำอะไรเลย
ผมเอาฟิลด์ ไอดีซึ่งเป็น Autorun number ยังงัยมันก็เรียงจากน้อยไปมากอยู่แล้ว ผมออกมา ตามที่ต้องการเป๊ะ ขอขอบคุณอาจารย์สันติสุขมากๆ ครับ
ผมขอถามจากบทเรียนนี้อีกหน่อยนะครับ ตรง
Call GenBalAmt(Me.ID_member) กับ Call GenBalAmt มันต่างกันยังงัย
แล้วในวงเล็บคืออะไรครับ
Private Sub GenBalAmt(ID_member As String) อันนี้อีกเราใส่ในวงเล็บหมายถึงอะไรครับ
ซึ่งผมก็คิดว่า การเรียงลำดับมันจะทำให้การบวก ลบ ถูกได้ยังงัย ก็เลยเสียเวลา ลองผิดลองถูก แก้อยู่ทั้งวัน จนหมดปัญญา เลยลองมาลองดูตามที่อาจารย์บอก ดีว่าไม่ได้ทำอะไรเลย
ผมเอาฟิลด์ ไอดีซึ่งเป็น Autorun number ยังงัยมันก็เรียงจากน้อยไปมากอยู่แล้ว ผมออกมา ตามที่ต้องการเป๊ะ ขอขอบคุณอาจารย์สันติสุขมากๆ ครับ
ผมขอถามจากบทเรียนนี้อีกหน่อยนะครับ ตรง
Call GenBalAmt(Me.ID_member) กับ Call GenBalAmt มันต่างกันยังงัย
แล้วในวงเล็บคืออะไรครับ
Private Sub GenBalAmt(ID_member As String) อันนี้อีกเราใส่ในวงเล็บหมายถึงอะไรครับ
31 @R07760
Sub Procedure ที่ชื่อ GenBalAmt เรากำหนดให้มีการส่งค่าจากโปรแกรมที่มาเรียก Procedure นี้ โดยจะส่งเข้าไปในตัวแปรชื่อว่า ID_Member ซึ่งมีประเภทข้อมูลเป็น String ก็เลยได้ออกมาเป็น Private Sub GenBalAmt(ID_member As String) ถ้าเราออกแบบไว้ว่าไม่ต้องมีค่าที่ส่งเข้า Procedure มันก็จะกลายเป็น Private Sub GenBalAmt( )
เวลาเรียกใช้ Procedure โดยพื้นฐานแล้ว ก็ต้องมีการส่งค่าเข้าไปตามจำนวนที่กำหนดใน Procedure นั้นๆ ก็เลยได้ออกมาเป็น Call GenBalAmt(Me.ID_member) ซึ่งหมายถึงเราส่งค่าของ Me.ID_member เข้าไปใน Procedure แต่ถ้ากำหนดไว้ว่าไม่ต้องส่งอะไรเข้าไปใน Procedure ก็จะใช้แค่ Call GenBalAmt( ) ครับ
โปรดจำไว้ว่า ข้อมูลที่เราป้อนเข้าไปนั้น เมื่อเรียกออกมาใช้งานโดยที่ไม่กำหนด order by มันไม่จำเป็นที่จะเรียงเรคอร์ดตามลำดับตามที่ป้อนก่อนหลัง หรือเรียงตาม Primary Key หรือ Key อื่นๆอะไรก็ตาม แต่ในการคำนวนยอดคงเหลือให้ถูกต้องนั้น เราต้องการเรียงลำดับของรายการที่ถูกต้องด้วย จึงจำเป็นต้องมี order by และถ้าคุณจะเอาข้อมูลฝาก-ถอนนี้ไปแสดงไม่ว่าจะบนฟอร์มหรือออกรายงาน ก็อย่าลืมต้องกำหนด order by ให้มันด้วยครับ
เวลาเรียกใช้ Procedure โดยพื้นฐานแล้ว ก็ต้องมีการส่งค่าเข้าไปตามจำนวนที่กำหนดใน Procedure นั้นๆ ก็เลยได้ออกมาเป็น Call GenBalAmt(Me.ID_member) ซึ่งหมายถึงเราส่งค่าของ Me.ID_member เข้าไปใน Procedure แต่ถ้ากำหนดไว้ว่าไม่ต้องส่งอะไรเข้าไปใน Procedure ก็จะใช้แค่ Call GenBalAmt( ) ครับ
โปรดจำไว้ว่า ข้อมูลที่เราป้อนเข้าไปนั้น เมื่อเรียกออกมาใช้งานโดยที่ไม่กำหนด order by มันไม่จำเป็นที่จะเรียงเรคอร์ดตามลำดับตามที่ป้อนก่อนหลัง หรือเรียงตาม Primary Key หรือ Key อื่นๆอะไรก็ตาม แต่ในการคำนวนยอดคงเหลือให้ถูกต้องนั้น เราต้องการเรียงลำดับของรายการที่ถูกต้องด้วย จึงจำเป็นต้องมี order by และถ้าคุณจะเอาข้อมูลฝาก-ถอนนี้ไปแสดงไม่ว่าจะบนฟอร์มหรือออกรายงาน ก็อย่าลืมต้องกำหนด order by ให้มันด้วยครับ
32 @R07761
ขอบคุณอาจารย์ สันติสุขมากๆ ครับ
Time: 0.3172s
- คำว่า GenBalAmt เขียนตรงไหนผิดหรือเปล่า ลองเปลี่ยนก็ได้ครับ เป็นคำว่า xxx ก็ได้ครับ ถ้ายังไม่ผ่าน ก็แปลว่าไม่ใช่ปัญหาที่ชื่อนี้
- ก็เหลือที่เดียวคือ ID_Member มันเป็น numeric หรือเปล่า ถ้าใช่ก็ต้องไปเปลี่ยน Private Sub GenBalAmt(MemberCode As String) เป็น Private Sub GenBalAmt(MemberCode As อะไรก็ว่าไป) อีกอย่างก็ ชื่อนี้ไม่ถูกต้องหรือเปล่า มันต้องเป็นชื่อคอนโทรลบนฟอร์ม ไม่ใช่ชื่อฟิลด์นะครับ