예약하기부분... 머리가 딸려서 좀 고생했습니다-_-;

아....mxml에서는 반복문 못 쓰는 건가요? 버튼을 90개 만들고 싶은데 다 적을 수도 없고 해서-_-;
as에서 구현을 했습니다 ^^

우선 예약하기부분의 자바클래스를 보도록 합시다.
아 우선 DB구조를 보도록 합시다.


사용자 삽입 이미지

bs는 Booksystem의 약자고요-_-;
bs_Book은 예약리스트입니다. 3개의 필드로 되어있는데요. booknum, id, seatnum으로 되어있구요.
bs_Seat은 seatnum, grade, isbooked로 되어있어요.

예약을 하게 되면 bs_Seat에서 isbooked를 O로 바꾸고 bs_Book에 그 해당 번호와 예약한 id를 저장합니다. booknum은 오토인크리스먼트입니다.

간단한건데 왜이렇게 복잡하게 설명해놨지-_-; 뭐 어쨌든--; 간단합니다-_-;


public int BookSeat(String id, int[] seatnum) {
Connection con = null;
PreparedStatement pstmt = null;

try {
String jdbcDriver = "jdbc:apache:commons:dbcp:/pool";
con = DriverManager.getConnection(jdbcDriver);
// 요청한 좌석이 예약된 좌석인지 확인을 위해 IsBooked를 추출

for (int i=0; i<seatnum.length; i++) {
pstmt = con.prepareStatement(
"UPDATE bs_Seat SET isbooked='O' WHERE bs_Seat.seatnum = ?");
pstmt.setInt(1, seatnum[i]);
pstmt.executeUpdate();
pstmt = con.prepareStatement(
"INSERT INTO bs_Book (id, seatnum) " + "VALUES (?, ?)");
pstmt.setString(1, id);
pstmt.setInt(2, seatnum[i]);
pstmt.executeUpdate();
}
return 1;
} catch (SQLException e) {
e.printStackTrace();
return 0;
} finally {
if (pstmt != null) try { pstmt.close(); } catch(SQLException ex) {}
if (con != null) try { con.close(); } catch(SQLException ex) {}
}
}

int형배열로 받습니다. 다중선택으로 올 수 있기 때문에-_-; 받아서 for문으로 개수만큼 실행합니다. 우선 bs_Seat테이블에서 예약여부필드에서 예약이 됐다는 의미에서 O로 바꾼 뒤에 bs_Book테이블 예약리스트테이블에 해당 id와 좌석번호(seatnum)을 집어 넣습니다. 예약요청하는 수만큼 반복합니다.

플렉스로 가봅시다-_-;


<?xml version="1.0" encoding="utf-8"?>
<mx:Panel xmlns:mx="http://www.adobe.com/2006/mxml" layout="absolute"
width="100%" height="100%"
creationComplete="CreateButton()" title="좌석 예약하기">
<mx:Script>
<![CDATA[
import mx.containers.ControlBar;
import mx.controls.Button;
import mx.rpc.events.ResultEvent;
import mx.rpc.events.FaultEvent;
import mx.collections.ArrayCollection;
import mx.controls.Alert;
import mx.rpc.remoting.RemoteObject;

public var seatlistAC:ArrayCollection;
public var bookseatAC:ArrayCollection = new ArrayCollection();
public var count:int = 0;

// 처음 Panel이 생성될 때 실행되는 버튼생성함수
public function CreateButton():void {
var i:int;
var j:int;
var space:int;

for (i = 0; i < 9; i++) {
for (j = 0; j < 10; j++) {
var btn:Button = new Button();

if (i < 3) {
btn.label = "R" + (i*10+j+1);
space = 0;
} else if (i < 6) {
btn.label = "S" + (i*10+j+1);
space = 30;
} else {
btn.label = "A" + (i*10+j+1);
space = 60;
}
btn.id = String(i*10+j+1);
btn.name = "btn" + String(i*10+j+1);
btn.x = j * 50;
btn.y = i * 30 + space + 10;
btn.width = 35;
btn.height = 20;
btn.setStyle("fillColors", ["#000000","#000000"]);
btn.addEventListener(MouseEvent.CLICK, btnclickEvent);
addChild(btn);
}
}
}

// 버튼클릭시 이벤트
private function btnclickEvent(e:Event):void {
var btn:Button = Button(e.currentTarget);
var i:int;
for (i = 0; i < bookseatAC.length; i++){
if (bookseatAC.getItemAt(i) == btn.id){
bookseatAC.removeItemAt(i);
btn.setStyle("fillColors", ["#000000","#000000"]);
count--;
return;
}
}

if (count == 4) {
Alert.show("더이상 선택할 수 없습니다.");
return;
}
count++;

bookseatAC.addItem(btn.id);
btn.setStyle("fillColors", ["#ff0000","#ff0000"]);
}

// 예약하기버튼 클릭시 발생하는 이벤트
private function bookseatEvent():void {
if (count == 0) {
Alert.show("좌석을 선택하세요!");
return;
}
var bookseatlist:Array = [];
var srv:RemoteObject = new RemoteObject();
var i:int;
srv.destination = "booksystem";

for (i=0; i<bookseatAC.length; i++) {
bookseatlist.push(int(bookseatAC.getItemAt(i)));
}
srv.BookSeat(parentApplication.loginid, bookseatlist);

srv.addEventListener("result", resultHandler);
srv.addEventListener("fault", faultHandler);
}

// 예약하기 버튼 클릭시 실행하는 RemoteObject에 대한 이벤트핸들러
private function resultHandler(event:ResultEvent):void {
var result:int = int(event.result);

switch (result) {
case 0 :
Alert.show("DB오류입니다.");
break;
case 1 :
Alert.show("예약에 성공했습니다.");
bookseatAC.removeAll();
parentApplication.viewstack.selectedChild = parentApplication.ViewHome;
count = 0;
break;
}
}
private function faultHandler(event:FaultEvent):void {
mx.controls.Alert.show("실패 메세지: " + event.fault.message);
}

// 예약여부확인 후 버튼업데이트
public function UpdateBookseat():void {
var srv:RemoteObject = new RemoteObject();
srv.destination = "booksystem";
srv.addEventListener("result", seatresultHandler);
srv.addEventListener("fault", seatfaultHandler);
srv.getSeat();
}
private function seatresultHandler(event:ResultEvent):void {
var i:int;
var btn:Button;

seatlistAC = ArrayCollection(event.result);

for (i = 0; i < seatlistAC.length; i++){
btn = Button(this.getChildByName("btn" + String(i+1)));
btn.setStyle("fillColors", ["#000000","#000000"]);
if (seatlistAC[i].isbooked == "O") {
btn.enabled = false;
} else {
btn.enabled = true;
}
}
parentApplication.viewstack.selectedChild=parentApplication.ViewBookSeat;
}
private function seatfaultHandler(event:FaultEvent):void {
mx.controls.Alert.show("실패 메세지: " + event.fault.message);
}
]]>
</mx:Script>

<mx:ControlBar id="ctrbar" horizontalAlign="center">
<mx:Button id="bookbtn" label="예약하기" click="bookseatEvent();"/>
</mx:ControlBar>
</mx:Panel>

아 길군요-_-; 우선 컴포넌트가 생성이 되면 CreateButton함수를 호출하게 되어있습니다. 이것이 패널에다가 90개의 버튼을 만들어주는 함수입니다. 각각 구별할 수 있게 id와 name을 주고 각 버튼마다 이벤트를 등록했습니다. 그리고 addChild라는 함수는 Panel에 자식으로 붙이겠다는 얘깁니다.

버튼이 생성되면 이미 예약되어있는 좌석은 비활성화 해야합니다. getSeat을 호출하면 좌석정보를 List객체에 담아오는데 이것을 ArrayCollection으로 받습니다.

seatlistAC = ArrayCollection(event.result); 이런식으로 받아오면 됩니다.

해당 되는 버튼은 enable = false로 해서 비활성화시킵니다.

버튼을 생성하고 그 해당 버튼을 클릭하게 되면 이벤트로 등록한 함수를 호출하게 되는데 btnclickEvent 이 함수를 호출하게 됩니다. 클릭할 때마다 ArrayCollection에다가 집어넣습니다-_-; 아..쓰면서 느낀건데 ArrayCollection할 필요 없을 꺼 같은데-_-; 그냥 Array로 해도 될 듯싶습니다. 아 삽질했습니다.

어쨌든 집어 넣어서 이미 클릭이 된거면 삭제를 시키고, 클릭이 안된거면 추가를 하게 되어있습니다.

그렇게 해서 예약하기 버튼을 클릭하면 bookseatEvent함수를 호출합니다. 이 함수를 호출하게 되면 자바클래스에 있는 BookSeat함수를 호출하게 됩니다-_-; 간단해요!

예매시스템 소스파일입니다.
http://mudchobo.tomeii.com/tt/108
http://mudchobo.tomeii.com/tt/trackback/112
  1. kedem

    잘보고 많이 배워갑니다
    하나 궁금한게 있는데
    다른건 다 잘되는데 예약이 안되네요

    저는 오라클을 써서 시퀀스를 사용했는데
    이부분이 계속 오류가 뜨네요
    어떻게 해야 좋을까요

    pstmt = con.prepareStatement("INSERT INTO bs_Book VALUES (booknum_seq.NEXTVAL,?, ?)";);
    pstmt.setString(2, id);
    pstmt.setInt(3, seatnum[i]);
    pstmt.executeUpdate();

    • 머드초보

      음....
      저도 1년전에 짠거라....-_-;
      게다가 시퀀스를 안써봐서 ㅠ
      문법상은 문제가 없어보이네요.
      어떤 에러가 뜨나요?

  2. kedem

    해결했습니다.
    pstmt.setString(2, id);
    pstmt.setInt(3, seatnum[i]);

    이부분 2, 3이 아니라 1, 2네요
    어제는 밤새봐도 모르겠던데
    오늘은 그냥 보니깐 알겠네요ㅜㅜ

    • 머드초보

      헉 그렇군요 ㅠㅠ
      그런문제였군요 ㅠ
      해결하셨다니 다행이네요 ^^

  3. OpenID Logo 양파링

    오라클이라 윗분처럼 insert문에서 걸리던데...열명이 부적합 하다고...ㅡ_ㅡ;
    예약이 되는데요~ 예약 리스트에는 아무것도 없고 db에는 자료는 잘 인서트 되는데 뭐가 문제인지
    ㅜ_ㅠ; 참 db구조 연관관계 해 놓은게 이해가 안가는데 ~ 자세히 설명좀 해주시면 감사할게요~

    • 머드초보

      아...이거 저도 간만에 보니까 이해가 안되네-_-
      아....bs_Book테이블이 예약정보가 들어간 테이블이네요^^
      Member테이블이 있고, Seat은 자리테이블이고
      자리아이디와 멤버아이디를 함께 book테이블에 저장을 해요^^
      열명이 부적합한 것은 db생성이나 쿼리를 잘 확인해보시면.....ㅠ

[로그인][오픈아이디란?]

submit