แสดงกระทู้

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 ... 35
1
ว่าจะไม่ยุ่งกับกระทู้นี้ เพราะเห็นคุณ PNR ตอบอยู่
แต่อดไม่ได้จริง เพราะรู้สึกว่ากำลังจะทำให้ได้ฐานข้อมูลที่สร้างปัญหาได้ในอนาคต

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

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

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

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


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

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

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

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

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

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

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

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

5
เป็นมือใหม่ค่ะ หาไม่เจอเลยค่ะ ตามที่สอน เป็นภาษาไทยด้วยค่ะ รบกวนชี้แนะ เพิ่มได้มั้ยคะ
ทำได้ 2 แบบด้วยกัน

1.ตรง textbox เลขที่บิลในรายงานในส่วนรายละเอียด
กดคลิ๊กขวาเลือก เรียงลำดับจากน้อยไปหามากครับ




2.วิธีกำหนด Record Source ของ Report เป็น Query แล้วสั่ง Sort แบบ Ascending ที่ฟิลด์ "เลขที่บิล" ที่อาจารย์บอกมาก็สามารถทำดังนี้



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

6
ขอบคุณค่ะอาจารย์
ก่อนหน้านี้หนูได้ทดลองใช้วิธีลักไก่หลอกโปรแกรมโดยสร้างฟิลด์ใหม่ [Notจังหวัด] ที่คิวรี่ขึ้นมาอีกหนึ่งฟิลด์ค่ะ
แล้วแยกใส่คำสั่งทั้งสองลงไป สามารถตอบโจทย์ที่ต้องการได้แล้วค่ะอาจารย์



สุดยอด สาย DIY อีกคนเปล่าครับนี้  :shout:
โพสต์นี้ได้รับคำขอบคุณจาก: มาลี

7
ถ้าเป็น [Forms]![frmค้นหา]![text1] or Not [Forms]![frmค้นหา]![text2]
จะสามารถทำได้ แต่ถ้ามี Like ด้วยผมไม่เคยทำครับ
โดยปกติจะสร้างเงื่อนไข โดยใช้ IF check เช่น

IF ISnull(text1) and Not isnull(Text2) then
            กำหนด sql ของ Like "*" & [Forms]![frmค้นหา]![text1] & "*"

elseIF  ISnull(text2) and Not isnull(Text1) then
            กำหนด sql ของ Not [Forms]![frmค้นหา]![text2]
end if
โพสต์นี้ได้รับคำขอบคุณจาก: มาลี

8
ขออนุญาตเพิ่มเติมค่ะ
เบื้องต้นลองตั้งค่าตัวเลือกของ Access ดูก่่อนนะคะว่าได้ไหม ตามในรูปค่ะ


1.เปิด active x ก็พอครับ
2.ส่วนการเปิด macro ทั้งหมดนั้นตอนนี้ไม่แนะนำแล้วครับ เพราะมีอันตรายต่อโปรแกรมฐานข้อมูลได้ครับ
   ตรงส่วนของ Macro จะมีแจ้งเตือนให้กดเป็นแถบสีเหลืองสามารถกดยืนยันตรงนั้นได้เลย
   
โพสต์นี้ได้รับคำขอบคุณจาก: I love movies

9
สมมติว่าเรามีรายชื่อลูกค้ากระจายอยู่ในหลายจังหวัด ทีนี้หนูอยากจะให้ค้นหาโดยละเว้นเฉพาะจังหวัดที่เราระบุใน textbox บนหน้าฟอร์มแล้วสั่งไปที่คิวรี่ให้แสดงข้อมูลทุกจังหวัด ยกเว้นจังหวัดที่เราระบุค่ะ
เช่นระบุว่า กรุงเทพฯ ก็ให้ละเว้นเฉพาะกรุงเทพฯอย่างเดียว นอกนั้นแสดงจังหวัดอื่นขึ้นมาทั้งหมดเลยค่ะ

ในคิวรี่ ที่ฟิลล์ของจังหวัด เราสามารถใส่ Criteria
Not Forms![ชื่อฟอร์ม]![ชื่อtextboxบนฟอร์ม]
เท่านี้ ข้อมูลที่จะนำมาแสดง ก็จะไม่มีจังหวัดนั้นแล้วครับ
โพสต์นี้ได้รับคำขอบคุณจาก: มาลี

10
กำหนดให้เป็นเส้นประแบบไหนครับ

ปกติสามารถกำหนดแบบของเส้นได้โดยไปที่ Tab รูปแบบ >> เส้นกรอบรูปร่าง >> ชนิดเส้น ได้เลย
โพสต์นี้ได้รับคำขอบคุณจาก: I love movies

11
ตอนนี้ ข้อความอยู่ใน ส่วนท้ายของหน้า
ให้ลองเอาไปไว้       ส่วนท้ายของรายงาน    ดูนะครับว่าได้ไหม

ถ้ายังไม่ได้กำหนดให้แสดงส่วนท้ายก็กดคลิ๊กขวา แล้วเลือกส่วนหัวและท้ายรายงานด้วย

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

12


เปิด form มาต้องมานั่ง Sort ใหม่ตลอดเลยครับ ใน Query ก็ Sort แล้ว ใน Subform ที่เป็นไฟล์แยกก็ Sort แล้ว

ที่ Recordsource ของฟอร์ม กดเข้าไปกำหนดที่เครื่องหมาย ... และตั้งค่าให้ฟอร์ม เหมือนต้องค่าคิวรี่นั้นแหละ
แล้วกำหนด sort ไว้ก่อนได้เลยครับ

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

13
ต้องการ Requery ใน ComboBox ทุกครั้งที่เปลี่ยน Records ต้องใส่ใน Event ตัวไหนใน Form ครับ

ท่านกดเปลี่ยน Record ตรงไหน ก็ใส่โค้ดตรงนั้นได้เลยครับ

ถ้าท่านสร้างปุ่มสำหรับเปลี่ยน Record ขึ้นมาก็ใช้แบบนี้ได้เลย
สมมุติปุ่มชื่อ BtnNext
โค๊ด: [Select]
Private Sub Btn_Next_Click()
DoCmd.GoToRecord , , acNext
Me.ComboboxName.Requery
End Sub

สามารถ ใช้ได้หลายแบบนะครับ ลองนำไปปรับใช้ดูครับ

DoCmd.GoToRecord , , acNewRec  ไปยัง Record ใหม่
DoCmd.GoToRecord , ,acFirst ไปยัง Record แรก
DoCmd.GoToRecord , , acLast ไปยัง Record สุดท้าย
DoCmd.GoToRecord , , acNext ไปยัง Record ถัดไป
DoCmd.GoToRecord , ,acPrevious ไปยัง Record ก่อนหน้า





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

14
ลองปรับโค๊ดเป็นแบบนี้แล้วทดสอบดูนะครับ

โค๊ด: [Select]
Dim strNum, strBarCode As String
Dim I, amount   As Long
Dim db As Database
Dim rs As Recordset
    Set db = CurrentDb()
    Set rs = db.OpenRecordset("table1", DB_OPEN_DYNASET)
    For I = Me.txtBeginNumber To Me.txtEndNumber
     strNum = Right("0000" & I, 4)
     strBarCode = Trim(Me.txtModel) & Trim(Me.Text15) & Trim(strNum) & "R2"
    If DCount("Barcode", "table1", "[Barcode] ='" & strBarCode & "'") > 0 Then
        MsgBox "มีการลงทะเบียน Barcode นี้แล้ว", vbInformation, "Status"
        Exit Sub
    End If
    If Nz(amount, 0) = 0 Then
    amount = DCount("Barcode", "table1", "[Barcode] ='" & strBarCode & "'")
    Else
    amount = amount + DCount("Barcode", "table1", "[Barcode] ='" & strBarCode & "'")
    End If
 Next I

  'เช็คเงื่อนไขการซ้ำให้เสร็จ แล้วตามด้วย ถ้าไม่มีข้อมูลซ้ำ amount = 0 ก็ทำการบันทึก
 If amount = 0 Then
    For I = Me.txtBeginNumber To Me.txtEndNumber
    strNum = Right("0000" & I, 4)

     rs.AddNew
        rs![Barcode] = Trim(Me.txtModel) & Trim(Me.Text15) & Trim(strNum) & "R2"
       
     rs.Update
     Next
     MsgBox "บันทึกสำเร็จ", vbInformation, "การบันทึก"
rs.Close
db.Close
Set rs = Nothing: Set db = Nothing
End If
โพสต์นี้ได้รับคำขอบคุณจาก: ชวลิต เสนะสุทธิ

15
ผมสมมุติ Formหลักชื่อ FrmMain
           SubForm ทางซ้ายชื่อ SubForm1
           SubForm ทางขวาชื่อ Subform2
           Table ของข้อมูลทางซ้าย ชื่อ EM มีฟิลล์ [รหัสพนักงาน] , [F3]
           Table ของข้อมูลทางขวา ชื่อ NEWEM  มีฟิลล์ [CODEEM] , [EM]
วิธีทำ
1.สร้างคิวรี่ขึ้นมา ใช้ Append Query ใส่ SQL และตั้งชื่อคิวรี่ตามต้องการเช่น QueryAppendToNewEm

INSERT INTO NEWEM ( CODEEM, EM )
SELECT EM.[รหัสพนักงาน], EM.F3
FROM EM
WHERE EM.[รหัสพนักงาน]=[forms]![FrmMain]![SubForm1].[Form]![รหัสพนักงาน];

2.ที่ปุ่มใส่โค้ดไปว่า

DoCmd.SetWarnings False
DoCmd.OpenQuery "QueryAppendToNewEm"
DoCmd.SetWarnings True
[Forms]![FrmMain]![Subform2].[Form].Requery
โพสต์นี้ได้รับคำขอบคุณจาก: AC.Ignorant, Pongsak

16


ตรง Date ผมใช้ Date() และ Time ใช้ Time() ปรากฏว่าเวลาเพิ่ม Row ไปใหม่ มันจะให้ทุก Row เป็นเวลาตอนนี้เลย
ถ้าอยากให้มันเป็นวัน,เวลา บอกเฉพาะ Row ไปว่าเพิ่มมาวันไหนเวลาไหน ไม่ทราบว่าต้องทำอย่างไรครับ
วิธีทำต้องมีฟิลล์ในตาราง เช่น TimeStamp ชนิดข้อมูล date/time
และมีเมื่อการอัพเดทข้อมูล ในฟอร์มกำหนดให้อัพเดทฟิลล์ timestamp  = NOW()  มันจะได้ทั้งวันที่และเวลา มาเลยครับ
เราจะได้ไม่ต้องสร้าง 2 ฟิลล์

หมายเหตุถ้าเมื่อมีการเพิ่มฟิลล์ใหม่กำหนดให้บันทึกเวลาด้วย
ให้กำหนด default Value ของฟิลล์นี้ในตาราง = Now() ไว้ได้เลย
โพสต์นี้ได้รับคำขอบคุณจาก: 001Jetnipit, Pongsak

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