Страница 1 из 1

Мемо поле

Добавлено: 30 сен 2013, 16:38
Mekhtiev
Не подскажите как мемо поле в галактике (характеристика ОС в ИК) т-sql -ем нормально вытащить в запросе?

Re: Мемо поле

Добавлено: 30 сен 2013, 16:48
RAJAH

Re: Мемо поле

Добавлено: 30 сен 2013, 17:05
Mekhtiev
Так иероглифы вместо русских букв вываливаются :-)

Re: Мемо поле

Добавлено: 30 сен 2013, 17:52
RAJAH
Кодировка в "Галактике" - 866.

Re: Мемо поле

Добавлено: 01 окт 2013, 00:21
edward_K
RAJAH писал(а):Кодировка в "Галактике" - 866.
ну тут вы правы на 30%.В MS SQL и в oracle может быть и 1251 или национальная. Для данного случая интересно иероглифами выводиться только мемополе или наименование ос тоже? Если да то либо попробуйте шрифт terminal либо покопайтесь в настройке вывода вашей СУБД

Re: Мемо поле

Добавлено: 01 окт 2013, 08:50
Mekhtiev
только мемо поле у меня иероглифами выводится.visual studio у меня не поддерживает терминал. :-(

Re: Мемо поле

Добавлено: 01 окт 2013, 11:24
edward_K
Тут тогда дело в том, что галка данные в обычных таблах может хранить в 1251, а при отображении, выводе в отчеты и при вводе мемо полей использует 866.
Вариант написать функцию в MSSQL для преобразования
Здесь для VB
http://www.gotdotnet.ru/forums/4/102961/
Вот простейшая для галки

Код: Выделить всё

const 
  ansistr='╕щЎєъхэу°∙чї·Ї√тряЁюыфц¤ ўёьшЄ№с■и╔╓╙╩┼═├╪┘╟╒┌╘█┬└╧╨╬╦─╞▌▀╫╤╠╚╥▄┴▐' ;
  oemstr ='ёйцукенгшщзхъфывапролджэячсмитьбюЁЙЦУКЕНГШЩЗХЪФЫВАПРОЛДЖЭЯЧСМИТЬБЮ' ;
end ;
Function AnSiOem(wstr:string) : string ;
var w : string ;
    k,i :longint ;
begin
 w:='' ;
 for(i:=1;i<=length(wstr);i:=i+1)
 begin
   k:=pos(substr(wstr,i,1),ansistr)
   if k>0 then
     w:=w+substr(oemstr,k,1) 
   else 
     w:=w+substr(wstr,i,1) ;
 end ;
 AnsiOem:=w ;
end ;


Function OemAnSi(wstr:string) : string ;
var w : string ;
    k,i :longint ;
begin
 w:='' ;
 for(i:=1;i<=length(wstr);i:=i+1)
 begin
   k:=pos(substr(wstr,i,1),oemstr)
   if k>0 then
     w:=w+substr(ansistr,k,1) 
   else 
     w:=w+substr(wstr,i,1) ;
 end ;
 OemAnsi:=w ;
end ;

Re: Мемо поле

Добавлено: 01 окт 2013, 12:30
Masygreen
Пользуйтесь на здоровье .. писал 100 лет назад, так что не оптимально, но рабоче ))

Код: Выделить всё

FUNCTION fnReadMemoTXT (@NrecInf binary(8))
RETURNS VARCHAR(8000) AS
BEGIN
DECLARE @SMEM varchar(8000)
DECLARE @VMEM varchar(8000)
DECLARE @position bigint
DECLARE @ncod bigint 
DECLARE @dcod bigint

SET @VMEM=(SELECT 
CAST(SUBSTRING(XX$Memo.m#Data, 4,8000) AS char(8000))
FROM XX$Memo
WHERE dbo.FnNrToChBin(XX$Memo.m#nrec)=dbo.FnNrToChBin(@NrecInf) AND m#code=1705)
SET @VMEM=RTRIM(@VMEM)

SET @position = 1
SET @SMEM=''

WHILE @position <= DATALENGTH(@VMEM)
BEGIN
SET @ncod=ASCII(SUBSTRING(@VMEM, @position, 1))
IF @ncod=240 SET @dcod=ASCII('Ё')
IF @ncod=241 SET @dcod=ASCII('ё')
IF @ncod<=127 SET @dcod=@ncod
IF @ncod>127 AND @ncod<160 SET @dcod=@ncod+64
IF @ncod>159 AND @ncod<177 SET @dcod=@ncod+64
IF @ncod>220 AND @ncod<240 SET @dcod=@ncod+16
SET @SMEM=@SMEM+char(@dcod)
SET @position = @position+1
END
RETURN @SMEM
END