แสดงกระทู้

This section allows you to view all posts made by this member. Note that you can only see posts made in areas you currently have access to.


Messages - PNR

หน้า: [1] 2 3 4 ... 36
1

เขียนเป็นโค้ดทั้งหมดวันนี้นึกไม่ออกเลยครับ  :cry: แต่!!!
จากเงื่อนไขข้างบน เราจะสังเกตุได้ว่า ในแต่ละวัน และแต่ละ UserR นั้น จะมี SEQ เดียวกัน
ไม่ว่าการเรียงลำดับนั้นจะมาก่อนหรือมาหลัง

ผมลอง  DIY  ดูก็ได้ผลลัพท์แบบที่ต้องการ แต่ต้องสร้างคิวรี่เพื่อให้ได้ผลลัพท์ แบบในภาพด้านบน
ลองเช็คดูเรียงลำดับจาก Q1  >>> Q2  >>> Q_Result 
และท้ายสุดคือที่ปุ่มอัพเดท ข้อมูลจากคิวรี่ไปยังตารางหลัก

Q1 ดึงกลุ่ม DateR และ UserR ที่มีมาแสดง และกำหนดเลือก Autonumber(First)
     เพื่อนำไปใช้ในการสร้าง การรันลำดับในคิวรี่ต่อไป
Q2 นำกลุ่มที่ได้มา เรียงลำดับ ( กำหนด SEQ ให้แต่ละ DateR และ UserR)
     โดยเงื่อนไขการกำหนด SEQ ต้องมี PK ที่เรียงลำดับจากน้อยไปมากของ Autonumber(First)  ที่ถูกต้อง
     เพื่อการเรียงลำดับที่ถูกต้อง (ถ้าติดปัญหาตรงนี้แจ้งได้เผื่อหาวิธีแก้ไข)
Q_Result แสดงผลในแบบคิวรี่

และที่ปุ่มใส่โค้ดแบบนี้
โค๊ด: [Select]
Dim db As DAO.Database
Dim rst As DAO.Recordset
Dim strDate As String
Dim strUser As String

Set db = CurrentDb()
Set rst = db.OpenRecordset("SELECT * FROM MyTable WHERE ((Not (MyTable.DateR) Is Null));", dbOpenDynaset)

If Not rst.BOF And Not rst.EOF Then
  rst.MoveFirst
End If
  Do Until rst.EOF
        strDate = rst!DateR
        strUser = rst!UserR
    rst.Edit
    rst!SEQrec = DLookup("RunSEQ", "Q2", "cstr(DateR) = '" & strDate & "' and cstr(UserR) = '" & strUser & "'")
    rst.Update
   
     rst.MoveNext
    Loop
    rst.Close: Set rst = Nothing
    db.Close: Set db = Nothing

 



โพสต์นี้ได้รับคำขอบคุณจาก: laemthong

2
กำหนด Events ของฟอร์ม เมื่อโหลด
โพสต์นี้ได้รับคำขอบคุณจาก: I love movies

3
เปลี่ยนจากเครื่องหมาย + เป็น & ก็ได้เลยครับ
Addressall: [Table1].[Address1] & ' ' & [Table1].[Address2] & ' ' & [Table1].[Address3] & ' ' & [Table1].[Address4] & ' ' & [Table1].[Address5] & ' ' & [Table1].[Zipcode]


แต่แนะนำให้ใช้แบบนี้ครับ

ข้อดีคือ ระยะการเว้นวรรคข้อความจะสม่ำเสมอ ในกรณีที่บางฟิลล์ไม่มีข้อมูล
โดยการใช้ IIF มาเช็คเงือนไขในแต่ละฟิลล์ และใช้ Trim มาช่วยในการปรับปรุงการเว้นวรรค

โค๊ด: [Select]
Addressall: Trim(IIf(IsNull([address1]),"",[address1]) & IIf(IsNull([address2]),""," " & [address2]) & IIf(IsNull([address3]),""," " & [address3]) & IIf(IsNull([address4]),""," " & [address4]) & IIf(IsNull([address5]),""," " & [address5]) & IIf(IsNull([zipcode]),""," " & [zipcode]))
โพสต์นี้ได้รับคำขอบคุณจาก: mtaccess

4
เดิมใช้ค่าหน้ากระดาษเป็น A4  พอเปลี่ยนมาเป็น Envelope C5 229 x 162 mm  ข้อความด้านล่างหาย ปรับหลายทีแล้วก็ยังไม่ปรากฎ ควรปรับที่เท่าไหร่คะ

พอเอาไปใส่ส่วนท้ายของหน้า ข้อความปรากฎขึ้นนะคะ แต่ตรงรวมเงิน และ ตัวหนังสือที่แปลงจากจำนวนเงิน ขึ้น Error ค่ะ
เนื้อหาหายอยู่แล้วครับ

A4  =  210 x 297 mm
C5  =  229 x 162 mm

อ้างถึง
พอเอาไปใส่ส่วนท้ายของหน้า ข้อความปรากฎขึ้นนะคะ แต่ตรงรวมเงิน และ ตัวหนังสือที่แปลงจากจำนวนเงิน ขึ้น Error ค่ะ
งั้นหาวิธีแก้ตรงส่วนนี้ดูครับ
โพสต์นี้ได้รับคำขอบคุณจาก: I love movies

5
สร้างไว้พิมพ์บิลค่ะ

เมื่อเปิดฟอร์มขึ้นมาจะเป็นบิลแรกที่พิมพ์ไว้

ถ้าอยากได้ว่า เปิดฟอร์มขึ้นมาเป็นบิลล่าสุด ต้องทำไงคะ
ที่ Events FormLoad ใส่ Docmd.gotorecord,,aclast
เพื่อไปยังบิลสุดท้าย
โพสต์นี้ได้รับคำขอบคุณจาก: I love movies

6
ลงยอดเงิน เช่น 2365.25 จะถูกปัดทิ้ง หรือ ปัดขึ้น เป็น 2365 หรือ 2366 ต้องแก้ยังไงคะ
ถ้าคุณกำหนดdatattype ในตาราง เป็นตัวเลข และกำหนดเป็น Integer หรือจำนวนเติมมันจะปัดเศษหมด
กำหนดดาต้าtype เป็น Double
หรือแปลงค่า ให้เป็น Cdbl()
โพสต์นี้ได้รับคำขอบคุณจาก: I love movies

7
ห้อง MS Access / : การใช้ Do While Loop
« เมื่อ: 27 ธ.ค. 64 , 18:14:51 »
ขาดโค๊ดไปบรรทัดหนึ่ง
ตรงที่ ให้ ไปยัง record แรกก่อน

Dim rst As Recordset
Dim strFirstSalary As String
Set rst = Me.RecordsetClone
If rst.RecordCount = "0" Then
MsgBox "No record"
Else
rst.MoveFirst
strFirstSalary = rst!Salary
DoCmd.GoToRecord , , acFirst
Do Until rst.EOF
Me.ID = strFirstSalary
DoCmd.GoToRecord , , acNext
rst.MoveNext
Loop
End If
โพสต์นี้ได้รับคำขอบคุณจาก: kn208598

8
ห้อง MS Access / : การใช้ Do While Loop
« เมื่อ: 27 ธ.ค. 64 , 15:53:23 »
อ๋อครับ..คือผมยกตัวอย่างเพื่อให้ทราบว่าโค้ดตัวนี้มันผิดอย่างไร และต้องแก้อย่างไรน่ะครับ..ขอบคุณครับ..

ตัวอย่างด้านบนได้เลยครับ

ปกติถ้าจะให้ record ในตาราง นั้นอัพเดทแล้วไปยังเรคคอร์ดต่อไปใช้
rst.movenext อย่างเดียวก็ได้แล้วครับ

แต่ถ้าบนฟอร์มและให้ข้อมูลวางบน Control Textbox ต้องใช้การ gotoRecord เพื่อให้มันสามารถเลื่อนไปยังตัวต่อไปได้ครับ
โพสต์นี้ได้รับคำขอบคุณจาก: kn208598

9
ห้อง MS Access / : การใช้ Do While Loop
« เมื่อ: 27 ธ.ค. 64 , 15:33:55 »
ฟิลด์ Salary มาแสดงที่ฟิลด์ ID ทุกๆเรคคอร์ด

ผมไม่แน่ใจเกี่ยวกับการนำไปใช้งานในอนาคต
กรณีที่มี salary เหมือนกัน ข้อมูล ID ที่เก็บเข้าไปก็จะซ้ำกันนะครับ

วิธีทำง่ายๆใช้ gotoRecord มาช่วยได้ครับ

โค๊ด: [Select]
Dim rst As Recordset
Dim strFirstSalary As String
Set rst = Me.RecordsetClone
If rst.RecordCount = "0" Then
MsgBox "No record"
Else
rst.MoveFirst
strFirstSalary = rst!Salary
DoCmd.GoToRecord , , acFirst
Do Until rst.EOF
Me.ID = strFirstSalary
DoCmd.GoToRecord , , acNext
rst.MoveNext
Loop
End If
โพสต์นี้ได้รับคำขอบคุณจาก: kn208598

10
อ้างถึง
ขอบคุณมากเลยครับ แต่ผมอาจจะอธิบายไปชัดเจน ผมอยากให้ lock record วันที่ 3 ในเดือนถัดไปครับ จะใช้วิธีนี้ได้ไหมครับ?? แล้วมันจะใช้ได้ทุกเดือนไหมครับ??
เช็คเฉพาะวันที่ 3 ของทุกเดือนใช้แบบนี้
SELECT IIf(Day(Mydate)=3,1,0) AS CheckMonth, *  FROM Mytable;

ถ้าอยากให้ วันที่ 3 ของเดือนนี้สามารถเพิ่มหรือแก้ไขข้อมูลได้แต่ของเดือนอื่นๆ ที่ไม่ใช่เดือนนี้ห้ามแก้ไขใส่แบบนี้
SELECT IIf(Day(Mydate)=3 And Not Month(Mydate) = Month(Date()),1,0) AS CheckMonth, *  FROM Mytable;


โพสต์นี้ได้รับคำขอบคุณจาก: pattan0013

11
ใช้ Loop ในการต่อประโยค โดยแสดงฟิลล์ชื่อ ตามเลขที่ๆมีอยู่ในห้องนั้น

คล้ายๆ กับโพสนี้นะครับ
https://www.thai-access.com/index.php?topic=1090.msg4873#msg4873
โพสต์นี้ได้รับคำขอบคุณจาก: SakDa

12
อ้างถึง
สิ่งที่หนูต้องการคือจะแยกเอาเฉพาะ ข้อความแรก มาใช้เท่านั้น
โดยหนูคิดวางแผนว่าจะดักจับเอาช่วงที่เขาเริ่มเว้นวรรคหรือช่วงที่เขาเริ่มใส่วงเล็บ ประมาณนี้ค่ะอาจารย์

ใช้การสร้างฟังชั่นในการแสดงผลในคิวรี่นะครับ
วิธีการ
1 สร้าง Module ใส่ Code
โค๊ด: [Select]
Public Function GetString(FieldTarget As String) As String
Dim CuttingString As String

If Not (InStr(FieldTarget, "(") = 0) Then
CuttingString = Left(FieldTarget, InStrRev(FieldTarget, "(") - 1)
ElseIf Not (InStr(FieldTarget, " ") = 0) Then
CuttingString = Left(FieldTarget, InStrRev(FieldTarget, " ") - 1)
ElseIf Not (InStr(FieldTarget, "") = 0) Then
CuttingString = FieldTarget
End If

GetString = Trim(CuttingString)
End Function

2.ที่คิวรี่ใส่แบบนี้
โค๊ด: [Select]
คำทักทาย: GetString([ทักทาย])
โพสต์นี้ได้รับคำขอบคุณจาก: pirin, OddyWriter, มาลี

13
ว่าจะไม่ยุ่งกับกระทู้นี้ เพราะเห็นคุณ PNR ตอบอยู่
แต่อดไม่ได้จริง เพราะรู้สึกว่ากำลังจะทำให้ได้ฐานข้อมูลที่สร้างปัญหาได้ในอนาคต

คำถามคือสาเหตุที่ต้องการฐานข้อมูลแบบในข้อความแรกคืออะไร
ทั้งนี้เพราะในระบบฐานข้อมูลนั้นควรจะเก็บข้อมูล Non Key แบบเชิงเดี่ยว

เพราะถ้ามีข้อมูลชุดเดียวกันอยู่ใน 2 ตาราง มันจะทำให้เกิดความสับสนเมื่อใช้งานไปนานๆ ได้

สำหรับการแก้ปัญหาของคุณนั้น ทำได้ง่ายมากคือ
1. ลบฟิลด์ "ชนิด" ในตารางหลักออกไป
2. ถ้าต้องการรู้ว่าคนไหนมีชนิดอะไร ให้สร้างคิวรี ที่เชื่อมข้อมูลรหัสของทั้ง 2 ตาราง แล้วดึงฟิลด์ รหัส,ชื่อ,ชนิด มาแสดงผล ก็จะได้อย่างที่คุณต้องการแล้วครับ

ทั้งนี้ยกเว้นคุณมีจุดประสงค์อื่น เช่นต้องการบันทึกการเปลี่ยนแปลงชนิด แบบนี้ก็ต้องสร้างตารางบันทึกการเปลี่ยนแปลงชนิด ซึ่งก็ต้องมีฟิลด์วัน-เวลา เพื่อเก็บข้อมูลด้วย
ผมได้รีโมทไปทำแบบนั้นให้เขาแล้วครับอาจารย์
โดยใช้คิวรี่ในการเชื่อมข้อมูลมาแสดงครับ
1.ตอนแรกไม่ค่อยเข้าใจโจทย์เมื่อได้เห็นการออกแบบก็ทำให้แล้วเป็น ถ้าแสดงข้อมูลธรรมดา
โค๊ด: [Select]
SELECT [TBLข้อมูลหลัก].[รหัส], [TBLข้อมูลหลัก].[ชื่อ], [TBLชนิด].[ชนิด]
FROM TBLชนิด INNER JOIN TBLข้อมูลหลัก ON [TBLชนิด].[รหัส] = [TBLข้อมูลหลัก].[รหัส];


โพสต์นี้ได้รับคำขอบคุณจาก: 001Jetnipit

14
งั้นของผมควรใช้วิธีแรกใช่ไหมครับ

แล้วแต่การใช้งานครับ ลองสร้าง คิวรี่ใหม่แล้วเอา SQL นี้ไปวางแล้วรันดูครับ

โค๊ด: [Select]
SELECT DLookUp("ชนิด","TBLชนิด","รหัส = '" & [รหัส] & "'") AS ชนิด, [TBLข้อมูลหลัก].*
FROM TBLข้อมูลหลัก;
โพสต์นี้ได้รับคำขอบคุณจาก: 001Jetnipit

15
จากตัวอย่างนั้น มี 2 ตาราง
การที่จะแสดงข้อมูลได้นั้นสามารถทำได้ 2 แบบ คือ
1. ใช้คิวรี่ในการแสดงผล (แบบนี้ใช้การ Dlookup ก็ได้ครับ) ถ้าอยากได้แบบใช้คิวรี่แสดงผล เดี่ยวทำให้ดู

2.คือให้อัพเดทข้อมูล ชนิด  ในตารางข้อมูลหลัก
โค๊ด sql ที่ให้ไปนั้นจะต้องสร้าง query ใหม่ขึ้นมาใช้งาน จะใช้สำหรับอัพเดทข้อมูลให้ตารางข้อมูลหลักก่อนการแสดงผลครับ
โพสต์นี้ได้รับคำขอบคุณจาก: 001Jetnipit

16
ใช้ Update Query ได้ครับ

เช่น
โค๊ด: [Select]
UPDATE TBLชนิด INNER JOIN TBLข้อมูลหลัก ON [TBLชนิด].[รหัส] = [TBLข้อมูลหลัก].[รหัส] SET [TBLข้อมูลหลัก].[ชนิด] = [TBLชนิด]![ชนิด];
โพสต์นี้ได้รับคำขอบคุณจาก: 001Jetnipit

หน้า: [1] 2 3 4 ... 36