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