Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » KDevelop / Qt / wxWidget » Integer Wert mit "null" zurückgeben

Forum | Hilfe | Team | Links | Impressum | > Suche < | Mitglieder | Registrieren | Einloggen
  Quicklinks: MSDN-Online || STL || clib Reference Grundlagen || Literatur || E-Books || Zubehör || > F.A.Q. < || Downloads   

Autor Thread - Seiten: > 1 <
000
27.03.2010, 12:28 Uhr
~conspectumortis
Gast


Hallo,

meine Gruppe und ich sind grad dabei eine Aufgabe für das Vorlesungsfach SoftwareEngineering zu lösen (QT).
Wir haben dabei ein Problem:

Mit dem Programm kann man Name,Nachname und mehrere Telefonnummer eingeben die dann auf unserer Datenbank gespeichert werden.
Das Problem liegt dabei bei der Durchwahl die leer sein kann.
Wenn für die Durchwahl nichts eingegeben wird ,wird kurioserweise der vorherige Wert an die Datenbank übermittelt.

Meine Idee war nun irgendwie die Länge des Integer Wertes (für Durchwahl) herauszufinden und mit einer if-Abfrage der Datenbank einen "null" wert zurückzugeben falls eben keine Durchwahlnummer eingetippt wurde.

Die Frage: wie kann ich explizit die Länge (ob irgendwas drin steht) bei einem int-Wert herausfinden und dann der Datenbank über QT einen "null"-Wert zurückgeben (also leeres Feld)

Hier im folgenden der Code. Im Hauptprogramm findet man den Platzhalter für Durchwahl in einer Schleife für die Eingabe mehrerer Telefonnummer für eine Person.


Code:
// qtdb.cpp

// Zugriff auf die Tabelle "X_Person"


// Zugrundeliegende Tabellendefinition:
// CREATE TABLE X_Person (
//   nummer SERIAL PRIMARY KEY,
//   vorname VARCHAR(30) NOT NULL,
//   nachname VARCHAR(30) NOT NULL,
//   gebjahr INTEGER
// );

// �bersetzen und Ausf�hren mittels:
// g++ -I /usr/include/qt4 -I /usr/include/qt4/Qt qtdb.cpp -lQtSql -lQtCore
// ./a.out

#include <iostream>
using std::cin;        // Standardeingabestrom.
using std::cout;    // Standardausgabestrom.
using std::endl;    // Zeilentrenner.

#include <cctype>

#include <QtCore>
#include <QtSql>

// Eingabezeile lesen und als QString liefern.
// Zwischenraum am Anfang wird �berlesen.
QString readstr () {
    char c;
    QString s;
    while (cin.get(c) && (c == ' ' || c == '\t')) ;
    while (cin && c != '\r' && c != '\n') {
    s += c;
    cin.get(c);
    }
    return s;
}

// Eingabezeile als nichtnegative ganze Zahl lesen.
// Zwischenraum am Anfang wird �berlesen.
// Wenn etwas anderes als eine Folge von Ziffern eingegeben wird,
// ist der Resultatwert -1.
int readint () {
    char c;
    int i = 0;
    while (cin.get(c) && c == ' ' || c == '\t') ;
    while (cin && isdigit(c)) {
    i = i * 10 + c - '0';
    cin.get(c);
    }
    if (c == '\r' || c == '\n') return i;
    while (cin && c != '\r' && c != '\n') cin.get(c);
    return -1;
}

// Hauptprogramm.
int main (int argc, char* argv []) {
    // Jede Qt-Anwendung muss genau ein Objekt der Klasse
    // QApplication oder QCoreApplication erzeugen.
    // Wenn das Programm keine GUI verwendet, gen�gt QCoreApplication.
    // Der Konstruktor des Objekts wird mit den Parametern argc und argv
    // von main aufgerufen.

    QString vorname, nachname, temp;
    int prio =1, personid, landesvorwahl, vorwahl, rufnummer, durchwahl;

    do {
    cout << "PersonId: ";
    personid = readint();
    } while (personid == -1);
    do {
    cout << "Vorname: ";
    vorname = readstr();
    } while (vorname == "");
    do {
    cout << "Nachname: ";
    nachname = readstr();
    } while (nachname == "");

    query.prepare("INSERT INTO b_person (personid, vorname, nachname) "
      "VALUES (:personid, :vorname, :nachname);");
    query.bindValue(":personid", personid);
    query.bindValue(":vorname", vorname);
    query.bindValue(":nachname", nachname);
    if (!query.exec()) {
    cout << "Cannot insert!" << endl;
    exit(3);
    }

do{
cout << prio<<"."<< "Telefonnummer" << endl;
prio=++prio;
    do {
    cout << "Landesvorwahl: ";
    landesvorwahl = readint();
    } while (landesvorwahl == -1);
if(!landesvorwahl.IntToString.length()) break;
do {
    cout << "Vorwahl: ";
    vorwahl = readint();
    } while (vorwahl == -1);
if(!vorwahl.IntToString.length()) break;
do {
    cout << "Rufnummer: ";
    rufnummer = readint();
    } while (rufnummer == -1);
if(!rufnummer.IntToString.length())break;
do {    
cout << "Durchwahl: ";
    durchwahl = readint();
}while(durchwahl == -1);


     query.prepare("INSERT INTO b_telnr (landesvorwahl,vorwahl,rufnummer,durchwahl,prio,personid) "
      "VALUES (:landesvorwahl, :vorwahl, :rufnummer, :durchwahl, :prio , :personid);");
    query.bindValue(":landesvorwahl", landesvorwahl);
    query.bindValue(":vorwahl", vorwahl);
    query.bindValue(":rufnummer", rufnummer);
    query.bindValue(":durchwahl", durchwahl);
    query.bindValue(":prio", prio);
    query.bindValue(":personid", personid);
    if (!query.exec()) {
    cout << "Cannot insert!" << endl;
    exit(3);
    }
}while(1);



    // Anfrage ausf�hren und Ergebnismenge ausgeben.
    // query.next geht zum ersten bzw. n�chsten Datensatz.
    // query.value(i) liefert den Wert der i-ten Spalte
    // (numeriert ab 0) des aktuellen Datensatzes.
    // toString, toInt etc. wandeln diesen Wert in den passenden Typ um
    // (z. B. QString oder int).
    // toStdString wandelt einen QString in einen std::string um,
    // der mittels << ausgegeben werden kann.
    if (!query.exec("SELECT * FROM b_person left join b_telnr ON b_person.personid = b_telnr.personid;")) {
    cout << "Cannot select!" << endl;
    exit(4);
    }
    cout << "PersonID | Vorname | Nachname | TelefonnummerID | Landesvorwahl| Vorwahl | Rufnummer | Durchwahl " << endl;
    while (query.next()) {
    cout << query.value(0).toInt() << " | " <<
      query.value(1).toString().toStdString() << " | " <<
      query.value(2).toString().toStdString() << " | " <<
      query.value(3).toInt()     << " | " <<
      query.value(4).toInt()     << " | " <<
      query.value(5).toInt()     << " | " <<
      query.value(6).toInt()     << " | " <<
      query.value(7).toInt()      << " | " << endl;

    }
}
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
27.03.2010, 13:54 Uhr
0xdeadbeef
Gott
(Operator)


query (in main) scheint nirgends deklariert zu sein, ich sehe weder ein QtCoreApplication-Objekt, noch irgendwo Code, der Verbindung zu einer Datenbank aufnimmt. Da scheint das halbe Programm zu fehlen.

Ansonsten: Ein Integer hat keine "Länge," jedenfalls ist für Ganzzahlen kein Längenbegriff einheitlich definiert. Ich wüsste auch nicht, wie dir das dabei helfen sollte, herauszufinden, ob eine Durchwahl angegeben wurde. Sinnvoller scheint mir, die Eingabe zeilenweise zu verarbeiten, etwa in dieser Form:

C++:
#include <iostream>
#include <sstream> // std::[io]?stringstream
#include <string>  // std::string, std::getline

int main() {
  std::string line;

  std::getline(std::cin, line);
  if(line.empty()) {
    // Keine Eingabe
  } else {
    std::istringstream istr(line);
    int x;

    if(istr >> x) {
      // x = eingegebene Zahl
    } else {
      // Blödsinn wurde eingegeben
    }
  }
}


...natürlich ist der Programmfluss so ziemlich hässlich, und du musst dir überlegen, wie du es am besten in dein Programm einpflegst. Denkbar wäre, das ganze in eine Funktion auszulagern und statt mit ints mit boost::optional<int> zu arbeiten - das scheint mir auch eher dem Datentyp zu entsprechen, mit dem du eigentlich arbeiten willst.

Nachtrag: Überhaupt - was machst du, wenn die Durchwahl beispielsweise 002 oder etwas in der Art ist?
--
Einfachheit ist Voraussetzung für Zuverlässigkeit.
-- Edsger Wybe Dijkstra

Dieser Post wurde am 27.03.2010 um 13:58 Uhr von 0xdeadbeef editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: > 1 <     [ KDevelop / Qt / wxWidget ]  


ThWBoard 2.73 FloSoft-Edition
© by Paul Baecher & Felix Gonschorek (www.thwboard.de)

Anpassungen des Forums
© by Flo-Soft (www.flo-soft.de)

Sie sind Besucher: