Siguiendo por este sendero me encontré con un nuevo inconveniente
si quería cambiar el contenido del rtf y y luego actualizarlo en el motor.

Después de mucho investigar encontré que la conversión de binario a varchar
es implícita, es decir que al motor debía pasarle un binario, de esta
forma debía transformar mi rtf a binario, así que generé la
siguiente función:

Lparameters cTextRtf
Local lnPos1,lnPos2,lcExpr1,lcExpr2,lcFlag,lcCar
lnPos1=At('fs20',cTextRtf)
lcExpr1=Stuff(cTextRtf,1,lnPos1+3,"")
lnPos2=Rat('\',lcExpr1)
lcExpr2=Left(lcExpr1,lnPos2-1)
DO WHILE OCCURS('\lang',lcExpr2)>0
lnPos1=AT('\lang',lcExpr2)
lcE1=LEFT(lcExpr2,lnPos1-1)
 lcAux2=STUFF(lcExpr2,1,lnPos1-1,"")
lnPos2=AT(' ',lcAux2)
 lcE2=STUFF(lcAux2,1,lnPos2,"")
lcExpr2=lcE1+lcE2
ENDDO
lcTextoBin="0x"
Do While Len(lcExpr2)>0
lcFlag=Left(lcExpr2,1)
If lcFlag="\"
 lcCarHex=Right(Left(lcExpr2,4),2)
lcExpr2=Stuff(lcExpr2,1,4,"")
 Else
lcCarHex=SUBSTR(TRANSFORM(ASC(lcFlag),"@0"),9)
lcExpr2=Stuff(lcExpr2,1,1,"")
 Endif
lcTextoBin=lcTextoBin+lcCarHex
Enddo
Return lcTextoBin

a la cual llamo de la siguiente manera,

lcDescripBin=Thisform.ExtraeTextBin(Thisform.oleDescrip.TextRtf)
IF Thisform.EstoyAgregando
Thisform.ClaveActual=Thisform.txtCodBar.Value
 lcSql="INSERT INTO Productos
(CodBar,Descrip,Precio,Moneda,Descrip1,Garantia) "+;
" Values ("+;
 "'"+ALLTRIM(Thisform.ClaveActual)+"',"+;
"'"+ALLTRIM(ThisForm.txtDescrip.Value)+"',"+;
 ALLTRIM(STR(ThisForm.txtPrecio.Value,10,3))+","+;
"'"+ALLTRIM(ThisForm.txtMoneda.Value)+"',"+;
 lcDescripBin+","+;
ALLTRIM(STR(ThisForm.txtGarantia.Value))+;
")"
ELSE
lcSql="UPDATE Productos SET "+;
"CodBar='"+ALLTRIM(Thisform.txtCodBar.Value)+"',"+;
 "Descrip='"+ALLTRIM(ThisForm.txtDescrip.Value)+"',"+;
"Precio="+ALLTRIM(STR(ThisForm.txtPrecio.Value,10,3))+","+;
 "Moneda='"+ALLTRIM(ThisForm.txtMoneda.Value)+"',"+;
"Descrip1="+lcDescripBin+","+;
 "Garantia="+ALLTRIM(STR(ThisForm.txtGarantia.Value))+;
" Where "+;
 "CodBar='"+ALLTRIM(Thisform.ClaveActual)+"'"
ENDIF

A la hora de mostrar ese campo en un reporte, se resuelve mas fácil,
simplemente hay que utilizar un campo con tipo de letra SimSun y especificar
que el Alfabeto es CHINESE_GB2312

Ahora si espero no encontrarme con más incovenientes.

Pancho
Cordoba

El 23 de diciembre de 2010 21:47, francisco prieto
<[email protected]>escribió:

> Grupo,
>
> Como prometí para todo aquel que lo necesite lo solucioné de la siguiente
> manera.
>
> El problema original era que tengo un campo en la tabla de Sql Server que
> esta codificado en Chino y en los Windows en español, a pesar que el campo
> se muestra en un rtf no aparece con caracteres chinos. Siendo que tanto el
> Sql Server Management Studio, como el Word o el Wordpad si muestran los
> caracteres correctos.
>
> Una de las soluciones propuestas por Estela era habilitar los
> caracteres asiáticos en el Windows, pero esto traía aparejado el problema
> que se perdían las eñes y los acentos y eran reemplazados por caracteres
> chinos. teniendo luego problemas de compilación si la pc era de desarrollo.
>
> Bueno, observe que el Wordpad almacenaba la información en rtf, es decir de
> la misma forma que yo la quería mostrar en vfp9 con el richtextbox
> y descubrí también que el richtextbox tiene una propiedad donde se le puede
> asignar el rtf para poder mostrar lo mismo que mostraba el Wordpad, así que,
> lo único que debia hacer era traducir los caracteres chinos de Sql a formato
> rtf y asignárselo al control.
>
> Por otra parte este texto
>
> 收银机 电脑式centra 整套
>
> se codifica así en rft
>
> {\rtf1\ansi\ansicpg1252\deff0\deflang11274{\fonttbl{\f0\fmodern\fprq6\fcharset134
> SimSun;}{\f1\fswiss\fcharset0 Arial;}}
> \viewkind4\uc1\pard\lang2052\f0\fs20\'ca\'d5\'d2\'f8\'bb\'fa
> \'b5\'e7\'c4\'d4\'ca\'bdcentra \'d5\'fb\'cc\'d7\lang11274\f1\par
> }
>
> y los caracteres que importan están ubicados exactamente aquí
>
> \'ca\'d5\'d2\'f8\'bb\'fa \'b5\'e7\'c4\'d4\'ca\'bdcentra \'d5\'fb\'cc\'d7
>
> Según la documentación rtf de Microsoft para Office 2003 \'ca significa el
> caracter ascii ca es decir el caracter 202
>
> Luego lo único que debía hacer era encontrar alguna función de Sql que me
> pasara la cadena a binario y voila encontré esto
>
> CONVERT(binary(50), descrip1, 0)
>
> en realidad mi campo es descrip1 y le puse 50 porque tiene un ancho de 50
> caracteres. Esta expresión en el select me devuelve
>
>
> 0xCAD5D2F8BBFA20B5E7C4D4CABD63656E74726120D5FBCCD70000000000000000000000000000000000000000000000000000
>
> pero como cadena alfanumérica y si se fijan cada par de letras corresponden
> a la expresión del rtf salvo por la contrabarra y el apostrofe, así que para
> armar el rtf simplemente utilizo la siguiente función
>
> LPARAMETERS cTextoBin
> LOCAL lcParte1,lcParte2,lcParteCentral
> lcParte1="{\rtf1\ansi\ansicpg1252\deff0\deflang11274{\fonttbl{\f0\fmodern\fprq6\fcharset134
> SimSun;}{\f1\fswiss\fcharset0 Arial;}}\viewkind4\uc1\pard\lang2052\f0\fs20"
> lcParteCentral=""
> FOR lnCar=1 TO LEN(cTextoBin)
>
> lcParteCentral=lcParteCentral+"\'"+SUBSTR(TRANSFORM(ASC(SUBSTR(cTextoBin,lnCar,1)),"@0"),9)
> NEXT lnCar
> lcParte2="\lang11274\f1\par}"
> RETURN (lcParte1+lcParteCentral+lcParte2)
>
> y esta es la asignación
>
> lcSql="Select CONVERT(binary(50), descrip1, 0) descripbin from Productos
> WHERE codbar='"+cProductos.codbar+"'"
> loRsAuxProd = Thisform.ConexionActual.Execute(lcSql)
> Thisform.RsToCursor(loRsAuxProd,"cAuxProd")
> loRsAuxProd=.Null.
>
> ThisForm.oleDescrip.TextRtf=Thisform.ArmaRtf(cAuxProd.DescripBin)
>
> Valió la pena la investigación, gracias a todos y Feliz Navidad
>
> Pancho
> Córdoba
>
>
>
>

Responder a