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