Un cliente me plante una necesidad quiere tener sincronizado el inventario de 2 bases de datos que lo que haga en una pueda importarlo a la otra.
En resumen lo que se quiere es una copia de la tabla Artículos en la otra, alguien dirá copio y pego de una base de datos a otra, pero el cliente no sabe de eso quiere que el sistema lo haga automáticamente.
Solución
Entonces se requiere abrir las 2 bases de datos y hacer una consulta de todos los registros e insertarlos en la otra base de datos. La tabla artículos tiene unos 23 campos mas o menos son muchos y pensé que debía haber una manera de poderlo hacer sin tener que escribir cada campo.
Al consultar me di cuenta que al usar Insert Into tiene la opción de que si las tablas son iguales puedes usar solo value siempre y cuando tengan los mismos campos y en el mismo orden, ejemplo:
Una consulta sql normal seria: Insert into Articulos (Campo1, Campo2, Campo3, Campo4, Campo5) values (Valor1, Valor2, Valor3, Valor4, Valor5) pero es posible omitir los primeros parentesis si las tablas son iguales quedando de la siguiente manera:
Insert into Articulos values (Valor1, Valor2, Valor3, Valor4, Valor5)
Pensé que bien ahora tengo que buscar la manera de poder recorrer los campos de un recordset sin tener que escribir los nombres de los campos, consulte y precisamente si se podía.
RecordInventario.Fields.Count
Esta línea me arroja el numero de campos de la consulta 😉 que bien ahora solo tengo que recorrer con for el resultado de la consulta.
Sql = "Select * from tblArticulos " Set RecordInventarioExt = Cx4_ConexionADO_Ext.Execute(Sql) 'recorro los registros Do While Not RecordInventarioExt.EOF For i = 0 To RecordInventarioExt.Fields.Count - 1 Next i RecordInventarioExt.MoveNext 'paso al siguiente registro Loop
Que hace ese código, pues primero hago la consulta a la base de datos origen desde donde voy a sacar los datos, hago el ciclo del recorrido para los registros y dentro recorro por cada registro los campos que contiene.
Con esto solo me resta armar la consulta SQL para hacer el insert a la base de datos destino
El código completo de importación
Sub Glo_ImportarInventarioExterno() Dim RecordInventarioExt As New ADODB.Recordset On Error GoTo error 'Borro todos lo articulos de la base de datos actual Sql = "Delete from tblArticulos " ConexionADO.Execute Sql 'conexión a la base de datos externa Cx4_ConexionADO_Ext.CursorLocation = adUseClient Cx4_ConexionADO_Ext.Open "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & Cx4_DireccionDb_Ext _ & ";Jet OLEDB:Database Password=4elmejorb4" 'consulto todo los articulos de la otra base de datos desde la que quiero importar Sql = "Select * from tblArticulos " Set RecordInventarioExt = Cx4_ConexionADO_Ext.Execute(Sql) 'recorro los registros Do While Not RecordInventarioExt.EOF 'armando la consulta Sql = "Insert into tblArticulos VALUES (" For i = 0 To RecordInventarioExt.Fields.Count - 1 'hago un ciclo con la cantidad de campos que me arrojo la consulta If i > 0 Then 'el primer campo no lleva coma al principio por eso la omito Sql = Sql & "," End If Select Case i Case 20 Sql = Sql & "0" Case 29 Sql = Sql & "0" Case Else 'extraigo el valor de cada campo y lo agreo a la consulta Sql = Sql & "'" & RecordInventarioExt.Fields.Item(i).Value & "'" End Select Next i Sql = Sql & ")" 'al terminar el ciclo cierro el parentesis de la consulta ConexionADO.Execute Sql 'ejecuto la consula en la base de datos actual RecordInventarioExt.MoveNext 'paso al siguiente registro Loop Cx4_ConexionADO_Ext.Close MsgBox "Inventario Importado con exito", vbInformation, "Importar Inventario" Exit Sub error: MsgBox Err.Description, vbCritical, Err.Number End Sub
Con RecordInventarioExt.Fields.Item(i).Value extraigo el valor de cada campo y lo agrego a la consulta.
El Select case lo uso por que hay campos que están nulos y no los puedo agregar con comillas entonces lo que hago es contar desde cero hasta el numero de la columna y asigno cero para que no genere error porque si intentas insertar un campo que es de tipo numero y le pasas comillas ” vacías saca error. En mi código si el campo es el 20 o 21 pongo cero sin comillas en caso contrario agrego el valor del campo entre comillas.
El resto del código esta comentado para que se entienda lo que hace.
Espero que les sea de mucha utilidad no olvides de seguirme en Facebook
Suscribete a mi canal de