แสดงกระทู้

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 ... 11 12 13 [14] 15 16 17 ... 32
235
มีฟอร์มทั้งหมด 2 ฟอร์มชื่อ "collection","ข้อมูลทั้งหมด" ทั้ง 2 ฟอร์มพนักงานจะเปิดใช้พร้อมกัน
คำถามคือ ปัจจุบันผมใช้งานอยู่หน้าฟอร์ม collection และจะเปลี่ยนไปใช้หน้าฟอร์ม ข้อมูลทั้งหมด อยากให้ ฟอร์ม collection ปิดอัตโนมัติต้องทำยังไงครับ

ที่ฟอร์ม ข้อมูลทั้งหมด ใส่ Event แบบนี้เข้าไปครับ
การทำงานคือเมื่อเราใช้งานอยู่ที่ collectionเมื่อเราไปกดที่  ฟอร์มข้อมูลทั้งหมด
จะทำให้ ฟอร์มข้อมูลทั้งหมด ถูก โฟกัสเราก็สั่งปิดฟอร์ม collection ได้เลย

Private Sub Form_GotFocus()
DoCmd.Close acForm, "collection"
End Sub
โพสต์นี้ได้รับคำขอบคุณจาก: Eik Q Sang, naekkhung

236
ส่งFile และ เพิ่มข้อมูลเบื้องต้นในตาราง และฟอร์มนั้นมาครับ (ถ้าไม่ได้ส่วนตัวมาก)
เดี่ยวผมปรับโค้ดให้ใหม่ ดูแล้วโค้ดไม่ได้ยาวอะไรเลยครับ สั้นๆ เอง
โพสต์นี้ได้รับคำขอบคุณจาก: Tatchawin

237
Ex
รหัสสินค้า          ราคา
  A                    5          บาท
  A                    10        บาท
  A                    15        บาท
อยากให้ query แสดง (ใน query มีแต่ first กับ Last)
รหัสสินค้า          ราคารวมทั้งหมด        ราคาก่อนหน้า     ราคาหลังสุด
  A                        30                      10                  15       


อาจจะมีวิธีดีกว่านี้นะครับ
เท่าที่คิดวิธีได้ก็แบบนี้ คือ หา Last แล้วเอาไปเก็บไว้ แล้วหา Last อีกครั้ง (ใช้ 3 คิวรี่เลย)
1.เมื่อเราสร้างคิวรี่ ได้ Last คือตัวสุดท้ายของ รหัสนั้นมาแล้ว
2.สร้างคิวรี่ใหม่เข้ามาอีกแล้วกำหนดให้ แสดงข้อมูลโดยไม่ให้นำ Last จากข้อ 1 มาแสดง ใช้โค้ด ตรง Criteria ว่า
Not In (select ราคาหลังสุด from [Queryราคาหลังสุด])
เราก็จะได้ราคา ที่เหลืออันอื่นๆ โดยเว้น Last ข้อ 1 ครับ
3.เมื่อได้ข้อ 2 มาแล้วสั่ง Last อีกครั่ง เพื่อหา Last เพิ่มอีกตัว
4.นำมา Join Table กันเพื่อแสดงข้อมูลที่ได้ทั้งหมดครับ


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

238
คือเมื่อ User คีย์ รายละเอียดรายการของที่ลูกค้าสั่ง และ มีรายการลด รวมอยู่ด้วย
เช่นใบเสนอราคารหัส V001 ตามตัวอย่าง
เราก็สร้างคิวรี่เข้ามาเปรียบเทียบ จากรหัสสินค้าที่ มีการปรับเปลี่ยนไปจากเดิม
ก็จะได้ข้อมูลของ ราคาที่ลูกค้าเก่าเคยขอไว้แล้วครับ

ที่ฟอร์ม ลองกรอกรหัสใบเสนอราคา ว่า V001 แล้วกดออกรายงานดูครับ

ปรับใหม่โดยการสร้างรายงาน Sub ครับ
ลองทำตามตัวอย่างที่คุณบอกมา


ตัวอย่างหน้า 1/2




ตัวอย่างหน้า 2/2

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

239
ซับซ้อนดีเหมือนกัน
รออาจารย์ท่านอื่นก่อนนะครับผมยังคิดไม่ออกอิอิ  :sweat:

เช่น
ใบเสร็จเลขที่ V001
รายงานที่ 1
รายการสินค้า
รหัสใบสั่งซื้อ|รหัสสินค้า|ราคาปกติ|ราคาลด
V001       | P1       |25       |25
V001       | P2       |20       |15
V001       | P3       |15       |15
V001       | P4       |30       |25
V001       | P5       |25       |20

รายงานอันที่ 2
รหัสสินค้า    P5    ราคาลด 20  ของใบเสร็จเลขที่ V001  (head group)
รหัสใบสั่งซื้อ|ราคาลด    (details)
V003       | 20
V003       | 15

รหัสสินค้า    P4    ราคาลด 25  ของใบเสร็จเลขที่ V001  (head group)
รหัสใบสั่งซื้อ|ราคาลด    (details)
V004       | 35
V003       | 30


ถ้าแยกพอทำได้ แต่ถ้าหน้าไปหน้า 2 ผมก็ยังทำไม่เป็น รออาจารย์ท่านอื่น
แต่ถ้าแสดงแบบแยกคิวรี่ และคนละรายงานกันก็พอทำได้
แล้วการระบุ ราคาลด และรหัสสินค้าคุณจะทำอย่างไรครับ
โพสต์นี้ได้รับคำขอบคุณจาก: Jiw Jewel

240
เดี่ยวจะลองทำให้ดู
เนื่องจากการเลือก P4 P5 ผมคิดว่าคงไม่ใช่การเลือกแบบตายตัวใช่ไหม
บ้างครั้งอาจจะเลือก P2 P3 หรือ เลือกเพิ่มเติมหลายๆ ตัวผมอาจจะใช้ Listbox ในการเลือกรายการส่วนลด ที่จะแสดงในรายงานด้วยนะครับ
ขอทำตัวอย่างแปป
โพสต์นี้ได้รับคำขอบคุณจาก: Jiw Jewel

241
ส่งออกไป excel
DoCmd.TransferSpreadsheet acExport, acSpreadsheetTypeExcel9, "ชื่อตารางหรือคิวรี่", "ระบุตำแหน่งไฟล์และตั้งชื่อไฟล์ที่Exportออกไป", True, "ชื่อsheetที่ต้องการ"
ตัวอย่าง
DoCmd.TransferSpreadsheet acExport, acSpreadsheetTypeExcel9, "table1", "E:\Myexport.xls", True, "SheetData1"


นำเข้า จาก Excel to Access

หลักการคล้ายๆ กันครับเปลี่ยนจาก acExport มาเป็น acImport
เช่น
DoCmd.TransferSpreadsheet acImport, acSpreadsheetTypeExcel9, "Importเข้าTableไหน", "ตำแหน่งไฟล์และชื่อไฟล์ที่จะนำเข้า", True
ตัวอย่าง
DoCmd.TransferSpreadsheet acImport, acSpreadsheetTypeExcel9, "MyTable", "E:\MyImport.xls", True

acSpreadsheetType นั้นลองเช็คดูนะครับ ว่าของท่านใช้ Excel รุ่นไหน

acSpreadsheetTypeExcel8      Microsoft Excel 97 format
acSpreadsheetTypeExcel9      Microsoft Excel 2000 format
acSpreadsheetTypeExcel12      Microsoft Excel 2010 format
acSpreadsheetTypeExcel12Xml   Microsoft Excel 2010/2013/2016 XML format (.xlsx, .xlsm, .xlsb)
โพสต์นี้ได้รับคำขอบคุณจาก: SSukHaveq

242
สามารถทำได้ตรง Form และ Report ครับ มันจะมี Footer สามารถสร้างการคำนวนได้ครับ
โพสต์นี้ได้รับคำขอบคุณจาก: Jiw Jewel

243
น่าจะแบบนี้ครับ
โค๊ด: [Select]
Sub FieldNames()
    Dim rst, rstOut, strTable  As Recordset
    Dim f As Field
    Dim SQL, RecordName As String
   
    Set rst = CurrentDb.OpenRecordset("tbTarang1")
    Set rstOut = CurrentDb.OpenRecordset("tbfild1")
        rst.MoveFirst
        Do Until rst.EOF
            RecordName = rst!fname
    Set strTable = CurrentDb.OpenRecordset(RecordName)
            For Each f In strTable.Fields
                rstOut.AddNew
                rstOut![tarang] = RecordName
                rstOut![fild] = f.Name
                rstOut.Update
            Next
        rst.MoveNext
        Loop
    rst.Close: Set rst = Nothing
    rstOut.Close: Set rstOut = Nothing
    strTable.Close: Set strTable = Nothing
End Sub
โพสต์นี้ได้รับคำขอบคุณจาก: sjs, nonc31

244
ใช้การกำหนด RowSource ครับ ตัวอย่าง
สมมุติ ชื่อตาราง table1
        ชื่อฟิลล์ที่นำมาแสดงชื่อรายการในคอมโบบ๊อกชื่อ NationalID


Private Sub cbPlantID_AfterUpdate()
Dim SQL As String
If Me.cbPlantID = 5 Then
SQL = "SELECT NationalID  FROM Table1;"
Else
SQL = "SELECT NationalID FROM Table1 WHERE (((PlantID)=[forms]![ชื่อฟอร์มหลัก]![cbPlantID]));"
End If
Forms![ชื่อฟอร์มหลัก]![ชื่อฟอร์มย่อย].Form.cbNationalID.RowSource = SQL
End Sub
โพสต์นี้ได้รับคำขอบคุณจาก: SakDa, Tatchawin

245
ถ้าเราต้องการให้แยก Field ในตาราง ครับ เราต้องเพิ่มทุกช่องใช่ไหมครับ
เช่น ถ้าเราใส่ตรง Number 1 - 10
ก่จะได้
Runnum   : AAA 10ตัว
Runnum1 : 2010 10ตัว
Runnum2 : 0001-0010

แก้โค้ดเป็นแบบนี้
โค๊ด: [Select]
Dim strNum As String
Dim I 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("00000" & I, 4)

     rs.AddNew
        rs![Runnum] = Me.txtModel
        rs![Runnum1] = Me.txtYear
        rs![Runnum2] = strNum
       
     rs.Update
     Next
rs.Close
db.Close
Set rs = Nothing: Set db = Nothing
โพสต์นี้ได้รับคำขอบคุณจาก: nonc31

246
ที่มุมมองออกแบบ บน MainForm ให้คุณกดติ๊กที่ Subform แล้วที่คุณสมบัติของ Subform ดูชื่อจริงๆของ Subformครับมันไม่ได้ชื่อเดียวกับที่คุณตั้งไว้เสมอไป ถ้าจะแก้ให้ตรงต้องแก้ตรงนั้นครับ

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

247

อาจจะเกิดจากสาเหตุอื่นๆ ได้ครับ
เช่นการกำหนด เชื่อมโยงข้อมูลหลัก กับข้อมูลลูก ตรงนี้ก็มีส่วนเหมือนกัน
ต้องดูการกำหนด RecordSource ของคอมโบ txtNationalID ด้วยครับว่าตั้งค่าถูกหรือไม่
โพสต์นี้ได้รับคำขอบคุณจาก: Tatchawin

248
ผมพิมพ์คำว่า เอนก Access มันแก้ไขให้เอง เป็น อเนก
ปกติก็ไปแก้ที่การตั้งค่า แต่พอเป็น Access คั้งแต่ 2010 ขึ้นไป แก้ที่ตรงไหนครับ
ผมลองไปที่ ตั้งค่า > ฐานข้อมูลปัจจุบัน > ตัวเลือกการแก้ไขชื่อัตโนมัติ คลิกที่กล่องคำสั่งออก
แล้วปิดโปรแกรม เปิดใหม่ แต่มันไม่หายครับ ใครรู้ช่วยหน่อยครับ

อยู่ตรง ตั้งค่า > การพิสูจน์อักษร มันจะมีปุ่ม ตัวเลือกการแก้ไขอัตโนมัติ
โพสต์นี้ได้รับคำขอบคุณจาก: Un, sjs

249
มีตาราง A และตาราง ฺB เหมือนกัน แต่ตาราง B ขาดรายการบิลที่ป้อนในเดือนมีนาคม 63(date_sale) ทั้งเดือน เราจะใช้ query แบบ append ได้ไหมครับ และ criteria จะระบุช่วงเดือนอย่างไร?

ใช้Append ได้ครับแต่เงื่อนไขก็คือ ที่ Field date_sale ของตาราง A
โดยใช้การระบุช่วงเดือนโดยใช้ Between

สมมุติชื่อฟอร์ม ชื่อ FormName
มี textbox 2 ตัวชื่อ DateStart และ DateEnd เพื่อใช้ในการระบุวันที่เริ่มต้น และวันที่สิ้นสุด

สร้างปุ่มขึ้นมา 1 ปุ่ม ใส่โค้ดนี้เข้าไป

Dim strSQL As String
strSQL = "INSERT INTO TableB SELECT TableA.* FROM TableA  WHERE TableA.date_sale Between [forms]![FormName]![DateStart] And [forms]![FormName]![DateEnd];"
DoCmd.SetWarnings False
DoCmd.RunSQL strSQL
DoCmd.SetWarnings True
โพสต์นี้ได้รับคำขอบคุณจาก: sjs

250
อ้างถึง
เจอว่าถ้าเราไม่เคลียร์ค่าใน รหัสงาน หรือ ชื่องาน คิวรี่ใน subForm มันทำงานไม่ได้ 
การแสดงข้อมูลที่ผมทำให้ไปตอนแรกคล้ายๆกับการเลือก จังหวัด อำเภอ ตำบล ซึ่งข้อมูลจะเกี่ยวเนื่องกันลงมาเรื่อยๆครับ
บางครั้งที่คิวรี่ไม่ยอมแสดงข้อมูลก็เพราะว่า ข้อมูลจากส่วนบนลงมาไม่อยู่ในกลุ่มเดียวกัน

อ้างถึง
สลับการเคลียร์ค่าระหว่างรหัสงาน กับ ชื่อ งาน คิดว่า เมื่อตอนเราสั่งคลิกบน คอมโบบ็อกซ์
รหัสงาน เสร็จให้คาไว้อยู่ ฟอร์มย่อยแสดงข้อมูล ยังไม่เคลียร์ค่าบนคอมโบบ็อกซ์ combobox jc

ใช้ Events Got_Focus ได้เลยครับ เมื่อ Cersor โฟกัสที่คอมโบบ๊อกไหนEvents ก็จะทำงาน

อ้างถึง
พอเราคลิกเลือก ชื่องาน comboBox jn ก็อยากให้ไปเคลียร์ค่า combobox jc ก่อน แล้วค่อยไปเรียกคิวรี่มาแสดง
ถ้าเราเคลียค่าของ combobox jc ก็แสดงว่า เราต้องการแสดงผลของ ชื่องานที่เราเลือก โดยไม่สนใจว่ารหัสงานอะไรใช่หรือไม่
ถ้าใช้แก้โค้ดตามด้านล่างได้เลย

แก้โค้ดเป็นแบบนี้
โค๊ด: [Select]
Private Sub jc_AfterUpdate()
MultiFilter
End Sub
Private Sub jn_AfterUpdate()
MultiFilter
End Sub
Private Sub jc_GotFocus()
Me.jn.Value = Null
End Sub
Private Sub jn_GotFocus()
Me.jc.Value = Null
End Sub
Private Sub MultiFilter()
Dim sql As String
 sql = "SELECT * FROM [Qry_Sub_F1S1] WHERE [group] Like '" & Nz(Me.gr, "*") & "' AND [Jobcode] Like '" & Nz(Me.jc, "*") & "' AND [jobname] Like '" & Nz(Me.jn, "*") & "'"
 Me.F1S1.Form.RecordSource = sql
End Sub
โพสต์นี้ได้รับคำขอบคุณจาก: SakDa

251
ขั้นแรก backup โปรแกรมตัวเดิมไว้ก่อน

วิธีแรก ลองเช็คการกำหนด reference โดยเข้าไปที่
ที่มุมมองออกแบบ กด Alt + F11 เพื่อเข้าไปในโหมดเขียนโค้ด
ที่ Tab ด้านบนหาคำว่า TOOL  >>>> reference
ตรงในส่วนของ Available reference:
ให้สังเกตุว่า มีตัวไหนที่มีคำว่า (MISSING) อยู่หรือไม่ ถ้ามีให้ติ๊กออกไป
แล้วกด OK ปิดโปรแกรมลองเปิดมาใหม่

วิธีที่สอง เช็คการกำหนด Microsoft Office XX.0 Object Library
สังเกตุที่ Available reference: เหมือนเดิมของท่าน ใช้ icrosoft Office อะไร ครับ ถ้า 2016 ใช้ 16.0  ถ้าตำกว่าก็ลองเลือก Microsoft Office Object Library เวอร์ชั่นต่ำลงมาดูครับ

หรือ ดาวน์โหลด .DLL ตัวที่หายไปมาวางในเครื่อง
LINKDownLoad https://www.dllme.com/getfile.php?file=11630&id=b8d53c80870eaef6758b66f9a0a0d6cd
 โดยตำแหน่งก็ประมาณนี้ แล้วแต่โดยว่าวินโดร์กี่บิท ลองค้นหา ตำแหน่งที่มีโฟลเดอร์
 microsoft shared\OFFICEXX XX คือเลขรุ่น

C:/program files (x86)\common files\microsoft shared\OFFICEXX คือเลขรุ่น

อย่างของผม Office 2010 Dll จะอยู่ที่ C:\Program Files\Microsoft Office\OfficeXX
โพสต์นี้ได้รับคำขอบคุณจาก: กวี

252
ลองดูครับ
โค้ดแก้เป็นแบบนี้นะครับ ที่ combobox ทั้งสามตัว

โค๊ด: [Select]
Private Sub Combo143_AfterUpdate()
MultiFilter
End Sub
Private Sub Combo150_AfterUpdate()
MultiFilter
End Sub
Private Sub Combo181_AfterUpdate()
MultiFilter
End Sub
Private Sub MultiFilter()
Dim sql As String
 sql = "SELECT * FROM [Qry_Sub_F1S1] WHERE [group] Like '" & Nz(Me.Combo150, "*") & "' AND [Jobcode] Like '" & Nz(Me.Combo143, "*") & "' AND [jobname] Like '" & Nz(Me.Combo181, "*") & "'"
 Me.F1S1.Form.RecordSource = sql
End Sub

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


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

หน้า: 1 ... 11 12 13 [14] 15 16 17 ... 32