Trato de hacer es una actualización de una base de datos Oracle a partir de unos archivo .dbf

Hola no se si te acuerda, yo creo que no te cuento lo que trato de hacer es una actualización de una base de datos oracle a partir de unos archivo dbf, es terrible por que ejecuto y se cae no se donde no envía ni error al rutearlo después con F8 me arroga el error que te comente al ver la base de datos efectivamente hizo una actualización pero no de todo lo que debería te envío mi código para ver si esta bien definido los cursores y todo eso gracias
¿Cuándo se cae? Aveces en el primer dbf que estoy tirando para actualiza otras el segundo y otras en el tercero, nada obedece a un patrón, el cual pueda llevarme a una deducción de problema, el programa lo corro en mi equipo y la base de datos en un servidor aparte,
gracias Soledad
Private Sub Form_Load()
(DECLARACION DE VARIABLES)
On Error GoTo errore
With nidProgramData
.cbSize = Len(nidProgramData)
.hwnd = Me.hwnd
.uId = vbNull
.uFlags = NIF_ICON Or NIF_TIP Or NIF_MESSAGE
.uCallbackMessage = WM_MOUSEMOVE
.hIcon = Me.Icon
.szTip = "Traspasa Datos .DBF (Sistema Variables Criticas)" & vbNullChar
End With
STRConeLocal = "DSN=dsn;UID=usuario;PWD=passs"
Set cntObj = New ADODB.Connection
With cntObj
.CursorLocation = adUseServer
.IsolationLevel = adXactReadCommitted
.Mode = adModeShareDenyNone
.Open STRConeLocal
End With
j = 0
sw = False
cont = 0
Set RsOra = New ADODB.Recordset
' aca saco todos los archivos dbf que debo tomar para la actualizacion con su respectiva datos y los envio en un recordset
RsOra.Open "SELECT * FROM ARCH_DBF", cntObj
' manipulo fechas con el fin e evaluar la fecha de actualizacion
fechaSys = Format(Date, "dd/mm/yyyy")
App.LogEvent "" & App.EXEName & "fechaSys" & fechaSys, 4
fechaTope = DateAdd("d", "-1", Day(fechaSys) & "/" & Month(fechaSys) & "/" & Year(fechaSys))
App.LogEvent "" & App.EXEName & "fechaTope" & fechaTope, 4
fechaini = DateAdd("d", "-7", fechaTope)
App.LogEvent "" & App.EXEName & "fechaini" & fechaini, 4
' mientras encuentre registro que tengan dbf para actualizar la base de datos oracle hago...
Do While Not RsOra.EOF
Bdnom_Arch = RsOra("NOMBRE_ARCHIVO")
Bdruta = RsOra("RUTA")
NumV = RsOra("NUM_VARIABLES")
BuscaDirBdDbase$ = Dir(Bdruta$)
iFECu = Right(Trim(Bdnom_Arch), 2)
iCod_material = Left(Right(Trim(Bdnom_Arch), 5), 2)
ScodiPlan = Mid(Trim(Bdnom_Arch), 3)
If Len(ScodiPlan) > 8 Then
iCod_planta = Left(ScodiPlan, 2)
Else
iCod_planta = Left(ScodiPlan, 1)
End If
If iFECu = "08" Then
j = 1
End If
'verifico que la ruta a los dbf sea correcta
If BuscaDirBdDbase$ = "" Then
MsgBox "La siguente Ruta no Fue Encontrada." & Bdruta
End
Else
DirBdDbase$ = Bdruta$
Set BdDbase = OpenDatabase(DirBdDbase$, False, False, "dbase III")
Set TbDbasedbf = BdDbase.OpenTable(Bdnom_Arch)
' Redimenciono el arrglego que guardara datos de actualzacion
ReDim MatiCod_An(NumV)
If Not TbDbasedbf.EOF Then
For I = 1 To NumV
MatiCod_An(I) = TbDbasedbf.Fields(j + I).SourceField
Next I
On Error GoTo leer
TbDbasedbf.MoveNext
End If
ReDim MatiCod_Uni(NumV)
If Not TbDbasedbf.EOF Then
For I = 1 To NumV
MatiCod_Uni(I) = TbDbasedbf.Fields(j + I)
Next I
TbDbasedbf.MoveNext
End If
' ahora comienzo a enviar la actualizacion
Do While Not TbDbasedbf.EOF
If Not IsNull(TbDbasedbf("FECHA")) Then
fechaBd = FormatDateTime(TbDbasedbf("FECHA"), vbShortDate)
' si llos datos estan dentro de los rango de fecha
VAR = DateDiff("d", fechaBd, fechaini)
If DateDiff("d", fechaBd, fechaini) <= 0 Then
If iFECu = "08" Then
iTurno = TbDbasedbf.Fields(1)
j = 1
End If
For I = 1 To NumV
iCod_analisis = MatiCod_An(I)
iCod_unidad = Trim(MatiCod_Uni(I))
If Not IsNull(TbDbasedbf.Fields(j + 1)) And (InStr(TbDbasedbf.Fields(j + 1), "-") = 0) Then
iValor = TbDbasedbf.Fields(j + 1)
Else
iValor = 0
End If
'inserto en la tabla correspondiente
If iFECu = "08" Then
SQL = "insert into CCALIDAD.HRS_08( COD_PLANTA,COD_MATERIAL,COD_ANALISIS ,COD_UNIDAD,FECHA,TURNO,VALOR) values ('" & iCod_planta & "', '" & iCod_material & "','" & iCod_analisis & "','" & UCase(Trim(iCod_unidad)) & "', to_date('" & TbDbasedbf("FECHA") & "','" & " dd / mm / rrrr'),'" & iTurno & "'," & iValor & ")"
Else
SQL = "insert into CCALIDAD.HRS_" & iFECu & "( COD_PLANTA,COD_MATERIAL,COD_ANALISIS ,COD_UNIDAD,FECHA,VALOR) values ('" & iCod_planta & "', '" & iCod_material & "','" & iCod_analisis & "','" & UCase(Trim(iCod_unidad)) & "', to_date('" & TbDbasedbf("FECHA") & "','" & " dd / mm / rrrr')," & iValor & ")"
End If
On Error GoTo Errores
'con execute genero la insercion
cntObj.Execute (SQL)
Next I
End If
End If
'avansa en el dbf
TbDbasedbf.MoveNext
Loop ' fin loop que recorre el dbf
TbDbasedbf.Close ' sierro el objeto table que me conecta a los dbf
Set TbDbasedbf = Nothing ' lo limpuo
BdDbase.Close' sierro el obj data base
Set BdDbase = Nothing ' lo limpio
End If
RsOra.MoveNext ' me muevo en el recorsedt para buscar el nuevo nombre del otro dbf con se respectivos datos
Loop ' fin loop que recorre el recorsedt que contiene todos los dbf a actualizar
RsOra.Close ' lo sierra
Set RsOra = Nothing ' lo limpia
cntObj.Close' sierra la conexion
Set cntObj = Nothing' la limpia
errore:
App.LogEvent "" & App.EXEName & "Paso Linea" & wpaso & Err.Number & Err.Description, vbLogEventTypeError
Resume Next
leer:
Resume Next
Errores:
VAR = Err.Description
Resume Next
End Sub
Private Sub Form_Resize()
' Llamado a la API generalmente se pone el en evento resize
Shell_NotifyIconA NIM_ADD, nidProgramData
Me.Hide
End Sub

1 respuesta

Respuesta
1
Sole:
Perdón por no contestarte antes, he andado con algunas cosillas.
A ver... veamos tu dichoso dolor de cabeza.
Se me ocurre que debes cambiar el tipo de cursores. Te explico para que sirven:
Hay cuatro tipos de cursor del lado servidor:
ForwardOnly (o manguera de bombero): Es un cursor "sólo hacia adelante",
que realmente devuelve los registros uno a uno al proveedor de OLE DB. Es
extremadamente rápido, aunque tiene el problema (solventado parcialmente por
ADO) de que solamente admite una consulta activa por conexión, esto ADO lo
solventa creando una conexión temporal de forma transparente (aunque molesta mucho hacerlo en el contexto de una transacción). Es el
predeterminado.
Estáticos: Es similar al anterior, pero permite recuperación hacia
atrás. Los datos no muestran los cambios realizados por otros usuarios
mientras está abierto el cursor, ya que son almacenados temporalmente en la caché de la librería de cursores de ADO. Si se desean recuperar un número
determinado de filas hay que especificarlo en la propiedad CacheSize.
KeySet (conjunto de claves): Permite ver los cambios realizados por
otros usuarios, pero no los registros nuevos añadidos. Esto es así porque se
almacenan las claves de los registros en la caché de ADO. Cuando se navega
por los registros, ADO navega por las claves almacenadas, y el proveedor va a buscar los datos del registro a la base de datos, con lo cual se refrescan los datos de la caché.
Dinámicos: Basado en el cursor de conjunto de claves, es el mismo modelo con la diferencia de que cada vez que se solicita otro conjunto de datos, se vuelve a crear el conjunto de claves. De esta forma permite visualizar
incluso los registros añadidos por otros usuarios. Tiene el inconveniente de
ser el de peor rendimiento (normal, ¿no?).
Piensa que NO TODOS LOS PROVEEDORES ADMITEN ESTOS CURSORES, de modo que si
intentas abrir un cursor no soportado por tu motor de base de datos, no
fallará (No error), pero se abrirá un cursor del tipo más parecido al solicitado (esto a veces es un problema).
Bueno, todo esto con respecto al tipo de cursor. Mi recomendación es que uses un cursor dinámico.
Vamos ahora al tema del CursorLocation:
Sabes seguramente que esto define la ubicación que tengan el servicio de cursores que
utilices (propiedad «CursorLocation» del objeto «Connection» o
«Recordset»).
Si utilizas cursores del lado servidor (CursorLocation = adUseServer), con
el proveedor Microsoft.OLEDB.4.0, puedes utilizar el bloqueo «Pesimista»
(AdLockPessimistic), el cual te garantiza que sólo el usuario que está
modificando los datos tiene acceso al registro del Recordset abierto. Ningún
otro usuario puede acceder a los datos del registro mientras el Recordset se
encuentra abierto, lo que no quiere decir que no puedas abrir otro Recordset
utilizando el mismo u otro tipo de bloqueo.
Lo malo de este tipo de bloqueo, es que tienes que tener cuidado que el
usuario no se vaya a desayunar mientras actualiza un registro, porque como
se deje abierto durante largo tiempo el Recordset, ningún otro usuario va a
poder acceder a dicho registro.
Si utilizas cursores del lado cliente (CursorLocation = adUseClient), con el
mismo proveedor de datos, de nada sirve que establezcas el valor
«AdLockPessimistic», porque una vez abierto el Recordset, el tipo de bloqueo
será de «Actualizaciones optimistas por lotes» (adLockBatchOptimistic), por
lo que tendrás que actualizar los datos con el método «UpdateBatch». Puedes
comprobar sus valor antes y después de abrir el objeto Recordset.
Si se utiliza las actualizaciones por lotes, todos las modificaciones
efectuadas en el Recordset desde que se abrió se almacenan en una caché,
hasta que llames al método «UpdateBatch». Pero también hay que tener cuidado
con este tipo de bloqueo, porque necesitaras analizar la colección de
errores del objeto «Connection», para saber si ha habido problemas en el momento de la actualización.
En tu caso es preferible que el CursorLocation lo hagas del lado del cliente para los rs (o la el objeto Conn).
Resumiendo, abres entonces la conexión como lo haces habitualmente con tu provider, defines el cursorlocation a adUseClient, y para la apertura del recordset lo haces con sus parámetros correspondientes según te convenga. Algo así (ojo, no lo he probado, así que puede haber algún error):
dim Conn as New ADODB.Connection
dim RS as New ADODB.Recordset
dim SQL as String
cs = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:\midb.mdb;Persist Security Info=False"
Conn.Open cs
RS.CursorLocation = adUseClient
SQL = "Select * from tabla"
RS. Open SQL, Conn, adOpenDynamic, adLockOptimistic
Atenta a esta ultima línea.
Bueno, espero haberte acercado algo a la solución. Cualquier cosa, me lo comentas y con gusto te responderé. (Tengo un mail, por si quieres hacerlo más directamente: [email protected] - estoy en madrid, digo, para que tengas en cuenta la hora ya que estoy desde las 9 hasta las 20 hs de aquí todos los días)
Gracias eres genial, muy buena onda, no se si me funcione ahora con lo cambio pero igual muchas gracias
Sole, ciérrame las preguntas, pues me quedan abiertas y pendientes...

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas