tag:blogger.com,1999:blog-23433218041634724942024-03-08T17:20:15.503+07:00เกษม กมลชัยพิสิฐเกษม กมลชัยพิสิฐhttp://www.blogger.com/profile/03223085345729627028noreply@blogger.comBlogger134125tag:blogger.com,1999:blog-2343321804163472494.post-73688481217477355552024-02-14T19:58:00.009+07:002024-02-14T20:30:58.157+07:00Visual FoxPro : การใช้ BindEvent <p><span style="font-size: x-large;">ห</span>ลาย ๆ ครั้งเราอยากจะตรวจสอบเหตุการณ์ (event) ที่เกิดขึ้นใน Visual FoxPro 9 แต่บางเหตุการณ์ดันไม่มี method ของเหตุการณ์นั้นมารองรับ เช่น VFP มีแต่ KeyPress Event เป็นเหตุการณ์สำหรับตรวจสอบการกดปุ่มบนคีย์บอรด์อย่างเดียวเลย แต่..ถ้าเราอยากจะตรวจสอบเฉพาะตอนกดปุ่ม (KeyDown) หรือเฉพาะตอนปล่อยปุ่ม (KeyUp) จะทำไงละ แต่...คนสร้าง VFP ก็ช่างคิดเสียนี่กระไร ในเมื่อฉันไม่ได้เตรียม event/method ไว้ให้ แต่ก็ทิ้งคำสั่ง BindEvent เอาไว้ให้แทน </p><p><span style="font-size: x-large;">ม</span>าดูตัวอย่างการทำฟอร์มให้สามารถใช้งาน การตรวจสอบการกดปุ่ม (KeyDown) และปล่อยปุ่ม (KeyUp) (ตัวอย่างนี้มาจากคำถามของสมาชิกชาว Fox จะป้องกัน user กดปุ่มค้างไม่ยอมปล่อย ดังนั้นถ้าไปเช็คใน KeyPress Event มันวิ่งตลอด ที่เขียนโปรแกรมทำอะไรไว้วิ่งเป็นพรวน....) ดังนั้น การตรวจสอบ KeyDown KeyUp จะได้มันใจว่ากดยาว กดแช่ กดสั้น กดไว อย่างไรก็ทำครั้้งเดียวจนกว่าจะกดใหม่</p><p> สำหรับตัวอย่างนี้สามารถใช้เป็นแนวทางในการทำ BindEvent กับเหตุการอื่น ๆ ได้อีกมากมาย นะจ๊ะ...</p><p>1. ให้สร้างฟอร์มขึ้นมาใหม่ จากนั้นไปที่เมนู Form -> New Method จะปรากฎหน้าต่าง New Method<br /><span><span> </span><span> </span>- ที่</span>ช่อง Name ป้อน KeyDown แล้วคลิกปุ่ม Add<br /><span> <span> </span></span>- ที่ช่อง Name ป้อน KeyUp แล้วคลิกปุ่ม Add<br /></p><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiJvQjF8ypHrQyEv-2HUVJieFcn43-G-X4vFyKTQN_DTvZ-df2ZUOUG91ZimuRvXIpNOkQK67fwfj9fmGprYBXiRl0o9KHWpDgt6uWak9mQbE9wWTlrTG8g7U1OAlK8VwrH76KOewXhZtH61HVQDoB2djGYLeZYX1sGamO2zY010OS6DbtIjzF0JC6dsrc/s782/bindevent1.png" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img border="0" data-original-height="576" data-original-width="782" height="471" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiJvQjF8ypHrQyEv-2HUVJieFcn43-G-X4vFyKTQN_DTvZ-df2ZUOUG91ZimuRvXIpNOkQK67fwfj9fmGprYBXiRl0o9KHWpDgt6uWak9mQbE9wWTlrTG8g7U1OAlK8VwrH76KOewXhZtH61HVQDoB2djGYLeZYX1sGamO2zY010OS6DbtIjzF0JC6dsrc/w640-h471/bindevent1.png" width="640" /></a></div><br /><p><br /></p><p><br /></p><p><br /></p><p><br /></p><p><br /></p><p><br /></p><p><br /></p><p><br /></p><p><br /></p><p>2. ไปป้อนคำสั่งที่ฟอร์มในเมธอด ดังนี้</p><p><span> - </span> เมธอด Init ป้อนคำสั่ง</p><p> <span style="font-family: courier;"> </span><span style="font-family: courier;"><span style="font-size: x-small;"><i>* สร้างตัวแปรฟอร์มสำหรับตรวจสอบการกดปุ่มค้าง</i></span><br /></span><span style="font-family: courier;"><span> </span><b>=ADDPROPERTY(ThisForm, "nPreventKeyPress",0)<br /></b><span style="font-family: "Times New Roman";"> </span><span style="font-family: courier;"> </span><span style="font-family: courier;"><i><span style="font-size: x-small;">* ทำการผูกการกดคีย์(keydown)(เลข 256) กับ object ฟอร์ม(This) เรียกเมธอด KeyDown</span></i><br /></span></span><b><span style="font-family: courier;"><span> </span>=BINDEVENT(0, 256, This, "KeyDown")<br /><span> </span></span></b><span style="font-family: courier;"><i><span style="font-size: x-small;">* ทำการผูกการกดคีย์(keydown)(เลข 257) กับ object ฟอร์ม(This) เรียกเมธอด KeyUp</span></i></span><b><span style="font-family: courier;"><br /></span><span style="font-family: courier;"><span> </span>=BINDEVENT(0, 257, This, "KeyUp")</span></b></p><div><p></p><blockquote><span style="background-color: #cfe2f3;"><i>ดูความหมายของค่าตัวเลข 256 257 หรืออื่น ๆ ของ Windows Message ที่ส่งมา </i></span><a href="https://wiki.winehq.org/List_Of_Windows_Messages"><i>https://wiki.winehq.org/List_Of_Windows_Messages</i></a></blockquote><span><a name='more'></a></span><p> - เมธอด KeyDown ป้อนคำสั่ง</p><p><span style="font-family: courier;"> </span><b><span style="font-family: courier;">LPARAMETERS nHwn,Msg,nKeyCode,lParam<br /><br /></span><span style="font-family: courier;"> </span><span style="font-family: courier;">IF ThisForm.nPreventKeyPress = 0<br /></span><span style="font-family: courier; white-space: pre;"> </span><span style="font-family: courier;">?"Key Down : " + STR(nKeyCode)<br /></span><span style="font-family: courier; white-space: pre;"> </span><span style="font-family: courier;">ThisForm.nPreventKeyPress = 1<br /></span></b><span style="font-family: courier;"><b><span> </span>ENDIF</b> </span></p><p><span></span></p><!--more--><p></p><p><span> </span>- เมธอด KeyUp ป้อนคำสั่ง</p><p><span style="font-family: courier;"> </span><b><span style="font-family: courier;">LPARAMETERS nHwn,Msg,nKeyCode,lParam<br /><br /></span><span style="font-family: courier;"> </span></b><span style="font-family: courier;"><b>IF ThisForm.nPreventKeyPress = 1<br /></b></span><b style="font-family: courier;"><span> </span><span> </span>?"Key Up : " + STR(nKeyCode)<br /></b><b style="font-family: courier;"><span> </span><span> </span>ThisForm.nPreventKeyPress = 0<br /></b><b style="font-family: courier;"><span> </span>ENDIF </b></p><p><span></span></p><!--more--><b style="font-family: courier;"><br /></b><p></p><div class="separator" style="clear: both; text-align: left;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi36ReOC8o49wzW5zMjGKHgAebf3Fh9W6SM1mDcRBx3CDk8uISkVLIxLLgqs0f8eH0xrYoiA9q5IAbZEr8-QcwhDMJxFtJfR3rCsI_pFYBSjWcCHfC3EnuErbEYa10Ldy1v4OORuEkVTs0I_sLrN1MLqLwEloMbBxOSt2CtlL84lAy1yGXWwOhyphenhyphensEqA-aI/s1362/bindevent2.png" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="624" data-original-width="1362" height="293" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi36ReOC8o49wzW5zMjGKHgAebf3Fh9W6SM1mDcRBx3CDk8uISkVLIxLLgqs0f8eH0xrYoiA9q5IAbZEr8-QcwhDMJxFtJfR3rCsI_pFYBSjWcCHfC3EnuErbEYa10Ldy1v4OORuEkVTs0I_sLrN1MLqLwEloMbBxOSt2CtlL84lAy1yGXWwOhyphenhyphensEqA-aI/w640-h293/bindevent2.png" width="640" /></a></div><br /><div>จากนั้นให้บันทึกฟอร์ม แล้วทดสอบ การกดปุ่มต่าง ๆ จะส่งค่าของปุ่มกลับมาก ที่เหลือจะไปทำอะไรต่อได้แล้ว</div></div><div><br /></div><div>อ้างอิงจาก : </div><div><a href="https://www.tek-tips.com/viewthread.cfm?qid=1719489">https://www.tek-tips.com/viewthread.cfm?qid=1719489</a></div><div><br /></div><div>วันวาเลนไทน์ ผ่านไป อีกสองวันหวยออก โชคดี โชคดี</div><div class="blogger-post-footer">สงวนลิขสิทธิ์ ห้ามนำไปเผยแพร่ก่อนได้รับอนุญาติ</div>เกษม กมลชัยพิสิฐhttp://www.blogger.com/profile/03223085345729627028noreply@blogger.com0tag:blogger.com,1999:blog-2343321804163472494.post-65737262829054293402024-01-26T10:46:00.008+07:002024-01-26T10:55:18.500+07:00Vฺisual Studio 2022 C# Blazor - 01<p><span style="font-family: courier;">// youtube : <a href="https://youtu.be/dY_AWdCzsCY?si=eQyqwMcRINbhvUYz">https://youtu.be/dY_AWdCzsCY?si=eQyqwMcRINbhvUYz</a><br />// index.razor</span></p><p><span style="font-family: courier;">@page "/"<br /></span><span style="font-family: courier;"><b><span style="color: #ff00fe;">@rendermode InteractiveServer </span></b></span></p><p><span style="font-family: courier;"><h3>Hello, @userName</h3><br /></span><span style="font-family: courier;"><h3>@GetUserName()</h3><br /></span><span style="font-family: courier;"><p>Sum : @GetSum()</p><br /></span><span style="font-family: courier;"><b><span style="color: #ff00fe;"><button @onclick = "ChgName">Change Name</button></span></b></span></p><p><span style="font-family: courier;">@if (testNum == 1)<br /></span><span style="font-family: courier;">{<br /></span><span style="font-family: courier;"> <p>Num is 1</p><br /></span><span style="font-family: courier;">} </span><span style="font-family: courier;">else </span><span style="font-family: courier;">{<br /></span><span style="font-family: courier;"> <p>Num is not 1</p><br /></span><span style="font-family: courier;">}<br /></span><span style="font-family: courier;">@foreach(var name in names)<br /></span><span style="font-family: courier;">{<br /></span><span style="font-family: courier;"> <p></span><b style="font-family: courier;"><span style="color: red;">@((MarkupString)name)</span></b><span style="font-family: courier;"></p><br /></span><span style="font-family: courier;">}</span></p><p><span style="font-family: courier;">@code {<br /></span><span style="font-family: courier;"> private string userName = "John";<br /></span><span style="font-family: courier;"> private int testNum = 10;<br /></span><span style="font-family: courier;"> private List<string> names;</span></p><p><span style="font-family: courier;"> private string GetUserName() <br /><span> </span>{<br /></span><span style="font-family: courier;"> return userName + "ซำบายดีไหม?";<br /></span><span style="font-family: courier;"> }</span></p><p><span style="font-family: courier;"> private int GetSum()<br /></span><span style="font-family: courier;"> {<br /></span><span style="font-family: courier;"> return 2 + 2 + 3;<br /></span><span style="font-family: courier;"> }</span></p><p><b><span style="font-family: courier;"><span style="color: #2b00fe;"> </span><span style="color: #ff00fe;"> private void ChgName()<br /></span></span><span style="color: #ff00fe;"><span style="font-family: courier;"> {<br /></span><span style="font-family: courier;"> userName = "เกษม";<br /></span><span style="font-family: courier;"> }</span></span></b></p><p><span style="font-family: courier;"> protected override void OnInitialized()<br /></span><span style="font-family: courier;"> {<br /></span><span style="font-family: courier;"> base.OnInitialized();<br /></span><span style="font-family: courier;"> names = new List<string><br /></span><span style="font-family: courier;"> {<br /></span><span style="font-family: courier;"> <span style="color: red;"> <b>"<b>Value 01<b>"</b>,</span><br /></span><span style="font-family: courier;"> "Value 02",<br /></span><span style="font-family: courier;"> "Value 03",<br /></span><span style="font-family: courier;"> "Value 04",<br /></span><span style="font-family: courier;"> "Value 05",<br /></span><span style="font-family: courier;"> <b><span style="color: red;">"<i>Value 06<i>",</span></b><br /></span><span style="font-family: courier;"> "Value 07",<br /></span><span style="font-family: courier;"> "Value 08",<br /></span><span style="font-family: courier;"> "Value 09",<br /></span><span style="font-family: courier;"> "Value 10"<br /></span><span style="font-family: courier;"> };<br /></span><span style="font-family: courier;"> }<br /></span><span style="font-family: courier;">}</span></p><div class="blogger-post-footer">สงวนลิขสิทธิ์ ห้ามนำไปเผยแพร่ก่อนได้รับอนุญาติ</div>เกษม กมลชัยพิสิฐhttp://www.blogger.com/profile/03223085345729627028noreply@blogger.com0tag:blogger.com,1999:blog-2343321804163472494.post-39400864397040193802023-02-14T15:04:00.004+07:002023-02-14T15:10:20.718+07:00SQL Server : CTEs (Common Table Expressions)<p><span style="font-family: Krub;"><span><span style="font-size: x-large;"><b>C</b></span>ommon Table Expressions หรือ CTEs เริ่มถูกนำมาใช้ใน SQL Server 2005 เป็นครั้งแรก โดยที่ CTE นั้นเป็นผลลัพท์ที่เป็นตารางชั่วคราว ซึ่งสามารถนำไปอ้างหรือใช้งานภายใต้คำสั่งคิวรี่ SELECT INSERT UPDATE หรือ DELETE ใน SQL Server 2008 ได้เพิ่มความสามารถให้ใช้ CTE ในคำสั่ง MERGE ได้ การใช้งาน CTE เริ่มด้วยการใช้ WITH<br /><br /><span style="font-family: Sarabun;">WITH ชื่อตาราง_CTE<br /> AS<br /> ( <br /> คำสั่ง Query ผลลัพธ์ของคิวรีที่ได้จะไปเก็บใน ชื่อตาราง_CTE <br /> )<br />คำสั่ง Query ที่เรียกใช้งานตาราง CTE</span><br /></span></span></p><p><span style="font-family: Krub;"><u><b><span>กรณีที่สร้างหลาย CTE ก็ให้เพิ่มโดยใส่ , (คอมม่า) แล้วก็ชื่อตารางตามตัวอย่าง<br /></span></b></u></span></p><p><span style="font-family: Sarabun;"><span>WITH ชื่อตาราง_CTE_1<br /> AS<br /> ( <br /> คำสั่ง Query ผลลัพธ์ของคิวรีที่ได้จะไปเก็บใน <b>ชื่อตาราง_CTE_1</b> <br /> ) ,<br />ชื่อตาราง_CTE_2<br /> AS <br /></span><span> ( <br /> คำสั่ง Query ผลลัพธ์ของคิวรีที่ได้จะไปเก็บใน <b>ชื่อตาราง_CTE_2 <br /> และสามารถเรียกใช้ตาราง CTE_1 ได้ด้วย</b><br /> )<br />คำสั่ง Query ที่เรียกใช้งานตาราง CTE <br /></span></span></p><p><span style="font-family: Krub;"><span><span style="font-size: x-large;">รูป</span>แบบคำสั่งแค่นี้ก็เราก็สามารถแปรกระบวนท่าในการเขียนจัดการคำสั่งคิวรีได้มากมาย</span></span></p><p><u><span style="font-family: Krub;"><span>ตัวอย่าง</span></span></u></p><p><span style="font-family: Krub;"><span><i>WITH CTE AS (<br /> SELECT dd.Driver_no, COUNT(dd.Do_Date) Total_day <br /> FROM (SELECT DISTINCT Driver_no, Do_Date <br /> FROM DoDriver WHERE MYear = '2022' AND MPeriod = '12') dd<br /> GROUP BY dd.Driver_no<br /> )</i><br /><b> SELECT d.*, c.Total_Day FROM CTE c<br /> LEFT JOIN (<br /> SELECT d.Driver_no, d.Driver_name, SUM(d.Qty_do) Tot_do <br /> ,SUM(d.Z_Q_tot) Total_QTY_G <br /> ,SUM(d.Z_T_tot + d.Z_Trip_E1 ) as Total_WAGE <br /> ,COUNT(d.Do_no) Total_trip, SUM(d.Z_T_tot) Total_T_tot <br /> ,SUM(d.Z_Trip_E1) AS Total_E1, SUM(d.Z_Trip_E2) AS Total_E2 <br /> ,SUM(d.Z_Trip_E3) AS Total_E3, SUM(d.Z_Trip_E4) AS Total_E4<br /> , SUM(d.Z_Trip_E5) AS Total_E5<br /> FROM DoDriver d WHERE d.MYear = '2022' AND d.MPeriod = '12'<br /> GROUP BY d.Driver_no, d.Driver_name<br /> ) AS d <br /> ON c.Driver_no = d.Driver_no</b><br /></span></span></p><p><span style="font-family: Krub;"><span><u>ตัวอย่าง</u> </span></span></p><p><span style="font-family: Krub;"><span><i>WITH CTE AS (<br /> SELECT RowOrder, MYear, MPeriod, Driver_no, Do_date, Do_Time<br /> , ROW_NUMBER() OVER(PARTITION BY Driver_no, Do_Date <br /> ORDER BY Driver_no, Do_Date, Do_time) AS Trip_of_D<br /> , ROW_NUMBER() OVER(PARTITION BY Driver_no <br /> ORDER BY Driver_no,Do_Date, Do_time) AS Trip_of_M<br /> FROM DoDriver<br /> WHERE MYear = '2022' AND MPeriod = '20212' <br /> AND Driver_no = '0001' ) </i><br /><b>SELECT c.*,c1.Trip_sum_M FROM CTE c <br /> LEFT JOIN (SELECT Driver_no, COUNT(*) AS Trip_sum_M <br /> FROM CTE <br /> GROUP BY Driver_no) c1<br /> ON c.Driver_no = c1.Driver_no</b><br /></span></span></p><p><span style="font-family: Kodchasan;"><span>จริง ๆ มัน เหมือน ๆ กับทำ subquery แต่มันจะเอามายำ ๆ ๆ ๆ ยำไปยำมาก่อน แล้วสุดท้ายเอาไปใช้งาน ได้ผลตามต้องการ ดูง่ายไล่สะดวก<br /><br />เอาไว้เป็นไอเดีย การทดลองทำจะทำให้เข้าใจมากยิ่งขึ้น</span></span></p><p><span style="font-family: Kodchasan;"><span><br /></span></span></p><div class="blogger-post-footer">สงวนลิขสิทธิ์ ห้ามนำไปเผยแพร่ก่อนได้รับอนุญาติ</div>เกษม กมลชัยพิสิฐhttp://www.blogger.com/profile/03223085345729627028noreply@blogger.com0tag:blogger.com,1999:blog-2343321804163472494.post-26671859202650938102022-11-09T05:50:00.006+07:002022-11-09T15:22:50.179+07:00SQL Server : OUTER APPLY and CROSS APPLY<p><span style="font-family: Kodchasan;"><span style="font-size: large;">ห</span>ลายคนคงเคยใช้คำสั่ง JOIN เพื่อทำการเชื่อมโยงตารางตั้งแต่ 2 ตารางขึ้นไป แล้วให้ได้ผลลัพธ์ที่ต้องการ แต่มีคำสั่ง APPLY ที่ทำงานได้ลักษณะเดียวกันกับ JOIN แต่มีความคล่องตัวและยืดหยุ่นกว่า ซึ่งจริง ๆ แล้วคำสั่ง APPLY เกิดขึ้นมานานมากตั้งแต่ SQL Server 2005 การทำงานจะเหมือนการใช้งานคำสั่ง JOIN แต่จะแตกต่างกันตรงที่ตารางด้านขวาของ APPLY สามารถประมวลผลภายใต้เงื่อน where ไขของตารางด้านซ้ายได้ หรือสามารถเขียนเป็น table-value function แล้วส่งค่ากลับมาเชื่อมโยงกับตารางฝั่งซ้ายมือก็ได้ เป็นต้น</span></p><p><span style="font-family: Kodchasan;">การใช้ APPLY หลัก ๆ จะใช้อยู่ 2 แบบคือ OUTER APPLY กับ CROSS APPLY โดยที่ <br /></span></p><p><span style="font-family: Kodchasan;"><span> </span>OUTER APPLY เปรียบได้กับการใช้ LEFT JOIN</span></p><p><span style="font-family: Kodchasan;"><span> </span>CROSS APPLY เปรียบได้กับการใช้ INNER JOIN</span></p><p><span style="font-family: Kodchasan;">ดังนั้นการนำไปใช้งาน สามารถเลือกใช้ได้ตามความเหมาะสม</span></p><p><span style="font-family: Kodchasan;">หลายท่านคงมีคำถามในใจ แล้วเราจะเอาไปประยุกต์ใช้ในงานใดได้บ้าง </span></p><p><span style="font-family: Kodchasan;">ดังนั้น : ขอยกตัวอย่าง สัก 2 - 3 ตัวอย่าง เพื่อให้พอเห็นภาพ เพื่อท่าน ๆ จะได้นำไปประยุกต์ใช้ได้ตามต้องการ</span></p><p><span style="font-family: Kodchasan;"> </span></p><p><span style="font-family: Kodchasan;"> </span></p><p><span style="font-family: Kodchasan;"><u>ตัวอย่าง</u> การใช้คำสั่ง JOIN เปรียบเทียบกับการใช้คำสั่ง APPLY</span></p><p><span style="font-family: Kodchasan;">SELECT p.[prod_no], p.[prod_name], t1.[in_min], t1.[in_max], t2.[in_last]<br /></span><span style="font-family: Kodchasan;"> FROM [Products] p<br /></span><span style="font-family: Kodchasan;">OUTER APPLY (<br /></span><span style="font-family: Kodchasan; white-space: pre;"> </span><span style="font-family: Kodchasan;">SELECT MIN(t.[qty]) in_min, MAX(t.[qty]) in_max<br /></span><span style="font-family: Kodchasan; white-space: pre;"> </span><span style="font-family: Kodchasan;">FROM [Transactions] t<br /></span><span style="font-family: Kodchasan; white-space: pre;"> </span><span style="font-family: Kodchasan;">WHERE t.type = 'IN' AND t.[prod_no] = p.[prod_no] GROUP BY t.[prod_no] <br /></span><span style="font-family: Kodchasan; white-space: pre;"> </span><span style="font-family: Kodchasan;">) t1<br /></span><span style="font-family: Kodchasan;">OUTER APPLY (<br /></span><span style="font-family: Kodchasan; white-space: pre;"> </span><span style="font-family: Kodchasan;">SELECT TOP 1 t.[qty] in_last<br /></span><span style="font-family: Kodchasan; white-space: pre;"> </span><span style="font-family: Kodchasan;">FROM [Transactions] t<br /></span><span style="font-family: Kodchasan; white-space: pre;"> </span><span style="font-family: Kodchasan;">WHERE t.type = 'IN' AND t.[prod_no] = p.[prod_no] ORDER BY t.[tran_id] DESC<br /></span><span style="font-family: Kodchasan; white-space: pre;"> </span><span style="font-family: Kodchasan;">) t2</span></p><div class="blogger-post-footer">สงวนลิขสิทธิ์ ห้ามนำไปเผยแพร่ก่อนได้รับอนุญาติ</div>เกษม กมลชัยพิสิฐhttp://www.blogger.com/profile/03223085345729627028noreply@blogger.com0tag:blogger.com,1999:blog-2343321804163472494.post-78384746013715791982022-11-02T15:57:00.013+07:002022-11-09T05:02:23.806+07:00SQL SERVER : UPDATE JOIN<p><span style="font-family: Kodchasan;">มีอยู่วันหนึ่งไปเจอคำถาม ซึ่งไม่เกี่ยวกับผู้เขียน แต่อดที่จะตอบไม่ได้</span></p><p><span style="font-family: Kodchasan;">"ผมจะใช้คำสั่ง SQL เพื่อ Update Table A โดยเอายอดรวมจาก Select sum ของ Table B ไปใส่ใน Table A ที่มี Key ตรงกันกับ Table B ได้อย่างไรครับ</span><span style="font-family: Kodchasan;">"</span></p><p><span style="font-family: Kodchasan;">คำถามแบบนี้ชอบที่ยื่นมือเข้าไปตอบ ถ้าพูดภาษาชาวบ้านเขาเรียกว่า เสือก 555</span></p><p><span style="font-family: Kodchasan;">การกระทำแบบนี้ สามารถใช้คำสั่ง SQL ได้หลายตัว เช่น UPDATE Join หรือ MERGE ก็ได้<br />แต่.... คำถาม ต้องการแค่ปรับปรุงยอดรวมเฉย ๆ ก็เลยใช้ UPDATE ร่วมกับ JOIN แทนการใช้คำสั่ง MERGE แต่คำสั่ง MERGER จริง ๆ แล้วทำอะไรได้มากกว่า มันสามารถ INSERT, UPDATE, DELETE จากแหล่งข้อมูลอื่นมาใส่ตารางเป้าหมายได้ในคำสั่งเดียวเลย อ้าว... นอกเรื่องอีกแล้ว </span></p><p><span style="font-family: Kodchasan;">จากที่เดาข้อคำถาม เข้าใจว่าคงเป็นการปรับปรุงยอดบางอย่าง เช่น ยอดสินค้าคงเหลือ ยอดเงินคงเหลือ หรือยอดลูกหนี้คงค้าง เป็นต้น</span></p><p><span style="font-family: Kodchasan;">เพื่อให้เห็นภาพ จะขอยกตัวอย่างการปรับปรุงยอดสต๊อกสินค้า จากรายการรับ/จ่ายที่เกิดขึ้น</span></p><p><span style="font-family: Kodchasan;">ให้สร้างตารางเพื่อทดสอบ ดังนี้</span></p><p><span style="font-family: Kodchasan;">สร้างตาราง Products<br /></span></p><p><span style="font-family: Noto Sans Thai;">CREATE TABLE [Products] (<br /> [prod_no] [nchar](10) NOT NULL,<br /> [prod_name] [nvarchar](100),<span style="white-space: pre;"> </span><br /> [onhand] [numeric](10, 0),<br /><span> </span>PRIMARY KEY ([prod_no]))</span></p><p><span style="font-family: Kodchasan;"></span></p><p><span style="font-family: Kodchasan;">สร้างตาราง Transactions สำหรับเก็บรายการ รับ/จ่าย สินค้า</span></p><p><span style="font-family: Noto Sans Thai;">CREATE TABLE [Transactions] (<br /></span><span style="font-family: Noto Sans Thai;"><span> </span>[tran_id] [int] IDENTITY(1,1) NOT NULL,<br /></span><span style="font-family: Noto Sans Thai;"><span> </span>[prod_no] [nchar](10),<br /></span><span style="font-family: Noto Sans Thai;"><span> </span>[type] [nchar](3),<br /></span><span style="font-family: "Noto Sans Thai";"><span> </span>[qty] [numeric](10, 0),<br /></span><span style="font-family: "Noto Sans Thai";"><span> </span>PRIMARY KEY ([tran_id])) </span></p><p><span style="font-family: Kodchasan;">ทำการเพิ่มข้อมูลตัวอย่างเข้าสู่ตาราง</span></p><p><span style="font-family: Noto Sans Thai;">INSERT INTO [Products] VALUES ('001','วิทยุทรานซิสเตอร์ ธานินทร์',0),<br />('002','ถ่านไฟฉาย ตรากบ',0),<br />('003','ยาแก้ปวด ทันใจ',0),<br />('004','บะหมี่กึ่งสำเร็จรูป มาม่า',0),<br />('005','นมข้นหวาน ตราหมี',0) ;</span></p><p><span style="font-family: Noto Sans Thai;">INSERT INTO [Transactions] VALUES('001','IN',20),<br /></span><span style="font-family: "Noto Sans Thai";">('003','IN',10),<br /></span><span style="font-family: "Noto Sans Thai";">('002','IN',100),<br /></span><span style="font-family: "Noto Sans Thai";">('005','IN',50),<br /></span><span style="font-family: "Noto Sans Thai";">('002','OUT',10),<br /></span><span style="font-family: "Noto Sans Thai";">('001','OUT',1),<br /></span><span style="font-family: "Noto Sans Thai";">('001','OUT',2),<br /></span><span style="font-family: "Noto Sans Thai";">('003','IN',15),<br /></span><span style="font-family: "Noto Sans Thai";">('003','OUT',10),<br /></span><span style="font-family: "Noto Sans Thai";">('001','OUT',2) ;</span></p><p><span style="font-family: Kodchasan;">หลังจากทำการเพิ่มข้อมูลเรียบร้อยแล้ว ลองทำการคิวรีข้อมูลออกมาแสดงจะได้ ดังนี้</span></p><p><span style="font-family: "Noto Sans Thai";">SELECT * FROM [Products]<br /></span><span style="font-family: "Noto Sans Thai";">SELECT * FROM [Transactions]</span></p><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgiiovd6znZ436suMVOD-tx0ThVVwMtcq8Lj7pHB4AoYUaMVsOFL9vdKBu-U0WMTfyYRehFNjbsFd3sSXUoJuKH1c2AbjnxNdQrGcHxOICRuGIvPFP__ShlEEDYSi3kKVLqsJh9jRvFd8kcepo4rC3ltF8oSoJUjZ6EgDHRLegUWZNe59RnOfRuKMeB/s569/update01.png" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img border="0" data-original-height="543" data-original-width="569" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgiiovd6znZ436suMVOD-tx0ThVVwMtcq8Lj7pHB4AoYUaMVsOFL9vdKBu-U0WMTfyYRehFNjbsFd3sSXUoJuKH1c2AbjnxNdQrGcHxOICRuGIvPFP__ShlEEDYSi3kKVLqsJh9jRvFd8kcepo4rC3ltF8oSoJUjZ6EgDHRLegUWZNe59RnOfRuKMeB/s16000/update01.png" title="ภาพ ผลลัพธ์จากการคิวรี" /></a></div><br /><p><br /></p><p><br /></p><p><br /></p><p><br /></p><p><br /></p><p><br /></p><p><br /></p><p><br /></p><p><br /></p><p><br /></p><p><br /></p><p><br /></p><p><br /></p><p><span style="font-family: Kodchasan;">ให้ผู้อ่านลองดูข้อมูลในตาราง Transactions จะเห็นว่าข้อมูลจะมีคอลัมน์ type ซึ่งเก็บสถานะการรับ (in) และจ่าย (out) หากเราจะหาผลรวมที่เป็นยอดคงเหลือโดยใช้คำสั่ง SUM(qty) ก็จะมีปัญหาเนื่องจากยอดในคอลัมน์ qty มีค่าเป็นบวกหมด ดังนั้นเราต้องทำการแปลงเป็นค่า บวก หรือ ลบ โดยถ้า type มีค่าเป็น IN ให้ยอด qty มีค่าเป็นบวก แต่ถ้า type มีค่าเป็น OUT ก็ให้ยอด qty มีค่าเป็นลบ เพื่อจะได้หายอดคงเหลือของการรับ/จ่ายได้ สามารถเขียนคำสั่งได้ ดังนี้</span></p><p><span style="font-family: Noto Sans Thai;">SELECT * FROM [Transactions] ORDER BY [prod_no], [type]<br /><br />SELECT [prod_no], SUM(CASE WHEN [type]='IN' THEN [qty] ELSE [qty] * -1 END) AS [onhand] FROM [Transactions] GROUP BY [prod_no]</span></p><p></p><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi5O1l6IxxsF1E1HvPZPQTUruVCqV5jB-82LEOIPgDueNdkgEJpXQJd2Td9JOlvB_DiAR42wqiiHZpHhtf87iUOtjo-CVmmYQtHt_Z_wkl1e7eLE27HygK3HPa_FIXCpCVy1n0KTM5wYdJXvDwBPu4-90TmCY24DuKgmCkcO6QqDLv-XVxKuLSR7yJ0/s707/update02.png" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img border="0" data-original-height="600" data-original-width="707" height="543" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi5O1l6IxxsF1E1HvPZPQTUruVCqV5jB-82LEOIPgDueNdkgEJpXQJd2Td9JOlvB_DiAR42wqiiHZpHhtf87iUOtjo-CVmmYQtHt_Z_wkl1e7eLE27HygK3HPa_FIXCpCVy1n0KTM5wYdJXvDwBPu4-90TmCY24DuKgmCkcO6QqDLv-XVxKuLSR7yJ0/w640-h543/update02.png" width="640" /></a></div><br /><span style="font-family: Kodchasan;"><br /></span><p></p><p><br /></p><p><br /></p><p><br /></p><p><br /></p><p><br /></p><p><br /></p><p><br /></p><p><br /></p><p><br /></p><p><span style="font-family: Kodchasan;">จากคำสั่ง </span><span style="font-family: Noto Sans Thai;">SUM(CASE WHEN [type]='IN' THEN [qty] ELSE [qty] * -1 END)</span><span style="font-family: Kodchasan;"> ข้างต้นที่เราจะได้ยอดคงเหลือมาแสดงเรียบร้อย</span></p><p><span style="font-family: Kodchasan;">ขั้นต่อมาคือนำไปปรับปรุงยอดในคอลัมน์ onhand ของตาราง Products ซึ่งการทำเราจะใช้คำสั่ง UPDATE ร่วมกับ JOIN เพื่อปรับปรุงยอด ดังนี้</span></p><p><span style="font-family: Noto Sans Thai;">--ปรับปรุงข้อมูลตาราง Products ในคอลัมน์ onhand จากยอด SUM ของตาราง Transactions <br />UPDATE P SET P.[onhand] = T.[onhand]<br /> FROM [Products] P<br /> INNER JOIN (SELECT [prod_no], SUM(CASE WHEN [type]='IN' THEN [qty]<span> </span>ELSE [qty] * -1 END) AS [onhand] <br /><span> </span>FROM [Transactions] GROUP BY [prod_no]) T <br /> ON P.[prod_no] = T.[prod_no]</span></p><p><span style="font-family: Noto Sans Thai;">--แสดงยอดที่ปรับปรุงแล้วของตาราง Products<br />SELECT * FROM [Products]</span></p><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEghxlSkmiiJo85hT8QQ83XgjQccS0rkF3ISziAIaxm5cMq0PLqIoeLRKaHSzuz78xQoffre6NOdSBuaeTbdoe4nX1IrO2IC8T1zPxAyzOeo5Btgwm_zyYXeYfxLMVXiWr7qYN7-j1IMkY7eUIBwMcKo_fBOs3ci6m-soo22UOjtC27Uj6pE-Qn3Pnpq/s807/update03.png" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img border="0" data-original-height="423" data-original-width="807" height="335" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEghxlSkmiiJo85hT8QQ83XgjQccS0rkF3ISziAIaxm5cMq0PLqIoeLRKaHSzuz78xQoffre6NOdSBuaeTbdoe4nX1IrO2IC8T1zPxAyzOeo5Btgwm_zyYXeYfxLMVXiWr7qYN7-j1IMkY7eUIBwMcKo_fBOs3ci6m-soo22UOjtC27Uj6pE-Qn3Pnpq/w640-h335/update03.png" width="640" /></a></div><br /><p><br /></p><p><br /></p><p><br /></p><p><br /></p><p><br /></p><p><br /></p><p><br /></p><p><br /></p><p><span style="font-family: Kodchasan;">จะเห็นว่าการใช้ UPDATE JOIN ช่วยได้มากเลย คำสั่ง SQL เชื่อมโยงรหัส (prod_no) ที่ตรงกันแล้วทำกันปรับปรุงยอดให้ทำให้เรามันใจว่าอย่างไรเสียข้อมูลไม่มีวันผิดพลาด</span></p><p><span style="font-family: Kodchasan;">สวัสดี ผลสลากกินแบ่ง งวด 1 พย. 65 รางวัลที่ 1 ..... 913106</span></p><p><br /></p><div class="blogger-post-footer">สงวนลิขสิทธิ์ ห้ามนำไปเผยแพร่ก่อนได้รับอนุญาติ</div>เกษม กมลชัยพิสิฐhttp://www.blogger.com/profile/03223085345729627028noreply@blogger.com0tag:blogger.com,1999:blog-2343321804163472494.post-41677451623040443552022-07-15T16:19:00.010+07:002022-07-15T18:24:52.874+07:00SQL Server : Dynamic PIVOT in SQL Server<p>PIVOT ใน SQL Server คือเครื่องมือที่ช่วยสร้างตารางสรุปในรูปแบบการเปลี่ยนการแสดงผลจากแนวตั้ง (Row) มาเป็นแนวนอน (Column) ซึ่งช่วยให้การดูข้อมูลสะดวกมากยิ่งขึ้น แต่เนื่องจาก การทำ PIVOT ใน SQL Server จำเป็นต้องทราบข้อมูลที่จะนำมาใช้เป็นชื่อคอลัมน์ในแนวนอนที่แน่นอน ซึ่งเหมาะกับการทำสรุป ยอดขายประจำเดือน ซึ่งมีแค่ เดือน 1 ถึงเดือน 12 หรือการสรุปตามวัน ซึ่งมี 1 - 31 ไม่เกินนี้ แต่ถ้าหากข้อมูลเรามีการเพิ่มลดอย่างต่อเนื่อง (แต่ต้องไม่มากจนเกินไป) จำเป็นต้องใช้วิธีการเขียนคำสั่งเพื่อทำให้ PIVOT สามารถแสดงผลเป็นแบบ Dynamic ได้ตามต้องการ </p><p>สำหรับตัวอย่างที่จะนำเสนอเป็นการสรุปยอด ตาม Category ของสินค้า ซึ่งจะแยกเป็นยอดขายแต่ละวัน โดยใช้ตาราง Category เป็นตารางที่จะนำมาเป็นตัวที่ทำ PIVOT ในส่วนของคอลัมน์ ซึ่งจะผันแปรไปตามข้อมูลที่มีอยู่ในตาราง Category ตาราง Product เก็บรายการสินค้า และ ตาราง Inv_dtl เก็บข้อมูลการขายสินค้า ตาราง inv_hd เก็บวันที่ขาย รายละเอียด ดังภาพ</p><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjubBhPXA2xS23SIjBWEB2WG6FSGY1Bj3n7apaU68QvhyJnPNLzP7UkB_X2-U6Wo315HHepdld-4paoDV21GfQNGK2KWTWSJj6-53YU5V7A1Ch65fXTVuiUpSn0G_UBl1DB-I9gCxjmG0lOCMim3MeGLughzpt99PpvCc909YimrTZV4kkz1m409Id_/s1289/pivot4.png" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img border="0" data-original-height="831" data-original-width="1289" height="412" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjubBhPXA2xS23SIjBWEB2WG6FSGY1Bj3n7apaU68QvhyJnPNLzP7UkB_X2-U6Wo315HHepdld-4paoDV21GfQNGK2KWTWSJj6-53YU5V7A1Ch65fXTVuiUpSn0G_UBl1DB-I9gCxjmG0lOCMim3MeGLughzpt99PpvCc909YimrTZV4kkz1m409Id_/w640-h412/pivot4.png" width="640" /></a></div><br /><p><br /></p><p><br /></p><p><br /></p><p><br /></p><p><br /></p><p><br /></p><p><br /></p><p><br /></p><p>ตัวอย่างตารางและข้อมูล</p><p><br />CREATE TABLE [category](<br /> [cat_id] [nchar](10) NULL,<br /> [cat_name] [nvarchar](50) NULL<br />) <br /><br />CREATE TABLE [inv_dtl](<br /> [inv_no] [nchar](10) NULL,<br /> [product_id] [nchar](10) NULL,<br /> [qty] [money] NULL,<br /> [price] [money] NULL,<br /> [amount] [money] NULL<br />) <br /><br />CREATE TABLE [inv_hd](<br /> [inv_no] [nchar](10) NULL,<br /> [inv_date] [date] NULL<br />) <br /><br />CREATE TABLE [product](<br /> [product_id] [int] NULL,<br /> [product_name] [varchar](50) NOT NULL,<br /> [cat_id] [varchar](25) NULL<br />) <br />GO<br /><br />INSERT [category] ([cat_id], [cat_name]) VALUES (N'C01', N'Beverage')<br />INSERT [category] ([cat_id], [cat_name]) VALUES (N'C02', N'Beauty')<br />INSERT [category] ([cat_id], [cat_name]) VALUES (N'C03', N'Health')<br />INSERT [category] ([cat_id], [cat_name]) VALUES (N'C04', N'Food')<br /><br />INSERT [inv_dtl] ([inv_no], [product_id], [qty], [price], [amount]) VALUES (N'65001', N'101', 5.0000, 200.0000, 100.0000)<br />INSERT [inv_dtl] ([inv_no], [product_id], [qty], [price], [amount]) VALUES (N'65002', N'105', 1.0000, 80.0000, 80.0000)<br />INSERT [inv_dtl] ([inv_no], [product_id], [qty], [price], [amount]) VALUES (N'65002', N'104 ', 2.0000, 70.0000, 140.0000)<br />INSERT [inv_dtl] ([inv_no], [product_id], [qty], [price], [amount]) VALUES (N'65003', N'102', 3.0000, 50.0000, 150.0000)<br />INSERT [inv_dtl] ([inv_no], [product_id], [qty], [price], [amount]) VALUES (N'65003', N'104', 2.0000, 70.0000, 140.0000)<br />INSERT [inv_dtl] ([inv_no], [product_id], [qty], [price], [amount]) VALUES (N'65004', N'102', 2.0000, 80.0000, 160.0000)<br />INSERT [inv_dtl] ([inv_no], [product_id], [qty], [price], [amount]) VALUES (N'65005', N'101', 2.0000, 200.0000, 400.0000)<br /><br />INSERT [inv_hd] ([inv_no], [inv_date]) VALUES (N'65001', CAST(N'2022-05-22' AS Date))<br />INSERT [inv_hd] ([inv_no], [inv_date]) VALUES (N'65002', CAST(N'2022-05-22' AS Date))<br />INSERT [inv_hd] ([inv_no], [inv_date]) VALUES (N'65003', CAST(N'2022-05-23' AS Date))<br />INSERT [inv_hd] ([inv_no], [inv_date]) VALUES (N'65004', CAST(N'2022-05-24' AS Date))<br />INSERT [inv_hd] ([inv_no], [inv_date]) VALUES (N'65005', CAST(N'2022-05-24' AS Date))<br /><br />INSERT [product] ([product_id], [product_name], [cat_id]) VALUES (1, 101, N'Soda', N'C01')<br />INSERT [product] ([product_id], [product_name], [cat_id]) VALUES (2, 102, N'Water', N'C01')<br />INSERT [product] ([product_id], [product_name], [cat_id]) VALUES (3, 103, N'Pork', N'C04')<br />INSERT [product] ([product_id], [product_name], [cat_id]) VALUES (4, 104, N'Vegetable', N'C04')<br />INSERT [product] ([product_id], [product_name], [cat_id]) VALUES (5, 105, N'Fruit', N'C04')<br /> <br /></p><p>จากตารางข้างต้นถ้าเราจะทำรายงานสรุป ยอดขายตาม Category โดยแยกเป็นแต่ละวัน สามารถทำได้โดยใช้คำสั่ง</p><p>SELECT h.inv_date,c.cat_id,SUM(i.amount) as Total FROM inv_dtl i<br /> LEFT JOIN inv_hd h ON i.inv_no = h.inv_no<br /> LEFT JOIN product p ON i.product_id = p.product_id<br /> LEFT JOIN category c ON p.cat_id = c.cat_id<br />GROUP BY c.cat_id,h.inv_date<br />ORDER BY h.inv_date,c.cat_id</p><p>จะได้ผลลัพธ์ดังภาพ</p><p></p><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEics8IWmzmHlt9Zd_1ZURVFKTvTFmALL_VpnIIZcMhTHJ9TpEhwvFpzVRy8APvL0bJuqelzUoq0AwQr7-TuyhYLdvapPF7t_HwaqOJ6Q37X8dCXn8sg8ujsZIfjccSZPaOA-q-7Bzrinma8ExJe0oQb2qXdi1IT6l9kcxsK7qKdpRibjBZQtLkVxgMn/s897/pivot5.png" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img border="0" data-original-height="455" data-original-width="897" height="324" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEics8IWmzmHlt9Zd_1ZURVFKTvTFmALL_VpnIIZcMhTHJ9TpEhwvFpzVRy8APvL0bJuqelzUoq0AwQr7-TuyhYLdvapPF7t_HwaqOJ6Q37X8dCXn8sg8ujsZIfjccSZPaOA-q-7Bzrinma8ExJe0oQb2qXdi1IT6l9kcxsK7qKdpRibjBZQtLkVxgMn/w640-h324/pivot5.png" width="640" /></a> <br /></div><p></p><p>จะเห็นว่าข้อมูลข้างต้นจะเป็นข้อมูลสรุปยอดขายตาม Category โดยแยกสรุปเป็นวัน แต่เป็นรายการในลักษณะแนวตั้ง การดูรายงานจะทำให้เข้าใจได้ยาก หากต้องการนำเสนอในรูปแบบสรุป จำเป็นต้องอาศัยการใช้งานคำสั่ง PIVOT เพื่อกลับตารางจากแนวตั้งเป็นแนวนอน <br /></p><p>แต่สิ่งที่เป็นโจทย์ในบทความนี้คอ ต้องนำรายการของ Category ทั้งหมด มาแสดงเป็นหัวคอลัมน์ ดังนั้นต้องนำข้อมูลในตาราง Category ทั้งหมดมาแปลงก่อนนำไปใช้ในคำสั่ง PIVOT </p><p>ซึ่งลักษณะนี้จะเป็นรูปแบบ Dynamic ที่ข้อมูลไม่ได้คงที่อาจมีการเพิ่มหรือลดลงได้ ดังนั้นจะต้องทำการ เตรียมข้อมูลสำหรับ PIVOT โดยให้ข้อมูลในตารางที่เป็น cat_id ทุกรายการ เอามาทำให้ให้อยู่ในรูปแบบดังนี้<br /></p><p>C01,C02,C03,C04</p><p>สามารถทำได้โดยการเขียนคำสั่งดังนี้</p><p>DECLARE @colList varchar(MAX)<br />SELECT @colList = COALESCE(@colList + ',','') + RTRIM(cat_id)<br />FROM category </p><p>SELECT @colList</p><p>จะได้ผลลัพธ์ดังภาพ</p><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjA8o_vqseyOoHxQTYmGmodIO0E2kSGuH18G20Hmq-bcZOxMZVrHtCRhQETodXJugis2WgSVyZSQ_LJskTG9slWI6I1FS2DASfdd4YsgWoLjZS-unv6_vy6v3vQ656S8euDTBse7E0feEKAt_pCqHDjYzTtkvTj-VZ6lDi3BjBpaxtfOZRy-6IpmnCY/s875/pivot3.png" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img border="0" data-original-height="340" data-original-width="875" height="248" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjA8o_vqseyOoHxQTYmGmodIO0E2kSGuH18G20Hmq-bcZOxMZVrHtCRhQETodXJugis2WgSVyZSQ_LJskTG9slWI6I1FS2DASfdd4YsgWoLjZS-unv6_vy6v3vQ656S8euDTBse7E0feEKAt_pCqHDjYzTtkvTj-VZ6lDi3BjBpaxtfOZRy-6IpmnCY/w640-h248/pivot3.png" width="640" /></a></div><br /><p><br /></p><p><br /></p><p><br /></p><p><br /></p><p><br /></p><p><br /></p><p>จากนั้นนำผลลัพธ์ที่เก็บในตัวแปร @colList ไปใช้ในคำสั่ง PIVOT โดยเขียนคำสั่งในรูปของตัวแปร และเรียกประมวลผลผ่านคำสั่ง EXEC ดังนี้</p><p>DECLARE @colList varchar(MAX)<br />SELECT @colList = COALESCE(@colList + ',','') + RTRIM(cat_id) FROM category <br />DECLARE @SQLQuery NVARCHAR(MAX)<br />SET @SQLQuery = 'SELECT * FROM <br /> (<br /> SELECT h.inv_date,c.cat_id,SUM(i.amount) as Total FROM inv_dtl i<br /> LEFT JOIN inv_hd h ON i.inv_no = h.inv_no<br /> LEFT JOIN product p ON i.product_id = p.product_id<br /> LEFT JOIN category c ON p.cat_id = c.cat_id<br /> GROUP BY c.cat_id,h.inv_date<br /> ) t <br /> PIVOT(<br /> SUM(total) <br /> FOR cat_id IN ('+ @colList +')<br /> ) AS pivot_table;';<br /><br />EXEC(@SQLQuery)</p><p>จะได้ผลลัพธ์ตามภาพ<br /></p><p></p><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhgX7gM_mNoq3zTN2m6Tdz-aUUiVYTgAYCrH9_zYzp_PQy9_p67C6pEq0VCzwCvIyhQvL4v_Ohilcmv7BrwrJGV2pVvOqI5HI836nQ0lURqNdgpSLsNEWcXz66mtX7_nh_kEvsQjI_MiICysy9bO6S7gg8Rbna8gvMO209o9A6-dCpu0QDuDjaWrLzU/s1164/pivot6.png" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img border="0" data-original-height="680" data-original-width="1164" height="374" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhgX7gM_mNoq3zTN2m6Tdz-aUUiVYTgAYCrH9_zYzp_PQy9_p67C6pEq0VCzwCvIyhQvL4v_Ohilcmv7BrwrJGV2pVvOqI5HI836nQ0lURqNdgpSLsNEWcXz66mtX7_nh_kEvsQjI_MiICysy9bO6S7gg8Rbna8gvMO209o9A6-dCpu0QDuDjaWrLzU/w640-h374/pivot6.png" width="640" /></a></div><br /><p><br /></p><p><br /></p><p><br /></p><p><br /></p><p><br /></p><p><br /></p><p><br /></p><p><br /></p><p>หากไม่ต้องการ คอลัมน์ เป็นรหัส C01 C02 C03 C04 สามารถใช้ชื่อ cat_name มาแทนได้ แต่ต้องระวังเรื่องของความยาว โดยที่ชื่อนั้นไม่ควรยาวมากจนเกินไป และควรใส่ [ ] คลุมระหว่างชื่อด้วยเพื่อป้องกันเรื่องของการเว้นช่องว่างระหว่างคำ<br /></p><p>DECLARE @colList varchar(MAX)<br />SELECT @colList = COALESCE(@colList + ',','') + '[' + RTRIM(cat_name)+ ']' FROM category <br />DECLARE @SQLQuery NVARCHAR(MAX)<br />SET @SQLQuery = 'SELECT * FROM <br /> (<br /> SELECT h.inv_date,c.cat_name,SUM(i.amount) as Total FROM inv_dtl i<br /> LEFT JOIN inv_hd h ON i.inv_no = h.inv_no<br /> LEFT JOIN product p ON i.product_id = p.product_id<br /> LEFT JOIN category c ON p.cat_id = c.cat_id<br /> GROUP BY c.cat_name,h.inv_date<br /> ) t <br /> PIVOT(<br /> SUM(total) <br /> FOR cat_name IN ('+ @colList +')<br /> ) AS pivot_table;';<br /><br />EXEC(@SQLQuery)</p><p>จะได้ผลลัพธ์ ดังภาพ</p><p></p><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjRRyhc98hrYxSncpNEnn5-DPLlrKJAIXo_1okVZLx1c0V4A1IaV6bKBSm6Vq14y3-6WCO7J4gXxKHJldMh8wk_puCcLaSqxYvnEi00uMiAuFyR3apj-mfe9JPSj_4EFTaRmWLqo6pBtFbZRfJio4K082ZfnEEH8nG9cECUuq_hM7RQ65p-6FI3rE58/s1180/pivot7.png" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img border="0" data-original-height="681" data-original-width="1180" height="370" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjRRyhc98hrYxSncpNEnn5-DPLlrKJAIXo_1okVZLx1c0V4A1IaV6bKBSm6Vq14y3-6WCO7J4gXxKHJldMh8wk_puCcLaSqxYvnEi00uMiAuFyR3apj-mfe9JPSj_4EFTaRmWLqo6pBtFbZRfJio4K082ZfnEEH8nG9cECUuq_hM7RQ65p-6FI3rE58/w640-h370/pivot7.png" width="640" /></a></div><br /><p></p><p><br /></p><p><br /></p><p><br /></p><p><br /></p><p><br /></p><p><br /></p><p><br /></p><p><br /></p><p><br /></p><p><br /></p><p>ขอให้สนุกกับการกลับตาราง</p><p>สวัสดี ร่ำรวย ดูหนังกลางแปลง ปิ้งปลาหมึก อร่อย</p><p></p><br /><p></p><p><br /></p><p><br /></p><p><br /></p><p><br /></p><br /><br /><br /><br /><div class="blogger-post-footer">สงวนลิขสิทธิ์ ห้ามนำไปเผยแพร่ก่อนได้รับอนุญาติ</div>เกษม กมลชัยพิสิฐhttp://www.blogger.com/profile/03223085345729627028noreply@blogger.com0tag:blogger.com,1999:blog-2343321804163472494.post-66779943892494983082022-05-13T15:17:00.011+07:002022-05-13T18:25:32.993+07:00PostgreSQL : กำหนดให้ postgresql เก็บ log คำสั่ง SQL<p><!--[if gte mso 9]><xml>
<o:OfficeDocumentSettings>
<o:AllowPNG/>
</o:OfficeDocumentSettings>
</xml><![endif]--><!--[if gte mso 9]><xml>
<w:WordDocument>
<w:View>Normal</w:View>
<w:Zoom>0</w:Zoom>
<w:TrackMoves/>
<w:TrackFormatting/>
<w:PunctuationKerning/>
<w:ValidateAgainstSchemas/>
<w:SaveIfXMLInvalid>false</w:SaveIfXMLInvalid>
<w:IgnoreMixedContent>false</w:IgnoreMixedContent>
<w:AlwaysShowPlaceholderText>false</w:AlwaysShowPlaceholderText>
<w:DoNotPromoteQF/>
<w:LidThemeOther>EN-US</w:LidThemeOther>
<w:LidThemeAsian>X-NONE</w:LidThemeAsian>
<w:LidThemeComplexScript>TH</w:LidThemeComplexScript>
<w:Compatibility>
<w:BreakWrappedTables/>
<w:SnapToGridInCell/>
<w:ApplyBreakingRules/>
<w:WrapTextWithPunct/>
<w:UseAsianBreakRules/>
<w:DontGrowAutofit/>
<w:SplitPgBreakAndParaMark/>
<w:EnableOpenTypeKerning/>
<w:DontFlipMirrorIndents/>
<w:OverrideTableStyleHps/>
</w:Compatibility>
<m:mathPr>
<m:mathFont m:val="Cambria Math"/>
<m:brkBin m:val="before"/>
<m:brkBinSub m:val="--"/>
<m:smallFrac m:val="off"/>
<m:dispDef/>
<m:lMargin m:val="0"/>
<m:rMargin m:val="0"/>
<m:defJc m:val="centerGroup"/>
<m:wrapIndent m:val="1440"/>
<m:intLim m:val="subSup"/>
<m:naryLim m:val="undOvr"/>
</m:mathPr></w:WordDocument>
</xml><![endif]--><!--[if gte mso 9]><xml>
<w:LatentStyles DefLockedState="false" DefUnhideWhenUsed="false"
DefSemiHidden="false" DefQFormat="false" DefPriority="99"
LatentStyleCount="371">
<w:LsdException Locked="false" Priority="0" QFormat="true" Name="Normal"/>
<w:LsdException Locked="false" Priority="9" QFormat="true" Name="heading 1"/>
<w:LsdException Locked="false" Priority="9" SemiHidden="true"
UnhideWhenUsed="true" QFormat="true" Name="heading 2"/>
<w:LsdException Locked="false" Priority="9" SemiHidden="true"
UnhideWhenUsed="true" QFormat="true" Name="heading 3"/>
<w:LsdException Locked="false" Priority="9" SemiHidden="true"
UnhideWhenUsed="true" QFormat="true" Name="heading 4"/>
<w:LsdException Locked="false" Priority="9" SemiHidden="true"
UnhideWhenUsed="true" QFormat="true" Name="heading 5"/>
<w:LsdException Locked="false" Priority="9" SemiHidden="true"
UnhideWhenUsed="true" QFormat="true" Name="heading 6"/>
<w:LsdException Locked="false" Priority="9" SemiHidden="true"
UnhideWhenUsed="true" QFormat="true" Name="heading 7"/>
<w:LsdException Locked="false" Priority="9" SemiHidden="true"
UnhideWhenUsed="true" QFormat="true" Name="heading 8"/>
<w:LsdException Locked="false" Priority="9" SemiHidden="true"
UnhideWhenUsed="true" QFormat="true" Name="heading 9"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="index 1"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="index 2"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="index 3"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="index 4"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="index 5"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="index 6"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="index 7"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="index 8"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="index 9"/>
<w:LsdException Locked="false" Priority="39" SemiHidden="true"
UnhideWhenUsed="true" Name="toc 1"/>
<w:LsdException Locked="false" Priority="39" SemiHidden="true"
UnhideWhenUsed="true" Name="toc 2"/>
<w:LsdException Locked="false" Priority="39" SemiHidden="true"
UnhideWhenUsed="true" Name="toc 3"/>
<w:LsdException Locked="false" Priority="39" SemiHidden="true"
UnhideWhenUsed="true" Name="toc 4"/>
<w:LsdException Locked="false" Priority="39" SemiHidden="true"
UnhideWhenUsed="true" Name="toc 5"/>
<w:LsdException Locked="false" Priority="39" SemiHidden="true"
UnhideWhenUsed="true" Name="toc 6"/>
<w:LsdException Locked="false" Priority="39" SemiHidden="true"
UnhideWhenUsed="true" Name="toc 7"/>
<w:LsdException Locked="false" Priority="39" SemiHidden="true"
UnhideWhenUsed="true" Name="toc 8"/>
<w:LsdException Locked="false" Priority="39" SemiHidden="true"
UnhideWhenUsed="true" Name="toc 9"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Normal Indent"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="footnote text"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="annotation text"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="header"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="footer"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="index heading"/>
<w:LsdException Locked="false" Priority="35" SemiHidden="true"
UnhideWhenUsed="true" QFormat="true" Name="caption"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="table of figures"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="envelope address"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="envelope return"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="footnote reference"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="annotation reference"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="line number"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="page number"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="endnote reference"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="endnote text"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="table of authorities"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="macro"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="toa heading"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="List"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="List Bullet"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="List Number"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="List 2"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="List 3"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="List 4"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="List 5"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="List Bullet 2"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="List Bullet 3"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="List Bullet 4"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="List Bullet 5"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="List Number 2"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="List Number 3"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="List Number 4"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="List Number 5"/>
<w:LsdException Locked="false" Priority="10" QFormat="true" Name="Title"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Closing"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Signature"/>
<w:LsdException Locked="false" Priority="1" SemiHidden="true"
UnhideWhenUsed="true" Name="Default Paragraph Font"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Body Text"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Body Text Indent"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="List Continue"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="List Continue 2"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="List Continue 3"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="List Continue 4"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="List Continue 5"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Message Header"/>
<w:LsdException Locked="false" Priority="11" QFormat="true" Name="Subtitle"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Salutation"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Date"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Body Text First Indent"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Body Text First Indent 2"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Note Heading"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Body Text 2"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Body Text 3"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Body Text Indent 2"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Body Text Indent 3"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Block Text"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Hyperlink"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="FollowedHyperlink"/>
<w:LsdException Locked="false" Priority="22" QFormat="true" Name="Strong"/>
<w:LsdException Locked="false" Priority="20" QFormat="true" Name="Emphasis"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Document Map"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Plain Text"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="E-mail Signature"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="HTML Top of Form"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="HTML Bottom of Form"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Normal (Web)"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="HTML Acronym"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="HTML Address"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="HTML Cite"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="HTML Code"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="HTML Definition"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="HTML Keyboard"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="HTML Preformatted"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="HTML Sample"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="HTML Typewriter"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="HTML Variable"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Normal Table"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="annotation subject"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="No List"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Outline List 1"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Outline List 2"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Outline List 3"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Table Simple 1"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Table Simple 2"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Table Simple 3"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Table Classic 1"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Table Classic 2"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Table Classic 3"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Table Classic 4"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Table Colorful 1"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Table Colorful 2"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Table Colorful 3"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Table Columns 1"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Table Columns 2"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Table Columns 3"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Table Columns 4"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Table Columns 5"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Table Grid 1"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Table Grid 2"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Table Grid 3"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Table Grid 4"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Table Grid 5"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Table Grid 6"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Table Grid 7"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Table Grid 8"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Table List 1"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Table List 2"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Table List 3"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Table List 4"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Table List 5"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Table List 6"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Table List 7"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Table List 8"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Table 3D effects 1"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Table 3D effects 2"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Table 3D effects 3"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Table Contemporary"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Table Elegant"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Table Professional"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Table Subtle 1"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Table Subtle 2"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Table Web 1"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Table Web 2"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Table Web 3"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Balloon Text"/>
<w:LsdException Locked="false" Priority="39" Name="Table Grid"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Table Theme"/>
<w:LsdException Locked="false" SemiHidden="true" Name="Placeholder Text"/>
<w:LsdException Locked="false" Priority="1" QFormat="true" Name="No Spacing"/>
<w:LsdException Locked="false" Priority="60" Name="Light Shading"/>
<w:LsdException Locked="false" Priority="61" Name="Light List"/>
<w:LsdException Locked="false" Priority="62" Name="Light Grid"/>
<w:LsdException Locked="false" Priority="63" Name="Medium Shading 1"/>
<w:LsdException Locked="false" Priority="64" Name="Medium Shading 2"/>
<w:LsdException Locked="false" Priority="65" Name="Medium List 1"/>
<w:LsdException Locked="false" Priority="66" Name="Medium List 2"/>
<w:LsdException Locked="false" Priority="67" Name="Medium Grid 1"/>
<w:LsdException Locked="false" Priority="68" Name="Medium Grid 2"/>
<w:LsdException Locked="false" Priority="69" Name="Medium Grid 3"/>
<w:LsdException Locked="false" Priority="70" Name="Dark List"/>
<w:LsdException Locked="false" Priority="71" Name="Colorful Shading"/>
<w:LsdException Locked="false" Priority="72" Name="Colorful List"/>
<w:LsdException Locked="false" Priority="73" Name="Colorful Grid"/>
<w:LsdException Locked="false" Priority="60" Name="Light Shading Accent 1"/>
<w:LsdException Locked="false" Priority="61" Name="Light List Accent 1"/>
<w:LsdException Locked="false" Priority="62" Name="Light Grid Accent 1"/>
<w:LsdException Locked="false" Priority="63" Name="Medium Shading 1 Accent 1"/>
<w:LsdException Locked="false" Priority="64" Name="Medium Shading 2 Accent 1"/>
<w:LsdException Locked="false" Priority="65" Name="Medium List 1 Accent 1"/>
<w:LsdException Locked="false" SemiHidden="true" Name="Revision"/>
<w:LsdException Locked="false" Priority="34" QFormat="true"
Name="List Paragraph"/>
<w:LsdException Locked="false" Priority="29" QFormat="true" Name="Quote"/>
<w:LsdException Locked="false" Priority="30" QFormat="true"
Name="Intense Quote"/>
<w:LsdException Locked="false" Priority="66" Name="Medium List 2 Accent 1"/>
<w:LsdException Locked="false" Priority="67" Name="Medium Grid 1 Accent 1"/>
<w:LsdException Locked="false" Priority="68" Name="Medium Grid 2 Accent 1"/>
<w:LsdException Locked="false" Priority="69" Name="Medium Grid 3 Accent 1"/>
<w:LsdException Locked="false" Priority="70" Name="Dark List Accent 1"/>
<w:LsdException Locked="false" Priority="71" Name="Colorful Shading Accent 1"/>
<w:LsdException Locked="false" Priority="72" Name="Colorful List Accent 1"/>
<w:LsdException Locked="false" Priority="73" Name="Colorful Grid Accent 1"/>
<w:LsdException Locked="false" Priority="60" Name="Light Shading Accent 2"/>
<w:LsdException Locked="false" Priority="61" Name="Light List Accent 2"/>
<w:LsdException Locked="false" Priority="62" Name="Light Grid Accent 2"/>
<w:LsdException Locked="false" Priority="63" Name="Medium Shading 1 Accent 2"/>
<w:LsdException Locked="false" Priority="64" Name="Medium Shading 2 Accent 2"/>
<w:LsdException Locked="false" Priority="65" Name="Medium List 1 Accent 2"/>
<w:LsdException Locked="false" Priority="66" Name="Medium List 2 Accent 2"/>
<w:LsdException Locked="false" Priority="67" Name="Medium Grid 1 Accent 2"/>
<w:LsdException Locked="false" Priority="68" Name="Medium Grid 2 Accent 2"/>
<w:LsdException Locked="false" Priority="69" Name="Medium Grid 3 Accent 2"/>
<w:LsdException Locked="false" Priority="70" Name="Dark List Accent 2"/>
<w:LsdException Locked="false" Priority="71" Name="Colorful Shading Accent 2"/>
<w:LsdException Locked="false" Priority="72" Name="Colorful List Accent 2"/>
<w:LsdException Locked="false" Priority="73" Name="Colorful Grid Accent 2"/>
<w:LsdException Locked="false" Priority="60" Name="Light Shading Accent 3"/>
<w:LsdException Locked="false" Priority="61" Name="Light List Accent 3"/>
<w:LsdException Locked="false" Priority="62" Name="Light Grid Accent 3"/>
<w:LsdException Locked="false" Priority="63" Name="Medium Shading 1 Accent 3"/>
<w:LsdException Locked="false" Priority="64" Name="Medium Shading 2 Accent 3"/>
<w:LsdException Locked="false" Priority="65" Name="Medium List 1 Accent 3"/>
<w:LsdException Locked="false" Priority="66" Name="Medium List 2 Accent 3"/>
<w:LsdException Locked="false" Priority="67" Name="Medium Grid 1 Accent 3"/>
<w:LsdException Locked="false" Priority="68" Name="Medium Grid 2 Accent 3"/>
<w:LsdException Locked="false" Priority="69" Name="Medium Grid 3 Accent 3"/>
<w:LsdException Locked="false" Priority="70" Name="Dark List Accent 3"/>
<w:LsdException Locked="false" Priority="71" Name="Colorful Shading Accent 3"/>
<w:LsdException Locked="false" Priority="72" Name="Colorful List Accent 3"/>
<w:LsdException Locked="false" Priority="73" Name="Colorful Grid Accent 3"/>
<w:LsdException Locked="false" Priority="60" Name="Light Shading Accent 4"/>
<w:LsdException Locked="false" Priority="61" Name="Light List Accent 4"/>
<w:LsdException Locked="false" Priority="62" Name="Light Grid Accent 4"/>
<w:LsdException Locked="false" Priority="63" Name="Medium Shading 1 Accent 4"/>
<w:LsdException Locked="false" Priority="64" Name="Medium Shading 2 Accent 4"/>
<w:LsdException Locked="false" Priority="65" Name="Medium List 1 Accent 4"/>
<w:LsdException Locked="false" Priority="66" Name="Medium List 2 Accent 4"/>
<w:LsdException Locked="false" Priority="67" Name="Medium Grid 1 Accent 4"/>
<w:LsdException Locked="false" Priority="68" Name="Medium Grid 2 Accent 4"/>
<w:LsdException Locked="false" Priority="69" Name="Medium Grid 3 Accent 4"/>
<w:LsdException Locked="false" Priority="70" Name="Dark List Accent 4"/>
<w:LsdException Locked="false" Priority="71" Name="Colorful Shading Accent 4"/>
<w:LsdException Locked="false" Priority="72" Name="Colorful List Accent 4"/>
<w:LsdException Locked="false" Priority="73" Name="Colorful Grid Accent 4"/>
<w:LsdException Locked="false" Priority="60" Name="Light Shading Accent 5"/>
<w:LsdException Locked="false" Priority="61" Name="Light List Accent 5"/>
<w:LsdException Locked="false" Priority="62" Name="Light Grid Accent 5"/>
<w:LsdException Locked="false" Priority="63" Name="Medium Shading 1 Accent 5"/>
<w:LsdException Locked="false" Priority="64" Name="Medium Shading 2 Accent 5"/>
<w:LsdException Locked="false" Priority="65" Name="Medium List 1 Accent 5"/>
<w:LsdException Locked="false" Priority="66" Name="Medium List 2 Accent 5"/>
<w:LsdException Locked="false" Priority="67" Name="Medium Grid 1 Accent 5"/>
<w:LsdException Locked="false" Priority="68" Name="Medium Grid 2 Accent 5"/>
<w:LsdException Locked="false" Priority="69" Name="Medium Grid 3 Accent 5"/>
<w:LsdException Locked="false" Priority="70" Name="Dark List Accent 5"/>
<w:LsdException Locked="false" Priority="71" Name="Colorful Shading Accent 5"/>
<w:LsdException Locked="false" Priority="72" Name="Colorful List Accent 5"/>
<w:LsdException Locked="false" Priority="73" Name="Colorful Grid Accent 5"/>
<w:LsdException Locked="false" Priority="60" Name="Light Shading Accent 6"/>
<w:LsdException Locked="false" Priority="61" Name="Light List Accent 6"/>
<w:LsdException Locked="false" Priority="62" Name="Light Grid Accent 6"/>
<w:LsdException Locked="false" Priority="63" Name="Medium Shading 1 Accent 6"/>
<w:LsdException Locked="false" Priority="64" Name="Medium Shading 2 Accent 6"/>
<w:LsdException Locked="false" Priority="65" Name="Medium List 1 Accent 6"/>
<w:LsdException Locked="false" Priority="66" Name="Medium List 2 Accent 6"/>
<w:LsdException Locked="false" Priority="67" Name="Medium Grid 1 Accent 6"/>
<w:LsdException Locked="false" Priority="68" Name="Medium Grid 2 Accent 6"/>
<w:LsdException Locked="false" Priority="69" Name="Medium Grid 3 Accent 6"/>
<w:LsdException Locked="false" Priority="70" Name="Dark List Accent 6"/>
<w:LsdException Locked="false" Priority="71" Name="Colorful Shading Accent 6"/>
<w:LsdException Locked="false" Priority="72" Name="Colorful List Accent 6"/>
<w:LsdException Locked="false" Priority="73" Name="Colorful Grid Accent 6"/>
<w:LsdException Locked="false" Priority="19" QFormat="true"
Name="Subtle Emphasis"/>
<w:LsdException Locked="false" Priority="21" QFormat="true"
Name="Intense Emphasis"/>
<w:LsdException Locked="false" Priority="31" QFormat="true"
Name="Subtle Reference"/>
<w:LsdException Locked="false" Priority="32" QFormat="true"
Name="Intense Reference"/>
<w:LsdException Locked="false" Priority="33" QFormat="true" Name="Book Title"/>
<w:LsdException Locked="false" Priority="37" SemiHidden="true"
UnhideWhenUsed="true" Name="Bibliography"/>
<w:LsdException Locked="false" Priority="39" SemiHidden="true"
UnhideWhenUsed="true" QFormat="true" Name="TOC Heading"/>
<w:LsdException Locked="false" Priority="41" Name="Plain Table 1"/>
<w:LsdException Locked="false" Priority="42" Name="Plain Table 2"/>
<w:LsdException Locked="false" Priority="43" Name="Plain Table 3"/>
<w:LsdException Locked="false" Priority="44" Name="Plain Table 4"/>
<w:LsdException Locked="false" Priority="45" Name="Plain Table 5"/>
<w:LsdException Locked="false" Priority="40" Name="Grid Table Light"/>
<w:LsdException Locked="false" Priority="46" Name="Grid Table 1 Light"/>
<w:LsdException Locked="false" Priority="47" Name="Grid Table 2"/>
<w:LsdException Locked="false" Priority="48" Name="Grid Table 3"/>
<w:LsdException Locked="false" Priority="49" Name="Grid Table 4"/>
<w:LsdException Locked="false" Priority="50" Name="Grid Table 5 Dark"/>
<w:LsdException Locked="false" Priority="51" Name="Grid Table 6 Colorful"/>
<w:LsdException Locked="false" Priority="52" Name="Grid Table 7 Colorful"/>
<w:LsdException Locked="false" Priority="46"
Name="Grid Table 1 Light Accent 1"/>
<w:LsdException Locked="false" Priority="47" Name="Grid Table 2 Accent 1"/>
<w:LsdException Locked="false" Priority="48" Name="Grid Table 3 Accent 1"/>
<w:LsdException Locked="false" Priority="49" Name="Grid Table 4 Accent 1"/>
<w:LsdException Locked="false" Priority="50" Name="Grid Table 5 Dark Accent 1"/>
<w:LsdException Locked="false" Priority="51"
Name="Grid Table 6 Colorful Accent 1"/>
<w:LsdException Locked="false" Priority="52"
Name="Grid Table 7 Colorful Accent 1"/>
<w:LsdException Locked="false" Priority="46"
Name="Grid Table 1 Light Accent 2"/>
<w:LsdException Locked="false" Priority="47" Name="Grid Table 2 Accent 2"/>
<w:LsdException Locked="false" Priority="48" Name="Grid Table 3 Accent 2"/>
<w:LsdException Locked="false" Priority="49" Name="Grid Table 4 Accent 2"/>
<w:LsdException Locked="false" Priority="50" Name="Grid Table 5 Dark Accent 2"/>
<w:LsdException Locked="false" Priority="51"
Name="Grid Table 6 Colorful Accent 2"/>
<w:LsdException Locked="false" Priority="52"
Name="Grid Table 7 Colorful Accent 2"/>
<w:LsdException Locked="false" Priority="46"
Name="Grid Table 1 Light Accent 3"/>
<w:LsdException Locked="false" Priority="47" Name="Grid Table 2 Accent 3"/>
<w:LsdException Locked="false" Priority="48" Name="Grid Table 3 Accent 3"/>
<w:LsdException Locked="false" Priority="49" Name="Grid Table 4 Accent 3"/>
<w:LsdException Locked="false" Priority="50" Name="Grid Table 5 Dark Accent 3"/>
<w:LsdException Locked="false" Priority="51"
Name="Grid Table 6 Colorful Accent 3"/>
<w:LsdException Locked="false" Priority="52"
Name="Grid Table 7 Colorful Accent 3"/>
<w:LsdException Locked="false" Priority="46"
Name="Grid Table 1 Light Accent 4"/>
<w:LsdException Locked="false" Priority="47" Name="Grid Table 2 Accent 4"/>
<w:LsdException Locked="false" Priority="48" Name="Grid Table 3 Accent 4"/>
<w:LsdException Locked="false" Priority="49" Name="Grid Table 4 Accent 4"/>
<w:LsdException Locked="false" Priority="50" Name="Grid Table 5 Dark Accent 4"/>
<w:LsdException Locked="false" Priority="51"
Name="Grid Table 6 Colorful Accent 4"/>
<w:LsdException Locked="false" Priority="52"
Name="Grid Table 7 Colorful Accent 4"/>
<w:LsdException Locked="false" Priority="46"
Name="Grid Table 1 Light Accent 5"/>
<w:LsdException Locked="false" Priority="47" Name="Grid Table 2 Accent 5"/>
<w:LsdException Locked="false" Priority="48" Name="Grid Table 3 Accent 5"/>
<w:LsdException Locked="false" Priority="49" Name="Grid Table 4 Accent 5"/>
<w:LsdException Locked="false" Priority="50" Name="Grid Table 5 Dark Accent 5"/>
<w:LsdException Locked="false" Priority="51"
Name="Grid Table 6 Colorful Accent 5"/>
<w:LsdException Locked="false" Priority="52"
Name="Grid Table 7 Colorful Accent 5"/>
<w:LsdException Locked="false" Priority="46"
Name="Grid Table 1 Light Accent 6"/>
<w:LsdException Locked="false" Priority="47" Name="Grid Table 2 Accent 6"/>
<w:LsdException Locked="false" Priority="48" Name="Grid Table 3 Accent 6"/>
<w:LsdException Locked="false" Priority="49" Name="Grid Table 4 Accent 6"/>
<w:LsdException Locked="false" Priority="50" Name="Grid Table 5 Dark Accent 6"/>
<w:LsdException Locked="false" Priority="51"
Name="Grid Table 6 Colorful Accent 6"/>
<w:LsdException Locked="false" Priority="52"
Name="Grid Table 7 Colorful Accent 6"/>
<w:LsdException Locked="false" Priority="46" Name="List Table 1 Light"/>
<w:LsdException Locked="false" Priority="47" Name="List Table 2"/>
<w:LsdException Locked="false" Priority="48" Name="List Table 3"/>
<w:LsdException Locked="false" Priority="49" Name="List Table 4"/>
<w:LsdException Locked="false" Priority="50" Name="List Table 5 Dark"/>
<w:LsdException Locked="false" Priority="51" Name="List Table 6 Colorful"/>
<w:LsdException Locked="false" Priority="52" Name="List Table 7 Colorful"/>
<w:LsdException Locked="false" Priority="46"
Name="List Table 1 Light Accent 1"/>
<w:LsdException Locked="false" Priority="47" Name="List Table 2 Accent 1"/>
<w:LsdException Locked="false" Priority="48" Name="List Table 3 Accent 1"/>
<w:LsdException Locked="false" Priority="49" Name="List Table 4 Accent 1"/>
<w:LsdException Locked="false" Priority="50" Name="List Table 5 Dark Accent 1"/>
<w:LsdException Locked="false" Priority="51"
Name="List Table 6 Colorful Accent 1"/>
<w:LsdException Locked="false" Priority="52"
Name="List Table 7 Colorful Accent 1"/>
<w:LsdException Locked="false" Priority="46"
Name="List Table 1 Light Accent 2"/>
<w:LsdException Locked="false" Priority="47" Name="List Table 2 Accent 2"/>
<w:LsdException Locked="false" Priority="48" Name="List Table 3 Accent 2"/>
<w:LsdException Locked="false" Priority="49" Name="List Table 4 Accent 2"/>
<w:LsdException Locked="false" Priority="50" Name="List Table 5 Dark Accent 2"/>
<w:LsdException Locked="false" Priority="51"
Name="List Table 6 Colorful Accent 2"/>
<w:LsdException Locked="false" Priority="52"
Name="List Table 7 Colorful Accent 2"/>
<w:LsdException Locked="false" Priority="46"
Name="List Table 1 Light Accent 3"/>
<w:LsdException Locked="false" Priority="47" Name="List Table 2 Accent 3"/>
<w:LsdException Locked="false" Priority="48" Name="List Table 3 Accent 3"/>
<w:LsdException Locked="false" Priority="49" Name="List Table 4 Accent 3"/>
<w:LsdException Locked="false" Priority="50" Name="List Table 5 Dark Accent 3"/>
<w:LsdException Locked="false" Priority="51"
Name="List Table 6 Colorful Accent 3"/>
<w:LsdException Locked="false" Priority="52"
Name="List Table 7 Colorful Accent 3"/>
<w:LsdException Locked="false" Priority="46"
Name="List Table 1 Light Accent 4"/>
<w:LsdException Locked="false" Priority="47" Name="List Table 2 Accent 4"/>
<w:LsdException Locked="false" Priority="48" Name="List Table 3 Accent 4"/>
<w:LsdException Locked="false" Priority="49" Name="List Table 4 Accent 4"/>
<w:LsdException Locked="false" Priority="50" Name="List Table 5 Dark Accent 4"/>
<w:LsdException Locked="false" Priority="51"
Name="List Table 6 Colorful Accent 4"/>
<w:LsdException Locked="false" Priority="52"
Name="List Table 7 Colorful Accent 4"/>
<w:LsdException Locked="false" Priority="46"
Name="List Table 1 Light Accent 5"/>
<w:LsdException Locked="false" Priority="47" Name="List Table 2 Accent 5"/>
<w:LsdException Locked="false" Priority="48" Name="List Table 3 Accent 5"/>
<w:LsdException Locked="false" Priority="49" Name="List Table 4 Accent 5"/>
<w:LsdException Locked="false" Priority="50" Name="List Table 5 Dark Accent 5"/>
<w:LsdException Locked="false" Priority="51"
Name="List Table 6 Colorful Accent 5"/>
<w:LsdException Locked="false" Priority="52"
Name="List Table 7 Colorful Accent 5"/>
<w:LsdException Locked="false" Priority="46"
Name="List Table 1 Light Accent 6"/>
<w:LsdException Locked="false" Priority="47" Name="List Table 2 Accent 6"/>
<w:LsdException Locked="false" Priority="48" Name="List Table 3 Accent 6"/>
<w:LsdException Locked="false" Priority="49" Name="List Table 4 Accent 6"/>
<w:LsdException Locked="false" Priority="50" Name="List Table 5 Dark Accent 6"/>
<w:LsdException Locked="false" Priority="51"
Name="List Table 6 Colorful Accent 6"/>
<w:LsdException Locked="false" Priority="52"
Name="List Table 7 Colorful Accent 6"/>
</w:LatentStyles>
</xml><![endif]--><!--[if gte mso 10]>
<style>
/* Style Definitions */
table.MsoNormalTable
{mso-style-name:"Table Normal";
mso-tstyle-rowband-size:0;
mso-tstyle-colband-size:0;
mso-style-noshow:yes;
mso-style-priority:99;
mso-style-parent:"";
mso-padding-alt:0in 5.4pt 0in 5.4pt;
mso-para-margin-top:0in;
mso-para-margin-right:0in;
mso-para-margin-bottom:8.0pt;
mso-para-margin-left:0in;
line-height:107%;
mso-pagination:widow-orphan;
font-size:11.0pt;
mso-bidi-font-size:14.0pt;
font-family:"Calibri",sans-serif;
mso-ascii-font-family:Calibri;
mso-ascii-theme-font:minor-latin;
mso-hansi-font-family:Calibri;
mso-hansi-theme-font:minor-latin;
mso-bidi-font-family:"Cordia New";
mso-bidi-theme-font:minor-bidi;}
</style>
<![endif]-->
</p><p class="MsoNormal"><span style="font-family: Noto Sans Thai;"><span lang="TH" style="font-size: 16pt; line-height: 107%;">การกำหนดให้ </span><span style="font-size: 16pt; line-height: 107%;">PostgreSQL <span lang="TH">เก็บ </span>log <span lang="TH">คำสั่ง </span>SQL </span></span></p><span style="font-family: Noto Sans Thai;">
</span><p class="MsoNormal"><span style="font-family: Noto Sans Thai;"><span style="font-size: 16pt; line-height: 107%;">1. <span lang="TH">เข้าไปที่แก้ไขไฟล์ </span>postgresql.conf
<span lang="TH">กรณีใช้ </span>postgresql 14 <span lang="TH">ถ้ารุ่นอื่นก็เปลี่ยนตัวเลขรุ่นตามต้องการ โดยป้อนคำสั่งผ่าน Terminal<br /><br />
<span style="mso-spacerun: yes;"> </span><span style="mso-tab-count: 1;"> </span></span>sudo
vim<span lang="TH"> </span>/etc/postgresql/14/main/postgresql.conf <br /></span></span></p><span style="font-family: Noto Sans Thai;">
</span><p class="MsoNormal"><span style="font-family: Noto Sans Thai;"><span style="font-size: 16pt; line-height: 107%;"><span> </span><span> </span>จากนั้น ไปหาและแก้ไขค่าตามนี้ <span style="mso-tab-count: 1;"> </span><span lang="TH"><br /></span></span></span></p><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgBXkYDXuUo_KWv4vNcbVu0dceB2ItL8A88k-ZtSQ_cFUQUpjXbYyp68ehR78uyFRMRatYf7NtoRJonY7Cc40ExAnxhTz1uTcyuK5Hc8k8Q4NGvus7fHhw7Xia_n9nux6tq_NtObM4Sa4Y8mJatA_HUjRT9WAREWbbKWdmDo0nw-bE-m6YXL8RKGsg1/s927/postgresql-1.jpg" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img border="0" data-original-height="501" data-original-width="927" height="346" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgBXkYDXuUo_KWv4vNcbVu0dceB2ItL8A88k-ZtSQ_cFUQUpjXbYyp68ehR78uyFRMRatYf7NtoRJonY7Cc40ExAnxhTz1uTcyuK5Hc8k8Q4NGvus7fHhw7Xia_n9nux6tq_NtObM4Sa4Y8mJatA_HUjRT9WAREWbbKWdmDo0nw-bE-m6YXL8RKGsg1/w640-h346/postgresql-1.jpg" width="640" /></a><span style="font-family: Noto Sans Thai;"><span style="font-size: 16pt; line-height: 107%;"><span lang="TH"><span> </span><span> </span> </span></span></span><br /><span style="font-family: Noto Sans Thai;"><span style="font-size: 16pt; line-height: 107%;"><span lang="TH"></span></span></span></div><p></p><p class="MsoNormal"><span style="font-family: Noto Sans Thai;"><span style="font-size: 16pt; line-height: 107%;"><span lang="TH"><span> </span><span> </span>กดปุ่ม </span>i <span lang="TH">เพื่อเข้าโหมด </span>insert <span lang="TH">ของ โปรแกรม </span>vim <span lang="TH">แล้วแก้ไข</span></span></span></p><span style="font-family: Noto Sans Thai;">
</span><p class="MsoNormal"><span style="font-family: Noto Sans Thai;"><span style="font-size: 16pt; line-height: 107%;"><span style="mso-tab-count: 1;"> </span>log_destination
= 'csvlog'<br />
<span style="mso-spacerun: yes;"> </span><span style="mso-tab-count: 1;"> </span>logging_collector
= on<br />
<span style="mso-tab-count: 1;"> </span>log_directory = 'pg_log'<br />
<span style="mso-tab-count: 1;"> </span>log_filename = 'test_postgresql-%Y-%m-%d_%H%M%S.log'<br />
<span style="mso-tab-count: 1;"> </span>log_statement = 'all'</span></span></p><span style="font-family: Noto Sans Thai;">
</span><p class="MsoNormal"><span style="font-family: Noto Sans Thai;"><span lang="TH" style="font-size: 16pt; line-height: 107%;"><span style="mso-tab-count: 1;"> </span>เมื่อแก้ไขเสร็จให้กดปุ่ม
</span><span style="font-size: 16pt; line-height: 107%;">Esc
<span lang="TH">เพื่อออกจากโหมดแก้ไข<br />
<span style="mso-tab-count: 1;"> </span>กด <span style="mso-tab-count: 1;"> </span></span>:w <span lang="TH"><span style="mso-spacerun: yes;"> </span><span style="mso-tab-count: 1;"> </span><span> </span>บันทึก<br />
<span style="mso-tab-count: 1;"> </span>กด <span style="mso-tab-count: 1;"> </span></span>:q <span lang="TH"><span style="mso-tab-count: 1;"> <span> </span></span>ออก</span></span></span></p><span style="font-family: Noto Sans Thai;">
</span><p class="MsoNormal"><span style="font-family: Noto Sans Thai;"><span lang="TH" style="font-size: 16pt; line-height: 107%;">2. ทำการ รีสตาร์ทเซอร์วิสของ </span><span style="font-size: 16pt; line-height: 107%;">postgresql
<span lang="TH">ใหม่ ด้วยคำสั่ง</span></span></span></p><span style="font-family: Noto Sans Thai;">
</span><p class="MsoNormal"><span style="font-family: Noto Sans Thai;"><span lang="TH" style="font-size: 16pt; line-height: 107%;"><span style="mso-tab-count: 1;"> </span></span><span style="font-size: 16pt; line-height: 107%;">sudo
systemctl restart postgresql</span></span></p><span style="font-family: Noto Sans Thai;">
</span><p class="MsoNormal"><span style="font-family: Noto Sans Thai;"><span lang="TH" style="font-size: 16pt; line-height: 107%;">จากนั้นไป เมื่อมีการใช้คำสั่ง </span><span style="font-size: 16pt; line-height: 107%;">SQL
<span lang="TH">จัดการกับฐานข้อมูลก็จะถูกเก็บ </span>log <span lang="TH">ไว้ที่ </span> <span> </span><span> </span> <br /><br /><span> </span><span> </span>/var/lib/postgresql/14/main/
<span lang="TH">ภายใต้โฟลเดอร์ </span>pg_log</span></span></p><span style="font-family: Noto Sans Thai;">
</span><p class="MsoNormal"><span style="font-family: Noto Sans Thai;"><span lang="TH" style="font-size: 16pt; line-height: 107%;">เรียกดูไฟล์<br /></span></span><span style="font-family: Noto Sans Thai;"><span lang="TH" style="font-size: 16pt; line-height: 107%;"><span><span style="font-family: Noto Sans Thai;"><span style="font-size: 16pt; line-height: 107%;"><br /><span> </span><span> </span>sudo ls -l /var/lib/postgresql/14/main/pg_log/</span></span></span><br /></span></span></p><p class="MsoNormal"><span style="font-family: Noto Sans Thai;"><span lang="TH" style="font-size: 16pt; line-height: 107%;">เมื่อพบไฟล์เป้าหมาแล้ว ก็เอาออกมาไว้ที่อื่น เช่น โฟลเดอร์ Desktop<br /><br /><span> </span><span> </span>sudo cat /var/lib/postgresql/14/main/pg_log/ชื่อไฟล์log.csv > Desktop/ชื่อไฟล์log.csv<br /></span></span></p><p class="MsoNormal"><span style="font-family: Noto Sans Thai;"><span style="font-size: 16pt; line-height: 107%;">เป็นอันเรียบร้อย </span></span></p><p class="MsoNormal"><span style="font-family: Noto Sans Thai;"><span style="font-size: 16pt; line-height: 107%;"><br /></span></span></p><p class="MsoNormal"><span style="font-family: Noto Sans Thai;"><span style="font-size: 16pt; line-height: 107%;"></span></span></p><p class="MsoNormal"><span style="font-family: Noto Sans Thai;"><span style="font-size: 16pt; line-height: 107%;"></span></span></p><p class="MsoNormal"><span style="font-family: Noto Sans Thai;"><span style="font-size: 16pt; line-height: 107%;"></span></span></p><p class="MsoNormal"><span style="font-family: Noto Sans Thai;"><span style="font-size: 16pt; line-height: 107%;"><span lang="TH"></span></span></span></p><span style="font-family: Noto Sans Thai;">
</span><div class="blogger-post-footer">สงวนลิขสิทธิ์ ห้ามนำไปเผยแพร่ก่อนได้รับอนุญาติ</div>เกษม กมลชัยพิสิฐhttp://www.blogger.com/profile/03223085345729627028noreply@blogger.com0tag:blogger.com,1999:blog-2343321804163472494.post-57245916956270603892022-05-03T12:17:00.016+07:002022-05-13T17:01:02.913+07:00PostgreSQL : กำหนด Configuration สำหรับฐานข้อมูล PostgreSQL บน Ubuntu 20.04 ให้สามารถเข้าถึงผ่าน ip address จากภายนอก<p>การกำหนด Configuration สำหรับฐานข้อมูล PostgreSQL บน Ubuntu 20.04 ให้สามารถเข้าถึงผ่าน ip address จากภายนอก<br />สำหรับเครื่องที่ใช้ เป็นระบบปฏิบัติการ Windows 10 ดังนั้นเราจำเป็นต้องติดตั้ง Hyper-V ซึ่งเป็น Virtualization ของ Windows เอง ดั้งนั้นของที่มีก็ใช้แบบไม่ต้องไปหาอื่นไกล ส่วนการติดตั้ง Hyper-V และติดตั้ง Ubuntu 20.04 ไม่ขอกล่าวถึง <br /></p><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgdHfy_ov8soG2P454d_FKFmnf6yShajDY-7kAm5i3Gn43sZYSmgzdlq0FufQQadDMXtQzhozNiPHPojT36d39_JoO9K36cZERds9pALaO45prSsuGOGemSHpaTuWgFYqiGn3pZ08WetQVvVrq3nihCZ5W0VpW6b3s-kSrou32oEXcqaJU9yfZ9DPap/s1175/postgreSQL01.jpg" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img border="0" data-original-height="1003" data-original-width="1175" height="341" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgdHfy_ov8soG2P454d_FKFmnf6yShajDY-7kAm5i3Gn43sZYSmgzdlq0FufQQadDMXtQzhozNiPHPojT36d39_JoO9K36cZERds9pALaO45prSsuGOGemSHpaTuWgFYqiGn3pZ08WetQVvVrq3nihCZ5W0VpW6b3s-kSrou32oEXcqaJU9yfZ9DPap/w400-h341/postgreSQL01.jpg" width="400" /></a></div><br /><p></p><p> </p><p> </p><p> </p><p> </p><p> </p><p> </p><p> </p><p> </p><p> </p><p>เปิด Terminal แล้วเรียกใช้คำสั่ง ifconfig ดู ip address แล้วจดไว้เพื่อจะ Connect เข้าถึงข้อมูล<br /></p><p>เมื่อติดตั้ง Ubuntu ใน hyper-v เสร็จก็ไปทำการติดตั้ง PostgreSQL ต่อเลยโดยเข้าไปดูตาม Link ด้านล่างได้เลย 555</p><p><a href="https://www.cherryservers.com/blog/how-to-install-and-setup-postgresql-server-on-ubuntu-20-04" target="_blank">https://www.cherryservers.com/blog/how-to-install-and-setup-postgresql-server-on-ubuntu-20-04 </a><br /></p><p> </p><p>ทำการเปิด firewall ให้กับ port ที่ต้องการ เช่น 5432 โดยพิมพ์คำสั่ง ดังนี้<br /><br />sudo ufw allow from any to any port 5432 proto tcp </p><p>* สั้ง List รายการเพื่อตรวจสอบว่า port เปิดหรือไม่ </p><p>sudo lsof -i -P -n | grep LISTEN<br /><br /></p><p>ติดตั้งเสร็จ ให้เข้าไปแก้ไข config เพิ่มเติ่มจากเว็บก่อนหน้าที่ให้กำหนดไว้ โดยพิมพ์คำสั่งที่ Terminal</p><p>sudo vim /etc/postgresql/14/main/postgresql.conf<br /><br />แล้วแก้ ตรงส่วนของ listen_addresses = 'local' ให้เป็น<br /><br />listen_addresses = '*'<br /><br />จากนั้นไปแก้ไฟล์ pg_hba.conf<br /><br />sudo vim /etc/postgresql/14/main/pg_hba.conf <br /><br />แล้วเพิ่มสิทธิ์เข้าไปตามนี้ หรือจะกำหนดเฉพาะไอพีก็ได้ แต่สำหรับตัวอย่างข้างล่างคือเปิดหมด<br /><br />host all all 0.0.0.0/0 scram-sha-256<br />host all all ::1/128 trust<br />host all all 127.0.0.1/32 trust</p><p>ทำเสร็จก็ทำการ restart service ด้วยคำสั่ง<br /></p><p>systemctl restart postgresql<br /></p><p>เสร็จสำหรับ Ubuntu และ PostgreSQL<br /></p><p>------------------------------<br /></p><p>จากนั้นไปที่เครื่อง Client ที่เราต้องการติดต่อที่ Windows 10</p><p>ไปทำการดาวน์โหลด ODBC มาลงที่เครื่อง ที่เว็บ<br /></p><p><a href="https://www.postgresql.org/ftp/odbc/versions/msi/">https://www.postgresql.org/ftp/odbc/versions/msi/</a></p><p>ให้เลือกตัวใหม่ ๆ แล้วเลือก 32 bit หรือ 64 bit ขึ้นอยู่กับโปรแกรมที่เราจะติดต่อว่าเป็น 32 bit หรือ 64 bit ก็ลงตามนั้น</p><p>ส่วนการติดต่อก็ผ่าน connection string ประมาณนี้</p><p><span style="color: #990000;"><b>Driver={PostgreSQL Unicode};Server=172.18.117.166;Port=5432;Database=ชื่อDatabase;Uid=postgres;Pwd=รหัสผ่าน;</b></span></p><p>ตัวอย่างโปรแกรมที่ใช้เขียนเพื่อติดต่อฐานข้อมูล</p><p>cPostgreSQL = [<b><span style="color: #990000;">Driver={PostgreSQL Unicode};Server=172.18.117.166;Port=5432;Database=test_erp;Uid=postgres;Pwd=12345555;</span></b>]<br />nHandle = SQLSTRINGCONNECT(cPostgreSQL)<br />IF nHandle > 0<br /> TEXT TO cSQL NOSHOW TEXTMERGE <br /> SELECT * FROM clients<br /> ENDTEXT <br /> nSuccess = SQLEXEC(nHandle,cSQL)<br /> IF nSuccess > 0<br /> ** นำข้อมูลมาแสดงข้อมูล<br /> ENDIF <br /> =SQLDISCONNECT(nHandle)<br />ENDIF <br /></p><p><br /></p><div class="blogger-post-footer">สงวนลิขสิทธิ์ ห้ามนำไปเผยแพร่ก่อนได้รับอนุญาติ</div>เกษม กมลชัยพิสิฐhttp://www.blogger.com/profile/03223085345729627028noreply@blogger.com0tag:blogger.com,1999:blog-2343321804163472494.post-65142397683822163652022-02-16T15:29:00.002+07:002022-05-13T15:09:54.440+07:00macOS : macOS Monterey การติดตั้ง Home-brew และติดตั้ง apache php <p><span style="font-family: Prompt;">macOS Monterey เป็นรุ่นที่ตัด php ออกจากสารบบ ถ้าจะใข้ต้องลงเอง 555</span></p><p><span style="font-family: Prompt;">เริ่มกันเลย ก่อนอื่นให้เปิด Terminal ขึ้นมาก่อน แล้วป้อนคำสั่ง</span></p><p><span style="font-family: Prompt;">1. ติดตั้ง Xcode command line tools</span></p><p><span style="font-family: Prompt;"><span> <span> x</span></span>code-select --install</span></p><p><span style="font-family: Prompt;">2. ติดตั้ง Apache (ล้างของเก่าแล้วลงใหม่)</span></p><p><span style="font-family: Prompt;"><span> <span> </span></span><span>sudo apachectl stop</span></span></p>
<p style="font-stretch: normal; line-height: normal; margin: 0px;"><span style="font-family: Prompt;"><span> <span> <span> </span></span></span>sudo launchctl unload -w /System/Library/LaunchDaemons/org.apache.httpd.plist <b>2</b>>/dev/null</span></p>
<p style="font-stretch: normal; line-height: normal; margin: 0px;"><span style="font-family: Prompt;"><br /></span></p><p style="font-stretch: normal; line-height: normal; margin: 0px;"><span style="font-family: Prompt;"><span> <span> </span></span>brew install httpd</span></p><p style="font-stretch: normal; line-height: normal; margin: 0px;"><span style="font-family: Prompt;"><br /></span></p><p style="font-stretch: normal; line-height: normal; margin: 0px;"><span style="font-family: Prompt;"><span> จากนั้นก็ทำการ stop แล้ว start service ของ php</span><br /></span></p><p style="font-stretch: normal; line-height: normal; margin: 0px;"><span style="font-family: Prompt;"><span> <span> brew services stop </span></span><span>httpd</span></span></p><p style="font-stretch: normal; line-height: normal; margin: 0px;"><span><span style="font-family: Prompt;"> <span> </span></span></span></p><p style="font-stretch: normal; line-height: normal; margin: 0px;"><span><span style="font-family: Prompt;"> <span> brew services start httpd</span></span></span></p><p style="font-stretch: normal; line-height: normal; margin: 0px;"><span style="font-family: Prompt;"><br /></span></p><p style="font-stretch: normal; line-height: normal; margin: 0px;"><span style="font-family: Prompt;"><span><span> สำหรับ document root ในการนำไฟล์ html ไปใส่ จะเก็บที่ </span></span><span>/usr/local/var/www</span><span> </span><span> </span></span></p><p style="font-stretch: normal; line-height: normal; margin: 0px;"><span><span style="font-family: Prompt;"><br /></span></span></p><p style="font-stretch: normal; line-height: normal; margin: 0px;"><span style="font-family: Prompt;"><br /></span></p><p style="font-stretch: normal; line-height: normal; margin: 0px;"><span style="font-family: Prompt;">3. ติดตั้ง Visual Studio Code กัน</span></p><p style="font-stretch: normal; line-height: normal; margin: 0px;"><span style="font-family: Prompt;"><br /></span></p><p style="font-stretch: normal; line-height: normal; margin: 0px;"><span><span style="font-family: Prompt;"> <span> brew install --cask visual-studio-code</span></span></span></p><p style="font-stretch: normal; line-height: normal; margin: 0px;"><span style="font-family: Prompt;"><br /></span></p><p style="font-stretch: normal; line-height: normal; margin: 0px;"><span><span style="font-family: Prompt;"> <span> แต่ถ้าเคยติดตั้ง VS Code ไปแล้วก็ให้หาดูว่ามี โฟลดเดอร์ /opt/homebrew/bin อยู่ไหม </span></span></span></p><p style="font-stretch: normal; line-height: normal; margin: 0px;"><span style="font-family: Prompt;"><span><span><span><span> <span> </span></span>ถ้าไม่มีให้สร้างก่อน ด้วยคำสั่ง mkdir</span></span></span></span> แล้วเรียกคำสั่ง ตามด้านล่าง</p><p style="font-stretch: normal; line-height: normal; margin: 0px;"><span style="font-family: Prompt;"><br /></span></p><p style="font-stretch: normal; line-height: normal; margin: 0px;"><span style="font-family: Prompt;"><span><span> <span> </span></span></span><span>sudo ln -s /Applications/Visual\ Studio\ </span><a href="http://code.app/Contents/Resources/app/bin/code"><span style="color: #dca10d;">Code.app/Contents/Resources/app/bin/code</span></a><span> /opt/homebrew/bin/code</span></span></p><p style="font-stretch: normal; line-height: normal; margin: 0px;"><span style="font-family: Prompt;"><br /></span></p><p style="font-stretch: normal; line-height: normal; margin: 0px;"><span style="font-family: Prompt;">4. ติดตั้ง php 7.4 รุ่นอื่นรอให้เขาทำออกมาก่อน แล้วก็เปลี่ยนตัวเลขรุ่นด้านหลังคำสั่งเอาเองนะ</span></p><p style="font-stretch: normal; line-height: normal; margin: 0px;"><span style="font-family: Prompt;"><br /></span></p><p style="font-stretch: normal; line-height: normal; margin: 0px;"><span style="font-family: Prompt;"><span><span> <span> </span></span></span><span>brew install shivammathur/php/php@7.4</span></span></p><p style="font-stretch: normal; line-height: normal; margin: 0px;"><span style="font-family: Prompt;"><span> <span> </span></span><br /></span></p><p style="font-stretch: normal; line-height: normal; margin: 0px;"><span><span><span style="font-family: Prompt;"><span> <span> กำหนด path ให้กับ php ด้วยคำสั่ง</span></span><br /></span></span></span></p><p style="font-stretch: normal; line-height: normal; margin: 0px;"><span><span><span><span><span style="font-family: Prompt;"><br /></span></span></span></span></span></p><p style="font-stretch: normal; line-height: normal; margin: 0px;"><span style="font-family: Prompt;"><span><span><span><span><span><span> <span> </span></span></span></span></span></span></span></span><span>brew link --overwrite --force php@7.4 </span><span> </span></p><p style="font-stretch: normal; line-height: normal; margin: 0px;"><span style="font-family: Prompt;"><br /></span></p><p style="font-stretch: normal; line-height: normal; margin: 0px;"><span style="font-family: Prompt;"><span> <span> การ start / stop / restart php จะสั่งอะไรก็เลือกเอาได้ ตามต้องการ </span></span></span></p><p style="font-stretch: normal; line-height: normal; margin: 0px;"><span style="font-family: Prompt;"><span><span><span> <span> </span></span>แต่ยังไงสุดท้ายก็อย่าลืม start ละ</span></span><br /></span></p><p style="font-stretch: normal; line-height: normal; margin: 0px;"><span><span><span style="font-family: Prompt;"><span> <i><b>stop</b></i></span><br /></span></span></span></p><p style="font-stretch: normal; line-height: normal; margin: 0px;"><span style="font-family: Prompt;"><span><span><span><span> <span> </span></span></span></span></span></span><span>brew services stop shivammathur/php/php@7.4</span></p><p style="font-stretch: normal; line-height: normal; margin: 0px;"><span style="font-family: Prompt;"> <b> <i>start</i></b><br /></span></p><p style="font-stretch: normal; line-height: normal; margin: 0px;"><span style="font-family: Prompt;"><span> </span><span>brew services start shivammathur/php/php@7.4</span></span></p><div><b><span style="font-family: Prompt;"> <span> <span> re</span></span><i>start</i></span></b></div><p style="font-stretch: normal; line-height: normal; margin: 0px;"><span style="font-family: Prompt;"><span><span><span><span> <span> <span> </span></span></span></span></span></span></span><span>brew services restart shivammathur/php/php@7.4</span></p><p style="font-stretch: normal; line-height: normal; margin: 0px;"><span style="font-family: Prompt;"><br /></span></p><p style="font-stretch: normal; line-height: normal; margin: 0px;"><span style="font-family: Prompt;"><span> <span> หลังจาก start php ได้แล้ว ลองทดสอบดู ถาม version ของ php กัน</span></span><br /></span></p><p style="font-stretch: normal; line-height: normal; margin: 0px;"><span><span><span style="font-family: Prompt;"><br /></span></span></span></p><p style="font-stretch: normal; line-height: normal; margin: 0px;"><span><span><span style="font-family: Prompt;"><span> <span> php -v</span></span><br /></span></span></span></p><p style="font-stretch: normal; line-height: normal; margin: 0px;"><span><span><span><span><span style="font-family: Prompt;"><br /></span></span></span></span></span></p><p style="font-stretch: normal; line-height: normal; margin: 0px;"><span><span><span><span><span style="font-family: Prompt;"><span> <span> ลองเรียกใช้งาน phpinfo()</span></span><br /></span></span></span></span></span></p><p style="font-stretch: normal; line-height: normal; margin: 0px;"><span><span><span><span><span><span><span style="font-family: Prompt;"><br /></span></span></span></span></span></span></span></p><p style="font-stretch: normal; line-height: normal; margin: 0px;"><span><span><span><span><span><span><span style="font-family: Prompt;"><span> <span> php -r 'phpinfo();'</span></span><br /></span></span></span></span></span></span></span></p><p style="font-stretch: normal; line-height: normal; margin: 0px;"><span><span><span><span><span><span><span><span><span style="font-family: Prompt;"><br /></span></span></span></span></span></span></span></span></span></p><p style="font-stretch: normal; line-height: normal; margin: 0px;"><span><span><span><span><span><span><span><span><span style="font-family: Prompt;"><span> 5. แก้ไขไฟล์ httpd.conf </span><br /></span></span></span></span></span></span></span></span></span></p><p style="font-stretch: normal; line-height: normal; margin: 0px;"><span style="font-family: Prompt;"><span><span><span><span><span><span><span><span><span><span><span> <span> ให้เข้าไปแก้ที่โฟลดเดอร์ </span></span></span></span></span></span></span></span></span></span></span></span></span><b>/usr/local/etc/httpd/ (สำหรับ cpu intel นะ)</b></p><p style="font-stretch: normal; line-height: normal; margin: 0px;"><b><span style="font-family: Prompt;"><span> ถ้า cpu M1 ก็ไปอีกที่ ... ลืม ไว้หาก่อน</span><br /></span></b></p><p style="font-stretch: normal; line-height: normal; margin: 0px;"><span style="font-family: Prompt;"><span> </span><br /></span></p><p style="font-stretch: normal; line-height: normal; margin: 0px;"><span><span><span><span><span style="font-family: Prompt;"><span> <span> sudo code httpd.conf</span></span><br /></span></span></span></span></span></p><p style="font-stretch: normal; line-height: normal; margin: 0px;"><span><span><span><span><span><span><span style="font-family: Prompt;"><br /></span></span></span></span></span></span></span></p><p style="font-stretch: normal; line-height: normal; margin: 0px;"><span><span><span><span><span><span><span style="font-family: Prompt;"><span> <span> แล้วไปเพิ่ม </span></span><br /></span></span></span></span></span></span></span></p><p style="font-stretch: normal; line-height: normal; margin: 0px;"><span><span><span><span><span><span><span><span><span style="font-family: Prompt;"><span> </span><br /></span></span></span></span></span></span></span></span></span></p><p style="font-stretch: normal; line-height: normal; margin: 0px;"><span style="font-family: Prompt;"><span><span><span><span><span><span><span><span><span><span><span> <span> </span></span></span></span></span></span></span></span></span></span></span></span></span><span><span style="font-size: x-small;">LoadModule php7_module /usr/local/opt/php@7.4/lib/httpd/modules/libphp7.so</span></span></p><p style="font-stretch: normal; line-height: normal; margin: 0px;"><span><span><span><span><span style="font-family: Prompt;"><span> <span> </span></span><br /></span></span></span></span></span></p><p style="font-stretch: normal; line-height: normal; margin: 0px;"><span><span><span><span><span><span><span style="font-family: Prompt;"><span> <span> แก้ตรง dir_module ตามนี้</span></span><br /></span></span></span></span></span></span></span></p><p style="font-stretch: normal; line-height: normal; margin: 0px;"><span><span><span><span><span><span><span><span><span style="font-family: Prompt;"><br /></span></span></span></span></span></span></span></span></span></p><p style="font-stretch: normal; line-height: normal; margin: 0px;"><span style="font-family: Prompt;"><span><span><span><span><span><span><span><span><span><span> <span> </span></span></span></span></span></span></span></span></span></span></span></span><span><IfModule dir_module></span></p>
<p style="font-stretch: normal; line-height: normal; margin: 0px;"><span style="font-family: Prompt;"> <span> <span> </span></span>DirectoryIndex index.php index.html</span></p>
<p style="font-stretch: normal; line-height: normal; margin: 0px;"><span style="font-family: Prompt;"><span> <span> </span></span></IfModule></span></p>
<p style="font-stretch: normal; line-height: normal; margin: 0px;"><span style="font-family: Prompt;"><span> <span> </span></span><FilesMatch \.php$></span></p>
<p style="font-stretch: normal; line-height: normal; margin: 0px;"><span style="font-family: Prompt;"> <span> <span> </span></span>SetHandler application/x-httpd-php</span></p>
<p style="font-stretch: normal; line-height: normal; margin: 0px;"><span style="font-family: Prompt;"><span> <span> </span></span></FilesMatch></span></p><div class="blogger-post-footer">สงวนลิขสิทธิ์ ห้ามนำไปเผยแพร่ก่อนได้รับอนุญาติ</div>เกษม กมลชัยพิสิฐhttp://www.blogger.com/profile/03223085345729627028noreply@blogger.com0tag:blogger.com,1999:blog-2343321804163472494.post-83288200395773942922021-09-04T16:04:00.000+07:002021-09-04T16:04:14.373+07:00Unity : การติดตั้ง Unity Remot 5 <p><span style="font-size: x-large;"><b style="text-align: center;"><span lang="TH" style="font-family: "TH Sarabun New", sans-serif;">การติดตั้งและใช้งาน
</span></b><b style="text-align: center;"><span lang="th" style="font-family: "TH Sarabun New", sans-serif;">Unity Remote 5</span></b><b style="text-align: center;"><span lang="th" style="font-family: "TH Sarabun New", sans-serif;"> </span></b><b style="text-align: center;"><span lang="TH" style="font-family: "TH Sarabun New", sans-serif;">สำหรับ
</span></b><b style="text-align: center;"><span lang="th" style="font-family: "TH Sarabun New", sans-serif;">OS Android</span></b></span></p>
<p class="MsoNormal"><span style="font-size: x-large;"><b><span lang="TH" style="font-family: "TH Sarabun New", sans-serif;">กำหนดค่า
โทรศัพท์</span></b><b><span lang="th" style="font-family: "TH Sarabun New", sans-serif;">/</span></b><b><span lang="TH" style="font-family: "TH Sarabun New", sans-serif;">แท็บเล็ต </span></b></span><b><span style="font-family: "TH Sarabun New",sans-serif; font-size: 16.0pt;"><o:p></o:p></span></b></p>
<p class="MsoNormal"><span lang="TH" style="font-family: "TH Sarabun New",sans-serif; font-size: 16.0pt;">1.
ไปที่หน้า <b>ตั้งค่า</b></span><b><span lang="th" style="font-family: "TH Sarabun New",sans-serif; font-size: 16.0pt; mso-ansi-language: #0400;"> (Setting)</span></b><span lang="th" style="font-family: "TH Sarabun New",sans-serif; font-size: 16.0pt; mso-ansi-language: #0400;"> </span><span lang="TH" style="font-family: "TH Sarabun New",sans-serif; font-size: 16.0pt; mso-ansi-language: #0400;">แล้วเข้าไปที่ </span><b><span lang="TH" style="font-family: "TH Sarabun New",sans-serif; font-size: 16.0pt;">เกี่ยวกับเครื่อง
</span></b><b><span lang="th" style="font-family: "TH Sarabun New",sans-serif; font-size: 16.0pt; mso-ansi-language: #0400;">(Aboout Phone) / </span></b><b><span lang="TH" style="font-family: "TH Sarabun New",sans-serif; font-size: 16.0pt; mso-ansi-language: #0400;">เกี่ยวกับแท็บเล็ต </span></b><b><span lang="th" style="font-family: "TH Sarabun New",sans-serif; font-size: 16.0pt; mso-ansi-language: #0400;">(About Tablet)</span></b></p><p class="MsoNormal"><b></b></p><div class="separator" style="clear: both; text-align: center;"><b><a href="https://1.bp.blogspot.com/-7Ve55fI2Oz0/YTM0TO3wDqI/AAAAAAAAEPE/RuaNBOqdSGM5ncOaDpCUe80234iShzzgQCLcBGAsYHQ/s465/UNITY_REMOTE_1.jpg" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img border="0" data-original-height="354" data-original-width="465" height="244" src="https://1.bp.blogspot.com/-7Ve55fI2Oz0/YTM0TO3wDqI/AAAAAAAAEPE/RuaNBOqdSGM5ncOaDpCUe80234iShzzgQCLcBGAsYHQ/s320/UNITY_REMOTE_1.jpg" width="320" /></a></b></div><b><br /><span lang="th" style="font-family: "TH Sarabun New",sans-serif; font-size: 16.0pt; mso-ansi-language: #0400;"><br /></span></b><p></p><p class="MsoNormal"><span lang="th" style="font-family: "TH Sarabun New", sans-serif; font-size: 16pt;"><br /></span></p><p class="MsoNormal"><span lang="th" style="font-family: "TH Sarabun New", sans-serif; font-size: 16pt;"><br /></span></p><p class="MsoNormal"><span lang="th" style="font-family: "TH Sarabun New", sans-serif; font-size: 16pt;"><br /></span></p><p class="MsoNormal"><span lang="th" style="font-family: "TH Sarabun New", sans-serif; font-size: 16pt;"><br /></span></p><p class="MsoNormal"><span lang="th" style="font-family: "TH Sarabun New", sans-serif; font-size: 16pt;"><br /></span></p><p class="MsoNormal"><span lang="th" style="font-family: "TH Sarabun New", sans-serif; font-size: 16pt;">2. </span><span lang="TH" style="font-family: "TH Sarabun New", sans-serif; font-size: 16pt;">ไปที่ <b>หมายเลขรุ่น </b></span><b><span style="font-family: "TH Sarabun New", sans-serif; font-size: 16pt;">(</span></b><b><span lang="th" style="font-family: "TH Sarabun New", sans-serif; font-size: 16pt;">Build Number)</span></b><span lang="th" style="font-family: "TH Sarabun New", sans-serif; font-size: 16pt;"> </span><span lang="TH" style="font-family: "TH Sarabun New", sans-serif; font-size: 16pt;">แล้วให้นิ้วแตะ 7 ครั้ง จนกระทั่งระบบแจ้งว่าเราเป็นนักพัฒนา</span><span lang="th" style="font-family: "TH Sarabun New", sans-serif; font-size: 16pt;"> (Developer)</span></p><p class="MsoNormal"></p><div class="separator" style="clear: both; text-align: center;"><a href="https://1.bp.blogspot.com/-cMrTfvbLp4E/YTM0aZiS13I/AAAAAAAAEPI/FYxFaTUS6N8l4fio7ndxvYIzBcyQ0NCXgCLcBGAsYHQ/s457/UNITY_REMOTE_2.jpg" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img border="0" data-original-height="192" data-original-width="457" height="134" src="https://1.bp.blogspot.com/-cMrTfvbLp4E/YTM0aZiS13I/AAAAAAAAEPI/FYxFaTUS6N8l4fio7ndxvYIzBcyQ0NCXgCLcBGAsYHQ/s320/UNITY_REMOTE_2.jpg" width="320" /></a></div><br /><span lang="th" style="font-family: "TH Sarabun New", sans-serif; font-size: 16pt;"><br /></span><p></p><span lang="th" style="font-family: "TH Sarabun New", sans-serif; font-size: 16pt;"><div><span lang="th" style="font-family: "TH Sarabun New", sans-serif; font-size: 16pt;"><br /></span></div><div><span lang="th" style="font-family: "TH Sarabun New", sans-serif; font-size: 16pt;"><br /></span></div><div><span lang="th" style="font-family: "TH Sarabun New", sans-serif; font-size: 16pt;"><br /></span></div><div><span lang="th" style="font-family: "TH Sarabun New", sans-serif; font-size: 16pt;"><br /></span></div>3. </span><span lang="TH" style="font-family: "TH Sarabun New", sans-serif; font-size: 16pt;">ให้ออกมาที่หน้าตั้งค่า </span><span lang="th" style="font-family: "TH Sarabun New", sans-serif; font-size: 16pt;">(Setting</span><span style="font-family: "TH Sarabun New", sans-serif; font-size: 16pt;">) <span lang="TH">จะเห็นรายการ <b>ทางเลือกผู้พัฒนา</b></span></span><b><span lang="th" style="font-family: "TH Sarabun New", sans-serif; font-size: 16pt;"> (Developer Option) </span></b><span lang="TH" style="font-family: "TH Sarabun New", sans-serif; font-size: 16pt;">ให้เปิดเข้าไป</span><div><span style="font-family: TH Sarabun New, sans-serif;"><div class="separator" style="clear: both; text-align: center;"><a href="https://1.bp.blogspot.com/-OcasZYNtKHE/YTM0jJ17_gI/AAAAAAAAEPQ/OZLV0TkPyLgkaV8H8sSGBO9Sq3ZzGWm7ACLcBGAsYHQ/s473/UNITY_REMOTE_3.jpg" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img border="0" data-original-height="227" data-original-width="473" height="154" src="https://1.bp.blogspot.com/-OcasZYNtKHE/YTM0jJ17_gI/AAAAAAAAEPQ/OZLV0TkPyLgkaV8H8sSGBO9Sq3ZzGWm7ACLcBGAsYHQ/s320/UNITY_REMOTE_3.jpg" width="320" /></a></div><br /><span style="font-size: 21.3333px;"><br /></span></span><p class="MsoNormal"><span lang="TH" style="font-family: "TH Sarabun New",sans-serif; font-size: 16.0pt; mso-ansi-language: #0400;"><br /></span></p><p class="MsoNormal"><span lang="TH" style="font-family: "TH Sarabun New",sans-serif; font-size: 16.0pt; mso-ansi-language: #0400;"><br /></span></p><p class="MsoNormal"><span lang="TH" style="font-family: "TH Sarabun New",sans-serif; font-size: 16.0pt; mso-ansi-language: #0400;"><br /></span></p><p class="MsoNormal"><span lang="TH" style="font-family: "TH Sarabun New",sans-serif; font-size: 16.0pt; mso-ansi-language: #0400;">4. ที่หน้า ทางเลือกผู้พัฒนา </span><span lang="th" style="font-family: "TH Sarabun New",sans-serif; font-size: 16.0pt; mso-ansi-language: #0400;">(Developer Option) </span><span lang="TH" style="font-family: "TH Sarabun New",sans-serif; font-size: 16.0pt; mso-ansi-language: #0400;">ให้</span><b><span lang="TH" style="font-family: "TH Sarabun New",sans-serif; font-size: 16.0pt;">เปิด</span></b><span lang="TH" style="font-family: "TH Sarabun New",sans-serif; font-size: 16.0pt;">สถานะ และ<b>เปิด</b>ในส่วนของ
<b>การแก้ไขข้อบกพร่อง </b></span><b><span lang="th" style="font-family: "TH Sarabun New",sans-serif; font-size: 16.0pt; mso-ansi-language: #0400;">USB (USB
Debugging)</span></b></p><p class="MsoNormal"><b></b></p><div class="separator" style="clear: both; text-align: center;"><b><a href="https://1.bp.blogspot.com/-5f-nZHt52sk/YTM09T4RO6I/AAAAAAAAEPg/pAmZDnGChP82wcs7wbE_rEZ5iZZyivRCQCLcBGAsYHQ/s461/UNITY_REMOTE_4.jpg" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img border="0" data-original-height="389" data-original-width="461" height="270" src="https://1.bp.blogspot.com/-5f-nZHt52sk/YTM09T4RO6I/AAAAAAAAEPg/pAmZDnGChP82wcs7wbE_rEZ5iZZyivRCQCLcBGAsYHQ/s320/UNITY_REMOTE_4.jpg" width="320" /></a></b></div><b><br /><span lang="th" style="font-family: "TH Sarabun New",sans-serif; font-size: 16.0pt; mso-ansi-language: #0400;"><br /></span></b><p></p><p class="MsoNormal"><span style="height: 386px; margin-left: 345px; margin-top: 722px; mso-ignore: vglayout; position: absolute; width: 340px; z-index: -1895809024;"><br /></span><!--[endif]--><span lang="th" style="font-family: "TH Sarabun New",sans-serif; font-size: 16.0pt; mso-ansi-language: #0400;"><o:p></o:p></span></p>
<p class="MsoNormal"></p><span lang="th" style="font-family: "TH Sarabun New",sans-serif; font-size: 16.0pt; mso-ansi-language: #0400;"><div><span lang="th" style="font-family: "TH Sarabun New",sans-serif; font-size: 16.0pt; mso-ansi-language: #0400;"><br /></span></div><div><span lang="th" style="font-family: "TH Sarabun New",sans-serif; font-size: 16.0pt; mso-ansi-language: #0400;"><br /></span></div><div><span lang="th" style="font-family: "TH Sarabun New",sans-serif; font-size: 16.0pt; mso-ansi-language: #0400;"><br /></span></div><div><span lang="th" style="font-family: "TH Sarabun New",sans-serif; font-size: 16.0pt; mso-ansi-language: #0400;"><br /></span></div><div><span lang="th" style="font-family: "TH Sarabun New",sans-serif; font-size: 16.0pt; mso-ansi-language: #0400;"><br /></span></div><div><span lang="th" style="font-family: "TH Sarabun New",sans-serif; font-size: 16.0pt; mso-ansi-language: #0400;"><br /></span></div><div><span lang="th" style="font-family: "TH Sarabun New",sans-serif; font-size: 16.0pt; mso-ansi-language: #0400;"><br /></span></div><div><span lang="th" style="font-family: "TH Sarabun New",sans-serif; font-size: 16.0pt; mso-ansi-language: #0400;"><br /></span></div><div><span lang="th" style="font-family: "TH Sarabun New",sans-serif; font-size: 16.0pt; mso-ansi-language: #0400;"><br /></span></div>5. </span><span lang="TH" style="font-family: "TH Sarabun New",sans-serif; font-size: 16.0pt;">เชื่อมต่อสาย </span><span lang="th" style="font-family: "TH Sarabun New",sans-serif; font-size: 16.0pt; mso-ansi-language: #0400;">USB </span><span lang="TH" style="font-family: "TH Sarabun New",sans-serif; font-size: 16.0pt; mso-ansi-language: #0400;">เข้ากับเครื่องคอมพิวเตอร์ แล้วให้สิทธิ์ในการเข้าถึงโทรศัพท์/</span><span lang="TH" style="font-family: "TH Sarabun New",sans-serif; font-size: 16.0pt;">แท็บเล็ต</span></div><div><span lang="TH" style="font-family: "TH Sarabun New", sans-serif; font-size: 16pt;">6.
ติดตั้งแอพ </span><span lang="th" style="font-family: "TH Sarabun New", sans-serif; font-size: 16pt;">Unity Remote 5 </span><span lang="TH" style="font-family: "TH Sarabun New", sans-serif; font-size: 16pt;">จาก </span><span lang="th" style="font-family: "TH Sarabun New", sans-serif; font-size: 16pt;">Play Store</span></div><div><p class="MsoNormal"></p><div class="separator" style="clear: both; text-align: center;"><a href="https://1.bp.blogspot.com/-lKnIOQ0sZvM/YTM0p8JPRTI/AAAAAAAAEPU/wSuR2Cc1n1Uo5WHhSdVTC55MIGyEcr0jACLcBGAsYHQ/s427/UNITY_REMOTE_5.jpg" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img border="0" data-original-height="387" data-original-width="427" height="290" src="https://1.bp.blogspot.com/-lKnIOQ0sZvM/YTM0p8JPRTI/AAAAAAAAEPU/wSuR2Cc1n1Uo5WHhSdVTC55MIGyEcr0jACLcBGAsYHQ/s320/UNITY_REMOTE_5.jpg" width="320" /></a></div><p></p><p class="MsoNormal"><br /><span lang="th" style="font-family: "TH Sarabun New",sans-serif; font-size: 16.0pt; mso-ansi-language: #0400;"><br /></span></p><p class="MsoNormal"><span lang="TH" style="font-family: "TH Sarabun New", sans-serif; font-size: 16pt;"><br /></span></p><p class="MsoNormal"><span lang="TH" style="font-family: "TH Sarabun New", sans-serif; font-size: 16pt;"><br /></span></p><p class="MsoNormal"><span lang="TH" style="font-family: "TH Sarabun New", sans-serif; font-size: 16pt;"><br /></span></p><p class="MsoNormal"><span lang="TH" style="font-family: "TH Sarabun New", sans-serif; font-size: 16pt;"><br /></span></p><p class="MsoNormal"><br /></p><p class="MsoNormal"><br /></p><p class="MsoNormal"><br /></p><p class="MsoNormal"><span lang="TH" style="font-family: "TH Sarabun New", sans-serif; font-size: 16pt;">7. เปิดแอพ </span><span lang="th" style="font-family: "TH Sarabun New", sans-serif; font-size: 16pt;">Unity Remote </span><span lang="TH" style="font-family: "TH Sarabun New", sans-serif; font-size: 16pt;">5 เพื่อรอรับการทดสอบเกมจากโปรแกรม </span><span lang="th" style="font-family: "TH Sarabun New", sans-serif; font-size: 16pt;">Unity </span><span lang="TH" style="font-family: "TH Sarabun New", sans-serif; font-size: 16pt;">จากเครื่องคอมพิวเตอร์</span></p><div class="separator" style="clear: both; text-align: center;"><a href="https://1.bp.blogspot.com/-8kqk_35_-3k/YTM1Ed7NVOI/AAAAAAAAEPk/JqZFmaE2ICwC-IfvG5RLLMJC2nY3XQRggCLcBGAsYHQ/s400/UNITY_REMOTE_6.jpg" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img border="0" data-original-height="322" data-original-width="400" height="258" src="https://1.bp.blogspot.com/-8kqk_35_-3k/YTM1Ed7NVOI/AAAAAAAAEPk/JqZFmaE2ICwC-IfvG5RLLMJC2nY3XQRggCLcBGAsYHQ/s320/UNITY_REMOTE_6.jpg" width="320" /></a></div><p></p><p class="MsoNormal"><span lang="TH" style="font-family: "TH Sarabun New", sans-serif; font-size: 16pt;"><br /></span></p><p class="MsoNormal"><span lang="TH" style="font-family: "TH Sarabun New", sans-serif; font-size: 16pt;"><br /></span></p><p class="MsoNormal"><span lang="TH" style="font-family: "TH Sarabun New", sans-serif; font-size: 16pt;"><br /></span></p><p class="MsoNormal"><span lang="TH" style="font-family: "TH Sarabun New", sans-serif; font-size: 16pt;"><br /></span></p><p class="MsoNormal"><span lang="TH" style="font-family: "TH Sarabun New", sans-serif; font-size: 16pt;"><br /></span></p><p class="MsoNormal"><br /></p><p class="MsoNormal"><br /></p>
<p class="MsoNormal"><span style="font-size: x-large;"><b><span lang="TH" style="font-family: "TH Sarabun New", sans-serif;">กำหนดค่า
โปรแกรม </span></b><b><span lang="th" style="font-family: "TH Sarabun New", sans-serif;">Unity</span></b></span><b><span lang="TH" style="font-family: "TH Sarabun New",sans-serif; font-size: 16.0pt; mso-ansi-language: #0400;"><o:p></o:p></span></b></p>
<p class="MsoNormal"><span style="font-family: "TH Sarabun New",sans-serif; font-size: 16.0pt;">1.<span lang="TH"> ที่โปรแกรม </span></span><span lang="th" style="font-family: "TH Sarabun New",sans-serif; font-size: 16.0pt; mso-ansi-language: #0400;">Unity </span><span lang="TH" style="font-family: "TH Sarabun New",sans-serif; font-size: 16.0pt;">เลือกเมนู
</span><b><span lang="th" style="font-family: "TH Sarabun New",sans-serif; font-size: 16.0pt; mso-ansi-language: #0400;">File -> Build Setting</span></b><span lang="th" style="font-family: "TH Sarabun New",sans-serif; font-size: 16.0pt; mso-ansi-language: #0400;"> </span><span lang="TH" style="font-family: "TH Sarabun New",sans-serif; font-size: 16.0pt;">ที่หน้าต่าง
</span><span lang="th" style="font-family: "TH Sarabun New",sans-serif; font-size: 16.0pt; mso-ansi-language: #0400;">Build Setting </span><span lang="TH" style="font-family: "TH Sarabun New",sans-serif; font-size: 16.0pt; mso-ansi-language: #0400;">ให้เลือก
</span><b><span lang="th" style="font-family: "TH Sarabun New",sans-serif; font-size: 16.0pt; mso-ansi-language: #0400;">Android</span></b><span lang="th" style="font-family: "TH Sarabun New",sans-serif; font-size: 16.0pt; mso-ansi-language: #0400;"> </span><span lang="TH" style="font-family: "TH Sarabun New",sans-serif; font-size: 16.0pt; mso-ansi-language: #0400;">แล้วคลิกปุ่ม </span><b><span lang="th" style="font-family: "TH Sarabun New",sans-serif; font-size: 16.0pt; mso-ansi-language: #0400;">Switch
Platform</span></b></p><p class="MsoNormal"><b></b></p><div class="separator" style="clear: both; text-align: center;"><b><a href="https://1.bp.blogspot.com/-Ke14wNv6W6Y/YTM1hv7PPCI/AAAAAAAAEPw/zyrVpLtsEtMvTpY3a37uHZUrqEv0pX2PACLcBGAsYHQ/s597/UNITY_REMOTE_7.jpg" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img border="0" data-original-height="575" data-original-width="597" height="308" src="https://1.bp.blogspot.com/-Ke14wNv6W6Y/YTM1hv7PPCI/AAAAAAAAEPw/zyrVpLtsEtMvTpY3a37uHZUrqEv0pX2PACLcBGAsYHQ/s320/UNITY_REMOTE_7.jpg" width="320" /></a></b></div><b><br /><span lang="th" style="font-family: "TH Sarabun New",sans-serif; font-size: 16.0pt; mso-ansi-language: #0400;"><br /></span></b><p></p>
<p class="MsoNormal"><span lang="TH" style="font-family: "TH Sarabun New",sans-serif; font-size: 16.0pt; mso-ansi-language: #0400;"><br /></span></p><p class="MsoNormal"><span lang="TH" style="font-family: "TH Sarabun New",sans-serif; font-size: 16.0pt; mso-ansi-language: #0400;"><br /></span></p><p class="MsoNormal"><span lang="TH" style="font-family: "TH Sarabun New",sans-serif; font-size: 16.0pt; mso-ansi-language: #0400;"><br /></span></p><p class="MsoNormal"><span lang="TH" style="font-family: "TH Sarabun New",sans-serif; font-size: 16.0pt; mso-ansi-language: #0400;"><br /></span></p><p class="MsoNormal"><span lang="TH" style="font-family: "TH Sarabun New",sans-serif; font-size: 16.0pt; mso-ansi-language: #0400;"><br /></span></p><p class="MsoNormal"><br /></p><p class="MsoNormal"><br /></p><p class="MsoNormal"><span lang="TH" style="font-family: "TH Sarabun New",sans-serif; font-size: 16.0pt; mso-ansi-language: #0400;">2. เลือกเมนู </span><b><span lang="th" style="font-family: "TH Sarabun New",sans-serif; font-size: 16.0pt; mso-ansi-language: #0400;">Edit
-> Project Setting</span></b><span lang="th" style="font-family: "TH Sarabun New",sans-serif; font-size: 16.0pt; mso-ansi-language: #0400;"> </span><span lang="TH" style="font-family: "TH Sarabun New",sans-serif; font-size: 16.0pt;">ที่หน้าต่าง
</span><span lang="th" style="font-family: "TH Sarabun New",sans-serif; font-size: 16.0pt; mso-ansi-language: #0400;">Project Setting </span><span lang="TH" style="font-family: "TH Sarabun New",sans-serif; font-size: 16.0pt;">เลือก </span><b><span lang="th" style="font-family: "TH Sarabun New",sans-serif; font-size: 16.0pt; mso-ansi-language: #0400;">Editor</span></b><span lang="th" style="font-family: "TH Sarabun New",sans-serif; font-size: 16.0pt; mso-ansi-language: #0400;"> </span><span lang="TH" style="font-family: "TH Sarabun New",sans-serif; font-size: 16.0pt;">ในช่อง </span><span lang="th" style="font-family: "TH Sarabun New",sans-serif; font-size: 16.0pt; mso-ansi-language: #0400;">Device </span><span lang="TH" style="font-family: "TH Sarabun New",sans-serif; font-size: 16.0pt;">เลือก
</span><b><span lang="th" style="font-family: "TH Sarabun New",sans-serif; font-size: 16.0pt; mso-ansi-language: #0400;">Any Android Device</span></b><span lang="th" style="font-family: "TH Sarabun New",sans-serif; font-size: 16.0pt; mso-ansi-language: #0400;"><o:p></o:p></span></p><p class="MsoNormal"><b></b></p><div class="separator" style="clear: both; text-align: center;"><b><a href="https://1.bp.blogspot.com/-4a0oMbyx4b8/YTM1qHPNlYI/AAAAAAAAEP0/70jVGxEdwXQlK9IiA-51Vx-N6aeFekWwQCLcBGAsYHQ/s1181/UNITY_REMOTE_8.jpg" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img border="0" data-original-height="261" data-original-width="1181" height="71" src="https://1.bp.blogspot.com/-4a0oMbyx4b8/YTM1qHPNlYI/AAAAAAAAEP0/70jVGxEdwXQlK9IiA-51Vx-N6aeFekWwQCLcBGAsYHQ/s320/UNITY_REMOTE_8.jpg" width="320" /></a></b></div><b><br /><span lang="th" style="font-family: "TH Sarabun New",sans-serif; font-size: 16.0pt; mso-ansi-language: #0400;"><br /></span></b><p></p><p class="MsoNormal"><b><span lang="th" style="font-family: "TH Sarabun New",sans-serif; font-size: 16.0pt; mso-ansi-language: #0400;"><br /></span></b></p><p class="MsoNormal"><span lang="TH" style="font-family: "TH Sarabun New", sans-serif; font-size: 16pt;">จากนั้นก็ทำการคลิกปุ่ม
</span><span lang="th" style="font-family: "TH Sarabun New", sans-serif; font-size: 16pt;">Play </span><span lang="TH" style="font-family: "TH Sarabun New", sans-serif; font-size: 16pt;">เพื่อทดสอบเกม ตัวเกมก็จะไปปรากฎที่หน้าคอมพิวเตอร์
และหน้าจอโทรศัพท์</span><span lang="th" style="font-family: "TH Sarabun New", sans-serif; font-size: 16pt;">/</span><span lang="TH" style="font-family: "TH Sarabun New", sans-serif; font-size: 16pt;">แท็บเล็ต พร้อม
ๆ กัน ในการบังคับให้บังคับผ่านทางโทรศัพท์/แท็บเล็ต</span></p>
<p class="MsoNormal"><span style="font-family: "TH Sarabun New", sans-serif; font-size: 21.3333px;">ผ่านไป 1 ปี สำหรับการเพิ่มกระทู้ใหม่ <br />มีโชคร่ำรวยเงินทอง</span></p><p class="MsoNormal"><span style="font-family: "TH Sarabun New", sans-serif; font-size: 21.3333px;"><br /></span></p></div><div class="blogger-post-footer">สงวนลิขสิทธิ์ ห้ามนำไปเผยแพร่ก่อนได้รับอนุญาติ</div>เกษม กมลชัยพิสิฐhttp://www.blogger.com/profile/03223085345729627028noreply@blogger.com0tag:blogger.com,1999:blog-2343321804163472494.post-63221804337748795642020-09-04T10:52:00.010+07:002020-09-13T01:51:56.942+07:00SQL Server : Install SQL Server and MariaDB via Docker Container on Windows 10<p> <b><span style="font-size: large;">บ</span></b>ทความนี้นำเสนอ การติดตั้ง Docker บน Windows 10 พร้อมติดตั้ง SQL Server บน Docker </p><p><b>ติดตั้ง Docker </b></p><p> ให้ทำการดาวน์โหลดตัวติดตั้ง Docker สำหรับ Windows 10 โดยเข้าไปที่เว็บ</p><p><a href="https://www.docker.com/get-started">https://www.docker.com/get-started</a></p><p>จากนั้นทำการดาวน์โหลด Docker Desktop for Windows </p><p>จะได้ไฟล์ Docker Desktop Installer เมื่อได้ไฟล์เรียบร้อยให้ทำการติดตั้งโปรแกรมได้เลย </p><p>ขณะติดตั้งจะขึ้นหน้าต่าง </p><div class="separator" style="clear: both; text-align: center;"><a href="https://1.bp.blogspot.com/-TT9-Pg6sh8g/X1GqXutVZmI/AAAAAAAAD7M/gX5zxBLR6ZIYt2-Vc2rkzVmS8wnstrXKACLcBGAsYHQ/s713/dock_01.png" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img border="0" data-original-height="406" data-original-width="713" src="https://1.bp.blogspot.com/-TT9-Pg6sh8g/X1GqXutVZmI/AAAAAAAAD7M/gX5zxBLR6ZIYt2-Vc2rkzVmS8wnstrXKACLcBGAsYHQ/s320/dock_01.png" width="320" /></a></div><br /><p><br /></p><p><br /></p><p><br /></p><p><br /></p><p><br /></p><p>ให้คลิก OK</p><p>โปรแกรมก็จะทำการติดตั้งจนเสร็จ </p><p>จะปรากฎไอคอน Docker Desktop ที่หน้า Desktop ให้ดับเบิ้ลคลิกเพื่อเรียกใช้งาน Docker </p><p>รอสักครู่ให้ Docker Start จนเร็จ จากนั้นไปคลิกที่ ปุ่ม Hidden Icon ที่ Task bar </p><div class="separator" style="clear: both; text-align: center;"><a href="https://1.bp.blogspot.com/-2-IdLbaeB6s/X1GshzhR78I/AAAAAAAAD7Y/r8DfORzUe1UT0FsBFMxm-YgoSYEjmac2ACLcBGAsYHQ/s181/dock_02.png" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img border="0" data-original-height="180" data-original-width="181" src="https://1.bp.blogspot.com/-2-IdLbaeB6s/X1GshzhR78I/AAAAAAAAD7Y/r8DfORzUe1UT0FsBFMxm-YgoSYEjmac2ACLcBGAsYHQ/s0/dock_02.png" /></a></div><br /><p><br /></p><p><br /></p><p><br /></p><p><br /></p><p><br /></p><p>ให้คลิกที่ไอคอน Docker แล้วเลือก Dashboard จะปรากฎหน้าต่าง Docker Dashboard</p><p>จากนั้นคลิก Sign In <br />(หากยังไม่เคยสมัครให้ทำการสมัครก่อนโดยเข้าไปสมัครที่ <a href="http://hub.docker.com">http://hub.docker.com</a>)</p><p></p><div class="separator" style="clear: both; text-align: center;"><a href="https://1.bp.blogspot.com/-eJqAK53Q-1M/X1GuZ9dYrKI/AAAAAAAAD7k/5jOnh9uq_OMCS0cpb9OaKLOIgIJ_EYkggCLcBGAsYHQ/s1560/dock_03.png" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img border="0" data-original-height="990" data-original-width="1560" src="https://1.bp.blogspot.com/-eJqAK53Q-1M/X1GuZ9dYrKI/AAAAAAAAD7k/5jOnh9uq_OMCS0cpb9OaKLOIgIJ_EYkggCLcBGAsYHQ/s320/dock_03.png" width="320" /></a></div><br /><b><br /></b><p></p><p><b><br /></b></p><p><b><br /></b></p><p><b><br /></b></p><p><b><br /></b></p><p><b><br /></b></p><p>หน้าต่าง Dashboard จะเป็นตัวบริหารจัดการ Container ที่เราสร้างขึ้น </p><p>ต่อไปเราไปทำการติดตั้ง SQL Server </p><p><b><br /></b></p><p><b>ติดตั้ง SQL Server</b></p><p>ไปที่ Windows Search ที่ Taskbar แล้วค้นหา PowerShell </p><p>เมื่อเจอแล้วให้ เปิดหน้าต่าง Windows PowerShell ในโหมด Run as Administrator</p><div class="separator" style="clear: both; text-align: center;"><a href="https://1.bp.blogspot.com/-jJ2ulCbTR9s/X1GvjyqJsVI/AAAAAAAAD7w/G6zbau8N6zstwPDaoEa3WilyWP7YjesQACLcBGAsYHQ/s1172/dock_04.png" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img border="0" data-original-height="1025" data-original-width="1172" src="https://1.bp.blogspot.com/-jJ2ulCbTR9s/X1GvjyqJsVI/AAAAAAAAD7w/G6zbau8N6zstwPDaoEa3WilyWP7YjesQACLcBGAsYHQ/s320/dock_04.png" width="320" /></a></div><br /><p><br /></p><p><br /></p><p><br /></p><p><br /></p><p><br /></p><p><br /></p><p><br /></p><p><br /></p><p>เมื่อเปิดหน้าต่าง PowerShell ขึ้นมาแล้วให้พิมพ์</p><p><span style="color: #2b00fe;">docker login</span></p><p><b>เริ่มต้นติดตั้ง SQL Server</b> </p><p>สำหรับตัวอย่างคำสั่ง <span style="color: #cc0000; font-weight: 700;">2019-CU6-ubuntu-16.04</span><b><span style="color: #cc0000;"> </span></b>จะเป็นการติดตั้ง SQL Server 2019 </p><p>หากต้องการติดตั้งในรุ่นอื่นสามารถกำหนดรุ่นได้ตามต้องการ โดยดูรุ่นต่าง ๆ ตามลิงค์<br /><a href="https://hub.docker.com/_/microsoft-mssql-server">https://hub.docker.com/_/microsoft-mssql-server</a></p><p>1. ดาวน์โหลดไฟล์ติดตั้งสำหรับ SQL Server โดยพิม์คำสั่ง </p><p><span face="" style="background-color: white; font-size: 16px; white-space: pre-wrap;"><span style="color: #2b00fe;">docker pull mcr.microsoft.com/mssql/</span></span><span style="color: #2b00fe;">server:</span><span style="color: #cc0000; font-weight: bold;">2019-CU6-ubuntu-16.04</span></p><p>โปรแกรมจะทำการดาวน์โหลด SQL Server ดังภาพ</p><div class="separator" style="clear: both; text-align: center;"><a href="https://1.bp.blogspot.com/-aGS-rWYcS2s/X1GzKttZKfI/AAAAAAAAD78/qt0Mk5HK6MwSEZiGP1iGMG4qWWT3fbThACLcBGAsYHQ/s1050/dock_05.png" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img border="0" data-original-height="490" data-original-width="1050" height="186" src="https://1.bp.blogspot.com/-aGS-rWYcS2s/X1GzKttZKfI/AAAAAAAAD78/qt0Mk5HK6MwSEZiGP1iGMG4qWWT3fbThACLcBGAsYHQ/w400-h186/dock_05.png" width="400" /></a></div><br /><p><br /></p><p><br /></p><p><br /></p><p><br /></p><p><br /></p><p>2. สร้าง Container และติดตั้ง SQL Server ให้กับ Docker โดยพิมพ์คำสั่ง</p><p><span style="color: #2b00fe;">docker run -e "ACCEPT_EULA=Y" -e "SA_PASSWORD=</span><span style="color: #ff00fe;">รหัสผ่าน</span><span style="color: #2b00fe;">" -p1433:1433 --name </span><b><span style="color: #2b00fe;">sql2019</span></b><span style="color: #2b00fe;"> -d mcr.microsoft.com/mssql/</span><span style="color: #2b00fe;">server<b>:</b></span><span style="color: #cc0000; font-weight: 700;">2019-CU6-ubuntu-16.04</span></p><p>*** กำหนดรหัสผ่านสำหรับ SA ตรง <span style="color: #ff00fe;">รหัสผ่าน</span> ตามต้องการ</p><div class="separator" style="clear: both; text-align: center;"><a href="https://1.bp.blogspot.com/-373mNS-g6dM/X1G251-FPlI/AAAAAAAAD8U/RGGg5zXhvQMqr7xbWhwVHYecMQwdKIT5gCLcBGAsYHQ/s1137/dock_06.png" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img border="0" data-original-height="228" data-original-width="1137" height="125" src="https://1.bp.blogspot.com/-373mNS-g6dM/X1G251-FPlI/AAAAAAAAD8U/RGGg5zXhvQMqr7xbWhwVHYecMQwdKIT5gCLcBGAsYHQ/w625-h125/dock_06.png" width="625" /></a></div><br /><p><br /></p><br /><p><br /></p><p><br /></p><p>เมื่อกำหนดเสร็จ ไปที่หน้าต่าง Docker Dashboard จะปรากฎ SQL Server ดังภาพ</p><div class="separator" style="clear: both; text-align: center;"><a href="https://1.bp.blogspot.com/-rYICXPaIQY0/X1G3sIMHACI/AAAAAAAAD8c/wCPnmFYOS1wr4ZZ2r7mZPgog9nXPsWewACLcBGAsYHQ/s1560/dock_07.png" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img border="0" data-original-height="390" data-original-width="1560" height="156" src="https://1.bp.blogspot.com/-rYICXPaIQY0/X1G3sIMHACI/AAAAAAAAD8c/wCPnmFYOS1wr4ZZ2r7mZPgog9nXPsWewACLcBGAsYHQ/w625-h156/dock_07.png" width="625" /></a></div><br /><p><br /></p><p><br /></p><p><br /></p><p><br /></p><p><br /></p><p>ยินดีด้วย ติดตั้ง SQL Server ภายใต้ Docker เสร็จเรียบร้อย ในหน้าต่างนี้เราสามารถบริหารจัดการ Container sql2019 ได้ผ่านไอคอนด้านหลัง </p><p>ต่อไปเราจะทำการทดสอบ ให้ไปทำการปิด firewall ก่อน</p><p>แล้วทำการติดตั้ง SQL Management Studio ดาวน์โหลดได้ตามเว็บไซต์ด้านล่าง</p><p><a href="https://docs.microsoft.com/en-us/sql/ssms/download-sql-server-management-studio-ssms?view=sql-server-ver15">https://docs.microsoft.com/en-us/sql/ssms/download-sql-server-management-studio-ssms?view=sql-server-ver15</a></p><p>ติดตั้งเสร็จทำการเปิดใช้งาน</p><p>แล้ว login เข้า SQL Server ตามภาพด้านล่าง</p><div class="separator" style="clear: both; text-align: center;"><a href="https://1.bp.blogspot.com/-Goiidmb2NtQ/X1G5gcdzo6I/AAAAAAAAD8s/JKjK69N9RpcbOzZgVuU2I1JlFldYJBnowCLcBGAsYHQ/s1279/dock_08.png" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img border="0" data-original-height="776" data-original-width="1279" height="380" src="https://1.bp.blogspot.com/-Goiidmb2NtQ/X1G5gcdzo6I/AAAAAAAAD8s/JKjK69N9RpcbOzZgVuU2I1JlFldYJBnowCLcBGAsYHQ/w625-h380/dock_08.png" width="625" /></a><a href="https://1.bp.blogspot.com/-Goiidmb2NtQ/X1G5gcdzo6I/AAAAAAAAD8s/JKjK69N9RpcbOzZgVuU2I1JlFldYJBnowCLcBGAsYHQ/s1279/dock_08.png" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><br /></a><span style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;">ทดสอบดูว่าเราติดตั้ง SQL Server รุ่นใด</span></div><div class="separator" style="clear: both; text-align: center;"><a href="https://1.bp.blogspot.com/-gtNRJZCk97w/X1G5gMlwcwI/AAAAAAAAD8o/MXUj4wsdDUQV4mXyvBZDD5VaN36fzMk3wCLcBGAsYHQ/s1279/dock_09.png" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img border="0" data-original-height="776" data-original-width="1279" height="380" src="https://1.bp.blogspot.com/-gtNRJZCk97w/X1G5gMlwcwI/AAAAAAAAD8o/MXUj4wsdDUQV4mXyvBZDD5VaN36fzMk3wCLcBGAsYHQ/w625-h380/dock_09.png" width="625" /></a></div><br /><p><br /></p><p><br /></p><p><br /></p><p><br /></p><p><br /></p><p><br /></p><p><br /></p><p><br /></p><p><br /></p><p><br /></p><p><br /></p><p>ยินดีด้วย ทำสำเร็จแล้ว เย้ ๆ ๆ ๆ </p><p>สำหรับระบบปฎิบัติการ MacOS ก็ทำลักษณะเดียวกัน แต่ต้องระวังเรื่องการกำหนดรหัสผ่าน ซึ่งต้องเป็นรหัสผ่านที่เป็นไปตามข้อกำหนด คือ อย่างน้อย 8 ตัวอักษรและมีตัวอักษรใหญ่เล็ก เป็นต้น ไม่เช่นนั้นจะไม่สามารถ start ตัว sql container ได้</p><p>สำหรับระบบปฏิบัติการ MacOS Linux ยังไม่มี SSMS เราสามารถดาวน์โหลด Azure Data Studio มาใช้แทนได้ โดยไปทำการดาวน์โหลดได้ที่เว็บ </p><p><a href="https://github.com/Microsoft/azuredatastudio">https://github.com/Microsoft/azuredatastudio</a></p><p><b><u>ติดตั้ง MariaDB</u></b></p><p>1. เปิด Terminal หรือ Powershell แล้วป้อนคำสั่ง</p><p><span style="font-family: Menlo;"><b>docker login</b></span></p><p>2. ดาวน์โหลดไฟล์ติดตั้งสำหรับ MariaDB โดยพิม์คำสั่ง </p><p style="font-family: menlo; font-stretch: normal; line-height: normal; margin: 0px;"><span style="font-variant-ligatures: no-common-ligatures;"><b>docker pull mariadb:latest</b></span></p><p>รอจนกระทั่งทำการดาวน์โหลดโปรแกรมเสร็จ</p><p>3. สร้าง Container และติดตั้ง MariaDB ให้กับ Docker โดยพิมพ์คำสั่ง</p><p style="font-family: menlo; font-stretch: normal; line-height: normal; margin: 0px;"><span style="font-variant-ligatures: no-common-ligatures;"><b>docker run --name mariadb -e MYSQL_ROOT_PASSWORD=<span style="background-color: #ea9999;">รหัสผ่าน</span> -d mariadb </b></span></p><p style="font-family: menlo; font-stretch: normal; line-height: normal; margin: 0px;"><span style="font-variant-ligatures: no-common-ligatures;"><span style="font-size: x-small;"><br /></span></span></p><p style="font-family: menlo; font-stretch: normal; line-height: normal; margin: 0px;"><span style="font-variant-ligatures: no-common-ligatures;"><span face="-webkit-standard">*** กำหนดรหัสผ่านสำหรับ root ตรง </span><span face="-webkit-standard" style="color: #ff00fe;">รหัสผ่าน</span><span face="-webkit-standard"> ตามต้องการ</span></span></p><p style="font-family: menlo; font-stretch: normal; line-height: normal; margin: 0px;"><span style="font-variant-ligatures: no-common-ligatures;"><span face="-webkit-standard"><br /></span></span></p><p style="font-stretch: normal; line-height: normal; margin: 0px;">หากไม่มีข้อผิดพลาดใด ๆ การติดตั้งสำเร็จเรียบร้อย ให้ไปเปิด Docker -> Dashboard จะปรากฎ Container ของ mariadb </p><p style="font-stretch: normal; line-height: normal; margin: 0px;"><br /></p><p style="font-stretch: normal; line-height: normal; margin: 0px;"><br /></p><p><b><u>ติดตั้ง Web Server</u></b></p><p>1. เปิด Terminal หรือ Powershell แล้วป้อนคำสั่ง</p><p><span style="font-family: Menlo;"><b>docker login</b></span></p><p>2. ดาวน์โหลดไฟล์ติดตั้งสำหรับ PHP 7.4 โดยพิม์คำสั่ง (รุ่นล่าสุดปี 2563)</p><p style="font-family: menlo; font-stretch: normal; line-height: normal; margin: 0px;"><span style="font-variant-ligatures: no-common-ligatures;"><span style="font-family: Menlo;"><b>docker pull php:7.4-apache</b></span></span></p><p style="font-family: menlo; font-stretch: normal; line-height: normal; margin: 0px;"><span style="font-variant-ligatures: no-common-ligatures;"><b><br /></b></span></p><p style="font-family: menlo; font-stretch: normal; line-height: normal; margin: 0px;"><span style="font-variant-ligatures: no-common-ligatures;"><span face="-webkit-standard">3. สร้าง Container และติดตั้ง PHP ให้กับ Docker โดยพิมพ์คำสั่ง</span></span></p><p style="font-family: menlo; font-stretch: normal; line-height: normal; margin: 0px;"><span style="font-variant-ligatures: no-common-ligatures;"><span face="-webkit-standard"><br /></span></span></p><p style="font-family: menlo; font-stretch: normal; line-height: normal; margin: 0px;"><span style="font-variant-ligatures: no-common-ligatures;"><b>docker run -p 80:80 --name webm php:7.4-apache</b><span style="font-size: 11px;"> </span></span></p><p style="font-family: menlo; font-stretch: normal; line-height: normal; margin: 0px;"><span style="font-variant-ligatures: no-common-ligatures;"><span face="-webkit-standard"><br /></span></span></p><p style="font-stretch: normal; line-height: normal; margin: 0px;">กรณีที่มีการใช้งาน port 80 อยู่ก่อนแล้ว ให้ทำการเปลี่ยน port ใหม่ เช่น 8080</p><p style="font-stretch: normal; line-height: normal; margin: 0px;"><br /></p><p style="font-stretch: normal; line-height: normal; margin: 0px;"><span style="font-family: Menlo;">docker run -p <span style="background-color: #fcff01;">8080:80</span> --name webm php:7.4-apache</span><span style="font-family: Menlo; font-size: 11px;"> </span></p><p style="font-stretch: normal; line-height: normal; margin: 0px;"><span style="font-family: Menlo; font-size: 11px;"><br /></span></p><p style="font-stretch: normal; line-height: normal; margin: 0px;"><span style="font-family: Menlo; font-size: 11px;"><br /></span></p><p style="font-stretch: normal; line-height: normal; margin: 0px;">4. เมื่อติดตั้งเสร็จเรียบร้อย ให้เปิด browser แล้วป้อน url ดังนี้</p><p style="font-stretch: normal; line-height: normal; margin: 0px;"><br /></p><p style="font-stretch: normal; line-height: normal; margin: 0px;">http://localhost </p><p style="font-stretch: normal; line-height: normal; margin: 0px;"><br /></p><p style="font-stretch: normal; line-height: normal; margin: 0px;">หากขึ้นข้อความ ว่า....</p><h1>Forbidden</h1><p>You don't have permission to access this resource.</p><hr /><address>Apache/2.4.38 (Debian) Server at localhost Port 80</address><p style="font-stretch: normal; line-height: normal; margin: 0px;"><br /></p><p style="font-stretch: normal; line-height: normal; margin: 0px;"><br /></p><p style="font-stretch: normal; line-height: normal; margin: 0px;">ยินดีด้วย คุณติดตั้ง web server ได้แล้ว</p><p style="font-stretch: normal; line-height: normal; margin: 0px;"><br /></p><p style="font-stretch: normal; line-height: normal; margin: 0px;"><br /></p><p style="font-stretch: normal; line-height: normal; margin: 0px;"><b><u>กลับมานับ 1 กันใหม่</u></b></p><p style="font-stretch: normal; line-height: normal; margin: 0px;"><br /></p><p style="font-stretch: normal; line-height: normal; margin: 0px;">เราจะมาทำการเขียน php กัน ดังนั้น เริ่มต้นกันใหม่อีกครั้ง </p><p style="font-stretch: normal; line-height: normal; margin: 0px;"><br /></p><p style="font-stretch: normal; line-height: normal; margin: 0px;">1. ให้ไปทำการสร้าง โฟลเดอร์ใหม่ ชื่ออะไรก็ได้ เช่น php_www</p><p style="font-stretch: normal; line-height: normal; margin: 0px;">แล้วไปสร้างเท็กซ์ไฟล์ ธรรมด้า ธรรมดา ชื่อ <b style="background-color: #ea9999;">Dockerfile</b> (ไม่ต้องมีนามสกุลไฟล์) </p><p style="font-stretch: normal; line-height: normal; margin: 0px;">ป้อนคำสั่งในไฟล์ ดังนี้</p><p style="font-stretch: normal; line-height: normal; margin: 0px;"><b style="font-family: menlo;"><br /></b></p><p style="font-stretch: normal; line-height: normal; margin: 0px;"><b style="font-family: menlo;">FROM php:7.4-apache</b></p><div><br /></div><p style="font-stretch: normal; line-height: normal; margin: 0px;"><br /></p><p style="font-stretch: normal; line-height: normal; margin: 0px;">2. สร้างไฟล์ชื่อ <b style="background-color: #ea9999;">docker-compose.yml</b> แล้วเขียนคำสั่ง ดังนี้</p><p style="font-stretch: normal; line-height: normal; margin: 0px;"><br /></p><div style="background-color: #1e1e1e; color: #d4d4d4; font-family: menlo, monaco, "courier new", monospace; font-size: 12px; line-height: 18px; white-space: pre;"><div><span style="color: #569cd6;">version</span>: <span style="color: #ce9178;">"3"</span></div><div><span style="color: #569cd6;">services</span>:</div><div> <span style="color: #569cd6;">www01</span>:</div><div> <span style="color: #569cd6;">build</span>: <span style="color: #b5cea8;">.</span></div><div> <span style="color: #569cd6;">ports</span>:</div><div> - <span style="color: #ce9178;">"8080:80"</span></div><div> <span style="color: #569cd6;">volumes</span>:</div><div> - <span style="color: #ce9178;">./src:/var/www/html/</span></div><div> <span style="color: #569cd6;">networks</span>:</div><div> - <span style="color: #ce9178;">default</span></div></div><p style="font-stretch: normal; line-height: normal; margin: 0px;"><br /></p><p style="font-stretch: normal; line-height: normal; margin: 0px;"><br /></p><p style="font-stretch: normal; line-height: normal; margin: 0px;">3. สร้างโฟลเดอร์ ชื่อ <b style="background-color: #ea9999;"><span style="font-size: medium;">src</span></b> ภายใต้ php_www แล้วเขียนคำสั่ง php เพื่อทดสอบ </p><p style="font-stretch: normal; line-height: normal; margin: 0px;">โดยสร้างไฟล์ชื่อ phpinfo.php แล้วป้อนคำสั่ง</p><p style="font-stretch: normal; line-height: normal; margin: 0px;"><br /></p><p style="font-stretch: normal; line-height: normal; margin: 0px;"><?php </p><p style="font-stretch: normal; line-height: normal; margin: 0px;"> phpinfo();</p><p style="font-stretch: normal; line-height: normal; margin: 0px;">?></p><p style="font-stretch: normal; line-height: normal; margin: 0px;"><br /></p><p style="font-stretch: normal; line-height: normal; margin: 0px;">เมื่อสร้างไฟล์เสร็จจะได้ไฟล์ตามภาพด้านล่าง</p><p style="font-stretch: normal; line-height: normal; margin: 0px;"><br /></p><div class="separator" style="clear: both; text-align: center;"><a href="https://1.bp.blogspot.com/-1doa_2FxbTE/X10OUNAM-9I/AAAAAAAAD-g/-kS3w9nCmQkz0EeqXuugQoeDG38GQdREgCLcBGAsYHQ/s1206/Screen%2BShot%2B2563-09-13%2Bat%2B01.06.17.png" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img border="0" data-original-height="398" data-original-width="1206" height="208" src="https://1.bp.blogspot.com/-1doa_2FxbTE/X10OUNAM-9I/AAAAAAAAD-g/-kS3w9nCmQkz0EeqXuugQoeDG38GQdREgCLcBGAsYHQ/w625-h208/Screen%2BShot%2B2563-09-13%2Bat%2B01.06.17.png" width="625" /></a></div><br /><p style="font-stretch: normal; line-height: normal; margin: 0px;"><br /></p><p style="font-stretch: normal; line-height: normal; margin: 0px;"><br /></p><p style="font-stretch: normal; line-height: normal; margin: 0px;"><br /></p><p style="font-stretch: normal; line-height: normal; margin: 0px;"><br /></p><p style="font-stretch: normal; line-height: normal; margin: 0px;"><br /></p><p style="font-stretch: normal; line-height: normal; margin: 0px;"><br /></p><p style="font-stretch: normal; line-height: normal; margin: 0px;"><br /></p><p style="font-stretch: normal; line-height: normal; margin: 0px;"><br /></p><p style="font-stretch: normal; line-height: normal; margin: 0px;"><br /></p><p style="font-stretch: normal; line-height: normal; margin: 0px;"><br /></p><p style="font-stretch: normal; line-height: normal; margin: 0px;"><br /></p><p style="font-stretch: normal; line-height: normal; margin: 0px;"><br /></p><p style="font-stretch: normal; line-height: normal; margin: 0px;"><br /></p><p style="font-stretch: normal; line-height: normal; margin: 0px;">4. เปิดโปรแกรม Powershell หรือ Terminal</p><p style="font-stretch: normal; line-height: normal; margin: 0px;">พิมพ์</p><p style="font-stretch: normal; line-height: normal; margin: 0px;"><br /></p><p style="font-stretch: normal; line-height: normal; margin: 0px;">docker login</p><p style="font-stretch: normal; line-height: normal; margin: 0px;"><br /></p><p style="font-stretch: normal; line-height: normal; margin: 0px;">แล้วย้ายตำแหน่งโฟล์เดอร์ไปที่ โฟลเดอร์ที่เก็บไฟล์ ( php_www ที่สร้างไว้ในข้อ 1 )</p><p style="font-stretch: normal; line-height: normal; margin: 0px;"><br /></p><p style="font-stretch: normal; line-height: normal; margin: 0px;">แล้วป้อนคำสั่งต่อ ดังนี้</p><p style="font-stretch: normal; line-height: normal; margin: 0px;"><br /></p><pre style="background-color: #f6f8fa; border-bottom-left-radius: 6px; border-bottom-right-radius: 6px; border-top-left-radius: 6px; border-top-right-radius: 6px; box-sizing: border-box; caret-color: rgb(36, 41, 46); color: #24292e; font-size: 13.600000381469727px; line-height: 1.45; margin-bottom: 16px; margin-top: 0px; overflow: auto; padding: 16px; word-wrap: normal;"><code style="border-bottom-left-radius: 6px; border-bottom-right-radius: 6px; border-top-left-radius: 6px; border-top-right-radius: 6px; border: 0px; box-sizing: border-box; display: inline; line-height: inherit; margin: 0px; overflow: visible; padding: 0px; word-break: normal; word-wrap: normal;"><b>docker-compose up</b></code></pre><p style="font-stretch: normal; line-height: normal; margin: 0px;">กลับไปดูที่ Docker dashboard จะปรากฎ container รันขึ้นมาอีกตัว</p><p style="font-stretch: normal; line-height: normal; margin: 0px;"><br /></p><p style="font-stretch: normal; line-height: normal; margin: 0px;"></p><div class="separator" style="clear: both; text-align: center;"><a href="https://1.bp.blogspot.com/-kHhlQSBVnds/X10RoZ1PVSI/AAAAAAAAD-s/Oy7IVKj6b9EJ65ccJqowYHwIIfHqUT7CQCLcBGAsYHQ/s2072/Screen%2BShot%2B2563-09-13%2Bat%2B01.17.49.png" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img border="0" data-original-height="840" data-original-width="2072" height="255" src="https://1.bp.blogspot.com/-kHhlQSBVnds/X10RoZ1PVSI/AAAAAAAAD-s/Oy7IVKj6b9EJ65ccJqowYHwIIfHqUT7CQCLcBGAsYHQ/w625-h255/Screen%2BShot%2B2563-09-13%2Bat%2B01.17.49.png" width="625" /></a></div><br /> <p></p><p style="font-stretch: normal; line-height: normal; margin: 0px;"><br /></p><p style="font-stretch: normal; line-height: normal; margin: 0px;"><br /></p><p style="font-stretch: normal; line-height: normal; margin: 0px;"><br /></p><p style="font-stretch: normal; line-height: normal; margin: 0px;"><br /></p><p style="font-stretch: normal; line-height: normal; margin: 0px;"><br /></p><p style="font-stretch: normal; line-height: normal; margin: 0px;"><br /></p><p style="font-stretch: normal; line-height: normal; margin: 0px;"><br /></p><p style="font-stretch: normal; line-height: normal; margin: 0px;"><br /></p><p style="font-stretch: normal; line-height: normal; margin: 0px;"><br /></p><p style="font-stretch: normal; line-height: normal; margin: 0px;"><br /></p><p style="font-stretch: normal; line-height: normal; margin: 0px;"><br /></p><p style="font-stretch: normal; line-height: normal; margin: 0px;"><br /></p><p style="font-stretch: normal; line-height: normal; margin: 0px;"><br /></p><p style="font-stretch: normal; line-height: normal; margin: 0px;">5. เปิดโปรแกรม browser ขึ้นมาแล้วป้อน url ดังนี้</p><p style="font-stretch: normal; line-height: normal; margin: 0px;"><br /></p><p style="font-stretch: normal; line-height: normal; margin: 0px;"><b>http://localhost:8080/phpinfo.php</b></p><p style="font-stretch: normal; line-height: normal; margin: 0px;"><br /></p><p style="font-stretch: normal; line-height: normal; margin: 0px;">จะปรากฎหน้าจอ phpinfo ดังภาพ</p><p style="font-stretch: normal; line-height: normal; margin: 0px;"><br /></p><div class="separator" style="clear: both; text-align: center;"><a href="https://1.bp.blogspot.com/-WAcEzgDgTlo/X10ShkTEXRI/AAAAAAAAD-0/f5nwKrWmBYslVGVDAmPWL6o4FoH754QkACLcBGAsYHQ/s2038/Screen%2BShot%2B2563-09-13%2Bat%2B01.24.36.png" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img border="0" data-original-height="1036" data-original-width="2038" height="319" src="https://1.bp.blogspot.com/-WAcEzgDgTlo/X10ShkTEXRI/AAAAAAAAD-0/f5nwKrWmBYslVGVDAmPWL6o4FoH754QkACLcBGAsYHQ/w625-h319/Screen%2BShot%2B2563-09-13%2Bat%2B01.24.36.png" width="625" /></a></div><br /><p style="font-stretch: normal; line-height: normal; margin: 0px;"><br /></p><p style="font-stretch: normal; line-height: normal; margin: 0px;"><br /></p><p style="font-stretch: normal; line-height: normal; margin: 0px;"><br /></p><p style="font-stretch: normal; line-height: normal; margin: 0px;"><br /></p><p style="font-stretch: normal; line-height: normal; margin: 0px;"><br /></p><p style="font-stretch: normal; line-height: normal; margin: 0px;"><br /></p><p style="font-stretch: normal; line-height: normal; margin: 0px;"><br /></p><p style="font-stretch: normal; line-height: normal; margin: 0px;"><br /></p><p style="font-stretch: normal; line-height: normal; margin: 0px;"><br /></p><p style="font-stretch: normal; line-height: normal; margin: 0px;"><br /></p><p style="font-stretch: normal; line-height: normal; margin: 0px;"><br /></p><p style="font-stretch: normal; line-height: normal; margin: 0px;"><br /></p><p style="font-stretch: normal; line-height: normal; margin: 0px;"><br /></p><p style="font-stretch: normal; line-height: normal; margin: 0px;"><br /></p><p style="font-stretch: normal; line-height: normal; margin: 0px;"><br /></p><p style="font-stretch: normal; line-height: normal; margin: 0px;"><br /></p><p style="font-stretch: normal; line-height: normal; margin: 0px;"><br /></p><p style="font-stretch: normal; line-height: normal; margin: 0px;"><br /></p><p style="font-stretch: normal; line-height: normal; margin: 0px;">ที่เหลือก็นำไฟล์ .php มาใส่ไว้ใน โฟลเดอร์ src (โฟลเดอร์ที่สร้างไว้ในข้อ 3) ก็สามารถเรียกใช้งานได้แล้ว</p><p style="font-stretch: normal; line-height: normal; margin: 0px;"><br /></p><p style="font-stretch: normal; line-height: normal; margin: 0px;">สรุปง่าย ๆ แบบส่วนตัว</p><p style="font-stretch: normal; line-height: normal; margin: 0px;"><br /></p><p style="font-stretch: normal; line-height: normal; margin: 0px;">container ที่สร้างเหมือนเราสร้างโปรเจกต์ ในนั้นก็จะประกอบไปด้วยไฟล์ที่จำเป็น </p><p style="font-stretch: normal; line-height: normal; margin: 0px;">ไม่ใช้ก็ลบ container ออก หรือ หยุดก็ได้ </p><p style="font-stretch: normal; line-height: normal; margin: 0px;">ใช้เมื่อไหร่ก็เข้าไปที่โฟลเดอร์ แล้วก็เรียกคำสั่ง <b style="color: #24292e; font-size: 13.600000381469727px;">docker-compose up </b></p><p style="font-stretch: normal; line-height: normal; margin: 0px;"><b style="color: #24292e; font-size: 13.600000381469727px;">ระวังเรื่อง port ชนกันให้ดี </b></p><p style="font-stretch: normal; line-height: normal; margin: 0px;"><br /></p><p style="font-stretch: normal; line-height: normal; margin: 0px;"> ขอแสดงความยินดีด้วย</p><p style="font-stretch: normal; line-height: normal; margin: 0px;"><br /></p><p style="font-stretch: normal; line-height: normal; margin: 0px;"><br /></p><p style="font-stretch: normal; line-height: normal; margin: 0px;">;-)</p><p style="font-stretch: normal; line-height: normal; margin: 0px;"><br /></p><div class="blogger-post-footer">สงวนลิขสิทธิ์ ห้ามนำไปเผยแพร่ก่อนได้รับอนุญาติ</div>เกษม กมลชัยพิสิฐhttp://www.blogger.com/profile/03223085345729627028noreply@blogger.com0tag:blogger.com,1999:blog-2343321804163472494.post-24875122824446680392020-08-01T12:47:00.007+07:002023-08-24T15:06:45.828+07:00UNITY : Assets\Standard Assets\Utility\SimpleActivatorMenu.cs(14,16): error CS0619: 'GUIText' is obsolete: 'GUIText has been removed. Use UI.Text instead.'<div>Standard Assets สามารถดาวน์โหลดได้ที่</div><div><br /></div><div><a href="https://assetstore.unity.com/packages/essentials/asset-packs/standard-assets-for-unity-2018-4-32351">https://assetstore.unity.com/packages/essentials/asset-packs/standard-assets-for-unity-2018-4-32351</a></div><div><br /></div><div>สำหรับผู้ใช้รายใหม่ที่ไม่เคยดาวน์โหลด Standard Assets มาก่อน จะไม่สามารถดาวน์โหลได้ ให้ดาวน์โหลดผ่าน เว็บด้านล่าง<br /><a href="https://ryiah.com/unity/assets/StandardAssets20184.unitypackage">https://ryiah.com/unity/assets/StandardAssets20184.unitypackage</a></div><div><br /></div>** Standard Assets ไม่ไปต่อ ไม่มีให้ดาวน์โหลดแล้ว <br />สำหรับตัวที่พอจะใช้แทน Standard Assets ได้ก็ให้ไปดาวน์โหลดผ่านเว็บด้านล่าง<div><a href="https://assetstore.unity.com/packages/essentials/tutorial-projects/etra-s-starter-assets-first-person-third-person-character-contro-239262">https://assetstore.unity.com/packages/essentials/tutorial-projects/etra-s-starter-assets-first-person-third-person-character-contro-239262</a></div><div><br /><div><br /><b><u>เมื่อทำการ Import ตัว Standard Assets เข้ามาใช้งาน หากเกิดอาการนี้ ให้แก้ไขตามด้านล่าง</u></b><div><br />ผู้ที่นำเอา Standard Assets มาใช้ใน Unity 2018 ขึ้นไป จะพบ Error ดังนี้<br />
<br />
Assets\Standard Assets\Utility\SimpleActivatorMenu.cs(14,16): error CS0619: 'GUIText' is obsolete: 'GUIText has been removed. Use UI.Text instead.'<br />
<br />
เอาง่าย ๆ GUIText มันใช้ไม่ได้แล้วบน (obsolate -> ล้าสมัย) ดังนั้นจะใช้ Standard Assets ก็ต้องใช้กับ Unity 2017 หรือ ต่ำกว่า<br />
<br />
แต่..... ยังมีทางแก้ไข เมื่อพบ Error ให้ ดับเบิ้ลคลิกที่ Error ก็จะเข้าไปสู่คำสั่งที่ Error แล้วแก้ไขดังภาพ<br />
<br /></div><div>ที่ไฟล์ SimpleActivatorMenu.cs แก้ไขตามภาพ</div><div><br />
<div class="separator" style="clear: both; text-align: center;">
</div>
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://1.bp.blogspot.com/-_ezrFaOEE0k/XyUDPLwhX9I/AAAAAAAAD4I/dtS4yRpgUEw0Rza4US3o1nz0xTF6GIv4wCLcBGAsYHQ/s1600/UNITY_02.PNG" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img border="0" data-original-height="565" data-original-width="897" height="251" src="https://1.bp.blogspot.com/-_ezrFaOEE0k/XyUDPLwhX9I/AAAAAAAAD4I/dtS4yRpgUEw0Rza4US3o1nz0xTF6GIv4wCLcBGAsYHQ/s400/UNITY_02.PNG" width="400" /></a></div>
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
เพิ่ม<br />
<span style="color: #cc0000;"><b>using UintyEngine.UI; </b> </span> <br />
<br />
เปลี่ยน<br />
<b><span style="color: #e06666;">GUIText ไปเป็น Text</span></b><br /><br /><br />---------------------------------------------------------<br />ในไฟล์ ForcedReset.cs ให้แก้ไขในส่วนของ</div><div><br /></div><div>เพิ่มคำสั่ง </div><div><span style="color: red;"><b>Using UnityEngine.UI;</b></span></div><div><br /></div><div>และทำการแก้ไขบรรทัด</div><div><br /></div><div><div style="background-color: white; font-family: Consolas, "Courier New", monospace; font-size: 14px; line-height: 19px; white-space: pre;">[<span style="color: #267f99;">RequireComponent</span>(<span style="color: blue;">typeof</span> (<span style="color: #267f99;">GUITexture</span>))]</div></div><div style="background-color: white; font-family: Consolas, "Courier New", monospace; font-size: 14px; line-height: 19px; white-space: pre;">เป็น</div><div style="background-color: white; font-family: Consolas, "Courier New", monospace; font-size: 14px; line-height: 19px; white-space: pre;"><div style="line-height: 19px;">[<span style="color: #267f99;">RequireComponent</span>(<span style="color: blue;">typeof</span> (<span style="color: #267f99;">Image</span>))]</div></div><div><br /></div><div><br /></div><div>
โชคดี รวย ๆ โควิดหายไป</div></div></div><div class="blogger-post-footer">สงวนลิขสิทธิ์ ห้ามนำไปเผยแพร่ก่อนได้รับอนุญาติ</div>เกษม กมลชัยพิสิฐhttp://www.blogger.com/profile/03223085345729627028noreply@blogger.com0tag:blogger.com,1999:blog-2343321804163472494.post-29430379795850706002020-03-06T16:13:00.001+07:002020-03-06T16:13:32.341+07:00SQL Server : How to Connect SQL Server via Pythonท่านที่ต้องการเชื่อมต่อฐานข้อมูล SQL Server ผ่านทาง Python ขอบอกไว้ตรงนี้เลยว่าไม่ได้ยาก ลองมาทำกัน ดังนี้<br />
1. ทำการติดตั้ง Python กันก่อน (กรณีที่เครื่องเรายังไม่ได้ติดตั้ง)<br />
ให้ไปดาวน์โหลด Python แล้วทำการติดตั้งที่เว็บ<br />
<br />
<a href="https://www.python.org/downloads/">https://www.python.org/downloads/</a><br />
<br />
2. ทำการติดตั้ง Pyodbc โดยให้เปิดหน้าต่าง cmd.exe ของ Windows ขึ้นมา<br />
จากนั้นเข้าไปยังโฟลดเดอร์ที่เราติดตั้ง Python เอาไว้<br />
สำหรับของผู้เขียนติดตั้งไว้ใน Folder <br />
<br />
C:\Users\Kasemiyake\Appdata\Local\Programs\Python\Python38<br />
<br />
ให้ทำการเปลี่ยนไดเรกทรอรี่ไปยังโฟลเดอร์ Scripts ที่อยู่ภายใต้โฟลดเดอร์ของ Python<br />
โดยพิมพ์คำสั่ง<br />
<br />
C:<br />
CD \Users\Kasemiyake\Appdata\Local\Programs\Python\Python38\Scripts
<br />
<br />
จากนั้นทำการติดตั้ง Pyodbc โดยพิมพ์คำสั่ง<br />
<br />
pip install pyodbc<br />
<br />
<a href="https://1.bp.blogspot.com/-WRaRJXxGUAk/XmIQyKZ1T5I/AAAAAAAADtc/WZohCm8De20K_FRn6Fs63yIgNmWrPGi8ACLcBGAsYHQ/s1600/python1.png" imageanchor="1" style="clear: left; display: inline !important; margin-bottom: 1em; margin-right: 1em; text-align: center;"><img border="0" data-original-height="571" data-original-width="979" height="371" src="https://1.bp.blogspot.com/-WRaRJXxGUAk/XmIQyKZ1T5I/AAAAAAAADtc/WZohCm8De20K_FRn6Fs63yIgNmWrPGi8ACLcBGAsYHQ/s640/python1.png" width="640" /></a><br />
<br />
เมื่อติดตั้งทุกอย่างเสร็จเรียบร้อย<br />
ให้ทำการเปิดโปรแกรม Python Shell ขึ้นมาโดยพิมพ์ IDLE ที่ช่อง Search ของ Windows ดังภาพ<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://1.bp.blogspot.com/-K-l3sRNHvnY/XmIRnc7JNOI/AAAAAAAADtk/ca-UFKTGxOcD-EJ8OdMQWYdWA1NIxv5VQCLcBGAsYHQ/s1600/python2.png" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img border="0" data-original-height="677" data-original-width="829" height="326" src="https://1.bp.blogspot.com/-K-l3sRNHvnY/XmIRnc7JNOI/AAAAAAAADtk/ca-UFKTGxOcD-EJ8OdMQWYdWA1NIxv5VQCLcBGAsYHQ/s400/python2.png" width="400" /></a></div>
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
เมื่อเปิด Python Shell ขึ้นมาแล้ว ให้ไปคลิกเลือกเมนู File -> New File จากนั้นป้อนคำสั่งทดสอบการติดต่อฐานข้อมูล<br />
<br />
import pyodbc<br />
conn = pyodbc.connect('Driver={SQL Server};'<br />
'Server=ชื่อ Server ของ SQL Server;'<br />
'Database=ชื่อฐานข้อมูล;'<br />
'Trusted_Connection=yes;')<br />
<br />
cursor = conn.cursor()<br />
cursor.execute('SELECT * FROM [ชื่อตาราง]')<br />
<br />
for row in cursor:<br />
print(row)<br />
<br />
หมายเหตุ ให้ทำการแก้ไขชื่อ Server และชื่อของตารางตามต้องการ<br />
<br />
จากนั้นไปที่เมนู Run -> Run Module<br />
<br />
ถ้าทำสำเร็จจะได้ข้อมูลดังภาพประกอบ<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://1.bp.blogspot.com/-SwXu9n4gje8/XmITOSJa_CI/AAAAAAAADtw/OIhXk8fP1rU2YUa5q6_66FlRAAbLAMGsgCLcBGAsYHQ/s1600/python3.png" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img border="0" data-original-height="634" data-original-width="699" height="362" src="https://1.bp.blogspot.com/-SwXu9n4gje8/XmITOSJa_CI/AAAAAAAADtw/OIhXk8fP1rU2YUa5q6_66FlRAAbLAMGsgCLcBGAsYHQ/s400/python3.png" width="400" /></a></div>
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
สำหรับการติดต่อกับฐานข้อมูล SQL Server ด้วยภาษา Python ผ่าน Pyodbc ก็ขอจบไว้เพียงเท่านี้<br />
<br />
ปีนี้หนักหนา Covid-19 ขอให้ผ่านไป ประเทศไทยรอดพ้นวิกฤติ<div class="blogger-post-footer">สงวนลิขสิทธิ์ ห้ามนำไปเผยแพร่ก่อนได้รับอนุญาติ</div>เกษม กมลชัยพิสิฐhttp://www.blogger.com/profile/03223085345729627028noreply@blogger.com2tag:blogger.com,1999:blog-2343321804163472494.post-26024403347815700612020-01-11T07:53:00.002+07:002020-01-11T08:12:33.726+07:00Driver Thermal Receipt Printer HOiNDriver Thermal Receipt Printer HOiN <br/><br/>
<a href="https://1drv.ms/u/s!AnOzBJhrun8triFYqfsQ5MwUChO_?e=vkPev2"><h2>Click Download</h2>
<img width="150 px" src="https://i.ebayimg.com/images/g/KCYAAOSwIuRdgvEd/s-l1600.jpg"/><br/>
</a>
<br/><div class="blogger-post-footer">สงวนลิขสิทธิ์ ห้ามนำไปเผยแพร่ก่อนได้รับอนุญาติ</div>เกษม กมลชัยพิสิฐhttp://www.blogger.com/profile/03223085345729627028noreply@blogger.com0tag:blogger.com,1999:blog-2343321804163472494.post-50776993518035383172019-11-30T00:51:00.002+07:002021-09-04T16:05:09.787+07:00Windows : Install new Fontการติดตั้งฟอนต์ทำได้หลายวิธี แต่ในบทความนี้จะนำเสนอการเพิ่มฟอนต์ด้วยคำสั่ง โดยการเขียนเก็บไว้ในไฟล์ .cmd โดยเขียนคำสั่งดังนี้<br />
<br />
1. ใช้ Text Editor สร้างไฟล์ชื่อ AddFont.cmd<br />
2. ป้อนคำสั่งดังนี้<br />
<br />
AddFont.cmd
<form>
<textarea cols="80" onclick="select()" readonly="" rows="12" style="height: 221px; margin: 0px; width: 582px;">@ECHO OFF
REM -- Install font into Windows system font.
ECHO Installing font....
XCOPY d:\yourFontFile.ttf %systemroot%\fonts /Y
ECHO %errorlevel%
TIMEOUT /T 5
ECHO Perform add font registry.....
REG ADD "HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Fonts" /v "yourFontFile" /t REG_SZ /d "yourFontFile.ttf" /f
ECHO %errorlevel%
TIMEOUT /T 5
</textarea>
</form>
<br /><div class="blogger-post-footer">สงวนลิขสิทธิ์ ห้ามนำไปเผยแพร่ก่อนได้รับอนุญาติ</div>เกษม กมลชัยพิสิฐhttp://www.blogger.com/profile/03223085345729627028noreply@blogger.com0tag:blogger.com,1999:blog-2343321804163472494.post-53762933205433814902019-11-16T13:24:00.004+07:002019-11-16T13:43:00.952+07:00Visual FoxPro : แจกหนังสือ Visual FoxPro<b><span style="font-size: x-large;">ห</span></b>นังสือ Visual FoxPro เล่มนี้ผู้เขียนได้เขียนไว้ตั้งแต่ปี 2543 จัดพิมพ์และจำหน่ายจนหมดแล้ว ถึงแม้ว่าโปรแกรมจะเก่าแต่ขอบอกว่าทำงานได้จนถึงทุกวันนี้ และก็ยังสามารถทำงานได้กับ Windows 10 ไปอีกยาวนาน เขียนโปรแกรมเก็บข้อมูล dbf file หรือจะติดต่อกับฐานข้อมูล SQL Server, MySQL, ORACLE และอื่น ๆ ได้อย่างง่ายดาย (หนังสือเล่มนี้ไม่ได้กล่าวถึงฐานข้อมูลที่เป็น Database Server)
<br />
หวังว่าผู้ที่เข้ามาศึกษาคงได้รับประโยชน์ และช่วยกันสร้างสรรค์โปรแกรมให้คนใช้งานกันเยอะ ๆ<br />
<br />
<a href="https://1drv.ms/b/s!AnOzBJhrun8trHPeeMeHwxxZz1n9?e=KmxVjI">
<b>ดาวน์โหลดหนังสือ คลิกที่นี่</b>
<br />
</a><br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://1drv.ms/b/s!AnOzBJhrun8trHPeeMeHwxxZz1n9?e=bThXX5" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;" target="_blank"></a></div>
<div>
<a href="https://1drv.ms/b/s!AnOzBJhrun8trHPeeMeHwxxZz1n9?e=bThXX5" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;" target="_blank"><img alt="https://1drv.ms/b/s!AnOzBJhrun8trHPeeMeHwxxZz1n9?e=bThXX5" border="0" data-original-height="233" data-original-width="217" height="200" src="https://1.bp.blogspot.com/-yBRut4bCCkg/Xc-WANI-nvI/AAAAAAAADrA/YAK3eZFXHdIXCNQ5m_lswLrMi5XdHOsuQCLcBGAsYHQ/s200/foxpro.png" width="186" /></a></div>
<div>
<a href="https://1drv.ms/b/s!AnOzBJhrun8trHPeeMeHwxxZz1n9?e=bThXX5" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;" target="_blank"><br /></a></div>
<div>
<a href="https://1drv.ms/b/s!AnOzBJhrun8trHPeeMeHwxxZz1n9?e=bThXX5" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;" target="_blank"></a></div>
<div class="separator" style="clear: both; text-align: left;">
<p>ท่านสามารถบริจาคสมทบทุนช่วยเหลือใครที่ไหนก็ได้ตามกำลังศรัทธา ได้บุญร่วมกัน</p>
</div>
<br />
<br /><div class="blogger-post-footer">สงวนลิขสิทธิ์ ห้ามนำไปเผยแพร่ก่อนได้รับอนุญาติ</div>เกษม กมลชัยพิสิฐhttp://www.blogger.com/profile/03223085345729627028noreply@blogger.com3tag:blogger.com,1999:blog-2343321804163472494.post-23862901684003336962019-11-05T06:34:00.001+07:002019-11-05T13:44:41.620+07:00SQL Server - Edit Top 200 Rows - How to Edit Data in Result Grid <span style="font-size: x-large;"><b>ก</b></span>ารแก้ไขข้อมูลภายใต้ SQL Server Management Studio ด้วย Edit Top 200 Rows เราก็จะเห็นข้อมูลแสดงออกมาในกริด และแก้ไขได้เฉพาะ 200 แถวแรกเท่านั้น แต่ถ้าต้องการเปลี่ยนเงื่อนไขในการแสดงผลข้อมูลตามที่ต้องการ ก็สามารถทำได้ไม่ยาก ดังนี้<br />
<br />
ให้ทำการเลือกตารางที่ต้องการแก้ไข โดยคลิกเมาส์ปุ่มขวาที่ตาราง จากนั้นเลือก Edit Top 200 Rows<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
</div>
<a href="https://1.bp.blogspot.com/-6DILpaW9iKw/XcCvuMqYtdI/AAAAAAAADn0/A7-qUhdJkVUiqNtVMH19sza3-Ma7_uR9QCLcBGAsYHQ/s1600/SQL01.png" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img border="0" data-original-height="425" data-original-width="426" height="318" src="https://1.bp.blogspot.com/-6DILpaW9iKw/XcCvuMqYtdI/AAAAAAAADn0/A7-qUhdJkVUiqNtVMH19sza3-Ma7_uR9QCLcBGAsYHQ/s320/SQL01.png" width="320" /></a>
<br />
<div class="separator" style="clear: both; text-align: left;">
สำรวจว่ามี Toolbars ชื่อ Query Designer แสดงอยู่บนหน้าจอหรือไม่</div>
โดยไปคลิกเลือกเมนู View -> Toolbars แล้วดูว่าหน้ารายการ Query Designer มีเครื่องหมายถูกอยู่ด้านหน้าหรือไม่ (ถ้าไม่มีให้คลิกเลือก)<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://1.bp.blogspot.com/-OMy20jyUvR0/XcCxCkMH_cI/AAAAAAAADoA/0n_Vu_UHPkUHsQDBa1hgWlt7y1uVgdmhwCLcBGAsYHQ/s1600/SQL02.png" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img border="0" data-original-height="518" data-original-width="582" height="284" src="https://1.bp.blogspot.com/-OMy20jyUvR0/XcCxCkMH_cI/AAAAAAAADoA/0n_Vu_UHPkUHsQDBa1hgWlt7y1uVgdmhwCLcBGAsYHQ/s320/SQL02.png" width="320" /></a></div>
<div class="separator" style="clear: both; text-align: left;">
จะปรากฎ Toolbars ของ Query Designer </div>
<br />
<u>วิธีที่ 1</u> สำหรับผู้ที่ชอบใช้คำสั่ง SQL<br />
ให้คลิกเลือกปุ่ม SQL (Show SQL Pane) จากนั้นทำการเพิ่มเงื่อนไขในการแสดงข้อมูลที่ต้องการแก้ไข เช่น WHERE Title = 'Ms.' แล้วกดปุ่ม Ctrl R เพื่อแสดงผลข้อมูล แล้วทำการเข้าไปแก้ข้อมูลในกริดตามต้องการ<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://1.bp.blogspot.com/-FeDiUkXrrq8/XcCyx2-97fI/AAAAAAAADoM/5PXHzWA3L2QH_Ecd90ugbQJEXT9m2XL5gCLcBGAsYHQ/s1600/SQL03.png" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img border="0" data-original-height="463" data-original-width="1110" height="165" src="https://1.bp.blogspot.com/-FeDiUkXrrq8/XcCyx2-97fI/AAAAAAAADoM/5PXHzWA3L2QH_Ecd90ugbQJEXT9m2XL5gCLcBGAsYHQ/s400/SQL03.png" width="400" /></a></div>
<div class="separator" style="clear: both; text-align: left;">
<u>วิธีที่ 2</u></div>
ให้คลิกเลือกปุ่ม Show Criteria Pane จะปรากฎหน้าต่างให้เราสามารถกำหนดเงื่อนไขแบบไม่ต้องเขียนคำสั่ง ดังภาพ<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://1.bp.blogspot.com/-_B6YPu3afGQ/XcC1WNO_yfI/AAAAAAAADoY/qteXGaDMlNIgJQTjXupnkcHlR003Pa8AQCLcBGAsYHQ/s1600/SQL04.png" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img border="0" data-original-height="548" data-original-width="1104" height="197" src="https://1.bp.blogspot.com/-_B6YPu3afGQ/XcC1WNO_yfI/AAAAAAAADoY/qteXGaDMlNIgJQTjXupnkcHlR003Pa8AQCLcBGAsYHQ/s400/SQL04.png" width="400" /></a></div>
<div class="separator" style="clear: both; text-align: left;">
สวัสดีวันหยุดพิเศษ ประชุมอาเซียนซัมมิท</div>
<div class="blogger-post-footer">สงวนลิขสิทธิ์ ห้ามนำไปเผยแพร่ก่อนได้รับอนุญาติ</div>เกษม กมลชัยพิสิฐhttp://www.blogger.com/profile/03223085345729627028noreply@blogger.com0tag:blogger.com,1999:blog-2343321804163472494.post-54351100352700704962019-05-11T13:21:00.003+07:002019-11-05T11:28:43.916+07:00SQL Server - CTE Recursive Query<span style="font-size: x-large;">ตั้</span>งแต่ SQL Server 2005 เป็นต้นมา ได้มีการนำ CTE (Common Table Expression's) เข้ามาสริม ซึ่ง CTE ถ้าจะเปรียบก็เหมือนกับตารางชั่วคราวตัวนึง ซึ่งสามารถนำไปทำอะไรได้เยอะ สิ่งนึงที่เป็นความสามารถของ CTE คือการทำรีเคอซีฟ (recursive) ตัวมันเองเรียกตัวมันเอง ดังนั้นตารางใดที่มีการต้องคิวรีเพื่อหาข้อมูลตัวมันเองซ้ำไปซ้ำมานั้นแหละ CTE เหมาะสุด<br />
หลายท่านคงงง แล้วจะใช้งานได้อย่างไร ?<br />
เพื่อให้เห็นภาพ ขอยกตัวอย่างข้อมูลสายการบังคับบัญชาของหน่วยงาน โดยการสร้างตารางเก็บข้อมูลตำแหน่งงาน ด้วยคำสั่ง ดังนี้<br />
<br />
CREATE TABLE [dbo].[tblPosition](<br />
<span style="white-space: pre;"> </span>[PositionID] [nchar](10) NOT NULL PRIMARY KEY,<br />
<span style="white-space: pre;"> </span>[Description] [nvarchar](100) NULL,<br />
<span style="white-space: pre;"> </span>[DependOn] [nchar](10) NULL<br />
);<br />
GO<br />
<br />
ทำการเพิ่มข้อมูลตำแหน่งงาน และสายการบังคับบัญชา ดังนี้<br />
<br />
INSERT INTO tblPosition VALUES('00000', 'President', NULL);<br />
INSERT INTO tblPosition VALUES('10000', 'Managing Director', '00000');<br />
INSERT INTO tblPosition VALUES('11000', 'Account Manager', '10000');<br />
INSERT INTO tblPosition VALUES('12000', 'Marketing Manager', '10000');<br />
INSERT INTO tblPosition VALUES('13000', 'IT Manager', '10000');<br />
INSERT INTO tblPosition VALUES('11001', 'Accountant', '11000');<br />
INSERT INTO tblPosition VALUES('12001','Marketing Representative','12000');<br />
INSERT INTO tblPosition VALUES('13001', 'System Analyst', '13000');<br />
INSERT INTO tblPosition VALUES('13002', 'Senior Programmer', '13000');<br />
INSERT INTO tblPosition VALUES('13003', 'Programmer', '13000');<br />
<br />
เมื่อเราเรียกแสดงข้อมูลด้วยคำสั่ง SELECT * FROM tblPosition จะได้ข้อมูลดังภาพ<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://2.bp.blogspot.com/-VtADE5P0BIk/XNZZCu-nWdI/AAAAAAAADd8/yP26u203FvsRzsGLY1Kb7wPmrmX6PJZQACLcBGAs/s1600/sql01.png" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img border="0" data-original-height="230" data-original-width="354" src="https://2.bp.blogspot.com/-VtADE5P0BIk/XNZZCu-nWdI/AAAAAAAADd8/yP26u203FvsRzsGLY1Kb7wPmrmX6PJZQACLcBGAs/s1600/sql01.png" /></a></div>
<div class="separator" style="clear: both; text-align: left;">
ถ้าหากเราต้องการแสดงโครงสร้างตามลำดับขั้นของตำแหน่งต่าง ๆ ว่าตำแหน่งใดอยู่ภายใต้ตำแหน่งใด เราสามารถเขียนคำสั่งคิวรีโดยอาศัย CTE ได้ดังนี้<br />
<br />
WITH CTE (DependOn, PositionID, [Description], LevelNumber)<br />
AS (<br />
<span style="white-space: pre;"> </span>SELECT DependOn, PositionID, [Description], 1 LevelNumber<br />
<span style="white-space: pre;"> </span> FROM tblPosition WHERE DependOn IS NULL<br />
<span style="white-space: pre;"> </span>UNION ALL<br />
<span style="white-space: pre;"> </span>SELECT E.DependOn, E.PositionID, E.[Description], LevelNumber + 1 AS LevelNumber<br />
<span style="white-space: pre;"> </span> FROM tblPosition E<br />
<span style="white-space: pre;"> </span>INNER JOIN CTE ON E.DependOn=CTE.PositionID<br />
)<br />
<span style="white-space: pre;"> </span>SELECT * FROM CTE ORDER BY PositionID, LevelNumber;<br />
<br />
เมื่อเรียกคำสั่งข้างต้น จะปรากฎข้อมูลดังภาพ<br />
</div>
<div class="separator" style="clear: both; text-align: center;">
</div>
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://2.bp.blogspot.com/--f4q0twm0BA/XNZodLnOVxI/AAAAAAAADeU/z-svaV4LQkw66bcKoQkgmCLL_OynkgSZwCLcBGAs/s1600/sql01.png" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img border="0" data-original-height="227" data-original-width="441" src="https://2.bp.blogspot.com/--f4q0twm0BA/XNZodLnOVxI/AAAAAAAADeU/z-svaV4LQkw66bcKoQkgmCLL_OynkgSZwCLcBGAs/s1600/sql01.png" /></a></div>
<div class="separator" style="clear: both; text-align: left;">
จากภาพจะเห็นว่ามีคอลัมน์ LevelNumber ปรากฎขึ้นมา ซึ่งจะแสดงถึงระดับของตำแหน่ง เช่น President อยู่ Level ที่ 1 ส่วน Programmer อยู่ Level ที่ 4 เป็นต้น<br />
<br />
<u>หมายเหตุ </u><br />
<i>WITH CTE (DependOn, PositionID, [Description], LevelNumber)</i><br />
เป็นการประกาศตารางชั่วคราวชื่อ CTE และภายใต้ตารางนี้มีคอลัมน์ต่าง ๆ ประกอบด้วย DependOn, PositionID, [Description], LevelNumber<br />
<br />
จากตัวอย่างข้างต้น อาจจะเห็นภาพไม่ชัด ถ้าเราต้องการแสดงรายละเอียดของตำแหน่งที่ขึ้นตรงเป็นลำดับขั้นออกมาด้วย ก็สามารถทำได้โดยใช้คำสั่ง ดังนี้<br />
<br />
WITH CTE(PositionID, [Narration], [Description], LevelNumber ,DependOn)<br />
AS (<br />
<span style="white-space: pre;"> </span>SELECT PositionID, CONVERT(nvarchar(max) ,[Description]) AS [Narration], [Description],<br />
<span style="white-space: pre;"> </span> 1 AS LevelNumber, DependOn<br />
<span style="white-space: pre;"> </span> FROM tblPosition WHERE DependOn IS NULL<br />
<span style="white-space: pre;"> </span>UNION ALL<br />
<span style="white-space: pre;"> </span>SELECT E.PositionID, CONVERT(nvarchar(max) ,REPLICATE(SPACE(2), LevelNumber) + E.[Description]) AS [Narration],<br />
<span style="white-space: pre;"> </span> E.[Description], LevelNumber + 1 AS LevelNumber, E.DependOn<br />
<span style="white-space: pre;"> </span> FROM tblPosition E<br />
<span style="white-space: pre;"> </span>INNER JOIN CTE ON E.DependOn=CTE.PositionID<br />
<span style="white-space: pre;"> </span>)<br />
<span style="white-space: pre;"> </span>SELECT * FROM CTE ORDER BY PositionID, LevelNumber;<br />
<br />
เมื่อเรียกคำสั่งข้างต้นจะได้ผลลัพธ์ดังภาพ<br />
<br />
</div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://1.bp.blogspot.com/-j59yE67a5TA/XNZpZtgKYdI/AAAAAAAADec/YA0vx2gsVokhPQgqi41sVS5w-6TpTnkIgCLcBGAs/s1600/sql02.png" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img border="0" data-original-height="227" data-original-width="615" src="https://1.bp.blogspot.com/-j59yE67a5TA/XNZpZtgKYdI/AAAAAAAADec/YA0vx2gsVokhPQgqi41sVS5w-6TpTnkIgCLcBGAs/s1600/sql02.png" /></a></div>
<div class="separator" style="clear: both; text-align: left;">
จากตัวอย่างที่แสดงมาทั้งหมด ลองทำความเข้าใจซึ่งไม่ยากจนเกินไปนัก เราสามารถนำไปประยุกต์ในการแสดงผลอย่างอื่นได้อีก เช่น ผังบัญชี พนักงานที่อยู่ภายใต้หัวหน้า เป็นต้น<br />
<br />
แต่จากทั้ง 2 ตัวอย่างข้างต้น ยังมีข้อผิดพลาดอยู่ ซึ่งผู้เขียนตั้งใจให้มันเกิด<br />
ติ๊ก ต๊อก ติ๊ก ต๊อก หาดูว่าผิดตรงไหน<br />
<br />
บอกเลยดีกว่า ผิดตรงการเรียงลำดับ ถ้ากรณีเราตั้งรหัส PositionID สะเปะสะปะ การเรียงลำดับจะทำให้มั่ว ดังนั้น หากต้องการจัดลำดับที่ถูกต้อง จำเป็นต้องเพิ่มคอลัมน์ภายใต้ CTE ขึ้นมาอีก 1 คอลัมน์ แล้วเขียนคำสั่ง ตามตัวอย่าง แล้วลองเรียกใช้งานดู<br />
<br />
WITH CTE(PositionID, [Narration], [Description], LevelNumber ,DependOn, <span style="color: red;">Trace</span>)<br />
AS (<br />
<span style="white-space: pre;"> </span>SELECT PositionID, CONVERT(nvarchar(max) ,[Description]) AS [Narration], [Description],<br />
<span style="white-space: pre;"> </span> 1 AS LevelNumber, DependOn , <span style="color: red;">CONVERT(nvarchar(max),PositionID) AS Trace</span><br />
<span style="white-space: pre;"> </span> FROM tblPosition WHERE DependOn IS NULL<br />
<span style="white-space: pre;"> </span>UNION ALL<br />
<span style="white-space: pre;"> </span>SELECT E.PositionID, CONVERT(nvarchar(max) ,REPLICATE(SPACE(2), LevelNumber) + E.[Description]) AS [Narration],<br />
<span style="white-space: pre;"> </span> E.[Description], LevelNumber + 1 AS LevelNumber, E.DependOn ,<br />
<span style="white-space: pre;"> </span> <span style="color: red;">CONVERT(nvarchar(max),CTE.Trace + E.PositionID) AS Trace</span><br />
<span style="white-space: pre;"> </span> FROM tblPosition E<br />
<span style="white-space: pre;"> </span> INNER JOIN CTE ON E.DependOn=CTE.PositionID<br />
<span style="white-space: pre;"> </span>)<br />
<span style="white-space: pre;"> </span>SELECT * FROM CTE ORDER BY Trace;<br />
<br />
ผลจากการปรับคำสั่งข้างต้น จะได้ผลลัพธ์ออกมาดังภาพ<br />
<br />
</div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://3.bp.blogspot.com/-Lne2v_t17ts/XNZxEAshlrI/AAAAAAAADeo/_xHqX14jt_0mM508IrYXrsfdGlWtZj3aACLcBGAs/s1600/sql03.png" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img border="0" data-original-height="228" data-original-width="816" src="https://3.bp.blogspot.com/-Lne2v_t17ts/XNZxEAshlrI/AAAAAAAADeo/_xHqX14jt_0mM508IrYXrsfdGlWtZj3aACLcBGAs/s1600/sql03.png" /></a></div>
<div class="separator" style="clear: both; text-align: left;">
จะเห็นว่าคอลัมน์ Trace จะทำการจัดเก็บข้อมูลรหัสที่อยู่ก่อนหน้าไว้ทั้งหมด ซึ่งเราจะใช้ข้อมูลนี้มาทำการจัดเรียงเพื่อให้การแสดงผลข้อมูลถูกต้อง<br />
<br />
แค่ตาราง tblPosition เพียงตารางเดียว ทำไมมันช่างงงงวย วกวนเช่นนี้ ทาเกชิ สู้ ๆ<br />
<br />
ยุคสมัยเปลี่ยนไปเดี๋ยวทำงานที่ไหนก็ได้ <span style="font-size: large;"><span style="color: red;">โชค</span></span>ดี = (โชค + อธิบดี) มีเงินใช้<br />
<br />
เพื่อนผมชื่อ<span style="font-size: large;">โชค</span> ครับ ย้ำ <span style="color: red;">โชค</span> นะครับ<br />
<br />
</div><div class="blogger-post-footer">สงวนลิขสิทธิ์ ห้ามนำไปเผยแพร่ก่อนได้รับอนุญาติ</div>เกษม กมลชัยพิสิฐhttp://www.blogger.com/profile/03223085345729627028noreply@blogger.com0tag:blogger.com,1999:blog-2343321804163472494.post-53855298202601477572019-03-21T10:50:00.001+07:002019-03-21T13:56:01.474+07:00SQL Server - Identity Column<span style="font-family: "th sarabunpsk" , sans-serif;"><b><span style="font-size: x-large;">I</span></b><span style="font-size: 15pt;">DENTITY </span><span lang="TH" style="font-size: 15pt;">เป็นคุณสมบัติหนึ่งของคอลัมน์ ที่มีเก็บข้อมูลประเภทตัวเลข ได้แก่ประเภท</span><span lang="TH" style="font-size: 15pt;"> </span><span style="font-size: 15pt;">int,
tinyint, smallint, bigint, decimal</span><span lang="TH" style="font-size: 15pt;"> และ </span><span style="font-size: 15pt;">numeric หากเราต้องการกำหนดค่าของคอลัมน์ Identity ให้เป็นคีย์ควรกำหนด</span><span lang="TH" style="font-size: 15pt;">ข้อมูลเป็นตัวเลขจำนวนเต็ม ซึ่งเราจะนิยมใช้อยู่ 2 ประเภท คือ </span><span style="font-size: 15pt;">int</span><span lang="TH" style="font-size: 15pt;"> หรือ </span><span style="font-size: 15pt;">bigint</span><span lang="TH" style="font-size: 15pt;"> </span><span style="font-size: 15pt;"> เมื่อกำหนดแล้ว </span><span lang="TH" style="font-size: 15pt;">โดยคุณสมบัติของคอลัมน์นี้จะเป็นการสร้างเลขลำดับแบบอัตโนมัติทันทีเมื่อมีการเพิ่มแถวของข้อมูลเข้าสู่ตาราง (อาจเพิ่มข้อมูลจะสำเร็จหรือไม่สำเร็จก็ได้)</span></span><br />
<span style="font-family: "th sarabunpsk" , sans-serif;"><span lang="TH" style="font-size: 15pt;"><b><u>ตัวอย่าง</u></b> การสร้างคอลัมน์ Identity ชื่อ row_id ให้กับตาราง product</span></span><br />
<div class="MsoNormal" style="line-height: 16.0pt; mso-line-height-rule: exactly; text-align: justify;">
<span style="font-family: "th sarabunpsk" , "sans-serif"; font-size: 15.0pt;">CREATE
TABLE product<o:p></o:p></span></div>
<div class="MsoNormal" style="line-height: 16.0pt; mso-line-height-rule: exactly; text-align: justify;">
<span style="font-family: "th sarabunpsk" , "sans-serif"; font-size: 15.0pt;"><span style="mso-tab-count: 1;"> </span>(row_id big</span><span style="font-family: "th sarabunpsk" , sans-serif; font-size: 20px;">int NOT NULL IDENTITY(1,1) PRIMARY KEY , </span><span style="font-family: "th sarabunpsk" , "sans-serif"; font-size: 15.0pt;"><br /><o:p></o:p></span></div>
<div class="MsoNormal" style="line-height: 16.0pt; mso-line-height-rule: exactly; text-align: justify; text-indent: 36.0pt;">
<span style="font-family: "th sarabunpsk" , "sans-serif"; font-size: 15.0pt;"><span style="mso-spacerun: yes;"> </span>product_code <span style="mso-tab-count: 1;"> </span><span lang="TH"><span style="mso-tab-count: 1;"> n</span></span>varchar(20) NOT
NULL ,<o:p></o:p></span></div>
<div class="MsoNormal" style="line-height: 16.0pt; mso-line-height-rule: exactly; text-align: justify; text-indent: 36.0pt;">
<span style="font-family: "th sarabunpsk" , "sans-serif"; font-size: 15.0pt;"><span style="mso-spacerun: yes;"> </span>product_name <span style="mso-tab-count: 1;"> n</span>varchar(100),<o:p></o:p></span></div>
<div class="MsoNormal" style="line-height: 16.0pt; margin-left: 36.0pt; mso-line-height-rule: exactly; text-align: justify;">
<span style="font-family: "th sarabunpsk" , "sans-serif"; font-size: 15.0pt;"><span style="mso-spacerun: yes;"> </span>product_type<span style="mso-tab-count: 1;"> </span><span lang="TH"><span style="mso-tab-count: 1;"> n</span></span>varchar(10),<span style="mso-spacerun: yes;"> </span><o:p></o:p></span></div>
<div class="MsoNormal" style="line-height: 16.0pt; margin-left: 36.0pt; mso-line-height-rule: exactly; text-align: justify;">
<span style="font-family: "th sarabunpsk" , "sans-serif"; font-size: 15.0pt;"><span style="mso-spacerun: yes;"> </span>um<span style="mso-tab-count: 2;"> </span><span lang="TH"><span style="mso-tab-count: 1;"> n</span></span>varchar(20),<o:p></o:p></span></div>
<div class="MsoNormal" style="line-height: 16.0pt; margin-left: 36.0pt; mso-line-height-rule: exactly; text-align: justify;">
<span style="font-family: "th sarabunpsk" , "sans-serif"; font-size: 15.0pt;"><span style="mso-spacerun: yes;"> </span>sale_price<span style="mso-tab-count: 1;"> </span><span lang="TH"><span style="mso-tab-count: 1;"> </span></span>money)</span><br />
<br /></div>
<span style="font-family: "th sarabunpsk" , sans-serif;"><span style="font-size: 20px;">CREATE UNIQUE INDEX product_product_code ON product (product_code)</span></span><br />
<span style="font-family: "th sarabunpsk" , sans-serif;"><span style="font-size: 20px;"><br /></span></span>
<span lang="TH" style="font-family: "th sarabunpsk" , sans-serif; font-size: 15pt;">หลายท่านสงสัย ทำไมถึงต้องมี row_id ที่เป็น identity และทำเป็น PK ทั้ง ๆ ที่ มี product_code ที่เป็นรหัสสินค้าที่ไม่ซ้ำกันซึ่งสามารถทำเป็น primary key ได้อยู่แล้ว ผู้เขียนเลี่ยงจะไปทำเป็น unique ให้กับรหัส product_code แทน ด้วยเหตุผลทางด้านความเร็ว</span><br />
<span lang="TH" style="font-family: "th sarabunpsk" , sans-serif; font-size: 15pt;"><b><br /></b></span>
<span lang="TH" style="font-family: "th sarabunpsk" , sans-serif; font-size: 15pt;"><b>แล้วมันเอาไปทำอะไรได้บ้าง </b> </span><br />
<span lang="TH" style="font-family: "th sarabunpsk" , sans-serif; font-size: 15pt;"><br /></span>
<span lang="TH" style="font-family: "th sarabunpsk" , sans-serif; font-size: 15pt;">1. เอาไปทำลำดับของข้อมูลอันไหนเกิดก่อนหลัง </span><br />
<span lang="TH" style="font-family: "th sarabunpsk" , sans-serif; font-size: 15pt;">2. เอาไปทำเป็นคีย์ ใช้เวลาปรับปรุงข้อมูล ลบข้อมูล "คงสงสัย อ้าวมันก็มี product_code อยู่แล้ว แล้วจะใช้ row_id ทำไม" มาดูตัวอย่าง เช่น </span><br />
<span lang="TH" style="font-family: "th sarabunpsk" , sans-serif; font-size: 15pt;"> เราเลือกข้อมูลมารายการมา 1 รายการ เช่น product_code = '000001'<br /> DECLARE @ROW_ID int ;</span><br />
<span style="font-family: "th sarabunpsk" , sans-serif; font-size: 15pt;"> SELECT <span style="color: red;"><b>@ROW_ID = row_id </b></span>, * FROM product WHERE product_code = '000001'</span><br />
<span lang="TH" style="font-family: "th sarabunpsk" , sans-serif; font-size: 15pt;"> เก็บ row_id ไว้ในตัวแปร @ROW_ID (ถ้าเขียนโปรแกรมก็เก็บและเรียกใช้ ก็แนว ๆ นี้แหละ)<br /> เวลาจะปรับปรุง หรือลบ ก็ใช้ row_id มาใช้ได้เลย ทำให้เราสามารถหลับหูหลับตาใช้เงื่อนไข where row_id เดิม ๆ ในการปรับปรุงได้กับทุก ๆ ตาราง<br /> UPDATE SET product_code = '000002' , product_name = 'KKKK' <b><span style="color: red;">WHERE row_id = @ROW_ID</span></b><br />ไม่ว่าจะใช้ตารางใด ๆ ก็ตาม เราไม่ต้องไปสนใจกับรหัสต่าง ๆ ที่เราตั้งขึ้นมา ก็ใช้ row_id ที่เป็น identity ได้เลยสะดวกดี</span><br />
<span lang="TH" style="font-family: "th sarabunpsk" , sans-serif; font-size: 15pt;">3. เลื่อนข้อมูลทีละรายการ ก็ใช้ได้<br /> </span><span style="font-family: "th sarabunpsk" , sans-serif; font-size: 20px;">DECLARE @ROW_ID int ;<br /> SET @ROW_ID = 0;<br /> --- เริ่มอ่านจาก @ROW_ID แรก<br /> SELECT TOP 1 @ROW_ID = row_id , * FROM product WHERE row_id > @ROW_ID<br /> -- อ่านรายการต่อไป และต่อ ๆ ไป ก็เขียนเช่นเดิม ตามลำดับก่อนหลัง</span><span style="font-family: "th sarabunpsk" , sans-serif; font-size: 20px;"> SELECT TOP 1 @ROW_ID = row_id , * FROM product WHERE row_id > @ROW_ID<br />4. ช่วยให้ข้อมูลเป็นเอกลักษณ์ บางตาราง อาจจะมีข้อมูลรายการซ้ำกันทุกคอลัมน์ SQL SERVER จะงงทำไม่ได้เมื่อมีการปรับปรุงข้อมูล เราก็เอา Identity คอลัมน์มาช่วยได้</span><br />
<span style="font-family: "th sarabunpsk" , sans-serif; font-size: 20px;">5. และอื่น ๆ ตามที่อยากทำและนำไปใช้<br /><br /><b>ข้อระวัง</b></span><br />
<span style="font-family: "th sarabunpsk" , sans-serif; font-size: 20px;"><br /></span>
<span style="font-family: "th sarabunpsk" , sans-serif; font-size: 20px;">สิ่งที่ต้องระวัง เคยเห็นบางระบบ เอา Identity คอลัมน์ไปทำ เป็น Key เพื่อเชื่อมโยงไปยังตารางอื่น (PK -> FK) ไม่ควรทำเป็นอย่างยิ่ง ถ้าจะใช้ให้ตั้งเป็นรหัส เช่น product_code แล้วเอาไปเชื่อมโยงแทน เวลาเกิดปัญหาถ้าคนอื่นมาทำต่อ หรือมาจัดการข้อมูลโดยไม่ทราบว่ามีการเชื่อมโยง แล้วหากมีการ generate Identity ใหม่ก็บรรลัยเกิด </span><br />
<span lang="TH" style="font-family: "th sarabunpsk" , sans-serif; font-size: 15pt;"><br /></span>
<span lang="TH" style="font-family: "th sarabunpsk" , sans-serif;"><span style="font-size: 15pt;">สวัสดีช่วงหน้าร้อน</span></span><br />
<span lang="TH" style="font-family: "th sarabunpsk" , sans-serif;"><a href="http://www.chulabook.com/description.asp?barcode=9789740335108" target="_blank">เนื้อหารายละเอียดสามารถอ่านได้ที่ หนังสือรอบรู้ประยุกต์ใช้ SQL Server สั่งซื้อออนไลน์ได้ที่ ศูนย์หนังสือจุฬา http://www.chulabook.com/description.asp?barcode=9789740335108</a></span><div class="blogger-post-footer">สงวนลิขสิทธิ์ ห้ามนำไปเผยแพร่ก่อนได้รับอนุญาติ</div>เกษม กมลชัยพิสิฐhttp://www.blogger.com/profile/03223085345729627028noreply@blogger.com0tag:blogger.com,1999:blog-2343321804163472494.post-14698426506692233502018-09-19T10:06:00.001+07:002019-11-05T11:29:54.926+07:00SQL Server - LIKE กับภาษาไทยเ<b><span style="font-size: x-large;">ว</span></b>ลาเราทำการคิวรีเพื่อสอบถามข้อมูลแบบไม่เจาะจง เช่น ต้องการสอบถามข้อมูลที่ขึ้นต้นด้วย "ก" ส่วนใหญ่ก็จะใช้ วลีคำสั่ง LIKE เช่น<br />
<br />
SELECT [id], [name] FROM [TESTDB].[dbo].[TABLE01] WHERE [name] LIKE "ก%"<br />
<br />
จากคำสั่งข้างต้น เราจะเห็นว่า ข้อมูลที่เป็นภาษาไทยที่ขึ้นต้นด้วย ก ก็น่าจะออกมาแสดงทั้งหมด แต่ท่านทราบไหมว่า ภาษาไทย คำว่า "เกษม" เราก็ถือว่าขึ้นต้นด้วย "ก" แต่ผลลัพธ์ของที่ได้จากคำสั่งข้างต้น กลับไม่สามารถหาคำว่า เกษม เจอ ...... คราวนี้ก็ยุ่งซิ ต้องการข้อมูลแต่กลับได้ออกมาไม่ตรง แล้วจะทำไงดี...... เราก็ต้องประยุกต์คำสั่งอื่นมาใช้แทน โดยอาศัยคำสั่ง CHARINDEX กับ COLLATE THAI_BIN มาช่วย ดังตัวอย่างตามภาพด้านล่าง<br />
<br />
<a href="https://3.bp.blogspot.com/-7a3ohlpwc8g/W6G8_CgRf_I/AAAAAAAADVI/zZhbWSoOXWgjbQoUN_3gB1Yzpx2WyIEBwCLcBGAs/s1600/sql%2B-%2Blike%2B%25E0%25B8%25A0%25E0%25B8%25B2%25E0%25B8%25A9%25E0%25B8%25B2%25E0%25B9%2584%25E0%25B8%2597%25E0%25B8%25A2.jpg" imageanchor="1" style="clear: left; display: inline !important; margin-bottom: 1em; margin-right: 1em; text-align: center;"><img border="0" data-original-height="462" data-original-width="641" height="457" src="https://3.bp.blogspot.com/-7a3ohlpwc8g/W6G8_CgRf_I/AAAAAAAADVI/zZhbWSoOXWgjbQoUN_3gB1Yzpx2WyIEBwCLcBGAs/s640/sql%2B-%2Blike%2B%25E0%25B8%25A0%25E0%25B8%25B2%25E0%25B8%25A9%25E0%25B8%25B2%25E0%25B9%2584%25E0%25B8%2597%25E0%25B8%25A2.jpg" width="640" /></a>
<br />
<div class="separator" style="clear: both; text-align: left;">
จากการทดสอบคำสั่งทั้ง 2 รูปแบบ ผลที่ได้ออกมาต่างกัน ดังนั้น หากต้องการสอบถามข้อมูลภาษาไทย ก็สามารถใช้ CHARINDEX เข้ามาช่วยได้<br />
<br />
เช่น ถ้าต้องการหาข้อความ "ก" ณ.ตำแหน่งใด ๆ ก็ได้ ให้ใช้<br />
<br />
CHARINDEX('ก',[ชื่อคอลัมน์] COLLATE THAI_BIN) > 0 <br />
<br />
หรือ ถ้าต้องการหาข้อความ "ก" ณ.ตำแหน่งเริ่มต้น ให้ใช้<br />
<br />
CHARINDEX('ก',[ชื่อคอลัมน์] COLLATE THAI_BIN) BETWEEN 1 AND 2<br />
<br />
เราสามารถนำไปประยุกต์ใช้ได้อีกหลากหลายตามต้องการ<br />
สำหรับตัวอย่างที่กล่าวมาจะไม่คำนึงถึงความเร็วในการประมวลผล แต่ต้องการค่าที่ถูกต้องและตรงกับสิ่งที่ต้องการ<br />
<br />
สวัสดี ฝนตกเยอะจริงปีนี้<br />
</div>
<div class="blogger-post-footer">สงวนลิขสิทธิ์ ห้ามนำไปเผยแพร่ก่อนได้รับอนุญาติ</div>เกษม กมลชัยพิสิฐhttp://www.blogger.com/profile/03223085345729627028noreply@blogger.com0tag:blogger.com,1999:blog-2343321804163472494.post-85626984787585557392018-06-23T12:49:00.019+07:002023-05-19T11:46:43.447+07:00PHP - การติดตั้งไดร์เวอร์ SQL Server ** ปรับปรุง 2565<br />ปกติเราจะใช้งาน PHP กับระบบฐานข้อมูล mySQL หรือ MariaDB กันเป็นส่วนใหญ่ ซึ่งตัว xampp ได้ติดตั้งไดร์เวอร์มาให้เรียบร้อย แต่องค์กรส่วนใหญ่ก็มีการใช้งานระบบฐานข้อมูลตัวอื่น เช่น SQL Server ซึ่งไดร์เวอร์ส่วนของตัวติดตั้ง Web Server ของค่าย AppServ, WAMPP หรือ XAMPP ไม่ได้จัดเตรียมไว้ให้ ดังนั้นเมื่อติดตั้ง Web Server เสร็จก็ต้องทำการติดตั้งไดร์เวอร์สำหรับ SQL Server เพิ่มเข้าไปกันเอง<div><br /></div><div>สำหรับบทความนี้ จะนำเสนอการติดตั้งบน XAMPP โดยเพิ่มไดร์เวอร์ ของ SQL Server ให้กับ PHP รุ่น 8.1 ภายใต้ระบบปฎิบัติการ Windows<br /><br /></div><div>** ขั้นตอนการติดตั้ง XAMPP / PHP 8.1 จะไม่ขอกล่าวถึง จะข้ามไปที่ขั้นตอนติดตั้งไดร์เวอร์ของ SQL Server เลย โดยมีวิธีการดังนี้</div><div><br /></div><div>1. เข้าไปที่เว็บ Micsrosft เพื่อดาวน์โหลไดร์เวอร์ SQL Server สำหรับ php โดยคลิกที่ Link ด้่านล่าง</div><div><a href="https://docs.microsoft.com/th-th/sql/connect/php/download-drivers-php-sql-server">https://docs.microsoft.com/th-th/sql/connect/php/download-drivers-php-sql-server</a></div><div><br /></div><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/a/AVvXsEi7OAKF7YiW6V4BeOwV8pDix2EVA_rEFDWPAvz-RFKcHH19P3MVZouNc6c0Y8zCF9JsyA339ZT3YFkYC7o5xYOUIkUa9wFkF1Vr4-OuVnhfldMvLN5JZM1HBsby4-2t50zyt3Z3_tJ0QPbHlE8Tqxp-mv6t1aTxIYkuUkh7FWiHrG5t3oiBEuVD-PU8=s1217" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img border="0" data-original-height="433" data-original-width="1217" height="142" src="https://blogger.googleusercontent.com/img/a/AVvXsEi7OAKF7YiW6V4BeOwV8pDix2EVA_rEFDWPAvz-RFKcHH19P3MVZouNc6c0Y8zCF9JsyA339ZT3YFkYC7o5xYOUIkUa9wFkF1Vr4-OuVnhfldMvLN5JZM1HBsby4-2t50zyt3Z3_tJ0QPbHlE8Tqxp-mv6t1aTxIYkuUkh7FWiHrG5t3oiBEuVD-PU8=w400-h142" width="400" /></a></div><div><br /><br /><br /><br /><br /><br /><br /><br /><br />เมื่อได้ zip ไฟล์มาแล้ว ให้แตก zip ไฟล์มาเก็บไว้ซักทีนึง ซึ่งเราจะเห็นไฟล์ไดร์เวอร์จำนวนมาก </div><div>งานนี้ต้องตาดีได้ตาร้ายเสีย ดูรุ่นให้ตรงกับที่เราติดตั้ง PHP</div><div><br /></div><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/a/AVvXsEhsRLpMhgNsZFgANw0ImpPx4R2-Vr-wl6vQJ1mTZ6GVYj1rmWD6drphkORcMOa7u4m2MIgk1mJIRjW7a2jzr3JMkXxiDGMYwtOkQX9f16EsjLOS1Qw0rKah1MhuoasNtjL5iiSw6NVkzqdRVQK48PxYE63JNS9coGGMyhRBvp1W3uWM68pYu84mTru9=s1326" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img border="0" data-original-height="1326" data-original-width="1118" height="400" src="https://blogger.googleusercontent.com/img/a/AVvXsEhsRLpMhgNsZFgANw0ImpPx4R2-Vr-wl6vQJ1mTZ6GVYj1rmWD6drphkORcMOa7u4m2MIgk1mJIRjW7a2jzr3JMkXxiDGMYwtOkQX9f16EsjLOS1Qw0rKah1MhuoasNtjL5iiSw6NVkzqdRVQK48PxYE63JNS9coGGMyhRBvp1W3uWM68pYu84mTru9=w338-h400" width="338" /></a></div><br /><div><br /></div><br /><div><br /></div><div><br /></div><div><br /></div><div><br /></div><div><br /></div><div><br /></div><div><br /></div><div><br /></div><div><br /></div><div><br /></div><div><br /></div><div><br /></div><div><br /></div><div><br /></div><div><br /></div><div><br /></div><div><br /></div><div><br /></div><div>การเลือกไดร์เวอร์ต้องดูตอนติดตั้ง เช่น ติดตั้ง PHP 8.1 เป็นรุ่นไหน ระหว่าง nts หรือ ts และ x86 หรือ x64 ก็ต้องเลือกไฟล์ตามนั้น โดยเปิดดู PHPInfo ดูรายละเอียดรุ่นตามภาพ</div><div><br /></div><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiEFGRHrXXedWqhu72uvvpIAQ6EcFkylskuTqjRhiECxt-hL0I0MAJ6KolRYeKjR1bSJ_jP2_gOGq5FUKHDaIQcoGJJzlB2vaIbSDIfHXCjpCkQuKoK43rymk2d1Bk39QeO7ogrPxhZ-6GN4VDupr9JPDUCMvWYpqKxYIZsvzZcX-5wGI6ATEfjIGsN/s1324/PHP_SQLSERVER.png" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img border="0" data-original-height="1047" data-original-width="1324" height="316" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiEFGRHrXXedWqhu72uvvpIAQ6EcFkylskuTqjRhiECxt-hL0I0MAJ6KolRYeKjR1bSJ_jP2_gOGq5FUKHDaIQcoGJJzlB2vaIbSDIfHXCjpCkQuKoK43rymk2d1Bk39QeO7ogrPxhZ-6GN4VDupr9JPDUCMvWYpqKxYIZsvzZcX-5wGI6ATEfjIGsN/w400-h316/PHP_SQLSERVER.png" width="400" /></a></div><br /><div><br /></div><div><br /></div><div><br /></div><div><br /></div><div><br /></div><div><br /></div><div><br /></div><div><br /></div><div><br /></div><div><br /></div><div><br /></div><div><br /></div><div><br /></div><div><br /></div><div><br /></div><div><br /></div><div>2. เมื่อเราได้ไฟล์เป้าหมายเรียบร้อย </div><div>กรณีติดตั้ง XAMPP ให้ไปที่โฟลเดอร์ C:\xampp\php\ext<br />จากนั้นให้ทำการก็อปไฟล์ไดร์เวอร์ตาม version ที่ต้องการมาใส่ได้เลย</div><div><br /></div><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/a/AVvXsEjZl_Mjnr6bm6HxguXWy8fpzsEbhT6SMQ3ktOOtI1erjNy--NKexVpNwAMs_hVcjaiKqa9UYlHPAPnJRHCHXGf4R7ZoF29rksxxtXa5HPUuedIgE12Wx7jciKkpOE7TaT3tGSYyGv72ABB0MBwATTXdCxQ-213hmdvKAMJLOX-KmZjEKPK6nozZ3tK1=s728" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img border="0" data-original-height="598" data-original-width="728" height="329" src="https://blogger.googleusercontent.com/img/a/AVvXsEjZl_Mjnr6bm6HxguXWy8fpzsEbhT6SMQ3ktOOtI1erjNy--NKexVpNwAMs_hVcjaiKqa9UYlHPAPnJRHCHXGf4R7ZoF29rksxxtXa5HPUuedIgE12Wx7jciKkpOE7TaT3tGSYyGv72ABB0MBwATTXdCxQ-213hmdvKAMJLOX-KmZjEKPK6nozZ3tK1=w400-h329" width="400" /></a></div><br /><div><br /></div><div><br /></div><div><br /></div><div><br /></div><div><br /></div><div><br /></div><div><br /></div><div><br /></div><div><br /></div><div><br /></div><div><br /></div><div><br /></div><div><br /></div><div><br /></div><div><br /></div><div><br /></div><div>* ตัวอย่าง ภาพเป็นการใช้ไฟล์ไดร์เวอร์ <br />php_pdo_sqlsrv_81_ts_x64.dll <br />php_sqlsrv_81_ts_x64.dll</div><div><br /></div><div><br /></div><div>3. ให้ไปเปิดไฟล์ php.ini ขั้นมาแก้ไข แล้วเพิ่มคำสั่งด้านล่างเข้าไป</div><div>(ไฟล์นี้เก็บอยู่ใน C:\xampp\php)</div><div><div><br /></div><div>extension=php_pdo_sqlsrv_81_ts_x64</div><div>extension=php_sqlsrv_81_ts_x64</div></div><div><br /></div><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/a/AVvXsEhgUiIkxxjd_wFGjwAryxczUSDPELfeW9Aw8jLtJ-SAtEIkwyKiA4331TXkaD7xGBljwFwnwzrGyzyIjnYn3sH9HG4UbdZIowDb5NFvQL7NWwDlHOqS8Yzp1Yvoqh2HlkQsHjnwvRhpTJmZJ6qWp4BWbQHQozy2xRUUn-HnNDGrw5ANj7xweyTq5Oa3=s1271" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img border="0" data-original-height="855" data-original-width="1271" height="269" src="https://blogger.googleusercontent.com/img/a/AVvXsEhgUiIkxxjd_wFGjwAryxczUSDPELfeW9Aw8jLtJ-SAtEIkwyKiA4331TXkaD7xGBljwFwnwzrGyzyIjnYn3sH9HG4UbdZIowDb5NFvQL7NWwDlHOqS8Yzp1Yvoqh2HlkQsHjnwvRhpTJmZJ6qWp4BWbQHQozy2xRUUn-HnNDGrw5ANj7xweyTq5Oa3=w400-h269" width="400" /></a></div><br /><div><br /></div><div><br /></div><div><br /></div><div><br /></div><div><br /></div><div><br /></div><div><br /></div><div><br /></div><div><br /></div><div><br /></div><div><br /></div><div><br /></div><div><br /></div><div><div>4. จากนั้นทำการ Restart service ของ web server ใหม่ </div><div>แล้ว เข้าไปสำรวจ phpinfo จะต้องมี pdo_sqlsrv และ sqlsrv ปรากฎอยู่<br />ถ้าไม่มี เริ่มใหม่ ดูว่าไดร์เวอร์ตรงไหม</div><div><br /></div><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/a/AVvXsEi2BlVUSx7DXt6-mnvXB_wayt55jlCat2BFkv6RuR7x_IB9JEaT9FtRpTRroQivNnv9_w9Fuauo3AG9avvIQj5moSeTIu7DuLsHayIcrYqSxBm4nQhDAwm78uMgDNX3spNLWoNaGe5cThAq02xLmEIbMTsyzQi_j0aKLo8mF4ix1rjqbDIzpRN3BgnM=s1247" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img border="0" data-original-height="1007" data-original-width="1247" height="323" src="https://blogger.googleusercontent.com/img/a/AVvXsEi2BlVUSx7DXt6-mnvXB_wayt55jlCat2BFkv6RuR7x_IB9JEaT9FtRpTRroQivNnv9_w9Fuauo3AG9avvIQj5moSeTIu7DuLsHayIcrYqSxBm4nQhDAwm78uMgDNX3spNLWoNaGe5cThAq02xLmEIbMTsyzQi_j0aKLo8mF4ix1rjqbDIzpRN3BgnM=w400-h323" width="400" /></a></div><br /><div><br /></div><div><br /></div><div><br /></div><div><br /></div><div><br /></div><div><br /></div><div><br /></div><div><br /></div><div><br /></div><div><br /></div><div><br /></div><div><br /></div><div><br /></div><div><br /></div><div><br /></div><div><br /></div><div><br /></div><div>สวัสดีติดต่อฐานข้อมูลของ SQL Server ได้แล้ว<br />
<br />
</div></div><div class="blogger-post-footer">สงวนลิขสิทธิ์ ห้ามนำไปเผยแพร่ก่อนได้รับอนุญาติ</div>เกษม กมลชัยพิสิฐhttp://www.blogger.com/profile/03223085345729627028noreply@blogger.com0tag:blogger.com,1999:blog-2343321804163472494.post-42217594072245737512018-06-18T14:51:00.002+07:002019-11-05T12:08:37.142+07:00กำหนดให้ Web Browser Control เรียกใช้งาน IE 11ปัญหาการเขียนโปรแกรม Windows Desktop Application แล้วเรียกใช้งาน Web Browser Control เพื่อเปิดดูเว็บที่สร้างด้วย HTML5 ซึ่งตัว Web Browser Control จะไปเรียกใช้ IE 9 รุ่นเก่าไม่สนับสนุน HTML5 (ใช้งานไม่ค่อยได้) ทำให้เกิดปัญหา error เพื่อแก้ปัญหาที่เกิดขึ้น สามารถกำหนดค่าในการเรียกใช้งาน browser ในรุ่น IE 11 ซึ่งสนับสนุน HTML5 แล้วมาแทนที่ โดยการเข้าไปแก้ใน Registry ของ Windows ในสว่นของ FEATURE_BROWSER_EMULATION โดยการกำหนดค่าหรือรุ่นของ IE ใหม่เข้าไปให้กับโปรแกรมของเรา โดยทำดังนี้<br />
1. ให้ทำการเปิด Registry Editor ขึ้นมา (search ที่วินโวส์หาคำว่า regedit)<br />
2. จากนั้นให้เข้าไปที่ FEATURE_BROWSER_EMULATION ตามลำดับการเข้าถึงดังนี้<br />
<br />
HKEY_LOCAL_MACHINE (or HKEY_CURRENT_USER)<br />
SOFTWARE<br />
Microsoft<br />
Internet Explorer<br />
Main<br />
FeatureControl<br />
<span style="color: blue;"> FEATURE_BROWSER_EMULATION</span><br />
<span style="color: red;">yourapp.exe = (DWORD) version</span><br />
<br />
3. ให้คลิกเมาส์ปุ่มขวาในส่วนของ FEATURE_BROWSER_EMULATION แล้วเลือก New -> DWORD (32-bit) Value จากนั้นให้กำหนดชื่อของโปรแกรมที่เราใช้งาน เช่น yourapp.exe เมื่อกำหนดชื่อเรียบร้อยให้ ดับเบิ้ลคลิกเข้าไปแก้ไขค่า โดยกำหนดค่าในส่วนของ Value data: เป็น 11001 และ Base เลือก Decimal ดังภาพ <br />
<br />
<div style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;">
<img border="0" data-original-height="199" data-original-width="331" src="https://3.bp.blogspot.com/-ilUPQranSkc/WydjbmPh8xI/AAAAAAAADPY/E6hSVDLt2bQMsBsevwITv-10aNVpEMUwQCLcBGAs/s1600/browseremulation2.png" /></div>
<div class="separator" style="clear: both; text-align: left;">
ถึงตอนนี้เราก็สามารถเรียกใช้งาน เว็บไซต์ที่สร้างด้วย HTML5 ผ่านทางโปรแกรมของเราด้วย Web Browser Control ได้แล้ว<br />
<br /></div>
<div style="text-align: left;">
cr. โก๋แก แห่ง FoxBoard</div>
<br />
<div style="text-align: left;">
รายละเอียดเพิ่มเติม สามารถอ่านได้ที่
</div>
<div style="text-align: left;">
<a href="https://www.codeproject.com/articles/793687/configuring-the-emulation-mode-of-an-internet-expl" target="_blank">https://www.codeproject.com/articles/793687/configuring-the-emulation-mode-of-an-internet-expl</a></div>
<div style="text-align: left;">
<br />
<span style="color: #000019;">สวัสดี ขอให้คนอ่านมีความสุข รวย ๆ </span></div>
<br /><div class="blogger-post-footer">สงวนลิขสิทธิ์ ห้ามนำไปเผยแพร่ก่อนได้รับอนุญาติ</div>เกษม กมลชัยพิสิฐhttp://www.blogger.com/profile/03223085345729627028noreply@blogger.com0tag:blogger.com,1999:blog-2343321804163472494.post-64671463304076352992018-06-02T16:43:00.003+07:002019-11-05T12:10:58.550+07:00VS Code : Open Web Browser in VS Codeเครื่องมือที่ใช้เขียนคำสั่งในยุคนี้ ตัวที่ได้รับความนิยมสูงคงหนีไม่พ้น VS Code ของ Microsoft หากลองติดตั้งและใช้งานรับรองว่าจะติดใจ คุณสามารถดาวน์โหลดได้ที่ <a href="https://code.visualstudio.com/download">https://code.visualstudio.com/download</a><br />
<br />
หลายคนลองเขียนคำสั่ง HTML ง่ายๆ แล้วจะรันผ่าน VS Code ทำอย่างไรดี ????? มีหลายวิธีซึ่งแต่ละวิธีก็คงต้องออกแรงกันหน่อย สำหรับบทความนี้เราจะอาศัย Extension เอามาใส่เสริมเพิ่มเข้าไป<br />
<br />
<b><u>วิธีการทำให้ VS Code สามารถรัน HTML ผ่าน browser</u></b><br />
<br />
1. ให้กดปุ่ม Ctrl+Shift+X หรือกดปุ่ม Extension ตามลูกศรชี้ในภาพด้านล่าง เพื่อเปิดช่องหน้าต่าง EXTENSIONS<br />
2. ในช่องค้นหาด้านบน ให้พิมพ์คำว่า open in browser<br />
3. ก็คลิกที่ปุ่ม Install เมื่อทำการติดตั้งเสร็จเรียบร้อยก็ให้คลิกที่ปุ่ม Reload<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://1.bp.blogspot.com/-gIhVJOIPu2k/WxJlhoQpLnI/AAAAAAAADNo/jsHVWpAaOjIJ-tCEFqXzw2tM0JM2BWoqACLcBGAs/s1600/vscode01.png" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img border="0" data-original-height="545" data-original-width="696" height="312" src="https://1.bp.blogspot.com/-gIhVJOIPu2k/WxJlhoQpLnI/AAAAAAAADNo/jsHVWpAaOjIJ-tCEFqXzw2tM0JM2BWoqACLcBGAs/s400/vscode01.png" width="400" /></a></div>
<div class="separator" style="clear: both; text-align: left;">
จากนั้นเมื่อต้องการรันไฟล์ HTML ก็ทำการคลิกขวาที่ไฟล์แล้วเลือกรายการ Open In Default Browser<br />
<br />
</div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://3.bp.blogspot.com/-xBrmWDylULw/WxJmgocruVI/AAAAAAAADNw/p9M_1N-l0d0FfS_Xqn5EKQADsICX5js_gCLcBGAs/s1600/vscode02.png" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img border="0" data-original-height="478" data-original-width="450" height="400" src="https://3.bp.blogspot.com/-xBrmWDylULw/WxJmgocruVI/AAAAAAAADNw/p9M_1N-l0d0FfS_Xqn5EKQADsICX5js_gCLcBGAs/s400/vscode02.png" width="376" /></a></div>
<div class="separator" style="clear: both; text-align: left;">
<b><u>วิธีการทำให้ VS Code สามารถ Preview Browser </u></b><br />
<br />
หากต้องการจะเห็นหน้าเว็บว่าสิ่งที่เราแก้ไขเป็นอย่างไร (หลังจากบันทึก Ctrl-S) แบบทันทีทันใด (Preview) ก็สามารถทำได้ไม่ยากอีกเช่นกัน โดยไปหา Extension มาเสริม<br />
1. ให้กดปุ่ม Ctrl+Shift+X หรือกดปุ่ม Extension <br />
2. ในช่องค้นหาด้านบน ให้พิมพ์คำว่า VSCode Browser Sync <br />
3. ก็คลิกที่ปุ่ม Install เมื่อทำการติดตั้งเสร็จเรียบร้อยก็ให้คลิกที่ปุ่ม Reload<br />
<br />
</div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://3.bp.blogspot.com/--WbbQt1Nq5g/WxJtNZFHJfI/AAAAAAAADN8/mmS00uH6_oMxYLt_5Fg5e00DS9GhWEL8gCLcBGAs/s1600/vscode03.png" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img border="0" data-original-height="343" data-original-width="461" height="297" src="https://3.bp.blogspot.com/--WbbQt1Nq5g/WxJtNZFHJfI/AAAAAAAADN8/mmS00uH6_oMxYLt_5Fg5e00DS9GhWEL8gCLcBGAs/s400/vscode03.png" width="400" /></a></div>
<div class="separator" style="clear: both; text-align: left;">
<b>การใช้งาน</b> เมื่อเราอยู่ที่ไฟล์ ที่เราเขียนคำสั่ง หากต้องการใช้งานให้ทำดังนี้<br />
1. ให้กดปุ่มบนคีย์บอร์ด Ctrl+Shift+ P เพื่อเปิดช่อง Command แล้วพิมพ์ Browser Sync: Server mode at side panel <br />
</div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://1.bp.blogspot.com/-l_J481vyhpw/WxJtPAT6eUI/AAAAAAAADOA/rC47JyYNgDc_DzeoZu4kuNOAixNnJiF9gCLcBGAs/s1600/vscode04.png" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img border="0" data-original-height="431" data-original-width="996" height="172" src="https://1.bp.blogspot.com/-l_J481vyhpw/WxJtPAT6eUI/AAAAAAAADOA/rC47JyYNgDc_DzeoZu4kuNOAixNnJiF9gCLcBGAs/s400/vscode04.png" width="400" /></a></div>
<div class="separator" style="clear: both; text-align: left;">
จะปรากฎหน้าต่างบราวเซอร์แสดงทางด้านซ้ายมือของโปรแกรม ถึงตอนนี้ให้ทำการแก้ไขคำสั่ง HTML ตามต้องการ แล้วทำการบันทึก (Ctrl-S) เราก็จะเห็นข้อมูลบนหน้าเว็บถูกปรับปรุงตาม<br />
<br />
<b>ตานี้ก็มาถึงกรณีถ้าเราเขียนโปรแกรมแบบ Server Site พวก PHP ละจะทำอย่างไร</b><br />
<br />
1. ให้กดปุ่ม Ctrl+Shift+P เพื่อเปิดช่อง Command แล้วพิมพ์ Browser Sync: Proxy mode in browser กดปุ่ม Enter<br />
<br/>
</div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://4.bp.blogspot.com/-gbw8kuHzHcc/WxJ2TSqFCMI/AAAAAAAADOQ/SZdIyuoq7yAl2e3NONrFUxtXXTnDSFdJgCLcBGAs/s1600/vscode05.png" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img border="0" data-original-height="391" data-original-width="994" height="156" src="https://4.bp.blogspot.com/-gbw8kuHzHcc/WxJ2TSqFCMI/AAAAAAAADOQ/SZdIyuoq7yAl2e3NONrFUxtXXTnDSFdJgCLcBGAs/s400/vscode05.png" width="400" /></a></div>
<div class="separator" style="clear: both; text-align: left;">
2. โปรแกรมจะรอให้เราป้อน url เข้าไป ให้ป้อน <span style="color: blue;">http://localhost</span> หรือ <span style="color: blue;">http://localhost/ชื่อโฟลเดอร์</span> แล้วแต่ว่าจะกำหนดอะไรไป<br />
เช่น http://localhost/kasem1 แล้ว Enter 2 ครั้ง ก็จะปรากฎโปรแกรม Browser แสดงขึ้นมา<br />
<br />
</div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://2.bp.blogspot.com/-fAdZ5ohSa6M/WxJ2g_h1ybI/AAAAAAAADOU/kf9q1sOVXfspcX5rOoslCUx8ddlkyBJugCLcBGAs/s1600/vscode06.png" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img border="0" data-original-height="422" data-original-width="834" height="201" src="https://2.bp.blogspot.com/-fAdZ5ohSa6M/WxJ2g_h1ybI/AAAAAAAADOU/kf9q1sOVXfspcX5rOoslCUx8ddlkyBJugCLcBGAs/s400/vscode06.png" width="400" /></a></div>
<div class="separator" style="clear: both; text-align: left;">
ถึงตอนนี้ลองแก้โค้ดคำสั่ง แล้ว Save ดู ที่ browser ก็จะเปลี่ยนตามอัตโนมัติด้วยเช่นกัน<br />
<br />
<b><u><i>แปลกแต่จริง ที่ Microsoft พัฒนา VS Code มาให้ใช้งาน แต่..... ไม่มีเมนู Print มาให้</i></u></b><br />
ดังนั้นหากต้องการพิมพ์คำสั่งออกทางเครื่องพิมพ์ก็ต้องไปหาดาวน์โหล Extension มาใช้งาน<br />
<br />
สามารถเข้าไปดาวน์โหลดส่วนเสริม PrintCode ได้ที่<br />
<a href="https://marketplace.visualstudio.com/items?itemName=nobuhito.printcode">https://marketplace.visualstudio.com/items?itemName=nobuhito.printcode</a><br />
<br />
หลังจากติดตั้งส่วนเสริม PrintCode เรียบร้อยแล้ว <br />
ทำการเรียกใช้งานโดยกดปุ่ม Ctrk + Shift + P<br />
พิมพ์ PrintCode ดังภาพ แล้วคลิกเรียกใช้งาน ดังภาพ<br />
<br />
</div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://1.bp.blogspot.com/-Wcf1wFEgbHY/W6R0umrtLDI/AAAAAAAADVU/JFer4FAaP84WyRj1DoHPq2hIU7Bb1-yJgCLcBGAs/s1600/printcode.jpg" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img border="0" data-original-height="353" data-original-width="915" height="153" src="https://1.bp.blogspot.com/-Wcf1wFEgbHY/W6R0umrtLDI/AAAAAAAADVU/JFer4FAaP84WyRj1DoHPq2hIU7Bb1-yJgCLcBGAs/s400/printcode.jpg" width="400" /></a></div>
<div class="separator" style="clear: both; text-align: left;">
หอมปากหอมคอสำหรับการเริ่มใช้งาน VS Code เบื้องต้น<br />
<br />
เขียนโปรแกรมง่ายนิดเดียว ที่เหลือยากหมด<br />
สวัสดี<br />
<br />
</div><div class="blogger-post-footer">สงวนลิขสิทธิ์ ห้ามนำไปเผยแพร่ก่อนได้รับอนุญาติ</div>เกษม กมลชัยพิสิฐhttp://www.blogger.com/profile/03223085345729627028noreply@blogger.com0tag:blogger.com,1999:blog-2343321804163472494.post-33341997225652334572018-05-08T15:26:00.001+07:002019-11-05T12:11:44.092+07:00UNITY 3D Course : Learning 3D Game With Unity สอนเขียนเกม 3 มิติ วิีดิโอ สอนเขียนเกม 3 มิติ ด้วย Unity 3D ทำไว้ชุดใหญ่ มาดูมาชมกันนะครับ<br />
คลิกที่ลิงค์ตามที่อยู่เว็บด้านลา่งได้เลย<br />
<br />
<a href="https://www.youtube.com/channel/UCnJrFe1pM8cP_7eRmP5XcNQ/videos">https://www.youtube.com/channel/UCnJrFe1pM8cP_7eRmP5XcNQ/videos</a><br />
<br />
ภาพตัวอย่าง<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://www.youtube.com/channel/UCnJrFe1pM8cP_7eRmP5XcNQ/videos" target="_blank"><img alt=" คลิกเพื่อเข้าสู่วีดิโอ" border="0" data-original-height="804" data-original-width="1144" height="448" src="https://2.bp.blogspot.com/-hsqhcMtYzZQ/WvFeMmjOg2I/AAAAAAAADL0/R_ParlkJFHciXDk87ET8tw3HNw071UaKwCLcBGAs/s640/unityvdo.png" width="640" /></a></div>
<div class="separator" style="clear: both; text-align: left;">
ไม่เรียนก็ไม่รู้ ไม่ดูก็ไม่เป็น ไม่เห็นคงไม่เชื่อ ไม่ทำก็ไม่ชำนาญ ไม่พยายามก็ไม่รู้ถึงอุปสรรค .....<br />
<br />
เรียนก็รู้ ดูก็เป็น เห็นก็เชื่อ ทำก็ชำนาญ พยายามก็ผ่านอุปสรรค....<br />
<br />
</div><div class="blogger-post-footer">สงวนลิขสิทธิ์ ห้ามนำไปเผยแพร่ก่อนได้รับอนุญาติ</div>เกษม กมลชัยพิสิฐhttp://www.blogger.com/profile/03223085345729627028noreply@blogger.com0tag:blogger.com,1999:blog-2343321804163472494.post-26249134375225821642018-05-07T10:31:00.001+07:002018-05-07T10:40:33.590+07:00SQL Server - STOCK BALANCE และ ACCUMULATE<span style="font-size: large;">เ</span><b><span style="font-size: x-large;">ก</span></b>ริ่นหัวโพสว่า STOCK BALANCE และ ACCUMULATE เชื่อหลายท่านถ้าให้เขียนโปรแกรมหาเพื่อยอดคงเหลือของสต็อก หรือหายอดสะสม คงนั่งคิดและเขียนโปรแกรมกันยาวเหยียด แต่ถ้าเราใช้ความสามารถของ SQL Server แล้ว ขอบอกว่าสั้นนิดเดียว ช่วยลดเวลาเอาสมองไปคิดอย่างอื่นได้อีกมากมาย มาเริ่มกันเลย<br />
<br />
<b>การหายอดสต็อกคงเหลือ (STOCK BALANCE)</b><br />
<b><br /></b>
สร้างตารางชั่่วคราวตัวอย่างทดสอบกันก่อน (มีชื่อว่า #Test)<br />
<br />
<div>
<div>
CREATE TABLE #Test (</div>
<div>
id INT IDENTITY(1,1) NOT NULL,</div>
<div>
ItemCode CHAR(10) ,</div>
<div>
QtyIn MONEY ,</div>
<div>
QtyOut MONEY</div>
<div>
)</div>
<div>
<br /></div>
<div>
INSERT INTO #Test</div>
<div>
VALUES ( '1', 200, 0 ),</div>
<div>
( '1', 250, 0 ),</div>
<div>
( '1', 300, 0 ),</div>
<div>
( '2', 150, 0 ),</div>
<div>
( '2', 0, 150 ),</div>
<div>
( '2', 300, 0 ),</div>
<div>
( '2', 100, 0 )</div>
</div>
<div>
<br /></div>
<div>
-- เรียกดูข้อมูล</div>
<div>
SELECT * FROM #Test</div>
<div>
<br /></div>
<div>
-- ทำการหายอดคงเหลือของสต็อก แสดงในลักษณะของการ์ดแสดงยอดคงเหลือ (Stock Card)</div>
<div>
<div>
SELECT * ,</div>
<div>
SUM(QtyIn - QtyOut) OVER ( PARTITION BY ItemCode ORDER BY ItemCode, id ) </div>
<div>
AS CurrBAL</div>
<div>
FROM #Test</div>
<div>
ORDER BY ItemCode, id</div>
</div>
<div>
<br /></div>
<div>
จะได้ผลลัพธ์ดังภาพ</div>
<div>
<br /></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://2.bp.blogspot.com/-LAxgGwGKqvU/Wu--WYtbHJI/AAAAAAAADLQ/7xJz6yrspB0kZzCKOmmBzU7wsqusmYe-ACLcBGAs/s1600/stock1.png" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img border="0" data-original-height="167" data-original-width="284" src="https://2.bp.blogspot.com/-LAxgGwGKqvU/Wu--WYtbHJI/AAAAAAAADLQ/7xJz6yrspB0kZzCKOmmBzU7wsqusmYe-ACLcBGAs/s1600/stock1.png" /></a></div>
<div>
<br /></div>
<div>
<br /></div>
<div>
<br /></div>
<div>
<br /></div>
<div>
<br /></div>
<div>
<br /></div>
<div>
<br /></div>
<div>
<br /></div>
<div>
<br /></div>
<div>
<br /></div>
<div>
<br /></div>
<div>
จะเห็นว่าการนำเอา OVER PARTITION BY มาใช้งานทำให้เราสามารถคำนวณยอดสต็อกออกมาได้อย่างง่ายดาย</div>
<div>
<br /></div>
<div>
<b>การหายอดสะสม (ACCUMULATE)</b></div>
<div>
<b><br /></b></div>
<div>
การคำนวณยอดสะสมเราก็มักจะโดยให้ทำรายงานหรีอเขียนโปรแกรมกันบ่อยๆ ซึ่งก็ไม่ยากอีกเช่นกัน มาลองศึกษาตามกันเลยครับ</div>
<div>
<br /></div>
<div>
<div>
CREATE TABLE #DrCr (</div>
<div>
id INT IDENTITY(1,1) NOT NULL,</div>
<div>
ItemCode CHAR(10) ,</div>
<div>
Amt1 MONEY ,</div>
<div>
Amt2 MONEY</div>
<div>
)</div>
</div>
<div>
<br /></div>
<div>
<div>
INSERT INTO #DrCr</div>
<div>
VALUES ( '101', 200, 100 ),</div>
<div>
( '101', 50,100 ),</div>
<div>
( '101', 150, 100 ),</div>
<div>
( '102', 550, 50 ),</div>
<div>
( '102', 200, 150 ),</div>
<div>
( '102', 10, 100 ),</div>
<div>
( '102', 60, 300 )</div>
</div>
<div>
<br /></div>
<div>
ทีนี้เราจะนำเอายอดของ Amt1 บวกกับ Amt2 แล้วสะสมไปเรื่อยๆ โดยแบ่งตามกลุ่มของ ItemCode<br />
<br />
SELECT id, ItemCode, Amt1, Amt2,<br />
SUM(Amt1+Amt2) OVER (PARTITION BY ItemCode<br />
ORDER BY ItemCode, id ROWS UNBOUNDED PRECEDING) AS AccuAmt<br />
FROM #Accu<br />
<br />
จะได้ผลลัพธ์ดังภาพ</div>
<div>
<b><br /></b></div>
<div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://2.bp.blogspot.com/--05c9y7Cwb0/Wu_GT5Hr-aI/AAAAAAAADLg/OeS4uNTOdQsY9amFF_MLZlAnnG3PVI3hgCLcBGAs/s1600/stock2.png" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img border="0" data-original-height="168" data-original-width="329" src="https://2.bp.blogspot.com/--05c9y7Cwb0/Wu_GT5Hr-aI/AAAAAAAADLg/OeS4uNTOdQsY9amFF_MLZlAnnG3PVI3hgCLcBGAs/s1600/stock2.png" /></a></div>
<b><br /></b></div>
<div>
<b><br /></b></div>
<div>
<b><br /></b></div>
<div>
<b><br /></b></div>
<div>
<br />
<br />
<br />
<br />
<br />
<br />
<br />
จะเห็นว่ามีการนำเอา OVER PARTITION BY ItemCode -- คำสั่งนี้จะหมายถึงแบ่งกลุ่มตาม ItemCode<br />
แล้วเรียงลำดับตาม ItemCode, id ด้วยคำสั่ง ORDER BY ItemCode, id<br />
ROWS เป็นการกำหนดการคำนวณค่าที่เกิดขึ้นของแถวต่างๆ ที่เกี่ยวข้องให้กับแถวปัจจุบัน<br />
UNBOUNDED PRECEDING เป็นการกำหนดให้เริ่มคำนวณต้้งแต่แถวแรกของกลุ่ม (PARTITION BY) จนถึงแถวปัจจุบัน<br />
<br />
เอาละครับสำหรับการหา Stock Balance และ Accumulate ก็คงทำให้การทำงานสะดวกขึ้น<br />
สวัสดีมีเวลาเยอะๆ<br />
<br />
<br /></div>
<div class="blogger-post-footer">สงวนลิขสิทธิ์ ห้ามนำไปเผยแพร่ก่อนได้รับอนุญาติ</div>เกษม กมลชัยพิสิฐhttp://www.blogger.com/profile/03223085345729627028noreply@blogger.com1