00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021 #include "dbrecord.h"
00022 #include "funcaux.h"
00023
00024 #include <QFile>
00025 #include <QTextStream>
00026 #include <QLocale>
00027
00028
00030
00032 bool DBCampo::cambiado() {
00033 _depura("DBCampo::cambiado", 0);
00034 _depura("END DBCampo::cambiado", 0);
00035 return m_valorcampo != m_valorcampoorig;
00036 }
00037
00038
00040
00042 void DBCampo::resetCambio() {
00043 _depura("DBCampo::resetCambio", 0);
00044 m_valorcampoorig = m_valorcampo;
00045 _depura("END DBCampo::resetCambio", 0);
00046 }
00047
00048
00050
00052 DBCampo::~DBCampo() {
00053 _depura("DBCampo::~DBCampo", 0);
00054 _depura("END DBCampo::~DBCampo", 0);
00055 }
00056
00057
00059
00062 postgresiface2 *DBCampo::conexionbase() {
00063 _depura("DBCampo::conexionbase", 0);
00064 _depura("END DBCampo::conexionbase", 0);
00065 return m_conexionbase;
00066 }
00067
00068
00070
00073 void DBCampo::setconexionbase(postgresiface2 *comp) {
00074 _depura("DBCampo::setconexionbase", 0);
00075 m_conexionbase = comp;
00076 _depura("END DBCampo::setconexionbase", 0);
00077 }
00078
00079
00081
00084 DBCampo::dbtype DBCampo::tipo() {
00085 _depura("DBCampo::dbtype DBCampo::tipo", 0);
00086 _depura("END DBCampo::dbtype DBCampo::tipo", 0);
00087 return m_tipo;
00088 }
00089
00090
00092
00096 int DBCampo::set(QString val) {
00097 _depura("DBCampo::set", 0);
00098 m_valorcampo = val;
00099 _depura("END DBCampo::set", 0);
00100 return 0;
00101 }
00102
00103
00105
00108 int DBCampo::restrictcampo() {
00109 _depura("DBCampo::restrictcampo", 0);
00110 _depura("END DBCampo::restrictcampo", 0);
00111 return m_restrict;
00112 }
00113
00114
00116
00119 QString DBCampo::nomcampo() {
00120 _depura("DBCampo::nomcampo", 0);
00121 _depura("END DBCampo::nomcampo", 0);
00122 return m_nomcampo;
00123 }
00124
00125
00127
00130 QString DBCampo::nompresentacion() {
00131 _depura("DBCampo::nompresentacion", 0);
00132 _depura("END DBCampo::nompresentacion", 0);
00133 return m_nompresentacion;
00134 }
00135
00136
00138
00141 QString DBCampo::valorcampo() {
00142 _depura("DBCampo::valorcampo", 0);
00143 _depura("END DBCampo::valorcampo", 0);
00144 return m_valorcampo;
00145 }
00146
00147
00149
00156 DBCampo::DBCampo(postgresiface2 *com, QString nom, dbtype typ, int res, QString nomp) {
00157 _depura("DBCampo::DBCampo", 0);
00158 m_conexionbase = com;
00159 m_nomcampo = nom;
00160 m_tipo = typ;
00161 m_restrict = res;
00162 m_nompresentacion = nomp;
00163 m_valorcampo = "";
00164 m_valorcampoorig = "";
00165 _depura("END DBCampo::DBCampo", 0);
00166 }
00167
00168
00170
00174 QString DBCampo::valorcampoprep(int &error) {
00175 _depura("DBCampo::valorcampoprep", 0);
00176 error = 0;
00177 if ((m_restrict & DBNotNull) && !(m_restrict & DBAuto)) {
00178 if (m_valorcampo == "") {
00179 mensajeAviso("El campo '" + m_nompresentacion + "' no puede estar vacio.");
00180 error = -1;
00181 return "";
00182 }
00183 }
00184 switch (m_tipo) {
00185 case DBint:
00186 if (m_valorcampo == "")
00187 return "NULL";
00188 m_valorcampo.replace(",", ".");
00189 return "'" + m_conexionbase->sanearCadena(m_valorcampo) + "'";
00190 case DBvarchar:
00191 if (m_valorcampo == "")
00192 return "NULL";
00193 return "'" + m_conexionbase->sanearCadena(m_valorcampo) + "'";
00194 case DBdate:
00195 if (m_valorcampo == "")
00196 return "NULL";
00197 return "'" + m_conexionbase->sanearCadena(m_valorcampo) + "'";
00198 case DBnumeric:
00199 if (m_valorcampo == "")
00200 return "NULL";
00201 m_valorcampo.replace(",", ".");
00202 return "'" + m_conexionbase->sanearCadena(m_valorcampo) + "'";
00203 case DBboolean:
00204 if (m_valorcampo == "")
00205 return "NULL";
00206 if (m_valorcampo == "f" || m_valorcampo == "t")
00207 return "'" + m_conexionbase->sanearCadena(m_valorcampo) + "'";
00208 return m_conexionbase->sanearCadena(m_valorcampo);
00209 }
00210 error = -1;
00211 _depura("Error en la conversion de tipos", 2);
00212 _depura("END DBCampo::valorcampoprep", 10);
00213 return "";
00214 }
00215
00216
00218
00221 void DBRecord::setconexionbase(postgresiface2 *comp) {
00222 _depura("DBRecord::setconexionbase", 0);
00223 m_conexionbase = comp;
00224 _depura("END DBRecord::setconexionbase", 0);
00225 }
00226
00227
00229
00232 postgresiface2 *DBRecord::conexionbase() {
00233 _depura("DBRecord::conexionbase", 0);
00234 _depura("END DBRecord::conexionbase", 0);
00235 return m_conexionbase;
00236 }
00237
00238
00240
00243 void DBRecord::setDBTableName(QString nom) {
00244 _depura("DBRecord::setDBTableName", 0);
00245 m_tablename = nom;
00246 _depura("END DBRecord::setDBTableName", 0);
00247 }
00248
00249
00251
00254 void DBRecord::setNuevo(bool n) {
00255 _depura("DBRecord::setNuevo", 0);
00256 m_nuevoCampo = n;
00257 _depura("END DBRecord::setNuevo", 0);
00258 }
00259
00260
00262
00265 QString DBRecord::tableName() {
00266 _depura("DBRecord::tableName", 0);
00267 _depura("END DBRecord::tableName", 0);
00268 return m_tablename;
00269 }
00270
00271
00273
00276 QString DBRecord::campoId() {
00277 _depura("DBRecord::campoId", 0);
00278 _depura("END DBRecord::campoId", 0);
00279 return m_campoid;
00280 }
00281
00282
00284
00287 void DBRecord::setDBCampoId(QString nom) {
00288 _depura("DBRecord::setDBCampoId", 0);
00289 m_campoid = nom;
00290 _depura("END DBRecord::setDBCampoId", 0);
00291 }
00292
00293
00295
00298 QList<DBCampo *> *DBRecord::lista() {
00299 _depura("DBRecord::lista", 0);
00300 _depura("END DBRecord::lista", 0);
00301 return &m_lista;
00302 }
00303
00304
00306
00308 void DBRecord::vaciar() {
00309 _depura("DBRecord::vaciar", 0);
00310 DBclear();
00311 _depura("END DBRecord::vaciar", 0);
00312 }
00313
00314
00316
00319 DBRecord::DBRecord(postgresiface2 *con) {
00320 _depura("DBRecord::DBRecord", 0);
00321 m_conexionbase = con;
00322 m_nuevoCampo = TRUE;
00323 _depura("END DBRecord::DBRecord", 0);
00324 }
00325
00326
00328
00330 DBRecord::~DBRecord() {
00331 _depura("DBRecord::~DBRecord", 0);
00332 m_lista.clear();
00333 _depura("END DBRecord::~DBRecord", 0);
00334 }
00335
00337
00341 int DBRecord::DBload(cursor2 *cur) {
00342 _depura("DBRecord::DBload", 0);
00343 m_nuevoCampo = FALSE;
00344
00345 DBCampo *campo;
00346 int error = 0;
00347 for (int i = 0; i < m_lista.size(); ++i) {
00348 campo = m_lista.at(i);
00349 if (! (campo->restrictcampo() & DBCampo::DBNoLoad)) {
00350 QString nom = campo->nomcampo();
00351 QString val = cur->valor(nom);
00352 if ((campo->restrictcampo() & DBCampo::DBPrimaryKey) && (val == ""))
00353 m_nuevoCampo = TRUE;
00354 if ((campo->restrictcampo() & DBCampo::DBDupPrimaryKey) && (val == ""))
00355 m_nuevoCampo = TRUE;
00356 error += campo->set(val);
00358 campo->resetCambio();
00359 }
00360 }
00361 _depura("END DBRecord::DBload", 0);
00362 return error;
00363 }
00364
00365
00367
00369 void DBRecord::DBclear() {
00370 _depura("DBRecord::DBclear", 0);
00371 m_nuevoCampo = TRUE;
00372 DBCampo *campo;
00373 for(int i = 0; i < m_lista.size(); ++i) {
00374 campo = m_lista.at(i);
00375 campo->set
00376 ("");
00377 }
00378 _depura("END DBRecord::DBclear", 0);
00379 }
00380
00381
00383
00386 int DBRecord::DBsave(QString &id) {
00387 _depura("DBRecord::DBsave - " + id, 0);
00388 try {
00389 DBCampo *campo;
00390 QString listcampos = "";
00391 QString listvalores = "";
00392 QString queryupdate = "";
00393 QString separador = "";
00394 QString separador1 = "";
00395 QString separadorwhere = "";
00396 QString querywhere = "";
00397 int err = 0;
00398 for (int i = 0; i < m_lista.size(); ++i) {
00399 campo = m_lista.at(i);
00400
00402 if (campo->restrictcampo() & DBCampo::DBDupPrimaryKey) {
00403 QString lin = campo->valorcampoprep(err);
00404 if (err)
00405 throw (-1);
00406 querywhere += separadorwhere + campo->nompresentacion() + " = " + lin;
00407 separadorwhere = " AND ";
00408 }
00409
00412 if (!(campo->restrictcampo() & DBCampo::DBNoSave)) {
00413 if (campo->restrictcampo() & DBCampo::DBRequired) {
00414 if (campo->valorcampo() == "")
00415 return 0;
00416 }
00417 if (campo->restrictcampo() & DBCampo::DBPrimaryKey) {
00418 QString lin = campo->valorcampoprep(err);
00419 if (err)
00420 throw -1;
00421 querywhere += separadorwhere + campo->nomcampo() + " = " + lin;
00422 separadorwhere = " AND ";
00423 }
00424 if (campo->valorcampoprep(err) != "") {
00425 queryupdate += separador1 + campo->nomcampo() + "=" + campo->valorcampoprep(err);
00426 separador1 = ", ";
00427 }
00428 if (err)
00429 throw -1;
00430 if ((campo->valorcampoprep(err) != "NULL") && (campo->valorcampoprep(err) != "")) {
00431 listcampos += separador + campo->nomcampo();
00432 listvalores += separador + campo->valorcampoprep(err);
00433 if (err)
00434 throw -1;
00435 separador = ", ";
00436 }
00438 if (m_campoid == campo->nomcampo()) {
00439 id = campo->valorcampo();
00440 }
00441 }
00442 }
00443 if (m_nuevoCampo) {
00444 QString query = "INSERT INTO " + m_tablename + " (" + listcampos + ") VALUES (" + listvalores + ")";
00445 m_conexionbase->ejecuta(query);
00446 _depura(query, 0);
00447 cursor2 *cur = m_conexionbase->cargacursor("SELECT " + m_campoid + " FROM " + m_tablename + " ORDER BY " + m_campoid + " DESC LIMIT 1");
00448 id = cur->valor(m_campoid);
00449 delete cur;
00450 } else {
00451 QString query = "UPDATE " + m_tablename + " SET " + queryupdate + " WHERE " + querywhere;
00452 _depura(query, 0);
00453 m_conexionbase->ejecuta(query);
00454 }
00455 m_nuevoCampo = FALSE;
00456 return 0;
00457 } catch (...) {
00458 _depura("EXCEPTION DBRecord::DBsave", 0);
00459 throw -1;
00460 }
00461 _depura("END DBRecord::DBSave", 0);
00462 }
00463
00464
00466
00471 int DBRecord::setDBvalue(QString nomb, QString valor) {
00472 _depura("DBRecord::setDBvalue", 0);
00473 DBCampo *campo;
00474 int error = 0;
00475 int i = 0;
00476 campo = m_lista.value(i);
00477 while (campo && campo->nomcampo() != nomb)
00478 campo = m_lista.value(++i) ;
00479 if (!campo) {
00480 _depura("Campo " + nomb + " no encontrado", 2);
00481 return -1;
00482 }
00483 if (campo->nomcampo() == nomb)
00484 error = campo->set(valor);
00485 _depura("END DBRecord::setDBvalue", 0);
00486 return error;
00487 }
00488
00489
00491
00495 QString DBRecord::DBvalue(QString nomb) {
00496 _depura("DBRecord::value", 0, nomb);
00497 DBCampo *campo;
00498 int i = 0;
00499 campo = m_lista.value(i);
00500 while (campo && campo->nomcampo() != nomb)
00501 campo = m_lista.value(++i);
00502 if (!campo) {
00503 _depura("Campo " + nomb + " no encontrado", 2);
00504 return "";
00505 }
00506 if (campo->nomcampo() == nomb) {
00507 return campo->valorcampo();
00508 }
00509 _depura("END DBRecord::value", 0, nomb);
00510 return "";
00511 }
00512
00513
00515
00519 bool DBRecord::exists(QString nomb) {
00520 _depura("DBRecord::exists", 0, nomb);
00521 DBCampo *campo;
00522 int i = 0;
00523 campo = m_lista.value(i);
00524 while (campo && campo->nomcampo() != nomb)
00525 campo = m_lista.value(++i);
00526 if (!campo) {
00527 return FALSE;
00528 }
00529 if (campo->nomcampo() == nomb) {
00530 return TRUE;
00531 }
00532 _depura("END DBRecord::exists", 0, nomb);
00533 return FALSE;
00534 }
00535
00536
00538
00542 QString DBRecord::DBvalueprep(QString nomb) {
00543 _depura("DBRecord::DBvalueprep", 0);
00544 DBCampo *campo;
00545 int i = 0;
00546 campo = m_lista.value(i);
00547 while (campo && campo->nomcampo() != nomb)
00548 campo = m_lista.value(++i);
00549 if (!campo) {
00550 mensajeAviso("No se ha encontrado el campo '" + nomb + "'.");
00551 return "";
00552 }
00553 if (campo->nomcampo() == nomb) {
00554 int err;
00555 return campo->valorcampoprep(err);
00556 }
00557 _depura("END DBRecord::DBvalueprep", 0);
00558 return "";
00559 }
00560
00561
00563
00570 int DBRecord::addDBCampo(QString nom, DBCampo::dbtype typ, int res, QString nomp = "") {
00571 _depura("DBRecord::addDBCampo", 0);
00572 DBCampo *camp = new DBCampo(m_conexionbase, nom, typ, res, nomp);
00573 camp->set
00574 ("");
00575 m_lista.append(camp);
00576 _depura("END DBRecord::addDBCampo", 0);
00577 return 0;
00578 }
00579
00580
00582
00585 int DBRecord::borrar() {
00586 _depura("DBRecord::borrar", 0);
00587 try {
00588 DBCampo *campo;
00589 QString separadorwhere = "";
00590 QString querywhere = "";
00591
00592 for (int i = 0; i < m_lista.size(); ++i) {
00593 campo = m_lista.at(i);
00594 if (campo->restrictcampo() & DBCampo::DBDupPrimaryKey) {
00595 int err;
00596 QString lin = campo->valorcampoprep(err);
00597 if (err)
00598 throw -1;
00599 querywhere += separadorwhere + campo->nompresentacion() + " = " + lin;
00600 separadorwhere = " AND ";
00601 }
00602
00603 if (!(campo->restrictcampo() & DBCampo::DBNoSave)) {
00604 if (campo->restrictcampo() & DBCampo::DBPrimaryKey) {
00605 int err;
00606 QString lin = campo->valorcampoprep(err);
00607 if (err)
00608 throw -1;
00609 querywhere += separadorwhere + campo->nomcampo() + " = " + lin;
00610 separadorwhere = " AND ";
00611 }
00612 }
00613 }
00614
00615 if (m_nuevoCampo == FALSE) {
00616 m_conexionbase->ejecuta("DELETE FROM " + m_tablename + " WHERE " + querywhere);
00617 }
00618
00619 _depura("END DBRecord::borrar", 0);
00620 return 0;
00621 } catch (...) {
00622 mensajeInfo("se produjo un error al borrar el elemento");
00623 _depura("DBRecord::borrar() Error al borrar elemento", 3);
00624 throw -1;
00625 }
00626 }
00627
00628
00630
00633 int DBRecord::guardar() {
00634 _depura("DBRecord::guardar", 0);
00635 QString id;
00636 try {
00637 DBsave(id);
00638 setDBvalue(m_campoid, id);
00639 _depura("END DBRecord::guardar", 0);
00640 return 0;
00641 } catch (...) {
00642 mensajeError("DBRecord:: Se ha producido un error al guardar los datos.");
00643 throw -100;
00644 }
00645 }
00646
00647
00648
00650
00654 int DBRecord::cargar(QString id) {
00655 _depura("DBRecord::cargar", 0);
00656 QString query = "SELECT * FROM " + m_tablename + " WHERE " + m_campoid + " = " + id;
00657 cursor2 *cur = m_conexionbase->cargacursor(query);
00658 if (!cur->eof()) {
00659 DBload(cur);
00660 }
00661 delete cur;
00662 _depura("END DBRecord::cargar", 0);
00663 return 0;
00664 }
00665
00666
00668
00670 void DBRecord::imprimir() {
00672
00673 _depura("DBRecord::imprimir", 0);
00674 DBCampo *campo;
00675 QString archivo = confpr->valor(CONF_DIR_OPENREPORTS) + "ficha.rml";
00676 QString archivod = confpr->valor(CONF_DIR_USER) + "ficha.rml";
00677 QString archivologo = confpr->valor(CONF_DIR_OPENREPORTS) + "logo.jpg";
00678
00680 #ifdef WINDOWS
00681
00682 archivo = "copy " + archivo + " " + archivod;
00683 #else
00684
00685 archivo = "cp " + archivo + " " + archivod;
00686 #endif
00687
00688 system (archivo.toAscii().constData());
00689
00691 #ifdef WINDOWS
00692
00693 archivologo = "copy " + archivologo + " " + confpr->valor(CONF_DIR_USER) + "logo.jpg";
00694 #else
00695
00696 archivologo = "cp " + archivologo + " " + confpr->valor(CONF_DIR_USER) + "logo.jpg";
00697 #endif
00698
00699 system(archivologo.toAscii().constData());
00700
00701 QFile file;
00702 file.setFileName(archivod);
00703 file.open(QIODevice::ReadOnly);
00704 QTextStream stream(&file);
00705 QString buff = stream.readAll();
00706 file.close();
00707 QString fitxersortidatxt = "";
00708
00710 for (int i = 0; i < m_lista.size(); ++i) {
00711 campo = m_lista.at(i);
00712 fitxersortidatxt += "<tr>\n";
00713 fitxersortidatxt += " <td>" + campo->nomcampo() + "</td>\n";
00714 fitxersortidatxt += " <td>" + campo->nompresentacion() + "</td>\n";
00715 fitxersortidatxt += " <td>" + campo->valorcampo() + "</td>\n";
00716 fitxersortidatxt += "</tr>";
00717 }
00718
00719 buff.replace("[ficha]", m_tablename);
00720 buff.replace("[story]", fitxersortidatxt);
00721
00722 if (file.open(QIODevice::WriteOnly)) {
00723 QTextStream stream(&file);
00724 stream << buff;
00725 file.close();
00726 }
00727
00728 invocaPDF("ficha");
00729 _depura("END DBRecord::imprimir", 0);
00730 }
00731