กระทู้เก่าบอร์ด อ.Yeadram
        
           4,571   13		  
          
					  
		    URL.หัวข้อ / 
		    URL
        
        ทำเลข Running Number แบบโค็ต      
    
      ธรรมดาผมจะไม่ใช้ ทำเลข Running Number โดยใช้ Type Auto Number
ผมจะใช้ Text แล้วเวลาใช้ในฟอร์ม ผมจะใช้ Dmax("[ฟิลด์]","ตาราง")+1
งานนนี้ผมเก็บค่าเป็น Text+ตัวเลข เช่น Un00578 ผมจึงต้องอสร้าง Query
แล้วใน Query เลือกฟิลด์นี้มาใส่ฟังชั่น Val(Right(ฟิลด์,5)) ในฟอร์ม Event
AfterUpdate ก็อ้าง แบบนี้ Me.textbox = Dmax("[ฟิลด์]","Query")+1
คำถามมีอยู่ว่า ผมต้องเขียนโค๊ตยังงัยโดยไม่ต้องทำ Query
    
    
  ผมจะใช้ Text แล้วเวลาใช้ในฟอร์ม ผมจะใช้ Dmax("[ฟิลด์]","ตาราง")+1
งานนนี้ผมเก็บค่าเป็น Text+ตัวเลข เช่น Un00578 ผมจึงต้องอสร้าง Query
แล้วใน Query เลือกฟิลด์นี้มาใส่ฟังชั่น Val(Right(ฟิลด์,5)) ในฟอร์ม Event
AfterUpdate ก็อ้าง แบบนี้ Me.textbox = Dmax("[ฟิลด์]","Query")+1
คำถามมีอยู่ว่า ผมต้องเขียนโค๊ตยังงัยโดยไม่ต้องทำ Query
				13 Reply in this Topic. Dispaly 1  pages and you are on page number 1 
				
        
    1 @R14511    
        
  
      DMax("Val(Right(ฟิลด์,5))", "ตาราง") + 1    
    
  
        
    2 @R14517    
        
  
      ไม่ใช่ครับอาจาร TTT
เอาใหม่ ตอนนี้ผมใช้ combobox เลือกข้อมูลแล้ว Event
AfterUpdate ผมใช้คำสั่ง Me.textbox = Dmax("[ฟิลด์]","Query")+1
คำถามมีอยู่ว่า ผมต้องเขียนโค๊ตยังงัยโดยไม่ต้องทำ Query หมายถึง
เอา Query มาเขียนเป็นโค๊ตแทน
SELECT Val(Right([ฟิลด์],5)) FROM ตาราง;
โดยที่บรรทัดนี้มาอยู่ใน AfterUpdate โดยไม่ต้องสร้าง Query ครับ
    
    
  เอาใหม่ ตอนนี้ผมใช้ combobox เลือกข้อมูลแล้ว Event
AfterUpdate ผมใช้คำสั่ง Me.textbox = Dmax("[ฟิลด์]","Query")+1
คำถามมีอยู่ว่า ผมต้องเขียนโค๊ตยังงัยโดยไม่ต้องทำ Query หมายถึง
เอา Query มาเขียนเป็นโค๊ตแทน
SELECT Val(Right([ฟิลด์],5)) FROM ตาราง;
โดยที่บรรทัดนี้มาอยู่ใน AfterUpdate โดยไม่ต้องสร้าง Query ครับ
        
    3 @R14518    
        
  
      งง ครับ    
    
  
        
    4 @R14520    
        
  
      คือผมไม่อยากให้มี Query เยอะ ผมจะเปลี่ยนเป็นโคตแทน 
ปัจจุบันผมก็อ้างถึง Query โดยใช้แบบนี้
Me.textbox = Dmax("[ฟิลด์]","Query")+1
ผมอยากจะเขียนเป็นโคตแทนที่จะอ้างถึง Query
ประมาณแบบนี้
Dim Q As sting
Q=SELECT Val(Right([ฟิลด์],5)) FROM ตาราง;
Me.textbox = Dmax("[ฟิลด์]","Q")+1
ผมลองแล้วมัน Error น่าจะเป็นผิด Syntax
    
    
  ปัจจุบันผมก็อ้างถึง Query โดยใช้แบบนี้
Me.textbox = Dmax("[ฟิลด์]","Query")+1
ผมอยากจะเขียนเป็นโคตแทนที่จะอ้างถึง Query
ประมาณแบบนี้
Dim Q As sting
Q=SELECT Val(Right([ฟิลด์],5)) FROM ตาราง;
Me.textbox = Dmax("[ฟิลด์]","Q")+1
ผมลองแล้วมัน Error น่าจะเป็นผิด Syntax
        
    5 @R14521    
        
  
      คุณ Un ผมคงไม่สามารถตอบคำถามของคุณได้นะ แต่อาศัยความรู้สึกแบบ "ครูพักลักจำ" เอามาจาก อ.ต้อง กับ อ.พิชัย  อาจารย์ทั้งสองท่านสอนให้ทำในคิวรี แล้วแปลงกลับมาเป็นเอสคิวเอล ไม่ทราบว่าคุณพอเข้าใจหรือเปล่า หรือผมไกด์มาถูกทางหรือเปล่า
เอาใจช่วยให้ทำสำเร็จครับ
    
  เอาใจช่วยให้ทำสำเร็จครับ
        
    6 @R14524    
        
  
      ไม่ใช่ครับพี่TheBeginner อันนั้นผมใช้มานานแล้วครับ คือผมมาอ้างไม่ถูกครับ
อย่างที่ อ.พิชัยบอก ทุกอย่างเอามาเขียนเป็น SQL ได้หมด ผมเลยอยากทำดู
แต่ SQL ผมไม่มีพื้นฐานเลย แค่ จำๆ ลองผิดลองถูก เลย ประยุกไม่ได้ครับ
ถึงเสียดาย ครั้งที่แล้ว ติดเวร TT
    
  อย่างที่ อ.พิชัยบอก ทุกอย่างเอามาเขียนเป็น SQL ได้หมด ผมเลยอยากทำดู
แต่ SQL ผมไม่มีพื้นฐานเลย แค่ จำๆ ลองผิดลองถูก เลย ประยุกไม่ได้ครับ
ถึงเสียดาย ครั้งที่แล้ว ติดเวร TT
        
    7 @R14525    
        
  
      ถ้าจะ code แทนการเรียกใช้ผ่าน Query ที่สร้างไว้
- กรณีใช้ที่ RecordSource ใช้ Me.RecordSource = "Select ..." ได้เลยครับ
- กรณีต้องการเอามาใส่ตัวแปรใน code เช่น ตัวแปร Q = "Select ..." อย่างที่คุณ Un ทำไม่ได้นะครับ
ต้องผ่าน RecordSet ดังนี้ครับ
Dim rs As RecordSet
Dim Q as String
Set rs = CurrentDB.OpenRecordSet ("Select ...", ...) 'ส่วนนี้คือการเปิด recordset ควรศึกษาเรื่อง RecordSet เพิ่มเติมเพราะมีวิธีเรียกใช้หลายแบบและรายละเอียดอีกมาก
Q = rs.Fields(0) + 1
...
    
  - กรณีใช้ที่ RecordSource ใช้ Me.RecordSource = "Select ..." ได้เลยครับ
- กรณีต้องการเอามาใส่ตัวแปรใน code เช่น ตัวแปร Q = "Select ..." อย่างที่คุณ Un ทำไม่ได้นะครับ
ต้องผ่าน RecordSet ดังนี้ครับ
Dim rs As RecordSet
Dim Q as String
Set rs = CurrentDB.OpenRecordSet ("Select ...", ...) 'ส่วนนี้คือการเปิด recordset ควรศึกษาเรื่อง RecordSet เพิ่มเติมเพราะมีวิธีเรียกใช้หลายแบบและรายละเอียดอีกมาก
Q = rs.Fields(0) + 1
...
        
    8 @R14526    
        
  
      อ.พิชัยครับ ผมแค่จะเอาค่า Dmax มา+1 ครับ
ตอนนี้ผมใช้ Me.textbox = Dmax("[ฟิลด์]","Query")+1
จะเห็นว่า ผมอ้างถึง Query อยู่ ซึ่งผมอยากได้วิธีที่เอา SQL ของ
Query นั้นมาเขียนเลยครับ เดี๋ยวลองแบบ อาจารย์ดูก่อนครับ
    
  ตอนนี้ผมใช้ Me.textbox = Dmax("[ฟิลด์]","Query")+1
จะเห็นว่า ผมอ้างถึง Query อยู่ ซึ่งผมอยากได้วิธีที่เอา SQL ของ
Query นั้นมาเขียนเลยครับ เดี๋ยวลองแบบ อาจารย์ดูก่อนครับ
        
    9 @R14527    
        
  
      โอเค ได้แล้วครับอาจารย์พิชัย ขอความรู้เพิ่มเติมนิดนึงครับ
Set rs = CurrentDB.OpenRecordSet ("Select ...", ...) บรรทัดนี้คงคล้ายๆ ให้เปิด Query ตาม SQL
Q = rs.Fields(0) + 1 แต่บรรทัดนี้ ไม่เข้าใจครับ Fields(0) เป็นการอ้างอิงถึงอะไร
    
    
  Set rs = CurrentDB.OpenRecordSet ("Select ...", ...) บรรทัดนี้คงคล้ายๆ ให้เปิด Query ตาม SQL
Q = rs.Fields(0) + 1 แต่บรรทัดนี้ ไม่เข้าใจครับ Fields(0) เป็นการอ้างอิงถึงอะไร
        
    10 @R14529    
        
  
      RecordSet หมายถึงการสร้าง Table ในระบบแบบชั่วคราว เมื่อเป็น table ก็จะมี record และมี field อยู่ในนั้นเวลาอ้างถึงข้อมูลใน RecordSet สามารถเรียกใช้ได้ 2 แบบ 1) rs!ชื่อfield หรือ 2) rs.Fields(หมายเลขลำดับของ field)
*ปกติหมายเลขลำดับของ field จะเริ่มที่ 0 ตัวอย่าง Select ID, Name
Fields(0) หมายถึง ID, Fields(1) หมายถึง Name
    
  *ปกติหมายเลขลำดับของ field จะเริ่มที่ 0 ตัวอย่าง Select ID, Name
Fields(0) หมายถึง ID, Fields(1) หมายถึง Name
        
    11 @R14530    
        
  
      การใช้ Aggregate Function เช่น DMax(), DMin(), ...
คือการให้ Access สร้าง RecordSet แล้วนำค่าที่ต้องการมาใช้ได้โดยเขียน code แค่บรรทัดเดียว
* เป็นการอำนวยความสะดวกของ Access แต่ข้อเสียคือมันทำงานช้ากว่าการเปิด RecordSet เอง
ดังนั้นหากไม่ถนัดใช้ RecordSet การใช้ DMax() ในกรณีนี้ก็เป็นเรื่องปกติ
ตัวอย่างของกรณีนี้เป็น
Q = DMax("Val(Right(ฟิลด์,5))", "Select ...") + 1
ตามที่คุณ TTT แนะนำมาก็ใช้ได้ครับ เพียงแต่เปลี่ยนจากชื่อตาราง เป็น SQL statement แทน
    
  คือการให้ Access สร้าง RecordSet แล้วนำค่าที่ต้องการมาใช้ได้โดยเขียน code แค่บรรทัดเดียว
* เป็นการอำนวยความสะดวกของ Access แต่ข้อเสียคือมันทำงานช้ากว่าการเปิด RecordSet เอง
ดังนั้นหากไม่ถนัดใช้ RecordSet การใช้ DMax() ในกรณีนี้ก็เป็นเรื่องปกติ
ตัวอย่างของกรณีนี้เป็น
Q = DMax("Val(Right(ฟิลด์,5))", "Select ...") + 1
ตามที่คุณ TTT แนะนำมาก็ใช้ได้ครับ เพียงแต่เปลี่ยนจากชื่อตาราง เป็น SQL statement แทน
        
    12 @R14531    
        
  
      เท่าที่ทราบ อากิวเมนท์ที่สองของ Aggregate Function ไม่สามารถรับเป็น SQL Statement ได้นะครับ ได้แต่ชื่อเทเบิลหรือคิวรี่เท่านั้น    
    
  
        
    13 @R14532    
        
    
      ขอบคุณอาจารย์สันติสุขที่มาช่วยแก้ครับ
(ปกติผมไม่ได้ใช้ function นี้จึงสับสนไปน่ะครับ)
แก้เป็น
Q = DMax("Val(Right(ฟิลด์,5))", "ตาราง") + 1
เหมือนที่คุณ TTT แนะนำ
แต่เข้าใจว่าคุณ Un ต้องการข้อมูลที่มี criteria ก็เพิ่มเป็น
Q = DMax("Val(Right(ฟิลด์,5))", "ตาราง", "เงื่อนไข") + 1
แทนการสร้าง query รอไว้ได้ครับ
    
  (ปกติผมไม่ได้ใช้ function นี้จึงสับสนไปน่ะครับ)
แก้เป็น
Q = DMax("Val(Right(ฟิลด์,5))", "ตาราง") + 1
เหมือนที่คุณ TTT แนะนำ
แต่เข้าใจว่าคุณ Un ต้องการข้อมูลที่มี criteria ก็เพิ่มเป็น
Q = DMax("Val(Right(ฟิลด์,5))", "ตาราง", "เงื่อนไข") + 1
แทนการสร้าง query รอไว้ได้ครับ
      Time: 0.0622s
    
      
		