ABM en un tabla sql server 2000 con vb

Tengo el siguiente problema al hacer mi ABM de una tabla clientes, estoy intentando programar en 3 capas (usuario, reglas de negocio, datos). Este código lo tenia funcionando con DAO y una base de access. Ahora lo he intentado pasar a ADO con SQL Server y lee la base de datos pero no Actualiza ni da de Alta
Public Sub GuardarDatos()
    If rs.BOF And rs.EOF Then
        rs.AddNew
    Else
      '  rs.edit '*****aqui no se que método usar para editar
    End If
    rs!NroCliente = ClienteEnUso.NroCliente
    rs!Nombre = ClienteEnUso.Nombre
    rs.Update
End Sub
Anteriormente he declarado estas variables en este modulo de clase, lee la tabla captura los datos en los textbox del formulario de la interfaz de usuario) pero cuando quiero actualizar no lo hace.
Private ClienteEnUso As TipoCliente
Private flgEsNuevo As Boolean
Private DB As New Connection
Private rs As New Recordset

4 Respuestas

Respuesta
1
Holaç
Para editar simplemente haces el .Update, sin necesidad e hacer un addnew en el recordset.
Tienes que tener en cuenta los parámetros del tipo de cursor en ADO, porque algunos no permiten grabar datos y por eso no graba los datos en la base de datos.
Respuesta
1
La verdad hace mucho que no veo programación, pero recuerdo algo que tal vez te pueda servir, en Else que tienes prueba poniendo rs. Update, que si no me equivoco es el código para actualizar, pero lo que te recomendaría en todo caso es que lo manejes esto con un Store Procedure y no directamente desde el aplicativo, ya que cualquier cambio involucraría modificación en tu código, lo que deberías hacer es manejar todo en variables y luego ejecutar un SP pasando parámetros con tus cambios tanto para nuevos registros así como para actualizaciones.
Espero te sirva de algo lo que te envío, cualquier cosa adicional sobre SQL me puedes consultar.
Gracias por tu respuesta, intentare hacer eso y te comentare como sigo.
Saludos
Javier
Ok,
No te olvides cerrar las preguntas que abriste.
Suerte.
Respuesta
1
¿Te da algún error cuando el código pasa por el if?
Esto no me suena muy bien if rs.bof and rs. Eof then
pero hacete un paso a paso haber como actúa cuando entra a ese if
saludos
leandro
No, solo me da error, cuando pasa por el rs.edit, ya que este método lo utilizaba con DAO.
Cuando lo comento, hace bien la lógica si es un registro nuevo o no, solo es me graba los cambios en la base de datos
El rs. Edit para que lo usas
¿Qué haría?
El rs.edit quedo del código cuando usaba el programa en dao y se usa para editar el recordset. En ado no existe ese método
Gracias por contestar
Sacalo, pense que seguias en ado y dao me confundio.
Y pone así, ¿por qué BOF y EOF al mismo tiempo?
Sácalo y pone así
if rs.eof then
rs.addnew
rs!NroCliente = ClienteEnUso.NroCliente
    rs!Nombre = ClienteEnUso.Nombre
   rs.Update
end if
Rs. Close
No, tampoco me actualiza la tabla no se porque sera...
¿Tu no tendrías un ejemplo simple de un ABM en ADO con SQL Server?
Gracias por las molestias
Saludos
Javier
El código anterior sirve para el alta,
el de modificar es lo mismo pero sacandoles el rs. Addnew
y el de baja es la consulta delete.
Probalo sacandole rs. Addnew
Hola, tampoco lo modifica sacándole el addnew, ni agregaba un registro con el addnew, si quieres podría enviarte el proyecto y la base sql.
Lo que me parece raro es que pueda leer los datos, pero no grabarlos.
Saludos
Empecemos por el principio.
Podes leer los datos perfecto, eso significa que la conexión esta hecha.
Ahora por cada botón seteas devuelta el recordset o es un recordset global ¿?
Para dar de alta un registro es así
Ejemplo
Set Rs = clase_datos.Abre("SELECT * FROM tabla")
rs.addnew
campo=ClienteEnUso.NroCliente (que es clienteenuso ¿una clase? llega el dato o es una cadena vacia)
rs.update
para modificar
Set Rs = clase_datos.Abre("SELECT * FROM tabla")
campo = clienteenuso.nrocliente
rs.update
para baja
la consulta con el delete
Set Rs = clase_datos.Abre("DELETE * FROM TABLA")
Nada más, ahora si esto no funciona, tienes que empezar a revisar como el recordset es seteado y donde. O usas paso a paso.
Si quieres mandame el pedazo de código donde das el alta, y las referencias de clase o seteo de recordset
Creo que lo tengo así.
¿A qué mail podría enviarte el modulo de clase zipeado?
No, es imposible que me ponga a ver código.
¿Estas programando en 3 capas en VB 6?, pasate a net que es orientado para hacer eso en vb6 las capas no existen, las tienes que armar vos.
En vb6, olvidemosnos de las capas, vamos a lo sencillo.
Para ver los datos, me podes pasar solo ese pedazo de código.
Porque si eso te funciona, lo demás tiene que andar.
Option Explicit
'Declaracion de la estructura de datos
'a usar dentro de la clase
Private Type TipoCliente
    NroCliente As String * 10
    Nombre As String * 50
    Domicilio As String * 50
    Obra As String * 50
    Localidad As String * 30
    Provincia As String * 20
    CodPost As String * 8
    Pais As String * 20
    Telefono As String * 20
    Fax As String * 20
    Celular As String * 15
    Contacto As String * 50
    Tel_Contacto As String * 20
    FecAlta As Date
    FecUltModif As Date
    CondPago As String * 10
    CUIT As String * 13
End Type
'Variables privadas de la clase
Private ClienteEnUso As TipoCliente
Private flgEsNuevo As Boolean
Private DB As New Connection
Private rs As New Recordset
Public Sub InicializarDatos()
    DB.Open "Provider=SQLOLEDB.1;" & _
            "Integrated Security=SSPI;" & _
            "Persist Security info=false;" & _
            "Initial Catalog=HOCH;Data Source=(local);" & _
            "Use Procedure for prepare=1; Auto Translate=true;" & _
            "packet size=4096;Workstation ID=(local);Use Encryption for Data=false;" & _
            "Tag with column collation when possible=false"
    DB.BeginTrans
End Sub
Public Sub CargarDatos()
    Dim strSQL As String
    Dim javier As Variant
    strSQL = "SELECT * FROM Clientes " & _
            "WHERE (NroCliente=" & _
            NroCliente & ")"
    rs.Open strSQL, _
            DB, adOpenKeyset, adLockOptimistic, adCmdText
    If Not (rs.BOF And rs.EOF) Then
        ClienteEnUso.NroCliente = rs!NroCliente '**
        ClienteEnUso.Nombre = rs!Nombre
        ClienteEnUso.Domicilio = rs!Domicilio
        ClienteEnUso.Obra = rs!Obra '***
        ClienteEnUso.Localidad = rs!Localidad
        ClienteEnUso.Provincia = rs!Provincia ' ****
        ClienteEnUso.CodPost = rs!CodPostal
        ClienteEnUso.Pais = rs!Pais  '***
        ClienteEnUso.Telefono = rs!Telefono
        ClienteEnUso.Fax = rs!Fax '***
        ClienteEnUso.Celular = rs!Celular '***
        ClienteEnUso.Contacto = rs!Contacto  '****
        ClienteEnUso.Tel_Contacto = rs!Tel_Contacto  '****
        ClienteEnUso.FecAlta = rs!FecAlta
        ClienteEnUso.FecUltModif = rs!FecUltModif
        ClienteEnUso.CondPago = rs!CondPago  '****
        ClienteEnUso.CUIT = rs!CUIT  '****
        flgEsNuevo = False
    Else
        flgEsNuevo = True
    End If
End Sub
Public Sub GuardarDatos()
    If rs.BOF And rs.EOF Then
        rs.AddNew
    Else
        rs!NroCliente = ClienteEnUso.NroCliente
        rs!Nombre = ClienteEnUso.Nombre
        rs!Domicilio = ClienteEnUso.Domicilio
        rs!Obra = ClienteEnUso.Obra
        rs!Localidad = ClienteEnUso.Localidad
        rs!CodPostal = ClienteEnUso.CodPost
        rs!Pais = ClienteEnUso.Pais
        rs!Telefono = ClienteEnUso.Telefono
        rs!Fax = ClienteEnUso.Fax
        rs!Celular = ClienteEnUso.Celular
        rs!Contacto = ClienteEnUso.Contacto
        rs!FecAlta = ClienteEnUso.FecAlta
        rs!FecUltModif = ClienteEnUso.FecUltModif
        rs!CondPago = ClienteEnUso.CondPago
        rs!CUIT = ClienteEnUso.CUIT
        rs.Update
    End If
End Sub
Public Sub Cerrar()
    rs.Close
End Sub
Public Sub Eliminar()
    rs.Delete
End Sub
Public Property Get EsNuevo() As Boolean
    EsNuevo = flgEsNuevo
End Property
Public Property Get NroCliente() As Variant
    NroCliente = ClienteEnUso.NroCliente
End Property
Public Property Let NroCliente(Valor As Variant)
    ClienteEnUso.NroCliente = Valor
End Property
'*****
Public Property Get Nombre() As Variant
    Nombre = Trim(ClienteEnUso.Nombre)
End Property
Public Property Let Nombre(Valor As Variant)
    ClienteEnUso.Nombre = Valor
End Property
Public Property Get Domicilio() As Variant
    Domicilio = Trim(ClienteEnUso.Domicilio)
End Property
Public Property Let Domicilio(Valor As Variant)
    ClienteEnUso.Domicilio = Valor
End Property
Public Property Get Obra() As Variant
    Obra = Trim(ClienteEnUso.Obra)
End Property
Public Property Let Obra(Valor As Variant)
    ClienteEnUso.Obra = Valor
End Property
Public Property Get Localidad() As Variant
    Localidad = Trim(ClienteEnUso.Localidad)
End Property
Public Property Let Localidad(Valor As Variant)
    ClienteEnUso.Localidad = Valor
End Property
Public Property Get Provincia() As Variant
    Provincia = Trim(ClienteEnUso.Provincia)
End Property
Public Property Let Provincia(Valor As Variant)
    ClienteEnUso.Provincia = Valor
End Property
Public Property Get CodPost() As Variant
    CodPost = Trim(ClienteEnUso.CodPost)
End Property
Public Property Let CodPost(Valor As Variant)
    ClienteEnUso.CodPost = Valor
End Property
Public Property Get Pais() As Variant
    Pais = Trim(ClienteEnUso.Pais)
End Property
Public Property Let Pais(Valor As Variant)
    ClienteEnUso.Pais = Valor
End Property
Public Property Get Telefono() As Variant
    Telefono = Trim(ClienteEnUso.Telefono)
End Property
Public Property Let Telefono(Valor As Variant)
    ClienteEnUso.Telefono = Valor
End Property
Public Property Get Fax() As Variant
    Fax = Trim(ClienteEnUso.Fax)
End Property
Public Property Let Fax(Valor As Variant)
    ClienteEnUso.Fax = Valor
End Property
Public Property Get Celular() As Variant
    Celular = Trim(ClienteEnUso.Celular)
End Property
Public Property Let Celular(Valor As Variant)
    ClienteEnUso.Celular = Valor
End Property
Public Property Get Contacto() As Variant
    Contacto = Trim(ClienteEnUso.Contacto)
End Property
Public Property Let Contacto(Valor As Variant)
    ClienteEnUso.Contacto = Valor
End Property
Public Property Get Tel_Contacto() As Variant
    Tel_Contacto = Trim(ClienteEnUso.Tel_Contacto)
End Property
Public Property Let Tel_Contacto(Valor As Variant)
    ClienteEnUso.Tel_Contacto = Valor
End Property
Public Property Get FecAlta() As Variant
    FecAlta = ClienteEnUso.FecAlta
End Property
Public Property Let FecAlta(Valor As Variant)
    If IsDate(Valor) Then
        ClienteEnUso.FecAlta = Valor
    End If
End Property
Public Property Get FecUltModif() As Variant
    FecUltModif = ClienteEnUso.FecUltModif
End Property
Public Property Let FecUltModif(Valor As Variant)
    If IsDate(Valor) Then
        ClienteEnUso.FecUltModif = Valor
    End If
End Property
Public Property Get CondPago() As Variant
    CondPago = Trim(ClienteEnUso.CondPago)
End Property
Public Property Let CondPago(Valor As Variant)
    ClienteEnUso.CondPago = Valor
End Property
Public Property Get CUIT() As Variant
    CUIT = Trim(ClienteEnUso.CUIT)
End Property
Public Property Let CUIT(Valor As Variant)
    ClienteEnUso.CUIT = Valor
End Property
Cuando cargas los datos haces
strSQL = "SELECT * FROM Clientes " & _
            "WHERE (NroCliente=" & _
            NroCliente & ")"
    rs.Open strSQL, _
            DB, adOpenKeyset, adLockOptimistic, adCmdText
    If Not (rs.BOF And rs.EOF) Then
Pero cuando das de alta no lo haces, quedaría así
Public Sub GuardarDatos()
strSQL = "SELECT * FROM Clientes "    
    rs.Open strSQL, _
            DB, adOpenKeyset, adLockOptimistic, adCmdText
        rs.AddNew
        rs!NroCliente = ClienteEnUso.NroCliente
        rs!Nombre = ClienteEnUso.Nombre
        rs!Domicilio = ClienteEnUso.Domicilio
        rs!Obra = ClienteEnUso.Obra
        rs!Localidad = ClienteEnUso.Localidad
        rs!CodPostal = ClienteEnUso.CodPost
        rs!Pais = ClienteEnUso.Pais
        rs!Telefono = ClienteEnUso.Telefono
        rs!Fax = ClienteEnUso.Fax
        rs!Celular = ClienteEnUso.Celular
        rs!Contacto = ClienteEnUso.Contacto
        rs!FecAlta = ClienteEnUso.FecAlta
        rs!FecUltModif = ClienteEnUso.FecUltModif
        rs!CondPago = ClienteEnUso.CondPago
        rs!CUIT = ClienteEnUso.CUIT
        rs.Update
    End If
End Sub
Esperemos que funcione.
Respuesta
1
Antes que nada quiero que te quede claro que cada desarrollador tiene su estilo, al ir programando te vas haciendo de "artimañas" al programar, entendido esto te voy a dar algunos consejos que a mi me sirven de maravilla.
1. ADO es lo mejor si lo manejas correctamente, pues solo cambias la cadena de conexión y trabaja con todas las versiones de SQL Server, MySQL, Oracle, etc, etc (obviamente necesitas el driver).
2. El uso del recordset como lo manejas en lo personal no lo recomiendo.
3. Consulta Recursividad y Polimorfismo...
4. Usa SQL, con SQL Server tienes más recursos a la mano
Referente a tu problema:
Porque no manejas Stored procedures para manejar tu información, te vas a ahorrar muchos quebrantos si empiezas a manejar "código parametrizable" o "código suave"
Ej. Rs.execute "EXEC spNewData 1,'juan morales', 3,4"
Ej. Db.execute "EXEC spNewData 1,'juan morales', 3,4"
Espero que haya sido de utilidad la respuesta que te doy

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas