แสดงกระทู้

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 - สันติสุข

หน้า: 1 ... 14 15 16 [17] 18 19
289
สมมุติชื่อฟิลด์คือ N และ P สำหรับชื่อและคะแนน  และชื่อเท็กซ์บ็อกซ์ชื่อ txtS, txtN และ txtP ตามลำดับ ให้สร้างเท็กซ์บ็อกซ์ txt1 เพิ่มเพื่อแสดงลำดับแทน txtS   ส่วน txtS ให้กำหนด Visible property เป็น False แทน   ให้ใส่ Control Source property ของ txt1 เป็น

= iif( [txtN] = Dmin("N","ชื่อเทเบิล","P = [txtP]") , [txtS] , "" )   (ต้องมีเครื่องหมาย = ด้วย)
โพสต์นี้ได้รับคำขอบคุณจาก: แดนชัย, diehard4

290
    Dim N As Integer
   
    For N = 2 To 50
        Me("Text" & CStr(N)).Enabled = Not IsNull(Me.Text1)
    Next
โพสต์นี้ได้รับคำขอบคุณจาก: pirin, มาลี

291
ผมคงเข้าใจอะไรผิดไป แต่โดยส่วนตัวผมยังไม่ค่อยไว้ใจมันเท่าไหร่
โพสต์นี้ได้รับคำขอบคุณจาก: TTT, Ongart

292
เท็กซ์บ็อกซ์ด้านขวา เป็นชื่อ Text... ทั้งนั้นเลย ต้องแก้ให้เป็น Space2,SerialNo,...
โพสต์นี้ได้รับคำขอบคุณจาก: Earth

293
ขอบคุณอ.สันติสุขนะครับ
แต่ดูเหมือนว่าผมใช้ฟิวอื่นสร้างความสัมพันธ์ไม่ได้ครับ มันจะไม่เป็นหนึ่ง-ต่อ-กลุ่ม ผมจะต้องยกเลิกCompact ฐานข้อมูลอัตโนมัติตอนปิดได้ไหมครับ แล้วใช้ฟิลด์ประเภท Autonumber เชื่อมความสัมพันธ์เหมือนเดิม (รู้แล้วว่าทำไมโปรแกรมขายสินค้าที่ผมเขียนก่อนหน้านี้และใช้อยู่ บิลแรกสุดตอนรับสินค้าข้อมูลหายหมดยกบิลเลย หายหลังจากที่ผมทำCompact ฐานข้อมูลด้วยครับ)

เราสร้างเลขบิลเองดีกว่าครับ ควบคุมเองอย่าให้ซ้ำกับเลขเดิม แม้เลขเดิมจะถูกลบไปแล้วก็ตาม ก็จะไม่สร้างซ้ำ ในความเห็นของผม autonumber ฟิลด์ เรามีไว้เพื่อให้ระบบของฐานข้อมูลเองสามารถอ้างเรคอร์ดได้ แต่ไม่กำหนดความหมายในแง่ของระบบที่เราพัฒนา (อย่างเช่น ให้ความหมายว่าเป็นเลขบิล) ดังนั้นระบบของเราจะได้ไม่ต้องไปขึ้นกับความไม่แน่นอนของเลขนี้ ซึ่งถ้าเราทำเองแล้ว เรื่องการ Compact ก็ไม่ต้องกังวล จะมีหรือไม่มีก็ไม่ใช่ปัญหาแล้ว
โพสต์นี้ได้รับคำขอบคุณจาก: Ongart

294
อ.สันติสุข ช่วยขยายความได้ไหมครับ ที่ว่า "เมื่อมีการ Compact ฐานข้อมูลแล้ว ค่าของฟิลด์ Autonumber จะถูกจัดเรียงใหม่ให้ต่อเนื่องกันไปโดยไม่สนใจค่าเดิม" มันจะเกิดขึ้นกรณีไหนบ้างครับ นี่คือความรู้ใหม่ของผมเลยอะครับ เพราะเท่าที่ทราบ การ Compact จะทำให้ฟิลด์ AutoNumber รันลำดับใหม่แค่เรคคอร์ดสุดท้าย ให้ต่อเนื่องกันเท่านั้นเอง ไม่ได้ไปเรียงเรคคอร์ดใหม่ที่มีค่าอยู่แล้วหนิครับ แล้วในฐานข้อมูล Northwind ของทางไมโครซอฟเองก็ใช้ฟิลด์ AutoNumber ในการเชื่อมความสัมพันธ์กันแทบทุกตารางเลยครับ เลยอยากขอความเห็นของอาจารย์หน่อยครับ ว่ากรณีไหนบ้าง?
ปล. ขออภัยหากอ่านความหมายของ อาจารย์ผิดไปครับ

ใช่ครับ หมายถึงถ้ามีการลบกี่เรคอร์ดก็ตามที่มีค่า autonumber เรียงต่อเนื่องกันไปจนถึงเรคอร์ดที่มีค่า autonumber มากสุด หลัง compact ฐานข้อมูลหลักแล้ว (ฐานข้อมูลที่มีเทเบิลนั้นอยู่จริง ไม่ใช่ฐานข้อมูลที่เราสร้าง linked table) มันจะรันค่าของ autonumber ต่อจากค่าที่มากที่สุดใหม่อีกครั้ง ไม่ได้หมายถึงค่าเดิมที่บันทึกอยู่แล้วจะถูกสร้างใหม่ ทีนี้เนื่องจากการที่มันเป็นค่าที่ระบบสร้างขึ้นมาเอง เรคอร์ดที่สัมพันธ์กันจะเชื่อมั่นได้อย่างไรว่าจะอ้างกลับมายังเรคอร์ดเก่า (ที่ถูกลบไปแล้ว) หรือเรคอร์ดใหม่ที่มีเลข autonumber เดียวกับเรคอร์ดเก่า แต่ถ้าเราสร้างเลขเอง อันนี้เราเชื่อได้แน่ว่าเลขใหม่จะไม่ซ้ำกับเลขที่มีอยู่เดิม แต่ปัญหานี้ก็อาจหมดไป ถ้าเราระบุ Cascade delete record ให้กับความสัมพันธ์นั้นด้วยครับ
โพสต์นี้ได้รับคำขอบคุณจาก: TTT, Ongart

295
ห้ามใช้ฟิลด์ประเภท Autonumber เชื่อมความสัมพันธ์กับเทเบิลอื่น (Bill.BillNo เชื่อมกับ Order.BillNo) เพราะเมื่อมีการ Compact ฐานข้อมูลแล้ว ค่าของฟิลด์ Autonumber จะถูกจัดเรียงใหม่ให้ต่อเนื่องกันไปโดยไม่สนใจค่าเดิม ดังนั้นค่าเดิมของฟิลด์ Autonumber ที่อยู่ในเทเบิลอื่น (Order.BillNo) มีโอกาสอ้างกลับมายังเทเบิลหลัก (Bill) ผิดเรคอร์ดทันที
โพสต์นี้ได้รับคำขอบคุณจาก: ekppom, Un, TTT, Ongart

296
ก็ต้องแก้ตรงๆกำปั้นทุบดิน คืออย่าให้ฟิลด์ที่เป็นคีย์หลักมีค่าว่างหรือ Null ครับ
โพสต์นี้ได้รับคำขอบคุณจาก: kitisak

297
1.คำสั่ง DoCmd.RunSQL"......" 
    ผมเห็นมีหลายคำสั่งที่ใช้ได้ เช่น SELECT,UPDATE,INSERT INTO,DELETE,CREATE TABLE,ALTER TABLE,DROP TABLE
    ซึ่งลักษณะการใส่คำสั่ง เป็นลักษณะ DoCmd.RunSQL"SELECT [field name] FROM [table name]"
    ซึ่งถ้าผมจะสร้างคำสั่งนี้เป็น Function ไว้ใช้ใน Module อื่นๆ โดยอยากให้ [field name] และ [table name] เป็นตัวแปร
    จะสามารถทำได้ไหมครับ เช่น
    A = fieldname
    B = tablename
    DoCmd.RunSQL"SELECT A FROM B"
- .RunSQL method เป็นคำสั่งที่ต้องการ SQL statement ที่ไปทำอะไรกับข้อมูลเท่านั้น การอ่านเรคอร์ดออกมาเฉยๆด้วย SELECT statement นั้นใช้ไม่ได้กับ .RunSQL ครับ  แต่ถ้า SELECT ... INTO ... อันนี้ใช้ได้ เพราะเป็นการสร้างเรคอร์ดที่ได้จากการอ่านอีกที
- ทำเป็นฟังก์ชั่นได้ครับ แต่ผมไม่เห็นประโยชน์ในการทำอย่างนั้น เพราะฟังก์ชั่นจะมีแค่คำสั่งเดียวอยู่ดี ซึ่งไม่แตกต่างอะไรกับการสั่ง .RunSQL ตามธรรมดาๆเลย

2.คำสั่งต่างๆที่อ.สันติสุขให้ผมมาเพิ่มเติมเช่น DLookUp,DFirst,... เป็นคำสั่งของ SQL ใช่ไหมครับ ถ้าเป็น SQL ผมก็สงสัยแบบข้างบนน่ะครับ
- ไม่ใช่ครับ เป็นฟังก์ชั่นของตัว Access เอง ไม่ได้ผ่าน DAO/ADO แต่อย่างใด ทำงานได้เทียบเท่าบางคำสั่งของ SQL เท่านั้น

3.วิธีที่อ.สันติสุขแนะนำคือให้ Excel ไปสร้างตารางใน Access หรือ ให้ Access ไปอ่านค่าจาก Excel มาสร้างตารางครับ
    ผมงงตรงที่ อ.สันติสุข พูดถึงการอ่านค่าใน tblFactor ใน Excel เพื่อไปใส่ค่าใน Access ทีละ Record ครับ
- เพราะเห็นบอกว่าการป้อน tblFactor ลง Access ตรงๆ (เทเบิลที่มีฟิลด์ Row Header, Column Header, Pivot Value) อาจมี human error ได้ ผมก็เลยคิดว่างั้นก็ป้อนเป็นตารางใน Excel อย่างเดิมที่ส่งรูปมานี่แหล่ะ แต่ให้โค้ด VBA ใน Access อ่านตารางนี้ แล้วแปลง 1 pivot ใส่เป็น 1 เรคอร์ดลงเทเบิล tblFactor ใน Access อีกที (พอดีใช้ชื่อเดียวกันก็เลยทำให้สับสน)

4.Excel.Application คือคำสั่งให้ Access สามารถใช้งานคำสั่งใน Excel ได้รึเปล่าครับ ผมหาวิธีค้นหาในเวปนี้ไม่เจอน่ะครับ เห็นช่องค้นหา
   ในหน้าแรกแล้วไปค้นหาใน Google
- เป็น keyword ที่จะช่วยหากระทู้เก่าที่พูดคุยถึงโค้ดที่จะอ่านข้อมูลจาก Excel เท่านั้นครับ ลองดูอันนี้ น่าจะใกล้เคียงครับ www.thai-access.com/yeadram_view.php?topic_id=4430

5.สอบถามเพิ่มเติมเกี่ยวกับชื่อ table ครับ พอดีผม Import ข้อมูลออกมาจากโปรแกรมคำนวนทางวิศวกรรม
    แล้วชื่อเป็นลักษณะ [Frame Force Assignments] เลยอยากทราบว่าชื่อ Table ควรไม่มีเว้นวรรครึเปล่าครับ
    ผมจะสามารถลบเว้นวรรค หรือ แทนค่าเป็น _ จาก table ที่ผม Import 30 กว่า table ด้วย vba หรือ sql ได้ไหมครับ
- Access/DAO/ADO รองรับชื่อที่มี space อยู่ภายในได้ เวลาอ้างถึงก็เพียงใส่ [ ] ครอบชื่ออย่างที่คุณเขียนมานี่แหล่ะครับ

ขอบพระคุณ อ.สันติสุข มากๆเลยครับ
- ขอบคุณครับ
โพสต์นี้ได้รับคำขอบคุณจาก: Parnu

298
- ถ้าจะไม่ต้องยุ่งกับ DAO/ADO เลยก็คือ สั่ง INSERT/UPDATE/DELETE ผ่านคำสั่ง
  DoCmd.RunSQL "INSERT/UPDATE/DELETE statement"

- อ่านค่าฟิลด์จากเรคอร์ด (อ่านได้เรคอร์ดเดียวเท่านั้น)
  ตัวแปร = DLookup("ชื่อฟิลด์", "ชื่อเทเบิล/คิวรี่", "เงื่อนไขการเลือกเรคอร์ด")

- อ่านค่าฟิลด์จากเรคอร์ดแรก/สุดท้ายที่หาได้
  ตัวแปร = DFirst/DLast("ชื่อฟิลด์", "ชื่อเทเบิล/คิวรี่", "เงื่อนไขการเลือกเรคอร์ด")

- อ่านค่าฟิลด์ที่มากสุด/น้อยสุดจากเรคอร์ดที่หาได้
  ตัวแปร = DMax/DMin("ชื่อฟิลด์", "ชื่อเทเบิล/คิวรี่", "เงื่อนไขการเลือกเรคอร์ด")

- อ่านจำนวนเรคอร์ดที่หาได้
  ตัวแปร = DCount("ชื่อฟิลด์", "ชื่อเทเบิล/คิวรี่", "เงื่อนไขการเลือกเรคอร์ด")

- อ่านค่าเฉลี่ยของฟิลด์จากเรคอร์ดที่หาได้
  ตัวแปร = DAvg("ชื่อฟิลด์", "ชื่อเทเบิล/คิวรี่", "เงื่อนไขการเลือกเรคอร์ด")

- อ่านค่าผลรวมของฟิลด์จากเรคอร์ดที่หาได้
  ตัวแปร = DSum("ชื่อฟิลด์", "ชื่อเทเบิล/คิวรี่", "เงื่อนไขการเลือกเรคอร์ด")

- กรณีอ่าน tblFactor ใน Excel คิดว่าคุณคงทำได้อยู่แล้ว ก็ลูปไปทีละบรรทัด จนกว่าหัวคอลัมน์จะว่างๆ (ไม่มี Type ต่อไปแล้ว) ก็จะขึ้นบรรทัดใหม่ ถ้าหัวบรรทัดว่างๆ ก็แปลว่าไม่มี Case ต่อไปแล้ว ส่วนค่า Pivot ก็เอาเฉพาะที่ไม่เป็นค่าว่างเขียนลง tblFactor ใน Access และเนื่องจากเราสร้างโครงสร้างเทเบิลให้เรคอร์ดนึงมี 3 ฟิลด์ คือ Row Header, Column Header, Pivot Value ดังนั้นไม่ว่าใน Excel จะมีกี่ Type (Column) กี่ Case (Row) เราก็เอาลงเทเบิลใน Access ทีละเรคอร์ดได้ไปเรื่อยๆโดยไม่ต้องแก้โครงสร้างใดๆครับ

- สำหรับคำสั่งให้ Access ไปอ่านไฟล์ Excel   คุณลองค้นด้วยคำว่า Excel.Application ในเวปนี้ดูครับ
โพสต์นี้ได้รับคำขอบคุณจาก: Parnu

299
tblFactor สร้างใน Access ไปเลยได้ไหม ให้อยู่ในรูปแบบ Row Header, Column Header, Pivot Value เช่น

1,A,1
1,B,2
2,A,1
2,B,1
2,C,2
3,A,2

tblType ก็นำเข้า Access เช่นกัน ใช้โครงสร้างตามที่คุณเขียนมาได้
โพสต์นี้ได้รับคำขอบคุณจาก: Parnu

300
ตัดบรรทัดเหล่านี้ออกไป

Set rst = CurrentDb.OpenRecordset("select * from Table2")
numOfRecords = rst.RecordCount

เพราะเหมือนไม่ได้เกี่ยวอะไรกับสิ่งที่ต้องการทำเลย ยกเว้นว่าจะมีการเอา numOfRecords ไปใช้ที่อื่น
โพสต์นี้ได้รับคำขอบคุณจาก: Earth

301
Report Header/Footer Section จะแสดงครั้งเดียว ถ้าแสดงทุกหน้าต้องใช้ Page Header/Footer Section แทนครับ
โพสต์นี้ได้รับคำขอบคุณจาก: Eik Q Sang

302
ไม่ต้องไปนั่งไล่ลบทุกตัวที่ขึ้นต้นด้วย tblData หรอกครับ ลบแค่ตัวเดียวก่อนทำ Import ก็เพียงพอแล้ว   โดยที่ถ้าไม่มีเทเบิล tblData มาก่อน หรือว่าลบ tblData ได้ตามปกติ โปรแกรมก็จะ Import ไฟล์ Excel เข้ามา แต่ถ้าลบเทเบิลไม่ได้ ก็จะแสดงข้อผิดพลาดออกมาให้เห็นแทน

On Error Resume Next
DoCmd.DeleteObject acTable, "tblData"
If Err.Number > 0 and Err.Number <> 7874 Then
   Msgbox "ลบเทเบิล tblData ไม่ได้ เกิดข้อผิดพลาดรหัส " & Str$(Err.Number) & " " & Err.Description
   Exit Sub หรือ Exit Function
End If
On Error Goto 0
DoCmd.TransferSpreadsheet acImport  ...  <<< เข้าใจว่านี่คงเป็นคำสั่งเดิมในการนำเข้าไฟล์ Excel

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

303
ปัญหาคือ เมื่อเราสั่งพิมพ์รายงานเสร็จแล้ว ไม่ว่าจะกี่หน้าในการพิมพ์ 1 ครั้งก็ตาม หรือไม่ว่าจะมีขนาดเล็กกว่ากระดาษจริงแค่ไหนก็ตาม ระบบ(ผมเข้าใจว่าเป็นระบบ Printer Manager ของตัววินโดว์เองเลย)จะสั่งให้ feed กระดาษใบสุดท้ายทิ้งไปอยู่ดี แต่ถ้าสามารถพิมพ์หลายๆหน้าในการสั่งพิมพ์ 1 ครั้ง อย่างนี้อาจพอมีโอกาสทำได้ แต่ก็น่าจะต้องแก้ตัวรายงาน และต้องให้สามารถเลือกได้ว่าจะพิมพ์เอกสารเลขที่อะไรได้บ้าง
โพสต์นี้ได้รับคำขอบคุณจาก: mookda16

304
ห้อง MS Access / > พิมพ์ออกเป็นไฟล์ PDF
« เมื่อ: 11 พ.ค. 61 , 13:09:46 »
ถ้าหมายถึงแต่ละหน้ามาจากแต่ละ Report ต่างกัน ให้นำแต่ละ Report มาใส่เป็น Sub Report ใน Report เปล่าๆสักตัวเหมือนอย่างในรูปที่มี WCH1, WCH2, WCH3 แล้วกำหนด Can Grow และ Show Page Header and Page Footer ของ Sub Report Control เป็น Yes และเพิ่ม Page Break Control คั่นระหว่างแต่ละ Sub Report เพื่อให้ขึ้นหน้าใหม่ทุกครั้งที่พิมพ์ Sub Report ตัวต่อไป ตอนพิมพ์ก็เลือกเครื่องพิมพ์ที่เป็น Pdf Printer ครับ
โพสต์นี้ได้รับคำขอบคุณจาก: UnKnown, kitisak

305
ดับเบิ้ลคลิกที่เส้นเชื่อมโยงระหว่างเทเบิล เลือกตัวเลือกที่บอกว่า "select ALL record from [StockMonthly_Query_2-2]..." แล้วคลิกปุ่ม OK จะเห็นว่าเส้นเชื่อมโยงจะมีหัวลูกศรที่ฝั่งเทเบิล Not_FG จากนั้นให้ดับเบิลคลิกที่ฟิลด์ Type ของ Not_FG มันจะมาแสดงในตารางข้างล่าง ให้ใส่ Criteria ที่คอลัมน์นั้นเป็น Is Null
โพสต์นี้ได้รับคำขอบคุณจาก: royaltool

306
ห้อง MS Access / > Update field in table
« เมื่อ: 02 พ.ค. 61 , 10:33:36 »
DoCmd.SetWarnings False

DoCmd.RunSQL "UPDATE Monthly_FG_Imple_Sum AS M SET M.TOTAL_ActualDay = M.[SumOfSumOfTotal(m2)] + Forms![ชื่อฟอร์ม]!ShippingArea", dbFailOnError

DoCmd.SetWarnings True
โพสต์นี้ได้รับคำขอบคุณจาก: Earth

หน้า: 1 ... 14 15 16 [17] 18 19