Go to the documentation of this file.
34 #if defined(__unix__) || defined(__linux__) || defined(__APPLE__)
42 cout <<
"---------- Transport 9 --------------" << endl;
43 cout <<
"Transport 9 is a Microsoft Windows only example." << endl;
49 #include <QCoreApplication>
56 " i canning plants \n"
60 " a(i) capacity of plant i in cases \n"
61 " b(j) demand at market j in cases \n"
62 " d(i,j) distance in thousands of miles \n"
63 " Scalar f freight in dollars per case per thousand miles /90/; \n"
65 "$if not set gdxincname $abort 'no include file name for data file provided' \n"
66 "$gdxin %gdxincname% \n"
70 " Parameter c(i,j) transport cost in thousands of dollars per case ; \n"
72 " c(i,j) = f * d(i,j) / 1000 ; \n"
75 " x(i,j) shipment quantities in cases \n"
76 " z total transportation costs in thousands of dollars ; \n"
78 " Positive Variable x ; \n"
81 " cost define objective function \n"
82 " supply(i) observe supply limit at plant i \n"
83 " demand(j) satisfy demand at market j ; \n"
85 " cost .. z =e= sum((i,j), c(i,j)*x(i,j)) ; \n"
87 " supply(i) .. sum(j, x(i,j)) =l= a(i) ; \n"
89 " demand(j) .. sum(i, x(i,j)) =g= b(j) ; \n"
91 " Model transport /all/ ; \n"
93 " Solve transport using lp minimizing z ; \n"
95 " Display x.l, x.m ; \n"
100 void readSet(QSqlDatabase sqlDb,
GAMSDatabase db,
string strAccessSelect,
string setName,
int setDim,
string setExp =
"")
102 QSqlQuery query(sqlDb);
103 if (!query.exec(strAccessSelect.c_str()))
105 cout <<
"Error executing query on set '" << setName <<
"'" << endl;
106 cout << query.lastError().text().toStdString() << endl;
109 if (query.size() && (query.record().count() != setDim))
111 cout <<
"Number of fields in select statement does not match setDim" << endl;
116 vector<string> keys = vector<string>(setDim);
120 for (
int idx = 0; idx < setDim; idx++)
121 keys[idx] = query.value(idx).toString().toStdString();
129 QSqlQuery query(sqlDb);
130 if (!query.exec(strAccessSelect.c_str()))
132 cout <<
"Error executing query on parameter '" << parName <<
"'" << endl;
133 cout << query.lastError().text().toStdString() << endl;
136 if (query.size() && (query.record().count() != parDim+1))
138 cout <<
"Number of fields in select statement does not match parDim" << endl;
143 vector<string> keys = vector<string>(parDim);
147 for (
int idx = 0; idx < parDim; idx++)
148 keys[idx] = query.value(idx).toString().toStdString();
158 QSqlDatabase sqlDb = QSqlDatabase::addDatabase(
"QODBC",
"readConnection");
160 QString strAccessConn = (
"Driver={Microsoft Access Driver (*.mdb, *.accdb)};DSN='';DBQ=" + ws.
systemDirectory() \
161 + cPathSep +
"apifiles" + cPathSep +
"Data" + cPathSep +
"transport.accdb").c_str();
162 sqlDb.setDatabaseName(strAccessConn);
167 readSet(sqlDb, db,
"SELECT Plant FROM Plant",
"i", 1,
"canning plants");
168 readSet(sqlDb, db,
"SELECT Market FROM Market",
"j", 1,
"markets");
171 readParameter(sqlDb, db,
"SELECT Plant,Capacity FROM Plant",
"a", 1,
"capacity of plant i in cases");
172 readParameter(sqlDb, db,
"SELECT Market,Demand FROM Market",
"b", 1,
"demand at market j in cases");
173 readParameter(sqlDb, db,
"SELECT Plant,Market,Distance FROM Distance",
"d", 2,
"distance in thousands of miles");
178 cout <<
"Error: Failed to create a database connection. " << sqlDb.lastError().text().toStdString() << endl;
188 if(domains.size() !=
static_cast<size_t>(var.
dim()))
190 cout <<
"Number of column names does not match the dimension of the variable." << endl;
195 QSqlQuery query(sqlDb);
196 query.exec((
"drop table " + varName).c_str());
198 string queryStr =
"create table " + varName +
"(";
199 for (
string dom : domains)
200 queryStr += dom +
" varchar(64), ";
201 queryStr +=
"lvl double)";
203 query.exec(queryStr.c_str());
207 queryStr =
"insert into " + varName +
"(";
208 for (
string dom : domains)
209 queryStr += dom +
", ";
210 queryStr +=
"lvl) values (";
211 for (
string key : rec.keys())
212 queryStr +=
"'" + key +
"', ";
213 queryStr += std::to_string(rec.level()) +
")";
214 if(!query.exec(queryStr.c_str()))
216 cout <<
"Error: Failed to write variable to the database" << endl;
217 cout << sqlDb.lastError().text().toStdString() << endl;
227 QSqlDatabase sqlDb = QSqlDatabase::addDatabase(
"QODBC",
"writeConnection");
229 QString strAccessConn = (
"Driver={Microsoft Access Driver (*.mdb, *.accdb)};DSN='';DBQ=" + ws.
systemDirectory() \
230 + cPathSep +
"apifiles" + cPathSep +
"Data" + cPathSep +
"transport.accdb").c_str();
231 sqlDb.setDatabaseName(strAccessConn);
236 vector<string> domains{
"i",
"j"};
242 cout <<
"Error: Failed to create a database connection. " << sqlDb.lastError().text().toStdString() << endl;
252 int main(
int argc,
char* argv[])
254 cout <<
"---------- Transport 9 --------------" << endl;
258 QCoreApplication app(argc, argv);
274 cout <<
"x(" << rec.key(0) <<
"," << rec.key(1) <<
"):" <<
" level=" << rec.level() <<
" marginal="
275 << rec.marginal() << endl;
280 cout <<
"GAMSException occured: " << ex.what() << endl;
281 }
catch (exception &ex) {
282 cout << ex.what() << endl;
void setSystemDirectory(std::string systemDir)
GAMSVariable getVariable(const std::string &name)
GAMSDatabase readFromAccess(GAMSWorkspace ws)
Read data from MS Access into a GAMSDatabase.
void setAllModelTypes(const std::string &solver)
GAMSSet addSet(const std::string &name, const int dimension, const std::string &explanatoryText="", GAMSEnum::SetType setType=GAMSEnum::SetType::Multi)
GAMSParameterRecord addRecord(const std::vector< std::string > &keys)
GAMSDatabase addDatabase(const std::string &databaseName="", const std::string &inModelName="")
GAMSSetRecord addRecord(const std::vector< std::string > &keys)
GAMSParameter addParameter(const std::string &name, const int dimension, const std::string &explanatoryText="")
void writeVariable(QSqlDatabase sqlDb, GAMSDatabase db, string varName, vector< string > domains)
Write GAMSVariable to MS Access.
void setValue(const double val)
std::string systemDirectory() const
string getModelText()
Get model as string.
void setDefine(const std::string &key, const std::string &value)
void readSet(QSqlDatabase sqlDb, GAMSDatabase db, string strAccessSelect, string setName, int setDim, string setExp="")
Read GAMSSet from MS Access.
void readParameter(QSqlDatabase sqlDb, GAMSDatabase db, string strAccessSelect, string parName, int parDim, string parExp="")
Read GAMSParameter from MS Access.
void writeToAccess(GAMSWorkspace ws, GAMSDatabase db)
Write GAMSDatabase to MS Access.