powered by simpleCommunicator - 2.0.56     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Sybase ASA, ASE, IQ [игнор отключен] [закрыт для гостей] / dos2win, asa9
6 сообщений из 6, страница 1 из 1
dos2win, asa9
    #39137953
Юрий 444
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Проблема в Sybase ASA 9
Есть функция конвертации из досовской кодировки в виндовую.
В 12й ASA работает нормально, но в 9й проблема с буквой 'а'.

код буквы 'а' в виндовой кодировке соответствует неразрывному пробелу в 866й, но такое впечатление, что ASA9 просто не отличает обычный пробел от неразрывного.
уже пытался писать Char(160), вместо копирования пробела, но не помогло.


Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
ALTER FUNCTION "DBA"."f_DosToWin"( IN str char(255) )
RETURNS CHAR(255)
DETERMINISTIC
BEGIN
    DECLARE "res" CHAR(255);
    DECLARE alfaWin CHAR(255);
    DECLARE alfaDos CHAR(255);
    DECLARE i integer;
    DECLARE c1 CHAR(1);
    DECLARE ind integer;
    DECLARE flag tinyint;
    
    SET i = 1;
    SET alfaWin = 'абвгдеёжзийклмнопрстуфхцчшщьэъюяАБВГДЕЁЖЗИЙКЛМНОПРСТУФХЦЧШЩЬЭЪЮЯ№ыЫ';
    SET alfaDos = char(160) || 'ЎўЈ¤Ґс¦§Ё©Є«¬­®ЇабвгдежзиймнкопЂЃ‚ѓ„…р†‡€‰Љ‹ЊЌЋЏђ‘’“”•–—™њќљћџьл›';

    WHILE i <= LENGTH(str) LOOP        
        SET c1 = SUBSTRING(str, i, 1);
        SET flag = 0;
        SET ind = 1;

        WHILE flag = 0 LOOP
            SET ind = LOCATE(alfaDos, c1, ind + 1);        
            IF ind = 0 or (ind > 0 and ASCII(SUBSTR(alfaDos,ind,1)) = ASCII(c1)) THEN 
                SET flag = 1;
            END IF;
        END LOOP;

        IF ind > 0 THEN SET c1 = SUBSTR(alfaWin, ind, 1) END IF;
        SET res = res||c1;        
        SET i = i + 1;
        
    END LOOP;
  
    RETURN res;
END
...
Рейтинг: 0 / 0
dos2win, asa9
    #39138021
Sergey Orlov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Давно правда было, надо было решать ту же задачу, как решил не помню, но помню, что проблемы не возникло, но из-за того, что скорость обработки не устраивала, переписал ее на Делфи и оформил ее в виде dll, ну а дальше прописал эту фукцию как внешнюю в базе...
...
Рейтинг: 0 / 0
dos2win, asa9
    #39138140
Юрий 444
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Sergey Orlov,

ну я тоже решил "сбоку", после этой функции заменяю эти пробелы на букву 'а', типа

Код: sql
1.
2.
update table
set fio = replace(fio,char(160),'а')



А в ASA 12 и так все работает без проблем.
...
Рейтинг: 0 / 0
dos2win, asa9
    #39138366
Sergey Orlov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Юрий 444Sergey Orlov,
ну я тоже решил "сбоку", после этой функции заменяю эти пробелы на букву 'а', типа
Код: sql
1.
2.
update table
set fio = replace(fio,char(160),'а')


А в ASA 12 и так все работает без проблем.
Простите за нескромный вопрос, а вы зачем делаете перекодировку, если я правильно понимаю у вас данные где-то в cp866, которые вы закачиваете в базу ASA у которой кодировка в сp1251...
Мне тогда перекодировка была нужна, так как я закачивал в базу dbf-ные файлы, созданные в cp866. Но потом я нашел более легкое решение. Я начал их закачивать скриптом через isqlc. а там в строке коннекта указывал, что консоль имеет кодировку cp866, параметр charset=cp866, и при этом сам сервак уже перекодировал данные в 1251
...
Рейтинг: 0 / 0
dos2win, asa9
    #39139118
Юрий 444
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Sergey Orlov,

Это нужно сделать на стороне клиента, если бы данные втягивал я сам, то я бы вообще bdbfs'ом эти дбф-ки конвертнул бы, а далее вообще хоть прямо с централа затягивай
...
Рейтинг: 0 / 0
dos2win, asa9
    #39139239
Sergey Orlov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Юрий 444Sergey Orlov,
Это нужно сделать на стороне клиента, если бы данные втягивал я сам, то я бы вообще bdbfs'ом эти дбф-ки конвертнул бы, а далее вообще хоть прямо с централа затягивай
И у меня была такая же трудность, причем dbf-ки блокировались локальной прогой, поэтому сначала я исходил из-за того, что isqlc является portable утилитой и был сделан соответствующий командный файл, который был прописан в политиках локального компьютера, а потом я сделал по другому, я ставил клиенту локал енжин asa, который на старте системы забирал данные в свою локальную базу, затем переливал их в сетевую и завершал работу...
...
Рейтинг: 0 / 0
6 сообщений из 6, страница 1 из 1
Форумы / Sybase ASA, ASE, IQ [игнор отключен] [закрыт для гостей] / dos2win, asa9
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]