RA ( Relacion de aplicaciones ) -Leer campo Memo
origen : cwausers
Problema: Se necesita poder leer un campo Memo ( en SQL text ) desde el código de una aplicación RA (“mascaras para tablas”), sin truncar su valor ( o sea convirtiendo a VARCHAR(8000) desde la consulta al servidor )
El tema es que cuando llega a ese campo da “odbc sql driver posicion del cursor no valida “.
La Sintaxis usada es:
Solución:
-
Usar una función MemoRead
Function MemoRead(ByRef Field)
Const Size = 32768
Dim lngOffset
Dim lngTotalSize
Dim varChunk
‘Lee campo memo y retorna script
lngTotalSize = Field.Size
Do While lngOffset < lngTotalSize
varChunk = Field.GetChunk(Size)
If IsNull(varChunk) Then Exit Do
MemoRead = MemoRead + CStr(varChunk)
lngOffset = lngOffset + Size
Loop
Exit Function
End Function
Abrir el Cursor como rdOpenKeyset
Set Rd = oWho.DataAccess.OpenResultset(CStr(sSql), 1)
El código Definitivo:
Function BLOCTA_USR_CBRMVH_GETCLI_On_Change_Pre(sErrorMessage)
Dim sSql, cn, Rd, lRow, sTipCli, sFchHas, iDias
If Not oWho.Saving Then
With oWho.Table.Rows(1)
.Fields("USR_CBRMVH_GETCLI").Value = "N"
sTipCli = Trim(Mid(.Fields("USR_CBRMVH_VALRUB").Value, 1, 3))
sFchHas = .Fields("USR_CBRMVH_FCHHAS").Value
iDias = .Fields("USR_CBRMVH_DIAS").Value
End With
lRow = 0
oWho.Table.Rows(1).Tables("USR_CBRMVI").Rows.Clear
oWho.Table.Rows(1).Tables("USR_CBRMVI").Rows.MaxRows = 500
sSql = "EXEC Usr_Sp_Bloqueos_RecuperoClientesABloquear '" & sTipCli & "'," & iDias & ", '" & sFchHas & "' "
' se abre recordset como rdOpenKeyset para poder recuperar el campo MEMO USR_MOTIVO
' http://support.microsoft.com/kb/170368/es
' https://groups.google.com/forum/?hl=es#!topic/cwausers/OKJ1y6Ji1sg
Set Rd = oWho.DataAccess.OpenResultset(CStr(sSql), 1)
Do While Not Rd.EOF
lRow = lRow + 1
With oWho.Table.Rows(1).Tables("USR_CBRMVI").Rows
With .Add(lRow)
.Fields("USR_CBRMVI_NROCTA").Value = Rd("USR_CBRMVI_NROCTA").Value
.Fields("USR_CBRMVI_NROCTA").Enabled = False
.Fields("USR_CBRMVI_NOMBRE").Value = Rd("USR_CBRMVI_NOMBRE").Value
.Fields("USR_CBRMVI_NOMBRE").Enabled = False
.Fields("USR_CBRMVI_BLOQUE").Enabled = True
.Fields("USR_CBRMVI_BLOQUE").Value = Rd("USR_CBRMVI_BLOQUE").Value
.Fields("USR_CBRMVI_BLOQUE").Enabled = False
.Fields("USR_CBRMVI_MOTIVO").Enabled = True
.Fields("USR_CBRMVI_MOTIVO").Value = MemoRead(Rd("USR_CBRMVI_MOTIVO"))
.Fields("USR_CBRMVI_MOTIVO").Enabled = False
.Fields("USR_CBRMVI_SDOEXC").Value = Rd("USR_CBRMVI_SDOEXC").Value
.Fields("USR_CBRMVI_SDOEXC").Enabled = False
.Fields("USR_CBRMVI_SDONOR").Value = Rd("USR_CBRMVI_SDONOR").Value
.Fields("USR_CBRMVI_SDONOR").Enabled = False
.Fields("USR_CBRMVI_SDOTOT").Value = Rd("USR_CBRMVI_SDOTOT").Value
.Fields("USR_CBRMVI_SDOTOT").Enabled = False
.Fields("USR_CBRMVI_LMCCRD").Value = Rd("USR_CBRMVI_LMCCRD").Value
.Fields("USR_CBRMVI_LMCCRD").Enabled = False
.Fields("USR_CBRMVI_SELECC").Value = "N"
.Fields("USR_CBRMVI_RESBLO").Value = Rd("USR_CBRMVI_BLOQUE").Value
.Fields("USR_CBRMVI_RESBLO").Enabled = False
.Fields("USR_CBRMVI_RESMOT").Value = Rd("USR_CBRMVI_MOTIVO").Value
.Fields("USR_CBRMVI_RESMOT").Enabled = False
End With
End With
Rd.MoveNext
Loop
Rd.Close
Set Rd = Nothing
End If
End Function
ACTUALIZACION
Se puede usar la función estandar del sistema de la siguiente manera
Set oGrwStrings = CreateObject(“GRWStrings.SqlUtilities”)
.Fields(“USR_CBRMVI_MOTIVO”).Value = oGrwStrings.GetValueFromMemo(Rd(“USR_CBRMVI_MOTIVO”))
Aún no hay comentarios.