วันพุธที่ 28 กรกฎาคม พ.ศ. 2553

design database for item product

เคยได้ทำการเขียนโปรแกรมที่ทำการซื้อขาย จัดการ หรือ ERP แล้วไม่เคย สะดุดใจเลยว่าราคาเป็นส่วนหนึ่งของ product
รูปร่างหน้าตาการ design เลยออกมาแบบนี้

---------------------------------
PRODUCT
---------------------------------
id
name
detail
color << optional
size << optional
width << optional
height << optional
barcode
type << type_id
buy_price
sale_price
create_datetime
create_by
update_datetime
update_by
---------------------------------

แต่พอคิดอีกที ราคามันแปรผันได้ตลอด ใครจะมานั่งเปลี่ยนให้เนี่ย
แล้วเกิดว่า ถ้าเปลี่ยนขึ้นมาจริง รายการเก่าจะเกิดปัญหาอะไรบ้างเนี่ย อีกมากมาย
ดั้งนั้นเราก็ต้องปล่อยไป เดี๋ยวมีใครโวยวายแล้วก็บอกว่า มีคนแก้ราคา จบข่าว
ไม่ใช่แระ -_-'

ดังนั้น เอาออกไปดีกว่า
---------------------------------
PRODUCT
---------------------------------
id
name
detail
color << optional
size << optional
width << optional
height << optional
barcode
type << type_id
create_datetime
create_by
update_datetime
update_by
---------------------------------

แล้วตอนขาย จะเอาราคาที่ใหนมาแปะ ในใบเสร็จหละ
เอ่อ น่านสิ ก็จำเอาแล้วกัน ^0^ นายนี่ความจำเป็นเลิศจริง ๆ

ก็ทำ table รองรับราคาสิ
---------------------------------
PRODUCT_PRICE
---------------------------------
id
product << product_id
price
currency << currency_id
create_datetime
create_by
expire_datetime
expire_by
---------------------------------

แค่นี้น่าจะพอ แล้วถ้าราคาเปลี่ยนก็เป็นการ insert record เพิ่ม ไม่ใช่ update
ตอนเรียกใช้ก็เรียกลำดับ ล่าสุดมาใช้งาน
- currency คือค่าสนุลเงิน
เพื่อใช้คำนวณเปรียบเทียบเมื่อมีการเปลี่ยนแปลงสกุลเงิน
- expire จะถูกเก็บข้อมูล กรณีมีข้อมูลใหม่เข้ามา หรือ ราคาใหม่เข้ามานั่งเอง


เพียงเท่านี้ก็สามารถเพิ่มเติม item เดิม ในใบรายการเดียวกัน
กรณีราคาเพิ่มในวันถัดไป และสามารถอ้างอิงย้อนหลังได้
ว่าราคาในแต่ละช่วงเป็นเท่าไร

วันอังคารที่ 27 กรกฎาคม พ.ศ. 2553

visual c# diff java

อ่าว ไหง ออกมา .net ได้เนี่ย แต่มิใช่ปัญหาเลยเมื่อมองลองดูเนื้อภาษากันจริง ๆ แล้วสำหรับคนที่เคยเขียน java จะบอกว่า
เขียนแทบจะเหมือนกัน และด้วย concept oop ที่แน่นมากทำให้ลักษณะ และคุณสมบัติ ของทั้ง สองภาษานี้ เหมือนกันเลย
แล้วที่ต่างกันอะ น่านสิ ลองดูเล่น ๆ กันดีกว่า

อย่างแรกเลยคงเป็น package หรือลำดับการเข้าถึง
java : เนื่องด้วยการเก็บ file ไว้ใน folder จริงทำให้มีการอ้างถึงตาม folder ที่อยู่
เช่น th >> co >> google >> code
package th.co.google.code

// how to use

import th.co.google.code.Clazz 

vc# : ในส่วนของ vc# นั้นจะต่างกันเนื่องจากว่า เป็นแค่การอ้างถึงการเข้าถึงจริง ๆ
ไม่ได้มีการแยกที่อยู่ไว้อย่างไร และจะเป็นการห่อหุ้ม Code ที่ต้องการประกาศการเข้าถึง
namespace th.co.google.code{
    // insert class hear 
}

// or

namespace th{
    namespace co{
        namespace google{
            namespace code{
                // insert class hear 
            }
        }
    }
}

// how to use

using th.co.google.code.Clazz 

concept get-set ในกรณี
java :
public class Clock{
    private int hour;
    public int getHour(){
        return hour;
    }
    public void setHour(int value){
        hour = value;
    }
}

// how to use

Clock c = new Clock();
c.setHour(8);
System.out.println(c.getHour());

vc#:
public class Clock{
    public int Hour {
        get {
            return hour;
        }
        set { 
            hour = value;
        }
    }
}

// how to use

Clock c = new Clock();
c.Hour = 8;
Console.WriteLine(c.Hour);

จะเห็นได้ว่า ภาษา java ค่อนข้างจะเก็บ concept เดิมไว้ได้ดี
แต่ภาษา c# นี่ยัดกันเป็นรูปแบบแปลก ๆ ขึ้นมาเชียว -_-" เหมือนทำ Inner class เลย...


การ สืบทอดคุณสมบัติจาก class แม่ อันนี้ต่างกันนิดหน่อย
java :
public class Parent{
    public void print(){
        System.out.println("== Parent ==");
    }
}
public class Child extends Parent{
    public void print(){
        System.out.println("== Child ==");
    }
    public void printAll(){
        this.print();
        super.print();
    }
}

// how to use

Child c = new Child();
c.printAll();

vc# :
public class Parent{
    public void print(){
        System.out.println("== Parent ==");
    }
}
public class Child : Parent{
    public void print(){
        System.out.println("== Child ==");
    }
    public void printAll(){
        this.print();
        base.print();
    }
}

// how to use

Child c = new Child();
c.printAll();

และ การรับ interface ที่แยกไม่ออกจริง ๆ พี่น้อง ^-^"
java :
public interface Interfazz{
    public void printTest();
}
public class Clazz implements Interfazz {
    public void printTest(){
        System.out.println("Clazz from Interfazz");
    }
}

vc# :
public interface Interfazz{
    public void printTest();
}
public class Clazz : Interfazz {
    public void printTest(){
        Console.WriteLine("Clazz from Interfazz");
    }
}

...

python solution for of for of for

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

l1 = ['www', 'wap']
l2 = ['google', 'yahoo', 'gmail']
l3 = ['com', 'co.th']

list = []
for i in l1:
    for j in l2:
        for k in l3:
            list.append('http://%s.%s.%s' %(i, j, k))

print list

ผลลัพท์
['http://www.google.com',
'http://www.google.co.th',
'http://www.yahoo.com',
'http://www.yahoo.co.th',
'http://www.gmail.com',
'http://www.gmail.co.th',
'http://wap.google.com',
'http://wap.google.co.th',
'http://wap.yahoo.com',
'http://wap.yahoo.co.th',
'http://wap.gmail.com',
'http://wap.gmail.co.th']


แยก logic กับ business ออกจากกัน
l1 = ['www', 'wap']
l2 = ['google', 'yahoo', 'gmail']
l3 = ['com', 'co.th']

def for_list(lists):  
    for i in l1:
        for j in l2:
            for k in l3:
                yield l1, l2, l3

lists = [l1, l2, l3]
list = ['http://%s.%s.%s' %(i, j, k) for i, j, k in for_list(lists)]

SyntaxHighlighter include link for blog