กระทู้เก่าบอร์ด อ.Yeadram
14,483 20
URL.หัวข้อ /
URL
การบันทึกวันลาพนักงาน
เรียนผู้รู้ทุกท่านครับ
ผมทำฟอร์มวันลาสำหรับพนักงานราชการ โดยในฟอร์ก็จะมี ฟิลด์ รหัสบุคคล,ประเภทการลา,วันที่ลา,วันที่สิ้นสุดการลา,จำนวนวันลา ผมติดปัญหาที่ว่าเวลาขึ้นปีงบประมาณใหม่การลาพักร้อนก็จะได้วันเพิ่มอีก 10 วัน ถ้ามีของเดิมส?สมอยู่ 10 ก็จะบวกเพิ่มเข้าไปอีกเป็น 20 วันแล้วต้องการให้แสดงวันที่เหลือจากการลาลดลงไปเรื่อยๆ ผมต้องสร้างตารางขึ้นมาใหม่เพื่อเก็บค่าที่คำนวนหรือเปล่าครับ ขอคำแนะนำด้วยครับ
ผมทำฟอร์มวันลาสำหรับพนักงานราชการ โดยในฟอร์ก็จะมี ฟิลด์ รหัสบุคคล,ประเภทการลา,วันที่ลา,วันที่สิ้นสุดการลา,จำนวนวันลา ผมติดปัญหาที่ว่าเวลาขึ้นปีงบประมาณใหม่การลาพักร้อนก็จะได้วันเพิ่มอีก 10 วัน ถ้ามีของเดิมส?สมอยู่ 10 ก็จะบวกเพิ่มเข้าไปอีกเป็น 20 วันแล้วต้องการให้แสดงวันที่เหลือจากการลาลดลงไปเรื่อยๆ ผมต้องสร้างตารางขึ้นมาใหม่เพื่อเก็บค่าที่คำนวนหรือเปล่าครับ ขอคำแนะนำด้วยครับ
20 Reply in this Topic. Dispaly 1 pages and you are on page number 1
2 @R04952
คิดผิดครับ
มันจะลดลงได้ยังไงล่ะครับ
คำนวนครั้งแรก คงเหลือ 27
พอคำนวนครั้งที่สอง ไม่ได้เอา เลข 27 เข้ามาเกี่ยวข้องเลย มันก็ไม่ลดซิครับ
เพราะมันใช้ตัวเลขแค่ 20,10,3 เหมือนเดิมทุกประการ ไม่มีการเอาเลข 27 มากระทำด้วยเลย อิอิ เพราะฉะนั้น สรุปว่า คุณคิดผิดครับ อิอิ
คุณต้องหา
1 โควต้าทั้งหมด (ได้จาก โค้วต้าสะสม + โค้วต้าปีนี้)
2 จำนวนวันลาที่เคยลาไปแล้วในปีนี้ (ได้จาก ผลรวมจำนวนวันลาในปีนี้ sum ยอดมาให้หมด ว่า รหัสนี้เคยลาไปแล้วกี่ครั้งในปีนี้)
3 จำนวนวันลาในครั้งนี้
เมื่อได้ 3 ค่าแล้ว ค่อยเอามาเข้าสูตร
ข้อ1 - ข้อ2 - ข้อ3
วิธีนี้ ไม่จำเป็นต้องมีฟิล์ด คงเหลือในตารางก็ได้ อยากรู้เมื่อไร ค่อยใช้สูตรนี้หาเอา
ถ้าคุณไม่คิดจะเขียนเป็นโค้ดลองดูแบบนี้ครับ (ผมไม่แน่ใจว่ามันจะยอมหรือเปล่า)
=([วันลาสะสม]+[รวมกับปีนี้]) - dsum("[จำนวนวันลา]","[ชื่อตาราง]","[รหัส] Like '" & [รหัส] & "'") - [จำนวนวันลา]
มันจะลดลงได้ยังไงล่ะครับ
คำนวนครั้งแรก คงเหลือ 27
พอคำนวนครั้งที่สอง ไม่ได้เอา เลข 27 เข้ามาเกี่ยวข้องเลย มันก็ไม่ลดซิครับ
เพราะมันใช้ตัวเลขแค่ 20,10,3 เหมือนเดิมทุกประการ ไม่มีการเอาเลข 27 มากระทำด้วยเลย อิอิ เพราะฉะนั้น สรุปว่า คุณคิดผิดครับ อิอิ
คุณต้องหา
1 โควต้าทั้งหมด (ได้จาก โค้วต้าสะสม + โค้วต้าปีนี้)
2 จำนวนวันลาที่เคยลาไปแล้วในปีนี้ (ได้จาก ผลรวมจำนวนวันลาในปีนี้ sum ยอดมาให้หมด ว่า รหัสนี้เคยลาไปแล้วกี่ครั้งในปีนี้)
3 จำนวนวันลาในครั้งนี้
เมื่อได้ 3 ค่าแล้ว ค่อยเอามาเข้าสูตร
ข้อ1 - ข้อ2 - ข้อ3
วิธีนี้ ไม่จำเป็นต้องมีฟิล์ด คงเหลือในตารางก็ได้ อยากรู้เมื่อไร ค่อยใช้สูตรนี้หาเอา
ถ้าคุณไม่คิดจะเขียนเป็นโค้ดลองดูแบบนี้ครับ (ผมไม่แน่ใจว่ามันจะยอมหรือเปล่า)
=([วันลาสะสม]+[รวมกับปีนี้]) - dsum("[จำนวนวันลา]","[ชื่อตาราง]","[รหัส] Like '" & [รหัส] & "'") - [จำนวนวันลา]
3 @R05146
-ลดจำนวนข้อมูลที่ไม่เกี่ยวข้องออก (ให้ไฟล์มันเล็กลง)
-เขียนระบุมาด้วยว่า งานที่ติดขัดเกี่ยวข้องกับออบเจคใดบ้าง
-เขียนระบุมาด้วยว่า ลำดับของงานตามปกติ ตามที่วางแผนไว้ต้องทำงานเริ่มจากที่ใดไปที่ใด และติดขัดตรงขั้นไหนของงาน
-เขียนระบุชื่อเรื่องของอีเมล์ให้ อ้างอิงถึงกระทู้นี้ หรือใส่ลิงค์ของกระทู้นี้ ไว้ในอีเมล์
-ส่งเมล์ดังกล่าว พร้อมแนบไฟล์ที่จัดการเรียบร้อยแล้ว มาที่ accboard @ gmail . com
-เขียนระบุมาด้วยว่า งานที่ติดขัดเกี่ยวข้องกับออบเจคใดบ้าง
-เขียนระบุมาด้วยว่า ลำดับของงานตามปกติ ตามที่วางแผนไว้ต้องทำงานเริ่มจากที่ใดไปที่ใด และติดขัดตรงขั้นไหนของงาน
-เขียนระบุชื่อเรื่องของอีเมล์ให้ อ้างอิงถึงกระทู้นี้ หรือใส่ลิงค์ของกระทู้นี้ ไว้ในอีเมล์
-ส่งเมล์ดังกล่าว พร้อมแนบไฟล์ที่จัดการเรียบร้อยแล้ว มาที่ accboard @ gmail . com
4 @R05183
คุณออกแบบฐานข้อมูลมาให้มันยาก เพราะคุณวางแผนมันไม่ถูก ผมก็ตามค่อนข้างยากแฮะ
แต่ดูคร่าวๆ คุณคงต้องก?รดู
- สถิติในปัจจุบันในหน้าฟอร์ม
- สถิติและประวัติผ่านคิวรี่แท็บไขว้
- สถิติและประวัติผ่านรายงาน
พอผมตกลงปลงใจว่า "เออ คงแค่นี้แหละมั้ง" ผมก็เลย "ปรับ" แบบฐานข้อมูลของคุณเสียใหม่
- ตั้งชื่อฟิลด์ ชื่อตารางใหม่ ไม่ใช้คำสงวน ไม่มีช่องว่างในชื่อต่างๆ (ซึ่งคุณเคยทำไว้ แทบจะผิดทุกๆ ที่ มันจะทำให้มีปัญหาเวลาเขียนโค้ดครับ)
- ตั้งค่าความสัมพันธ์ของแต่ละตาราง (ซึ่งคุณไม่ได้มีไว้ก่อนหน้านี้)
- ลบตารางที่ไม่เกี่ยวข้อง
และเนื่องจากการปรับเปลี่ยนตารางไปหลายๆ อย่าง มันก็กระทบกับคิวรี่, ฟอร์ม และรายงานที่คุณเคยมี ผมก็เลยลบทิ้งทั้งหมดเลย แล้วผมก็
- สร้างคิวรี่ให้ใหม่ (3 แท็บไขว้ ตั้งชื่อสื่อความหมายไว้ให้แล้ว) + ( 1 Select เอาไว้ไปออกรายงาน)
- สร้างฟอร์มให้ใหม่ ให้ไปศึกษาการตั้งชื่อคอนโทรล การวางส่วนประกอบหลักๆ การเขียนโค้ด และวิธีดึงข้อมูลจากตารางมาแสดง ณ จุดที่กำหนด ณ เหตุการณ์ที่กำหนด
เมื่อคุณได้รับตัวอย่างนี้ไปแล้ว คิดว่า น่าจะเอาไปประยุกต์ต่อได้ไม่ยากนัก (ตรงเงื่อนไข 30วันอะไรของคุณนั่นแหละผมไม่ค่อยเข้าใจนัก ต้องไปต่อยอดเอาเอง)
หลักๆ มันก็คือการใช้ Dlookup() หรือ Dsum() แค่นั้นแหละครับ แต่ต้องวางเหตุการณ์ให้ดี เพราะการใช้ฟังก์ชั่นเหล่านี้ มันต้องพึ่งพา "ค่า" จากคอนโทรลต่างๆ เพื่อใช้เป็นเงื่อนไขให้มัน ถ้าวางเหตุการณ์ไม่ตรงไม่ถูกต้อง มันก็จะ Error พันกันนัวเนีย เพราะมันหาค่า มาเป็นเงื่อนไขไม่ได้ มันก็ไม่สามารถหาคำตอบให้ได้ และอีกอย่างคือ ชื่อของคุณโทรล ชื่อของตัวแปร ถ้าคุณตั้งชื่อไม่เหมาะสม การเขียนโค้ดเหล่านี้จะทำให้งง มากๆ ไม่รู้คำไหนอ้างถึงฟิลด์ คำไหนอ้างถึงคอนโทรล ยิ่งถ้ามีช่องว่างในชื่อเหล่านั้นคุณก็ต้องคอยใส่ [ ] ปิดหัวปิดท้ายทำให้การเขียนโค้ดลำบากมากๆ ครับ
******** ปล. โค้ดตัวอย่างที่ดัดแปลงตอบกลับทางอีเมล์ฉบับเดิมนะครับ ดูไฟล์แนบนะครับ
DayOffReport.mdb (324kb)
Access2002
เขียนบน WindowXP + OfficeXP
แต่ดูคร่าวๆ คุณคงต้องก?รดู
- สถิติในปัจจุบันในหน้าฟอร์ม
- สถิติและประวัติผ่านคิวรี่แท็บไขว้
- สถิติและประวัติผ่านรายงาน
พอผมตกลงปลงใจว่า "เออ คงแค่นี้แหละมั้ง" ผมก็เลย "ปรับ" แบบฐานข้อมูลของคุณเสียใหม่
- ตั้งชื่อฟิลด์ ชื่อตารางใหม่ ไม่ใช้คำสงวน ไม่มีช่องว่างในชื่อต่างๆ (ซึ่งคุณเคยทำไว้ แทบจะผิดทุกๆ ที่ มันจะทำให้มีปัญหาเวลาเขียนโค้ดครับ)
- ตั้งค่าความสัมพันธ์ของแต่ละตาราง (ซึ่งคุณไม่ได้มีไว้ก่อนหน้านี้)
- ลบตารางที่ไม่เกี่ยวข้อง
และเนื่องจากการปรับเปลี่ยนตารางไปหลายๆ อย่าง มันก็กระทบกับคิวรี่, ฟอร์ม และรายงานที่คุณเคยมี ผมก็เลยลบทิ้งทั้งหมดเลย แล้วผมก็
- สร้างคิวรี่ให้ใหม่ (3 แท็บไขว้ ตั้งชื่อสื่อความหมายไว้ให้แล้ว) + ( 1 Select เอาไว้ไปออกรายงาน)
- สร้างฟอร์มให้ใหม่ ให้ไปศึกษาการตั้งชื่อคอนโทรล การวางส่วนประกอบหลักๆ การเขียนโค้ด และวิธีดึงข้อมูลจากตารางมาแสดง ณ จุดที่กำหนด ณ เหตุการณ์ที่กำหนด
เมื่อคุณได้รับตัวอย่างนี้ไปแล้ว คิดว่า น่าจะเอาไปประยุกต์ต่อได้ไม่ยากนัก (ตรงเงื่อนไข 30วันอะไรของคุณนั่นแหละผมไม่ค่อยเข้าใจนัก ต้องไปต่อยอดเอาเอง)
หลักๆ มันก็คือการใช้ Dlookup() หรือ Dsum() แค่นั้นแหละครับ แต่ต้องวางเหตุการณ์ให้ดี เพราะการใช้ฟังก์ชั่นเหล่านี้ มันต้องพึ่งพา "ค่า" จากคอนโทรลต่างๆ เพื่อใช้เป็นเงื่อนไขให้มัน ถ้าวางเหตุการณ์ไม่ตรงไม่ถูกต้อง มันก็จะ Error พันกันนัวเนีย เพราะมันหาค่า มาเป็นเงื่อนไขไม่ได้ มันก็ไม่สามารถหาคำตอบให้ได้ และอีกอย่างคือ ชื่อของคุณโทรล ชื่อของตัวแปร ถ้าคุณตั้งชื่อไม่เหมาะสม การเขียนโค้ดเหล่านี้จะทำให้งง มากๆ ไม่รู้คำไหนอ้างถึงฟิลด์ คำไหนอ้างถึงคอนโทรล ยิ่งถ้ามีช่องว่างในชื่อเหล่านั้นคุณก็ต้องคอยใส่ [ ] ปิดหัวปิดท้ายทำให้การเขียนโค้ดลำบากมากๆ ครับ
******** ปล. โค้ดตัวอย่างที่ดัดแปลงตอบกลับทางอีเมล์ฉบับเดิมนะครับ ดูไฟล์แนบนะครับ
DayOffReport.mdb (324kb)
Access2002
เขียนบน WindowXP + OfficeXP
5 @R05199
6 @R05204
ตอบ R02501
มันเป็นเรื่องของการตั้งค่าความก??้างคอลัมภ์ครับ
- ในตารางแนะนำว่าไม่ต้องไปปรับแต่งมัน เพราะในตารางมันใช้เก็บข้อมูลซึ่งปกติ เราจะไม่ให้ user เข้าดู ปล่อยให้มันเก็บไปตามระบบของมัน ไม่ต้องเข้าไปแก้ไขไม่ต้องเข้าไปปรับแต่ง ถ้าคิดจะทำงานใดๆ หรือจะ Manage Database ทุกๆ การกระทำ ไม่ว่าจะเป็นการเพิ่มข้อมูล การลบข้อมูล การปรับปรุงข้อมูล ให้ทำผ่านฟอร์มครับ
- ในฟอร์ม ผมตั้งค่าให้มันซ่อนคอลัมภ์แรกไว้ โดยปกติแล้วคำว่า รหัส เราให้ระบบมันจำมันเก็บให้ เราไม่ต้องดูก็ได้ ที่เราจะดูคือชื่อคน ดังนั้นไม่ให้มันรกสายตาโดยไม่จำเป็นผมก็ซ่อนมันไว้ โดยตั้งค่าความกว้างของคอลัมภ์นี้ (รหัส) เป็น 0
ซึ่งมันก็ไม่ใช่กฎเกณฑ์อะไรหรอกครับ มันก็แล้วแต่ความต้องการของ user ถ้าคุณต้องการให้มันแสดง คุณก็ไปตั้งค่าความกว้างคอลัมภ์ให้เป็น ค่าบวก (มากกว่า 0) ได้เองครับ
ถ้าเข้าไปตั้งค่าไม่เป็นก็จะแนะนำให้ครับ ตามนี้
- เปิดฟอร์มในมุมมองออกแบบ
- คลิ๊กเลือกที่คอมโบที่ต้องการปรับแต่ง เปิด Properties Dialog ขึ้นมา
- ไปที่แท็บแรก (Format) มองหาบรรทัดที่เขียนว่า "ความกว้างคอลัมน์" ก็ตั้งค่าได้เลยครับ (มันต้องสัมพันธ์กันกับ "จำนวนคอลัมภ์" ด้วยนะครับ
ตอบ R05203
ทำไมยอดคงเหลือปัจจุบัน ต้องเป็นอย่างนั้น
อันนี้ต้องถามว่าคำว่าปัจจุบันในความหมายของคุณกับของผมมันตรงกันไหม
ในความหมายของผมคือ ผมคิดรวมทุกๆ เรคคอร์ด คือคิดจนถึงวันปัจจุบัน วันนี้เลย ผมไม่สนว่าคุณกำลังมองข้อมูลอยู่ ณ เรคคอร์ดใด
คือถ้า นายสมชาย มีบันทึกข้อมูลอยู่ในตาราง 6 เรคคอร์ด (ลามาแล้ว 6 ครั้ง) คำว่าคงเหลือปัจจุบันของผม คือ คิดรวม
(ยอดลายกมาก่อนเริ่มโปรแกรม + โควต้าของแต่ละปีนับจากปีเริ่มโปรแกรมจนถึงปีนี้ - ยอดลาทั้ง 6 เรคคอร์ด)
สมมติว่า นายสมชายมีสิทธิ์ ลาพักร้อน คงเหลือ 18 วัน (นับยอดสุทธิตามสูตร)
เพราะฉะนั้นไม่ว่าคุณจะสั่งฟอร์มให้มันไปดูที่เรคคอร์ดแรก หรือเรคคอร์ดที่สอง หรือเรคคอร์ดสุดท้ายของนายสมชาย มันก็ต้องเหลือ 18 เพราะนั่นคือความหมายของคำว่า "ปัจจุบัน" ของผม ( Now )
สำหรับผมแล้ว ตรงนี้มันไม่ต้องแก้ไข
ลองคิดเล่นๆ ว่าโปรแกรมของคุณผ่านการใช้งานมา 6 ปี นายสมชายลาไปแล้วกี่ครั้ง ถ้าคุณย้อนไปดูเรคคอร์ดแรกของนายสมชาย แล้วอยากปรับแก้ตัวเลขใดๆ แล้วคุณอยากรู้ "ยอดหลังจากปรับแก้" ณ เรคคอร์ดนั้น หรืออยากรู้ผลกระทบรวมไหมว่า ถ้าคุณปรับแก้ตัวเลข ณ เรคคอร์ดนั้นๆ แล้วยอดสุทธิ ทั้งโปรแกรม ทั้ง 6 ปี มันจะลงท้ายด้วยค่า ติดลบหรือเปล่า
ความหมาย "ปัจจุบัน" ของคุณคงหมายถึง ยอดสุทธิทีคิดตั้งแต่เริ่มโปรแกรม ไล่มาจนถึง เรคคอร์ดปัจจุบัน(ที่กำลังแสดงหน้าฟอร์ม)
ถ้าคุณต้องการดูยอดตรงนั้น คุณต้องสร้างตัวแสดงผลเพิ่มขึ้นมาใหม่อีกตัว แล้วแทรกโค้ดเข้าไปในเหตุการณ์เดียวกันกับผม (เพราะต้องระวังเรื่องเหตุการณ์มันทับซ้อนหรือขัดแย้งกัน)
หลักๆ ของโค้ดก็คล้ายๆ กันกับของผมนั่นแหละครับ คือใช้ Dsum กับ Dlookup เป็นหลัก โดยใช้เงื่อนไขให้เป็น แล้วเอามาบวกเอามาลบกัน ได้ผลสุทธิ ก็นำมาแสดง
สรุปคือ
1. ผมไม่แนะนำให้ปรับแก้ "คงเหลือปัจจุบัน" ของผม
2. ถ้าต้องการเห็น "คงเหลือปัจจุบันในความหมายของคุณ" ให้เพิ่มขึ้นมาเองครับ
มันเป็นเรื่องของการตั้งค่าความก??้างคอลัมภ์ครับ
- ในตารางแนะนำว่าไม่ต้องไปปรับแต่งมัน เพราะในตารางมันใช้เก็บข้อมูลซึ่งปกติ เราจะไม่ให้ user เข้าดู ปล่อยให้มันเก็บไปตามระบบของมัน ไม่ต้องเข้าไปแก้ไขไม่ต้องเข้าไปปรับแต่ง ถ้าคิดจะทำงานใดๆ หรือจะ Manage Database ทุกๆ การกระทำ ไม่ว่าจะเป็นการเพิ่มข้อมูล การลบข้อมูล การปรับปรุงข้อมูล ให้ทำผ่านฟอร์มครับ
- ในฟอร์ม ผมตั้งค่าให้มันซ่อนคอลัมภ์แรกไว้ โดยปกติแล้วคำว่า รหัส เราให้ระบบมันจำมันเก็บให้ เราไม่ต้องดูก็ได้ ที่เราจะดูคือชื่อคน ดังนั้นไม่ให้มันรกสายตาโดยไม่จำเป็นผมก็ซ่อนมันไว้ โดยตั้งค่าความกว้างของคอลัมภ์นี้ (รหัส) เป็น 0
ซึ่งมันก็ไม่ใช่กฎเกณฑ์อะไรหรอกครับ มันก็แล้วแต่ความต้องการของ user ถ้าคุณต้องการให้มันแสดง คุณก็ไปตั้งค่าความกว้างคอลัมภ์ให้เป็น ค่าบวก (มากกว่า 0) ได้เองครับ
ถ้าเข้าไปตั้งค่าไม่เป็นก็จะแนะนำให้ครับ ตามนี้
- เปิดฟอร์มในมุมมองออกแบบ
- คลิ๊กเลือกที่คอมโบที่ต้องการปรับแต่ง เปิด Properties Dialog ขึ้นมา
- ไปที่แท็บแรก (Format) มองหาบรรทัดที่เขียนว่า "ความกว้างคอลัมน์" ก็ตั้งค่าได้เลยครับ (มันต้องสัมพันธ์กันกับ "จำนวนคอลัมภ์" ด้วยนะครับ
ตอบ R05203
ทำไมยอดคงเหลือปัจจุบัน ต้องเป็นอย่างนั้น
อันนี้ต้องถามว่าคำว่าปัจจุบันในความหมายของคุณกับของผมมันตรงกันไหม
ในความหมายของผมคือ ผมคิดรวมทุกๆ เรคคอร์ด คือคิดจนถึงวันปัจจุบัน วันนี้เลย ผมไม่สนว่าคุณกำลังมองข้อมูลอยู่ ณ เรคคอร์ดใด
คือถ้า นายสมชาย มีบันทึกข้อมูลอยู่ในตาราง 6 เรคคอร์ด (ลามาแล้ว 6 ครั้ง) คำว่าคงเหลือปัจจุบันของผม คือ คิดรวม
(ยอดลายกมาก่อนเริ่มโปรแกรม + โควต้าของแต่ละปีนับจากปีเริ่มโปรแกรมจนถึงปีนี้ - ยอดลาทั้ง 6 เรคคอร์ด)
สมมติว่า นายสมชายมีสิทธิ์ ลาพักร้อน คงเหลือ 18 วัน (นับยอดสุทธิตามสูตร)
เพราะฉะนั้นไม่ว่าคุณจะสั่งฟอร์มให้มันไปดูที่เรคคอร์ดแรก หรือเรคคอร์ดที่สอง หรือเรคคอร์ดสุดท้ายของนายสมชาย มันก็ต้องเหลือ 18 เพราะนั่นคือความหมายของคำว่า "ปัจจุบัน" ของผม ( Now )
สำหรับผมแล้ว ตรงนี้มันไม่ต้องแก้ไข
ลองคิดเล่นๆ ว่าโปรแกรมของคุณผ่านการใช้งานมา 6 ปี นายสมชายลาไปแล้วกี่ครั้ง ถ้าคุณย้อนไปดูเรคคอร์ดแรกของนายสมชาย แล้วอยากปรับแก้ตัวเลขใดๆ แล้วคุณอยากรู้ "ยอดหลังจากปรับแก้" ณ เรคคอร์ดนั้น หรืออยากรู้ผลกระทบรวมไหมว่า ถ้าคุณปรับแก้ตัวเลข ณ เรคคอร์ดนั้นๆ แล้วยอดสุทธิ ทั้งโปรแกรม ทั้ง 6 ปี มันจะลงท้ายด้วยค่า ติดลบหรือเปล่า
ความหมาย "ปัจจุบัน" ของคุณคงหมายถึง ยอดสุทธิทีคิดตั้งแต่เริ่มโปรแกรม ไล่มาจนถึง เรคคอร์ดปัจจุบัน(ที่กำลังแสดงหน้าฟอร์ม)
ถ้าคุณต้องการดูยอดตรงนั้น คุณต้องสร้างตัวแสดงผลเพิ่มขึ้นมาใหม่อีกตัว แล้วแทรกโค้ดเข้าไปในเหตุการณ์เดียวกันกับผม (เพราะต้องระวังเรื่องเหตุการณ์มันทับซ้อนหรือขัดแย้งกัน)
หลักๆ ของโค้ดก็คล้ายๆ กันกับของผมนั่นแหละครับ คือใช้ Dsum กับ Dlookup เป็นหลัก โดยใช้เงื่อนไขให้เป็น แล้วเอามาบวกเอามาลบกัน ได้ผลสุทธิ ก็นำมาแสดง
สรุปคือ
1. ผมไม่แนะนำให้ปรับแก้ "คงเหลือปัจจุบัน" ของผม
2. ถ้าต้องการเห็น "คงเหลือปัจจุบันในความหมายของคุณ" ให้เพิ่มขึ้นมาเองครับ
7 @R05214
dlookup() หรือ dsum() มันมี 3 อาร์กิวเมนต์
อาร์กิวเมนต์ที่ 3 คือ เงื่อนไข
คุณก็ปรับแก้เอาตรงนั้นแหละครับ
ถ้าคุณอยากนับเฉพาะชนิดการลาอย่างเดียว คุณก็ระบุ Type ไว้ในนั้น
ถ้าคุณอยากนับรวม คุณก็ไม่ต้องระบุ Type
ในโค้ดนั่น มีตัวอย่างการใช้ เงื่อนไขเดียว
ในโค้ดนั่น มีตัวอย่างการใช้ เงื่อนไขหลายเงื่อนไข (ซึ่งมันก็แค่ เชื่อมต่อแต่ละเงื่อนไขด้วย AND) (หรือ OR ถ้าจำเป็น)
คุณก็นำไปประยุกต์ต่อซิครับ ตอนผมส่งไฟล์ให้ ผมก็ย้ำแล้วว่า คุณต้องประยุกต์ต่อเพราะการนับของคุณผมยังไม่ค่อยเข้าใจนัก
การประยุกต์สำหรับงานนี้ มันก็แค่เล่นกับ เงื่อนไขของ ฟังก์ชั่น
เท่ากับ, ไม่เท่ากับ, น้อยกว่า, มากกว่า, Like, Not Like ตัวอย่างที่ผมเขียนไปดูเหมือนกว่ามันจะมีแนวทางให้ดูหลายรูปแบบพอสมควรแล้วนะครับ
ถ้าคุณอ่านโค้ดไม่เป็น คุณก็ตีโจทก์ไม่แตก
ถ้าคุณตีโจทก์ไม่แตก คุณก็ประยุกต์ไม่ได้
ปัญหาคือคุณอ่านโค้ดไม่เป็นหรือเปล่า ลองดูวิธีการอ่าน
x=dlookup("y","t","w = 2 And z Like '" & txtbx & "'")
ให้อ่านว่า ...
x เท่ากับ ค่าของฟิลด์ y ในตาราง t โดยที่...
ต้องเป็น y ของเรคคอร์ดที่มีค่าของฟิลด์ w เท่ากับ 2 และโดยที่....
ต้องเป็น y ของเรคคอร์ดที่มีค่าของฟิลด์ z เขียนเหมือน หรือคล้ายกับ ตัวหนังสือที่อยู่ในคอนโทรลที่ชื่อ txtbx บนฟอร์มปัจจุบัน
อาร์กิวเมนต์ที่ 3 คือ เงื่อนไข
คุณก็ปรับแก้เอาตรงนั้นแหละครับ
ถ้าคุณอยากนับเฉพาะชนิดการลาอย่างเดียว คุณก็ระบุ Type ไว้ในนั้น
ถ้าคุณอยากนับรวม คุณก็ไม่ต้องระบุ Type
ในโค้ดนั่น มีตัวอย่างการใช้ เงื่อนไขเดียว
ในโค้ดนั่น มีตัวอย่างการใช้ เงื่อนไขหลายเงื่อนไข (ซึ่งมันก็แค่ เชื่อมต่อแต่ละเงื่อนไขด้วย AND) (หรือ OR ถ้าจำเป็น)
คุณก็นำไปประยุกต์ต่อซิครับ ตอนผมส่งไฟล์ให้ ผมก็ย้ำแล้วว่า คุณต้องประยุกต์ต่อเพราะการนับของคุณผมยังไม่ค่อยเข้าใจนัก
การประยุกต์สำหรับงานนี้ มันก็แค่เล่นกับ เงื่อนไขของ ฟังก์ชั่น
เท่ากับ, ไม่เท่ากับ, น้อยกว่า, มากกว่า, Like, Not Like ตัวอย่างที่ผมเขียนไปดูเหมือนกว่ามันจะมีแนวทางให้ดูหลายรูปแบบพอสมควรแล้วนะครับ
ถ้าคุณอ่านโค้ดไม่เป็น คุณก็ตีโจทก์ไม่แตก
ถ้าคุณตีโจทก์ไม่แตก คุณก็ประยุกต์ไม่ได้
ปัญหาคือคุณอ่านโค้ดไม่เป็นหรือเปล่า ลองดูวิธีการอ่าน
x=dlookup("y","t","w = 2 And z Like '" & txtbx & "'")
ให้อ่านว่า ...
x เท่ากับ ค่าของฟิลด์ y ในตาราง t โดยที่...
ต้องเป็น y ของเรคคอร์ดที่มีค่าของฟิลด์ w เท่ากับ 2 และโดยที่....
ต้องเป็น y ของเรคคอร์ดที่มีค่าของฟิลด์ z เขียนเหมือน หรือคล้ายกับ ตัวหนังสือที่อยู่ในคอนโทรลที่ชื่อ txtbx บนฟอร์มปัจจุบัน
8 @R05236
ผมก็ยังไม่เข้าใจความต้องการของงานคุณอยู่ดี ตกลง ยอดคงเหลือปัจจุบัน คุณต้องการ รวมทุกลา หรือว่าแยกลา
ผมก็เลยย้อนไปโหลดไฟล์ของคุณ (รอบสอง) มาดู ซึ่งมี excel มาด้วย
ผมยังไม่เปิด Access เลย
แค่ผมเปิด Excel (ซึ่งรอบแรก ก็มีมาให้) และผมก็เปรียบเทียบกันระหว่าง Excel ครั้งที่ 1 กับ Excel ครั้งที่ 2 ที่คุณส่งมา เห็นดังนี้
ใน Excel ครั้งที่ 1
- มีเงื่อนไขมาให้ "ลาป่วยสะสม ไม่ได้, พักผ่อนสะสมไม่เกิน 30 วัน"
ผมก็ทำไฟล์ขึ้นใหม่ โดย
กำหนดข้อมูลใน tbl_OffType ให้เห็นชัดว่า ชนิดการลาอะไรมีเงื่อนไขอะไรบ้างชัดเจน
และทำฟอร์ม โดยมีการคำนวน "ยอดคงเหลือปัจจุบัน" ต้องเป็นยอดคงเหลือของแต่ละชนิดการลา ไม่มีการนับรวม
แต่ในไฟล์ excel ครั้ง ที่2 ที่คุณส่งมา ในช่องหมายเหตุนั่นอะไรครับ เงื่อนไขใหม่ทั้งหมดเลย มันเพิ่มอะไรมาบ้าง ล่ะครับนั่น
-บ้างลาได้ 8 วัน บ้างลาได้ 15 วัน
-ระบุวันเริ่มต้นปีงบประมาณ
-มีการระบุชนิดบุคคล ว่าคนนี้สถานะเป็นประจำ คนนั้นเป็นชั่วคราว
ผมเห็นเงื่อนไขแล้ว ไม่อยากเปิด access ดูเลย(ว่าคุณเอาไปทำอะไรประยุกต์อะไรไปถึงไหน) เพราะแค่เห็นเงื่อนไขที่เพิ่มขึ้นมา คิดออกทันทีเลยครับ
คุณแก้ Where เท่าไหร่ก็ไม่ลงตัว
เพราะจริงๆ แล้วคุณต้องปรับรูปแบบของตารางใหม่เลยล่ะครับ อาจต้องเพิ่ม หรือลดฟิลด์ อาจต้องเปลียนชนิดข้อมูลของฟิลด์ที่มีอยู่
เงื่อนไขที่คุณเพิ่มมา คือความต้องการของงานคุณ ซึ่งคุณไม่ได้บอกมาตั้งแต่แรก
ตัวอย่างที่ให้ไป ก็ "หลงทาง" ไปไกลพอสมควรครับ ท้อมากที่จะเริ่มใหม่
ไม่รู้จะช่วยคุณยังไงดีเหมือนกันครับ
ผมก็เลยย้อนไปโหลดไฟล์ของคุณ (รอบสอง) มาดู ซึ่งมี excel มาด้วย
ผมยังไม่เปิด Access เลย
แค่ผมเปิด Excel (ซึ่งรอบแรก ก็มีมาให้) และผมก็เปรียบเทียบกันระหว่าง Excel ครั้งที่ 1 กับ Excel ครั้งที่ 2 ที่คุณส่งมา เห็นดังนี้
ใน Excel ครั้งที่ 1
- มีเงื่อนไขมาให้ "ลาป่วยสะสม ไม่ได้, พักผ่อนสะสมไม่เกิน 30 วัน"
ผมก็ทำไฟล์ขึ้นใหม่ โดย
กำหนดข้อมูลใน tbl_OffType ให้เห็นชัดว่า ชนิดการลาอะไรมีเงื่อนไขอะไรบ้างชัดเจน
และทำฟอร์ม โดยมีการคำนวน "ยอดคงเหลือปัจจุบัน" ต้องเป็นยอดคงเหลือของแต่ละชนิดการลา ไม่มีการนับรวม
แต่ในไฟล์ excel ครั้ง ที่2 ที่คุณส่งมา ในช่องหมายเหตุนั่นอะไรครับ เงื่อนไขใหม่ทั้งหมดเลย มันเพิ่มอะไรมาบ้าง ล่ะครับนั่น
-บ้างลาได้ 8 วัน บ้างลาได้ 15 วัน
-ระบุวันเริ่มต้นปีงบประมาณ
-มีการระบุชนิดบุคคล ว่าคนนี้สถานะเป็นประจำ คนนั้นเป็นชั่วคราว
ผมเห็นเงื่อนไขแล้ว ไม่อยากเปิด access ดูเลย(ว่าคุณเอาไปทำอะไรประยุกต์อะไรไปถึงไหน) เพราะแค่เห็นเงื่อนไขที่เพิ่มขึ้นมา คิดออกทันทีเลยครับ
คุณแก้ Where เท่าไหร่ก็ไม่ลงตัว
เพราะจริงๆ แล้วคุณต้องปรับรูปแบบของตารางใหม่เลยล่ะครับ อาจต้องเพิ่ม หรือลดฟิลด์ อาจต้องเปลียนชนิดข้อมูลของฟิลด์ที่มีอยู่
เงื่อนไขที่คุณเพิ่มมา คือความต้องการของงานคุณ ซึ่งคุณไม่ได้บอกมาตั้งแต่แรก
ตัวอย่างที่ให้ไป ก็ "หลงทาง" ไปไกลพอสมควรครับ ท้อมากที่จะเริ่มใหม่
ไม่รู้จะช่วยคุณยังไงดีเหมือนกันครับ
9 @R05250
ลองดูตัวอย่าง รอบที่สองครับ
- ปรับเปลี่ยนโครงสร้างตารางใหม่นิดหน่อย เพื่อให้เอื้อต่อการทำงานของโค้ดใหม่
- ปรับเปลี่ยนโค้ดใหม่นิดหน่อยเพื่อให้เอื้อต่อการทำงานภายใต้เงื่อนไขใหม่
- ปรับเปลี่ยนหน้าตาของฟอร์มอีกนิดหน่อย พร้อมทั้งเขียนคำอธิบายในป้ายกำกับใหม่ เพื่อให้สื่อความหมายได้ชัดเจนยิ่งขึ้น
- พยายามเขียนโค้ดแยกขั้นตอนชัดเจน พร้อมทั้งพยายามเพิ่มความเห็นหรือความหมายของโค้ดในแต่ละบรรทัด เพื่อให้เข้าใจโค้ดได้ง่ายขึ้น
- เพิ่มโมดูลใหม่ 1 ตัว
- เพิ่มคิวรี่ใหม่ 2 ตัว
- เพิ่มฟอร์มย่อย (ใช้ในมุมมอง Pivot table เท่านั้น) อีก 1 ตัว
ทั้งหมดนั่น หาได้ในตัวอย่างใหม่รอบสอง DayOffReport_Revised.mdb
EMAIL : gmail.com
USER : accboard
PASSWORD : accgmail
SUBJECT : การบันทึกวันลาพนักงาน
ลองนำไปประยุกต์ต่อดูครับ
- ปรับเปลี่ยนโครงสร้างตารางใหม่นิดหน่อย เพื่อให้เอื้อต่อการทำงานของโค้ดใหม่
- ปรับเปลี่ยนโค้ดใหม่นิดหน่อยเพื่อให้เอื้อต่อการทำงานภายใต้เงื่อนไขใหม่
- ปรับเปลี่ยนหน้าตาของฟอร์มอีกนิดหน่อย พร้อมทั้งเขียนคำอธิบายในป้ายกำกับใหม่ เพื่อให้สื่อความหมายได้ชัดเจนยิ่งขึ้น
- พยายามเขียนโค้ดแยกขั้นตอนชัดเจน พร้อมทั้งพยายามเพิ่มความเห็นหรือความหมายของโค้ดในแต่ละบรรทัด เพื่อให้เข้าใจโค้ดได้ง่ายขึ้น
- เพิ่มโมดูลใหม่ 1 ตัว
- เพิ่มคิวรี่ใหม่ 2 ตัว
- เพิ่มฟอร์มย่อย (ใช้ในมุมมอง Pivot table เท่านั้น) อีก 1 ตัว
ทั้งหมดนั่น หาได้ในตัวอย่างใหม่รอบสอง DayOffReport_Revised.mdb
EMAIL : gmail.com
USER : accboard
PASSWORD : accgmail
SUBJECT : การบันทึกวันลาพนักงาน
ลองนำไปประยุกต์ต่อดูครับ
10 @R05312
พนักงานราชการสะสมวันลาพักผ่อนไม่ได้ นะครับ
ระเบียบบริหารพนักงานราชการ
ระเบียบบริหารพนักงานราชการ
11 @R05342
มันอาจจะเกี่ยวกับการใช้ Between ลองเปลี่ยนเป็นการใช้
>=........ and <=........... ดูครับ
นับวันให้ถูก หรือไม่ก็
ออนเอ็มเอสเอ็น คุยกันหลังเวลา 18:00น. ของวันนี้ครับ
>=........ and <=........... ดูครับ
นับวันให้ถูก หรือไม่ก็
ออนเอ็มเอสเอ็น คุยกันหลังเวลา 18:00น. ของวันนี้ครับ
12 @R05453
ผมดูไฟล์แล้วงง สับสน ตามต่อไม่ถูก
คุณเปลี่ยนโครงสร้างของตาราง ทำให้งานซ้ำซ้อน
คุณเก็บผลการคำนวนในตาราง (เป็นจุดอ่อน เป็นข้อห้าม เป็นปัญหาของ "การจัดการฐานข้อมูล") เมื่อมีการแก้ไขโค้ดทำให้มองไม่เห็นผลของการเปลี่ยนแปลงในทันที
ในตารางของคุณจะทำให้เป็นตารางของ Access หรือจะทำเป็นตารางของ Excel ครับนั่น คุณจะใส่รายละเอียดอะไรนักหนามันเกินความจำเป็นและบางครั้งยังเขียนโค้ดยากอีก (การจะอัพเดตข้อมูลในฟิลด์ใดๆ ต้องคอยระวังไม่ให้ข้อมูลขัดแย้งกับข้อมูลของฟิลด์ข้างๆ อีก)
วันเริ่มต้น วันสิ้นสุด จำนวนวัน สามฟิลด์นี้ให้เลือกเก็บแค่สองฟิลด์ ไม่ต้องเก็บครบทั้งสาม มันมีปัญหาในภายหลัง มันไม่ Dinamic
นี่มันไม่ใช่ excel นะครับเราไม่ต้องเขียนสูตรลงในแต่ละ cell ไม่จำเป็นต้องมีผลการคำนวนในทุกๆ บรรทัด
"ตาราง" ไม่ได้มีไว้ให้มนุษย์เปิดดู มันมีไว้ให้ระบบมันเก็บมันจำ ถ้ามนุษย์ต้องการดู ให้ดูผ่าน ฟอร์มหรือรายงานหรือเพจเท่านั้น ไม่ต้องไปจัดระเบียบอะไรในตารางให้มันดูสวยงามครบถ้วน
กลับไปใช้ Excel ดีไหม ถ้าคิดว่าถนัดแนวนั้น
คุณเปลี่ยนโครงสร้างของตาราง ทำให้งานซ้ำซ้อน
คุณเก็บผลการคำนวนในตาราง (เป็นจุดอ่อน เป็นข้อห้าม เป็นปัญหาของ "การจัดการฐานข้อมูล") เมื่อมีการแก้ไขโค้ดทำให้มองไม่เห็นผลของการเปลี่ยนแปลงในทันที
ในตารางของคุณจะทำให้เป็นตารางของ Access หรือจะทำเป็นตารางของ Excel ครับนั่น คุณจะใส่รายละเอียดอะไรนักหนามันเกินความจำเป็นและบางครั้งยังเขียนโค้ดยากอีก (การจะอัพเดตข้อมูลในฟิลด์ใดๆ ต้องคอยระวังไม่ให้ข้อมูลขัดแย้งกับข้อมูลของฟิลด์ข้างๆ อีก)
วันเริ่มต้น วันสิ้นสุด จำนวนวัน สามฟิลด์นี้ให้เลือกเก็บแค่สองฟิลด์ ไม่ต้องเก็บครบทั้งสาม มันมีปัญหาในภายหลัง มันไม่ Dinamic
นี่มันไม่ใช่ excel นะครับเราไม่ต้องเขียนสูตรลงในแต่ละ cell ไม่จำเป็นต้องมีผลการคำนวนในทุกๆ บรรทัด
"ตาราง" ไม่ได้มีไว้ให้มนุษย์เปิดดู มันมีไว้ให้ระบบมันเก็บมันจำ ถ้ามนุษย์ต้องการดู ให้ดูผ่าน ฟอร์มหรือรายงานหรือเพจเท่านั้น ไม่ต้องไปจัดระเบียบอะไรในตารางให้มันดูสวยงามครบถ้วน
กลับไปใช้ Excel ดีไหม ถ้าคิดว่าถนัดแนวนั้น
13 @R06152
มีตัวอย่างไพล์บ้างหรือเปล่าเพื่อผมจะได้นำมาใช้บ้างคับ
14 @R06153
คุณ poo กลับไปอ่านหน้าที่ 2 นะครับ
ประมาณล่างๆ น่าจะเป็นความเห็นหมายเลข R05250 ครับ
ประมาณล่างๆ น่าจะเป็นความเห็นหมายเลข R05250 ครับ
15 @R06877
มีตัวที่ทำเสร็จหรือยังผมเอาไปใช้ไม่ได้คับ ขอบคุณมากถ้ามีตัวที่รันสมบูรณ์แล้ว
16 @R07203
รบกวนขอด้วยคนครับ ขอบคุณครับ
ืnavy_papa@hotmail.com
ืnavy_papa@hotmail.com
17 @R07303
มีบ้างหรือเปล่าคับ
poobasen@gmail.com
poobasen@gmail.com
18 @R07992
-รบกวนขอprogramด้วยครับ
ขอบคุณอย่างยิ่งเลย
samai_l@yahoo.com
ขอบคุณอย่างยิ่งเลย
samai_l@yahoo.com
19 @R13403
รบกวนขอด้วยคะ ไปที่ความคิดเห็นที่ R05250 แล้วไม่พบคะ
linhpr@hotmail.com
ขอบคุณคะ
linhpr@hotmail.com
ขอบคุณคะ
20 @R18566
รบกวนขอprogramด้วยค่ะ
ขอบคุณอย่างยิ่งเลย
tasanee@krs.co.th
ขอบคุณอย่างยิ่งเลย
tasanee@krs.co.th
Time: 0.3361s
ดังนั้น x คือ ยอดรวมวันที่ลาไปแล้วในปีนี้
y = dsum(จำนวนวันลา,ตารางหลัก,"year(วันที่ลา) = year(now())-1 and ประเภทการลา =... and ........")
ดังนั้น y คือ ยอดรวมวันที่ลาไปแล้วในปีที่แล้ว
z = 10 -y
z คือ วันลาที่เหลือจากปีที่แล้ว
จะได้วันลาที่เหลือของปีนี้ = (z+10) - x
------------------------------------------------------------------------------
นั่นเป็นการคิดแบบง่ายๆ ทำง่าย
แต่พอทำจริงๆ คุณอาจต้องเพิ่มความซับซ้อนของงานเข้าไป เช่น
การหาค่า z อาจต้องมีการวนลูปเพื่อให้ได้ค่าที่ถูกต้องแน่นอน
1) หาปีที่เริ่มใช้โปรแกรม เข้าตัวแปร a
2) กำหนดให้ ปีแรก (a) มียอดการลายกมา =0
3) วนลูปเพื่อหาการลายกมา ดังนี้
z = 0
for i=a to year(now())-1
c = dsum(จำนวนวันลา,ตารางหลัก,"year(วันที่ลา) = i and ประเภทการลา =... and ........")
z = (z+10) - c
if z <0 then z = 0
next
4) จะได้ค่า การลายกมาที่ครบถ้วน (รวมสุทธิตั้งแต่ปีที่ a จนถึงปีที่แล้ว) ซึ่งอยู่ในตัวแปร z
5) ให้หายอดรวมวันลา ที่ลาไปแล้วของปีนี้ เข้าตัวแปร x (ตอนบนสุดของความเห็นนี้)
6) หายอดวันลาคงเหลือ = เอาผลลัพธ์จากข้อ 4) บวกได้สิทธิ์การลาประจำปี (10) แล้วลบด้วยจำนวนวันที่ลาแล้วในปีนี้ (ผลลัพธ์จากข้อ 5))
จะได้ (z+10) - x