Machetes Varios

apuntes varios erp cwa logic ( ahora SoftLand Logic ) – sql y veremos que otra cosa

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:

La sintaxis que uso es:
   sSql = “EXEC  Usr_Sp_Bloqueos_RecuperoClientesABloquear  ‘” & sTipCli & “‘,” & iDias & “, ‘” & sFchHas & “‘ “
                 Set Rd = oWho.DataAccess.OpenResultSet(CStr(sSql))
                 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 = Rd(“USR_CBRMVI_MOTIVO”).Value >> aqui da error
                             .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

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”))

 

octubre 19, 2011 - Posted by | 1. SotLand Logic, 1.13 Desarrollos, Cwa Logic

Aún no hay comentarios.

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s

A %d blogueros les gusta esto: