SDI + Datenbank



  • [cpp]
    while(!pSet->IsEOF()) // Datenbank in einer Schleife auslesen
    {
    m_strAnschrift += pSet->m_Anschrift; // CString m_strAnschrift fuellen
    m_strAnschrift += "\n"; // Zeilenumbruch hinzufuegen
    m_recFhzSet.MoveNext(); // Zum naechsten Recordset rutschen
    }[/cpp]

    pSet und m_recFhzSet sind ja auch zwei verschiedene Recordsets. Man sollte sich schon für eins entscheiden.



  • Hi,

    woher kommt der m_recFhzSet Recordset bzw wo finde ich das erklärt?

    MfG



  • Hi,

    ich habe die Anwendung so weit das ich in OnInitDialog() den ersten Datensatz anzeigen lassen, meine pSet Zeiger habe ich in OnInitDialog() angelegt und nun kann ich aber nur da auf ihn zugreifen. Ich möchte jetzt einen Button "Next" einfügen und da brauche ich ja wieder pSet, aber wenn ich ihn als Membervariable einfüge lässt sich die Anwendung zwar ausführen, aber sobald ich den Button klicke kommt ein Fehler.
    Was mache ich falsch??
    Bin für jeden Tip dankbar!

    MfG

    BOOL CDatenbankDlg::OnInitDialog()
    {
    CDialog::OnInitDialog();

    CKundendatenbankSet *pSet = new CKundendatenbankSet;

    pSet->Open();

    m_strName += pSet->m_Name;
    m_strVorname += pSet->m_Vorname;
    m_strAnschrift += pSet->m_Anschrift;
    m_strOrt += pSet->m_Wohnort;

    pSet->Close(); // Datenbank schliessen
    UpdateData(FALSE);
    return TRUE;
    }



  • Hi Triplleh,

    ich bin mir zwar nicht ganz sicher, aber könnte es nicht sein, dass bei

    new CKundendatenbankSet**()**;

    diese Klammern hingehören?

    Grüße Fuxi



  • Hi,
    Probiere mal das ganze nicht in InitDialog() abzufackeln, sondern schreibe dafuer eine zusaetzliche Mothode. Die Methode OnInitDialog() wird imho naemlich nur beim Bau des Dialogs aufgerufen. Wenn du jetzt auf next klickst und damit erneut OnInitDialog() aufrufst, crasht das natuerlich 🤡

    Ein weiteres Problem koennte auftauchen, wenn du deinen Dialog ueber DoModal() aufrufst. Zumindest auf die Doc - Klasse und ihre Variablen kann man in diesem Fall naemlich nicht mehr zugreifen und deshalb vermute ich auch, ist das Dingens mit der Schleife gescheitert.

    Gruesse
    Ralf



  • Hi,

    das löst mein Problem leider auch nicht, ich muß ja den Zeiger so deklarieren da ich aus der geamten Klasse auf ihn zugreifen kann und zur Zeit kann ich das nur in OnInitDialog. Alles was ich bis jetzt versucht bringt nur Fehler.
    Kann mir jemand helfen, Code steht ein Stück höher?!
    Wäre euch sehr dankbar.

    MfG



  • Hi Ralf,

    ich will ja in OnInitDialog nur den ersten Datensatz aufrufen denn Rest will ich dann im OnKlick Ereignis des jeweiligen Button abhandeln.
    Oder geht das nicht, mein Dialog ruf ich mit DoModal auf, vielleicht hast Du
    ja ein kleines Beispiel, wäre super!?

    MfG



  • Hi,
    Sorry, hat ein bisschen gedauert mit der Antwort. Netscape hat mir deinen Beitrag nicht angezeigt und deshalb habe ich gar nicht mitbekommen, dass du nochmal geschrieben hattest.

    Versuche dein Fenster mal als nicht-modales Fenster zu oeffnen.

    DlgKlasse.Create(IDD_DEINDIALOG);
    DlgKlasse.ShowWindow(SW_SHOW);

    (Ist allerdings ungetestet)

    Gruesse
    Ralf 🤡



  • Hallo Ralf,

    Also ich habe es so hinbekommen.

    CDatenbankDlg* pDialog = new CDatenbankDlg;
    pDialog->Create(IDD_DATENBANK);
    pDialog->ShowWindow(SW_SHOW);

    Jetzt zeige ich Dir mal den anderen Code dann kann ich besser
    erklären wie ich mir das vorstelle.

    BOOL CDatenbankDlg::OnInitDialog()
    {
    CDialog::OnInitDialog();

    CKundendatenbankSet *pSet = new CKundendatenbankSet;<-Das ist das Problem

    pSet->Open();
    m_strName += pSet->m_Name;
    m_strVorname += pSet->m_Vorname;
    m_strAnschrift += pSet->m_Anschrift;
    m_strOrt += pSet->m_Wohnort;
    m_strTelefon += pSet->m_Telefon;
    pSet->Close();
    UpdateData(FALSE);
    return TRUE;
    }

    void CDatenbankDlg::OnBnext()
    {
    // Bei Klick so nächster Datensatz angezeigt werden
    }

    So in OnInitDialog will ich nur beim Start den ersten Datensatz
    anzeigen lassen, was auch funktioniert, aber nun will ich beim
    Klick auf next den nächsten Datensatz anzeigen lassen und da liegt
    mein Problem da ich pSet in OnInitDialog anlege habe ich in OnNext
    keinen Zugriff mehr auf den Zeiger und wenn ich ihn als Membervariable
    einfüge bekomme ich nur Speicherfehler, ich weiß nicht wo ich ihn
    anlegen soll bzw was ich falsch mache.

    MfG



  • Hi,
    der Code unten macht genau das was du willst. Musst du dann nur noch ein bisschen auf deine Variablen anpassen 🤡

    Einen Zeiger auf deine RecordSet Klasse anzulegen sollte eigentlich kein Problem sein.
    Am besten als Membervariable in deiner Dialog Klasse.
    1. Membervariable initialisieren
    CDatenbankDlg* pDialog;

    2. Im Konstruktor deines Dialogs
    CDatenbankDlg* pDialog = new CDatenbankDlg;

    Sollte dann eigentlich keine Problem geben in der Funktion ueber
    pDialog->... drauf zuzugreifen.

    void CAdresseDlg::OnNaechsterDS() 
    {
        // TODO: Code für die Behandlungsroutine der Steuerelement-Benachrichtigung hier einfügen
        // DS-Filter setzen
        m_adresseSet.m_strFilter = "Person.ID = Ort.ID";
    
        // Datensatzmenge öffnen
        m_adresseSet.Open();
    
        // Datensatzmenge leer?
        if(!m_adresseSet.IsEOF())
        {
            // zum angezeigten DS gehen
            for(int i=0;i<m_iDSNummer;i++)
            {
                if(!m_adresseSet.IsEOF())
                    // zum letzten DS gehen
                    m_adresseSet.MoveNext();
                else
                    m_NaechsterDS.EnableWindow(FALSE);
            }
    
            // Membervariabeln mit dem Datensatz verbinden
            m_ID = m_adresseSet.m_ID;
            m_Vorname = m_adresseSet.m_Vorname;
            m_Name = m_adresseSet.m_Name;
            m_Strasse = m_adresseSet.m_Stra_e;
            m_PLZ = m_adresseSet.m_PLZ;
            m_Ortsname = m_adresseSet.m_Ortsname;
    
            // neue DSNummer merken
            m_iDSNummer++;
        }
    
        // Datensatzmenge schließen
        m_adresseSet.Close();
    
        // Dialogfenster aktualisieren
        UpdateData(FALSE);
    }
    

    Gruesse
    Ralf


Anmelden zum Antworten