แสดงกระทู้

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 ... 21 22 23 [24] 25 26 27 ... 29
415
    Dim N As Integer
   
    For N = 2 To 50
        Me("Text" & CStr(N)).Enabled = Not IsNull(Me.Text1)
    Next

416
ผมคงเข้าใจอะไรผิดไป แต่โดยส่วนตัวผมยังไม่ค่อยไว้ใจมันเท่าไหร่

417
เท็กซ์บ็อกซ์ด้านขวา เป็นชื่อ Text... ทั้งนั้นเลย ต้องแก้ให้เป็น Space2,SerialNo,...

418
ผมไม่ได้มองด้านท้ายของบรรทัด split( ... ) คุณลืมเติมส่วนหลังไป ต้องเป็น split(".....",",") และลิสท์ของชื่ออย่ามีช่องว่างก่อนหรือหลังชื่อฟิลด์ครับ ให้เป็น  QRID,Summarystage,PartNo ติดๆกันไปเลย

419
ลองอัพโหลดโปรแกรมมาให้ดูได้ไหม

420
compile เป็นตัวจางหมายถึงหลังการแก้ไขโค้ดครั้งหลังสุด ได้ผ่านการ compile มาแล้ว

แล้วก่อนหน้านี้มันเคยทำงานได้ใช่ไหมครับ

421
ลองทำการ compile โค้ดดูว่าจะมี error แสดงออกมาที่ไหนหรือไม่ครับ (ใน VBA Editor เมนู Debug > Compile ...)

422
ชื่อเท็กซ์บ็อกซ์บนฟอร์มน่าจะไม่ใช่ชื่อ QRID ครับ

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

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

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

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

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

426
1. ลองทำตามคำตอบแรกใน https://superuser.com/questions/201896/how-do-i-install-a-font-from-the-windows-command-prompt ไม่แน่ใจว่าใช้งานได้หรือไม่ แต่ต้องกำหนดตัวแปรเหล่านี้เพิ่มเติมครับ

Dim objShell    As Object
Dim objFolder  As Object
Dim objFolderItem  As Object

2. อันนี้ไม่รู้ครับ แต่อยากบอกว่าคนอื่นเขาก็เปลี่ยนไปเป็นอย่างอื่นระหว่างที่ Access ยังใช้งานได้อยู่ดีครับ

427
ก็ต้องแก้ตรงๆกำปั้นทุบดิน คืออย่าให้ฟิลด์ที่เป็นคีย์หลักมีค่าว่างหรือ Null ครับ

428
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 อยู่ภายในได้ เวลาอ้างถึงก็เพียงใส่ [ ] ครอบชื่ออย่างที่คุณเขียนมานี่แหล่ะครับ

ขอบพระคุณ อ.สันติสุข มากๆเลยครับ
- ขอบคุณครับ

429
- ถ้าจะไม่ต้องยุ่งกับ 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 ในเวปนี้ดูครับ

430
ถ้าคุณเขียน VBA ได้ ก็สามารถเขียนโค้ดใน Access เพื่ออ่านข้อมูลโดยตรงจาก Excel ตามรูปแบบที่คุณกำหนดมาได้ แต่ยังไงคิดว่าอ่านแล้วก็ให้เขียนลงเทเบิลที่สร้างเตรียมไว้ใน Access ตามรูปแบบที่ผมบอกอีกครั้ง จะทำให้หาผลลัพธ์ tblTarget ได้ง่ายมากโดยทำคิวรี่และเชื่อม tblFactor และ tblType เข้าด้วยกันก็เสร็จแล้ว และจะ export ผลลัพธ์ไปเป็น Excel ก็ทำได้ง่ายๆเหมือนกัน

ถ้าจะทำหน้าฟอร์มใน Access เพื่อป้อนข้อมูลลง tblFactor โดยให้เห็นในรูปแบบตารางเหมือน Excel ก็พอทำได้ครับ แต่ลงแรงเขียนโค้ดกันเยอะทีเดียว

ส่วนไฟล์ฐานข้อมูลของ Access นั้น รองรับขนาดได้ 2 GB ต่อไฟล์ เทเบิลหนึ่งๆอยู่ได้ในไฟล์ฐานข้อมูลเดียวเท่านั้น ยังไงก็ตาม ทั้งระบบสามารถเชื่อมเทเบิลต่างๆมาจากไฟล์ต่างกันได้ แต่สิ่งที่จะทำไม่ได้ก็คือการกำหนด Referential Integrity (จะมีเรคอร์ดในเทเบิลนึงได้ ก็ต่อเมื่อมีเรคอร์ดที่สัมพันธ์กันในอีกเทเบิลนึงมาก่อน ,การแก้ไขฟิลด์ในเทเบิลอื่นที่สัมพันธ์กันอย่างอัตโนมัติ ,การลบเรคอร์ดในเทเบิลอื่นที่สัมพันธ์กันอย่างอัตโนมัติ) ระหว่างเทเบิลที่อยู่ต่างไฟล์กันครับ

ถ้าจะหาตัวจัดการฐานข้อมูลตัวอื่นในระดับที่สูงกว่า Access มาใช้ เมื่อเราต้องการ
- ระบบที่คงทนต่อความเสียหายได้มากกว่า
- โอกาสกู้คืนฐานข้อมูลที่เสียหายได้มากกว่า
- เก็บข้อมูลได้มากกว่า
- มีระบบรักษาความปลอดภัยที่ดีกว่า
- มีระบบสำรองข้อมูลในตัวเอง

แต่ก็มาพร้อมกับระยะเวลาในการเรียนรู้ และการจัดการที่ซับซ้อนกว่าด้วย ก็ลองพิจารณาดูครับ

431
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 เช่นกัน ใช้โครงสร้างตามที่คุณเขียนมาได้

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

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

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

หน้า: 1 ... 21 22 23 [24] 25 26 27 ... 29