crossplatform.ru

Здравствуйте, гость ( Вход | Регистрация )

2 страниц V   1 2 >  
Ответить в данную темуНачать новую тему
> Копирование строки из т1 в т2 по команде.
sundreamer
  опции профиля:
сообщение 12.6.2011, 14:18
Сообщение #1


Новичок


Группа: Новичок
Сообщений: 5
Регистрация: 12.6.2011
Пользователь №: 2737

Спасибо сказали: 0 раз(а)




Репутация:   0  


Здравствуйте, подскажите пожалуйста, как можно реализовать копирование строки из одной таблицы БД в другую по команде (с помощью кнопки или двойного клика по строке или с помощью других вариантов). Единственное что получилось на QT, это выполнение запросов к БД на sql.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Litkevich Yuriy
  опции профиля:
сообщение 12.6.2011, 20:10
Сообщение #2


разработчик РЭА
*******

Группа: Сомодератор
Сообщений: 9668
Регистрация: 9.1.2008
Из: Тюмень
Пользователь №: 64

Спасибо сказали: 807 раз(а)




Репутация:   94  


в слоте щелчка по кнопке определяешь первичный ключ строки (какой?) из одной таблицы.
Затем делаешь SQL-запрос на вставку такого вида:
INSERT  INTO TABLE2 (<тут через запятую поля строки>)
    VALUES (
        SELECT * FROM TABLE1
            WHERE <имя первичного ключа>=:pk)
где :pk подстановочное имя используемое в QSqlQuery::prepare() и QSqlQuery::bind() а значение его ты его определил чуть раньше.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
sundreamer
  опции профиля:
сообщение 13.6.2011, 0:03
Сообщение #3


Новичок


Группа: Новичок
Сообщений: 5
Регистрация: 12.6.2011
Пользователь №: 2737

Спасибо сказали: 0 раз(а)




Репутация:   0  


буду пробовать, спасибо.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
sundreamer
  опции профиля:
сообщение 13.6.2011, 1:06
Сообщение #4


Новичок


Группа: Новичок
Сообщений: 5
Регистрация: 12.6.2011
Пользователь №: 2737

Спасибо сказали: 0 раз(а)




Репутация:   0  


можете написать примерно, что в слот вписывать и в получателя. сижу с учебником, ничерта не выходит.

можете написать примерно, что в слот вписывать и в получателя. сижу с учебником, ничерта не выходит.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
haiflive
  опции профиля:
сообщение 13.6.2011, 4:51
Сообщение #5


Студент
*

Группа: Участник
Сообщений: 37
Регистрация: 8.7.2010
Пользователь №: 1868

Спасибо сказали: 1 раз(а)




Репутация:   0  


Ты напиши структуры сових таблиц, точнее SQL с помщью которого ты их создаёшь.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Litkevich Yuriy
  опции профиля:
сообщение 13.6.2011, 7:31
Сообщение #6


разработчик РЭА
*******

Группа: Сомодератор
Сообщений: 9668
Регистрация: 9.1.2008
Из: Тюмень
Пользователь №: 64

Спасибо сказали: 807 раз(а)




Репутация:   94  


Цитата(sundreamer @ 13.6.2011, 3:03) *
что в слот вписывать и в получателя
что за получатель?
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
haiflive
  опции профиля:
сообщение 13.6.2011, 8:09
Сообщение #7


Студент
*

Группа: Участник
Сообщений: 37
Регистрация: 8.7.2010
Пользователь №: 1868

Спасибо сказали: 1 раз(а)




Репутация:   0  


Наверное таблица получатель..

скорее всего в "слот" вписывать имена полей которые треббуется скопировать через запятую.. "field1,field2,field3" - это писать вместо *(звёздочка)
А вот в "получателя" соотвественно поля в которые будут писаться эти самые значения.. "field3,field5,field7" - это писать вместо <тут через запятую поля строки>
А вобще если тебе потребовались данные операции, следует задуматься над архитектурой базы данных..

Сообщение отредактировал haiflive - 13.6.2011, 8:13
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
sundreamer
  опции профиля:
сообщение 13.6.2011, 13:49
Сообщение #8


Новичок


Группа: Новичок
Сообщений: 5
Регистрация: 12.6.2011
Пользователь №: 2737

Спасибо сказали: 0 раз(а)




Репутация:   0  


Раскрывающийся текст
static bool createConnection()
{
    QSqlDatabase db = QSqlDatabase::addDatabase("QSQLITE");
    db.setDatabaseName ("C:\\addressbook");
    db.setUserName("root");
    db.setHostName("Notebook");
    db.setPassword("root");
    if (!db.open()) {
        qDebug() << "Cannot open database:" << db.lastError();
        return false;
    }
    return true;
}

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);

    QWidget *window = new QWidget;
    window->setWindowTitle("Sqlite COPY/PASTE");
    QPushButton *button = new QPushButton ("Copy");
    connect (button, SIGNAL(clicked()), получатель , SLOT(слот));
    button->show();

    //Соединяемся с менеджером баз данных
    if (!createConnection()) {
        return -1;
    }

    //Создаем базу
    QSqlQuery query;
    QString str = "CREATE TABLE addressbook2 ( "
                  "number INTEGER PRIMARY KEY NOT NULL, "
                  "name VARCHAR(15), "
                  "phone VARCHAR(12), "
                  "email VARCHAR(15) "
                  ");";
    if (!query.exec(str)) {
        qDebug() << "Unable to create a table";
    }
    //Добавляем данные в базу
    QString strF =
            "INSERT INTO addressbook2 (number, name, phone, email) "
            "VALUES(%1, '%2', '%3', '%4');";

    str = strF.arg("1")
          .arg("Piggy")
          .arg("+49 631322187")
          .arg("piggy@mega.de");

    if (!query.exec(str)) {
        qDebug() << "Unable to do insert operation";
    }

    str = strF.arg("2")
          .arg("Kermit")
          .arg("+49 631322181")
          .arg("kermit@mega.de");

    if (!query.exec(str)) {
        qDebug() << "Unable to do insert operation";
    }
    if (!query.exec("SELECT * FROM addressbook2;")) {
        qDebug() << "Unable to execute query - exiting";
        return 1;
    }

    //Считываем данные из базы
    QSqlRecord rec = query.record();
    int nNumber = 0;
    QString strName;
    QString strPhone;
    QString strEmail;

    while (query.next()) {
        nNumber = query.value(rec.indexOf("number")).toInt();
        strName = query.value(rec.indexOf("name")).toString();
        strPhone = query.value(rec.indexOf("phone")).toString();
        strEmail = query.value(rec.indexOf("email")).toString();
        qDebug() << nNumber << " " << strName << ";\t"
                << strPhone << ";\t" << strEmail;
    }

    QTableView view;
    QSqlTableModel model;
    model.setTable("addressbook2");
    model.select();
    model.setEditStrategy(QSqlTableModel::OnFieldChange);
    view.setModel(&model);
    view.show();

    QHBoxLayout *layout = new QHBoxLayout;
    layout->addWidget(button);
    window->setLayout(layout);
    window->show();
    return a.exec();
}
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Litkevich Yuriy
  опции профиля:
сообщение 13.6.2011, 15:59
Сообщение #9


разработчик РЭА
*******

Группа: Сомодератор
Сообщений: 9668
Регистрация: 9.1.2008
Из: Тюмень
Пользователь №: 64

Спасибо сказали: 807 раз(а)




Репутация:   94  


sundreamer, плохая затея писать весь код в функции main.
Тебе нужно создать класс, в котором будет описано окно приложения. Класс этот простой наследник QWidget. Смотри примеры Qt из каталога %QTDIR%\examples\sql\
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
haiflive
  опции профиля:
сообщение 13.6.2011, 16:11
Сообщение #10


Студент
*

Группа: Участник
Сообщений: 37
Регистрация: 8.7.2010
Пользователь №: 1868

Спасибо сказали: 1 раз(а)




Репутация:   0  


у меня ощущение что sqlite не поддрживает вложенные запросы, оно же поддерживает?..
почему-то при выполнении такогово вот запроса
INSERT  INTO addressbook1 (name, phone, email)
    VALUES (
        SELECT name, phone, email FROM addressbook2
            WHERE number = 1)

прога "sqlitebrowser_200_b1_win" зависает..

я всёрано не понял что ты хотел..
вот напрмер:
connect (button, SIGNAL(clicked()), получатель , SLOT(слот));

лучше бы всё это поместить в класс QObject и там создать public slots ну и соотвественно делать что тебе надо..
class MyClass : public QObject
{
Q_OBJECT

   public slots:
   void myButton_slot();
   private:
     Q_DISABLE_COPY(MyClass)
};

MyClass::MyClass()
{
// соединем событие нажати кнопки с нашим слотом myButton_slot()
   connect (button, SIGNAL(clicked()), this , SLOT(myButton_slot()));
}

void MyClass::myButton_slot()
{
// здесь что-то делаем по команде кнопки, выполняем нужный нам sql
}

Графическая модель, - это уже другая история..

вобщем могу посоветовать почитать книги, там про сигналы и слоты всё доходчиво расписано..

Сообщение отредактировал haiflive - 13.6.2011, 16:12
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

2 страниц V   1 2 >
Быстрый ответОтветить в данную темуНачать новую тему
Теги
Нет тегов для показа


1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0




RSS Текстовая версия Сейчас: 24.9.2021, 6:46