Problemas al ejecutar un "objeto command" para inserción de datos en tablas

Tengo un problema al tratar de ejecutar un objeto command para insertar datos en una tablas desde otra. Las conexiones son buenas y probadas. NO tengo ni idea de como ya que no tengo mucho experiencia con VB.
Te mando el código de ejemplo.
Agradeceré una pronto ayuda.
Option Explicit
Dim Conecta As ADODB.Connection
Dim conecta1 As ADODB.Connection
Dim rs As New ADODB.Recordset
Dim rs1 As New ADODB.Recordset
Dim cmd As ADODB.Command
______________________________________________________
----------Esto no funciona ya que el objeto cmd que se trata de ejecutar solo tiene como conexión activa 1 tabla a la vez, como el sql usa 2 tablas en un query anidado. He ahí el problema. --------------------
Private Sub Command1_Click()
Dim sql As String
sql = "INSERT INTO METEO.PERSO(NOMBRE) SELECT NOMBRE FROM NOMINA"
cmd.CommandText = sql
cmd.Execute
sql = "commit"
cmd.CommandText = sql
cmd.Execute
MsgBox "Registros Insertados", vbExclamation, "Atención"
End Sub
Private Sub Form_Load()
Set Conecta = New ADODB.Connection
Set conecta1 = New ADODB.Connection
Set cmd = New ADODB.Command
Set rs = New ADODB.Recordset
Set rs1 = New ADODB.Recordset
Set cmd.ActiveConnection = Conecta
Conecta.ConnectionString = "DSN=METEO;UID=cbadilla;Password=aaaaaa"
Conecta.Open
conecta1.ConnectionString = "DSN=planilla;UID"
conecta1.Open
End Sub
----------Así funciona pero solo para un registro, y como son como 30 campos seria muy difícil meterlo, tengo que contar primero cuantos registros tiene la tabla nomina y hacer un ciclo, especificar los nombres de los campos, etc. Etc.
----------------------------------------------------------
Private Sub Command1_Click()
rs.Open "Select * From nomina", conecta1, adOpenStatic, adLockOptimistic
sql = "INSERT INTO METEO.PERSO(NOMBRE) VALUES(" + "'" + rs!NOMBRE + "'" + ")"
Text2.Text = sql
cmd.CommandText = sql
cmd.Execute
sql = "commit"
cmd.CommandText = sql
cmd.Execute
End Sub

1 Respuesta

Respuesta
1
A ver...
Create una conexion ADO de este estilo :
Me genero una clase para controlar la conexión y añado al menu de referencias las Microsoft Ado 2.5 Library.
La clase es de este estilo :
Option Explicit
Private Conexion As ADODB.Connection
Dim innerRS As ADODB.Recordset
Private Sub Class_Initialize()
On Error GoTo FalloConexion
Set Conexion = New ADODB.Connection
Conexion.ConnectionString = strMontarCad(LOGIN, PASS, "", SERVICIO)
Conexion.Open
Exit Sub
FalloConexion:
MsgBox Err.Description
End Sub
Private Function strMontarCad(ByVal PestrUsuario As String, ByVal PestrClave As String, ByVal PestrServidor As String, ByVal PestrBD As String) As String
Dim mCadenaConex As String
' Esta era la cadena para conectar a Oracle
'mCadenaConex = "Provider=MSDAORA.1;Password=" & PestrClave & ";User ID=" & PestrUsuario & ";Data Source=" & PestrBD & ";Persist Security Info=True"
' Otra cadena para conectar a Oracle, pero por OLEDB
'mCadenaConex = "Provider=OraOLEDB.Oracle.1;Password=" & PestrClave & ";User ID=" & PestrUsuario & ";Data Source= " & PestrBD & ";Persist Security Info=true"
' La que te interesa, para conectar con SQL SERVER
' O esta :
'mCadenaConex = "server=tonydev;database=northwind;uid=tony;pwd=hrmmm"' O esta
'mCadenaConex = "server=tonydev;database=northwind;trusted_connection=yes"
'Una cadena para conectar con ACESS
'mCadenaConex = "Provider =Microsoft.Jet.OLEDB.4.0;Data Source=" & App.Path & "\BaseDeDatos\Primarios.mdb;"
strMontarCad = mCadenaConex
End Function
Public Function ExecuteQuery(SQL As String) As ADODB.Recordset
Set innerRS = New ADODB.Recordset
innerRS.CacheSize = 30
InnerRS. Open SQL, Conexion. ConnectionString, adOpenForwardOnly, adLockBatchOptimistic, adAsyncFetch
Set ExecuteQuery = innerRS
End Function
Public Sub ExecuteSQL(SQL As String)
Conexion. BeginTrans
Conexion.Execute SQL
Conexion.CommitTrans
DoEvents
End Sub
Private Sub Class_Terminate()
If (Conexion.State <> adStateClosed) Then
Conexion.Close
End If
End Sub
Una vez creada la clase, digamos que la llamamos ClsConexion. Se usaria de este modo :
Te declaras un objeto de la clase :
Public Conexion As ClsConexion
Set Conexion = New ClsConexion
Una vez declarado el objeto, para generar una consulta solo debes hacer lo siguiente :
Dim SQL As String
Dim rsPrivado As Recordset
SQL = "Select PAGOS from TABLAPAGOS "
Set rsPrivado = Conexion.ExecuteQuery(SQL)
' A partir de esto, rsPrivado contiene los datos de la consulta. De este modo,
' rsPrivado(0).value sera el primer campo del valor resultado de la SQL Y en este caso el único...
Para el caso 2 :
SQL = "Select APELLIDOS from TABLAAPELLIDOS where APELLIDOS <> 'MEZA ALVA'
GROUP BY APELLIDOS"
Set rsPrivado = Conexion.ExecuteQuery(SQL)
En este caso, para recorrerte los campos de la consulta, tendrás que hacerlo de este modo :
' Desde el primer elemento, al último...
While Not rsPrivado.EOF
msgBox( rsPrivado(0))
' Escribir rs(Privado(0) es lo mismo que poner rsPrivado ("APELLIDOS")
' Bien, ahora pasariamos al siguiente elemento...
rsPrivado.MoveNext
' Y cerramos el bucle...
Wend
Si obteniendo los campos de ese modo y almacenas un array de IDs por registro, solo tienes que hacer los updates y los deletes por SQL
Con el objeto conexión y el método executeSQL.
Ahora si, antes de hacer la actualización o borrado del campo, puedes validar que este existe. Con la sentencia Select.
Así cargo yo un combo :
Dim rsPrivado As Recordset
Dim SQL As String
SQL = "Select " & CampoId & " , " & CampoDescripcion & _
" from " & strTabla
If Where <> "" Then
SQL = SQL & " WHERE " & Where
End If
SQL = SQL & " GROUP BY " & CampoId & " , " & CampoDescripcion
SQL = SQL & " ORDER BY " & CampoDescripcion
Set rsPrivado = Conexion.ExecuteQuery(SQL)
While Not rsPrivado.EOF
Me.Combo1.AddItem rsPrivado(1)
ReDim Preserve ArrayPosicionID(0 To Combo1.ListCount - 1)
ArrayPosicionID(UBound(ArrayPosicionID)) = rsPrivado(0)
rsPrivado.MoveNext
Wend
If Combo1.ListCount <> 0 Then
Combo1.ListIndex = 0
End If
Un saludo.
Ahora, para insertar todos los datos de una tabla a otra :
1 o haces esto
conexion.executeSQL("INSERT INTO METEO.PERSO(NOMBRE) SELECT NOMBRE FROM NOMINA")
2 .- o si no te sirve debido a la subconsulta haces esto :
dim rs as recordset.
dim sql as string
set rs= conexion.ExecuteQuery("SELECT NOMBRE FROM NOMINA")
while not rs.eof
sql = "INSERT INTO METEO.PERSO(NOMBRE) VALUES(" + "'" + rs!NOMBRE + "'" + ")"
rs.movenext
wend
Y solucionado.
Espero...
Bueno un saludo que me voy de vacaciones.

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas