STDMETHODIMP CModyfikujZamowienie::PobierzTowarKatalog(
                   BSTR *pbstrIDProduktu, 
                   BSTR bstrDirection, 
                   BSTR *pbstrNazwaProduktu, 
                   CURRENCY *pcurrCena, 
                   int *piDostepnosc)
{
    IObjectContext  *pInstanceContext;  // Kontekst obiektu
    HRESULT         hr;                 // Wynik dziaania.
    CdboKatalog     dboKatalog;         // Baza danych Katalog
    CString         oSIDProduktu;       // Warto wyszukiwania IDProduktu
    CString         oDIDProduktu;       // Warto IDProduktu w bazie danych
    CString         oOldValue;          // Koniec porwnania plikw
    CString         oFirstID;           // Pocztek porwnania plikw
    CString         oPrevValue;         // Poprzednia warto IDProduktu
    CString         oDirection;         // Warto Direction po konwersji

    AFX_MANAGE_STATE(AfxGetStaticModuleState())
    // Uzyskaj kontekst obiektu, uywany do transakcji.
    pInstanceContext = NULL;
    hr = GetObjectContext(&pInstanceContext);

    // Jeli pobranie kontekstu si nie powiedzie, zbadaj dlaczego.
    if (FAILED(hr))
    {
        if (hr == E_INVALIDARG)
            AfxMessageBox("Niewaciwa zmienna kontekstu egzemplarza");
        if (hr == E_UNEXPECTED)
            AfxMessageBox("Wystpi nieoczekiwany bd");
        if (hr == CONTEXT_E_NOCONTEXT)
            AfxMessageBox("Z obiektem nie jest zwizany aden kontekst");
        AfxMessageBox("Uzyskanie kontekstu obiektu nie powiodo si");
        return hr;
    }

    // Otwrz tabel Katalog.
    hr = dboKatalog.Open();

    // Jeli otwarcie tabeli Katalog nie powiodo si, zgo bd.
    if (FAILED(hr))
    {
        AfxMessageBox("Otwarcie tabeli Katalog nie powiodo si");
        return hr;
    }

    // Przejd do pierwszego rekordu w tabeli i zapisz jego identyfikator.
    hr = dboKatalog.MoveFirst();
    oFirstID = dboKatalog.m_IDProduktu;
    oFirstID.Remove(' ');

    // Powiedz Visual C++, e konwertujemy wartoci BSTR.
    USES_CONVERSION;
    // Konwertuj warto kierunku.
    oDirection = OLE2T(bstrDirection);
    oDirection.Remove(' ');

    // Uytkownik chce odwiey aktualny rekord.
    if (oDirection == "Refresh")
    {

        // Konwertuj wartoci wyszukiwania i bazy danych do CString
        // w celu atwiejszego porwnania, a nastpnie usu zbdne spacje.
        oSIDProduktu = OLE2T(*pbstrIDProduktu);
        oSIDProduktu.Remove(' ');
        oDIDProduktu = dboKatalog.m_IDProduktu;
        oDIDProduktu.Remove(' ');

        // Porwnuj dwa cigi a do odnalezienia wyszukiwanej wartoci
        // w bazie danych lub a dotrzesz do koca
        // rekordw.
        while (oDIDProduktu != oSIDProduktu)
        {
            // Zapisz aktualn warto bazy danych do pniejszego           
            // porwnania.
            oOldValue = oDIDProduktu;

            // Jeli aktualny rekord to nie ten szukany,
            // przejd do kolejnego rekordu.
            dboKatalog.MoveNext();

            // Wykonaj wymagan konwersj cigu. 
            oDIDProduktu = dboKatalog.m_IDProduktu;
            oDIDProduktu.Remove(' ');

            // Sprawd, czy dotarto do ostatniego rekordu.
            if (oOldValue == oDIDProduktu)
            {
                // Koniec wyszukiwania.
                break;
            }
        }
    }

    // Uytkownik chce przej do nastpnego rekordu.
    if (oDirection == "Next")
    {

        // Konwertuj wartoci wyszukiwania i bazy danych do CString
        // w celu atwiejszego porwnania, a nastpnie usu zbdne spacje.
        oSIDProduktu = OLE2T(*pbstrIDProduktu);
        oSIDProduktu.Remove(' ');
        oDIDProduktu = dboKatalog.m_IDProduktu;
        oDIDProduktu.Remove(' ');

        // Porwnuj dwa cigi a do odnalezienia wyszukiwanej wartoci
        // w bazie danych lub a dotrzesz do ostatniego rekordu.
        while (oDIDProduktu != oSIDProduktu)
        {
            // Zapisz aktualn warto bazy danych do pniejszego
            // porwnania.
            oOldValue = oDIDProduktu;

            // Jeli aktualny rekord to nie ten szukany,
            // przejd do kolejnego rekordu.
            dboKatalog.MoveNext();

            // Wykonaj wymagan konwersj cigu.
            oDIDProduktu = dboKatalog.m_IDProduktu;
            oDIDProduktu.Remove(' ');

            // Sprawd, czy dotarto do ostatniego rekordu.
            if (oOldValue == oDIDProduktu)
            {
                // Koniec wyszukiwania.
                break;
            }
        }

        // Przesu si o jeden rekord, jeli to moliwe.
        if (oOldValue != oDIDProduktu)
        dboKatalog.MoveNext();
    }

    // Uytkownik chce przej do wczeniejszego rekordu.
    if (oDirection == "Previous")
    {

        // Konwertuj wartoci wyszukiwania i bazy danych do CString
        // w celu atwiejszego porwnania, a nastpnie usu zbdne spacje.
        oSIDProduktu = OLE2T(*pbstrIDProduktu);
        oSIDProduktu.Remove(' ');
        oDIDProduktu = dboKatalog.m_IDProduktu;
        oDIDProduktu.Remove(' ');
        oPrevValue = oFirstID;

        // Porwnuj dwa cigi a do odnalezienia wyszukiwanej wartoci
        // w bazie danych lub a dotrzesz do koca
        // rekordw.
        while (oDIDProduktu != oSIDProduktu)
        {
            // Zapisz warto poprzedniego rekordu, ale tylko jeli
            // nie znajdujemy si na kocu tabeli.
            if (oOldValue != oDIDProduktu)
                oPrevValue = oDIDProduktu;
            // Zapisz aktualn warto bazy danych do pniejszego 
            // porwnania.
            oOldValue = oDIDProduktu;

            // Jeli aktualny rekord to nie ten szukany,
            // przejd do kolejnego rekordu.
            dboKatalog.MoveNext();

            // Wykonaj wymagan konwersj cigu.
            oDIDProduktu = dboKatalog.m_IDProduktu;
            oDIDProduktu.Remove(' ');

            // Sprawd, czy dotarto do koca pliku.
            if (oOldValue == oDIDProduktu)
            {
                // Koniec wyszukiwania.
                break;
            }
        }

        // Przejd do poprzedniego rekordu, jeli to moliwe.
        if (oFirstID != oPrevValue)
        {
            // Przejd do pierwszego rekordu.
            dboKatalog.MoveFirst();

            // Wykonaj wymagan konwersj cigu.
            oDIDProduktu = dboKatalog.m_IDProduktu;
            oDIDProduktu.Remove(' ');

            // Zaczynajc od pocztku tabeli, szukaj
            // wartoci poprzedniego rekordu.
            while (oDIDProduktu != oPrevValue)
            {
                // Jeli aktualny rekord to nie ten szukany,
                // przejd do kolejnego rekordu.
                dboKatalog.MoveNext();

                // Wykonaj wymagan konwersj cigu.
                oDIDProduktu = dboKatalog.m_IDProduktu;
                oDIDProduktu.Remove(' ');

            }
        }

        // W przeciwnym razie upewnij si, e jest to pierwszy rekord.
    else
        dboKatalog.MoveFirst();
    }

    // Umie wartoci aktualnego rekordu w zmiennych.
    *pbstrNazwaProduktu = T2BSTR(dboKatalog.m_nazwaProduktu);
    *pcurrCena = dboKatalog.m_cena;
    *piDostepnosc = dboKatalog.m_dostepnosc;
    *pbstrIDProduktu = T2BSTR(dboKatalog.m_IDProduktu);

    // Zamknij poczenie z baz danych.
    dboKatalog.Close();

    // Zakocz transakcj.
    pInstanceContext->SetComplete();

    // Zwolnij kontekst obiektu.
    pInstanceContext->Release();
    pInstanceContext = NULL;

    // Poinformuj klienta o sukcesie.
    return S_OK;
}
