Einbindung einer Datenbank in eine Unteransicht
-
Woran liegt das wieder, das alle Werte, die in der Datenbank sind, ausgegeben werden???
Der Code:
...::OnDraw(CDC* pDC) { CString str; CTabelleRaum m_raumSet; m_raumSet.Open(); 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;} } } ... ::OnInitialUpdate() { CView::OnInitialUpdate(); CTabelleRaum m_raumSet; m_raumSet.m_strFilter.Format(_T("[Anzahl]>%d"),hoerer); m_raumSet.Open(); }Danke.

-
Wie lange leben Variablen?

-
Variablen leben so lange bis die Methode abgeschlossen wird.
Danke für die Hilfe.

-
Bartnelke schrieb:
Variablen leben so lange bis die Methode abgeschlossen wird.
Danke für die Hilfe.

Es sei denn, es sind Membervariablen der Klasse.

Kein Problem.
-
Kann mir vielleicht jemand helfen und mal die Definition von
farbSet.SetBezeichnunggeben.Des weiteren habe ich ein Problem mit dem Löschen einer Datenbankzeile.
Mit dem im Artikel angegebenen Code:**CFarbenSet farbSet;
farbSet.Open();
farbSet.Suche(Variable);farbSet.Delete(); // Diese Zeile löschen
if (!farbSet.Update())
{
AfxMessageBox(_T("Es wurde nicht gespeichert."));
}
farbSet.Requery();**löscht es bei mir die Zeilen nach dem Primärschlüssel.
Was kann ich tun, damit es nur die markierte Zeile in der Listbox löscht.
-
Bartnelke schrieb:
Kann mir vielleicht jemand helfen und mal die Definition von
farbSet.SetBezeichnunggeben.Klar, nur wird es dir nicht viel helfen fürchte ich.

bool SetBezeichnung(CString f_strBezeichnung) const;Eine stinknormale Set-Funktion eben.
Was kann ich tun, damit es nur die markierte Zeile in der Listbox löscht.
Du musst den "Cursor" des Recordset auf die zu löschende Zeile positionieren.
Für genauere Hilfe bräuchte ich mal wie dein Recordset aussieht (welche Variablen sind drin?) und welchen Wert du für die Auswahl aus der Listbox hast.Hast du die ID vermerkt, wie ich das in den Beispielen gemacht habe?
Combobox lässt sich ja leicht an Listbox anpassen.
-
Das mit der SetBezeichnung hat mir nicht wirklich geholfen.
Was im Recordset steht:
CTabelle1::CTabelle1(CDatabase* pdb)
: CRecordset(pdb)
{m_Name = L"";m_Nummer = 0;m_Mo730900 = FALSE;m_Mo9151045 = FALSE;
m_Mo11001230 = FALSE;m_Mo14001530 = FALSE;m_Mo16001730 = FALSE;
m_Mo18001930 = FALSE;m_DI730900 = FALSE;m_DI9151045 = FALSE;
m_DI11001230 = FALSE;m_DI14001530 = FALSE;m_DI16001730 = FALSE;
m_DI18001930 = FALSE;m_Mi730900 = FALSE;m_Mi9151045 = FALSE;
m_Mi11001230 = FALSE;m_Mi14001530 = FALSE;m_Mi16001730 = FALSE;
m_Mi18001930 = FALSE;m_Do730900 = FALSE;m_Do9151045 = FALSE;
m_Do11001230 = FALSE;m_Do14001530 = FALSE;m_Do16001730 = FALSE;
m_Do18001930 = FALSE;m_Fr730900 = FALSE;m_Fr9151045 = FALSE;
m_Fr11001230 = FALSE;m_Fr14001530 = FALSE;m_Fr16001730 = FALSE;
m_Fr18001930 = FALSE;
m_nFields = 32;
m_nDefaultType = dynaset;
}und irgendwie kann ich bei der Listbox nicht das AddString und das SetItemData nicht herholen.
-
Bartnelke schrieb:
Das mit der SetBezeichnung hat mir nicht wirklich geholfen.
Hatte ich befürchtet, aber du sollst ja nicht sagen können, dass dir Infos vorenthalten werden.

und irgendwie kann ich bei der Listbox nicht das AddString und das SetItemData nicht herholen.
Wieso?
Ich habe gerade extra in die MSDN geschaut.
http://msdn2.microsoft.com/en-gb/library/2cekde96.aspx
http://msdn2.microsoft.com/en-gb/library/ck636w45.aspx
http://msdn2.microsoft.com/en-gb/library/xsyk39cx.aspx
-
da muss zwischen den Variablennamen und deAddString bzw. SetItemData ein Pfeil hin und den habe ich nicht gemacht, weil in dem Artikel das ganze mit Punkt steht.
Für die Auswahl aus der ListBox habe ich den Wert m_Vorlesender.
-
Bartnelke schrieb:
da muss zwischen den Variablennamen und deAddString bzw. SetItemData ein Pfeil hin und den habe ich nicht gemacht, weil in dem Artikel das ganze mit Punkt steht.
Och, woher soll ich denn wissen, dass du mit einem Zeiger arbeitest?

Solche Anpassungen fallen unter Grundwissen, was ich voraussetze.m_Vorlesender kann ich im Recordset nicht finden.
Wie identifizierst du denn die Datensätze eindeutig? Mir fehlt da sowas wie eine ID.
(Datenbankdesign-Grundlagen.)
-
Die ID ist die Nummer.
Und m_Name und m_Vorlesender sollten verglichen werden und gleich sein um es zu löschen.

-
Dann mach doch mal ne Schleife, die abbricht, wenn die gleich sind.
Schon hast du die Funktion zum Raussuchen der zu löschenden Zeile.
(Morgen früh gibts dann die ausführliche Erklärung wenn es nicht klappt. Bin müde und hab kein VC hier.
)
-
Mein Vorschlag für den Löschvorgang:
void Dozent2::OnBnClickedLoeschen() { CTabelle1 m_TabelleDozent; m_TabelleDozent.Open(); if ((m_TabelleDozent.m_Name == m_Vorlesender) && (!m_TabelleDozent.IsEOF())) { // Schon gefunden //return true; } else { // Einmal über alle Datensätze laufen if (m_TabelleDozent.IsBOF()) { } else { // Vorne anfangen m_TabelleDozent.MoveFirst(); while(!m_TabelleDozent.IsEOF()) { // Stimmt die Kombination? if (m_TabelleDozent.m_Name == m_Vorlesender) { // return true;// Fertig und raus } m_TabelleDozent.MoveNext(); // Weiter }}} m_TabelleDozent.Delete(); // Diese Zeile löschen if (!m_TabelleDozent.Update()) { AfxMessageBox(_T("Es wurde nicht gelöscht.")); } m_TabelleDozent.Requery(); }Als Fehlermeldung kommt noch Operation ist fehlgeschlagen; es gibt keinen aktuellen Datensatz.
-
Als Fehlermeldung kommt noch Operation ist fehlgeschlagen; es gibt keinen aktuellen Datensatz.
Hast du mal debugged?
Ich vermute, du hast nix gefunden und versuchst nun hinter dem EOF zu löschen.Die oberste if ist überflüssig. Es reicht die in der Schleife.
Und löschen würde ich in der if in Zeile 24.
Und dann einfach return nach dem Update.Requery kannst du weglassen, weil du gleich danach das Recordset "löschst" (Funktion zuende).
Soo, dann sortier mal um.
Drin ist eigentlich schon alles was du brauchst.
-
Es kommt jetzt Versuch zu aktualisieren oder löschen ist fehlgeschlagen.
Woran liegt es???void Dozent2::OnBnClickedLoeschen() { 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 true;// Fertig und raus } m_TabelleDozent.MoveNext(); // Weiter }} if (!m_TabelleDozent.Update()) { return; AfxMessageBox(_T("Es wurde nicht gelöscht.")); } }Danke.

-
MSDN CREcordset::Delete() schrieb:
Caution The recordset must be updatable and there must be a valid record current in the recordset when you call Delete; otherwise, an error occurs. For example, if you delete a record but do not scroll to a new record before you call Delete again, Delete throws a CDBException.
Woher bekommst du den Inhalt deiner Abfrage?
PS: Anweisungen nach dem return sind übrigens sinnlos

-
Tja, das können 1000 Sachen sein.
Da musste mal debuggen.
-
Bei dem Debuggen kommt aber keine Meldung.
-
Zum Debuggen guck mal ins Magazin wie man das angeht.
Der Debugger schmeißt dir die Lösung in den seltensten Fällen schön zurechtgelegt und ausformuliert vor die Füße.
-
Warning: no listbox item selected.,
Warning: ODBC Success With Info, Fehler bei SQLSetConnectAttr-Aufruf für Treiber
und
Error: must enter Edit or AddNew mode before updating.das sind die Zeilen, die mir der Debugger anzeigt.
Ich hoffe, dass mir jemand helfen kann.
