Tag Archive คำนวณ

jQuery.Calx2:binding

เพราะว่าตารางที่ต้องนำมาแสดงค่าการคำนวณมาจากระบบอื่นและใช้ในจุดอื่นๆ ด้วยดังนั้นการเพิ่มแอติบิว data-cell และ data-formula มันไม่ค่อยจะเหมาะนัก ลองใช้ .data แล้วกลับพบว่าสคริปมันไม่ทำงานเหมือน jQuery.Calx2: ใช้สูตร Excel ใน เว็บ ซะงั้น ลองแก้ปัญหาดูจนได้ code

[code language=”html” title=”dynamic.html”]<!doctype html>
<html>

<head>
<meta charset="utf-8">
<title>jQuery Calx: dynamic</title>
<link href="../vendor/twbs/bootstrap/dist/css/bootstrap.min.css" rel="stylesheet" rel="stylesheet" type="text/css">
</head>

<body>
<table class="table table-bordered table-hover table-striped" id="sheetA" width="100%">
<thead>
<tr>
<td width="58">No.</td>
<td width="145">First Name</td>
<td width="126">Last Name</td>
<td width="135">Relationship to policyholder / main insured</td>
<td width="191">Employee name<br /> (main insured)</td>
<td width="100">Period<br /> Start Date<br /> (dd/mm/yy)
</td>
<td width="105">Effetive Date<br /> (dd/mm/yy)
</td>
<td width="101">Period<br /> End Date<br /> (dd/mm/yy)
</td>
<td width="109">DOB</td>
<td width="51">Age</td>
<td width="113">ACF – Vital<br /> Annual Premium</td>
<td width="113">Annually Premium included AGA</td>
<td width="113">Annual Premium<br /> after 10%<br /> Gr. Discntd</td>
<td width="107">Prorated Premium<br /> (USD)
</td>
<td width="74">Duration Days</td>
</tr>
</thead>
<tbody>
<tr>
<td>1</td>
<td>Tianyi</td>
<td>Deng</td>
<td>Employee</td>
<td>-</td>
<td>15-May-17</td>
<td>20-Oct-17</td>
<td>14-May-18</td>
<td>24-May-1989</td>
<td>27</td>
<td>1,022.00</td>
<td>ccc</td>
<td></td>
<td></td>
<td></td>
</tr>
</tbody>
<tfoot>
<tr>
<td colspan="8"></td>
<td colspan="5">Total Premium to be Refund(USD)</td>
<td>(622.19)</td>
<td></td>
</tr>
</tfoot>
</table>
<script src="../vendor/components/jquery/jquery.min.js"></script>
<script src="jquery-calx-2.2.7.min.js"></script>
<script>
$(document).ready(function() {

let sheetA = $(‘#sheetA’);

let row = $(‘tr:eq(1)’, sheetA);
$(‘td:eq(10)’, row).attr({
"data-cell": "K24"
});
$(‘td:eq(11)’, row).attr({
"data-cell": "L24",
"data-formula": "K24+197"
});
$(‘td:eq(12)’, row).attr({
"data-cell": "M24",
"data-formula": "L24-(L24*0.1)"
});
$(‘td:eq(13)’, row).attr({
"data-cell": "N24",
"data-formula": "-(M24*O24)/365"
});
$(‘td:eq(14)’, row).attr({
"data-cell": "O24",
"data-formula": "H24-G24+1"
});

row = $(‘tr:eq(2)’);
$(‘td:eq(14)’, row).attr({
"data-cell": "O25",
"data-formula": "N27"
});

sheetA.calx();
});
</script>
</body>

</html>[/code]

การใช้ .attr() แทน .data() ที่เป็น function โดยตรงกลับทำงานได้ซะงั้น บางครั้ง programmer ก็ต้องอ้อมโลกบ้าง

jQuery.Calx2: ใช้สูตร Excel ใน เว็บ

แรกเริ่มเดิมที่ user จะให้ไฟล์ excel ตัวอย่างการคำนวณมาให้ sa แล้ว sa ก็ส่งสูตรตัวนี้มาให้ทาง programmer เปลี่ยนเป็น javascript พอมีการแก้สูตรตัวนี้กระบวนการก็เริ่มอีกครั้งหนึ่ง ทั้งๆ ที่บางครั้งมีการเปลี่ยนแค่สูตรเดียวเท่านั้น แต่เพราะการเขียนด้วย javascript ที่ซับซ้อนกว่า ทำให้ต้องใช้เวลาในการแก้ไขมากกว่าที่ควรจะเป็น

จะดีกว่ามั๋ย ถ้าหากว่า เราสามารถใช้ excel formula ได้ในหน้าเว็บเลย โดยไม่ต้องมาแปลงเป็นภาษาอื่นและ sa หรือใครก็ตามสามารถมาแก้มันได้เอง จึงเป็นที่มาของ xsanisty/jquery-calx ที่จะช่วยใช้การทำงานเร็วขึ้นมาก

การใช้งานง่ายๆ เพียงแค่ใส่ data 2 ตัวคือ data-cell=” { cell reference } ” และ data-formula=” {สูตร excel ที่ต้องการ} “กับการเรียกใช้อีกเล็กน้อย[code language=”javascript” title=””]<script>
$(document).ready(function() {
$(‘#sheetA’).calx();
});
</script>[/code] เท่านั้น

ตัวอย่างการใช้งาน[code language=”html” title=”basic.html”]<!doctype html>
<html>

<head>
<meta charset="utf-8">
<title>jQuery Calx: basic</title>
<link href="../vendor/twbs/bootstrap/dist/css/bootstrap.min.css" rel="stylesheet" rel="stylesheet" type="text/css">
</head>

<body>
<table class="table table-bordered table-hover table-striped" id="sheetA" width="100%">
<thead>
<tr>
<td width="58">No.</td>
<td width="145">First Name</td>
<td width="126">Last Name</td>
<td width="135">Relationship to policyholder / main insured</td>
<td width="191">Employee name<br /> (main insured)</td>
<td width="100">Period<br /> Start Date<br /> (dd/mm/yy)
</td>
<td width="105">Effetive Date<br /> (dd/mm/yy)
</td>
<td width="101">Period<br /> End Date<br /> (dd/mm/yy)
</td>
<td width="109">DOB</td>
<td width="51">Age</td>
<td width="113">ACF – Vital<br /> Annual Premium</td>
<td width="113">Annually Premium included AGA</td>
<td width="113">Annual Premium<br /> after 10%<br /> Gr. Discntd</td>
<td width="107">Prorated Premium<br /> (USD)
</td>
<td width="74">Duration Days</td>
</tr>
</thead>
<tbody>
<tr>
<td>1</td>
<td>Tianyi</td>
<td>Deng</td>
<td>Employee</td>
<td>-</td>
<td>15-May-17</td>
<td>20-Oct-17</td>
<td>14-May-18</td>
<td>24-May-1989</td>
<td>27</td>
<td data-cell="K24">1,022.00</td>
<td data-cell="L24" data-formula="K24+197"></td>
<td data-cell="M24" data-formula="L24-(L24*0.1)"></td>
<td data-cell="N24" data-formula="-(M24*O24)/365"></td>
<td data-cell="O24" data-formula="H24-G24+1"></td>
</tr>
</tbody>
<tfoot>
<tr>
<td colspan="8"></td>
<td colspan="5">Total Premium to be Refund(USD)</td>
<td>(622.19)</td>
<td data-cell="O25" data-formula="N27"></td>
</tr>
</tfoot>
</table>
<script src="../vendor/components/jquery/jquery.min.js"></script>
<script src="jquery-calx-2.2.7.min.js"></script>
<script>
$(document).ready(function() {
$(‘#sheetA’).calx();
});
</script>
</body>

</html>[/code]

เพียงเท่านี้ เราก็สามารถจะคำนวณค่าต่างๆ ได้เหมืือนใช้ excel ได้แล้วโดยไม่ต้องแก้สูตรให้ยุ่งยากเลย

MySQL: ใช้ตัวแปร variable

การใช้ตัวแปรใน mysql จะช่วยให้เขียน sql query ได้สั้นและเข้าใจได้ง่ายขึ้น อย่างในกรณีที่นำค่าจากการคำนวณมาค่าหนึ่ง แล้วต้องนำไปใช้แสดงผลใน column อื่นๆ อีกครั้ง เช่น การนำผลที่ได้มาแสดงเป็นช่วงแบบตามขั้นบันได แบ่งช่วงวันที่ออกเป็นกลุ่มๆ หรือการตัดเกรด

สมมุติว่า ต้องตัดเกรดให้เด็กตามช่วงคะแนน โดย

accumulatedScore
คะแนนเก็บ เต็ม 100 คะแนนจะมีน้ำหนักเป็น 50%
midtermScore
คะแนนกลางภาค เต็ม 100 คะแนนจะมีน้ำหนักเป็น 20%
finalScore
คะแนนสอบปลายภาค เต็ม 100 คะแนนจะมีน้ำหนัก 30%
จะเขียนเป็น query ได้เป็น [code language=”sql” title=”calculate score query”]((accumulatedScore / 100) * 50) +
((midtermScore / 100) * 20) +
((finalScore / 100) * 30) AS score[/code]

เพื่อที่ทดลอง query ให้ตารางเก็บคะแนนขึ้นมาก่อนเช่น [code language=”sql” title=”schoolReport table”]– phpMyAdmin SQL Dump
— version 4.7.0
— https://www.phpmyadmin.net/

— Host: 127.0.0.1
— Generation Time: Oct 12, 2017 at 07:46 PM
— Server version: 10.1.25-MariaDB
— PHP Version: 7.1.7

SET SQL_MODE = "NO_AUTO_VALUE_ON_ZERO";
SET AUTOCOMMIT = 0;
START TRANSACTION;
SET time_zone = "+00:00";


— Database: `snippets`

— ——————————————————–


— Table structure for table `schoolReport`

CREATE TABLE `schoolreport` (
`studen_id` int(11) NOT NULL,
`course_id` int(11) NOT NULL,
`accumulatedScore` int(11) NOT NULL,
`midtermScore` int(11) NOT NULL,
`finalScore` int(11) NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8;


— Dumping data for table `schoolReport`

INSERT INTO `schoolReport` (`studen_id`, `course_id`, `accumulatedScore`, `midtermScore`, `finalScore`) VALUES
(1, 1, 55, 76, 74),
(1, 2, 74, 74, 74),
(1, 3, 43, 76, 75),
(1, 4, 47, 45, 57),
(1, 5, 71, 45, 72),
(2, 1, 45, 85, 74),
(2, 2, 65, 47, 47),
(2, 3, 56, 85, 20),
(2, 4, 37, 75, 42),
(2, 5, 65, 35, 74);


— Indexes for dumped tables


— Indexes for table `schoolReport`

ALTER TABLE `schoolReport`
ADD UNIQUE KEY `studen_id` (`studen_id`,`course_id`);
COMMIT;
[/code]

จากสูดรที่ดูไม่ซับซ้อนแต่เมื่อเราต้องเขียนคิวรี่ให้ตัดเกรดออกมาพร้อมๆกันมันจะกลายเป็น [code language=”sql” title=”query score”]SELECT
studen_id,
course_id,
accumulatedScore,
midtermScore,
finalScore,
((accumulatedScore / 100) * 50) +
((midtermScore / 100) * 20) +
((finalScore / 100) * 30) AS score,
CASE
WHEN
((accumulatedScore / 100) * 50) +
((midtermScore / 100) * 20) +
((finalScore / 100) * 30) < 50
THEN
‘F’
WHEN
((accumulatedScore / 100) * 50) +
((midtermScore / 100) * 20) +
((finalScore / 100) * 30) <= 60
THEN
‘D’
WHEN
((accumulatedScore / 100) * 50) +
((midtermScore / 100) * 20) +
((finalScore / 100) * 30) <= 70
THEN
‘C’
WHEN
((accumulatedScore / 100) * 50) +
((midtermScore / 100) * 20) +
((finalScore / 100) * 30) <= 80
THEN
‘B’
else
‘A’
END
AS grade
FROM
schoolReport[/code] จะเกิดอะไรขึ้นถ้าเขียน sql ผิดไปนิดเดียว อาจจะลืมพิมพ์ [code language=”sql” title=”query calculate grade”] WHEN
((accumulatedScore / 100) * 50) +
((midtermScore / 100) * 20) +
((midtermScore / 100) * 30) <= 70
THEN
‘C'[/code] เห็นมั๋ย? แค่ใช้คะแนน midtermScore 2 ครั้ง ไปตอนตัดเกรดซักเกรดเอง

ถ้าเปลี่ยนไปใช้ query แบบใช้ตัวแปร[code language=”sql” title=”mysql variable query”]SELECT
studen_id,
course_id,
accumulatedScore,
midtermScore,
finalScore,
@score := ((accumulatedScore / 100) * 50) +
((midtermScore / 100) * 20) +
((finalScore / 100) * 30) AS score,
CASE
WHEN
@score < 50
THEN
‘F’
WHEN
@score <= 60
THEN
‘D’
WHEN
@score <= 70
THEN
‘C’
WHEN
@score <= 80
THEN
‘B’
else
‘A’
END
AS grade
FROM
schoolReport[/code] ดูเข้าใจง่ายขึ้นเยอะ โอกาสพลาดก็น้อยลง เขียนผิดก็ตัดเกรดผิดทุกเกรด (เห็นง่ายกว่า) แก้สูตรก็แก้จุดเดียว ชีวิตง่ายขึ้นเยอะ ^_^

สรุปการสร้างตัวแปร @ชื่อตัวแปร := (เขียน : ติดกับ = เสมอ) สูตร เพื่อความสวยงาม และใช้ง่ายอย่าลืมใส่ AS alias name ให้ด้วย

PHP วันที่ เวลา คำนวณ

ตัวอย่างการเพิ่ม ลด แสดงเวลา คำนวณ ช่วงเวลาใน php[code language=”php” title=”phpMonthsDiff.php”]<?php
$date = new DateTime(‘now’);
echo ‘<br>วันเวลาปัจจุบัน ‘, $date->format(‘d/m/Y’);
echo ‘<br>ถ้าเป็นที่สหรัฐจะเขียนแบบนี้ ‘, $date->format(‘m/d/Y’);
$dateUS = new DateTime(‘now’, new DateTimeZone(‘America/New_York’));
echo ‘<br>เวลาของเค้าคือ ‘, $dateUS->format(‘m/d/Y H:i:s’);
echo ‘<br>ถ้าเป็น MySQL จะเก็บแบบนี้ ‘, $date->format(‘Y-m-d H:i:s’);
echo ‘<br>ถ้าเป็น ISO 8601 จะเก็บแบบนี้ ‘, $date->format(‘c’);
echo ‘<br>ถ้าเป็น Unix จะเก็บแบบนี้ ‘, $date->format(‘U’);
echo ‘<hr>’;
echo ‘<br>เพิ่มอีก 1 วัน ‘, $date->modify(‘+1 day’)->format(‘d/m/Y’);
echo ‘<br>เพิ่มอีก 7 วัน ‘, $date->modify(‘+1 day’)->format(‘d/m/Y’);
echo ‘<br>เพิ่มอีก 1 เดือน ‘, $date->modify(‘+1 month’)->format(‘d/m/Y’);
echo ‘<br>เพิ่มอีก 1 ปี ‘, $date->modify(‘+1 year’)->format(‘d/m/Y’);
echo ‘<hr>’;
echo ‘<br>ลดอีก 1 วัน ‘, $date->modify(‘-1 day’)->format(‘d/m/Y’);
echo ‘<br>ลดอีก 7 วัน ‘, $date->modify(‘-1 day’)->format(‘d/m/Y’);
echo ‘<br>ลดอีก 1 เดือน ‘, $date->modify(‘-1 month’)->format(‘d/m/Y’);
echo ‘<br>ลดอีก 1 ปี ‘, $date->modify(‘-1 year’)->format(‘d/m/Y’);
echo ‘<hr>’;
$timeStart = DateTime::createFromFormat(‘d/m/Y’, ‘5/8/1982’);
echo ‘<br>ฉันเกิดวันที่ ‘, $timeStart->format(‘d/m/Y’);
echo ‘<hr>’;
echo ‘<br>อายุ ‘, $timeStart->diff($date)->format(‘%y’), ‘ ปี ‘, $timeStart->diff($date)->format(‘%m’), ‘ เดือน ‘, $timeStart->diff($date)->format(‘%d’), ‘ วัน’;
echo ‘<br>คิดอายุเป็น ‘, $timeStart->diff($date)->format(‘%a’), ‘ วัน’;
echo ‘<br>ถ้าจะหากิจกรรมระหว่างวันเกิด ถึงปัจจุบันคือ xxx BETWEEN ‘, $timeStart->format(‘Y-m-d 00:00:00’), ‘ AND ‘, $date->format(‘Y-m-d 23:59:59’);
[/code]

ผลที่ได้

วันเวลาปัจจุบัน 11/11/2016
ถ้าเป็นที่สหรัฐจะเขียนแบบนี้ 11/11/2016
เวลาของเค้าคือ 11/11/2016 14:29:35
ถ้าเป็น MySQL จะเก็บแบบนี้ 2016-11-11 20:29:35
ถ้าเป็น ISO 8601 จะเก็บแบบนี้ 2016-11-11T20:29:35+01:00
ถ้าเป็น Unix จะเก็บแบบนี้ 1478892575


เพิ่มอีก 1 วัน 12/11/2016
เพิ่มอีก 7 วัน 13/11/2016
เพิ่มอีก 1 เดือน 13/12/2016
เพิ่มอีก 1 ปี 13/12/2017


ลดอีก 1 วัน 12/12/2017
ลดอีก 7 วัน 11/12/2017
ลดอีก 1 เดือน 11/11/2017
ลดอีก 1 ปี 11/11/2016


ฉันเกิดวันที่ 05/08/1982


อายุ 34 ปี 3 เดือน 6 วัน
คิดอายุเป็น 12517 วัน
ถ้าจะหากิจกรรมระหว่างวันเกิด ถึงปัจจะปัญคือ xxx BETWEEN 1982-08-05 00:00:00 AND 2016-11-11 23:59:59

ถ้าต้องการหาจำนวนเดือน ให้อ่าน นับ เดือนโดย PHP อ่านเพิ่มเติม date — Format a local time/date, The DateTimeZone class, The DateInterval class