Einbindung einer Datenbank in eine Unteransicht
-
Also die Funktion, die die Listbox füllt, ist folgende:
void Dozent2::OnUpdate(CView* /*pSender*/, LPARAM /*lHint*/, CObject* /*pHint*/)ich muss nun OnUpdate(???) hinschreiben, in die andere Funktion .
Was muss ich aber für die Fragezeichen hinschreiben. Denn wenn ich es Leer gelassen habe und wenn ich TRUE hingeschrieben, kammen immer Fehler.Oder bin ich wieder ganz falsch???

Danke.
-
Hmm, da hast du zwei Möglichkeiten:
Die einfache: Du lagerst das Füllen der Listbox in eine extra Funktion (z.b. FuelleListe) aus und rufst die von beiden Stellen aus auf.

Die von der ich nicht sicher bin ob es geht:
OnUpdate(this, NULL, NULL);Sollte compilieren, evtl. auch funktionieren, aber irgendwie widerstrebt mir die Variante.

-
void Dozent2::OnBnClickedLoeschen() { UpdateData(TRUE); CTabelle1 m_TabelleDozent; m_TabelleDozent.Open(); if (m_TabelleDozent.IsBOF()) { // Das Recordset ist leer } else { // Vorne anfangen m_TabelleDozent.MoveFirst(); while(!m_TabelleDozent.IsEOF()) { // Stimmt die Kombination? if (m_TabelleDozent.m_Name == m_Vorlesender) { m_TabelleDozent.Delete(); // Diese Zeile löschen return; } m_TabelleDozent.MoveNext(); // Weiter } } Fuellen(); }Kann es sein das meine Funktion Fuellen an der falschen Stelle ist???
Den beim Ausführen wurde es immer noch nicht upgedatet.Danke.

-
Nana, denk mal scharf nach:
Was passiert, wenn der was findet und löscht?Oder anders, wenn du nicht drauf kommst: Setz einen Breakpoint in Zeile 26 und lass was löschen.

-
Okay, die Funktion Füllen() habe ich in Zeile 21 geschrieben, weil an der Stelle wo ich sie erst hatte, niemals durchlaufen wurde.
Jetzt ist es aber so, wenn ich an der Zeile ein Breakpoint setze, dann funktioniert dieses.
Wenn ich das Programm aber ohne Breakpoint laufen lasse, dann aktualisiert sie die Datenbank nicht.
Was ist den nun schon wieder verkehrt???
Danke.
-
Bartnelke schrieb:
Okay, die Funktion Füllen() habe ich in Zeile 21 geschrieben, weil an der Stelle wo ich sie erst hatte, niemals durchlaufen wurde.

Jetzt ist es aber so, wenn ich an der Zeile ein Breakpoint setze, dann funktioniert dieses.
Wenn ich das Programm aber ohne Breakpoint laufen lasse, dann aktualisiert sie die Datenbank nicht.
Was ist den nun schon wieder verkehrt???
Danke.
Puh, keine Ahnung.

Mach mal ne Messagebox statt nem Breakpoint.
-
Also er zeigt mir dann auch die Messagebox an.
Kann es sein, dass ich die Datenbank vielleicht vorher noch schließen muss???

Danke.
-
Versuchs doch einfach.

-
Also nach dem ich sie geschlossen hatte, funktionierte es.
Aber jetzt habe ich noch ne Frage:
Ich will die Daten von der Datenbank im Dialog anzeigen lassen.
Die Felder sind schon alle definiert. Mein Vorschlag ist:void Dozent2::OnLbnDblclkList1() { UpdateData(TRUE); m_neuervorlesender=m_Vorlesender; Invalidate(); }Nur leider funktioniert das nicht: Was ist daran falsch???
Danke.

-
Das ist kein View.
UpdateData(FALSE);wäre es.
PS: Was macht UpdateData denn? Und was macht der Parameter?
-
UpdateData(TRUE) ruft intern DoDataExchange auf und uberträgtden Inhalt auf die Controls in den Variablen.
UpdateData(FALSE) sorgt dafür, das die die Daten von den Variablen auf die Controls überträgt.Aber noch ne Frage:
Was ist an dem folgenden Code falsch???void Vorlesung::OnBnClickedUebernehmenvorlesung2() { UpdateData(TRUE); CVorlesung m_TabelleVorlesung; // Instanz anlegen m_TabelleVorlesung.Open(); // Die Daten holen if (m_TabelleVorlesung.IsBOF()) { // Das Recordset ist leer } else { // Vorne anfangen m_TabelleVorlesung.MoveFirst(); while(!m_TabelleVorlesung.IsEOF()) { // Stimmt die Kombination? if (m_TabelleVorlesung.m_Name == m_vorhandenev) { m_TabelleVorlesung.Edit(); //diese Zeile bearbeiten // Daten verändern m_TabelleVorlesung.m_Name=m_veranstaltung; m_TabelleVorlesung.m_Vorlesender=m_select; m_TabelleVorlesung.m_Zuhoerer=m_sitzplatz; } m_TabelleVorlesung.MoveNext(); // Weiter }} if (!m_TabelleVorlesung.Update()) // Die Änderungen schreiben { AfxMessageBox(_T("Es wurde nicht gespeichert.")); } m_TabelleVorlesung.Requery(); // Bei Bedarf neu laden }

Danke.
-
Bartnelke schrieb:
Was ist an dem folgenden Code falsch???
Schwer zu sagen, bei der grausamen Formatierung...
Auf den ersten Blick ist Zeile 27 überflüssig/zuviel/Compilerfehler/zu viele Klammern !?! [edit]...nee, doch nicht
Formatierung
stimmt schon...[/edit]
Ausserdem sollte das Update() vor dem MoveNext() kommen, wenn ich mich nicht irre.
Auch das Requery() am Ende ist überflüssig, weil direkt danach m_TabelleVorlesung zerstört wird.
Ein Close() fehlt an dieser Stelle.
Nach dem Open() ist das Recordset auf dem ersten Datensatz, wenn Daten vorhanden sind, ein MoveFirst() ist also auch überflüssig. Man kann da direkt mit while(!...IsEof()) loslegen.
Alle Datensätze durchlaufen, bis m_TabelleVorlesung.m_Name == m_vorhandenev stimmt, wird bei sehr vielen Datensätzen sehr langsam. Da wäre ein Filter (m_strFilter) sinnvoller.
Wenn deine allererste Zeile stimmt (mit dem "UpdateData(TRUE) ruft intern DoDataExchange auf..."), was bewirkt dann Zeile 3 mit UpdateData(TRUE); ?!? Es wird doch erst danach die Tabelle geöffnet...
Naja, waren so meine ersten Gedanken, kann sein, dass ich mich irre...
-
Das UpdateData(TRUE) benötige ich aber, damit dem m_vorlesenden ein Wert zugewiesen wird aus der Listbox.
Die restlichen Änderungen habe ich eingebaut. Es werden die Daten in der Datenbank aber immer noch nicht geändert.
void Vorlesung::OnBnClickedUebernehmenvorlesung2() { UpdateData(TRUE); CVorlesung m_TabelleVorlesung; // Instanz anlegen m_TabelleVorlesung.Open(); // Die Daten holen while(!m_TabelleVorlesung.IsEOF()) { // Stimmt die Kombination? if (m_TabelleVorlesung.m_Name == m_vorhandenev) { m_TabelleVorlesung.Edit(); //diese Zeile bearbeiten // Daten verändern m_TabelleVorlesung.m_Name=m_veranstaltung; m_TabelleVorlesung.m_Vorlesender=m_select; m_TabelleVorlesung.m_Zuhoerer=m_sitzplatz; return; } { if (!m_TabelleVorlesung.Update()) // Die Änderungen schreiben { AfxMessageBox(_T("Es wurde nicht gespeichert.")); } m_TabelleVorlesung.MoveNext(); // Weiter }} m_TabelleVorlesung.Close(); }

Woran liegt es???Danke
-
Ich habe jetzt nicht genau alle ...öhm, zehn... Seiten verfolgt, aber auf den ersten Blick ist jetzt das return zu viel.
Ich weiss auch nicht, wie weit du dich mit dem Debugger auskennst, dazu gibt es hier was:
http://www.c-plusplus.net/forum/viewtopic-var-t-is-120832.html
D.h.:
wenn es nicht klappt, einen Haltepunkt setzen und gucken, was in den Variablen drin steht und wo das Programm genau lang läuft und wo nicht.
Dein angesprochene Variable m_vorlesenden finde ich z.B. nicht in dem Code, könnte ein Schreibfehler sein. Wenn ja, dann ist das schwer nachzuvollziehen, was genau gemeint ist. Wenn m_vorlesenden tatsächlich irgendwie dazu gehört und ein Member einer Listbox ist, könnte auch ein Index oder eine ganze Zeile drin stehen. Wie auch immer, das kann hier aber keiner sehen, darum wäre es nicht schlecht, wenn du selbst mal mit dem Debugger die Inhalte und den Ablauf angucken würdest.
-
Die Abfrage funktionierte und dann hat es mal jemand auf der neueren Variante als 2003 laufen lassen und es dann wieder umgemodelt. Seit dem funktioniert die Abfrage nicht mehr.
Wer kann helfen????{ CString s; CDocument* pDoc = GetDocument(); ASSERT_VALID(pDoc); if(!pDoc) return; if (hoerer==0) pDC->TextOut(100,100,"Bitte die linke Maustaste drücken. Vielen Dank!"); else { s.Format("Sie benötigen einen Raum für %d Leute",hoerer); pDC->TextOut(50,10,s); switch (tag) { case 0: m_tag="Montag";break; case 1: m_tag="Dienstag";break; case 2: m_tag="Mittwoch";break; case 3: m_tag="Donnerstag";break; case 4: m_tag="Freitag";break; } s="am " + m_tag; pDC->TextOut(50,30,s); switch(zeit) { case 0:m_zeit="7.30-9.00 Uhr";break; case 1:m_zeit="9.15-10.45 Uhr";break; case 2:m_zeit="11.00-12.30 Uhr";break; case 3:m_zeit="14.00-15.30 Uhr";break; case 4:m_zeit="16.00-17.30 Uhr";break; case 5:m_zeit="18.00-19.30 Uhr";break; } s="für die Uhrzeit: "+ m_zeit; pDC->TextOut(50,60,s); pDC->TextOut(50,120,"Diese Räume sind frei:"); int y=140; if (hoerer<20) i=30; else i=2*hoerer; CString str; CTabelleRaum m_raumSet; m_raumSet.Open(); m_raumSet.m_strFilter.Format(_T("[Anzahl]>%d"),hoerer); if(m_raumSet.IsEOF()){return;} m_raumSet.MoveFirst(); while(!m_raumSet.IsEOF()) { pDC->TextOut(100,y,m_raumSet.m_Nummer); pDC->TextOut(200,y,m_raumSet.m_Name); str.Format("%d",m_raumSet.m_Anzahl); pDC->TextOut(50,y,str); m_raumSet.MoveNext(); y+=20;} } }Danke...