04 กันยายน 2563

SQL Server : Install SQL Server and MariaDB via Docker Container on Windows 10

 ทความนี้นำเสนอ การติดตั้ง Docker บน Windows 10 พร้อมติดตั้ง SQL Server บน Docker 

ติดตั้ง Docker 

 ให้ทำการดาวน์โหลดตัวติดตั้ง Docker สำหรับ Windows 10 โดยเข้าไปที่เว็บ

https://www.docker.com/get-started

จากนั้นทำการดาวน์โหลด Docker Desktop for Windows 

จะได้ไฟล์ Docker Desktop Installer เมื่อได้ไฟล์เรียบร้อยให้ทำการติดตั้งโปรแกรมได้เลย 

ขณะติดตั้งจะขึ้นหน้าต่าง 







ให้คลิก OK

โปรแกรมก็จะทำการติดตั้งจนเสร็จ 

จะปรากฎไอคอน Docker Desktop ที่หน้า Desktop ให้ดับเบิ้ลคลิกเพื่อเรียกใช้งาน Docker 

รอสักครู่ให้ Docker Start จนเร็จ จากนั้นไปคลิกที่ ปุ่ม Hidden Icon ที่ Task bar 







ให้คลิกที่ไอคอน Docker แล้วเลือก Dashboard จะปรากฎหน้าต่าง Docker Dashboard

จากนั้นคลิก Sign In
(หากยังไม่เคยสมัครให้ทำการสมัครก่อนโดยเข้าไปสมัครที่ http://hub.docker.com)








หน้าต่าง Dashboard จะเป็นตัวบริหารจัดการ Container ที่เราสร้างขึ้น 

ต่อไปเราไปทำการติดตั้ง SQL Server 


ติดตั้ง SQL Server

ไปที่ Windows Search ที่ Taskbar แล้วค้นหา PowerShell 

เมื่อเจอแล้วให้ เปิดหน้าต่าง Windows PowerShell ในโหมด Run as Administrator










เมื่อเปิดหน้าต่าง PowerShell ขึ้นมาแล้วให้พิมพ์

docker login

เริ่มต้นติดตั้ง SQL Server 

สำหรับตัวอย่างคำสั่ง 2019-CU6-ubuntu-16.04 จะเป็นการติดตั้ง SQL Server 2019 

หากต้องการติดตั้งในรุ่นอื่นสามารถกำหนดรุ่นได้ตามต้องการ โดยดูรุ่นต่าง ๆ ตามลิงค์
https://hub.docker.com/_/microsoft-mssql-server

1. ดาวน์โหลดไฟล์ติดตั้งสำหรับ SQL Server โดยพิม์คำสั่ง 

docker pull mcr.microsoft.com/mssql/server:2019-CU6-ubuntu-16.04

โปรแกรมจะทำการดาวน์โหลด SQL Server ดังภาพ







2. สร้าง Container และติดตั้ง SQL Server ให้กับ Docker โดยพิมพ์คำสั่ง

docker run -e "ACCEPT_EULA=Y" -e "SA_PASSWORD=รหัสผ่าน" -p1433:1433 --name sql2019 -d mcr.microsoft.com/mssql/server:2019-CU6-ubuntu-16.04

*** กำหนดรหัสผ่านสำหรับ SA ตรง รหัสผ่าน ตามต้องการ






เมื่อกำหนดเสร็จ ไปที่หน้าต่าง Docker Dashboard จะปรากฎ SQL Server ดังภาพ







ยินดีด้วย ติดตั้ง SQL Server ภายใต้ Docker เสร็จเรียบร้อย ในหน้าต่างนี้เราสามารถบริหารจัดการ Container sql2019 ได้ผ่านไอคอนด้านหลัง 

ต่อไปเราจะทำการทดสอบ ให้ไปทำการปิด firewall ก่อน

แล้วทำการติดตั้ง SQL Management Studio ดาวน์โหลดได้ตามเว็บไซต์ด้านล่าง

https://docs.microsoft.com/en-us/sql/ssms/download-sql-server-management-studio-ssms?view=sql-server-ver15

ติดตั้งเสร็จทำการเปิดใช้งาน

แล้ว login เข้า SQL Server  ตามภาพด้านล่าง


ทดสอบดูว่าเราติดตั้ง SQL Server รุ่นใด












ยินดีด้วย ทำสำเร็จแล้ว เย้ ๆ ๆ ๆ 

สำหรับระบบปฎิบัติการ MacOS ก็ทำลักษณะเดียวกัน แต่ต้องระวังเรื่องการกำหนดรหัสผ่าน ซึ่งต้องเป็นรหัสผ่านที่เป็นไปตามข้อกำหนด คือ อย่างน้อย 8 ตัวอักษรและมีตัวอักษรใหญ่เล็ก เป็นต้น ไม่เช่นนั้นจะไม่สามารถ start ตัว sql container ได้

สำหรับระบบปฏิบัติการ MacOS Linux ยังไม่มี SSMS เราสามารถดาวน์โหลด Azure Data Studio มาใช้แทนได้ โดยไปทำการดาวน์โหลดได้ที่เว็บ 

https://github.com/Microsoft/azuredatastudio

ติดตั้ง MariaDB

1. เปิด Terminal หรือ Powershell แล้วป้อนคำสั่ง

docker login

2. ดาวน์โหลดไฟล์ติดตั้งสำหรับ MariaDB  โดยพิม์คำสั่ง 

docker pull mariadb:latest

รอจนกระทั่งทำการดาวน์โหลดโปรแกรมเสร็จ

3. สร้าง Container และติดตั้ง MariaDB ให้กับ Docker โดยพิมพ์คำสั่ง

docker run --name mariadb -e MYSQL_ROOT_PASSWORD=รหัสผ่าน -d mariadb 


*** กำหนดรหัสผ่านสำหรับ root ตรง รหัสผ่าน ตามต้องการ


หากไม่มีข้อผิดพลาดใด ๆ การติดตั้งสำเร็จเรียบร้อย ให้ไปเปิด Docker -> Dashboard จะปรากฎ Container ของ mariadb 



ติดตั้ง Web Server

1. เปิด Terminal หรือ Powershell แล้วป้อนคำสั่ง

docker login

2. ดาวน์โหลดไฟล์ติดตั้งสำหรับ PHP 7.4 โดยพิม์คำสั่ง (รุ่นล่าสุดปี 2563)

docker pull php:7.4-apache


3. สร้าง Container และติดตั้ง PHP ให้กับ Docker โดยพิมพ์คำสั่ง


docker run -p 80:80 --name webm php:7.4-apache  


กรณีที่มีการใช้งาน port 80 อยู่ก่อนแล้ว ให้ทำการเปลี่ยน port ใหม่ เช่น 8080


docker run -p 8080:80 --name webm php:7.4-apache 



4. เมื่อติดตั้งเสร็จเรียบร้อย ให้เปิด browser แล้วป้อน url ดังนี้


http://localhost


หากขึ้นข้อความ ว่า....

Forbidden

You don't have permission to access this resource.


Apache/2.4.38 (Debian) Server at localhost Port 80



ยินดีด้วย คุณติดตั้ง web server ได้แล้ว



กลับมานับ 1 กันใหม่


เราจะมาทำการเขียน php กัน ดังนั้น เริ่มต้นกันใหม่อีกครั้ง 


1. ให้ไปทำการสร้าง โฟลเดอร์ใหม่ ชื่ออะไรก็ได้ เช่น php_www

แล้วไปสร้างเท็กซ์ไฟล์ ธรรมด้า ธรรมดา ชื่อ Dockerfile  (ไม่ต้องมีนามสกุลไฟล์) 

ป้อนคำสั่งในไฟล์ ดังนี้


FROM php:7.4-apache



2. สร้างไฟล์ชื่อ docker-compose.yml แล้วเขียนคำสั่ง ดังนี้


version: "3"
services:
www01:
build: .
ports:
- "8080:80"
volumes:
- ./src:/var/www/html/
networks:
- default



3. สร้างโฟลเดอร์ ชื่อ src ภายใต้ php_www แล้วเขียนคำสั่ง php เพื่อทดสอบ 

โดยสร้างไฟล์ชื่อ phpinfo.php แล้วป้อนคำสั่ง


<?php 

    phpinfo();

?>


เมื่อสร้างไฟล์เสร็จจะได้ไฟล์ตามภาพด้านล่าง
















4. เปิดโปรแกรม Powershell หรือ Terminal

พิมพ์


docker login


แล้วย้ายตำแหน่งโฟล์เดอร์ไปที่ โฟลเดอร์ที่เก็บไฟล์ ( php_www ที่สร้างไว้ในข้อ 1 )


แล้วป้อนคำสั่งต่อ ดังนี้


docker-compose up

กลับไปดูที่ Docker dashboard จะปรากฎ container รันขึ้นมาอีกตัว



 














5. เปิดโปรแกรม browser ขึ้นมาแล้วป้อน url ดังนี้


http://localhost:8080/phpinfo.php


จะปรากฎหน้าจอ phpinfo ดังภาพ





















ที่เหลือก็นำไฟล์ .php มาใส่ไว้ใน โฟลเดอร์ src (โฟลเดอร์ที่สร้างไว้ในข้อ 3) ก็สามารถเรียกใช้งานได้แล้ว


สรุปง่าย ๆ แบบส่วนตัว


container ที่สร้างเหมือนเราสร้างโปรเจกต์ ในนั้นก็จะประกอบไปด้วยไฟล์ที่จำเป็น 

ไม่ใช้ก็ลบ container ออก หรือ หยุดก็ได้ 

ใช้เมื่อไหร่ก็เข้าไปที่โฟลเดอร์ แล้วก็เรียกคำสั่ง  docker-compose up 

ระวังเรื่อง port ชนกันให้ดี 


 ขอแสดงความยินดีด้วย



;-)


01 สิงหาคม 2563

UNITY : Assets\Standard Assets\Utility\SimpleActivatorMenu.cs(14,16): error CS0619: 'GUIText' is obsolete: 'GUIText has been removed. Use UI.Text instead.'

** Standard Assets ไม่ไปต่อ ไม่มีให้ดาวน์โหลดแล้ว
หากต้องการใช้งานให้ดาวน์โหลดจากเว็บด้านล่าง

สำหรับ Unity รุ่นสูงกว่า 2018 ดาวน์โหลด Standard Assets รุ่นแก้ไข  สามารถดาวน์โหลดได้ที่


สำหรับผู้ใช้รายใหม่ที่ไม่เคยดาวน์โหลด Standard Assets มาก่อน จะไม่สามารถดาวน์โหลได้ ให้ดาวน์โหลดผ่าน เว็บด้านล่าง
https://ryiah.com/unity/assets/StandardAssets20184.unitypackage



เมื่อทำการ Import ตัว Standard Assets เข้ามาใช้งาน หากเกิดอาการนี้ ให้แก้ไขตามด้านล่าง

ผู้ที่นำเอา Standard Assets มาใช้ใน Unity 2018 ขึ้นไป จะพบ Error ดังนี้

Assets\Standard Assets\Utility\SimpleActivatorMenu.cs(14,16): error CS0619: 'GUIText' is obsolete: 'GUIText has been removed. Use UI.Text instead.'

เอาง่าย ๆ GUIText มันใช้ไม่ได้แล้วบน (obsolate -> ล้าสมัย) ดังนั้นจะใช้ Standard Assets ก็ต้องใช้กับ Unity 2017 หรือ ต่ำกว่า

แต่..... ยังมีทางแก้ไข เมื่อพบ Error ให้ ดับเบิ้ลคลิกที่ Error ก็จะเข้าไปสู่คำสั่งที่ Error แล้วแก้ไขดังภาพ

ที่ไฟล์  SimpleActivatorMenu.cs แก้ไขตามภาพ

















เพิ่ม
using UintyEngine.UI;                       

เปลี่ยน
GUIText ไปเป็น Text


---------------------------------------------------------
ให้ลองเปิดไฟล์ ForcedReset.cs ถ้ามี GUITexture ให้แก้ไขตามด้านล่าง

ในไฟล์ ForcedReset.cs ให้แก้ไขในส่วนของ

เพิ่มคำสั่ง 
Using UnityEngine.UI;

และทำการแก้ไขบรรทัด

[RequireComponent(typeof (GUITexture))]
เป็น
[RequireComponent(typeof (Image))]


โชคดี รวย ๆ โควิดหายไป

06 มีนาคม 2563

SQL Server : How to Connect SQL Server via Python

ท่านที่ต้องการเชื่อมต่อฐานข้อมูล SQL Server ผ่านทาง Python ขอบอกไว้ตรงนี้เลยว่าไม่ได้ยาก ลองมาทำกัน ดังนี้
1. ทำการติดตั้ง Python กันก่อน (กรณีที่เครื่องเรายังไม่ได้ติดตั้ง)
    ให้ไปดาวน์โหลด Python แล้วทำการติดตั้งที่เว็บ
           
             https://www.python.org/downloads/

 2. ทำการติดตั้ง Pyodbc โดยให้เปิดหน้าต่าง cmd.exe ของ Windows ขึ้นมา
     จากนั้นเข้าไปยังโฟลดเดอร์ที่เราติดตั้ง Python เอาไว้
     สำหรับของผู้เขียนติดตั้งไว้ใน Folder                         
           
             C:\Users\Kasemiyake\Appdata\Local\Programs\Python\Python38

    ให้ทำการเปลี่ยนไดเรกทรอรี่ไปยังโฟลเดอร์ Scripts ที่อยู่ภายใต้โฟลดเดอร์ของ Python
    โดยพิมพ์คำสั่ง

              C:
              CD \Users\Kasemiyake\Appdata\Local\Programs\Python\Python38\Scripts 
   
    จากนั้นทำการติดตั้ง Pyodbc โดยพิมพ์คำสั่ง

              pip install pyodbc



เมื่อติดตั้งทุกอย่างเสร็จเรียบร้อย
ให้ทำการเปิดโปรแกรม Python Shell ขึ้นมาโดยพิมพ์  IDLE  ที่ช่อง Search ของ Windows ดังภาพ




















เมื่อเปิด Python Shell ขึ้นมาแล้ว ให้ไปคลิกเลือกเมนู File -> New File จากนั้นป้อนคำสั่งทดสอบการติดต่อฐานข้อมูล

import pyodbc
conn = pyodbc.connect('Driver={SQL Server};'
                      'Server=ชื่อ Server ของ SQL Server;'
                      'Database=ชื่อฐานข้อมูล;'
                      'Trusted_Connection=yes;')

cursor = conn.cursor()
cursor.execute('SELECT * FROM [ชื่อตาราง]')

for row in cursor:
    print(row)

หมายเหตุ ให้ทำการแก้ไขชื่อ Server และชื่อของตารางตามต้องการ

จากนั้นไปที่เมนู Run -> Run Module

ถ้าทำสำเร็จจะได้ข้อมูลดังภาพประกอบ























สำหรับการติดต่อกับฐานข้อมูล SQL Server ด้วยภาษา Python ผ่าน Pyodbc ก็ขอจบไว้เพียงเท่านี้

ปีนี้หนักหนา Covid-19 ขอให้ผ่านไป ประเทศไทยรอดพ้นวิกฤติ

30 พฤศจิกายน 2562

Windows : Install new Font

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

1. ใช้ Text Editor สร้างไฟล์ชื่อ AddFont.cmd
2.  ป้อนคำสั่งดังนี้

AddFont.cmd

16 พฤศจิกายน 2562

Visual FoxPro : แจกหนังสือ Visual FoxPro

นังสือ Visual FoxPro เล่มนี้ผู้เขียนได้เขียนไว้ตั้งแต่ปี 2543 จัดพิมพ์และจำหน่ายจนหมดแล้ว ถึงแม้ว่าโปรแกรมจะเก่าแต่ขอบอกว่าทำงานได้จนถึงทุกวันนี้ และก็ยังสามารถทำงานได้กับ Windows 10 ไปอีกยาวนาน เขียนโปรแกรมเก็บข้อมูล dbf file หรือจะติดต่อกับฐานข้อมูล SQL Server, MySQL, ORACLE และอื่น ๆ ได้อย่างง่ายดาย (หนังสือเล่มนี้ไม่ได้กล่าวถึงฐานข้อมูลที่เป็น Database Server)
หวังว่าผู้ที่เข้ามาศึกษาคงได้รับประโยชน์ และช่วยกันสร้างสรรค์โปรแกรมให้คนใช้งานกันเยอะ ๆ

ดาวน์โหลดหนังสือ คลิกที่นี่

https://1drv.ms/b/s!AnOzBJhrun8trHPeeMeHwxxZz1n9?e=bThXX5

ท่านสามารถบริจาคสมทบทุนช่วยเหลือใครที่ไหนก็ได้ตามกำลังศรัทธา ได้บุญร่วมกัน



05 พฤศจิกายน 2562

SQL Server - Edit Top 200 Rows - How to Edit Data in Result Grid

ารแก้ไขข้อมูลภายใต้ SQL Server Management Studio ด้วย Edit Top 200 Rows เราก็จะเห็นข้อมูลแสดงออกมาในกริด และแก้ไขได้เฉพาะ 200 แถวแรกเท่านั้น แต่ถ้าต้องการเปลี่ยนเงื่อนไขในการแสดงผลข้อมูลตามที่ต้องการ ก็สามารถทำได้ไม่ยาก ดังนี้

ให้ทำการเลือกตารางที่ต้องการแก้ไข โดยคลิกเมาส์ปุ่มขวาที่ตาราง จากนั้นเลือก Edit Top 200 Rows


สำรวจว่ามี Toolbars ชื่อ Query Designer แสดงอยู่บนหน้าจอหรือไม่
โดยไปคลิกเลือกเมนู View -> Toolbars แล้วดูว่าหน้ารายการ Query Designer มีเครื่องหมายถูกอยู่ด้านหน้าหรือไม่ (ถ้าไม่มีให้คลิกเลือก)

จะปรากฎ Toolbars ของ Query Designer

วิธีที่ 1 สำหรับผู้ที่ชอบใช้คำสั่ง SQL
ให้คลิกเลือกปุ่ม SQL (Show SQL Pane) จากนั้นทำการเพิ่มเงื่อนไขในการแสดงข้อมูลที่ต้องการแก้ไข เช่น  WHERE  Title = 'Ms.' แล้วกดปุ่ม Ctrl  R เพื่อแสดงผลข้อมูล แล้วทำการเข้าไปแก้ข้อมูลในกริดตามต้องการ

วิธีที่ 2
ให้คลิกเลือกปุ่ม Show Criteria Pane จะปรากฎหน้าต่างให้เราสามารถกำหนดเงื่อนไขแบบไม่ต้องเขียนคำสั่ง ดังภาพ

สวัสดีวันหยุดพิเศษ ประชุมอาเซียนซัมมิท

11 พฤษภาคม 2562

SQL Server - CTE Recursive Query

ตั้งแต่ SQL Server 2005 เป็นต้นมา ได้มีการนำ CTE (Common Table Expression's) เข้ามาสริม ซึ่ง CTE ถ้าจะเปรียบก็เหมือนกับตารางชั่วคราวตัวนึง  ซึ่งสามารถนำไปทำอะไรได้เยอะ  สิ่งนึงที่เป็นความสามารถของ CTE คือการทำรีเคอซีฟ (recursive) ตัวมันเองเรียกตัวมันเอง ดังนั้นตารางใดที่มีการต้องคิวรีเพื่อหาข้อมูลตัวมันเองซ้ำไปซ้ำมานั้นแหละ CTE เหมาะสุด
หลายท่านคงงง แล้วจะใช้งานได้อย่างไร ?
เพื่อให้เห็นภาพ ขอยกตัวอย่างข้อมูลสายการบังคับบัญชาของหน่วยงาน โดยการสร้างตารางเก็บข้อมูลตำแหน่งงาน ด้วยคำสั่ง ดังนี้

CREATE TABLE [dbo].[tblPosition](
[PositionID] [nchar](10) NOT NULL PRIMARY KEY,
[Description] [nvarchar](100) NULL,
[DependOn] [nchar](10) NULL
);
GO

ทำการเพิ่มข้อมูลตำแหน่งงาน และสายการบังคับบัญชา ดังนี้

INSERT INTO tblPosition VALUES('00000', 'President', NULL);
INSERT INTO tblPosition VALUES('10000', 'Managing Director', '00000');
INSERT INTO tblPosition VALUES('11000', 'Account Manager', '10000');
INSERT INTO tblPosition VALUES('12000', 'Marketing Manager', '10000');
INSERT INTO tblPosition VALUES('13000', 'IT Manager', '10000');
INSERT INTO tblPosition VALUES('11001', 'Accountant', '11000');
INSERT INTO tblPosition VALUES('12001','Marketing Representative','12000');
INSERT INTO tblPosition VALUES('13001', 'System Analyst', '13000');
INSERT INTO tblPosition VALUES('13002', 'Senior Programmer', '13000');
INSERT INTO tblPosition VALUES('13003', 'Programmer', '13000');

เมื่อเราเรียกแสดงข้อมูลด้วยคำสั่ง SELECT * FROM tblPosition จะได้ข้อมูลดังภาพ

ถ้าหากเราต้องการแสดงโครงสร้างตามลำดับขั้นของตำแหน่งต่าง ๆ ว่าตำแหน่งใดอยู่ภายใต้ตำแหน่งใด เราสามารถเขียนคำสั่งคิวรีโดยอาศัย CTE ได้ดังนี้

WITH CTE (DependOn, PositionID, [Description], LevelNumber)
  AS (
SELECT DependOn, PositionID, [Description], 1 LevelNumber
   FROM tblPosition  WHERE DependOn IS NULL
UNION ALL
SELECT E.DependOn, E.PositionID, E.[Description], LevelNumber + 1 AS LevelNumber
   FROM tblPosition E
INNER JOIN CTE ON E.DependOn=CTE.PositionID
        )
SELECT * FROM CTE ORDER BY  PositionID, LevelNumber;

เมื่อเรียกคำสั่งข้างต้น จะปรากฎข้อมูลดังภาพ

จากภาพจะเห็นว่ามีคอลัมน์ LevelNumber ปรากฎขึ้นมา ซึ่งจะแสดงถึงระดับของตำแหน่ง เช่น President อยู่ Level ที่ 1 ส่วน Programmer อยู่ Level ที่ 4 เป็นต้น

หมายเหตุ 
WITH CTE (DependOn, PositionID, [Description], LevelNumber)
เป็นการประกาศตารางชั่วคราวชื่อ CTE และภายใต้ตารางนี้มีคอลัมน์ต่าง ๆ ประกอบด้วย DependOn, PositionID, [Description], LevelNumber

จากตัวอย่างข้างต้น อาจจะเห็นภาพไม่ชัด ถ้าเราต้องการแสดงรายละเอียดของตำแหน่งที่ขึ้นตรงเป็นลำดับขั้นออกมาด้วย ก็สามารถทำได้โดยใช้คำสั่ง ดังนี้

WITH CTE(PositionID, [Narration], [Description], LevelNumber ,DependOn)
  AS (
SELECT PositionID, CONVERT(nvarchar(max) ,[Description]) AS [Narration], [Description],
   1 AS LevelNumber, DependOn
   FROM tblPosition  WHERE DependOn IS NULL
UNION ALL
SELECT E.PositionID, CONVERT(nvarchar(max) ,REPLICATE(SPACE(2), LevelNumber) + E.[Description]) AS [Narration],
   E.[Description], LevelNumber + 1 AS LevelNumber, E.DependOn
   FROM tblPosition E
INNER JOIN CTE ON E.DependOn=CTE.PositionID
)
SELECT * FROM CTE ORDER BY  PositionID, LevelNumber;

เมื่อเรียกคำสั่งข้างต้นจะได้ผลลัพธ์ดังภาพ

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

แต่จากทั้ง 2 ตัวอย่างข้างต้น ยังมีข้อผิดพลาดอยู่ ซึ่งผู้เขียนตั้งใจให้มันเกิด
ติ๊ก ต๊อก ติ๊ก ต๊อก หาดูว่าผิดตรงไหน

บอกเลยดีกว่า ผิดตรงการเรียงลำดับ ถ้ากรณีเราตั้งรหัส PositionID สะเปะสะปะ การเรียงลำดับจะทำให้มั่ว ดังนั้น หากต้องการจัดลำดับที่ถูกต้อง จำเป็นต้องเพิ่มคอลัมน์ภายใต้ CTE ขึ้นมาอีก 1 คอลัมน์ แล้วเขียนคำสั่ง ตามตัวอย่าง แล้วลองเรียกใช้งานดู

WITH CTE(PositionID, [Narration], [Description], LevelNumber ,DependOn, Trace)
  AS (
SELECT PositionID, CONVERT(nvarchar(max) ,[Description]) AS [Narration], [Description],
   1 AS LevelNumber, DependOn , CONVERT(nvarchar(max),PositionID) AS Trace
   FROM tblPosition  WHERE DependOn IS NULL
UNION ALL
SELECT E.PositionID, CONVERT(nvarchar(max) ,REPLICATE(SPACE(2), LevelNumber) + E.[Description]) AS [Narration],
   E.[Description], LevelNumber + 1 AS LevelNumber, E.DependOn ,
   CONVERT(nvarchar(max),CTE.Trace + E.PositionID) AS Trace
   FROM tblPosition E
   INNER JOIN CTE ON E.DependOn=CTE.PositionID
)
SELECT * FROM CTE ORDER BY  Trace;

ผลจากการปรับคำสั่งข้างต้น จะได้ผลลัพธ์ออกมาดังภาพ

จะเห็นว่าคอลัมน์ Trace จะทำการจัดเก็บข้อมูลรหัสที่อยู่ก่อนหน้าไว้ทั้งหมด ซึ่งเราจะใช้ข้อมูลนี้มาทำการจัดเรียงเพื่อให้การแสดงผลข้อมูลถูกต้อง

แค่ตาราง tblPosition เพียงตารางเดียว ทำไมมันช่างงงงวย วกวนเช่นนี้ ทาเกชิ สู้ ๆ

ยุคสมัยเปลี่ยนไปเดี๋ยวทำงานที่ไหนก็ได้ โชคดี  =  (โชค + อธิบดี) มีเงินใช้

เพื่อนผมชื่อโชค ครับ  ย้ำ โชค นะครับ

21 มีนาคม 2562

SQL Server - Identity Column

IDENTITY เป็นคุณสมบัติหนึ่งของคอลัมน์ ที่มีเก็บข้อมูลประเภทตัวเลข ได้แก่ประเภท int, tinyint, smallint, bigint, decimal และ numeric หากเราต้องการกำหนดค่าของคอลัมน์ Identity ให้เป็นคีย์ควรกำหนดข้อมูลเป็นตัวเลขจำนวนเต็ม ซึ่งเราจะนิยมใช้อยู่ 2 ประเภท คือ  int หรือ bigint  เมื่อกำหนดแล้ว โดยคุณสมบัติของคอลัมน์นี้จะเป็นการสร้างเลขลำดับแบบอัตโนมัติทันทีเมื่อมีการเพิ่มแถวของข้อมูลเข้าสู่ตาราง (อาจเพิ่มข้อมูลจะสำเร็จหรือไม่สำเร็จก็ได้)
ตัวอย่าง  การสร้างคอลัมน์ Identity ชื่อ row_id ให้กับตาราง product
CREATE TABLE product
            (row_id                       bigint NOT NULL IDENTITY(1,1) PRIMARY KEY , 
 product_code             nvarchar(20) NOT NULL ,
 product_name            nvarchar(100),
 product_type              nvarchar(10), 
 um                            nvarchar(20),
 sale_price                   money)

CREATE UNIQUE INDEX product_product_code ON product (product_code)

หลายท่านสงสัย ทำไมถึงต้องมี row_id ที่เป็น identity และทำเป็น PK ทั้ง ๆ ที่ มี product_code ที่เป็นรหัสสินค้าที่ไม่ซ้ำกันซึ่งสามารถทำเป็น primary key ได้อยู่แล้ว ผู้เขียนเลี่ยงจะไปทำเป็น unique ให้กับรหัส product_code แทน  ด้วยเหตุผลทางด้านความเร็ว

แล้วมันเอาไปทำอะไรได้บ้าง   

1. เอาไปทำลำดับของข้อมูลอันไหนเกิดก่อนหลัง 
2. เอาไปทำเป็นคีย์ ใช้เวลาปรับปรุงข้อมูล ลบข้อมูล "คงสงสัย อ้าวมันก็มี product_code อยู่แล้ว แล้วจะใช้ row_id ทำไม" มาดูตัวอย่าง เช่น 
          เราเลือกข้อมูลมารายการมา 1 รายการ เช่น product_code = '000001'
          DECLARE @ROW_ID int ;

          SELECT @ROW_ID = row_id , * FROM product WHERE product_code = '000001'
          เก็บ row_id ไว้ในตัวแปร @ROW_ID (ถ้าเขียนโปรแกรมก็เก็บและเรียกใช้ ก็แนว ๆ นี้แหละ)
          เวลาจะปรับปรุง หรือลบ ก็ใช้ row_id มาใช้ได้เลย ทำให้เราสามารถหลับหูหลับตาใช้เงื่อนไข where row_id เดิม ๆ ในการปรับปรุงได้กับทุก ๆ ตาราง
         UPDATE SET product_code = '000002' , product_name = 'KKKK' WHERE row_id = @ROW_ID
ไม่ว่าจะใช้ตารางใด ๆ ก็ตาม เราไม่ต้องไปสนใจกับรหัสต่าง ๆ ที่เราตั้งขึ้นมา ก็ใช้ row_id ที่เป็น identity ได้เลยสะดวกดี

3. เลื่อนข้อมูลทีละรายการ ก็ใช้ได้
         
DECLARE @ROW_ID int ;
         SET @ROW_ID = 0;
        --- เริ่มอ่านจาก @ROW_ID แรก
         SELECT TOP 1 @ROW_ID = row_id , * FROM product WHERE row_id > @ROW_ID
         --  อ่านรายการต่อไป และต่อ ๆ ไป ก็เขียนเช่นเดิม ตามลำดับก่อนหลัง
         SELECT TOP 1 @ROW_ID = row_id , * FROM product WHERE row_id > @ROW_ID
4. ช่วยให้ข้อมูลเป็นเอกลักษณ์ บางตาราง อาจจะมีข้อมูลรายการซ้ำกันทุกคอลัมน์ SQL SERVER จะงงทำไม่ได้เมื่อมีการปรับปรุงข้อมูล เราก็เอา Identity คอลัมน์มาช่วยได้

5. และอื่น ๆ ตามที่อยากทำและนำไปใช้

ข้อระวัง


สิ่งที่ต้องระวัง เคยเห็นบางระบบ เอา Identity คอลัมน์ไปทำ เป็น Key เพื่อเชื่อมโยงไปยังตารางอื่น  (PK -> FK) ไม่ควรทำเป็นอย่างยิ่ง ถ้าจะใช้ให้ตั้งเป็นรหัส เช่น product_code แล้วเอาไปเชื่อมโยงแทน เวลาเกิดปัญหาถ้าคนอื่นมาทำต่อ หรือมาจัดการข้อมูลโดยไม่ทราบว่ามีการเชื่อมโยง แล้วหากมีการ generate Identity ใหม่ก็บรรลัยเกิด 

สวัสดีช่วงหน้าร้อน
เนื้อหารายละเอียดสามารถอ่านได้ที่ หนังสือรอบรู้ประยุกต์ใช้ SQL Server สั่งซื้อออนไลน์ได้ที่ ศูนย์หนังสือจุฬา http://www.chulabook.com/description.asp?barcode=9789740335108

19 กันยายน 2561

SQL Server - LIKE กับภาษาไทย

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

            SELECT [id], [name] FROM [TESTDB].[dbo].[TABLE01] WHERE [name] LIKE "ก%"

จากคำสั่งข้างต้น เราจะเห็นว่า ข้อมูลที่เป็นภาษาไทยที่ขึ้นต้นด้วย ก ก็น่าจะออกมาแสดงทั้งหมด แต่ท่านทราบไหมว่า ภาษาไทย คำว่า "เกษม"  เราก็ถือว่าขึ้นต้นด้วย "ก" แต่ผลลัพธ์ของที่ได้จากคำสั่งข้างต้น กลับไม่สามารถหาคำว่า เกษม เจอ  ...... คราวนี้ก็ยุ่งซิ ต้องการข้อมูลแต่กลับได้ออกมาไม่ตรง แล้วจะทำไงดี...... เราก็ต้องประยุกต์คำสั่งอื่นมาใช้แทน โดยอาศัยคำสั่ง CHARINDEX กับ COLLATE THAI_BIN มาช่วย ดังตัวอย่างตามภาพด้านล่าง


จากการทดสอบคำสั่งทั้ง 2 รูปแบบ ผลที่ได้ออกมาต่างกัน ดังนั้น หากต้องการสอบถามข้อมูลภาษาไทย ก็สามารถใช้ CHARINDEX เข้ามาช่วยได้

เช่น ถ้าต้องการหาข้อความ "ก"  ณ.ตำแหน่งใด ๆ ก็ได้  ให้ใช้

     CHARINDEX('ก',[ชื่อคอลัมน์] COLLATE THAI_BIN) > 0

หรือ  ถ้าต้องการหาข้อความ "ก"  ณ.ตำแหน่งเริ่มต้น  ให้ใช้

     CHARINDEX('ก',[ชื่อคอลัมน์] COLLATE THAI_BIN) BETWEEN 1 AND 2

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

สวัสดี ฝนตกเยอะจริงปีนี้

23 มิถุนายน 2561

PHP - การติดตั้งไดร์เวอร์ SQL Server

** ปรับปรุง 2565
ปกติเราจะใช้งาน PHP กับระบบฐานข้อมูล mySQL หรือ MariaDB กันเป็นส่วนใหญ่ ซึ่งตัว xampp ได้ติดตั้งไดร์เวอร์มาให้เรียบร้อย แต่องค์กรส่วนใหญ่ก็มีการใช้งานระบบฐานข้อมูลตัวอื่น เช่น SQL Server ซึ่งไดร์เวอร์ส่วนของตัวติดตั้ง Web Server ของค่าย AppServ, WAMPP หรือ XAMPP ไม่ได้จัดเตรียมไว้ให้ ดังนั้นเมื่อติดตั้ง Web Server เสร็จก็ต้องทำการติดตั้งไดร์เวอร์สำหรับ SQL Server เพิ่มเข้าไปกันเอง

สำหรับบทความนี้ จะนำเสนอการติดตั้งบน XAMPP โดยเพิ่มไดร์เวอร์ ของ SQL Server ให้กับ PHP รุ่น 8.1 ภายใต้ระบบปฎิบัติการ Windows

** ขั้นตอนการติดตั้ง XAMPP  / PHP 8.1 จะไม่ขอกล่าวถึง จะข้ามไปที่ขั้นตอนติดตั้งไดร์เวอร์ของ SQL Server เลย โดยมีวิธีการดังนี้

1. เข้าไปที่เว็บ Micsrosft เพื่อดาวน์โหลไดร์เวอร์ SQL Server สำหรับ php โดยคลิกที่ Link ด้่านล่าง










เมื่อได้ zip ไฟล์มาแล้ว ให้แตก zip ไฟล์มาเก็บไว้ซักทีนึง ซึ่งเราจะเห็นไฟล์ไดร์เวอร์จำนวนมาก 
งานนี้ต้องตาดีได้ตาร้ายเสีย ดูรุ่นให้ตรงกับที่เราติดตั้ง PHP






















การเลือกไดร์เวอร์ต้องดูตอนติดตั้ง เช่น ติดตั้ง PHP 8.1 เป็นรุ่นไหน ระหว่าง nts หรือ ts และ x86 หรือ x64 ก็ต้องเลือกไฟล์ตามนั้น โดยเปิดดู PHPInfo ดูรายละเอียดรุ่นตามภาพ


















2. เมื่อเราได้ไฟล์เป้าหมายเรียบร้อย 
กรณีติดตั้ง XAMPP  ให้ไปที่โฟลเดอร์  C:\xampp\php\ext
จากนั้นให้ทำการก็อปไฟล์ไดร์เวอร์ตาม version ที่ต้องการมาใส่ได้เลย


















* ตัวอย่าง ภาพเป็นการใช้ไฟล์ไดร์เวอร์
php_pdo_sqlsrv_81_ts_x64.dll
php_sqlsrv_81_ts_x64.dll


3. ให้ไปเปิดไฟล์ php.ini ขั้นมาแก้ไข แล้วเพิ่มคำสั่งด้านล่างเข้าไป
(ไฟล์นี้เก็บอยู่ใน C:\xampp\php)

extension=php_pdo_sqlsrv_81_ts_x64
extension=php_sqlsrv_81_ts_x64















4. จากนั้นทำการ Restart service ของ web server ใหม่ 
แล้ว เข้าไปสำรวจ phpinfo จะต้องมี pdo_sqlsrv และ sqlsrv ปรากฎอยู่
ถ้าไม่มี เริ่มใหม่ ดูว่าไดร์เวอร์ตรงไหม



















สวัสดีติดต่อฐานข้อมูลของ SQL Server ได้แล้ว

 

18 มิถุนายน 2561

กำหนดให้ 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 ใหม่เข้าไปให้กับโปรแกรมของเรา โดยทำดังนี้
1. ให้ทำการเปิด Registry Editor ขึ้นมา (search ที่วินโวส์หาคำว่า regedit)
2. จากนั้นให้เข้าไปที่ FEATURE_BROWSER_EMULATION ตามลำดับการเข้าถึงดังนี้

HKEY_LOCAL_MACHINE (or HKEY_CURRENT_USER)
   SOFTWARE
      Microsoft
         Internet Explorer
            Main
               FeatureControl
                  FEATURE_BROWSER_EMULATION
                     yourapp.exe = (DWORD) version

3. ให้คลิกเมาส์ปุ่มขวาในส่วนของ  FEATURE_BROWSER_EMULATION แล้วเลือก New ->  DWORD (32-bit) Value   จากนั้นให้กำหนดชื่อของโปรแกรมที่เราใช้งาน เช่น  yourapp.exe เมื่อกำหนดชื่อเรียบร้อยให้ ดับเบิ้ลคลิกเข้าไปแก้ไขค่า โดยกำหนดค่าในส่วนของ Value data: เป็น 11001 และ Base เลือก Decimal ดังภาพ

ถึงตอนนี้เราก็สามารถเรียกใช้งาน เว็บไซต์ที่สร้างด้วย HTML5 ผ่านทางโปรแกรมของเราด้วย Web Browser Control  ได้แล้ว

cr. โก๋แก แห่ง FoxBoard

รายละเอียดเพิ่มเติม สามารถอ่านได้ที่ 

สวัสดี ขอให้คนอ่านมีความสุข รวย ๆ 

02 มิถุนายน 2561

VS Code : Open Web Browser in VS Code

เครื่องมือที่ใช้เขียนคำสั่งในยุคนี้ ตัวที่ได้รับความนิยมสูงคงหนีไม่พ้น VS Code ของ Microsoft หากลองติดตั้งและใช้งานรับรองว่าจะติดใจ คุณสามารถดาวน์โหลดได้ที่ https://code.visualstudio.com/download

หลายคนลองเขียนคำสั่ง HTML ง่ายๆ แล้วจะรันผ่าน VS Code ทำอย่างไรดี ????? มีหลายวิธีซึ่งแต่ละวิธีก็คงต้องออกแรงกันหน่อย สำหรับบทความนี้เราจะอาศัย Extension เอามาใส่เสริมเพิ่มเข้าไป

วิธีการทำให้ VS Code สามารถรัน HTML ผ่าน browser

1. ให้กดปุ่ม Ctrl+Shift+X หรือกดปุ่ม Extension ตามลูกศรชี้ในภาพด้านล่าง เพื่อเปิดช่องหน้าต่าง EXTENSIONS
2. ในช่องค้นหาด้านบน ให้พิมพ์คำว่า open in browser
3. ก็คลิกที่ปุ่ม Install    เมื่อทำการติดตั้งเสร็จเรียบร้อยก็ให้คลิกที่ปุ่ม Reload

จากนั้นเมื่อต้องการรันไฟล์ HTML ก็ทำการคลิกขวาที่ไฟล์แล้วเลือกรายการ Open In Default Browser

วิธีการทำให้ VS Code สามารถ Preview Browser

หากต้องการจะเห็นหน้าเว็บว่าสิ่งที่เราแก้ไขเป็นอย่างไร (หลังจากบันทึก Ctrl-S) แบบทันทีทันใด (Preview) ก็สามารถทำได้ไม่ยากอีกเช่นกัน โดยไปหา Extension มาเสริม
1. ให้กดปุ่ม Ctrl+Shift+X หรือกดปุ่ม Extension
2. ในช่องค้นหาด้านบน ให้พิมพ์คำว่า VSCode Browser Sync
3. ก็คลิกที่ปุ่ม Install    เมื่อทำการติดตั้งเสร็จเรียบร้อยก็ให้คลิกที่ปุ่ม Reload

การใช้งาน เมื่อเราอยู่ที่ไฟล์ ที่เราเขียนคำสั่ง หากต้องการใช้งานให้ทำดังนี้
1. ให้กดปุ่มบนคีย์บอร์ด Ctrl+Shift+ P เพื่อเปิดช่อง Command แล้วพิมพ์ Browser Sync: Server mode at side panel
จะปรากฎหน้าต่างบราวเซอร์แสดงทางด้านซ้ายมือของโปรแกรม ถึงตอนนี้ให้ทำการแก้ไขคำสั่ง HTML ตามต้องการ แล้วทำการบันทึก (Ctrl-S) เราก็จะเห็นข้อมูลบนหน้าเว็บถูกปรับปรุงตาม

ตานี้ก็มาถึงกรณีถ้าเราเขียนโปรแกรมแบบ Server Site พวก PHP ละจะทำอย่างไร

1. ให้กดปุ่ม Ctrl+Shift+P เพื่อเปิดช่อง Command แล้วพิมพ์ Browser Sync: Proxy mode in browser กดปุ่ม Enter

2. โปรแกรมจะรอให้เราป้อน url เข้าไป ให้ป้อน http://localhost หรือ http://localhost/ชื่อโฟลเดอร์  แล้วแต่ว่าจะกำหนดอะไรไป
   เช่น http://localhost/kasem1  แล้ว Enter 2 ครั้ง ก็จะปรากฎโปรแกรม Browser แสดงขึ้นมา

ถึงตอนนี้ลองแก้โค้ดคำสั่ง แล้ว Save ดู ที่ browser ก็จะเปลี่ยนตามอัตโนมัติด้วยเช่นกัน

แปลกแต่จริง ที่ Microsoft พัฒนา VS Code มาให้ใช้งาน แต่..... ไม่มีเมนู Print มาให้
ดังนั้นหากต้องการพิมพ์คำสั่งออกทางเครื่องพิมพ์ก็ต้องไปหาดาวน์โหล Extension มาใช้งาน

สามารถเข้าไปดาวน์โหลดส่วนเสริม PrintCode ได้ที่
https://marketplace.visualstudio.com/items?itemName=nobuhito.printcode

หลังจากติดตั้งส่วนเสริม PrintCode เรียบร้อยแล้ว 
ทำการเรียกใช้งานโดยกดปุ่ม Ctrk + Shift + P
พิมพ์ PrintCode ดังภาพ แล้วคลิกเรียกใช้งาน ดังภาพ

หอมปากหอมคอสำหรับการเริ่มใช้งาน VS Code เบื้องต้น

เขียนโปรแกรมง่ายนิดเดียว ที่เหลือยากหมด
สวัสดี

08 พฤษภาคม 2561

UNITY 3D Course : Learning 3D Game With Unity สอนเขียนเกม 3 มิติ

วิีดิโอ สอนเขียนเกม 3 มิติ ด้วย Unity 3D ทำไว้ชุดใหญ่ มาดูมาชมกันนะครับ
คลิกที่ลิงค์ตามที่อยู่เว็บด้านลา่งได้เลย

https://www.youtube.com/channel/UCnJrFe1pM8cP_7eRmP5XcNQ/videos

ภาพตัวอย่าง

 คลิกเพื่อเข้าสู่วีดิโอ
ไม่เรียนก็ไม่รู้ ไม่ดูก็ไม่เป็น ไม่เห็นคงไม่เชื่อ ไม่ทำก็ไม่ชำนาญ ไม่พยายามก็ไม่รู้ถึงอุปสรรค .....

เรียนก็รู้ ดูก็เป็น เห็นก็เชื่อ ทำก็ชำนาญ พยายามก็ผ่านอุปสรรค....

07 พฤษภาคม 2561

SQL Server - STOCK BALANCE และ ACCUMULATE

ริ่นหัวโพสว่า STOCK BALANCE และ ACCUMULATE เชื่อหลายท่านถ้าให้เขียนโปรแกรมหาเพื่อยอดคงเหลือของสต็อก หรือหายอดสะสม คงนั่งคิดและเขียนโปรแกรมกันยาวเหยียด แต่ถ้าเราใช้ความสามารถของ SQL Server แล้ว ขอบอกว่าสั้นนิดเดียว ช่วยลดเวลาเอาสมองไปคิดอย่างอื่นได้อีกมากมาย มาเริ่มกันเลย

การหายอดสต็อกคงเหลือ  (STOCK BALANCE)

สร้างตารางชั่่วคราวตัวอย่างทดสอบกันก่อน  (มีชื่อว่า #Test)

CREATE TABLE #Test    (
      id INT IDENTITY(1,1) NOT NULL,
      ItemCode CHAR(10) ,
      QtyIn MONEY ,
      QtyOut MONEY
    )

INSERT  INTO #Test
   VALUES  ( '1', 200, 0 ),
           ( '1', 250, 0 ),
           ( '1', 300, 0 ),
           ( '2', 150, 0 ),
           ( '2', 0, 150 ),
           ( '2', 300, 0 ),
           ( '2', 100, 0 )

-- เรียกดูข้อมูล
SELECT * FROM #Test

-- ทำการหายอดคงเหลือของสต็อก แสดงในลักษณะของการ์ดแสดงยอดคงเหลือ (Stock Card)
SELECT  * ,
        SUM(QtyIn - QtyOut) OVER ( PARTITION BY ItemCode ORDER BY ItemCode, id ) 
                 AS CurrBAL
FROM    #Test
ORDER BY ItemCode, id

จะได้ผลลัพธ์ดังภาพ












จะเห็นว่าการนำเอา OVER PARTITION BY มาใช้งานทำให้เราสามารถคำนวณยอดสต็อกออกมาได้อย่างง่ายดาย

การหายอดสะสม  (ACCUMULATE)

การคำนวณยอดสะสมเราก็มักจะโดยให้ทำรายงานหรีอเขียนโปรแกรมกันบ่อยๆ ซึ่งก็ไม่ยากอีกเช่นกัน มาลองศึกษาตามกันเลยครับ

CREATE TABLE #DrCr   (
      id INT IDENTITY(1,1) NOT NULL,
      ItemCode CHAR(10) ,
      Amt1 MONEY ,
      Amt2 MONEY
    )

INSERT  INTO #DrCr
   VALUES  ( '101', 200, 100 ),
           ( '101', 50,100 ),
           ( '101', 150, 100 ),
           ( '102', 550, 50 ),
           ( '102', 200, 150 ),
           ( '102', 10, 100 ),
           ( '102', 60, 300 )

ทีนี้เราจะนำเอายอดของ Amt1 บวกกับ Amt2 แล้วสะสมไปเรื่อยๆ โดยแบ่งตามกลุ่มของ ItemCode

SELECT id, ItemCode, Amt1, Amt2,
       SUM(Amt1+Amt2) OVER (PARTITION BY ItemCode
             ORDER BY ItemCode, id ROWS UNBOUNDED PRECEDING) AS AccuAmt
FROM #Accu

จะได้ผลลัพธ์ดังภาพ












จะเห็นว่ามีการนำเอา OVER PARTITION BY ItemCode -- คำสั่งนี้จะหมายถึงแบ่งกลุ่มตาม ItemCode
แล้วเรียงลำดับตาม ItemCode, id ด้วยคำสั่ง ORDER BY ItemCode, id
ROWS เป็นการกำหนดการคำนวณค่าที่เกิดขึ้นของแถวต่างๆ ที่เกี่ยวข้องให้กับแถวปัจจุบัน
UNBOUNDED PRECEDING เป็นการกำหนดให้เริ่มคำนวณต้้งแต่แถวแรกของกลุ่ม (PARTITION BY) จนถึงแถวปัจจุบัน

เอาละครับสำหรับการหา Stock Balance และ Accumulate ก็คงทำให้การทำงานสะดวกขึ้น
สวัสดีมีเวลาเยอะๆ


SQL Server - รันเลขที่เอกสาร (SEQUENCE)

กติเวลาเขียนโปรแกรม เช่น ใบสั่งซื้อ (PO) ใบขายสินค้า (Invoice) ใบส่งสินค้า (DO) และใบอื่นๆ อีกมากมาย ซึ่งเอกสารเหล่านี้จะต้องมีหมายเลข หรือเลขที่เอกสารกำกับเสมอ วิธีนึงที่ใช้กันมาตั้งแต่อดีต คือเราจะสร้างตารางสำหรับเก็บเลขที่เอกสาร แล้วไปเรียกมาใช้งานแล้วปรับปรุงเลขที่ๆใช้แล้วกลับไป (หลายขั้นตอนจัง บางคนทำไม่ถูกก็เกิดซ้ำก็มี บางคนเลขกระโดดก็มี)
ตั้งแต่ SQL Server 2012 เป็นต้นมา Microsoft ได้เพิ่มเรื่องของการจัดการ SEQUENCE หรือการรันเลขที่มาให้เราใช้งาน ซึ่งสามารถนำมาประยุกต์ใช้งานในการจัดการเลขที่ของเอกสารได้อย่างสะดวกและง่ายดาย

การสร้างเลขลำดับ

คำสั่งในการสร้างลำดับของเอกสาร
เช่น ต้องการสร้างลำดับของเอกสารใบสั่งซื้อ (PO) สามารถทำได้โดยใช้คำสั่ง

CREATE SEQUENCE PO 
   START WITH 1
   INCREMENT BY 1 ;

ต้องการสร้างลำดับของเอกสารใบสั่งซื้อ (Invoice) สามารถทำได้โดยใช้คำสั่ง

CREATE SEQUENCE IV
   START WITH 1
   INCREMENT BY 1 ;

สำหรับ PO และ IV เป็นชื่อที่เราใช้อ้างถึงในการเรียกใช้งานเลขลำดับ

ทำการ Excute คำสั่งก็จะได้ข้อมูลสำหรับเก็บเลขลำดับของ PO และ IV  ซึ่่งเลขลำดับที่เราสร้างขึ้นจะถูกเก็บไว้ภายใต้ ตาราง (System Views) ชื่อ sys.sequences ซึ่งเราสามารถเรียกดูข้อมูลของ SEQUENCE ที่เราสร้างได้โดยใช้คำสั่ง

SELECT * FROM sys.sequences      -- จะแสดงข้อมูลทั้งหมด

SELECT name, current_value FROM sys.sequences   -- จะแสดงชื่อและลำดับปัจจุบันออกมา

การลบเลขลำดับ

กรณีสร้างไว้เยอะเกินก็สามารถลบออกได้โดยใช้ คำสั่ง DROP SEQUENCE เช่น

DROP SEQUENCE IV  ;

การเรียกใช้งานเลขลำดับ

การเรียกใช้งานเลขลำดับสามารถเรียกใช้งานได้ภายใต้คำสั่งต่างๆ เช่น SELECT, INSERT, UPDATE หรือ ภายใต้ตัวแปร เป็นต้น โดยใช้คำสั่ง

NEXT VALUE FOR ชื่อ

เช่น
SELECT NEXT VALUE FOR PO 

หรือ SELECT NEXT VALUE FOR PO  AS PONO

หรือ
DECLARE @PO VARCHAR(10)
DECLARE @SEQ INT
SET @SEQ = NEXT VALUE FOR PO
SET @PO = 'PO' + RIGHT('00000' + CAST(@SEQ AS VARCHAR(5)),5)
SELECT @PO
 -- ผลลัพธ์ที่ได้    PO00001

การแก้ไขเลขลำดับ หรือกำหนดเลขลำดับใหม่

การกำหนดเลขลำดับใหม่สามารถทำได้โดยใช้คำสั่ง ALTER SEQUENCE
เช่น ต้องการกำหนดลำดับของ PO ใหม่เป็น 101

ALTER SEQUENCE PO
    RESTART WITH 100          -- เมื่อเรียกเลขลำดับในครั้งต่อไปจะได้เลข 101


การนำไปใช้งาน

สำหรับตัวอย่างต่อไปนี้เป็นการสร้าง Stored Procedure สำหรับสร้างและเรียกใช้งาน SEQUENCE

CREATE PROCEDURE spRunDoc (@DocType AS NVARCHAR(20))
AS
BEGIN
 DECLARE @cmd NVARCHAR(250)
 DECLARE @zero NVARCHAR(5) = '00000'
 IF NOT EXISTS(SELECT name FROM sys.sequences WHERE name = @DocType)
 BEGIN
  SET @cmd = 'CREATE SEQUENCE ' + @DocType + ' START WITH 1 INCREMENT BY 1'
  EXECUTE(@cmd)
 END
 SET @cmd = 'SELECT ''' + @DocType + ''' + RIGHT(''' + @zero + ''' + CAST(NEXT VALUE FOR ' + @DocType + ' AS NVARCHAR),5)'
 EXECUTE(@cmd)
END

การนำไปใช้

EXEC spRunDoc 'PO'   -- จะส่งตารางของลำดับออกมา

EXEC spRunDoc 'PO61'  -- จะส่งตารางของลำดับออกมา

จาก  Stored Procedure ข้างต้นจะเป็นการสร้าง Sequence ให้ใหม่เมื่อตรวจสอบไม่พบชื่อ Sequence ที่อ้างถึง จากนั้นก็ทำการเรียกเลขลำดับออกมา


สวัสดีมีเลขลำดับไว้ใช้งาน





14 มีนาคม 2561

VFP - แปลงตัวเลขเป็นตัวอักษรไทย (เงินบาท) ฟังก์ชั่นในตำนาน

ไปเจอฟังก์ชั่นในตำนานที่มีการโพสไว้เมื่อยี่สิบปีก่อน หลายคนนำไปใช้ อึ้งและทึ่งกับคนที่คิด วันนี้เวลาผ่านไปนานมาก ฟังก์ชั่นนี้ก็ยังคงอยู่ในใจหลายๆ คน
แปลงค่าเงิน มาเป็นตัวอักษรไทย
999.99 (เก้าร้อยเก้าสิบเก้าบาทเก้าสิบเก้าสตางค์) คิดได้สุดยอดมาก บรรทัดเดียวจริงๆ

FUNCTION spell
PARAMETER Vn
Va = STRT(TRAN(Vn,'@R G9A9B9C9D9E9F9A9B9C9D9E9F9.9F9S'),' F0.','')

RETURN STRT(STRT(STRT(STRT(STRT(STRT(STRT(STRT(STRT(STRT(STRT(STRT(STRT(;
STRT(STRT(STRT(STRT(STRT(STRT(STRT(STRT(STRT(STRT(STRT(STRT(STRT(STRT(;
SUBS(Va,RAT(' ',Va)+2,35),'1','หนึ่ง'),'2','สอง'),'3','สาม'),'4','สี่'),;
'5','ห้า'),'6','หก'),'7','เจ็ด'),'8','แปด'),'9','เก้า'),'.0F0S','บาทถ้วน'),;
'0F',''),'0E',''),'0D',''),'0C',''),'0B',''),'0',''),'A','ล้าน'),;
'B','แสน'),'C','หมื่น'),'D','พัน'),'E','ร้อย'),'F','สิบ'),'.','บาท'),;
'หนึ่งสิบ','สิบ'),'สองสิบ','ยี่สิบ'),'สิบหนึ่ง','สิบเอ็ด'),'S','สตางค์')

ขอบคุณ คุณ Karun ที่ได้สร้างฟังก์ชั่นนี้ไว้ให้พวกเราใช้งาน
"I Believe in You"

Copyright(c) 2007 - 2022 by Kasem Kamolchaipisit.