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 ที่อ้างถึง จากนั้นก็ทำการเรียกเลขลำดับออกมา


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





"I Believe in You"

Copyright(c) 2007 - 2022 by Kasem Kamolchaipisit.