หน้า: [1]   ลงล่าง
ผู้เขียน หัวข้อ: Return DataSet ยังไงครับ  (อ่าน 209 ครั้ง)
MaSo
Newbie
**

ความนิยม: +0/-0
กระทู้: 15


« เมื่อ: มีนาคม 03, 2010, 04:53:08 PM »

ผมต้องการออกแบบซอฟต์แวร์ โดยแบ่งเป็น 3 layer ดังนี้ครับ

Layer1: ส่วนของ UI
Layer2: ส่วนของ Data Handling และรับ Argument ต่างๆ จาก UI ใน Layer นี้ห้ามมี SQL Script
Layer3: ส่วนของการ Query ข้อมูลจาก DB

ผมจะ Return DataSet จาก Layer ที่ 3 ให้ Layer ที่ 2 ยังไงครับ
หรือ มีแนวทางอื่นในการที่จะทำให้ข้อมูลที่ Query จาก Layer ที่ 3 ไปแสดงที่ Layer ที่ 1 ได้

รบกวนผู้รู้ครับ
แจ้งลบกระทู้นี้หรือติดต่อผู้ดูแล   บันทึกการเข้า

magicstudent
Administrator
Hero Member
*****

ความนิยม: +2/-0
กระทู้: 718


เว็บไซต์
« ตอบ #1 เมื่อ: มีนาคม 04, 2010, 11:06:32 AM »

แนวทางแบบแยก tier น่าจะเป็น

layer1 ui= presenter tier อันนี้รับค่ามาอย่างเดียวแสดงผลเลยตาม propertiers ที่มี

layer2 Data Handling= bussiness tier ชั้นนี้เป็น object ทำหน้าที่จัดการค่าที่ return จาก data tier เสมอส่วนจะรับส่ง
ค่ากันยังงัย ถ้าเป็น object อันนี้จะต้องมี class ตรวจสอบและจัดการค่าข้อมูลให้ตรงกับที่นำไปใช้ เช่น text,binary

layer3 Query ข้อมูลจาก DB = data tier สร้าง class map เข้ากับ fields ของ database ส่วนกระบวนการจัดการจะใช้

sql หรือ store procedure ก็ได้มีข้อดี-ข้อเสียคนละแบบ

ถ้าอีกแนวทางนึงจะเป็น MVC=MODEL - VIEW - CONTROL อันนี้กำลังเป็นที่นิยมอย่างของ delphi มีคนเขียนไว้บ้างแต่ไม่ถึงขนาด production อย่างพวก .net หรือ java แต่ก็อ่านเป็นแนวทางได้ครับผมเคยเจออยู่ที่นึงลองไปอ่านดูครับ ที่นี่
"A Delphi Implementation of the Model View Presenter Framework" http://www.carterconsulting.org.uk/




แจ้งลบกระทู้นี้หรือติดต่อผู้ดูแล   บันทึกการเข้า

Fibonaccio
Administrator
Full Member
*****

ความนิยม: +0/-0
กระทู้: 194


« ตอบ #2 เมื่อ: มีนาคม 05, 2010, 10:38:39 PM »

ช่วงที่ผมศึกษา OOP และ C# แรกๆ ผมก็เคยคิดจะลองออกแบบ Delphi Application โดยการแยก layer เหมือนกัน แต่ก็พบว่ามันวุ่นวายน่าดูและเสียเวลามากเมื่อเทียบกับวิธีที่เคยทำ เพราะ Data access component ของ Delphi จะผูกอยู่กับ TDataSet พอเขียน class เพียวๆ โดยแยก layer ของ data ออกจาก UI ก็เลยต้องนั่งเขียน code เองอย่างมหาศาล แล้ว Delphi ก็เขียนโปรแกรมโดยแยก code ออกเป็น component ลำบาก (หมายถึงแยก business logic ออกมาเป็น package ต่างหากนะครับ ไม่ได้หมายถึงเขียน compoent ใช้) ถ้าไม่ทำเป็น .dll ก็ต้องทำเป็น Delphi Package (.dpk) ซึ่งไม่ว่าทางไหนก็ยุ่งพอกัน ก็เลยล้มเลิกความตั้งใจไป

ถ้าคุณ MaSo ได้แนวทางก็เอามา share ด้วยนะครับ  ยิ้มเท่ห์
แจ้งลบกระทู้นี้หรือติดต่อผู้ดูแล   บันทึกการเข้า

apichart
Newbie
**

ความนิยม: +0/-0
กระทู้: 8


« ตอบ #3 เมื่อ: มีนาคม 06, 2010, 02:29:32 AM »

ตอนนี้ลักษณะการทำงานของผมก็จะคล้าย ๆ กันนะครับ โดยผม Apply จากการเขียน Java มาเป็น Delphi
และตอนนี้ก็ยังใช้งานลักษณะนี้อยู่ ก็ OK นะครับ (แต่การทำงานจริงของผม  Sql Command จะอยู่ Layer2
 Layer3 จะจัดการแต่เฉพาะ Schema ของ Dataset คือจะ Create Field on Runtime จะไม่มีการ Add Field
ทิ้งไว้ใน Form ตอน Design Time  ) ผมจะยกตัวอย่างตามแบบคุณนะ MaSo  ครับ

Case Java
Layer1:  UI  = UI
Layer2:  Business Logic ตามแต่ Business
Layer3:  Java Bean

Case Delphi
1 = Form Ex. = Form1
              1. จะมี DataAware  เช่น DBgrid , DbEdit ฯลฯ
              2. จะมี Dataset (ผมใช้ตะกูล ClientDataset) Ex.= cds1
              3. Property ExchangeRate :TExchangeRate;

2 = Class Ex. = Class TExchangeRate
         สำหรับ Business Logic
        Property    cdsExchangeRate:TDataset read FcdsExchangeRate   write SetcdsExchangeRate;
                          (หมายเหตุ SetcdsExchangeRate ให้ทำการ Set Dataset ให้กับ ExchangeTable ด้วย)
        Property    ExchangeTable :TExchangeTable ; (ทำการ Create Class นี้ตอน Create ของ Class)
        Function Insert;  // Call เรียก ExchangeTable.Insert;
        Function Update; // Call เรียก ExchangeTable.Update;
        Function Delete; // Call เรียก ExchangeTable.Delete;
        Function RetrieveList(scommand:String):Boolean; // Call เรียก ExchangeTable.RetrieveList;
        .. สร้าง Function สำหรับ Business เช่น การ Validate , CalculateExchangeRate ... ตามแต่ Logic
       ตัวอย่าง Function RetrieveList(scommand:String):Boolean;
        begin
            Result := ExchangeTable.RetrieveList(sCommand,self.cdsExchangeRate);           
        end;


3 = Class Ex. = Class TExchangeTable
         สำหรับทำการกับConnect กับ  Database
         Function Insert(cds:TDataset):Boolean;
         Function Update(cds:TDataset):Boolean;
         Function Delete(cds:TDataset):Boolean;
         Function RetrieveList(scommand:String;cds:TDataset):Boolean;

        ตัวอย่าง Function RetrieveList(scommand:String;cds:TDataset):Boolean;
        begin
           cds.close;
           cds.Commandtext := 'SELECT * FROM TABLE_EXCHANGERATE WHERE = '+sCommand;
           cds.Open;
           Result := Not Cds.Isempty;
        end;

การทำงาน
     1 . Form1.OnCreate  ทำการ Create Class ExchangeRate และ
          Assign ค่าDataset ให้ Class  ExchangeRate.cdsExchangeRate = self.cds1;
     2. เมื่อกดปุ่มค้นหาที่ Form1 ทำการเรียก ExchangeRate.RetrieveList('ID = 100');
     

แจ้งลบกระทู้นี้หรือติดต่อผู้ดูแล   บันทึกการเข้า

MaSo
Newbie
**

ความนิยม: +0/-0
กระทู้: 15


« ตอบ #4 เมื่อ: มีนาคม 11, 2010, 12:18:31 PM »

ขอบคุณสำหรับทุกความคิดเห็นครับ

ที่ผมน่าจะคล้ายๆ กับของคุณ apichart แต่ที่อาจารย์ให้ผม design ในรูปแบบนี้น่าจะเป็น concept ของ SOA โค๊ดก็ประมาณนี้ครับ

Layer1:
1. สร้างฟอร์มแล้วแปะ component ตามอัธยาศัย
2. เอา Grid กับ datasource มาวาง (หรือจะ create ณ runtime ก็ได้)
3. ตอนแสดงข้อมูลก้อประมาณนี้ครับ

private
mail:TMail;
ds:TDataSet;
.
.
.

begin
mail:=TMail.Create;
ds:=mail.listMail;
mail.setID('xxx');
datasource1.dataset:=ds;
ds.open;
end;


Layer2:
1. สร้าง Class ชื่อ Mail
2. ที่ method listMail ก็ประมาณนี้ครับ

private
mailHandler:TMailHandler
id:string;
public
function listMail: TDataSet;
procedure setID(id:string)
.
.
.
begin
mailHandler:=TMailHandler.Create;
mailHandler.setID(id);
result:=mailHandler.listMail;
end;


Layer3:
1. สร้าง Class ชื่อ MailHandler
2. method listMail ก็ประมาณนี้ครับ

private
myquery: TMyQuery;
id:string;
public
function listMail: TDataSet;
procedure setID(id:string);
.
.
.
begin
myquery:=TMyQuery.Create(nil);
with myquery do
begin
connection:=DataModule1.MyConnection;
sql.add('select .....');
Params.paramvalues['id']:=id;
end;

result:=myquery;

end;
แจ้งลบกระทู้นี้หรือติดต่อผู้ดูแล   บันทึกการเข้า

หน้า: [1]   ขึ้นบน
พิมพ์
กระโดดไป: