Compartir a través de


Conjunto de registros: Funcionamiento de AddNew, Edit y Delete (ODBC)

Este tema es aplicable a las clases ODBC de MFC.

En este tema se explica cómo funcionan las funciones miembro AddNew, Edit y Delete de la clase CRecordset. Temas cubiertos:

Nota:

Este tema se aplica a objetos derivados de CRecordset donde no se haya implementado la obtención masiva de filas. Si utiliza la obtención masiva de filas, vea Conjunto de registros: Obtener registros de forma masiva (ODBC).

Como complemento, es posible que desee leer Intercambio de campos de registros: Funcionamiento de RFX, que describe el rol correspondiente de RFX en las operaciones de actualización.

Adición de un registro

La adición de un nuevo registro a un conjunto de registros implica llamar a la función miembro AddNew del conjunto de registros, establecer los valores de los miembros de datos de campo del nuevo registro y llamar a la función miembro Update para escribir el registro en el origen de datos.

Como condición previa para llamar aAddNew, el conjunto de registros no debe haberse abierto como de solo lectura. Las funciones miembro CanUpdate y CanAppend permiten determinar estas condiciones.

Al llamar a AddNew:

  • El registro del búfer de edición se almacena, por lo que su contenido se puede restaurar si se cancela la operación.

  • Los miembros de datos de campo se marcan, por lo que es posible detectar cambios en ellos más adelante. Los miembros de datos de campo también se marcan como limpios (sin cambios) y se establecen en null.

Después de llamar a AddNew, el búfer de edición representa un nuevo registro vacío, listo para rellenarse con valores. Para ello, se establecen manualmente los valores con su asignación. En lugar de especificar un valor de datos real para un campo, puede llamar a SetFieldNull para especificar el valor Null.

Para confirmar los cambios, llame a Update. Cuando se llama a Update para el nuevo registro:

  • Si el controlador ODBC admite la función de API de ODBC ::SQLSetPos, MFC usa la función para agregar el registro en el origen de datos. Con ::SQLSetPos, MFC puede agregar un registro de forma más eficaz porque no tiene que construir y procesar una instrucción SQL.

  • Si ::SQLSetPos no se puede usar, MFC hace lo siguiente:

    1. Si no se detecta ningún cambio, Update no hace nada y devuelve 0.

    2. Si hay cambios, Update construye una instrucción INSERT de SQL. Las columnas representadas por todos los miembros de datos de campo con modificaciones se enumeran en la instrucción INSERT. Para forzar la inclusión de una columna, llame a la función miembro SetFieldDirty:

      SetFieldDirty( &m_dataMember, TRUE );
      
    3. Update confirma el nuevo registro: la instrucción INSERT se ejecuta y el registro se confirma en la tabla del origen de datos (y el conjunto de registros, si no es una instantánea) a menos que una transacción esté en curso.

    4. El registro almacenado se restaura en el búfer de edición. El registro que era actual antes de la llamada a AddNew vuelve a serlo independientemente de que la sentencia INSERT se haya ejecutado con éxito.

    Sugerencia

    Para un control completo de un nuevo registro, tome el siguiente enfoque: establezca los valores de cualquier campo que tenga valores y, a continuación, establezca explícitamente los campos que seguirán siendo null llamando a SetFieldNull con un puntero al campo y el parámetro TRUE (el valor predeterminado). Si desea asegurarse de que un campo no está escrito en el origen de datos, llame a SetFieldDirty con un puntero al campo y al parámetro FALSE y no modifique el valor del campo. Para determinar si un campo puede ser null, llame a IsFieldNullable.

    Sugerencia

    Para detectar cuándo cambian los miembros de datos del conjunto de registros, MFC usa un valor PSEUDO_NULL adecuado para cada tipo de datos que puede almacenar en un conjunto de registros. Si debe establecer explícitamente un campo en el valor PSEUDO_NULL y el campo ya está marcado como null, también debe llamar a SetFieldNull, pasando la dirección del campo en el primer parámetro y FALSE en el segundo parámetro.

Visibilidad de los registros agregados

¿Cuándo es visible un registro agregado para el conjunto de registros? Los registros agregados a veces aparecen y a veces no son visibles, en función de dos cosas:

  • Lo que pueda hacer el controlador.

  • Lo que pueda aprovechar el marco.

Si el controlador ODBC admite la función de API de ODBC ::SQLSetPos, MFC usa la función para agregar registros. Con ::SQLSetPos, los registros agregados son visibles para cualquier conjunto de registros de MFC actualizable. Sin compatibilidad con la función, los registros agregados no son visibles y debe llamar a Requery para verlos. El uso de ::SQLSetPos también es más eficaz.

Edición de un registro existente

La edición de un registro existente en un conjunto de registros implica desplazarse hasta el registro, llamar a la función miembro Edit del conjunto de registros, establecer los valores de los miembros de datos de campo del nuevo registro y llamar a la función miembro Update para escribir el registro modificado en el origen de datos.

Como condición previa para llamar a Edit, el conjunto de registros debe ser actualizable y estar en un registro. Las funciones miembro CanUpdate y IsDeleted permiten determinar estas condiciones. El registro actual tampoco debe haberse eliminado y debe haber registros en el conjunto de registros (IsBOF y IsEOF devuelven 0).

Cuando se llama a Edit, se almacena el registro en el búfer de edición (el registro actual). Los valores del registro almacenado se usan más adelante para detectar si los campos han cambiado.

Después de llamar a Edit, el búfer de edición sigue representando el registro actual, pero ahora está listo para aceptar los cambios en los miembros de datos del campo. Para cambiar el registro, establezca manualmente los valores de cualquier miembro de datos de campo que desee editar. En lugar de especificar un valor de datos real para un campo, puede llamar a SetFieldNull para especificar el valor Null. Para confirmar los cambios, llame a Update.

Sugerencia

Para salir del modo AddNew o Edit, llame a Move con el parámetro AFX_MOVE_REFRESH.

Como condición previa para llamar a Update, el conjunto de registros no debe estar vacío y el registro actual no debe haberse eliminado. IsBOF, IsEOF y IsDeleted deben devolver 0.

Cuando se llama a Update para el registro editado:

  • Si el controlador ODBC admite la función de API de ODBC ::SQLSetPos, MFC usa la función para actualizar el registro en el origen de datos. Con ::SQLSetPos, el controlador compara el búfer de edición con el registro correspondiente en el servidor, actualizando el registro en el servidor si los dos son diferentes. Con ::SQLSetPos, MFC puede actualizar un registro de forma más eficaz porque no tiene que construir y procesar una instrucción SQL.

    O bien

  • Si ::SQLSetPos no se puede usar, MFC hace lo siguiente:

    1. Si no ha habido ningún cambio, Update no hace nada y devuelve 0.

    2. Si hay cambios, Update construye una instrucción UPDATE de SQL. Las columnas enumeradas en la instrucción UPDATE se basan en los miembros de los datos de campo que han cambiado.

    3. Update confirma los cambios —ejecuta la instrucción UPDATE— y el registro se cambia en el origen de datos, pero no se confirma si una transacción está en curso (vea Transacción: Realizar una transacción en un conjunto de registros [ODBC] para obtener información sobre cómo afecta la transacción a la actualización). ODBC mantiene una copia del registro, que también cambia.

    4. A diferencia del proceso AddNew, el proceso Edit no restaura el registro almacenado. El registro editado permanece en su lugar como registro actual.

    Precaución

    Al prepararse para actualizar un conjunto de registros llamando a Update, asegúrese de que incluye todas las columnas que componen la clave principal de la tabla (o todas las columnas que componen cualquiera de los índices únicos de la tabla, o las suficientes para identificar la fila de manera única). En algunos casos, el marco de trabajo sólo puede utilizar las columnas seleccionadas en el conjunto de registros para identificar qué registro de la tabla se actualiza. Sin todas las columnas necesarias, podrían actualizarse varios registros en la tabla. En este caso, el marco de trabajo produce excepciones al llamar a Update.

    Sugerencia

    Si llama a AddNew o Edit después de llamar a cualquiera de las funciones anteriormente, pero antes de llamar a Update, el búfer de edición se actualiza con el registro almacenado, reemplazando el registro nuevo o editado en curso. Este comportamiento proporciona una manera de anular un valor AddNew o Edit y comenzar uno nuevo: si determina que el registro en curso es defectuoso, simplemente llame a Edit o AddNew otra vez.

Eliminación de un registro

La eliminación de un registro de un conjunto de registros implica desplazarse hasta el registro y llamar a la función miembro Delete del conjunto de registros. A diferencia de AddNew y Edit, Delete no requiere una llamada coincidente a Update.

Como condición previa para llamar a Delete, el conjunto de registros debe ser actualizable y estar en un registro. Las funciones miembro CanUpdate, IsBOF, IsEOF y IsDeleted permiten determinar estas condiciones.

Al llamar a Delete:

  • Si el controlador ODBC admite la función de API de ODBC ::SQLSetPos, MFC usa la función para eliminar el registro en el origen de datos. El uso ::SQLSetPos de suele ser más eficaz que el uso de SQL.

    O bien

  • Si ::SQLSetPos no se puede usar, MFC hace lo siguiente:

    1. No se realiza una copia de seguridad del registro actual en el búfer de edición como en AddNew y Edit.

    2. Delete construye una instrucción DELETE de SQL que quita el registro.

      El registro actual del búfer de edición no se almacena como en AddNew y Edit.

    3. Delete confirma la eliminación: ejecuta la instrucción DELETE. El registro se marca como eliminado en el origen de datos y, si el registro es una instantánea, en ODBC.

    4. Los valores del registro eliminado siguen estando en los miembros de datos de campo del conjunto de registros, pero los miembros de datos del campo se marcan como null y la función miembro IsDeleted del conjunto de registros devuelve un valor distinto de cero.

    Nota:

    Después de eliminar un registro, debe desplazarse a otro registro para rellenar el búfer de edición con los datos del nuevo registro. Es un error llamar a Delete de nuevo o llamar a Edit.

Para obtener información sobre las instrucciones SQL usadas en las operaciones de actualización, vea SQL.

Consulte también

Conjunto de registros (ODBC)
Conjunto de registros: Información adicional sobre las actualizaciones (ODBC)
Intercambio de campos de registros (RFX)