base de datos para una oficina de mesa de entrada y salida , donde lleve un registro con los movimientos de los expedientes , detallando el tiempo que esta en cada oficina y cree una hoja de ruta donde diga el tiempo que estubo en cada oficina, la cantidad de fojas agregadas a dicho expediente y ver que usuario lo modifico , donde cada oficina tenga varios usuarios pueda ingresar el expediente o darle una salida hacia otra oficina, un donde la otra oficina debe enviar el expediente pasar por mesa de entrada donde sera controlado y llevara un registro y pasara a su ofina de destino , todo ello tiene que tener una base de datos detallando el historial de cada expediente , en donde estubo y quien lo modifico y el tiempo que estubo en cada expediente ,todo esto debe ser una forma facil y didactica para que los operarios la puedan usar facil , programando con qt creator ui
Aquí te presento una posible solución para la base de datos y la aplicación en Qt Creator UI en C++. **Base de datos** La base de datos se puede implementar utilizando MySQL o cualquier otro sistema de gestión de bases de datos. A continuación, te presento la estructura de la base de datos: ```sql CREATE TABLE oficinas ( id_oficina INT PRIMARY KEY, nombre VARCHAR(255) NOT NULL, descripcion VARCHAR(255) ); CREATE TABLE usuarios ( id_usuario INT PRIMARY KEY, nombre VARCHAR(255) NOT NULL, apellido VARCHAR(255) NOT NULL, correo VARCHAR(255) NOT NULL, contraseña VARCHAR(255) NOT NULL ); CREATE TABLE expedientes ( id_expediente INT PRIMARY KEY, nombre VARCHAR(255) NOT NULL, descripcion VARCHAR(255) ); CREATE TABLE historial ( id_historial INT PRIMARY KEY, id_expediente INT NOT NULL, id_oficina INT NOT NULL, id_usuario INT NOT NULL, fecha DATE NOT NULL, hora TIME NOT NULL, descripcion VARCHAR(255), FOREIGN KEY (id_expediente) REFERENCES expedientes(id_expediente), FOREIGN KEY (id_oficina) REFERENCES oficinas(id_oficina), FOREIGN KEY (id_usuario) REFERENCES usuarios(id_usuario) ); CREATE TABLE fojas ( id_fojas INT PRIMARY KEY, id_expediente INT NOT NULL, cantidad INT NOT NULL, FOREIGN KEY (id_expediente) REFERENCES expedientes(id_expediente) ); ``` **Aplicación en Qt Creator UI en C++** La aplicación se puede implementar utilizando Qt Creator UI en C++. A continuación, te presento una posible implementación: **mainwindow.h** ```cpp #ifndef MAINWINDOW_H #define MAINWINDOW_H #include <QMainWindow> #include <QSqlDatabase> #include <QSqlQuery> #include <QSqlError> namespace Ui { class MainWindow; } class MainWindow : public QMainWindow { Q_OBJECT public: explicit MainWindow(QWidget *parent = nullptr); ~MainWindow(); private slots: void on_btn_ingresar_expediente_clicked(); void on_btn_salir_expediente_clicked(); void on_btn_ver_historial_clicked(); private: Ui::MainWindow *ui; QSqlDatabase db; }; #endif // MAINWINDOW_H ``` **mainwindow.cpp** ```cpp #include "mainwindow.h" #include "ui_mainwindow.h" #include <QSqlQuery> #include <QSqlError> MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent), ui(new Ui::MainWindow) { ui->setupUi(this); db = QSqlDatabase::addDatabase("QMYSQL"); db.setHostName("localhost"); db.setDatabaseName("base_de_datos"); db.setUserName("usuario"); db.setPassword("contraseña"); if (!db.open()) { QMessageBox::critical(this, "Error", db.lastError().text()); return; } } MainWindow::~MainWindow() { delete ui; } void MainWindow::on_btn_ingresar_expediente_clicked() { QSqlQuery query(db); query.prepare("INSERT INTO historial (id_expediente, id_oficina, id_usuario, fecha, hora, descripcion) VALUES (:id_expediente, :id_oficina, :id_usuario, :fecha, :hora, :descripcion)"); query.bindValue(":id_expediente", ui->txt_id_expediente->text().toInt()); query.bindValue(":id_oficina", ui->cmb_oficina->currentData().toInt()); query.bindValue(":id_usuario", ui->cmb_usuario->currentData().toInt()); query.bindValue(":fecha", QDate::currentDate().toString("yyyy-MM-dd")); query.bindValue(":hora", QTime::currentTime().toString("hh:mm:ss")); query.bindValue(":descripcion", ui->txt_descripcion->text()); if (query.exec()) { QMessageBox::information(this, "Exito", "Expediente ingresado correctamente"); } else { QMessageBox::critical(this, "Error", query.lastError().text()); } } void MainWindow::on_btn_salir_expediente_clicked() { QSqlQuery query(db); query.prepare("INSERT INTO historial (id_expediente, id_oficina, id_usuario, fecha, hora, descripcion) VALUES (:id_expediente, :id_oficina, :id_usuario, :fecha, :hora, :descripcion)"); query.bindValue(":id_expediente", ui->txt_id_expediente->text().toInt()); query.bindValue(":id_oficina", ui->cmb_oficina->currentData().toInt()); query.bindValue(":id_usuario", ui->cmb_usuario->currentData().toInt()); query.bindValue(":fecha", QDate::currentDate().toString("yyyy-MM-dd")); query.bindValue(":hora", QTime::currentTime().toString("hh:mm:ss")); query.bindValue(":descripcion", ui->txt_descripcion->text()); if (query.exec()) { QMessageBox::information(this, "Exito", "Expediente salido correctamente"); } else { QMessageBox::critical(this, "Error", query.lastError().text()); } } void MainWindow::on_btn_ver_historial_clicked() { QSqlQuery query(db); query.prepare("SELECT * FROM historial"); if (query.exec()) { while (query.next()) { ui->txt_historial->appendPlainText("ID Expediente: " + query.value(0).toString() + "\n"); ui->txt_historial->appendPlainText("ID Oficina: " + query.value(1).toString() + "\n"); ui->txt_historial->appendPlainText("ID Usuario: " + query.value(2).toString() + "\n"); ui->txt_historial->appendPlainText("Fecha: " + query.value(3).toString() + "\n"); ui->txt_historial->appendPlainText("Hora: " + query.value(4).toString() + "\n"); ui->txt_historial->appendPlainText("Descripcion: " + query.value(5).toString() + "\n"); ui->txt_historial->appendPlainText("---------------------------------------------------\n"); } } else { QMessageBox::critical(this, "Error", query.lastError().text()); } } ``` **mainwindow.ui** La interfaz gráfica se puede diseñar utilizando Qt Creator UI. A continuación, te presento una posible implementación: ```xml <?xml version="1.0" encoding="UTF-8"?> <ui version="4.0"> <class>MainWindow</class> <widget class="QMainWindow" name="MainWindow"> <property name="geometry"> <rect> <x>0</x> <y>0</y> <width>800</width> <height>600</height> </rect> </property> <property name="windowTitle"> <string>MainWindow</string> </property> <widget class="QWidget" name="centralWidget"> <layout class="QVBoxLayout" name="verticalLayout"> <item> <widget class="QLabel" name="label"> <property name="text"> <string>Expediente:</string> </property> </widget> </item> <item> <widget class="QLineEdit" name="txt_id_expediente"/> </item> <item> <widget class="QLabel" name="label_2"> <property name="text"> <string>Oficina:</string> </property> </widget> </item> <item> <widget class="QComboBox" name="cmb_oficina"> <item> <string>Oficina 1</string> </item> <item> <string>Oficina 2</string> </item> <item> <string>Oficina 3</string> </item> </widget> </item> <item> <widget class="QLabel" name="label_3"> <property name="text"> <string>Usuario:</string> </property> </widget> </item> <item> <widget class="QComboBox" name="cmb_usuario"> <item> <string>Usuario 1</string> </item> <item> <string>Usuario 2</string> </item> <item> <string>Usuario 3</string> </item> </widget> </item> <item> <widget class="QLabel" name="label_4"> <property name="text"> <string>Descripcion:</string> </property> </widget> </item> <item> <widget class="QLineEdit" name="txt_descripcion"/> </item> <item> <widget class="QPushButton" name="btn_ingresar_expediente"> <property name="text"> <string>Ingresar Expediente</string> </property> </widget> </item> <item> <widget class="QPushButton" name="btn_salir_expediente"> <property name="text"> <string>Salir Expediente</string> </property> </widget> </item> <item> <widget class="QPushButton" name="btn_ver_historial"> <property name="text"> <string>Ver Historial</string> </property> </widget> </item> <item> <widget class="QPlainTextEdit" name="txt_historial"/> </item> </layout> </widget> <widget class="QMenuBar" name="menuBar"> <property name="geometry"> <rect> <x>0</x> <y>0</y> <width>800</width> <height>22</height> </rect> </property> </widget> <widget class="QStatusBar" name="statusBar"/> </widget> <layoutdefault spacing="6" margin="11"/> <resources/> <connections/> </ui> ``` Esta es una posible implementación de la base de datos y la aplicación en Qt Creator UI en C++. La aplicación permite ingresar y salir expedientes, y ver el historial de los mismos. La base de datos se utiliza para almacenar la información de los expedientes y los usuarios.