กระทู้เก่าบอร์ด อ.Yeadram
6,086 30
URL.หัวข้อ /
URL
เรื่องรายงานครับ
สวัสดีครับทุกท่าน
วันนี้ผมมีคำถามเกี่ยวกับเรื่องรายงานครับ
คือผมได้ทำรายงานใน access แล้วต้องการให้ลำดับที่มันรันอัตโนมัติอ่ะครับ ผมได้ลองใส่ ตรง record source ของ textbox อ่ะครับเป็น =1 ปรากฏว่าตอนรันจริงๆ มันขึ้น 1 มาหมดทุกอันเลยครับ ผมใส่ตรงไหนผิดหรือเปล่าครับหรือว่าต้องเพิ่มตรงไหนซักแห่ง
อีกอย่างคือ ผมต้องการเรียกรายงานโดยใช้เงื่อนไขเป็นเดือน คือประมาณว่า ถ้าผมต้องการรายงานของเดือนมกราคม ผมสามารถใช้ field ที่เป็น format มาแล้วได้หรือเปล่าครับ หรือถ้าไม่ได้ ผมจะใช้เป็น Between จะได้หรือเปล่า และ Between ผมต้องประกาศยังไงอ่ะครับ ผมลองใช้เครื่องหมาย # ใส่ปิดหน้าหลังของวันที่แล้ว ปรากฎว่า มันไม่ขึ้นมาตามที่ต้องการอ่ะครับ
ช่วยหน่อยครับ ขอบคุณครับ
วันนี้ผมมีคำถามเกี่ยวกับเรื่องรายงานครับ
คือผมได้ทำรายงานใน access แล้วต้องการให้ลำดับที่มันรันอัตโนมัติอ่ะครับ ผมได้ลองใส่ ตรง record source ของ textbox อ่ะครับเป็น =1 ปรากฏว่าตอนรันจริงๆ มันขึ้น 1 มาหมดทุกอันเลยครับ ผมใส่ตรงไหนผิดหรือเปล่าครับหรือว่าต้องเพิ่มตรงไหนซักแห่ง
อีกอย่างคือ ผมต้องการเรียกรายงานโดยใช้เงื่อนไขเป็นเดือน คือประมาณว่า ถ้าผมต้องการรายงานของเดือนมกราคม ผมสามารถใช้ field ที่เป็น format มาแล้วได้หรือเปล่าครับ หรือถ้าไม่ได้ ผมจะใช้เป็น Between จะได้หรือเปล่า และ Between ผมต้องประกาศยังไงอ่ะครับ ผมลองใช้เครื่องหมาย # ใส่ปิดหน้าหลังของวันที่แล้ว ปรากฎว่า มันไม่ขึ้นมาตามที่ต้องการอ่ะครับ
ช่วยหน่อยครับ ขอบคุณครับ
30 Reply in this Topic. Dispaly 2 pages and you are on page number 1
2 @R02122
ขอบคุณครั?
แล้วถ้าผมต้องการเป็นช่วงของแต่ล่ะปีอ่ะครับ
เช่น ผมมีข้อมูล ช่วงเดือน มกราคม 2545 ถึง ธันวาคม 2546
แต่ผมต้องการแค่ช่วงข้อมูล มิถุนายน 2545 ถึง กรกฎาคม 2545
ผมจะสามารถระบุปีลงไปได้ด้วยหรือเปล่าครับ
แล้วถ้าผมต้องการเป็นช่วงของแต่ล่ะปีอ่ะครับ
เช่น ผมมีข้อมูล ช่วงเดือน มกราคม 2545 ถึง ธันวาคม 2546
แต่ผมต้องการแค่ช่วงข้อมูล มิถุนายน 2545 ถึง กรกฎาคม 2545
ผมจะสามารถระบุปีลงไปได้ด้วยหรือเปล่าครับ
3 @R02128
format([mydate],"mmyy") between [ระบุเดือนปีที่เริ่มต้น 'mmyy'] AND [ระบุเดือนปีที่สิ้นสุด 'mmyy']
4 @R02147
ขอบคุณครับท่าน yeadram
ตอนนี้ มีคำถามมาให้ตอบอีกแล้วครับ แหะๆ
คือผมต้องการที่จะแสดงข้อมูลครอบครัวอ่ะครับ
โดยให้เรียงตามแนวนอน เช่น
โดยให้เรียงไปตามแนวนอนเรื่อยๆ จนกว่าจะหมดอ่ะครับ ปัญหาก็คือผมไม่สามารถแสดงข้อมูลของบุตรคนที่ 2 ได้อ่ะครับ เนื่องจากมันถือว่าเป็นข้อมูลคนละ record (ผมสร้างตารางของบุตรไว้ที่ tblchild โดยให้ strID(รหัสพนักงาน) เป็น FK อ่ะครับ เวลาเพิ่มข้อมูลก็จะเพิ่มไปทีละ record แต่ก็ยังมี strID เป็นตัวบ่งบอกว่าเป็นบุตรที่มีพ่อกับแม่คนเดียวกัน)
ปัญหาอีกข้อครับ ผมต้องการสร้างตารางขึ้นมาเพื่อเก็บข้อมูลพนักงานที่เพิ่งเริ่มงานใหม่ไว้ในตาราง tblNew และเมื่อเวลาผ่านไป 3 เดือนให้มันสามารถ copy ข้อมูลไปที่ตาราง พนักงานทั่วไป (tblemployee) ได้หรือไม่ครับ
ขอบคุณครับ
ตอนนี้ มีคำถามมาให้ตอบอีกแล้วครับ แหะๆ
คือผมต้องการที่จะแสดงข้อมูลครอบครัวอ่ะครับ
โดยให้เรียงตามแนวนอน เช่น
ข้อมูลภรรยา , ข้อมูลบุตรคนที่ 1 , ข้อมูลบุตรคนที่ 2
โดยให้เรียงไปตามแนวนอนเรื่อยๆ จนกว่าจะหมดอ่ะครับ ปัญหาก็คือผมไม่สามารถแสดงข้อมูลของบุตรคนที่ 2 ได้อ่ะครับ เนื่องจากมันถือว่าเป็นข้อมูลคนละ record (ผมสร้างตารางของบุตรไว้ที่ tblchild โดยให้ strID(รหัสพนักงาน) เป็น FK อ่ะครับ เวลาเพิ่มข้อมูลก็จะเพิ่มไปทีละ record แต่ก็ยังมี strID เป็นตัวบ่งบอกว่าเป็นบุตรที่มีพ่อกับแม่คนเดียวกัน)
ปัญหาอีกข้อครับ ผมต้องการสร้างตารางขึ้นมาเพื่อเก็บข้อมูลพนักงานที่เพิ่งเริ่มงานใหม่ไว้ในตาราง tblNew และเมื่อเวลาผ่านไป 3 เดือนให้มันสามารถ copy ข้อมูลไปที่ตาราง พนักงานทั่วไป (tblemployee) ได้หรือไม่ครับ
ขอบคุณครับ
5 @R02150
ปัญหาข้อแรก อาจต้องเขียนฟังกชั่นขึ้นมาเฉพาะ ความยากง่าย ความรวดเร็วขึ้นอยู่กับ เป้าหมายที่จะแสดงผลครับ textbox หรือ textfile
ปัญหาข้อสอง
แนวคิด
- เราจะใช้การรัน sql โดยมีเงื่อนไขคือ วันที่ เกิน 3 เดือน
- ถ้าต้องการแค่ copy แสดงว่าเราจะไม่ลบต้นฉบับออกจาก tblNew ดังนั้นถ้าการรันครั้งต่อไปเกิดขึ้น มันก็มีโอกาสที่จะได้ข้อมูลซ้ำ เราจึงต้องเพิ่มฟิลด์อีกใน tblNew เพื่อไว้บันทึกประวัติ ว่ามีประวัติการ copy แล้วหรือไม่
- แต่ถ้าไม่อยากให้มีตรงนี้ ก็จงอย่าแค่ Copy จงลบข้อมูลต้นทางออกด้วย แล้วมันก็จะไม่ต้องเพิ่มฟิลด์ check
แนวทาง
1 สร้างแมคโคร Autoexec
- มีคำสั่ง Runcode
- ใส่อากิวร์เมนต์เป็นชื่อฟังก์ชั่นของเรา UpdTmpEmp()
2 เขียน Public Function ไว้ในโมดูล
- Public Function UpdTmpEmp()
แบบที่ 1
- - insert into tblemployee (f1,f2, f3) select f1,f2, f3 from tblnew where (อายุงานเกิน 3 เดือน)
- - delete * from tblnew where (อายุงานเกิน 3 เดือน)
แบบที่ 2
- - insert into tblemployee (f1,f2, f3) select f1,f2, f3 from tblnew where (อายุงานเกิน 3 เดือน และเป็นข้อมูลที่ไม่เคย copy)
- - update tblnew set (...ฟิลด์เช็คให้รู้ว่าเป็นข้อมูลที่เคยก็อปปี้แล้ว ..) where (อายุงานเกิน 3 เดือนและยังไม่เคย copy)
- End sub
ปัญหาข้อสอง
แนวคิด
- เราจะใช้การรัน sql โดยมีเงื่อนไขคือ วันที่ เกิน 3 เดือน
- ถ้าต้องการแค่ copy แสดงว่าเราจะไม่ลบต้นฉบับออกจาก tblNew ดังนั้นถ้าการรันครั้งต่อไปเกิดขึ้น มันก็มีโอกาสที่จะได้ข้อมูลซ้ำ เราจึงต้องเพิ่มฟิลด์อีกใน tblNew เพื่อไว้บันทึกประวัติ ว่ามีประวัติการ copy แล้วหรือไม่
- แต่ถ้าไม่อยากให้มีตรงนี้ ก็จงอย่าแค่ Copy จงลบข้อมูลต้นทางออกด้วย แล้วมันก็จะไม่ต้องเพิ่มฟิลด์ check
แนวทาง
1 สร้างแมคโคร Autoexec
- มีคำสั่ง Runcode
- ใส่อากิวร์เมนต์เป็นชื่อฟังก์ชั่นของเรา UpdTmpEmp()
2 เขียน Public Function ไว้ในโมดูล
- Public Function UpdTmpEmp()
แบบที่ 1
- - insert into tblemployee (f1,f2, f3) select f1,f2, f3 from tblnew where (อายุงานเกิน 3 เดือน)
- - delete * from tblnew where (อายุงานเกิน 3 เดือน)
แบบที่ 2
- - insert into tblemployee (f1,f2, f3) select f1,f2, f3 from tblnew where (อายุงานเกิน 3 เดือน และเป็นข้อมูลที่ไม่เคย copy)
- - update tblnew set (...ฟิลด์เช็คให้รู้ว่าเป็นข้อมูลที่เคยก็อปปี้แล้ว ..) where (อายุงานเกิน 3 เดือนและยังไม่เคย copy)
- End sub
6 @R02152
ปัญหาข้อที่ 1 ผมลืมแจ้งไปว่า ผมต้องการแสดงข้อมูลในรายงานอ่ะครับ
ปัญหาข้อที่ 2
ในแนวคิดข้อที่ 2 ผมใช้ Datediff ใช่หรือป่าวครับ
ขอบคุณครับ
ปัญหาข้อที่ 2
ในแนวคิดข้อที่ 2 ผมใช้ Datediff ใช่หรือป่าวครับ
ขอบคุณครับ
7 @R02154
ปัญหา2 ใช้ Datediff ใช่ครับ
หาว่า วันนี้ห่างจากวันเริ่มทำงานเท่าไหร่
ปัญหา 1
แต่ละเรคคอร์ด (ของบุตร) มีฟิลด์มากน้อยแค่ไหน กว้างใหญ่แค่ไหน
แล้วข้อมูลภรรยาล่ะครับมีกี่ฟิลด์ แต่ละฟิลด์กว้างใหญ่แค่ไหน
ข้อมูลทั้งหมดนี้ จะรวมต่อกันเป็น ข้อความเดียวลงใน textbox เดียวหรือว่ายังต้องแยกฟิลด์ไว้เหมือนเดิม
ไปวาดภาพ ระบายสีพื่นและเขียนข้อความกำกับมาด้วยก็ดีครับ ทำใน excel น่ะครับ ว่าต้องการวางอะไรยังไง เรียงลำดับแบบไหน แล้วเซฟเป็นรูปภาพมาให้ดูหน่อยครับ เพราะเท่าที่บอกมา มันเขียนต่อไม่ได้จริงๆ ครับ การจะเขียนฟังก์ชั่นแสดงผลข้อมูลสิ่งสำคัญเราต้องรู้จักข้อมูลครับ
อาจบางทีนะครับ แค่คิวรี่ทำซ้อนกันแค่สองชั้น ก็อาจจะได้งานตามต้องการแล้วก็ได้โดยไม่ต้องเขียนเ?็นฟังก์ชั่นให้เหนื่อย แต่ก็ย้ำว่า อาจจะ
หาว่า วันนี้ห่างจากวันเริ่มทำงานเท่าไหร่
ปัญหา 1
แต่ละเรคคอร์ด (ของบุตร) มีฟิลด์มากน้อยแค่ไหน กว้างใหญ่แค่ไหน
แล้วข้อมูลภรรยาล่ะครับมีกี่ฟิลด์ แต่ละฟิลด์กว้างใหญ่แค่ไหน
ข้อมูลทั้งหมดนี้ จะรวมต่อกันเป็น ข้อความเดียวลงใน textbox เดียวหรือว่ายังต้องแยกฟิลด์ไว้เหมือนเดิม
ไปวาดภาพ ระบายสีพื่นและเขียนข้อความกำกับมาด้วยก็ดีครับ ทำใน excel น่ะครับ ว่าต้องการวางอะไรยังไง เรียงลำดับแบบไหน แล้วเซฟเป็นรูปภาพมาให้ดูหน่อยครับ เพราะเท่าที่บอกมา มันเขียนต่อไม่ได้จริงๆ ครับ การจะเขียนฟังก์ชั่นแสดงผลข้อมูลสิ่งสำคัญเราต้องรู้จักข้อมูลครับ
อาจบางทีนะครับ แค่คิวรี่ทำซ้อนกันแค่สองชั้น ก็อาจจะได้งานตามต้องการแล้วก็ได้โดยไม่ต้องเขียนเ?็นฟังก์ชั่นให้เหนื่อย แต่ก็ย้ำว่า อาจจะ
8 @R02168
ตามรูปน่ะครับ (ขอโทษครับ ที่รูปเล็กแบบนั้น เพราะไม่สามารถทำให้ในหน้าจอเดียวได้เลย ซูมออกแล้วใช้ขีดเส้นบอก)
รายละเอียดน่ะครับ
ของ user จะมีข้อมูล
แล้วจะต่อด้วยของ wife (คู่สมรสน่ะครับ เผอิญผมนึกคำอังกฤษไม่ออก) ของ wife จะมี
แล้วก็จะต่อด้วยของบุตร (child) ครับ โดย child จะมีเหมือนกับ wife ทุกอย่าง
โดยการจัดเรียงจะเป็นแบบนี้ (สมมติมีบุตร 2 คน)
อ่า จุดประสงค์จริงๆ ก็คือต้องการ export ออกมาเป็นไฟล์ excel อ่ะครับ เพราะรายงานจริงๆ แล้วคงแสดงได้ไม่หมดอ่ะครับ ขอบคุณครับ
ตามรูปน่ะครับ (ขอโทษครับ ที่รูปเล็กแบบนั้น เพราะไม่สามารถทำให้ในหน้าจอเดียวได้เลย ซูมออกแล้วใช้ขีดเส้นบอก)
รายละเอียดน่ะครับ
ของ user จะมีข้อมูล
id,idcard,title,name,formername,surname,formersurname,degree,address
แล้วจะต่อด้วยของ wife (คู่สมรสน่ะครับ เผอิญผมนึกคำอังกฤษไม่ออก) ของ wife จะมี
idcard,title,name,formername,surname,formersurname,address,relation
แล้วก็จะต่อด้วยของบุตร (child) ครับ โดย child จะมีเหมือนกับ wife ทุกอย่าง
โดยการจัดเรียงจะเป็นแบบนี้ (สมมติมีบุตร 2 คน)
user_id,user_idcard,user_title,user_name,user_formername,user_surname,user_formersurname,user_degree,user_address, -
wife_idcard,wife_title,wife_name,wife_formername,wife_surname,wife_formersurname,wife_address,wife_relation, -
child1_idcard,child1_title,child1_name,child1_formername,child1_surname,child1_formersurname,child1_address,child1_relation,-
child2_idcard,child2_title,child2_name,child2_formername,child2_surname,child2_formersurname,child2_address,child2_relation
อ่า จุดประสงค์จริงๆ ก็คือต้องการ export ออกมาเป็นไฟล์ excel อ่ะครับ เพราะรายงานจริงๆ แล้วคงแสดงได้ไม่หมดอ่ะครับ ขอบคุณครับ
9 @R02169
ลักษณะนี้คงต้องวนลูป เอาครับ
ตีความโจทก์สร้างสมการจะได้
user 1คน มี 9 ฟิลด์ (1*9)
ภรรยา 1 คน มี 8 ฟิลด์ (1*8)
ลูก 9 คน มีคนละ 8 ฟิลด์ (9*8)
และมีทั้งหมด 9 user
9*(9+8+(9*8)) = 801
คุณต้องให้ โปรแกรมวนลูป 801 รอบ เพื่อจะส่งข้อมูลออก ไป แค่ 9 แถวใน Excel
โอ้ววว มหาศาล (ระวังด้วยก็แล้วกัน excel มันรับได้ กี่คอลัมภ์นะ จำไม่ได้ น่าจะประมาณ 255 คอลัมภ์ อย่าใช้ให้มันหมดล่ะ อิอิ) ซีพียูคงทำงานหนักน่าดู แต่คงไม่เท่าไหร่หรอก กำลังของเครื่องคอมฯ ทุกวันนี้น่าจะพอรับได้กันทุกๆ คนแล้ว และข้อมูลทั้งหมดเป็นแค่ ตัวหนังสือไม่ได้มีภาพ หรือเสียงเข้ามาร่วม น่าจะพอไหว หรือใครมีวิธีที่ดีกว่า แนะนำด้วยนะครับ
สำหรับตอนนี้ แนะนำ function แบบ ลูบล้วนๆ เลยก็แล้วกันครับ
ถ้า user มี 9 คน
แต่ละ user มีภรรยา 1 คน
แต่ละ user มีลูก 9 คน
ตีความโจทก์สร้างสมการจะได้
user 1คน มี 9 ฟิลด์ (1*9)
ภรรยา 1 คน มี 8 ฟิลด์ (1*8)
ลูก 9 คน มีคนละ 8 ฟิลด์ (9*8)
และมีทั้งหมด 9 user
9*(9+8+(9*8)) = 801
คุณต้องให้ โปรแกรมวนลูป 801 รอบ เพื่อจะส่งข้อมูลออก ไป แค่ 9 แถวใน Excel
โอ้ววว มหาศาล (ระวังด้วยก็แล้วกัน excel มันรับได้ กี่คอลัมภ์นะ จำไม่ได้ น่าจะประมาณ 255 คอลัมภ์ อย่าใช้ให้มันหมดล่ะ อิอิ) ซีพียูคงทำงานหนักน่าดู แต่คงไม่เท่าไหร่หรอก กำลังของเครื่องคอมฯ ทุกวันนี้น่าจะพอรับได้กันทุกๆ คนแล้ว และข้อมูลทั้งหมดเป็นแค่ ตัวหนังสือไม่ได้มีภาพ หรือเสียงเข้ามาร่วม น่าจะพอไหว หรือใครมีวิธีที่ดีกว่า แนะนำด้วยนะครับ
สำหรับตอนนี้ แนะนำ function แบบ ลูบล้วนๆ เลยก็แล้วกันครับ
10 @R02170
*********** ทั้งหมดนี่เขียนสด บางพร็อพเพอร์ตี้ บางเมธอด บางคำสั่งอาจจะเขียนผิดไปบ้าง แต่ให้ถือว่า เป็นแนวทางนะครับ ต้องเอาไปปรับไปแก้ ไปเพิ่มเติมเอาอีกครับ ************
dim rsUser
dim rsWife
dim rsChild
dim ex as excel.application
dim sh
set ex = createobject("Excel.application")
ex.workbook.open ("C:\test.xls")
ex.workbook.worksheet(1).active
set sh = ex.workbook.sheet(1)
dim rw as interger
dim cl as integer
dim i as integer
rw=0
cl=0
rsUser.open ..........ข้อมูล user
while not rsuser.eof ' เปิดลูปเรคคอร์ด ของ user
rw= rsUser.absoluteposition
for i = 0 to rsUser.fields.count-1 ' เปิดลูปฟิลด์ของuser
cl=cl+1
sh.cell(rw,cl)=rs(i)
next i
rsWife.open ....... ข้อมูล wife ของ user ผู้นี้
' ภรรยามีคนเดียวไม่ต้องลูปเรคคอร์ด ลูปเฉพาะฟิลด์ก็พอ
for i = 0 to rsWife.fields.count-1
cl=cl+1
sh.cell(rw,cl)=rs(i)
next i
rsWife.close ' สั่งปิดข้อมูลตารางภรรยา
rsChild.open ........... ข้อมูล Child ของ user ผู้นี้
' ลูกอาจจะมีได้หลายคน ต้องเปิดลูปทั้งเรคคอร์ดและเปิดทั้งลูปฟิลด์
while not rsChild.eof
for i = 0 to rsChild.fields.count-1
cl=cl+1
sh.cell(rw,cl)=rs(i)
next i
rsChild.movenext ' เลื่อนเรคคอร์ดไปลูกคนต่อไป
loop
rsChild.close ' สั่งปิดตารางข้อมูล Child
rsUser.movenext ' เลื่อนเรคคอร์ดไป user คนต่อไป
loop
rsUser.close ' สั่งปิดตารางข้อมูล user
ex.workbook.save
' ถึงตรงนี้ก็เลือกได้ว่าจะเปิดดูผลงานใน excel
ex.visible=true
' หรือจะสั่งปิด excel ออกไปเลย
ex.workbook.close
set ex = nothing
*********** ทั้งหมดนี่เขียนสด บางพร็อพเพอร์ตี้ บางเมธอด บางคำสั่งอาจจะเขียนผิดไปบ้าง แต่ให้ถือว่า เป็นแนวทางนะครับ ต้องเอาไปปรับไปแก้ ไปเพิ่มเติมเอาอีกครับ ************
11 @R02172
ขอบคุณครับ
อ่า ผมลองมาคิดดูแล้ว ถ้าสมมติผมเขียนโมดูลให้รันออโต้ในการเลือกข้อมูลของลูกมาแบ่งเข้าตารางทีละลำดับ เช่น บุตรคนที่ 1 ของทุก user ก็ให้อยู่ในตาราง tblchild1 แล้วก็บุตรคนที่ 2 ของทุก user ให้อยู่ในตาราง tblchild2 และค่อยเรียกข้อมูลจากทีละตารางมารวมกันแบบนี้ ใช้ได้หรือเปล่าครับ
และอีกอย่าง การใช้ฟังก์ชั่น excel แบบที่ท่าน yeadram เขียนมาอ่ะครับ จำเป็นหรือเปล่าว่าต้องใช้ DAO(ถ้าผมจำไม่ผิดน่ะครับ) คือผมต้องการถามว่า จำเป็นหรือเปล่าครับที่ต้องใช้ฟังก์ชั่นที่สูงกว่าขั้นพื้นฐานของ access อ่ะครับ
เอาง่ายๆ ผมยังไม่ค่อยเข้าใจเรื่องขั้นสูงอ่ะครับ แหะๆ
ขอบคุณครับ
อ่า ผมลองมาคิดดูแล้ว ถ้าสมมติผมเขียนโมดูลให้รันออโต้ในการเลือกข้อมูลของลูกมาแบ่งเข้าตารางทีละลำดับ เช่น บุตรคนที่ 1 ของทุก user ก็ให้อยู่ในตาราง tblchild1 แล้วก็บุตรคนที่ 2 ของทุก user ให้อยู่ในตาราง tblchild2 และค่อยเรียกข้อมูลจากทีละตารางมารวมกันแบบนี้ ใช้ได้หรือเปล่าครับ
และอีกอย่าง การใช้ฟังก์ชั่น excel แบบที่ท่าน yeadram เขียนมาอ่ะครับ จำเป็นหรือเปล่าว่าต้องใช้ DAO(ถ้าผมจำไม่ผิดน่ะครับ) คือผมต้องการถามว่า จำเป็นหรือเปล่าครับที่ต้องใช้ฟังก์ชั่นที่สูงกว่าขั้นพื้นฐานของ access อ่ะครับ
เอาง่ายๆ ผมยังไม่ค่อยเข้าใจเรื่องขั้นสูงอ่ะครับ แหะๆ
ขอบคุณครับ
12 @R02175
- ถ้าข้อมูลของคุณ มันจำเพาะ ว่า มีแค่ 2 child
ผมว่ายังมีอีกหลายทางเลือกให้ลองใช้ลองเล่นครับ แต่ถ้าเราไม่แน่ใจว่ามันจะแค่สอง จริงหรือเปล่า อันนี้มันก็หมายความว่า จำนวนฟิลด์ มันเป็นแบบ dinamic คือไม่รู้ว่า เรคคอร์ดนี้ มันจะมีฟิลด์รวมกี่ฟิลด์
- วิธีที่ผมให้ไปนั้นตั้งสมมติฐานที่ว่า 1 user มี ภรรยาแค่ 1 คน แต่จะมีลูกกี่คนก็ได้ (เพราะผมไม่แน่ใจว่า มีการจำกัด child ไว้แค่สองคน หรือเปล่า)
- วิธีที่ผมให้ไป ใช้ ADO ก็ได้ ไม่จำเป็นต้อง DAO (จริงๆ ตั้งใจจะให้มันเป็น ADO แม้มันจะสามารถทำได้ด้วย ADO ก็เถอะ)
- วิธีที่ผมให้ไปมันมาจากแนวคิดดังนี้ครับ
1) เราไม่รู้ว่า 1 user จะมี child กี่คน ดังนั้น จำนวนคอลัมภ์ใน excel จึงเป็น dinamic
2) ถ้าเราใช้วิธี คิวรี่ แล้ว export โดยการจองหน่วยความจำไว้ว่า มีลูกมากที่สุด 11 คน นันก็จะทำให้บางเรคคอร์ดที่มีลูกแค่คนเดียว ต้องเปลืองทรัพยาการในการจองพื้นที่เพื่อ ฟิลด์ Null อีก ตั้ง 10 คน
3) ผมก็เลยใช้วิธีวนลูป ให้มันเปิด excel และ access มาพร้อมๆ กัน แล้ว จับวางจาก Access ไปใน cell ของ excel แบบ ฟิลด์ต่อฟิลด์เลย มันจะได้ไม่ต้องจองความจำในแรม แต่การนี้ ก็ต้องหนักเอาการ กับการทำงานอง ซีพียู ซึ่งผมก็ได้ไตร่ตรองคร่าวๆ แล้วว่า มันน่าจะไม่เกินกำลังของคอมฯ ในยุคนี้เท่าไหร่
ผมว่ายังมีอีกหลายทางเลือกให้ลองใช้ลองเล่นครับ แต่ถ้าเราไม่แน่ใจว่ามันจะแค่สอง จริงหรือเปล่า อันนี้มันก็หมายความว่า จำนวนฟิลด์ มันเป็นแบบ dinamic คือไม่รู้ว่า เรคคอร์ดนี้ มันจะมีฟิลด์รวมกี่ฟิลด์
- วิธีที่ผมให้ไปนั้นตั้งสมมติฐานที่ว่า 1 user มี ภรรยาแค่ 1 คน แต่จะมีลูกกี่คนก็ได้ (เพราะผมไม่แน่ใจว่า มีการจำกัด child ไว้แค่สองคน หรือเปล่า)
- วิธีที่ผมให้ไป ใช้ ADO ก็ได้ ไม่จำเป็นต้อง DAO (จริงๆ ตั้งใจจะให้มันเป็น ADO แม้มันจะสามารถทำได้ด้วย ADO ก็เถอะ)
- วิธีที่ผมให้ไปมันมาจากแนวคิดดังนี้ครับ
1) เราไม่รู้ว่า 1 user จะมี child กี่คน ดังนั้น จำนวนคอลัมภ์ใน excel จึงเป็น dinamic
2) ถ้าเราใช้วิธี คิวรี่ แล้ว export โดยการจองหน่วยความจำไว้ว่า มีลูกมากที่สุด 11 คน นันก็จะทำให้บางเรคคอร์ดที่มีลูกแค่คนเดียว ต้องเปลืองทรัพยาการในการจองพื้นที่เพื่อ ฟิลด์ Null อีก ตั้ง 10 คน
3) ผมก็เลยใช้วิธีวนลูป ให้มันเปิด excel และ access มาพร้อมๆ กัน แล้ว จับวางจาก Access ไปใน cell ของ excel แบบ ฟิลด์ต่อฟิลด์เลย มันจะได้ไม่ต้องจองความจำในแรม แต่การนี้ ก็ต้องหนักเอาการ กับการทำงานอง ซีพียู ซึ่งผมก็ได้ไตร่ตรองคร่าวๆ แล้วว่า มันน่าจะไม่เกินกำลังของคอมฯ ในยุคนี้เท่าไหร่
13 @R02177
อ่า ขอลิงค์ศึกษาเรื่องคำสั่ง excel ใน vb หน่อยครับ
ผมยังไม่ค่อยเข้าใจอ่ะครับ เอาแบบภาษาไทยได้ยิ่งดีครับๆ แหะๆ
ขอบคุณครับ
ผมยังไม่ค่อยเข้าใจอ่ะครับ เอาแบบภาษาไทยได้ยิ่งดีครับๆ แหะๆ
ขอบคุณครับ
14 @R02178
http://www.excelexperttraining.com/forums/
เป็นเว็บที่สอนการใช้ Excel ระดับสูง ด้วยภาษาไทย
ตั้งแต่การเขียนสูตร ในชีท และรวมไปถึงการเขียนโค้ด ด้วย VBA (ผมคาดเดานะครับ เพราะจริงๆ แล้วผมก็ไม่ค่อยเข้าไปนัก ถ้าไม่มีความจำเป็น)
ถ้าได้เรียนรู้ การเขียน VBA กับ Excel แล้วนำมาใช้ผ่าน VBA ของ Access อย่างที่ผมเขียนให้ดูนั่นก็ได้ครับ มันอันเดียวกันนั่นแหละครับ แค่...
ถ้าเราจะสั่งการใดๆ กับ Excel โดยผ่านช่องทางอื่นที่ไม่ใช่ VBA ของตัวมันเอง ให้เรา ประกาศตัวแปร object ให้เป็น Excel.Application
แล้วเริ่มบรรเลงได้เลย
จริงๆ ที่ผมเขียน VBA สั่ง Excel มาได้ ใช่ว่าผมจะคล่องอะไรนักหรอก ผมใช้วิธีนี้ครับ (เพื่อหลีกเลี่ยงการเข้าไปศึกษาในบอร์ดตามลิงค์ข้างบน อิอิ)
1. เพิ่ม ไลบรารี่ เข้ามาใน VBA ของเรา Microsoft Exel 10.0
2. ประกาศตัวแปร Dim Ex as Excel.Application
3. ตั้งค่า หรือกำหนดค่า ให้กับตัวแปร ex
- set EX = createobject("EXCEL.APPLICATION")
4. ที่เหลือคือ ผมปล่อยให้เป็นหน้าที่ของ VBA ช่วยผมล่ะครับ
ผมลองเขียน EX. มันก็จะลิสต์คำสั่งที่สามารถใช้ได้มาให้เราดู แล้วผมก็เดาๆ ลองๆ ไปเรื่อยนั่นแหละครับ
เป็นเว็บที่สอนการใช้ Excel ระดับสูง ด้วยภาษาไทย
ตั้งแต่การเขียนสูตร ในชีท และรวมไปถึงการเขียนโค้ด ด้วย VBA (ผมคาดเดานะครับ เพราะจริงๆ แล้วผมก็ไม่ค่อยเข้าไปนัก ถ้าไม่มีความจำเป็น)
ถ้าได้เรียนรู้ การเขียน VBA กับ Excel แล้วนำมาใช้ผ่าน VBA ของ Access อย่างที่ผมเขียนให้ดูนั่นก็ได้ครับ มันอันเดียวกันนั่นแหละครับ แค่...
ถ้าเราจะสั่งการใดๆ กับ Excel โดยผ่านช่องทางอื่นที่ไม่ใช่ VBA ของตัวมันเอง ให้เรา ประกาศตัวแปร object ให้เป็น Excel.Application
แล้วเริ่มบรรเลงได้เลย
จริงๆ ที่ผมเขียน VBA สั่ง Excel มาได้ ใช่ว่าผมจะคล่องอะไรนักหรอก ผมใช้วิธีนี้ครับ (เพื่อหลีกเลี่ยงการเข้าไปศึกษาในบอร์ดตามลิงค์ข้างบน อิอิ)
1. เพิ่ม ไลบรารี่ เข้ามาใน VBA ของเรา Microsoft Exel 10.0
2. ประกาศตัวแปร Dim Ex as Excel.Application
3. ตั้งค่า หรือกำหนดค่า ให้กับตัวแปร ex
- set EX = createobject("EXCEL.APPLICATION")
4. ที่เหลือคือ ผมปล่อยให้เป็นหน้าที่ของ VBA ช่วยผมล่ะครับ
ผมลองเขียน EX. มันก็จะลิสต์คำสั่งที่สามารถใช้ได้มาให้เราดู แล้วผมก็เดาๆ ลองๆ ไปเรื่อยนั่นแหละครับ
15 @R02194
สวัสดีครับ ผมมีคำถามมาแล้วครับ อาจจะเป็นครั้งสุดท้าย(ละมั้ง) แหะๆ
1. เวลาผม export ข้อมูลจาก access ไปยัง excel โดยผมใช้คำสั่ง
แต่ผลที่ได้ออกมาได้ตรงตามที่ต้องการครับ แต่ฟิลด์ start_date ใน excel กลายเป็นว่ากลายเป็นไม่มีค่าอยู่ในฟิลด์ครับ ผมลองคาดเดา อาจจะมาจากคนละ format แต่อันนี้ผมก็จนปัญญาครับ พอมีวิธีแก้ไขหรือเปล่าครับ
2. จากที่ผมถามมาจากข้างบนเรื่องใส่เงื่อนไขทั้งเดือนและปี และผมได้คำตอบจากท่าน yeadram มาให้ใช้เงื่อนไข ดังนี้
เวลากรอกเนี่ยคือกรอก เลขเดือนและปีที่ต้องการเลยหรือเปล่าครับ เช่น ต้องการ เดือนมีนาคม 2552 ก็กรอก 0352 แบบนี้หรือเปล่าครับและผมสามารถใช้ เงื่อนไข นี้ได้ ตามข้อ 1 หรือเปล่าครับในการ export ข้อมูล
3. ถ้าผมต้องการใช้เงื่อนไข Year([start_date]) เนี่ย ค่าที่จะใส่ให้มันจะมีลักษณะอย่างไรครับ (หมายถึงว่า เป็นปี พ.ศ. 2 ตัวสุดท้ายอย่างงั้นหรอครับ)
4. เราสามารถใช้ report เป็นตัว export ไปยัง excel ได้หรือเปล่าครับ
5. ขอคำอธิบายการทำงานของ macro ที่ตั้งชื่อว่า autoexec หน่อยครับ แหะๆ เหมือนกับพอเข้าใจว่า มันจะทำงานอัตโนมัติเวลาเปิดโปรแกรม ไม่ทราบว่า เป็นไปตามนั้นหรือเปล่าครับ
1. เวลาผม export ข้อมูลจาก access ไปยัง excel โดยผมใช้คำสั่ง
sql = "Select * InTo Tmp FROM QryNewEmp where Month([start_date]) like 3" ==>ถ้าต้องการข้อมูลที่มีฟิลด์ start_date เป็นเดือนมีนาคม
แต่ผลที่ได้ออกมาได้ตรงตามที่ต้องการครับ แต่ฟิลด์ start_date ใน excel กลายเป็นว่ากลายเป็นไม่มีค่าอยู่ในฟิลด์ครับ ผมลองคาดเดา อาจจะมาจากคนละ format แต่อันนี้ผมก็จนปัญญาครับ พอมีวิธีแก้ไขหรือเปล่าครับ
2. จากที่ผมถามมาจากข้างบนเรื่องใส่เงื่อนไขทั้งเดือนและปี และผมได้คำตอบจากท่าน yeadram มาให้ใช้เงื่อนไข ดังนี้
format([mydate],"mmyy") between [ระบุเดือนปีที่เริ่มต้น 'mmyy'] AND [ระบุเดือนปีที่สิ้นสุด 'mmyy']
เวลากรอกเนี่ยคือกรอก เลขเดือนและปีที่ต้องการเลยหรือเปล่าครับ เช่น ต้องการ เดือนมีนาคม 2552 ก็กรอก 0352 แบบนี้หรือเปล่าครับและผมสามารถใช้ เงื่อนไข นี้ได้ ตามข้อ 1 หรือเปล่าครับในการ export ข้อมูล
3. ถ้าผมต้องการใช้เงื่อนไข Year([start_date]) เนี่ย ค่าที่จะใส่ให้มันจะมีลักษณะอย่างไรครับ (หมายถึงว่า เป็นปี พ.ศ. 2 ตัวสุดท้ายอย่างงั้นหรอครับ)
4. เราสามารถใช้ report เป็นตัว export ไปยัง excel ได้หรือเปล่าครับ
5. ขอคำอธิบายการทำงานของ macro ที่ตั้งชื่อว่า autoexec หน่อยครับ แหะๆ เหมือนกับพอเข้าใจว่า มันจะทำงานอัตโนมัติเวลาเปิดโปรแกรม ไม่ทราบว่า เป็นไปตามนั้นหรือเปล่าครับ
16 @R02217
ข้อ 1
ถ้าอยากบังคับ ฟอร์มแมตมันอย่าใช้ select * ครับ
จงระบุเป็น ฟิลด์ไปเลย พอถึงฟิลด์ที่ต้องการ ก็กำหนดฟอร์มแมตแล้ว ใช้ As
select fname, fid, format(fDate, "short Date") as ffdate from.....
ข้อ 2.
ต้องกรอกตามฟอร์มแมตครับ ที่พารามิเตอร์ก็ได้พยามจะบอกฟอร์มแมตไปแล้วครับ เพื่อป้องกันการกรอกผิดรูปแบบ และสามารถใช้เงื่อนไขคล้ายๆ อย่างนี้ได้กับทุกงานครับ
ข้อ 3.
year() เป็นฟังก์ชั่นให้ค่ามาเป็นเลขปี 4 หลักครับ
ข้อ 4.
ขณะที่เราเปิดรายงานดูหน้าจอ จะเห็นได้ว่ามันมีเมนูให้สามารถ export ได้ครับ ถ้าต้องการเขียนเป็นโค้ด ผมจำไม่ได้ว่าใช้คำสั่งอะไร แต่ทำได้แน่นอนครับ
ข้อ 5.
เข้าใจถูกต้องแล้วครับ auto-execute
ถ้าอยากบังคับ ฟอร์มแมตมันอย่าใช้ select * ครับ
จงระบุเป็น ฟิลด์ไปเลย พอถึงฟิลด์ที่ต้องการ ก็กำหนดฟอร์มแมตแล้ว ใช้ As
select fname, fid, format(fDate, "short Date") as ffdate from.....
ข้อ 2.
ต้องกรอกตามฟอร์มแมตครับ ที่พารามิเตอร์ก็ได้พยามจะบอกฟอร์มแมตไปแล้วครับ เพื่อป้องกันการกรอกผิดรูปแบบ และสามารถใช้เงื่อนไขคล้ายๆ อย่างนี้ได้กับทุกงานครับ
ข้อ 3.
year() เป็นฟังก์ชั่นให้ค่ามาเป็นเลขปี 4 หลักครับ
ข้อ 4.
ขณะที่เราเปิดรายงานดูหน้าจอ จะเห็นได้ว่ามันมีเมนูให้สามารถ export ได้ครับ ถ้าต้องการเขียนเป็นโค้ด ผมจำไม่ได้ว่าใช้คำสั่งอะไร แต่ทำได้แน่นอนครับ
ข้อ 5.
เข้าใจถูกต้องแล้วครับ auto-execute
17 @R02224
ขอบคุณครับท่าน yeadram มีอีกปัญหาคือ
1. ผมสร้างฟอร์มเพื่อออกรายงานตามเงื่อนไข โดยมีลักษณะ ดังภาพครับ
และโค้ด มีดังนี้ ครับ
ตอน??ี้ ปัญหาก็คือเมื่อผมเลือกฝ่ายงานและใส่ เดือนที่ต้องการ มันจะเกิด error ดังภาพครับ
ผมตีความได้ว่า มีวงเล็บเกินมา ผมเลยพยายามลบวงเล็บออกจนหมดแล้วครับ ก็ยังเหมือนเดิมอยู่ครับ
จนปัญญาแล้วครับ ช่วยหน่อยน่ะครับ ขอบคุณครับ
1. ผมสร้างฟอร์มเพื่อออกรายงานตามเงื่อนไข โดยมีลักษณะ ดังภาพครับ
และโค้ด มีดังนี้ ครับ
Private Sub Label31_Click()
Dim sql As String
Dim rname As String
Dim sect As String
Dim sa As String
Dim day As String
'day = Format(Now, "yy")
Debug.Print day
Select Case frmChoice
Case 1
'rname = "
Case 2
rname = "rptNewByMonth"
Case 3
rname = "rptNewBySectByMonth"
sect = "[section] like '*" & Text22 & "'*"
End Select
Select Case frmMonth
Case 1
sa = "Month([start_date]) like " & txtdat.Text
'sa = "Format([start_date], 'mmyy')" & " like " & txtDate
Case 2
sa = "Month([start_date]) Between " & txtdatefrom & " And " & txtdatend.Text
End Select
Debug.Print "Isnull(Text22) " & IsNull(Text22)
If Not IsNull(Text22) Then
Debug.Print "Chose sa and sect"
sql = sa & " And " & sect
Else
Debug.Print "Choose sa not sect"
sql = sa
End If
Debug.Print "sql = " & sql
DoCmd.Close
DoCmd.OpenReport rname, acViewPreview, , sql
End Sub
ตอน??ี้ ปัญหาก็คือเมื่อผมเลือกฝ่ายงานและใส่ เดือนที่ต้องการ มันจะเกิด error ดังภาพครับ
ผมตีความได้ว่า มีวงเล็บเกินมา ผมเลยพยายามลบวงเล็บออกจนหมดแล้วครับ ก็ยังเหมือนเดิมอยู่ครับ
จนปัญญาแล้วครับ ช่วยหน่อยน่ะครับ ขอบคุณครับ
18 @R02228
ผมดูแค่จากที่ Error มันฟ้องมานะครับ
Month() จะคืนค่าออกมาเป็น Long Integer ดังนั้น Operator ที่ตามหลังมันมา ให้ใช้ = ดีกว่า Like
And [section] Like .......... หลังเครื่องหมายดอกจันตัวสุดท้าย ให้ใส่ single quote เข้าไปอีกตัวหนึ่งครับ ก่อนจะวงเล็บ
แอบย้อนไปดูโค้ดมาคร่าวๆ เจอเจ้านี่ครับ
Dim day as string
เปลี่ยนไปใช้คำอื่น ด่วนๆ เลยครับ
Month() จะคืนค่าออกมาเป็น Long Integer ดังนั้น Operator ที่ตามหลังมันมา ให้ใช้ = ดีกว่า Like
And [section] Like .......... หลังเครื่องหมายดอกจันตัวสุดท้าย ให้ใส่ single quote เข้าไปอีกตัวหนึ่งครับ ก่อนจะวงเล็บ
แอบย้อนไปดูโค้ดมาคร่าวๆ เจอเจ้านี่ครับ
Dim day as string
เปลี่ยนไปใช้คำอื่น ด่วนๆ เลยครับ
19 @R02229
day คือคำสงวนหรอครับ
20 @R02230
day, month, year เป็นชื่อฟังก์ชั่นครับ ในโค้ดของคุณ jOe เองยังใช้ไปตั้งสองสามครั้งเลยครับ ฟังก์ชั่นกลุ่มเดียวกันเลยนะนั่น อิอิ
Time: 0.2168s
- ข้อมูลวันที่ของคุณถ้า ฟอร์แมตมาแล้ว มันต้องเป็นสตริง ถ้าฟอร์แมตนั้นๆ ไม่พลิกแพลงมากเกินไป access ยังพอมองออกว่ามันเป็น "วันที่" อยู่ มันก็อาจจะไม่ต้องทำอะไรมากมาย ให้คุณใช้ between ข้อมูลที่เป็น long ไม่ต้องใส่ # ก็ได้ เช่น month([mydate]) Between 6 and 7
แต่ถ้าหากฟอร์แมตมันพลิกแพลงเกินไปอาจต้องแปลงค่าเดือนกลับให้เป็น Long ก่อน (ด้วยวิธีใดๆ ก็ตามที่คุณสะดวก) เช่น
month(cdate([mydate])) between 6 and 7 หรือ
clng(mid([mydate],4,2)) between 6 and 7