Autor Tema: Como sobrescribir en un recordset - Addnew  (Leído 5816 veces)

0 Usuarios y 1 Visitante están viendo este tema.

lucius

  • Gigabyte
  • ****
  • Mensajes: 263
  • Reputación: +6/-5
    • Ver Perfil
Como sobrescribir en un recordset - Addnew
« en: Octubre 01, 2012, 08:41:56 pm »
Como estan, estoy agregando a un recordset 10 items en un solo proceso con un bucle y quisiera saber que opinan de como lo estoy haciendo, muestro la info en un datagrid. Lo que hago es borrar todo el recordset en caso encuentre algo y si no hay nada ingresa los registros, ahi dejo el codigo

Código: [Seleccionar]
With rs
     If .EOF = False Then 'Si llega al final y encuetra algo
         .MoveFirst 'Se coloca al inicio y borra todo el recordset
         While Not .EOF
               .Delete
               .MoveNext
         Wend
     Else

     End If
     ' Aqui aplico un for y otras cosas que no bienen al caso para el ejemplo
     .AddNew
          .Fields(1) = Trim(Text1)
          .Fields(2) = Trim(Text2)
    .Update

End With

ADONAIRAFA

  • Gigabyte
  • ****
  • Mensajes: 291
  • Reputación: +37/-1
  • Que bien se siente al terminar un programa !!!
    • Ver Perfil
Re:Como sobrescribir en un recordset - Addnew
« Respuesta #1 en: Octubre 02, 2012, 12:14:41 am »
Saludos Lucius !!!

Creo que este tema, toca tratarlo en el Post de "Bases de Datos" (es posible que lo muevan hacia allá), pero no es como para que te "inquietes" !!!  ;D

Otra cosa, está bien como lo estás planteando... Ahora, ¿es necesario que te valgas del uso del recurso llamado 'Recordset'?

Gracias a un gran y buen amigo llamado Yacosta (saludos Yvan, si ves este post !!!), aprendí de él, cuando yo usaba el VB 6.0 (estoy migrando completamente a VB 2008), a trabajar directo con el Motor de la BD (en mi caso FirebirdSQL) quitando "el intermediario" como lo es el Recordset.

Bueno es solo mi humilde opinión. Saludos !!!


Manuel F. Borrego S. 8)
Barcelona, Venezuela.
Hay dos tipos de personas: Los que siguen un camino... y los que hacen camino al avanzar !!!

Albertomi

  • Gigabyte
  • ****
  • Mensajes: 281
  • Reputación: +153/-0
    • Ver Perfil
Re:Como sobrescribir en un recordset - Addnew
« Respuesta #2 en: Octubre 02, 2012, 02:05:37 am »
Estimado ADONAIRAFA
Me da curiosidad tu respuesta, por favor podrias brindar un poco de detalle a que te refieres con "trabajar directo con el Motor de la BD quitando el intermediario como lo es el Recordset." Gracias.
Saludos desde algun lugar de Lima-Perú
Saludos, desde algún lugar de Lima-Perú

YAcosta

  • Moderador Global
  • Exabyte
  • *****
  • Mensajes: 2853
  • Reputación: +160/-38
  • Daddy de Qüentas y QüeryFull
    • Ver Perfil
    • Personal
Re:Como sobrescribir en un recordset - Addnew
« Respuesta #3 en: Octubre 02, 2012, 03:45:22 am »
Para no hacer un análisis tipo Biblia: Lo dijo pero el mensaje era otro jeje

Lo que entiendo ha querido decir Manuel (ADONAIRAFA, y te mando también mis saludos) dada las conversas que tuvimos, es que lo mejor viene siendo hacer el delete, update o insert directamente en la BD usando sentencias SQL y no operar en el recordset para luego querer volcarlo a la BD, evitando así el uso del .Addnew, .Update, moverse en el RS, preguntando si es primero, ultimo... donde estoy... etc.
Naturalmente se sigue trabajando con el RecordSet y estoy seguro que el la tiene clara y que no se refiere a dejar de usarlo porque eso es imposible y que con la expresión "quitando el intermediario" el apunta a no operar en el RS para luego volcar a la BD cuando con sentencias SQL se opera directamente.
Cual brujo lee cerebros me atrevo a decir que fue eso lo que le movió a Manuel al hacer la recomendación a lucius, osea, evitar el "manipuleo/alteración" del RS.

Yendo al amigo lucius, lo que no queda claro es su intención o deseo al operar de esa forma, dado que si ya tiene el RS: (lease: With rs...) imagino entonces que ya hizo la correcta consulta SQL (lo cual es mas rápido que recorrer el RS) para poblar ese RS, ciertamente en muy raras ocasiones por X motivos nos llega a faltar algún maquillaje o retoque final a la data que se presentará, entonces le metes la mano al RS y luego lo pintas en alguna grilla o reporte, no me atreví a responderle en un inicio porque primero nunca he trabajado de esa forma y segundo no me queda claro las consecuencias de hacer un .Delete y luego un .Movenext y si ello originaria algún error, sino se origina bien, pero para mi es confuso, mejor esperar la aclaración de que es lo que busca lucius para poder recomendarle (si fuera el caso) y darle alguna alternativa a su proceder.

Saludos, desde algún lugar también de Lima-Perú

Por cierto, este hilo debió ir en Base de Datos, no tengo permisos para moverlo.

« última modificación: Octubre 02, 2012, 04:01:44 am por YAcosta »
Me encuentras en YAcosta.com

ADONAIRAFA

  • Gigabyte
  • ****
  • Mensajes: 291
  • Reputación: +37/-1
  • Que bien se siente al terminar un programa !!!
    • Ver Perfil
Re:Como sobrescribir en un recordset - Addnew
« Respuesta #4 en: Octubre 02, 2012, 09:17:40 am »
Yvan Hermano !!! Saludos !!! al igual que a todos mis colegas en este post !!! ;D

Mejor dicho (como lo ha expresado Yvan) imposible. A eso me refería, al uso de las sentencias SQL como lo son: INSERT INTO, UPDATE y DELETE, para esas operaciones fundamentales con una BD.

Algo con lo que me enfrento en el VB 2008 (tengo cierto tiempo que no trabajo con VB 6.0, pero creo que también es aplicable), es que no hay uso (o por lo menos yo no lo hago ::)) de un objeto 'Recordset'.

Me valgo de las sentencias fundamentales que te menciono arriba (a parte del consabido SELECT) y para las consultas a través del uso de adaptadores (DataAdapter: FbDataAdapter -en Firebird), DataSet's y DataTable's.

No se si me expliqué bien. Espero no haber dicho una "tarada", a veces no encuentro las palabras correctas, por eso, amigos como Yvan, seba123neo, raul338, ssccaann43 y otros más saben mucho más de este tema y dan las explicaciones al tiro (como debe ser :o ;D)

Saludos mis estimados !!!

Manuel F. Borrego S.  8)

PD: Albertomi, creo que ahí tienes la respuesta.
      Saludos !!!
« última modificación: Octubre 02, 2012, 09:19:52 am por ADONAIRAFA »
Hay dos tipos de personas: Los que siguen un camino... y los que hacen camino al avanzar !!!

seba123neo

  • Terabyte
  • *****
  • Mensajes: 763
  • Reputación: +88/-5
    • Ver Perfil
Re:Como sobrescribir en un recordset - Addnew
« Respuesta #5 en: Octubre 02, 2012, 09:46:56 am »
yo evitaria hacer eso de recorrerlo y borrar uno por uno los items del recordset, directamente que se cree de nuevo y listo.

Albertomi

  • Gigabyte
  • ****
  • Mensajes: 281
  • Reputación: +153/-0
    • Ver Perfil
Re:Como sobrescribir en un recordset - Addnew
« Respuesta #6 en: Octubre 02, 2012, 03:36:59 pm »
Estimados YAcosta, ADONAIRAFA
 
Ahora ha quedado todo claro, gracias.
 
 
Saludos, desde algún lugar de Lima-Perú
Saludos, desde algún lugar de Lima-Perú

Albertomi

  • Gigabyte
  • ****
  • Mensajes: 281
  • Reputación: +153/-0
    • Ver Perfil
Re:Como sobrescribir en un recordset - Addnew
« Respuesta #7 en: Octubre 02, 2012, 04:16:24 pm »
Estimado lucius
 

El siguiente es mi aporte para el caso que nos planteas, espero te pueda ser de utilidad.
 
A continuación un ejemplo de código de una función en VB para guardar los datos :
Private Function SaveData() As Boolean
  '// Esta función guarda el 100% de los datos que hemos ingresado en un formulario a nuestra base de datos
  '// para ello hace uso de transacciones.
  '// Retorna TRUE si se lograron grabar los datos, caso contrario retornara FALSE
 
  Dim cnnConnectionDB As ADODB.Connection
  Dim strQuerySQL As String
  Dim lngRecordID As Long
  Dim lngCounter As Long
 
  SaveData = False
 
  '// Borrado de registros, según sea el caso puedes borrar todos los registros o solo aquellos
  '// que conincidan con algún ID de los registros (lngRecordID)
  '// Si el motor de base de datos lo admite crea un Store Procedure (SP) que se encarga de hacer
  '// el DELETE de los registros y lo invocas vía comando SQL ANSI sobre la conexión abierta.
 
  lngRecordID = 142                                       '// Record ID, por ejemplo ID del usuario
  strQuerySQL = "EXECUTE DeleteRecords " & lngRecordID    '// Commando SQL ANSI para invocar al SP
  Set cnnConnectionDB = OpenConnectionDB     '// Se abre una conexión a la base de datos
  cnnConnectionDB.Execute strQuerySQL           '// Sobre la conexión abierta se invoca al commando SQL ANSI
 
 
  '// Insertas los 10 registros nuevos, haciendo uso de transacciones para evitar tener registros huerfanos.
  On Error GoTo err_Connection
 
  With cnnConnectionDB
    '// Se indica al motor de base de dfatos que estasmos iniciando una transaccion
    .BeginTrans
   
    '// Record ID, por ejemplo ID del usuario
    lngRecordID = 142
   
    '// Bucle para ingresar los 10 registros
    For lngCounter = 0 To 9
      strQuerySQL = "EXECUTE SaveRecords " & lngRecordID & ", '" & _
                                                                                 Text1(lngCounter).Text & "', '" & _
                                                                                 Text2(lngCounter).Text & "'"
      .Execute strQuerySQL
    Next
   
    '// Se indica al motor de base de dato a grabar a disco los 10 registros insertados
    .CommitTrans
  End With
 
  '// Fin
  SaveData = True
  Exit Function



'// Solo si se produce algun error con la conexión a la base de datos se cancela
'// el ingreso de todos los registros, así evitas tener registros huerfanos.
err_Connection:
  On Error GoTo 0
  g_cnnConnection.RollbackTrans
  MsgBox "Ha ocurrido un error, los datos no se han guardado.", vbCritical
End Function

Para complementar ejemplos de los códigos SQL a los que hago referencia dentro de la función VB:
CREATE PROCEDURE DeleteRecords
 @UserID int
AS
BEGIN
 SET NOCOUNT ON;
   
    -- Delete statements for procedure here   
 DELETE FROM MyTable
 WHERE (UserID = @UserID)
END


CREATE PROCEDURE SaveRecords
 @UserID int,
 @FullName nvarchar(512),
 @Address1 nvarchar(512)
AS
BEGIN
 SET NOCOUNT ON;
 
    -- Insert statements for procedure here   
 INSERT INTO MyTable (UserID,FullName,Address1)
 VALUES (@UserID,@FullName,@Address1)
END



Saludos, desde algún lugar de Lima-Perú
« última modificación: Octubre 02, 2012, 04:18:50 pm por Albertomi »
Saludos, desde algún lugar de Lima-Perú

ssccaann43

  • Terabyte
  • *****
  • Mensajes: 970
  • Reputación: +97/-58
    • Ver Perfil
    • Sistemas Nuñez, Consultores y Soporte, C.A.
Re:Como sobrescribir en un recordset - Addnew
« Respuesta #8 en: Octubre 03, 2012, 04:45:42 pm »
Estimado lucius
 

El siguiente es mi aporte para el caso que nos planteas, espero te pueda ser de utilidad.
 
A continuación un ejemplo de código de una función en VB para guardar los datos :
Private Function SaveData() As Boolean
  '// Esta función guarda el 100% de los datos que hemos ingresado en un formulario a nuestra base de datos
  '// para ello hace uso de transacciones.
  '// Retorna TRUE si se lograron grabar los datos, caso contrario retornara FALSE
 
  Dim cnnConnectionDB As ADODB.Connection
  Dim strQuerySQL As String
  Dim lngRecordID As Long
  Dim lngCounter As Long
 
  SaveData = False
 
  '// Borrado de registros, según sea el caso puedes borrar todos los registros o solo aquellos
  '// que conincidan con algún ID de los registros (lngRecordID)
  '// Si el motor de base de datos lo admite crea un Store Procedure (SP) que se encarga de hacer
  '// el DELETE de los registros y lo invocas vía comando SQL ANSI sobre la conexión abierta.
 
  lngRecordID = 142                                       '// Record ID, por ejemplo ID del usuario
  strQuerySQL = "EXECUTE DeleteRecords " & lngRecordID    '// Commando SQL ANSI para invocar al SP
  Set cnnConnectionDB = OpenConnectionDB     '// Se abre una conexión a la base de datos
  cnnConnectionDB.Execute strQuerySQL           '// Sobre la conexión abierta se invoca al commando SQL ANSI
 
 
  '// Insertas los 10 registros nuevos, haciendo uso de transacciones para evitar tener registros huerfanos.
  On Error GoTo err_Connection
 
  With cnnConnectionDB
    '// Se indica al motor de base de dfatos que estasmos iniciando una transaccion
    .BeginTrans
   
    '// Record ID, por ejemplo ID del usuario
    lngRecordID = 142
   
    '// Bucle para ingresar los 10 registros
    For lngCounter = 0 To 9
      strQuerySQL = "EXECUTE SaveRecords " & lngRecordID & ", '" & _
                                                                                 Text1(lngCounter).Text & "', '" & _
                                                                                 Text2(lngCounter).Text & "'"
      .Execute strQuerySQL
    Next
   
    '// Se indica al motor de base de dato a grabar a disco los 10 registros insertados
    .CommitTrans
  End With
 
  '// Fin
  SaveData = True
  Exit Function



'// Solo si se produce algun error con la conexión a la base de datos se cancela
'// el ingreso de todos los registros, así evitas tener registros huerfanos.
err_Connection:
  On Error GoTo 0
  g_cnnConnection.RollbackTrans
  MsgBox "Ha ocurrido un error, los datos no se han guardado.", vbCritical
End Function

Para complementar ejemplos de los códigos SQL a los que hago referencia dentro de la función VB:
CREATE PROCEDURE DeleteRecords
 @UserID int
AS
BEGIN
 SET NOCOUNT ON;
   
    -- Delete statements for procedure here   
 DELETE FROM MyTable
 WHERE (UserID = @UserID)
END


CREATE PROCEDURE SaveRecords
 @UserID int,
 @FullName nvarchar(512),
 @Address1 nvarchar(512)
AS
BEGIN
 SET NOCOUNT ON;
 
    -- Insert statements for procedure here   
 INSERT INTO MyTable (UserID,FullName,Address1)
 VALUES (@UserID,@FullName,@Address1)
END



Saludos, desde algún lugar de Lima-Perú

Depende de la Base de datos a usar, si esta usando SQL Server pues facilmente puede valerse de un Stored Procedure tal como tu lo planteas para realizar una inserción. Aunque debo acotar que el tema de los SP (Stored Procedures) son solo para evitar que el Source contenga las operaciones y que el mismo SQL Server se encargue de hacer las inserciones, modificaciones y eliminaciones....

En todo caso, para que recorrer y borrar? Simplemente aplicas un DELETE y luego un Insert con la data a insertar y ya....!
Miguel Núñez.

Albertomi

  • Gigabyte
  • ****
  • Mensajes: 281
  • Reputación: +153/-0
    • Ver Perfil
Re:Como sobrescribir en un recordset - Addnew
« Respuesta #9 en: Octubre 05, 2012, 04:38:45 am »
Estimado ssccaann43

Me gustaría ampliar un poco tu acotación al respecto de los Stored Procedure (SP), entonces veamos muy a groso modo que ocurre cuando ejecutamos una consulta desde nuestra aplicación VB contra SQL Server lo que SQL Server hace es parsear lo que se le ha enviado para verificar la sintaxis de las sentencias SQL, si la sintaxis esta bien el siguiente paso y solo si fuera necesario optimizara el código de la sentencia SQL para finalmente indicarle al optimizador de consultas de SQL Server que empieza a generar planes de ejecución para escoger de todos ellos el “mas barato”. Estos planes pueden ser planes en serie o planes paralelos. Dependiendo del coste de los planes de ejecución y del umbral cost threshold for parallelism (que por definición viene con el valor 5) el optimizador optará por un tipo de plan u otro. Este procedimiento se efectuará cada vez que se realice una consulta (en realidad SQL Server tiene unos bit’s de inteligencia y mantiene en cache el plan de ejecución por si en un periodo corto de tiempo se le hace la misma consulta, lo reutilizara). Un mecanismo que SQL Server y otros motores de base de datos tienen para optimizar este casos son los Stored Procedure (SP) los cuales compilan (analizan sintaxis, optimizan código, escogen plan de ejecución y otras cosa más) además de almacenar toda las sentencias SQL dentro del mismo motor de base de datos.
 
Con respecto a la interrogante que haces de para que recorrer y borra? Bueno ya lo había mencionado y es “según sea el caso”  puedes borrar todos los registros si estos registros no están mesclados con registros que tenga dependencias de registros en otras tablas (caso tablas cabecera/detalle) es estos casos como tu indicas solo bastaría con un DELETE pero en aquellos casos en donde los registros si tenga dependencia será donde debemos de usar un filtro y luego borrar.
 
 
Saludos, desde algún lugar de Lima-Perú
Saludos, desde algún lugar de Lima-Perú

ssccaann43

  • Terabyte
  • *****
  • Mensajes: 970
  • Reputación: +97/-58
    • Ver Perfil
    • Sistemas Nuñez, Consultores y Soporte, C.A.
Re:Como sobrescribir en un recordset - Addnew
« Respuesta #10 en: Octubre 05, 2012, 01:25:43 pm »
Comprendo perfectamente lo que expones y concuerdo contigo, solo que para ejecutar operaciones sencillas puede hacerlo desde el mismo VB, aún teniendo SQL Server. Ciertamente mucho más allá de las bondades que da el uso de los SP, se suma a ello la seguridad donde se evita que el Source contenga las operaciones y que el mismo SQL Server se encargue de hacer las inserciones, modificaciones y eliminaciones(Que es lo que quise dar a entender, puesto que muchos no lo saben)....

Digamos que las bondades son numerosas. Pero bueno, muy buena explicación. Saludos
Miguel Núñez.