ระบบวัสดุคงเหลือ - การตีราคาสินค้าคงเหลือด้วยวิธีราคาทุน (Inventory Costs Method)

โดย SONGCHAI SAETERN

การตีราคาสินค้าคงเหลือด้วยวิธีราคาทุน (Inventory Costs Method)

หลังจากได้อ่านบทความในเว็บต่างๆก็สรุปได้ดังนี้

1. FIFO เข้าก่อน-ออกก่อน เหมาะสำหรับการตัดสต๊อกที่ใช้สำหรับของที่มีวันที่หมดอายุกำกับไว้ อาจจะเนื่องด้วยพนักงานสต๊อกจะต้องคอยเช็ควันที่หมดอายุบนสินค้าเสมอๆอยู่แล้ว

2. LIFO เข้าหลัง-ออกก่อน เหมาะสำหรับการตัดสต๊อกสินค้าที่ตกเทรนเร็วแบบคอมพิวเตอร์ หรือสินค้าเทคโนโลยีอื่นๆ ซึ่งส่วนใหญ่จะทำโปรโมชั่นมาล่อตาล่อใจให้ลูกค้าซื้อรุ่นใหม่ๆ ดังนั้นพนักงานก็ต้องตัดสต๊อกตัวที่ใหม่ที่สุดออกก่อน เพราะทิ้งไว้นานไปราคาทุน ณ ปัจจุบันจะไม่ตรงกับราคาที่ขายไป



3. Weighted Average ถัวเฉลี่ยน้ำหนัก เหมาะกับสินค้าที่ไม่มีวันหมดอายุกำกับ และราคาขึ้นลงไม่มากนัก (คอมพิวเตอร์หรือสินค้าเทคโนโลยีจะขึ้นลงทีเป็นหลักร้อยหลักพัน) ซึ่งเหมาะกับการนำมาใช้ทำสต๊อกวัสดุคงเหลือของสำนักงาน







ปัญหาของการใช้ Weighted Average หรือการถัวเฉลี่ยราคาทุนต่อหน่วย จะมีอยู่ 2 รูปแบบ

1. แบบ Periodic Inventory เป็นการคิดราคาทุนถัวเฉลี่ยของสินค้าคงเหลือปลายงวด นั่นก็คือ บันทึกการรับเข้าด้วยราคาต่อหน่วยที่ต่างกัน ส่วนตอนบันทึกจ่ายระบุเพียงจำนวนไม่ต้องระบุราคา เมื่อถึงปลายงวดก็หาราคาเฉลี่ยต่อหน่วยและนำไปคำนวณหาราคาทุนคงเหลือ เพื่อหักยอดรวมออก ก็จะได้เป็นต้นทุนจ่าย ณ วันที่ทำรายงาน
https://krurabieb.wordpress.com/2007/12/10/การตีราคาสินค้าคงเหลือ

ตัวอย่างแบบฟอร์มการขอเบิกจ่าย แบบไม่ระบุราคาต่อหน่วย


2. แบบ Perpetual Inventory จะเป็นการคิดราคาทุนเฉลี่ยเคลื่อนที่ (Moving Average Method) คือจะระบุราคาการเบิกจ่ายแต่ละครั้งลงไปด้วย ดังนั้นก็จะต้องคำนวณราคาทุนที่มีอยู่ก่อนกับการรับเข้ามาใหม่ทุกครั้งที่มีการเบิกจ่าย
https://krurabieb.wordpress.com/2007/12/10/การตีราคาสินค้าคงเหลือ


ตัวอย่างแบบฟอร์มขอเบิกจ่าย แบบระบุราคาต่อหน่วย

สำหรับปัญหาที่เจอในการถัวเฉลี่ยแบบ Moving Average ก็คือเรื่องจุดทศนิยมของราคาต่อหน่วย เมื่อหารไม่ลงตัว จะเกิดผลรวมที่ไม่ตรงกัน


กรณีหารลงตัว


กรณีหารไม่ลงตัว


วิธีแก้ปัญหาคือเก็บทศนิยม 4 ตำแหน่ง



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




ที่มา :  

การตีราคาสินค้าคงเหลือด้วยวิธีราคาทุน
https://krurabieb.wordpress.com/2007/12/10/การตีราคาสินค้าคงเหลือ

ต้นทุนขาย FIFO VS LIFO VS Weight Average
http://www.challengemetutor.com/articles/41997457/ต้นทุนขาย-FIFO-VS-LIFO-VS-Weight-Average.html


PHP CI MANIA PHP Code Generator 
โปรแกรมช่วยสร้างโค้ด ลดเวลาการเขียนโปรแกรม เขียนโปรแกรมง่ายและสะดวกขึ้น
สนใจสั่งซื้อราคาสุดคุ้ม >> http://fastcoding.phpcodemania.com/

JavaScript HTML DOM Animation การเคลื่อนย้าย element ในหน้าเว็บ

โดย SONGCHAI SAETERN

มาฝึกเขียน JavaScript กันเถอะ 

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

if(!pX) pX=350;
if(!pY) pY=350;

ตำแหน่งกรอบสีแดงจะถูกบวกเพิ่มไปจนกระทั่งครบตามที่กำหนดไว้
      if(posY < pY) posY++;
      if(posX < pX) posX++;
      elem.style.top = posY + 'px';
      elem.style.left = posX + 'px'; 



และในพื้นที่สีเหลืองนี้ ได้กำหนดคำสั่ง OnClick เอาไว้เพื่อให้กรอบสีแดงเคลื่อนไปยังจุดที่คลิก

<div id ="container" onclick="sendPos(event)">


ในฟังก์ชั่น sendPos() จะรับค่า event ที่ได้จาก onclick และรับค่าตำแหน่ง offsetX, offsetY เพื่อส่งไปยังฟังก์ชั่น myMove() เพื่อเคลื่อนย้ายสีเหลี่ยมสีแดงไปยังตำแหน่งที่คลิก

function sendPos(event){
    myMove(event.offsetX  , event.offsetY );
}

สังเกตุว่าการเคลื่อนย้ายจะไม่เป็นเส้นตรง เพราะตำแหน่ง X และ Y ไม่เท่ากัน ดังนั้นเมื่อถึงตำแหน่งแนวไหนก่อน ก็จะเคลื่อนไปอีกแนวเท่านั้น


แนวทางการปรับปรุงโค้ดให้การเคลื่อนที่เป็นเส้นตรง

ยกตัวอย่าง x = 78 , y = 264
ให้ยึดค่าที่มากกว่าเป็นหลัก นั่นคือแกน y จะขยับอยู่ 264 ครั้ง
ดังนั้น ต้องนำค่าแกน x มาเฉลี่ยให้ได้ 264 ครั้งด้วยสูตร
 min / max  นั่นก็คือ  78 / 264 = 0.295

ซึ่งถ้าคูณกลับ 0.295 * 264 = 77.88 ซึ่งยังไม่ครบตำแหน่งจริงคือ 78
ดังนั้นจะมีการขยับอีกครั้ง 77.88 + 0.295 จะกลายเป็น 78.175

จะเห็นว่าเลยตำแหน่งจริงไป 0.175

ดังนั้น ต้องตรวจสอบว่าถ้าเลยตำแหน่งจริงเมื่อไหร่ต้องกำหนดให้เท่าตำแหน่งจริง





รายละเอียด

ตัวอย่างโค้ด JavaScript ทั้งหมด


<!DOCTYPE html>
<html>
<style>
#container {
  width: 400px;
  height: 400px;
  position: relative;
  background: yellow;
}
#animate {
  width: 50px;
  height: 50px;
  position: absolute;
  background-color: red;
}
</style>
<body>
<p>
<button onclick="myMove()">Click Me</button>
</p>
<p><span id="debug"></span> || <span id="current"></span></p>
<div id ="container" onclick="sendPos(event)">
<div id ="animate"></div>
</div>
<script>
function myMove(pX, pY) {
if(!pX) pX=350;
    if(!pY) pY=350;
document.getElementById("debug").innerHTML = pX + " : " + pY;
  var elem = document.getElementById("animate"); 
  var posX = 0;
  var posY = 0;
  var id = setInterval(frame, 5);
  function frame() {
      if (posX >= pX && posY >= pY) {
      clearInterval(id);
    } else {
      if(posY < pY) posY++;
      if(posX < pX) posX++;
      elem.style.top = posY + 'px';
      elem.style.left = posX + 'px';
      document.getElementById("current").innerHTML = posX + " : " + posY;
    }
  }
}
function sendPos(event){
    myMove(event.offsetX  , event.offsetY );
}
</script>
</body>
</html>

--------------------------

อ้างอิง

JavaScript HTML DOM Animation
https://www.w3schools.com/js/tryit.asp?filename=tryjs_dom_animate_3

How do I get the coordinates of a mouse click on a canvas element?
https://stackoverflow.com/questions/55677/how-do-i-get-the-coordinates-of-a-mouse-click-on-a-canvas-element


PHP CI MANIA PHP Code Generator 
โปรแกรมช่วยสร้างโค้ด ลดเวลาการเขียนโปรแกรม เขียนโปรแกรมง่ายและสะดวกขึ้น
สนใจสั่งซื้อราคาสุดคุ้ม >> http://fastcoding.phpcodemania.com/

PHP กับจัดการฐานข้อมูลหมวดหมู่สินค้า MySQL แบบใช้ตารางเพียงตารางเดียวเท่านั้น

โดย SONGCHAI SAETERN

การเขียนโปรแกรม PHP แสดงหมวดหมู่สินค้า



สำหรับโครงสร้างฐานข้อมูลแบบทั่วไปเมื่อมีรายการย่อย เราจะใช้หลักการ One -> Many คือมี 1 ตารางหมวดหมู่หลัก และมีอีก 1 ตารางเป็นหมวดหมู่ย่อย






แต่ปัญหาของกรณีแยกตารางออกจากกันนี้ ตัวผู้เขียนพบปัญหาว่าเมื่อมีหมวดหมู่ย่อยลงไปอีก  3 ชั้นบ้าง 4 ชั้นบ้าง หรืออาจจะมีหมวดย่อยไม่จำกัด ก็จะทำให้การเขียนโปรแกรมนั้นยากขึ้น



เช่น การเขียนคำสั่ง SQL JOIN เพื่อดึงข้อมูลตารางที่ 2 มาแสดง

SELECT
       id, name
FROM
       tb_cate1 AS tbMaster
INNER JOIN
       tb_cate2 AS tbDetail ON tbMaster.id= tbDetail.ref_id
WHERE
       {เงื่อนไขที่ใช้ค้นหา}

และเมื่อมีการเชื่อมหลายๆตาราง ก็จะทำให้หน้าเว็บทำงานได้ช้าลง (อ่านเรื่อง "การทำ Index ให้ MySQL Database เพื่อเพิ่มความเร็ว")


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


เรามาดูกันว่า จะเขียนโปรแกรม PHP เพื่อแสดงข้อมูลหมวดหมู่เหล่านี้ได้อย่างไร


[ โค้ด PHP ]
<?php
try {
$user = 'tobedev';
$pass = 'abcd.1234';
$db = 'test';
$charset = 'utf8';
$dbh = new PDO("mysql:host=localhost;dbname=$db;charset=$charset", $user, $pass);
} catch (PDOException $e) {
    print "Error!: " . $e->getMessage() . "<br/>";
    die();
}
//Query Data
$sth = $dbh->prepare("SELECT * FROM tb_category");
$sth->execute();
$result = $sth->fetchAll(PDO::FETCH_ASSOC);
$data = array();
$sub_data = array();
//Group data with parent_id
foreach($result as $row){
if($row['ref_parent_id'] > 0){
$sub_data[$row['ref_parent_id']][$row['id']] = $row;
}else{
$data[$row['id']] = $row;
}
}
// SET sub category
foreach($data as $row){
if($sub = findSubCategory($row['id'], $sub_data)){
$data[$row['id']]['sub'] = $sub;
}
}
//echo '<pre><h2>MAIN</h2>', print_r($data,true), '</pre>';
//echo '<pre><h2>SUB</h2>', print_r($sub_data,true), '</pre>';

function displayCategory($data, $sub=1){
echo '<br/>' . str_repeat("&nbsp;",$sub*4) . '- ' . $data['name'];
if(isset($data['sub'])){
$sub++;
//Recursive Function
foreach($data['sub'] as $row){
displayCategory($row, $sub);
}
}
}
function findSubCategory($id, $sub_data){
if(isset($sub_data[$id])){
foreach($sub_data[$id] as $row){
//Recursive Function
if($sub = findSubCategory($row['id'], $sub_data)){
$sub_data[$id][$row['id']]['sub'] = $sub;
}
}
return $sub_data[$id];
}
}
?>
<!DOCTYPE html>
<html lang="en">
<head>
  <title>PHP - Category : PhpCodeMania.Blogspot.Com</title>
  <meta charset="utf-8">
  <meta name="viewport" content="width=device-width, initial-scale=1">
  <link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/css/bootstrap.min.css">
  <script src="https://ajax.googleapis.com/ajax/libs/jquery/3.2.0/jquery.min.js"></script>
  <script src="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/js/bootstrap.min.js"></script>
</head>
<body>
<div class="container">
  <h1>PHP - Product Category</h1>
  <pre>
  <?php
  foreach($data as $row){
displayCategory($row);
  }
  ?>
  </pre>
</div>
</body>
</html> 



ผลลัพธ์จากโปรแกรมที่ได้

การทำงานของโค้ด


$sth = $dbh->prepare("SELECT * FROM tb_category");
$sth->execute();
$result = $sth->fetchAll(PDO::FETCH_ASSOC);

ตัวแปร $result จะเก็บค่าเป็นอาร์เรย์ ที่ได้จาก tb_category

foreach($result as $row){
if($row['ref_parent_id'] > 0){
$sub_data[$row['ref_parent_id']][$row['id']] = $row;
}else{
$data[$row['id']] = $row;
}
}
โค้ดด้านบนนี้จะจัดรูปแบบข้อมูล เพื่อแยกระหว่าง
รายการหมวดหมู่หลัก = $data
รายการหมวดหมู่ย่อย = $sub_data


foreach($data as $row){
if($sub = findSubCategory($row['id'], $sub_data)){
$data[$row['id']]['sub'] = $sub;
}
}

การเรียกฟังก์ชั่น findSubCategory() เป็นการนำหมวดหมู่ย่อยใส่ลงไปในอาร์เรย์ sub ของ $data (หมวดหม่หลัก) แต่ละตัว


  foreach($data as $row){
displayCategory($row);
  }

ในส่วนของ <body> จะนำโค้ดด้านบนนี้ไปวางในตำแหน่งที่ต้องการแสดงผลหมวดหมู่ทั้งหมด โดยฟังก์ชั่น displayCategory() จะแสดงผลทั้งหมด

echo '<br/>' . str_repeat("&nbsp;",$sub*4) . '- ' . $data['name'];

ส่วนที่ต้องปรับแต่เพิ่มเติมคือการแสดงผลเมนูให้สวยงามอาจจะจัดรูปแบบด้วยแท็ก <li> หรือหา UI สวยๆจาก Bootstrap snip



[ โค้ด SQL สำหรับสร้างตารางในฐานข้อมูล ]



CREATE TABLE IF NOT EXISTS `tb_category` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `name` varchar(50) DEFAULT NULL,
  `ref_parent_id` int(11) DEFAULT '0' COMMENT 'อ้างอิง id',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=25 DEFAULT CHARSET=utf8;


INSERT IGNORE INTO `tb_category` (`id`, `name`, `ref_parent_id`) VALUES
(1, 'วัสดุอุปกรณ์สำนักงาน', 0),
(2, 'วัสดุอุุปกรณ์ทำสวน', 0),
(3, 'วัสดุอุปกรณ์ไฟฟ้า', 0),
(4, 'วัสดุุอุปกรณ์ในครัว', 0),
(5, 'กรรไกร', 1),
(6, 'กระดาษ', 1),
(7, 'แม็ก', 1),
(8, 'จอบ', 2),
(9, 'มีดถาง', 2),
(10, 'สายไฟ', 3),
(11, 'กรรไกร 2 นิ้ว', 5),
(12, 'กรรไกร 4 นิ้ว', 5),
(13, 'กรรไกร 5 นิ้ว', 5),
(14, 'กระดาษ A3', 6),
(15, 'กระดาษ A4', 6),
(16, 'แม็กเบอร์ 4', 7),
(17, 'จอบด้ามไม้', 8),
(18, 'จอบด้ามเหล็ก', 8),
(19, 'มีปลายงอ', 9),
(20, 'มีดปลายแหลม', 9),
(21, 'เบอร์ 4/1', 16),
(22, 'เบอร์ 4/2', 16),
(23, 'ธรรมดา', 21),
(24, 'พิเศษ', 21);



แหล่งอ้างอิง

ความสัมพันธ์ของฐานข้อมูล
http://www.tbacud.ac.th/caidb/home/unit11.html

PHP Data Objects
http://php.net/manual/en/book.pdo.php

Bootstrap UI สวยๆ
https://bootsnipp.com/tags


PHP CI MANIA PHP Code Generator 
โปรแกรมช่วยสร้างโค้ด ลดเวลาการเขียนโปรแกรม เขียนโปรแกรมง่ายและสะดวกขึ้น
สนใจสั่งซื้อราคาสุดคุ้ม >> http://fastcoding.phpcodemania.com/

เว็บ StackOverFlow ใช้งานยังไง จะเอาโค้ดมาใช้งานจากส่วนไหน

โดย SONGCHAI SAETERN

StackOverFlow เพื่อนคู่คิดนักเขียนโปรแกรม



หลังจากที่เรานำข้อความที่ต้องการไปค้นหาใน Google จะได้ผลลัพธ์ดังรูปด้านล่างนี้
ผลลัพธ์การค้นหา

ให้เลือกบทความจาก StackOverFlow.Com ซึ่งเป็นแหล่งรวมคำตอบทุกคำถามของโปรแกรมเมอร์ทั่วโลกได้พึ่งพาอาศัยกันมาอย่างยาวนาน เมื่อคลิกเข้าไปจะมีจุดสังเกต 4 จุดดังนี้







1. สังเกตคะแนนโหวตของคำถาม ซึ่งยิ่งมากยิ่งดี ถ้าเป็น 0 กด Back กลับไปหาเข้าหน้าบทความอื่นได้เลย


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

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


ขอให้สนุกกับการเขียนโปรแกรม PHP โดยมีเว็บไซต์ StackOverFlow.Com เคียงข้างกันตลอดเวลา


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



PHP CI MANIA PHP Code Generator 
โปรแกรมช่วยสร้างโค้ด ลดเวลาการเขียนโปรแกรม เขียนโปรแกรมง่ายและสะดวกขึ้น
สนใจสั่งซื้อราคาสุดคุ้ม >> http://fastcoding.phpcodemania.com/

การเขียนโปรแกรม PHP ดึงข้อมูล VAT จาก Web Service ของกรมสรรพากร ด้วย NuSoap

โดย SONGCHAI SAETERN

ตัวอย่างนี้จะเป็นการเขียนโปรแกรม PHP เพื่อตรวจสอบสถานะการจด VAT หรือ ตรวจสอบข้อมูลผู้ประกอบการ โดยเขียนเชื่อมต่อกับ Web Service ของกรมสรรพากร ซึ่งปกติแล้วเราสามารถตรวจสอบได้โดยตรงจากหน้า http://www.rd.go.th/publish/313.0.html 



 


ผลลัพธ์ที่เราใช้งานจะอยู่ในส่วนของ

echo 'VAT => TRUE'; 




และ

echo 'VAT => FALSE';



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

print_r($result);

หากต้องการข้อมูลในส่วนไหนก็ให้นำไปใช้งานโดยอ้างตามคีย์นั้นๆ เช่น


$result['ServiceResult']['vName']['anyType']  

จะได้ชื่อของผู้ประกอบการมานั่นเอง


ค้นหาเลขผู้เสียภาษีเพื่อทดสอบการทำงานที่เว็บไซต์ http://www.rd.go.th/publish/313.0.html




มาเริ่มเขียนโปรแกรมกันเลย

<html>
<head>
<title>WebService VAT</title>
</head>
<body>
  <?php
include("nusoap/nusoap.php");
$wsdl = 'https://rdws.rd.go.th/serviceRD3/vatserviceRD3.asmx?wsdl';
header('Content-Type: text/html; charset=utf-8');
        $soapclient = new nusoap_client($wsdl, true);
        $soapclient->soap_defencoding = 'UTF-8';
        $soapclient->decode_utf8 = false;
        $err = $soapclient->getError();
        if ($err) {
            echo '<h2>Constructor error</h2><pre>' . $err . '</pre>';
        }
$tax_id = isset($_REQUEST['tax_id']) ? $_REQUEST['tax_id'] : '';
        $var_name = array(
                            'username' => 'anonymous',
                            'password' => 'anonymous',
                            'TIN' => $tax_id,
'skip' => 0
        );
        $result = $soapclient->call('Service', $var_name);
if(!empty($result)){
// Check for a fault
if ($soapclient->fault) {
echo '<h2>Fault</h2><pre>';
print_r($result);
echo '</pre>';
} else {
// Check for errors
$err = $soapclient->getError();
if ($err) {
// Display the error
echo '<h2>Error</h2><pre>' . $err . '</pre>';
} else {
$data = $result['ServiceResult'];
if(isset($data['vName']['anyType']) && $data['vName']['anyType'] != ''){
echo 'VAT => TRUE';
}else{
echo 'VAT => FALSE';
}
}
}
}else{
echo 'VAT => FALSE';
}
// Display the result
echo '<hr/><h2>Result</h2><pre>';
print_r($result);
echo '</pre>';
  ?>
</body>
</html>

เว็บไซต์ที่เกี่ยวข้อง

Web service กรมสรรพากร
http://www.rd.go.th/publish/42535.0.html
http://www.rd.go.th/publish/313.0.html

NuSOAP for PHP 5.4 - 7.1
https://github.com/econea/nusoap

สร้างและเรียกเว็บเซอร์วิส ด้วย PHP
http://www.thaicreate.com/community/php-create-and-call-web-service.html



PHP CI MANIA PHP Code Generator 
โปรแกรมช่วยสร้างโค้ด ลดเวลาการเขียนโปรแกรม เขียนโปรแกรมง่ายและสะดวกขึ้น
สนใจสั่งซื้อราคาสุดคุ้ม >> http://fastcoding.phpcodemania.com/

มาฝึกเขียน JavaScript กันเถอะ : การใช้ฟังก์ชั่น trim() split() เพื่อเช็คคำทีละบรรทัด

โดย CyberMAN

JavaScript ตรวจสอบการเปิด-ปิด PHP tags



<html>
<head>
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.2.1/jquery.min.js"></script>
</head>
<body>
<textarea id="text" rows="5" >
  <?php

  echo Hello();

  ?>
</textarea>
<input type="button" id="btn_run" value="Run"/>
<div id="result"></div>
</body>
</html>

จากโค้ด HTML ด้านบนจะได้ผลลัพธ์ดังนี้

และเมื่อกดปุ่ม Run จะทำงานในฟังก์ชั่น $('#btn_run').click()

<script>
$('#btn_run').click(function(){
 $('#result').html('');
    var lines = $('textarea').val().trim().split('\n');  //แยกข้อความออกด้วยตัวแบ่งบรรทัด
    var rows = lines.length;            //นับจำนวนอาร์เรย์ หรือจำนวนบรรทัดที่ได้ใน lines
    if(lines[0].trim() == '<?php'){  //ตรวจสอบบรรทัดแรก เป็นตัวเปิดแท็ก PHP
      $('#result').append('<br/>Open tag => OK');
  }
  if(lines[rows-1].trim() == '?>'){ //ตรวจสอบแถวสุดท้าย เป็นตัวปิดแท็ก PHP
      $('#result').append('<br/>Close tag => OK');
  }
 });
</script>

ในฟังก์ชั่นด้านบนนี้จะมีการตรวจสอบบรรทัดแรก และบรรทัดสุดท้าย เมื่อตรงกับที่กำหนดไว้จะแสดงข้อความไปยัง <div> ที่มี id ตรงกับคำว่า result

$('#result').append('<br/>Open tag => OK');






ผลลัพธ์เมื่อมีแท็กเปิดปิดถูกต้อง



กรณีไม่ได้เปิดแท็ก PHP หรือ ไม่ได้ปิดแท็ก PHP จะมีข้อความแค่บรรทัดเดียว





ถ้าต้องการให้แสดงทั้ง 2 บรรทัด โดยแจ้ง FALSE เมื่อไม่ได้เปิด-ปิด แท็ก PHP ให้เพิ่มส่วนของ else ในคำสั่งตรวจสอบแท็กจะได้โค้ดทั้งหมดดังนี้

<html>
<head>
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.2.1/jquery.min.js"></script>
</head>
<body>
<textarea id="text" rows="5" >
  <?php
  echo Hello();
  ?>
</textarea>
<input type="button" id="btn_run" value="Run"/>
<div id="result"></div>
<script>
$('#btn_run').click(function(){
    $('#result').html('');
    var lines = $('textarea').val().trim().split('\n');  //แยกข้อความออกด้วยตัวแบ่งบรรทัด
    var rows = lines.length;            //นับจำนวนอาร์เรย์ หรือจำนวนบรรทัดที่ได้ใน lines
    if(lines[0].trim() == '<?php'){  //ตรวจสอบบรรทัดแรก เป็นตัวเปิดแท็ก PHP
        $('#result').append('<br/>Open tag => OK');
    }else{
        $('#result').append('<br/>Open tag => FALSE');
    }
    if(lines[rows-1].trim() == '?>'){ //ตรวจสอบแถวสุดท้าย เป็นตัวปิดแท็ก PHP
        $('#result').append('<br/>Close tag => OK');
    }else{
        $('#result').append('<br/>Close tag => FALSE');
    }
 });
</script>
</body>
</html>


จะได้ผลลัพธ์ของโปรแกรมดังนี้


ทดลองการทำงานของโค้ดได้ที่ Demo



PHP CI MANIA PHP Code Generator 
โปรแกรมช่วยสร้างโค้ด ลดเวลาการเขียนโปรแกรม เขียนโปรแกรมง่ายและสะดวกขึ้น
สนใจสั่งซื้อราคาสุดคุ้ม >> http://fastcoding.phpcodemania.com/

สร้างแบบฟอร์มสำหรับบันทึกค่า ตามโครงสร้างตาราง book ด้วยคำสั่ง SHOW FULL COLUMNS

โดย CyberMAN

PHP MySQLi and MySQL table structure

กำหนดให้ในฐานข้อมูลชื่อ test มีตาราง book ที่มีโครงสร้างตามรูป

เราสามารถเขียนโปรแกรม PHP  เพื่ออ่านค่าโครงสร้างของตาราง book ใน MySQL ได้โดยใช้คำสั่ง SHOW FULL COLUMNS ของ SQL ดังนี้

<?php
$table = 'book';
$mysqli = new mysqli("localhost", "dev", "dev.1234", "test");
/* check connection */
if ($mysqli->connect_errno) {
    printf("Connect failed: %s\n", $mysqli->connect_error);
    exit();
}
/* change character set to utf8 */
if (!$mysqli->set_charset("utf8")) {
    printf("Error loading character set utf8: %s\n", $mysqli->error);
    exit();
}
/* Create table doesn't return a resultset */
if ($result = $mysqli->query("SHOW FULL COLUMNS FROM $table ")) {
       /* fetch associative array */
    while ($row = $result->fetch_assoc()) {
        $data[] = array(
                    'name' => $row['Field'],
                    'type' => $row['Type'],
                    'comment' => $row['Comment']
                );
    }

    $result->free();
}
$mysqli->close();
?>
<html>
 <head>
  <meta charset="UTF-8">
</head>
<body>
<h2>สร้างแบบฟอร์มบันทึกค่า ตามโครงสร้างตาราง "<?php echo $table;?>"</h2>
<table>
<?php
    $tbody = '';
    foreach($data as $key=>$arr){
        $label = ($arr['comment'] != '') ?  $arr['comment'] : $arr['name'];
        $tbody .= '<tr>'
                . '<td align="right"><b>' . $label . ' : </b></td>'
                . '<td><input type="" name="'. $arr['name'] .'" /></td>'
                . '</tr>';
    }

    echo $tbody;
?>
</table>
</body>
</html>



ผลลัพธ์ที่ได้จะวนลูปแสดงคอลัมน์เพื่อสร้าง INPUT ตามโครงสร้างตาราง book


สังเกตุว่าถ้าฟิลด์ไหนที่มีการระบุ Comment เอาไว้จะดึงคอมเมนต์มาใช้งาน
$label = ($arr['comment'] != '') ? $arr['comment'] : $arr['name'];

แต่ถ้า Comment เป็นค่าว่าง ก็จะเอาชื่อฟิลด์ $arr['name'] มาแสดงด้านหน้า ดังในรูปด้านบน



สำหรับโครงสร้าง book สร้างด้วยคำสั่งดังต่อไปนี้

โค้ด SQL สำหรับสร้างตารางทดสอบ


 CREATE TABLE IF NOT EXISTS `book` (
  `bk_id` int(11) NOT NULL AUTO_INCREMENT,
  `bk_month` varchar(2) NOT NULL COMMENT 'เดือน',
  `bk_code` varchar(20) NOT NULL COMMENT 'รหัส',
  `bk_name` varchar(100) NOT NULL COMMENT 'ชื่อ',
  `bk_last_update` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
  PRIMARY KEY (`bk_id`,`bk_month`)
) ENGINE=MyISAM  DEFAULT CHARSET=utf8 AUTO_INCREMENT=6 ;
--
-- Dumping data for table `book`
--
INSERT INTO `book` (`bk_id`, `bk_month`, `bk_code`, `bk_name`, `bk_last_update`) VALUES
(1, '01', '59012', 'ใจ', '2017-11-06 07:09:15'),
(2, '02', '60123', 'จริง', '2017-11-06 07:09:08'),
(5, '01', '59627', 'จน', '2017-11-06 07:09:32'),
(3, '03', '60456', 'จะ', '2017-11-06 07:09:22'),
(4, '01', '61024', 'จร', '2017-11-06 07:09:42');



PHP CI MANIA PHP Code Generator 
โปรแกรมช่วยสร้างโค้ด ลดเวลาการเขียนโปรแกรม เขียนโปรแกรมง่ายและสะดวกขึ้น
สนใจสั่งซื้อราคาสุดคุ้ม >> http://fastcoding.phpcodemania.com/

 

คำสั่ง SQL สำหรับแสดงข้อมูลโครงสร้างตารางใน MySQL

โดย CyberMAN

MySQL table structure

จะมีอยู่ 2 แบบด้วยกัน

แบบไม่มีคอลัมน์ Comment


แบบมีคอลัมน์ Comment มาด้วย






ผลลัพธ์


แบบที่ 1 จะไม่มีคอลัมน์ Comment




แบบที่ 2 จะได้คอลัมน์ Comment มาด้วย






:: ที่มา ::


How do I get the MySQL table structure in PHP? Plus a list of all tables?
https://stackoverflow.com/questions/468458/how-do-i-get-the-mysql-table-structure-in-php-plus-a-list-of-all-tables


How can you see table comments from mysql client?
https://stackoverflow.com/questions/7835092/how-can-you-see-table-comments-from-mysql-client


PHP CI MANIA PHP Code Generator 
โปรแกรมช่วยสร้างโค้ด ลดเวลาการเขียนโปรแกรม เขียนโปรแกรมง่ายและสะดวกขึ้น
สนใจสั่งซื้อราคาสุดคุ้ม >> http://fastcoding.phpcodemania.com/

การเขียนโปรแกรม JavaScript เพื่อรับค่าพารามิเตอร์ GET จาก URL ของหน้าเว็บเพจ

โดย CyberMAN

"How to retrieve GET parameters from javascript?"



วิธีเขียนโปรแกรม JavaScript แบบสั้นๆ ง่ายๆเก็บพารามิเตอร์ตัวเดียว
var param = window.location.search.substr(1);
ถ้าเราทำการ alert(param); เราจะได้ค่าทั้งหมดหลังเครื่องหมาย ?

เช่นเข้าหน้าเว็บผ่าน URL นี้
http://phpcodemania.blogspot.com/?param1=1234&param2=333

เมื่อเขียนโปรแกรมตามคำสั่งด้านบนนี้

var param = window.location.search.substr(1);
alert(param);

ผลลัพธ์ก็คือ จะแสดงข้อความ param1=1234&param2=333 ออกมานั่นเอง





หรือจะเขียนโปรแกรม JavaScript สร้างฟังก์ชั่นแบบยาวๆ

function findGetParameter(parameterName) {
    var result = null,
        tmp = [];
    location.search
        .substr(1)
        .split("&")
        .forEach(function (item) {
          tmp = item.split("=");
          if (tmp[0] === parameterName) result = decodeURIComponent(tmp[1]);
        });
    return result;
}
var data = findGetParameter('param1');


เมื่อรันคำสั่งด้านบนนี้ ตัวแปร data จะได้ข้อมูล 1234 
ซึ่งเป็น value ของพารามิเตอร์ที่ชื่อ param1 นั่นเอง


ที่มา : https://stackoverflow.com/questions/5448545/how-to-retrieve-get-parameters-from-javascript



PHP CI MANIA PHP Code Generator 
โปรแกรมช่วยสร้างโค้ด ลดเวลาการเขียนโปรแกรม เขียนโปรแกรมง่ายและสะดวกขึ้น
สนใจสั่งซื้อราคาสุดคุ้ม >> http://fastcoding.phpcodemania.com/

PHP : PDF Generator ตอนที่ 4

โดย CyberMAN

PDF Generator


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






สำหรับขั้นตอนการเขียนโค้ดก็มีคร่าวๆ ดังคลิปวิดีโอนี้





----------------------------------------------------------
ดูบทความทั้งหมดของ PHP : PDF Generator ได้ที่นี่
ติดตามทุกความเคลื่อนไหวของ PHP PDF Generator ได้ที่แท็ก : PDF Generator
---------------------------------------------------------- 




PHP CI MANIA PHP Code Generator 
โปรแกรมช่วยสร้างโค้ด ลดเวลาการเขียนโปรแกรม

สนใจสั่งซื้อเพียง 4,500 บาท
http://fastcoding.phpcodemania.com/

PHP : PDF Generator ตอนที่ 3

โดย SONGCHAI SAETERN

การเปลี่ยนไปใช้ Table แบบ ตรึงแถวหัวข้อ (Fixed Table Header)



หลังจากที่ได้ลองใช้ Bootstrap gird เพื่อแบ่งคอลัมน์ต่างๆแล้ว รู้สึกไม่ค่อยถนัด และจัดการยาก ก็เลยเปลี่ยนไปเป็นการใช้ Table แล้วเพิ่มการตรึงส่วนของหัวข้อแถวบนเอาไว้แทน

การใช้ Table จะควบคุมขนาดคอลัมน์ และตำแหน่งได้ง่ายกว่าเวลาข้อความยาวเกินขนาดที่กำหนดก็ไม่มีการเลื่อนหรือตกหล่นของข้อความ









----------------------------------------------------------
ดูบทความทั้งหมดของ PHP : PDF Generator ได้ที่นี่
ติดตามทุกความเคลื่อนไหวของ PHP PDF Generator ได้ที่แท็ก : PDF Generator




PHP CI MANIA PHP Code Generator 
โปรแกรมช่วยสร้างโค้ด ลดเวลาการเขียนโปรแกรม

สนใจสั่งซื้อเพียง 4,500 บาท
http://fastcoding.phpcodemania.com/

PHP : PDF Generator ตอนที่ 2

โดย SONGCHAI SAETERN

PDF Generator



ในตอนที่สองนี้เป็นการเขียนโปรแกรมเพื่อหาค่าตำแหน่งแบบฟอร์มด้วย jQuery ซึ่งจะต้องนำมาคำนวณอีกครั้งว่าตำแหน่งจริงๆใน PDF นั้นจะมีขนาดคลาดเคลื่อนจากการคำนวณเท่าไร เพื่อชดเชยส่วนที่ขาดหาย ซึ่งดูขั้นตอนการเขียนโค้ดได้จากวิดิโอนี้ >> PHP PDF Generator #1 (บันทึกการเขียนโปรแกรม)




หลักการคร่าวๆ มีดังนี้


1. ใช้โปรแกรม Word processor ที่ถนัด หรือโปรแกรมสร้าง PDF ตัวใดก็ได้ สร้างแบบฟอร์มที่ต้องการเสร็จแล้ว Save ให้อยู่ในรูปแบบไฟล์ PDF เพื่อนำไปใช้ในการเขียนโปรแกรม PHP สร้างรายงาน PDF

2. เรียกใช้ไลบรารี่ FPDI เพื่อโหลดไฟล์ PDF ที่สร้างเตรียมไว้มาในหน้าคำนวณตำแหน่ง (ดูตัวอย่างการใช้ FPDI ได้ในบทความ CodeIgniter PDF ตอนที่ 1 : ออกรายงานเอกสาร PDF ด้วย PHP CodeIgniter โดยใช้ไลบรารี่ TCPDF และ FPDI)


3. เขียนโปรแกรมหาตำแหน่งด้วย jQuery โดยเลือกหัวข้อทางซ้ายมือ และคลิกกำหนดตำแหน่งใน PDF Viewer ทางขวามือ


ในขั้นตอนต่อไปก็จะเป็นการนำโค้ดที่ได้ลองเขียนโปรแกรมหาตำแหน่งด้วย jQuery นี้ไปรวมกับหน้าเว็บใน PDF Generator ตอนที่ 1 และปรับปรุงการเชื่อมต่อกับฐานข้อมูลต่อไปอีกครั้ง



----------------------------------------------------------
ดูบทความทั้งหมดของ PHP : PDF Generator ได้ที่นี่
ติดตามทุกความเคลื่อนไหวของ PHP PDF Generator ได้ที่แท็ก : PDF Generator




PHP CI MANIA PHP Code Generator 
โปรแกรมช่วยสร้างโค้ด ลดเวลาการเขียนโปรแกรม

สนใจสั่งซื้อเพียง 4,500 บาท
http://fastcoding.phpcodemania.com/