ปัญหาเรื่องการค้นหาข้อมูลมาแสดงในฟอร์ม
กระทู้เก่าบอร์ด อ.Yeadram

 5,220   13
URL.หัวข้อ / URL
ปัญหาเรื่องการค้นหาข้อมูลมาแสดงในฟอร์ม

เรียนท่านผู้รู้ทั้งหลายครับ
เนื่องด้วยผมมีปัญหาที่ต้องขอความกรุณาท่านผู้รู้ในบอร์ดครับ
คืออย่างนี้ครับ ผมมีตาราง 2 ตาราง
ตารางที่ 1 ชื่อ DW เก็บข้อมูล เกี่ยวกับ แผนกงานและงบประมาณ ประกอบด้วย
deptid year money ความมาย รหัสแผนก ปีงบประมาณ และ งบที่ได้รับในปีงบประมาณนั้น มี deptid เป็น คีย์หลัก ครับ
ตารางที่ 2 ชื่อ tbldetail เก็บข้อมูล เกี่ยวกับรายละเอียดการใช้งบประมาณของแต่ละแผนก ประกอบด้วย depid year no   listname paymoney ความหมาย (รหัสแผนก ปีงบประมาณ เลขที่ รายการที่ใช้งบประมาณ จำนวนเงิน) โดยมี deptid   No Year เป็นคีย์หลัก

ผมมีฟอร์มลักษณะดังนี้

    เลือกแผนก .....................(คอมโบบ๊อก)
            เลือกปีงบประมาณ(คอมโบบ๊อก)
    ป้อนเลขที่(textbox)
            ป้อนรายการ...(textbox)
            ป้อนจำนวนเงินที่ใช้ (textbox)

                            

              งบสุทธิที่ไดัรับ.................

    ผมอยากให้ เมื่อเลือกแผนก เลือกปีงบประมาณ แล้ว ให้แสดงงบที่แผนกได้รับสุทธิซึ่งอยู่ในตาราง DW มาแสดงใน งบสุทธิที่ไดัรับ.................ครับ เพื่อที่จะได้เอาจำนวนเงินที่ใช้ ที่ผู้ใช้ป้อนในฟอร์มลบออกจากงบสุทธิที่ไดัรับ เรียนทุกท่านต่อว่า ผมเขียนโปรแกรมด้วย DAO ครับ ตอนนี้ที่ใช้อยู่ก็เปิด recordset 2 ตัว ดังนี้ครับ
   Set rs = db.OpenRecordset("tbldetail", dbOpenDynaset)
   Set ds = db.OpenRecordset("qrytotalmoney", dbOpenDynaset)

rs เปิดตาราง tbldetail
ds เปิด query ซึ่งได้จากตาราง DW ครับ จุดประสงค์ที่ทำอย่างนี้คือ ต้องการเอา deptid และ year จากฟอร์มข้างต้น ไปค้นหา ข้อมูลงบประมาณสุทธิที่ได้รับใน ds เพื่อนำมาแสดงที่ฟอร์มครับ ทำอย่างไรครับ ขอความกรุณาท่านผู้รู้ทุกท่านครับ ขอบคุณอย่างสูงล่วงหน้าครับ (มือใหม่ครับ)

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

1 @R11812
คุณมือใหม่จริงๆครับ ผมอ่านข้อมูลของคุณแล้วก็อย่างที่บอกน่ะครับว่าคุณยังไม่เข้าใจเรื่องการออกแบบตาราง คุณออกแบบตารางผิด ตารางที่1 คุณเอาฟิลล์ รหัสแผนกเป็นคีหลัก นั้นไม่ถูกต้องครับ ฟิลล์หลักจะต้องเก็บค่าที่ไม่ซัำกัน สมมุติว่าแผนกซ่อมบำรุง งบปี 2555 ได้งบ 100000 แล้วคุณดูนะ ถ้าปีต่อไปเรากรอกข้อมูลดังนี้ แผนกซ่อมบำรุง งบปี 2556 ได้งบ 200000 สังเกตุใหมว่าแผนกมีข้อมูลซ้ำคือแผนกซ่อมบำรุงฉนั้นคุณออกแบบตารางผิด
2 @R11820
เรียนคุณ Tong ผมควรออกแบบอย่างไรบ้างครับ ขอคำแน่ะนำด้วยครับ
3 @R11821
ศึกษา Normalization หรือ หลักการออกฐานข้อมูลแบบ Master - Detail
4 @R11823
เพราะ ในเมืองไทยสอนให้ Normalizayion นักศึกษาหรือผู้ที่สนใจAccess จึงเขียนโปรแกรมAccessไม่ได้ งงกับคำศัพท์คำนี้เหลือเกิน ที่จริงแล้วดูอย่างไรจีงเป็นข้อมูลที่เก็บในฟิลด์ที่เป็นคีห์หลักนั้นง่ายนิดเดียว คุณมือใหม่จริงๆ ส่งเมลมาที่ aj.tong@hotmail.com แล้วจะส่งตัวอย่างไปให้ดู
5 @R11826
ขอตัวอย่างด้วยได้ไหมครับ อิอิ เสียดายไม่ได้อยู่ทางเหนือด้วยอยากเรียน access ด้วยจริงๆ หาเรียนยากจังครับ
6 @R11830
เรียน คุณ worawut อันที่จริงผมก็ไม่เก่งหรอก และก็ไม่เคยเข้าไปศึกษาในสถานศึกษาหรอกครับ ผมอ่านและเรียนรู้ด้วยตัวเอง เฉพาะเรื่อง Normali ผมอ่านหนังสือก็หลายเล่มเหมือนกัน บางเล่มอ่านเข้าใจง่าย บางเล่มอ่านเข้าใจยาก อีกทั้งหาข้อมูลในเว็บ แล้วลองออกแบบเองบ้าง แล้วดูว่าจะได้เหมือนเค้ามั๊ย เพราะเด็กไทยถูกสอนให้ท่องจำ แต่เด็กเมืองนอกถูกสอนให้คิดตั้งแต่เด็ก เรื่องไอเดีย จินตนาการ ก็ด้อยกว่าเด็กฝรั่งหน่อย แต่เด็กไทยเก่งเรื่องประยุกค์ใช้ เห็นได้จากการแข่งขันหุ่นยนต์ แต่สำหรับผมการออกแบบฐานข้อมูลแบบใช้หลักการ Master - Detail เข้าใจง่ายกว่า Normali ฝึกฝนบ่อย ๆ นะครับ
7 @R11831
ขอแจมด้วยคนครับ

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

เวลาต้องการแสดงข้อมูลที่ขึ้นกับข้อมูลอื่น (ในที่นี้คือ งบประมาณที่ได้รับ ขึ้นกับ แผนก และ ปีงบประมาณ) มันมี 2 แนวทางคือ

1) เมื่อ แผนก หรือ ปีงบประมาณเปลี่ยน ก็เขียนโค้ดเพื่อแสดง งบประมาณที่ได้รับโดยฝังโค้ดที่ว่า ไว้ใน AfterUpdate event ของทั้ง แผนก และ ปีงบประมาณ

หรือ

2) เขียนโค้ดฝังไว้ที่ ControlSource property ของเท็กซ์บ็อกซ์งบประมาณที่ได้รับเพียงแห่งเดียว โดยให้มันคอยสังเกตค่าใน แผนก และ ปีงบประมาณ แทน

- ข้อดีของวิธีแรกคือ
เท็กซ์บ็อกซ์ งบประมาณที่ได้รับ บนหน้าจออาจจะผูกเข้ากับฟิลด์งบประมาณที่ได้รับจากเทเบิลได้ (ทำได้หรือไม่ต้องดูว่าคุณออกแบบหน้าจอเป็นแบบ bound form หรือไม่) นั่นคือ สามารถแก้ไขค่างบประมาณที่ได้รับผ่านฟอร์มได้

- ข้อเสียของวิธีแรกคือ
โค้ดที่เขียนต้องเขียนหลายที่กระจัดกระจายอยู่ตามคอนโทรลที่เป็นแหล่งข้อมูล (แผนก, ปีงบประมาณ) ดูแลจัดการยากกว่า หากลืมเขียนโค้ดฝังไว้ที่ใดที่หนึ่ง งบประมาณที่ได้รับก็อาจไม่ถูกต้องก็ได้

- ข้อดีของวิธีที่สองคือ
เขียนโค้ดไว้ที่เดียว จัดการง่าย ดูแลง่าย งบประมาณที่ได้รับจะเปลี่ยนไปเองโดยอัตโนมัติเมื่อ แผนก หรือ ปีงบประมาณเปลี่ยนไป

- ข้อเสียของวิธีที่สองคือ
เท็กส์บ็อกซ์งบประมาณที่ได้รับ ไม่สามารถผูกเข้ากับฟิลด์งบประมาณที่ได้รับจากเทเบิลโดยตรง นั่นคือ จะแก้ไขค่างบประมาณที่ได้รับผ่านฟอร์มนี้ไม่ได้

ถ้าใช้วิธีแรก คุณก็เขียนโค้ดนี้ฝังไว้ที่ AfterUpdate event ของทั้งคอมโบบ็อกซ์แผนกและคอมโบบ็อกซ์ปีงบประมาณ

me.[ชื่อเท็กซ์บ็อกซ์งบประมาณที่ได้รับ]
= DLookup("money","DW","deptid = """ & nz(me.[ชื่อคอมโบบ็อกซ์แผนก],"")
& """ and year = " & nz(me.[ชื่อคอมโบบ็อกสซ์ปีงบประมาณ],0)


ถ้าใช้วิธีที่สอง ก็เขียนโค้ด
=DLookup("money","DW","deptid = """ & nz(me.[ชื่อคอมโบบ็อกซ์แผนก],"")
& """ and year = " & nz(me.[ชื่อคอมโบบ็อกซ์ปีงบประมาณ],0)

แปะไว้ที่ ControlSource property ของเท็กซ์บ็อกซ์งบประมาณที่ได้รับ

ทั้ง 2 โค้ดไม่ต้องเขียนแยกบรรทัดนะครับ เขียนเป็นบรรทัดเดียวไปเลย อธิบายมาเสียยืดยาว โค้ดมีบรรทัดเดียวเท่านั้นแหล่ะครับ ไม่รู้ทำงานได้หรือเปล่านะครับ ลองดูแล้วกัน
8 @R11833
เรียนคุณสันติสุขครับ ผมพอมองเห็นทางแล้วครับ ขออภัยคุณมากที่เข้ามาดูุช้าไปหน่อยเนื่องด้วยงานรัดตัวเหลือเกิน อยากเรียนว่าผมเพิ่งหัดเล่น Access มาได้ เกือบ 2 ปี แต่ก็เพียงแค่เล่นทุกอย่างที่หนังสือมีมาให้ครับ ก็เลยอยากเขียนโปรแกรมเอาไว้ใช้ในหน่วยงาน แต่ถ้าใช้ธรรมดามันก็ ดูไม่รัดกุม เช่น เวลาเราจะบันทึกข้อมูล Access เขาก็บันทึกให้เลยโดยไม่มีการถามยืนยัน เป็นต้น จึงเริ่มศึกษาเรื่อง การเขียนโปรแกรม แต่ก็ไม่ค่อยมีครู ครับ คือจะถามใครก็เป็นโปรแกรมอื่นกัน เลยค้นในเน็ตก็เจอเวปนี้หล่ะครับ สุดยอดมากครับ อยากเรียนคุณสันติสุขดังนี้ครับ
      1. ผมเขียน แบบ Unbound ครับ คือ สร้างเท็กซ์บ๊อกซ์ขึ้นมาบนฟอร์มแล้วเอา Recordset มาใส่เอาไว้ (text1.value = rs!deptID) ผมมือใหม่ครับเลยอธิบายหน่อย
      2. ผมลืมบอกไปว่า ตารางที่ 1 ผมใช้ deptID กับ year เป็น คีย์หลัก เลยอยากเรียนถามว่า ผมทำถูกไหมครับ
      3. คำสั่ง Dlookup เป็นคำสั่งที่ใช้ในการค้นหาข้อมูลใช่หรือไม่ครับ แล้วเราจะนำมาใช้กับการเขียนโปรแกรมแบบ DAO ได้หรือไม่ครับ ถ้าได้ใช้อย่างไรครับ(เอาไว้ตรงไหน)
และ nz คืออะไรครับ
     4. จุดประสงค์ของผมก็คือ ต้องการดึงเอางบประมาณที่ไดัรับในปีนั้น ๆ มาโชไว้เมื่อ ผู้ใช้เลือกแผนก เลือกปีงบประมาณ ป้อนรายการและค่าใช้จ่ายแล้วให้นำไปหักออกจากงบสุทธิที่ได้รับครับ ถ้ามีการป้อนรายการหลายรายการก็จะหักไปเรื่อย ๆ (ในปีหนึ่ง ๆ แต่ละแผนกก็จะมีค่าใช้จ่ายต่าง ๆ เข้ามาหลายรายการ) ดังนั้นถ้าเป็นรายการของแผนกใดในปีงบประมาณที่ผู้ใช้เลือกก็จะต้องนำมาหักออกจากงบประมาณสุทธิของปีนั้นครับ ผมขอรบกวนคุณสันติสุขหน่อยน่ะครับ คือ หน้าตาของฟอร์มผมจะสมมติให้ดูดังนี้

                                    ลงทะเบียนค่าใช้จ่ายประจำปีงบประมาณ

   
            เลือกแผนก/งาน .........................(คอมโบ)
            เลือกปีงบประมาณ....................(คอมโบ)
            ป้อนเลขที่...............................(เท็กซ์)
            ป้อนรายการใช้จ่าย                    (เท็กซ์)
            ป้อนค่าใช้จ่าย                 บาท   (เท็กซ์)

                                   งบสุทธิที่แผนกได้รับ ..300000..บาท

     หน่วยงาน     ปีงบประมาณ     เลขที่      รายการ       เป็นเงิน     คงเหลือ(บาท)
   งานซ่อมบำรุง    2554            1/54      ซ่อมแอร์      25000       275000
   งานซ่อมบำรุง    2554            2/54      เบี้ยเลี้ยง      15000       260000

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

9 @R11834
1) ผมไม่แน่ใจว่า คำถามคืออะไรนะครับ อ่านดูเหมือนเป็นการบอกเล่าเท่านั้น ยังไงถามมาใหม่อีกทีแล้วกัน

2) ถูกครับ

3) ใช่ พวกคำสั่ง DLookup, DMin, DMax, Dต่างๆ ฯ เป็นคำสั่งของ Access ที่ทำออกมาเพื่อให้ใช้ง่ายขึ้นในการค้นหาผลลัพธ์ของข้อมูล    เมื่อ Access ได้คำสั่งเหล่านี้มามันจะตีความแล้วส่งลงไปยังส่วนที่ทำการจัดการข้อมูล ซึ่งตรงนี้ผมไม่แน่ใจว่ามันคือ DAO   หรือมันอาจเป็นตัวจัดการฐานข้อมูลที่อยู่ระดับเดียวกับ DAO แต่ไม่ใช่ DAO     หรืออาจอยู่ในระดับต่ำกว่า DAO ก็ได้    คุณสามารถใช้คำสั่งเหล่านี้ใน Module object     ใน Form/Report event procedure, Form/Report module    ในไหนก็ตามที่สามารถใส่ นิพจน์ของ VBA ได้   จริงๆคำถามนี้กว้างไปครับ   

และ Nz( ) คือ http://www.thai-access.com/suphap.php?topic_id=1196

4) ไว้จะมาตอบทีหลังนะครับ
10 @R11835
4) ขั้นตอนการทำงานของโปรแกรมก็อาจเป็นอย่างนี้นะครับ

4.1 เมื่อป้อนแผนกและปีงบประมาณ
      4.1A งบประมาณจะแสดงโดยอัตโนมัติตามที่บอกไว้ก่อนนี้
      4.1B ไปกำหนด SQL statement ที่ RecordSource property ของ subform เพื่อให้แสดงรายละเอียด
            หรือ
            กำหนดเป็น Query object ที่ทำหน้าที่แสดงรายละเอียดเช่นเดียวกัน และสั่ง subform.requery ถ้าไม่สั่ง มันก็จะไม่แสดงข้อมูลที่ถูกต้องให้
            SQL statement หรือ Query object นี้มีลักษณะเดียวกันกับคำถาม http://www.thai-access.com/yeadram_view.php?topic_id=2481 วิธีนี้เราจะไม่เก็บ งบประมาณคงเหลือ ไว้ในเทเบิลใดๆ แต่จะใช้การคำนวนหาเอาเมื่อต้องการทราบค่า แต่ถ้ามีความจำเป็นที่จะต้องเก็บยอดคงเหลือ เช่น อาจเพราะต้องการให้ระบบมี performance ที่สูงขึ้น ตอบสนองการเรียกหาข้อมูลได้ไวขึ้น ก็ต้องคนละวิธีครับ แต่ก็ต้องแลกมาด้วยการเขียนโปรแกรมจัดการกรณีที่ผู้ใช้ป้อนจำนวนเงิน หรือแผนก หรือปีผิด เพราะจะต้องไปคำนวนหายอดคงเหลือที่เก็บไว้แล้วใหม่อีกหน

4.2 เมื่อป้อน เลขที่, รายการใช้จ่าย และค่าใช้จ่ายแล้ว น่าจะมีปุ่ม command button ให้คลิกเพื่อบันทึกค่าลงในเทเบิล tbldetail และทำข้อ 4.1B อีกครั้งครับ

Operation Flow ของโปรแกรมก็จะเป็นแนวทางนี้หล่ะครับ
11 @R11855
ขอบคุณคุณสันติสุขครับ ผมใช้ DlookUp ช่วยครับ ได้แล้วครับ ขอบคุณมากครับ
12 @R13542
สวัสดีค่ะ สอบถามเกี่ยวกับการค้นหาข้อมูลใน Query ค่ะ (เพิ่งจะเร่ิมฝึกใช้ Access เขียนค่ะ เขียนไม่ค่อยเก่ง)
คือว่าทำโปรแกรมเกี่ยวกับการค้นหาทะเบียนรถยนต์ค่ะ แล้วเข้าไปทำเงื่อนไขใน แบบสอบถามตรง Criteria ค่ะ จะหาข้อมูลทะเบียนรถยนต์ล้ักษณะ ที่เราจำทะเบียนรถยนต์ ได้ไม่หมด แต่สามารถ ค้นหาได้เช่น สมมติว่า ทะเบียนรถ กห-0598 กรุงเทพมหานคร แต่เราจำได้แค่ 598 ค่ะ จะมีเงื่อนไงอะไรในการเขียนหรือเปล่าค่ะ อย่างเช่น พิมพ์แค่คำว่า 598 ก็ออกมาค่ะ ใช้ Like *#* ก็ไม่เห็นออกอะไรมาเลยค่ะ
รบกวหน่อยนะค่ะ ขอบคุณค่ะ หรือจะตอบผ่าน E-mail ก้ได้ค่ะ onniya_jazz@yahoo.co.th ขอบคุณค่ะ
13 @R13543
Like "*" & "598" & "*"

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