Gracias Francisco, por ahora mis chinitos están conformes, pero anduve con este 
tema hace 4 años (verás mis consultas al foro) sin lograr resolverlo más que 
como te dije.

Si me surge lo pruebo!
Gracias!

Estela Lázaro
D&SIP

Desarrollo y Servicios Informáticos Profesionales

www.dsip.com.ar





________________________________
De: francisco prieto <[email protected]>
Para: GUFA List Member <[email protected]>
Enviado: domingo, 26 de diciembre, 2010 10:31:00
Asunto: [GUFA] Problemas con Collate para mostrar contenido de un campo 
(Solucionado)

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