none
No controlo adoEOF. RRS feed

  • Pregunta

  • Intento darle funcionalidad a los botones de navegacion de un recordset para no
    sobrepasar sus limites.
    Cuando desciendo hasta el primer registro desactivo los botones Anterior< y Prtimero|<
    y si estaba en el ultimo, activo los botones Siguirnte> y Ultimo>| que estarían desactivados.
    Analogamente cuando asciendo hago lo contraio.

    void CDlgProveedores::OnProvAnterior() //Se ha pulsado el boton Anterior<
    {
        if(EsUltimo())
        {    //Activar botones Siguiente> y Ultimo>|
            GetDlgItem(IDC_PROV_SIGUIENTE)->EnableWindow(true);
            GetDlgItem(IDC_PROV_ULTIMO)->EnableWindow(true);
        }
        m_pRs->MovePrevious();
        MostrarRegistro();
        if(EsPrimero())
        {    //Desactivar botones Anterior< y Primero|<
            GetDlgItem(IDC_PROV_ANTERIOR)->EnableWindow(false);
            GetDlgItem(IDC_PROV_PRIMERO)->EnableWindow(false);
        }
    }

    void CDlgProveedores::OnProvSiguiente() //Se ha pulsado el boton Siguiente>
    {
        if(EsPrimero())
        {    //Activar botones Anterior< y Primero|<
            GetDlgItem(IDC_PROV_ANTERIOR)->EnableWindow(true);
            GetDlgItem(IDC_PROV_PRIMERO)->EnableWindow(true);
        }
        m_pRs->MoveNext();
        MostrarRegistro();
        if(EsUltimo())
        {    //Desactivar botones Siguiente> y Ultimo>|
            GetDlgItem(IDC_PROV_SIGUIENTE)->EnableWindow(false);
            GetDlgItem(IDC_PROV_ULTIMO)->EnableWindow(false);
        }
    }

    bool CDlgProveedores::EsPrimero()
    {    
        m_pRs->MovePrevious();//Retoceder para saber si sobrepasamos el inicio del recordset
        if(m_pRs->BOF)
        {
            m_pRs->MoveNext();//Volver al registro actual
            return true;
        }
        m_pRs->MoveNext();      //Volver al registro actual
        return false;
    }

    bool CDlgProveedores::EsUltimo()
    {
        m_pRs->MoveNext();          //Avanzar para saber si sobrepasamos el fin del recordset
        if(m_pRs->adoEOF)
        {
            m_pRs->MovePrevious();//Volver al registro actual
            return true;
        }
        m_pRs->MovePrevious();      //Volver al registro actual
        return false;
    }

    Cuando desciendo hasta el primero y subo va bien, pero cuando llego al final y retrocedo desciendo dos registros del último al antepenúltimo, el resto de uno en uno.
    Lo he repasado mil veces y no se si es fallo del algoritmo o que no entiendo bien adoEOF.
    Agradeceria mucho alguna ayuda.

    jueves, 7 de diciembre de 2006 18:16

Todas las respuestas

  • Por más que lo miro no veo el fallo..
    lunes, 11 de diciembre de 2006 20:52
  • De todas formas gracias.
    He comprobado que si me desplazo al final del recordset con MoveLast() en lugar de con
    MoveNext() y retrocedo no ucurre el salto del último al antepenúltimo.
    Quisiera además comentar que buscando en la ayuda de VisualBasic 6.0 sobre BOF y EOF, mi
    confusión ha aumentado pues no se si hay dos errores de traducción.Lo he copiado y pegado
    para evitar errores por mi parte.
    La propiedad BOF devuelve True (-1) si la actual del registro actual está antes del primer
    registro y devuelve False (0) si la posición del registro actual está en o después del primer registro.
    Aqui querra decir posición en lugar de actual.
    La propiedad EOF devuelve True si la posición del registro actual está después del último registro y devuelve False si la posición del registro actual está en o después del último registro.
    Aqui no sé si habrá querido decir antes en lugar de despues, es que si no, estando despues puede devolver TRUE y FALSE, no lo entiendo.
    Un saludo.

    lunes, 11 de diciembre de 2006 21:44