Zwei Recordsets eine Tabelle, brauche Rat mit CRecordset
-
So Leute, ich bin gerade mit dem Kopf gegen eine selbstaufgebaute Wand gerannt. Softwareentwicklungstechnisch meine ich.
Jetzt nutze ich den Beitrag hier für zwei Sachen:
1.) Ich schreibe auf was ich denke - dann vergesse ich es nicht und Mist fällt schneller auf.
2.) Ihr könnt sagen wenn ich wieder mit voller Geschwindigkeit auf eine Wand zurenne.Also, folgendes:
Ich habe eine Anwendung mit Datenbank per ODBC (CRecordset).
Da drin sollen u.a. Filialen gespeichert werden.
Nun hatte ich irgendwann beim DB Entwurf die schlaue Idee die Adresse auszulagern in eine eigene Tabelle - denn Adressen gibt es noch bei Kunden und Firmen usw.
Damit entstand etwa dieses hier:
Orte (Plz, Ort)
Adresse (Strasse, Telefon, Ort_ID, usw.)
Filiale (Bezeichnung, Öffnungszeiten, Adress_Id, usw.)Da ich beim Datenbankzugriff mit CRecordset und den internen Mechanismen nicht allzu fit bin habe ich das genutzt was in VC++ in 21 Tagen erklärt wird.
Also pro Tabelle eine CRecordset-Klasse.
Nun war ich fast fertig und mal wieder auf der Suche nach einem der vielen Fallstricke, als mir auffiel, das bei der aktuellen Struktur NIE zwei Firmen dieselbe Adresse haben dürfen. Das geht voll in die Hose.
Also muss die Adress-Tabelle doch in die Filialentabelle. Ich möchte aber die ganzen Funktionen und die Funktionalität in einer Klasse lassen, weil es sonst in jede Klasse mit Adresse kopiert werden müßte.Welche Mechanismen von CRecordset muss ich wie übernehmen oder umbauen, damit das weiterhin geht?
Soll ich die Klasse lieber erben lassen, also "Filiale : public Adresse"?
Oder besser als Member lassen, so wie es ist?Mir gefällt das mit dem Erben irgendwie besser...
Ich kämpfe mich jetzt noch eine Runde durch die MSDN, wäre aber echt dankbar für Vorschläge wie so ein Problem zu lösen ist.
Was ich an Anregungen suche ist:
Welche Funktionen muss ich unbedingt überschreiben, damit ich sie an die neuen Begebenheiten anpassen kann?
DoFieldExchange ist mir klar und der Konstruktor auch.Habt ihr in der Richtung Ideen? Oder etwas zum Lesen? Oder ein nettes Beispiel? Ein paar Tips oder Winweise auf Stolperfallen?
Ich bin für alles dankbar. Allgemeine Theorien bis hin zum konkreten Beispiel.
Danke

-
Hmm, ich fühle mich hier wie Käptain Kirk... unbekannte Welten, wo nie jemand vorher gewesen war - oder so ähnlich.
Also, für Leute mit dem selben Problem:
Man kann die Lösung mit dem Erben ohne Probleme machen, folgende Sachen sind wichtig:
Der jeweilige Konstruktor muss angepasst werden:
In der Basisklasse:CAdressSet::CAdressSet(CDatabase* pdb) : CRecordset(pdb) { //{{AFX_FIELD_INIT(CAdressSet) m_nFields = 8; // Diese hier MÜSSEN mitgezählt werden. //}}AFX_FIELD_INIT }In der abgeleiteten Klasse:
CFilialenSet::CFilialenSet(CDatabase* pdb) : CAdressSet(pdb) // Basisklasse aufrufen { //{{AFX_FIELD_INIT(CFilialenSet) m_nFields += 34; // Das + beachten! //}}AFX_FIELD_INIT m_nDefaultType = snapshot; }Und im DoFieldExchange der abgeleiteten Klasse muss die Basisklasse aufgerufen werden.
void CFilialenSet::DoFieldExchange(CFieldExchange* pFX) { //{{AFX_FIELD_MAP(CFilialenSet) pFX->SetFieldType(CFieldExchange::outputColumn); //... CAdressSet::DoFieldExchange(pFX); //}}AFX_FIELD_MAP }Außerdem braucht die Basisklasse die Funktionen
CString GetDefaultConnect() CString GetDefaultSQL()nicht, das macht ja die andere Klasse. (Meine Adresse war ja mit dem Assistenten erstellt und hatte die noch - wer es von Hand macht hat es gar nicht erst.)