สอบการ record ค่าลง table product ใน Node.JS

พูดคุยแลกเปลี่ยน ปัญหา การเขียน JavaScript เครื่องมือ AJAX Web 2.0 AJAX Framework jQuery และ Node.JS รวมถึง Framework Express ของ Node.JS ทำงานฝั่ง Server

Moderator: mindphp

Nes224
PHP Super Member
PHP Super Member
โพสต์: 441
ลงทะเบียนเมื่อ: 20/12/2021 11:36 am

สอบการ record ค่าลง table product ใน Node.JS

โพสต์ที่ยังไม่ได้อ่าน โดย Nes224 »

ใน database ตัว regional ของ ตาราง product ตอนนี้ผมได้เพิ่ม field ในการ record running_number เพื่อเป็นการใช้ check ค่าสูงสุด เพื่อใช้ในการบวกค่าตัวเลขถัดไป
เช่นตอนนี้ ใน field ของ running_number มีค่า = 0 ฉนั้นแล้วเวลาที่ดึงค่าสูงสุดออกมาจะได้ค่าเท่ากับ 0 แล้วเวลาที่บวกค่า 1 เข้าไปแล้ว จะได้ 0+1 = 0 ดังนั้น ใน field ของ running_number จะได้เท่ากับ = 1 ซึ่งตรงนี้จะใช้ NodeJs เป็นตัวจัดการ

และในการดึงค่าสูงสุดของ column นั้นมาผมใช้คำสั่ง

โค้ด: เลือกทั้งหมด

select MAX(running_number) from product 
แล้วเวลาที่มาเขียนใน NodeJS ก็จะใช้คำสั่ง

โค้ด: เลือกทั้งหมด

let sql_number = "select MAX(running_number) from product"
มาถึงตรงนี้แล้วมันจะเป็นการแค่ประกาศตัวแปรเป็น string อยู่ผมจึงใช้คำสั่ง

โค้ด: เลือกทั้งหมด

let sql_number = "select MAX(running_number) from product"
let record_running_number = db.select(sql_number);
อยากสอบถามตรงนี้ว่าผมทำถูกต้องหรือไม่ ก็คือ ใช้คำสั่ง

โค้ด: เลือกทั้งหมด

let record_running_number = db.select(sql_number);
ในการ select ค่ามาจากตัวแปร sql_number ซึ่งใช้คำสั่ง

โค้ด: เลือกทั้งหมด

"select MAX(running_number) from product"
เป็นการดึงค่าสูงสุดนั้นมาเก็บไว้ที่ตัวแปร sql_number ซึ่งตอนนี้จะมีค่า = 0 และใช้คำสั่ง db.select(sql_number) มาต่อ ในการ select ค่ามาจากคำสั่ง

โค้ด: เลือกทั้งหมด

let sql_number = "select MAX(running_number) from product"
ถ้าเกิดว่าทำถูกแล้ว ผมจึงใช้คำสั่ง
โดยถ้ารวมคำสั่งกันแล้วจะได้

โค้ด: เลือกทั้งหมด


let sql_number = "select MAX(running_number) from product"
let record_running_number = db.select(sql_number);
record_running_number += 1

เพื่อบวกค่าเข้าไปเพิ่ม

แล้วในการทำ running_number จะรูปแบบ format คือ yyyy/mm/dd-running_number

โค้ด: เลือกทั้งหมด


let sql_number = "select MAX(running_number) from product"
let record_running_number = db.select(sql_number);
record_running_number += 1
let product_id = q_id;
if (!q_id) {
	product_id = (moment()).format('YYYY-MM-DD-'+ record_running_number) 
}
แล้วในการ insert ค่าลง table product จะต้องใช้คำสั่งยังไงบ้างครับ เพราะเท่าที่ลองแล้ว มันไม่ insert ค่าเข้าไปที่ ตาราง product ของ column running_number

Running_number.jpg
Running_number.jpg (4.51 KiB) Viewed 1413 times

โค้ด: เลือกทั้งหมด


exports.save = async function (req, res, next) {
	try {
		const db = req.app.db;

		var q_cat = req.params.cat
		var q_id = common.getUrlPostParam(req, 'id');

		const sql_number = "select max(running_number) from product where delete_flag = 0";
		const record_running_number = await db.select(sql_number);
		record_running_number += 23

		let product_id = q_id;
		if (!q_id) {
			
			product_id = (moment()).format('YYYY-MM-DD-'+record_running_number) 
		}
		
		let record_product = {};

		/*create product */
		let data_product = {
			id: product_id,
			lov_product_data_share_id: req.body.lov_product_data_share_id,
			running_number: record_running_number,
		};

		if (q_id) {
			data_product.update_date = (moment()).format('YYYY-MM-DD HH:mm:ss');
			record_product = await db.update("product", data_product, { id: product_id },{running_number: record_running_number});
		}
		else {
			data_product.create_date = (moment()).format('YYYY-MM-DD HH:mm:ss');
			data_product.delete_flag = 0;
			record_product = await db.create("product", data_product,{running_number: record_running_number});
		}

		/*create product ge */
		let data_product_ge = {
			product_id: product_id,
			create_by_which_country: req.body.create_by_which_country,
			national_registration_id_product_registration_id: req.body.national_registration_id_product_registration_id,
			product_category: req.body.product_category,
			registration_date_approval: common.toDateFormat(req.body.registration_date_approval, 'DD/MM/YYYY', 'YYYY-MM-DD'),
			family_name_other_models_if_applicable: req.body.family_name_other_models_if_applicable,
			country_of_registration: req.body.country_of_registration,
			legislation_framework: req.body.legislation_framework,
			legislation_entry_into_force_date: common.toDateFormat(req.body.legislation_entry_into_force_date, 'DD/MM/YYYY', 'YYYY-MM-DD'),
			registration_expiry_date: common.toDateFormat(req.body.registration_expiry_date, 'DD/MM/YYYY', 'YYYY-MM-DD'),
			registration_expiry_alert: common.toDateFormat(req.body.registration_expiry_alert, 'DD/MM/YYYY', 'YYYY-MM-DD'),
			registration_status: req.body.registration_status,
			brand_name: req.body.brand_name,
			model_number: req.body.model_number,
			manufacturers_name: req.body.manufacturers_name,
			country_of_manufacture: req.body.country_of_manufacture,
			general_comment: req.body.general_comment
		};
		if (q_id) {
			await db.update("product_ge", data_product_ge, { product_id: product_id });
		}
		else {
			await db.create("product_ge", data_product_ge);
		}
		// await db.save("product",{'running_number': req.body.running_number});

		/*create product category*/
		if (q_cat == "ac") {
			let data_product_ac = {
				product_id: product_id,
				testing_standard_ac: req.body.testing_standard_ac,
				meps_repuirement: req.body.meps_repuirement,
				product_category: req.body.product_category,
				product_sub_category: req.body.product_sub_category,
				adjustable_output_capacity_inverter_driven_technol: req.body.adjustable_output_capacity_inverter_driven_technol,
				cooling_mode_rated_power_electrical: req.body.cooling_mode_rated_power_electrical,
				cooling_mode_rated_output_capacity_cooling: req.body.cooling_mode_rated_output_capacity_cooling,
				cooling_mode_rated_eer: req.body.cooling_mode_rated_eer,
				claimed_cooling_seasonal_performance_factor_or_equ: req.body.claimed_cooling_seasonal_performance_factor_or_equ,
				refrigerant_type: req.body.refrigerant_type,
				test_laboratory: req.body.test_laboratory,
				test_report_number: req.body.test_report_number,
				test_report_date: common.toDateFormat(req.body.test_report_date, 'DD/MM/YYYY', 'YYYY-MM-DD'),
				energy_efficiency_rating_label: req.body.energy_efficiency_rating_label,
				does_the_product_meet_the_refrigerant_requirements: req.body.does_the_product_meet_the_refrigerant_requirements,
				tested_full_load_cooling_capacity_kw: req.body.tested_full_load_cooling_capacity_kw,
				tested_full_load_cop: req.body.tested_full_load_cop,
				tested_part_load_cop: req.body.tested_part_load_cop
			};
			await db.save("product_ac", data_product_ac, { product_id: product_id }, data_product_ac);
		}
		else if (q_cat == "li") {
			let data_product_li = {
				product_id: product_id,
				testing_standard_lighting: req.body.testing_standard_lighting,
				meps_repuirement: req.body.meps_repuirement,
				product_category: req.body.product_category,
				product_sub_category: req.body.product_sub_category,
				rated_power_w: req.body.rated_power_w,
				rated_luminous_flux_lm: req.body.rated_luminous_flux_lm,
				rated_efficacy_lmw: req.body.rated_efficacy_lmw,
				rated_cri: req.body.rated_cri,
				rated_cct: req.body.rated_cct,
				test_laboratory: req.body.test_laboratory,
				test_report_number: req.body.test_report_number,
				test_report_date: common.toDateFormat(req.body.test_report_date, 'DD/MM/YYYY', 'YYYY-MM-DD'),
				energy_efficiency_rating_label: req.body.energy_efficiency_rating_label,
				lamp_cap: req.body.lamp_cap
			};
			await db.save("product_li", data_product_li, { product_id: product_id }, data_product_li);
		}
		else if (q_cat == "re") {
			let data_product_re = {
				product_id: product_id,
				testing_standard_refrigerator: req.body.testing_standard_refrigerator,
				meps_repuirement: req.body.meps_repuirement,
				product_category: req.body.product_category,
				product_sub_category: req.body.product_sub_category,
				number_of_compartments: req.body.number_of_compartments,
				refrigerant_type: req.body.refrigerant_type,
				test_laboratory: req.body.test_laboratory,
				test_report_number: req.body.test_report_number,
				test_report_date: req.body.test_report_date,
				claimed_annual_energy_consumption: req.body.claimed_annual_energy_consumption,
				energy_efficiency_rating_label: req.body.energy_efficiency_rating_label,
				total_storage_volume_litres: req.body.total_storage_volume_litres,
				tested_annual_energy_consumption: req.body.tested_annual_energy_consumption
			};
			await db.save("product_re", data_product_re, { product_id: product_id }, data_product_re);
		}
		
		if (q_id) {
			return res.status(200).json({ success: true, message: 'Save complete.' })
		}
		else {
			return res.status(200).json({ success: true, message: 'Save complete.', redirect: '/product/' + q_cat + '/edit?id=' + product_id })
		}
		
	}
	catch (err) {
		console.log(err);
		next(err);
	}
}
Nes224
PHP Super Member
PHP Super Member
โพสต์: 441
ลงทะเบียนเมื่อ: 20/12/2021 11:36 am

Re: Q สอบการ record ค่าลง table product

โพสต์ที่ยังไม่ได้อ่าน โดย Nes224 »

อีกปัญหาหนึ่งก็คือ ใน คำสั่ง ตัวแปร product_id

โค้ด: เลือกทั้งหมด

product_id = (moment()).format('YYYY-MM-DD-'+record_running_number) 


เป็นการดึงค่าไปแสดงเป็น parameter ที่ช่อง URL
URLParameter.jpg
URLParameter.jpg (4.24 KiB) Viewed 1412 times
ตรงนี้มีแนวทางการแก้อย่างไรบ้างครับ ซึ่งตรงช่อง URL มันจะมีคำว่า object ซึ่งเป็นรูปแบบไม่ถูกต้อง จริงๆแล้วต้องแสดงเป็น

YYYY-MM-DD-RUNNING_NUMBER ครับ
ภาพประจำตัวสมาชิก
mindphp
ผู้ดูแลระบบ MindPHP
ผู้ดูแลระบบ MindPHP
โพสต์: 41238
ลงทะเบียนเมื่อ: 22/09/2008 6:18 pm
ติดต่อ:

Re: Q สอบการ record ค่าลง table product

โพสต์ที่ยังไม่ได้อ่าน โดย mindphp »

จากตัวอย่างโค้ด

โค้ด: เลือกทั้งหมด

let product_id = q_id;
if (!q_id) {
	product_id = (moment()).format('YYYY-MM-DD-'+ record_running_number) 
}
หมายความว่า ถ้าไม่มี q_id ที่ได้มาจากฐานข้อมูลจะใช้ค่านี้แทน
ตาม sql คือถ้าไม่มี running_number จะสร้าง ขึ้นมาใหม่
ติดตาม VDO: http://www.youtube.com/c/MindphpVideoman
ติดตาม FB: https://www.facebook.com/pages/MindphpC ... 9517401606
หมวดแชร์ความรู้: https://www.mindphp.com/forums/viewforum.php?f=29
รับอบรม และพัฒนาระบบ: https://www.mindphp.com/forums/viewtopic.php?f=6&t=2042
Nes224
PHP Super Member
PHP Super Member
โพสต์: 441
ลงทะเบียนเมื่อ: 20/12/2021 11:36 am

Re: Q สอบการ record ค่าลง table product

โพสต์ที่ยังไม่ได้อ่าน โดย Nes224 »

mindphp เขียน: 19/01/2022 8:52 pm จากตัวอย่างโค้ด

โค้ด: เลือกทั้งหมด

let product_id = q_id;
if (!q_id) {
	product_id = (moment()).format('YYYY-MM-DD-'+ record_running_number) 
}
หมายความว่า ถ้าไม่มี q_id ที่ได้มาจากฐานข้อมูลจะใช้ค่านี้แทน
ตาม sql คือถ้าไม่มี running_number จะสร้าง ขึ้นมาใหม่
ตอนนี้แก้ไขได้แล้วครับ
ภาพประจำตัวสมาชิก
mindphp
ผู้ดูแลระบบ MindPHP
ผู้ดูแลระบบ MindPHP
โพสต์: 41238
ลงทะเบียนเมื่อ: 22/09/2008 6:18 pm
ติดต่อ:

Re: Q สอบการ record ค่าลง table product

โพสต์ที่ยังไม่ได้อ่าน โดย mindphp »

แก้ไปยังไงครับ แชร์กลับมาหน่อย
ติดตาม VDO: http://www.youtube.com/c/MindphpVideoman
ติดตาม FB: https://www.facebook.com/pages/MindphpC ... 9517401606
หมวดแชร์ความรู้: https://www.mindphp.com/forums/viewforum.php?f=29
รับอบรม และพัฒนาระบบ: https://www.mindphp.com/forums/viewtopic.php?f=6&t=2042
Nes224
PHP Super Member
PHP Super Member
โพสต์: 441
ลงทะเบียนเมื่อ: 20/12/2021 11:36 am

Re: Q สอบการ record ค่าลง table product

โพสต์ที่ยังไม่ได้อ่าน โดย Nes224 »

mindphp เขียน: 20/01/2022 10:26 am แก้ไปยังไงครับ แชร์กลับมาหน่อย

เริ่มจากสร้าง field column ใหม่ในตาราง product โดยชื่อ column ว่า running_number จากนั้นประเด็นคือเราอยากให้มันเป็น
ruinning_number ก็คือ เริ่มจาก 0,1,2,3,4,5,6,7,8,9,................ ไปเรื่อย ผมจะต้องไปดึงค่าจาก ตาราง product ใน field ที่ชื่อว่า running_number
โดยใช้คำสั่ง

โค้ด: เลือกทั้งหมด

let sql_number = "select MAX(running_number) as running_number from product"
ที่นี้ก็ select ค่าจากตัวแปร sql_number มาเก็บไว้ที่ตัวแปรชื่อว่า

โค้ด: เลือกทั้งหมด

let sql_running_number = await db.select(sql_number)
มาถึงตรงนี้มันจะส่งค่ามาเป็น array อยู่ครับ ตอนนี้ติดอยู่นานว่า ทำไมมันต้องเป็น object หรือ array ก็เลยไป console.log มันดู

โค้ด: เลือกทั้งหมด

console.log(sql_running_number)
แล้วไปทำการ add product ใหม่เพื่อให้ method ตัวนี้ทำงาน

ค่าที่ไป console.log ของตัว sql_running_number มันจะปริ้นออกมาว่า

โค้ด: เลือกทั้งหมด

sql_running_number [{running_number: (ตามด้วยค่าใน column ของ running_number)}] แบบนี้
ซึ่งผมต้องการที่จะดึงค่า [{running_number : 0}] ออกมา ก็เลยใช้คำสั่ง

โค้ด: เลือกทั้งหมด

sql_running_number = sql_running_number[0].running_number +1 
เป็นการเข้าไปที่ array ที่ index 0 แล้วดึงค่าจาก object อีกที

เวลาการจัดรูปแบบ format จะใช้คำสั่ง pad แต่ว่าตอนแรกใช้คำสั่ง padStart ซึ่งจริงๆแล้วจะทำงานได้เหมือนกัน แต่ว่า node version ไม่ได้รองรับ padStart ต้องไปใช้ ฟังก์ชั่น pad แบบเก่าแทน

โค้ด: เลือกทั้งหมด

const pad = function(width, string,padding){
	return (width <= string.length) ? string : pad(width, padding + string, padding)
}
width ก็คือ จำนวนหลักที่เราต้องการ ส่วน padding+string ก็คือค่าที่เราจะทำการ running_number ส่วน padding ก็เป็นค่าเริ่มต้น
ก็จะได้

โค้ด: เลือกทั้งหมด

const pad = function(width, string,padding){
	return (width <= string.length) ? string : pad(width, padding + string, padding)
}
product_id = (moment()).format('YYYY-MM-DD'+pad(6,sql_running_number,'0'))
ส่วนวิธีการ insert ค่าเข้าไปที่ ตาราง product ใน column running_number
ตัวนี้จะมี ของเก่าจะทำเอาไว้ให้อยู่แล้วครับ
โดยลักษณะ CODE จะเป็น

โค้ด: เลือกทั้งหมด

/*create product */
		let data_product = {
			id: product_id,
			lov_product_data_share_id: req.body.lov_product_data_share_id,
			
		};

		if (q_id) {
			data_product.update_date = (moment()).format('YYYY-MM-DD HH:mm:ss');
			record_product = await db.update("product", data_product, { id: product_id });
		}
		else {
			data_product.create_date = (moment()).format('YYYY-MM-DD HH:mm:ss');
			data_product.delete_flag = 0;
			record_product = await db.create("product", data_product);
		}
ตัวแปร data_product เป็น insert ค่าลงไปที่ ตาราง product
ฉนั้นจริงๆแล้ว ในตาราง product จากที่ดูมัน insert ค่าเข้าไปแค่ id กับ lov_product_data_share_id เท่านั้น
แล้วตรง เงื่อนไข if else ก็คือ if หมายถึงถ้า ถ้ามี q_id แล้วให้ทำการ update ส่วนถ้ายังไม่มี q_id ให้มา create ฉนั้นแล้ว ตัว add product มันตรงมา create ครับก็เลย
เพิ่มค่าเข้าไปที่ else

โค้ด: เลือกทั้งหมด

else{
	data_product.create_date = (moment()).format('YYYY-MM-DD HH:mm:ss')
	data_product.delete_flag = 0
	data_product.running_number = sql_running_number
	record_product = await db.create("product",data_product)
}
ตอบกลับโพส
  • Similar Topics
    ตอบกลับ
    แสดง
    โพสต์ล่าสุด

ผู้ใช้งานขณะนี้

สมาชิกกำลังดูบอร์ดนี้: ไม่มีสมาชิกใหม่ และบุคลทั่วไป 83