แสดงกระทู้

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 ... 25 26 27 [28] 29
487
แก้โดยไม่เก็บ Full Path Name D:\Path1\Path2\Path3\Pic1.jpg ลงในเทเบิล แต่ให้เก็บเป็น Relative Path Name แทน เช่น เครื่องแม่แชร์ D:\Path1 ไปเป็นไดร์ฟ Z: บนเครื่องลูก เราก็เก็บเฉพาะ Path2\Path3\Pic1.jpg ลงในเทเบิลแทน และไปออกแบบให้เครื่องลูกแต่ละเครื่องเก็บว่า Drive และ Path บนเครื่องลูกที่จะนำหน้า Relative Path นั้นคืออะไร กรณีนี้ก็คือ Z: และก็แล้วแต่จะออกแบบให้เก็บในไหน จะในเทเบิลของโปรแกรมบนเครื่องลูกนั้นๆ หรือจะเก็บในเท็กซ์ไฟล์บนเครื่องลูกนั้นๆ ก็ได้  โปรแกรมเราก็ต้องอ่านค่านี้มาต่อกับ Relative Path Name ที่เก็บไว้ ก็จะได้เป็น Z:\Path2\Path3\Pic1.jpg ครับ  ถ้าโปรแกรมนี้ติดตั้งบนเครื่องแม่ด้วย ก็ต้องเก็บเป็น D:\Path1 แทน

488
เทเบิล Take_Return1 ไม่มี Primary Key เหรอครับ ถ้ามีก็เลือกเฉพาะฟิลด์ที่เป็น Primary Key ซึ่งน่าจะมีไม่กี่ฟิลด์ แต่ถ้าไม่มีจริงๆ ก็สร้างฟิลด์ uniqueidentifier เพิ่มในเทเบิลของฝั่ง SQL Server แล้วใช้ฟิลด์นี้แทน

489
Access เองไม่ได้มีคำสั่งสำหรับสร้าง SQL statement ให้กับ Schema ของอ็อปเจ็คต่างๆในฐานข้อมูล อย่างเช่น Table, Index, Relationship, Query, ...   ดังนั้นปกติแล้วเราจะต้องสร้างเองด้วยแมนวลออกมาเป็นคำสั่งเช่น

DROP TABLE [CUSTOMER];
CREATE TABLE [CUSTOMER] (
[ID] TEXT(12)
[NAME] TEXT(20) NOT NULL
[CityCD] TEXT(6)
[PostalCD] TEXT(10)
[CountryCD] TEXT(6)
[Tel] TEXT(50)
[Fax] TEXT(50)
) ;
CREATE UNIQUE INDEX [PrimaryKey] ON [CUSTOMER] ([ID] ASC) WITH PRIMARY DISALLOW NULL;
CREATE INDEX [AK1] ON [CUSTOMER] ([NAME] ASC);

แต่ยูทิลิตี้ที่เป็น Command-line ตัวนี้สามารถช่วยสร้างให้เราได้ นอกจากสร้างให้แล้ว ยังสามารถสั่งให้อ่านจากไฟล์ที่สร้าง SQL statement ตามข้างบน มาทำงานได้ด้วย ยูทิลิตี้ตัวนี้จะช่วยให้การดูแลจัดการกับ Schema ทำได้ง่ายขึ้นมาก สามารถโหลดมาใช้ได้จาก https://bitbucket.org/himselfv/jet-tool/wiki/Home  have

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

ทีนี้กลับมาเรื่องที่ต้องการ เราสามารถกำหนดแหล่งที่มาของข้อมูลในหน้าฟอร์มด้วยการใส่ชื่อของ เทเบิล/คิวรี่/SQL statement ลงใน RecordSource property ของฟอร์มนั้น  ตามภาพที่ให้มา หลังจากเลือกประเภทของรายการในคอมโบบ็อกซ์แล้ว ก็ให้ใส่โค้ดไว้ที่ AfterUpdate event procedure ของคอมโบบ็อกซ์นั้น ซึ่งโค้ดคงมีลักษณะโครงสร้างตามนี้คือ

โค๊ด: [Select]
Select Case Me.ชื่อคอมโบบ็อกซ์
   Case ประเภทผ้า    ' ถ้าประเภทเป็นข้อมูลชนิด String ก็ให้ครอบด้วยเครื่องหมาย double quote
       Me.RecordSource = "เทเบิล/คิวรี่/SQL statement ที่แสดงผ้า"

   Case ปรเภทAccessories
       Me.RecordSource = "เทเบิล/คิวรี่/SQL statement ที่แสดง Accessories"
End Select

492
ลองค้น Google เพิ่มเติมด้วยคำว่า difference between SQL and Microsoft Access เพื่อดูว่า 2 ระบบแตกต่างกันอย่างไร

ถ้าจะลอง เบื้องต้นก็ลองสร้างฐานข้อมูลบน SQL Server, สร้างเทเบิล, สร้าง ODBC เพื่อเป็นตัวเชื่อมการติดต่อ, ทำ linked table บนฝั่ง Access เพื่อเชื่อมไป SQL Server ผ่าน ODBC ที่ได้สร้างไว้ แล้วถ้าทุกอย่างถูกต้อง ก็สามารถอ่านเขียนไปยัง SQL Server ได้แล้วครับ ใน Youtube ก็น่าจะมีคนสอนไว้มากมายเช่นกันครับ 

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

493
ผมเข้าใจว่าคงถามถึงการแปลงจาก Access ไป SQL Server ใช่หรือไม่ เราสามารถใช้โปรแกรม SQL Server Migration Assistant for Access https://docs.microsoft.com/en-us/sql/ssma/access/installing-sql-server-migration-assistant-for-access-accesstosql ที่ไมโครซอฟท์มีให้เพื่อแปลงข้อมูลไปยัง SQL Server ได้  แต่อาจมีเงื่อนไขบางอย่างที่ไม่สามารถแปลงได้ ดูได้จากหัวข้อ Incompatible Access Features (AccessToSQL)   ส่วนประเภทข้อมูลว่าแปลงไปแล้วกลายเป็นประเภทไหน ในหัวข้อ Project Settings (Type Mapping) (AccessToSQL)ก็มีบอกไว้ครับ

ส่วนเรื่องของตัวโปรแกรมฝั่ง Access เองก็อาจต้องมีการปรับแก้ ขึ้นอยู่กับต้องการให้เรียกใช้คุณสมบัติของ SQL Server มากน้อยแค่ไหน เช่น การล็อคอินเข้าไปยัง SQL Server, การกำหนดไม่ให้ ODBC หรือตัว SQL Server ตัดการติดต่อหรือยกเลิกงานเพราะ Timeout, การเรียกใช้ Stored Procedure (โค้ดที่เขียนบน SQL Server เอง) ฯลฯ

494
FileSearch เป็นอ็อบเจ็กต์ในไลบรารี่ Microsoft Office xx.xx Object Library ดังนั้นในเมนู Tools > References ใน VBA Editor ต้องมีเลือกเอาไว้ครับ

495
ถ้ายังไม่ทำการคอมไพล์ ให้ทำก่อนครับ
หรือถ้าคำสั่ง Compile เป็นตัวจาง ก็ให้ลบสักบรรทัดแล้วคีย์กลับเข้าไปอย่างเดิม แล้วคอมไพล์ครับ

496
กดปุ่ม Debug ก็จะเห็นบรรทัดที่ทำให้เกิด error นี้ครับ ก็ดูว่าค่าอะไรในบรรทัดนั้นผิดบ้าง

497
- Error บรรทัดไหน, รหัสอะไร, ข้อความแสดงออกมาว่ายังไง
- เกิดปัญหาในเครื่องเดิมที่ติดตั้ง Excel 2003/2007 หรือว่าบนเครื่องอื่น
- PathAndFileOriginal เก็บค่าที่อยู่ของไฟล์ถูกต้องหรือไม่

498
- เราต้องกำหนดชื่อคอมโบบ็อกซ์เอาไว้โดยให้มีตัวเลข 01 - 36 เป็นเลขต่อท้าย ในโค้ดตัวอย่างนี้ สมมุติกำหนดชื่อเป็น cb01 - cb36 ก็แล้วกัน
- คุณต้องไปแทน xxx ด้วยเท็กซ์บ็อกซ์หรือตัวแปรที่ให้ค่าของ ID ที่ต้องการ
- และแทน yyy ด้วยฟิลด์ลำดับที่ของ Procedure ใน ID นั้น
- โค้ดนี้ไม่ได้ทดสอบนะครับ ลองทดสอบดูแล้วกัน โค้ดนี้ให้ใส่ในฟอร์มที่เราต้องการนี่แหล่ะ และเวลาเรียกใช้ก็เขียน Call AssignProcedure เท่านั้น

Private Sub AssignProcedure()
    Dim DB As DAO.Database
    Dim RS As DAO.Recordset
    Dim I As Integer
    Dim S As String

    Set DB = CurrentDb
    Set RS = DB.OpenRecordset("select * from tblMedical_Records where ID = '" + xxx + "' order by yyy")
    I = 1
    Do Until I > 36
        S = Format$(I, "00")
        If RS.EOF Then
            Me("cb" + S).Visible = False
        Else
            Me("cb" + S).Visible = True
            Me("cb" + S) = RS("Procedure_Code")
            RS.MoveNext
        End If
        I = I + 1
    Loop
    RS.Close: Set RS = Nothing
End Sub

499
1. ก่อนอื่น ถ้าดูจากลักษณะงาน ขอถามก่อนว่า น่าจะมีอีกฟิลด์ที่บอกว่าทำงานไหนเป็นลำดับที่เท่าไหร่ใช่ไหมครับ จากภาพก็ตีความได้ว่าบรรทัดแรกก็เป็นงานแรก เรียงต่อๆกันไปจนบรรทัดสุดท้ายซึ่งเป็นงานสุดท้าย แต่ถ้าไม่มี ก็จะเกิดปัญหาเพราะไม่รู้ว่าเรคอร์ดไหนเป็นลำดับที่เท่าไหร่ ส่วนค่าของฟิลด์นี้ แนะนำว่าไม่ควรใส่เรียงต่อกัน อย่าง 1,2,3,... แต่ควรแยกเป็นระยะเช่น 10,20,30,... เพื่อจุดประสงค์ให้ง่ายต่อการแก้ไขลำดับการทำงาน เพราะเราจะแทรกลำดับ เช่น แทรกลำดับที่ 2 ด้วยค่า 15 ไปได้เลย แต่ถ้าเป็นเลขติดกันอย่าง 1,2,3,... เราก็ต้องมาเปลี่ยนค่าตั้งแต่ลำดับที่ 2 ไปจนหมดทุกลำดับ ซึ่งไม่เหมาะในทางปฏิบัติ

2. การเอาข้อมูลมาใส่คอมโบบ็อกซ์ตามที่ต้องการนั้น ทำได้ แต่ Access ไม่สามารถสร้างคอมโบบ็อกซ์ได้ระหว่างที่หน้าฟอร์มทำงาน ทำได้เฉพาะในระหว่างดีไซน์หน้าฟอร์มเท่านั้น ดังนั้นถ้าอยากทำวิธีนี้จริงๆ ก็ต้องสร้างคอมโบบ็อกซ์ไว้ให้มากเท่าที่จะรองรับจำนวนข้อมูลที่คิดว่ามีในแต่ละ ID ได้ แต่จะซ่อนเอาไว้ไม่ให้แสดง พออ่านข้อมูลจริง ก็ค่อยอ่านทีละเรคอร์ดแล้วกำหนดค่าลงคอมโบบ็อกซ์ทีละตัว พร้อมแสดงคอมโบบ็อกซ์ออกมาให้เห็น

3.อย่างไรก็ตาม ผมเห็นว่าถ้าเราเอาข้อมูลมาแสดงออก Continuous Form หรือ Datasheet Form ไปเลยน่าจะง่ายกว่าครับ ตรงไปตรงมา เพราะมีกี่เรคอร์ด ก็แสดงออกมาเท่านั้นบรรทัดโดยอัตโนมัติ จะเพิ่ม/ลบเรคอร์ดก็ทำได้เลย

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

500
อีกอย่าง มีอาการในเครื่องที่ก่อนหน้าไม่เคยเป็น หรือว่านี่เป็นเครื่องอื่นที่เพิ่งเคยรันโปรแกรมนี้

501
ใส่ค่าที่ต้องการไว้ใน Default Value property ของคอมโบบ็อกซ์ได้ครับ

502
มีอาการโดยที่ยังไม่ได้รันโค้ดหรือฟอร์มอะไรเลย หรือว่ามีรันคำสั่งอะไรมาก่อนแล้ว หรือมีฟอร์มไหนที่มีโค้ดใน On Timer event กำลังรันอยู่หรือไม่

503
ลองดูจากกระทู้เก่านี้เป็นแนวทางได้ครับ https://www.thai-access.com/yeadram_view.php?topic_id=651

504
ผมอ่านแล้วยิ่งไม่เข้าใจ เหมือนสิ่งที่คุณทำมันแตกต่างจากที่บอกเริ่มแรก(หรือเปล่า?) เอาอย่างนี้นะครับ จุดที่ผมพยายามแก้ไขอยู่ตอนนี้คือจากปัญหาใน
อ๋อ ตอนแรกผมอ่านไม่เข้าใจ ลองทำแล้วใช้ได้ครับ ขอบคุณครับ
ตอนนี้ติดปัญหา พอ insert แล้ว insert ซ้ำ ข้อมูลจะเบิ้ล เราควรให้คิวรี่เช็คข้อมูลในตารางก่อนหรือป่าวครับ
เท่านั้น

ผมเข้าใจคือ คุณจะเอาข้อมูลจาก dbo_ViewTimeOTMonthly ไปลง tbEmployeeOT 
ทีนี้คุณบอกว่าถ้าทำ Append Query ที่ผมบอกแล้วครั้งนึง แล้วไปทำซ้ำ(ใช่ไหม ?) ข้อมูลก็จะเบิ้ล
ผมก็เลยแนะนำว่า คุณก็ทำ Delete Query เพื่อลบข้อมูลใน tbEmployeeOT *** เสียก่อน ***
แล้วเราลบอะไร...เราก็จะลบข้อมูลที่กำลังเตรียมจะ Append ในขั้นตอนต่อไป
ดังนั้นพอคุณทำ Append จริงๆ ยังไงข้อมูลนั้นก็จะไม่เบิ้ล ถูกไหมครับ

สรุปคือ Delete ข้อมูลใน tbEmployeeOT ก่อน แล้วค่อย Append
คุณลองเช็คดูแล้วกันว่าตรงกับที่ผมบอกไหม

หน้า: 1 ... 25 26 27 [28] 29