แสดงกระทู้

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.


Topics - สันติสุข

หน้า: [1]
1
ใน About เพจของเวปเขา http://appinventor.mit.edu/about-us เขาเขียนเริ่มต้นว่า "MIT App Inventor is an intuitive, visual programming environment that allows everyone – even children – to build fully functional apps for smartphones and tablets. Those new to MIT App Inventor can have a simple first app up and running in less than 30 minutes."

ใครเคยทำแล้วช่วยมาเล่าสู่กันฟังมั่ง มันทำได้ไม่เกินระดับไหน ข้อจำกัดอะไรต่างๆนาๆ

2
ได้ข้อมูลมาจากเฟสบุ๊กเพจ "โปรแกรมเมอร์ไทย Thai programmer" ครับ

https://goalkicker.com/?fbclid=IwAR1TjcRyaWd6r_xdj510qNJOu_3B2c9EV_AWjkJ0_lyZqxdBS3bYFHCZERo

แนะนำเพิ่มเติมว่า สำหรับคนที่ชอบเขียนโปรแกรม ให้ศึกษาวิชา Data Structure (ส่วนนึงอยู่ในหนังสือ Algorithms) และ Algorithms เพราะจะช่วยให้ขยับโลกทัศน์ในการวิเคราะห์และหาวิธีตอบโจทย์ที่ซับซ้อนยิ่งขึ้นได้

4
ใครเคยใช้ไหม เป็นยังไงบ้าง https://ultraviewer.net/en/

5
พอดีมีเวลาและเห็นว่ามีหลายครั้งที่มีการถามถึงการสร้างฟอร์มล็อคอินและเมนู ผมเลยเขียนตัวอย่างขึ้นมาเอาไว้ให้เป็นแนวทางในการศึกษาครับ

ระบบมี 2 เทเบิลคือ tbUser ไว้เก็บ ID,รหัสผ่าน,และเมนูที่จะใช้ ในขณะที่อีกเทเบิล tbMenu จะเก็บว่าแต่ละเมนูมีโครงสร้างอย่างไร

ฟอร์มหลักๆคือ FmLogon เพื่อรับ ID และรหัสผ่านผู้ใช้ เมื่อป้อนถูกต้องแล้ว ระบบก็จะเปิดฟอร์ม FmMenu เพื่อแสดงเมนูของแต่ละคน เมื่อคลิกหรือเลื่อนมาที่แต่ละรายการในเมนู คำอธิบายของรายการนั้นจะแสดงที่กรอบด้านล่าง แต่ถ้าดับเบิลคลิก จะเป็นการเปิดหน้าฟอร์ม/รายงานของรายการนั้น พร้อมกับตัวเมนูจะถูกหดย่อลงไป และจะกลับมาแสดงโดยอัตโนมัติเมื่อปิดฟอร์ม/รายงานที่ได้เปิดไป หลังจากปิดเมนู ก็จะกลับมาเปิดฟอร์มล็อคอินอีกครั้ง  ส่วนฟอร์มและรายงานที่เหลือเป็นแค่ตัวอย่างเพื่อแสดงให้เห็นว่าฟอร์ม/รายงานนั้นได้เปิดจริงๆแล้วเท่านั้น

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

ปล. อย่าถามนะว่า login ID และรหัสผ่านมีอะไรบ้าง  :sweat:

6
คำถามจำนวนมาก ถามโดยแทบจะไม่อธิบายอะไรมาเลย ไม่ทราบคนถามจะรู้ไหมว่าคนอ่าน(เอาเป็นว่าอย่างน้อยก็ผมแล้วกัน)รู้สึกเหมือนโดนถามว่า "อยากได้จรวดไปดาวอังคาร ช่วยหน่อยครับ" จริงๆนะ แล้วจะให้ตอบอย่างไร ก็จะกลายเป็นต้องถามกลับไปว่า คุณได้ใช้อุปกรณ์อะไร ออกแบบอะไรยังไงไปแล้วบ้าง เอามาให้ดูหน่อย ซึ่งถ้าเป็นสมัยก่อน ผมก็จะพยายามถามกลับ แต่ยอมรับว่าเดี๋ยวนี้ โอกาสน้อยที่ผมจะถามกลับแล้ว ถ้าอ่านแล้วพบว่าข้อมูลที่ให้มาพร้อมคำถามของผู้โพสนั้นมีน้อยมาก ก็จะข้ามไปเลย หรือถามแล้วอ่านไม่เข้าใจเลย ผมก็ขอข้ามไปเหมือนกัน

ดังนั้น เพื่อเพิ่มความสมบูรณ์ของคำถาม มันก็มีหลายวิธี แต่หลายๆวิธีคงวุ่นวายไป ก็เลยคิดว่าก่อนระบบจะรับโพส อยากให้มี message box แสดงข้อความ "เขียนถามให้ผู้ตอบเข้าใจ..." ตามข้อความเตือนสีแดงๆที่อยู่บนหัวเพจอีกที และอาจมีข้อความอื่นเพิ่มเติมเพื่อเน้นว่าเขาแน่ใจไหมว่าได้อธิบายละเอียดแล้ว ถ้าเขาไม่ยืนยัน ก็ให้เขากลับไปแก้ข้อความ แต่ถ้าเขากดยืนยัน ก็ค่อยโพสจริงๆอีกที

ถามยาว โอกาสได้รับคำตอบเร็วมีสูง -- ถามสั้น โอกาสน้อยลง -- ถามสั้นมากๆ ยากที่จะมีโอกาส

10
ภาษา VBA นำมาจากภาษา BASIC ซึ่งเป็นภาษาเก่าแก่ สิ่งนึงที่ตกทอดมาถึง VBA ก็คือหมายเลขบรรทัด เราสามารถใส่เลขที่บรรทัด จะเป็นเลขอะไรก็ได้ตั้งแต่ 1 ถึง 65535 และแต่ละบรรทัดจะเป็นเลขอะไรก็ได้ ไม่จำเป็นต้องเรียงลำดับ ไม่จำเป็นต้องมีทุกบรรทัด ขอให้ไม่ซ้ำใน Sub หรือ Function Procedure เดียวกันก็พอ โดยเขียนไว้เป็นส่วนแรกของโค้ดแต่ละบรรทัด ที่ทำๆกันมาเป็นมาตรฐานก็คือเริ่มจาก 10  และเพิ่มทีละ 10 เพื่อให้อ่านง่ายและสะดวกเมื่อมีการแทรกบรรทัดเพิ่ม จะได้ใส่เลขบรรทัดได้โดยไม่ต้องไปแก้หมายเลขของบรรทัดอื่นๆให้เสียเวลาครับ

ตย.ของโค้ดก็เช่น
โค๊ด: [Select]
Private Function NewSalesPrice(Price As Variant, Percent As Variant) As Single
          Dim Factor  As Single

          On Error GoTo ErrHandler

10        Factor = 1 + Percent / 100
20        NewSalesPrice = Price * Factor

ExitRtn:
30        Exit Function
               
ErrHandler:
40        MsgBox "In [NewSalesPrice], Line " & Str(Erl) & ", Error " & Str(Err.Number) & " : " & Err.Description
50        Resume ExitRtn
End Function

เลขบรรทัดทำหน้าที่แบบเดียวกับลาเบล เราสามารถสั่ง Goto <ลาเบล/เลขบรรทัด> หรือ GoSub <ลาเบล/เลขบรรทัด> เพื่อให้โค้ดข้ามไปทำงานที่บรรทัดตามเลขที่นั้นได้ แต่ประโยชน์ที่ชัดเจนที่สุดก็คือ ถ้าเกิด Runtime Error ขึ้นในบรรทัดของโค้ดที่มีเลขที่บรรทัดอยู่ เราสามารถใช้ฟังก์ชั่น Erl เพื่อคืนเลขที่บรรทัดออกมาได้ด้วย ดังนั้นเราจึงใส่ไว้ในส่วนของ Error Handling Routine เพื่อบอกให้ทราบว่าเกิดปัญหาที่บรรทัดอะไร การ Debug หรือแก้ไขปัญหาก็จะทำได้ง่ายขึ้นมาก แต่หากเกิด Error ในบรรทัดที่ไม่ได้ใส่หมายเลขบรรทัดเอาไว้  ฟังก์ชั่น Erl จะคืนค่าของเลขบรรทัดสุดท้ายที่อยู่ก่อนหน้าออกมาให้แทน หรือถ้าไม่มีเลย ก็จะคืนค่าเป็นศูนย์แทนครับ

ตย.ของข้อความ


11
เขียนข้อเสนอแนะให้ทีมพัฒนา Access access.uservoice.com/forums/319956-access-desktop-application

เขียนข้อเสนอแนะให้ทีมพัฒนา Office officespdev.uservoice.com/forums/224641-feature-requests-and-feedback?category_id=164751 ถ้าเกี่ยวกับ VBA IDE ให้เลือกหมวด Office Development Tools

Blog ของทีมซัพพอร์ทของ Access blogs.technet.microsoft.com/the_microsoft_access_support_team_blog/

Blog ของ Office365 ในเรื่องเกี่ยวกับ Access www.microsoft.com/en-us/microsoft-365/blog/access/

12
ห้อง Ms Access อื่นๆ / Access Version 1.x
« เมื่อ: 03 ก.ค. 61 , 02:17:13 »
ข้ามไปดูเวลาที่ 11:50

13
การนำข้อมูลที่มี Data Type เป็น Date จาก Recordset ไปใส่ลงในเอ็กซ์เซลชีทในเซลที่ถูกกำหนดรูปแบบการแสดงเป็น Custom (รูปแบบที่ผู้ใช้กำหนดเอง เช่นอาจต้องการให้แสดงวันที่ 1 มกราคาม 2561 เป็น "จันทร์ 1 ม.ค. 61") ด้วยคำสั่ง CopyFromRecordset method สำหรับ Range object (เป็น Excel object) จะทำให้เซลนั้นจะถูกเซ็ท format กลับมาเป็นชื่อ Date เสมอ ต้องกำหนดรูปแบบของเซลอีกครั้งด้วย NumberFormat property  แต่ถ้าใส่ค่าลงไปตรงๆด้วย Value property จะไม่เกิดเหตุการณ์แบบนี้

โค้ดตัวอย่างที่ทำให้เกิดเหตุการณ์
โค๊ด: [Select]
    Dim xlApp   As Object
   
    Dim DB      As DAO.Database
    Dim RS      As DAO.Recordset
   
    Set xlApp = CreateObject("Excel.Application")
    xlApp.Visible = True
    xlApp.Workbooks.Open "C:\Temp\Example.xlsx"
   
    Set DB = CurrentDb
    Set RS = DB.OpenRecordset("select PMU2_StartDT from PMU2")
    xlApp.ActiveSheet.Range("C3").CopyFromRecordset RS
    RS.Close

ภาพเซลที่มีรูปแบบตามที่ผู้ใช้กำหนดเอง

14
เวลาเราดีบักโปรแกรม โค้ดจะหยุดรันเมื่อถึงบรรทัดที่ตั้ง break point ไว้ ปกติเมื่อกดคีย์ F8 โค้ดก็จะทำงานต่อไปหนึ่งบรรทัดและหยุดรอเราว่าจะให้ทำอะไรต่อไป แต่บางกรณีที่โค้ดนั้นเขียนเพื่อโปรแกรมการทำงานของ Excel เช่น

1410              xlSheet.Cells(wR, wxlOut_ColIDLine) = wRS!PMU2_ID
1420              xlSheet.Cells(wR, wxlOut_ColStartDT) = wRS!PMU2_StartDT
1430              xlSheet.Cells(wR, wxlOut_ColMatCD) = wRS!PMU2_MATCD

สมมุติว่าตั้ง break point ไว้ที่บรรทัด 1410  พอโค้ดหยุดแล้ว และเรากดคีย์ F8  แทนที่โค้ดจะหยุดที่บรรทัด 1420  ปรากฏว่าโค้ดจะไม่หยุด และทำงานต่อไปตามปกติ ถ้าอยากให้หยุดที่บรรทัด 1420 ก็ต้องตั้ง break point ไว้ที่นั่นอีกบรรทัด แต่จะไม่เกิดปัญหานี้ในโค้ดที่ควบคุมการทำงานของ Access เอง สาเหตุเป็นปัญหาทางเทคนิคของตัว VBA เอง วิธีแก้ก็คือให้แก้ไข Registry ในระบบวินโดว์ตามลิงค์นี้ครับ http://www.contextures.com/excelvbatips.html#f8 (ดูในส่วน F8 Key Stops Working)

หมายเหตุ : ปัญหานี้สามารถเกิดได้เมื่อเขียน VBA ภายในตัวโปรแกรม Excel เองโดยตรงด้วย

15
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

หน้า: [1]