Home   Artículos   Recursos   Foros   
Artíclos recientes publicados en Latindevelopers:

Visual C++: NSDoubleEdit: Un control para el manejo de números decimales en Visual C++.
Visual C++: Implementando una Calculadora en Visual C++
Visual C++: CCommandLine: Una clase para el uso de la linea de comando
Visual C++: Una clase para el manejo del Registro


Aplicar un filtro a un CDaoRecordset

Aqui programadores en la plataforma Win32 con Visual C++ de Microsoft...

Moderador: latindeveloper

Aplicar un filtro a un CDaoRecordset

Notapor johnny el Mié Abr 27, 2005 8:05 pm

Hola a los amigos de latindevelopers, tengo el siguiente problema:

Hé creado una aplicación SDI con ayuda del AppWizard , con la opción “Header files only” como opción para trabajar con bases de datos.

Luego desde un dialogo que es llamado desde la vista, Abro la DataBase y dos RecordSet asi:

Código: Seleccionar todo
BOOL CDlgCateg::OnInitDialog()
{
   CDialog::OnInitDialog();
   
   // Abrir la base de datos definida CProductDoc
   TRY
   {
      m_pBd->Open("CategProd97.mdb");
   }
   CATCH(CDaoException, e)
   {
      AfxMessageBox(e->m_pErrorInfo->m_strDescription);
      m_pBd = NULL;
      return TRUE;
   }
   END_CATCH;

   // Crear el objeto recordset para la tabla CATEGORIAS
   m_pRsCateg = new CDaoRecordset(m_pBd);
   TRY
   {
      m_pRsCateg->Open(dbOpenTable,"CATEGORIAS");
   }
   CATCH(CDaoException, e)
   {
      AfxMessageBox(e->m_pErrorInfo->m_strDescription);
      m_pRsCateg = NULL;
      return TRUE;
   }
   END_CATCH;

   // Crear el objeto recordset para la tabla PRODUCTOS
   m_pRsProd = new CDaoRecordset(m_pBd);

     // Obtener la categoria apuntada por m_pRsCateg
   CString sCateg = CCrack::strVARIANT(m_pRsCateg->GetFieldValue(0));
   TRY
   {
      m_pRsProd->Open(dbOpenDynaset, "select * from PRODUCTOS where ID_CATEG = " + sCateg);
   }
   CATCH(CDaoException, e)
   {
      AfxMessageBox(e->m_pErrorInfo->m_strDescription);
      m_pRsProd = NULL;
      return TRUE;
   }
   END_CATCH;

   //..
   // ..
   
   return TRUE;  // return TRUE unless you set the focus to a control
                 // EXCEPTION: OCX Property Pages should return FALSE
}


Hasta aquí esta todo bien, es decir cuando se muestra la primera Categoría se muestra tambien solo los Productos correspondientes a dicha categoría.

El problema biene cuando me desplazo a la siguiente categoria, para lo cual hé puesto el siguiente codigo en un lugar apropiado.



Código: Seleccionar todo

   CString sFiltro = "ID_CATEG = '" + m_sIDCateg + "'";
   m_pRsProd->m_strFilter = sFiltro;
   m_pRsProd->Requery();



Se supone que el filtro debe funcionar mostrando solo los productos de la correspondiente categoria almacenada en la variable miembro m_sIDCateg , pero sale el siguiente error:

Error de sintaxis (falta operador) en la expresión de consulta 'ID_CATEG= 1 WHERE ID_CATEG='2".

Por favor estaré muy agradecido a quien me pueda dar una ayuda para resolver este problema.

Atentamente Johnny
johnny
Usuario Activo
Usuario Activo
 
Mensajes: 47
Registrado: Lun Jun 21, 2004 4:02 pm
Ubicación: Arequipa-Perú

Re: Aplicar un filtro a un CDaoRecordset

Notapor latindeveloper el Jue Abr 28, 2005 9:17 am

Aqui te muestro el codigo que utilizo para cargar datos de una tabla...

Código: Seleccionar todo
void CUnitsDlg::LoadData()
{
   CWaitCursor x;

   CDaoRecordset rs(m_Conn);

   CString sql;

   sql = _T("SELECT IdUnidad, Nombre,Abrev  FROM unidades ORDER BY Nombre");
   
   try{

      rs.Open(AFX_DAO_USE_DEFAULT_TYPE,sql,dbSeeChanges);

      CString sValue;
      LONG id;
      INT item = 0;
     
      m_unitList.SetRedraw(FALSE);
      m_unitList.DeleteAllItems();

      COleVariant var;

      while(!rs.IsEOF())
      {   
         rs.GetFieldValue(0,var);
         id = V_I4(&var);
         sValue.Format("%0*ld",4,id);
         m_unitList.InsertItem(item,sValue);
         m_unitList.SetItemData(item,id);

         rs.GetFieldValue(1,var);   //Nombre   
         m_unitList.SetItemText(item,1,CCrack::strVARIANT(var));

         rs.GetFieldValue(2,var);   //Abreviacion
         sValue = CCrack::strVARIANT(var);
         sValue.MakeUpper();
         m_unitList.SetItemText(item,2,sValue);

         rs.MoveNext();
         item++;
      }

      m_unitList.SetRedraw(TRUE);
     
      if(item)
      {
         m_unitList.SetFocus();
      }

      rs.Close();     
     
   }
   catch(CDaoException *e)
   {
      // DatabaseErrorLog(e,sql,__LINE__,__FILE__);
      e->Delete();
   }
}


Para cargar el dato que quiero simplemente le aumento a la sentencia SQL "WHERE IdUnidad = 23 " por ejemplo.

No recomiendo que abras toda la tabla y luego apliques un filtro... eso no es optimo...

PD. pocas veces muestro un codigo integro utilizado en mis aplicaciones. Disflutalo.
Avatar de Usuario
latindeveloper
Administrador
Administrador
 
Mensajes: 1061
Registrado: Lun Jun 02, 2003 8:29 pm
Ubicación: Peru

Filtro a un CDaoRecorset

Notapor johnny el Jue Abr 28, 2005 2:29 pm

Gracias amigo Ivan por tu respuesta.

Tratare de implementar el codigo que me obsequias.

Solo que aun tengo una duda, como ves en el ejemplo que puse estoy trabajando directamente con la clase CDaoRecordset, esto es conveniente? o es mejor trabajar con una clase derivada de la misma.

Ya que tengo entendido que se puede llamar al filtro ( m_pRsProd->m_strFilter = sFiltro; ) antes de abrir el recordset ( m_pRsProd->Open(); ) pero creo que ello solo es posible si el recordset m_pRsProd apunta a un objeto recordset derivado de CDaoRecorset.

Gracias desde ya por tu respuesta.

Atentamente Johnny
johnny
Usuario Activo
Usuario Activo
 
Mensajes: 47
Registrado: Lun Jun 21, 2004 4:02 pm
Ubicación: Arequipa-Perú


Volver a Visual C++

¿Quién está conectado?

Usuarios navegando por este Foro: No hay usuarios registrados visitando el Foro y 1 invitado