Bonjour !
Je bloque depuis 4 jours sur un problème plutôt banal. J'ai écrit une petite base de données pour stocker des données informatiques. Dedans, j'ai une classe "Appareil", en référence avec la table "appareil" de ma BD. Le problème c'est que je voudrai qu'au moment d'un nouvel enregistrement, qu'un teste soit fait avant, histoire de se rassurer que je ne renseigne pas les données qui s'y trouve déjà. Alors je lis ma table et teste les 4 attributs suivants: Marque, Modele, Etat et Prix. Si dans ma base j'ai déjà un enregistrement qui possède les même données que celle que je suis sur le point d'enregistrer, alors je ne modifie que la quantité de ce qui est dans la table.
J'ai pensé à surcharger l'opérateur "operator+", mais sans succès
Alors je pensé à faire 2 fonctions:
une fonction qui lit la BD et teste les données. Si elles sont égales, alors renvoie true. Sinon renvoie false.
Et une qui modifie la valeur de "quantite"
Et dans ma fonction "ajouter", je teste la première. si elle est vrai, j'appelle la fonction "modifier...", sinon, j'enregistre mes nouvelles données normalement.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
 
bool Appareil::teste_donnees(QString a, QString b, QString c, int d)
{
    //recupérer la valeur contenue dans la base de données
    QSqlQuery request;
    request.exec("SELECT * FROM appareil;");
    while(request.next())
    {
        m_new_id = request.value(0).toInt();
        m_marque = request.value(1).toString();
        m_modele = request.value(2).toString();
        m_etat = request.value(3).toString();
        m_prix = request.value(4).toInt();
        m_new_qte = champ_quantite->value();
        m_new_qte += request.value(6).toInt();
//voici l'ordre des index dans la table appareil: id, marque, modele, etat, prix, num_serie, quantite, descriptif, apercu
    }
    if(m_marque == a && m_modele == b && m_etat == c && m_prix == d)
        return true;
    else
        return false;
 
}
 
void Appareil::modifier_quantite(int new_quantite, int id)
{
    QSqlQuery request;
    request.prepare("UPDATE appareil SET quantite = :qte WHERE id = :id;");
    request.bindValue(":qte", new_quantite);
    request.bindValue(":id", id);
    request.exec();
 
}
 
void Appareil::ajouter()
{
    //modele_appareil();
 
 
    QString marque_t = champ_marque->text();
    QString modele_t = champ_modele->text();
    QString etat_t = combo_etat->currentText();
    int prix_t = champ_prix->value();
    QString num_serie_t = champ_num_serie->text();
    int quantite_t = champ_quantite->value();
    QString description_t = champ_descriptif->toPlainText();
    QString apercu_t = champ_apercu->text();
 
 
    while(marque_t.isEmpty() || modele_t.isEmpty() || num_serie_t.isEmpty() ||
            description_t.isEmpty())
    {
        QMessageBox::warning(this, "Erreur champ vide", "Veuillez renseigner absolument"
                                                        " tous les champs");
 
        return;
    }
 
    if(teste_donnees(marque_t, modele_t, etat_t, prix_t))
    {
        modifier_quantite(m_new_qte, m_new_id);
    }
    else
    {
 
        QString req = "INSERT INTO appareil (marque, modele, etat, prix, "
                      " num_serie, quantite, descriptif, "
                      "apercu) VALUES(:marque, :modele, :etat, :prix, :num_serie, "
                      ":quantite, :descriptif, :apercu);";
 
        QSqlQuery requete;
        (requete.prepare(req)) ? qDebug()<<"prepare ok" : qDebug()<<requete.lastError().text();
        requete.bindValue(":marque", marque_t);
        requete.bindValue(":modele", modele_t);
        requete.bindValue(":etat", etat_t);
        requete.bindValue(":prix", prix_t);
        requete.bindValue(":num_serie", num_serie_t);
        requete.bindValue(":quantite", quantite_t);
        requete.bindValue(":descriptif", description_t);
        requete.bindValue(":apercu", getNameFile());
        requete.exec();
        clean_champ();
 
        QMessageBox::information(this, "Bravo !", "Les données sur le modèle <strong>" + modele_t + "</strong> ont bien été enregistré dans la"
                                                          " la marque <strong>" + marque_t + "</strong>");
 
    }
}
mais quand j'enregistre les données avec les mêmes valeurs, il n'y a pas d'addition sur la quantité. c'est juste un nouvelle enregistrement qui se fait.
SVP aidez moi. si mon approche(utiliser des banales fonctions) est la bonnes, aidez moi dans ce sens.
Et si c'est l'utilisation de la surcharge de l'opérateur + qui est meilleure, aidez moi dans ce sens.
Merci par avance