DCL 4.0
Loading...
Searching...
No Matches
ViewOrder.cpp
Go to the documentation of this file.
1#include <dcl/Config.h>
2
3#if __DCL_WINDOWS
4#include <windows.h>
5#endif
6
7#include "EShopServlet.h"
8
9#ifdef __DCL_DEBUG
10#undef __THIS_FILE__
11static const wchar_t __THIS_FILE__[] = L"eshop/ViewOrder.cpp";
12#endif
13
14__DCL_BEGIN_NAMESPACE
15
16void EShopServlet::onViewOrder(
18 const EShopSession& session
19 )
20{
21 Writer& out = ctx.writer();
22 ListedStringToStringArrayMap& params = ctx.__formMap;
23
24 if (session.command() == CM_ORDER)
25 {
26 String strName = (params[L"name"])[0];
27 String strTel = (params[L"tel"])[0];
28 String strAddr = (params[L"tel"])[0];
29
30 SQLQuery q(session.SQLConn());
31 q.prepare(L""
32 "INSERT INTO ES_ORDER_MASTER(ORDER_DATETIME, USER_ID,"
33 " DELIVERY_NAME, DELIVERY_TEL, DELIVERY_ADDR)\n"
34 " VALUES(CURRENT_TIMESTAMP, :USER_ID, :DELIVERY_NAME, "
35 " :DELIVERY_TEL, :DELIVERY_ADDR)"
36 );
37 q.params()[0].setValue(session.userID());
38 q.params()[1].setValue(strName);
39 q.params()[2].setValue(strTel);
40 q.params()[3].setValue(strAddr);
41 q.execute();
42
43 q.execute(L""
44 "SELECT MAX(ORDER_ID) FROM ES_ORDER_MASTER "
45 " WHERE USER_ID = " + String::valueOf(session.userID())
46 );
47 q.fetch();
48
49 q.execute(L""
50 "INSERT INTO ES_ORDER_DETAIL\n"
51 " SELECT " + q.fields()[0].asString() + L", S.PRODUCT_ID, P.PRICE, S.QUANTITY "
52 " FROM ES_SHOPPING_BASKET S "
53 " INNER JOIN ES_PRODUCT P ON S.PRODUCT_ID = P.PRODUCT_ID \n"
54 " WHERE SESSION_ID = \'" + session.sessionID() + L"\'"
55 );
56
57 q.execute(L""
58 "DELETE FROM ES_SHOPPING_BASKET "
59 " WHERE SESSION_ID = \'" + session.sessionID() + L"\'"
60 );
61 }
62
63 SQLQuery qMaster(session.SQLConn());
64 qMaster.prepare(L""
65 "SELECT * FROM ES_ORDER_MASTER "
66 " WHERE USER_ID = :USER_ID"
67 );
68 qMaster.params()[0].setValue(session.userID());
69 qMaster.execute();
70 qMaster.fetch();
71
72 TextTemplate tpl = *m_pViewOrder;
73 TextTemplate& tplOrder = tpl[L"ORDER"];
74 TextTemplate& tplEmpty = tpl[L"EMPTY"];
75
76 if (qMaster.eof())
77 {
78 tpl.erase(L"ORDER");
79 tpl.assign(L"EMPTY", tplEmpty);
80 }
81 else
82 {
83 String strDetailSQL = L""
84 "SELECT P.IMAGE_FILE_NAME, P.PRODUCT_NAME, P.QUALITY, "
85 " D.PRICE, D.QUANTITY, D.PRICE * D.QUANTITY AS AMOUNT\n"
86 " FROM ES_ORDER_DETAIL D "
87 " INNER JOIN ES_PRODUCT P ON (D.PRODUCT_ID = P.PRODUCT_ID)\n"
88 " WHERE D.ORDER_ID = :ORDER_ID \n"
89 " ORDER BY D.PRODUCT_ID";
90
91 SQLQuery qDetail(session.SQLConn());
92
93 TextTemplate& tplMaster = tplOrder[L"MASTER_ROW"];
94 TextTemplate& tplDetail = tplMaster[L"DETAIL_ROW"];
95 int nNo = 1;
96 int64_t nTotal = 0;
97 while(!qMaster.eof())
98 {
99 int nOrderID = qMaster.fields().byName(L"ORDER_ID").asInteger();
100
101 // SELECT에서 prepare는 한번만 하면 되지만 이 부분에서
102 // SQL 드라이버 및 라이브러리에 버그가 발견되었다.
103 // 매번 parepare 한다. 2004.12.09
104 qDetail.prepare(strDetailSQL);
105 qDetail.params()[0].setValue(nOrderID);
106 qDetail.execute();
107 qDetail.fetch();
108 bool bFirst = true;
109 int64_t nSubTotal = 0;
110 while(!qDetail.eof())
111 {
112 int64_t nAmount = 0;
113 qDetail.fields().byName(L"AMOUNT").getValue(nAmount);
114 nSubTotal += nAmount;
115 tplDetail.assign(qDetail.fields(), L"&nbsp;");
116 if (bFirst)
117 {
118 bFirst = false;
119 tplMaster.assign(L"DETAIL_ROW", tplDetail);
120 }
121 else
122 tplMaster.append(L"DETAIL_ROW", tplDetail);
123
124 qDetail.fetch();
125 }
126 nTotal += nSubTotal;
127 tplMaster.assign(L"SUB_TOTAL", String::valueOf(nSubTotal));
128
129 tplMaster.assign(qMaster.fields(), L"&nbsp;");
130 tplMaster.assign(L"NO", String::valueOf(nNo++));
131 tplOrder.append(L"MASTER_ROW", tplMaster);
132 qMaster.fetch();
133 }
134 tplOrder.assign(L"TOTAL", String::valueOf(nTotal));
135 tpl.assign(L"ORDER", tplOrder);
136 tpl.erase(L"EMPTY");
137 }
138
139 out << tpl;
140}
141
142__DCL_END_NAMESPACE
#define __THIS_FILE__
Definition _trace.h:14
@ CM_ORDER
const String & sessionID() const
SQLConnection * SQLConn() const
int userID() const
int command() const
StringWriter & writer()