Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Перенос данных с *.dbf в *.fdb [D7, FireBird1.5]


viktor ©   (2004-07-25 22:52:00) 

Здравствуйте Мастера! Никак не могу решить такой вопрос.
Для перноса даннх с  *.dbf в базу FireBird 1.5 использую следующий код:

Table1.First;
while not Table1.Eof do
 begin
  Label18.Caption:='Абонент - '+DosToWin(Table1FIO.Value);
  Label33.Caption:=IntToStr(Table1.RecNo);
  prbVdk.StepBy(1);
  InsertSubs(Table1);
  Table1.Next;
  Application.ProcessMessages;
end;

Table1 - файл таблицы *.dbf.
DosToWin - функция перекодировки(понятно из чего куда)
InsertSubs - функция переноса, имеет такой вид:

function TfSubsForm.InsertSubs(Tabl:TTable):boolean;
begin
try
 Result:=True;
 with  SP do
  begin
    StoredProcName:='SUBS_TEMP_I';
    Prepare;
    ParamByName('PARTNER_F').AsInteger:=AbonentSubs.PARTNER_F;
    ParamByName('FIO').AsString:=DosToWin(Tabl.Fields[0].AsString);
    ParamByName('ID_RAJ').AsString:=Tabl.Fields[1].AsString;
    ParamByName('CAT_V').AsString:=DosToWin(Tabl.Fields[4].AsString);
    ParamByName('VUL_COD').AsInteger:=StrToInt(Tabl.Fields[5].AsString);
    ParamByName('NAME_V').AsString:=DosToWin(Tabl.Fields[6].AsString);
    ParamByName('BLD').AsString:=DosToWin(Tabl.Fields[7].AsString);
    ParamByName('KORP').AsString:=DosToWin(Tabl.Fields[8].AsString);
    if  Tabl.Fields[9].AsString='0' then ParamByName('KVART').AsString:=''
    else ParamByName('KVART').AsString:=Tabl.Fields[9].AsString;
    if Tabl.Fields[10].AsString='' then ParamByName('NO_ABON').AsInteger:=0
     else if not CheckIndex(Tabl.Fields[10].AsString) then
            ParamByName('NO_ABON').AsInteger:=0
           else ParamByName('NO_ABON').AsInteger:=StrToInt(Tabl.Fields[10].AsString);
    ParamByName('NUMB').AsString:=Tabl.Fields[11].AsString;
    ParamByName('DAT1').AsDate:=Tabl.Fields[12].AsDateTime;
    ParamByName('DAT2').AsDate:=Tabl.Fields[13].AsDateTime;
    ParamByName('NM_PAY').AsCurrency:=Tabl.Fields[14].AsCurrency;
    ParamByName('P1').AsCurrency:=Tabl.Fields[15].AsCurrency;
    ParamByName('P2').AsCurrency:=Tabl.Fields[16].AsCurrency;
    ParamByName('P3').AsCurrency:=Tabl.Fields[17].AsCurrency;
    ParamByName('P4').AsCurrency:=Tabl.Fields[18].AsCurrency;
    ParamByName('P5').AsCurrency:=Tabl.Fields[19].AsCurrency;
    ParamByName('P6').AsCurrency:=Tabl.Fields[20].AsCurrency;
    ParamByName('P7').AsCurrency:=Tabl.Fields[21].AsCurrency;
    ParamByName('P8').AsCurrency:=Tabl.Fields[22].AsCurrency;
    ParamByName('SM1').AsCurrency:=Tabl.Fields[23].AsCurrency;
    ParamByName('SM2').AsCurrency:=Tabl.Fields[24].AsCurrency;
    ParamByName('SM3').AsCurrency:=Tabl.Fields[25].AsCurrency;
    ParamByName('SM4').AsCurrency:=Tabl.Fields[26].AsCurrency;
    ParamByName('SM5').AsCurrency:=Tabl.Fields[27].AsCurrency;
    ParamByName('SM6').AsCurrency:=Tabl.Fields[28].AsCurrency;
    ParamByName('SM7').AsCurrency:=Tabl.Fields[29].AsCurrency;
    ParamByName('SM8').AsCurrency:=Tabl.Fields[30].AsCurrency;
    ParamByName('SB1').AsCurrency:=Tabl.Fields[31].AsCurrency;
    ParamByName('SB2').AsCurrency:=Tabl.Fields[32].AsCurrency;
    ParamByName('SB3').AsCurrency:=Tabl.Fields[33].AsCurrency;
    ParamByName('SB4').AsCurrency:=Tabl.Fields[34].AsCurrency;
    ParamByName('SB5').AsCurrency:=Tabl.Fields[35].AsCurrency;
    ParamByName('SB6').AsCurrency:=Tabl.Fields[36].AsCurrency;
    ParamByName('SB7').AsCurrency:=Tabl.Fields[37].AsCurrency;
    ParamByName('SB8').AsCurrency:=Tabl.Fields[38].AsCurrency;
    ParamByName('OB1').AsCurrency:=Tabl.Fields[39].AsCurrency;
    ParamByName('OB2').AsCurrency:=Tabl.Fields[40].AsCurrency;
    ParamByName('OB3').AsCurrency:=Tabl.Fields[41].AsCurrency;
    ParamByName('OB4').AsCurrency:=Tabl.Fields[42].AsCurrency;
    ParamByName('OB5').AsCurrency:=Tabl.Fields[43].AsCurrency;
    ParamByName('OB6').AsCurrency:=Tabl.Fields[44].AsCurrency;
    ParamByName('OB7').AsCurrency:=Tabl.Fields[45].AsCurrency;
    ParamByName('OB8').AsCurrency:=Tabl.Fields[46].AsCurrency;
    ParamByName('SUMMA').AsCurrency:=Tabl.Fields[47].AsCurrency;
    ParamByName('NUMM').AsFloat:=Tabl.Fields[48].AsFloat;
    ParamByName('SUBS').AsCurrency:=Tabl.Fields[49].AsCurrency;
    ParamByName('KVT').AsFloat:=Tabl.Fields[50].AsFloat;
    ExecProc;
    close;
 end;
except
 Result:=False;
end;
end;

Так вот, на моем ПК перекодировка работает нормально, а на ПК
клиента выскакивают крякозябры. Подскажите пожалуста в чем дело?


viktor   (2004-07-26 22:27:00) [1]

sniknik ©   (26.07.04 09:54) [11]
Вы оказались правы. В ВДЕ DBASE настройка у меня ANSI, а у клиента
cp866. Как только поменял - все стало работать нормально. По поводу
DosToWin - у меня не только русские но и украинские символы встречаются, кроме того возможен вариант с символами до 127.
А так всем спасибо. Я просмотрел все, что касалось данной темы. Вопрос оказался достаточно популярный, но ответ нашелся только здесь. Еще раз всем спасибо!!!


DSKalugin   (2004-07-26 18:46:00) [2]

а DataPump-ом не хочешь воспользоваться?
А потом скриптом типа
insert into ...
select ... from ...

загнать в нужную таблицу


Fay   (2004-07-26 10:49:00) [3]

Про крайние меры - это я тормознул. 8)
В текстах, содержащих только "русские буквы", проверка выигрыша (и проигрыша) не даёт.


Fay   (2004-07-26 10:20:00) [4]

Я проверял. Ваш более быстрый способ медленнее, по крайней мере, в 1.5 раза. Это как считается - быстрее, что-ли?


Fay   (2004-07-26 10:04:00) [5]

А чтение, часом, не каждого?


sniknik   (2004-07-26 09:54:00) [6]

два вопроса
1 нафига эта функция если есть стандартные в системе?
2 как думаеш что будет на выходе если в функцию попадет уже прреобразованое значение? у тебя же безусловное преобразование. а вот начальное зависит от некоторых причин. см. настройки BDE.

> Т.е. Вы хотите сказать, что сравнение x > 127 займёт больше времени чем чтение из массива?
сравнение не одно а на каждый символ, конечно дольше и намного.


Fay   (2004-07-26 09:52:00) [7]

2Anatoly Podgoretsky ©   (26.07.04 09:43) [8]
Т.е. Вы хотите сказать, что сравнение x > 127 займёт больше времени чем чтение из массива?


ЮЮ   (2004-07-26 09:49:00) [8]

Убрать DosToWin и настроить БДЕ так, чтобы таблица на клиенте воспринималась правильно


Anatoly Podgoretsky   (2004-07-26 09:43:00) [9]

Fay ©   (26.07.04 02:29) [7]
Не лишняя, она для единства, упрощения и скорости, делать полтаблицы не рационально, выигрыш в 128 байт, частично съедается кодом по анализу и преобрахованию индекса, а скорость и понятность падают существенно.


Fay   (2004-07-26 02:29:00) [10]

2viktor   (25.07.04 23:01) [2]
Кака минимум половина значений массива лишняя. А именно первая. 8)


viktor   (2004-07-25 23:34:00) [11]

Хорошо, может быть я неправильно объяснил ситуацию.
У клиента 2 ПК: на одном сервер, на втором клиент. На сервере, тоже стоит клиентская программа -  все работает нормально, а вот на клиенте - бяка. Причем и в базу влетают кряки. Я работаю под ХР, сервер тоже под ХР, а клиент под 98?


Anatoly Podgoretsky   (2004-07-25 23:25:00) [12]

А у тебя другие настройки или другая локализация системы.


viktor   (2004-07-25 23:16:00) [13]

Да, но почему у меня работает?


Anatoly Podgoretsky   (2004-07-25 23:09:00) [14]

В таком случае, дело в таблицах, исходная не 866 или несоответствующая настрока движка. А может даже смешнее, неверно спроектированые формы вывода.


viktor   (2004-07-25 23:01:00) [15]

Хорошо вот она:

function  DosToWin(DString :String) :String;
const
AltTable : Array[0..255] of Char = (
 #0,  #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, #37, #38, #39,
 #40, #41, #42, #43, #44, #45, #46, #47,
 #48, #49, #50, #51, #52, #53, #54, #55,
 #56, #57, #58, #59, #60, #61, #62, #63,
 #64, #65, #66, #67, #68, #69, #70, #71,
 #72, #73, #74, #75, #76, #77, #78, #79,
 #80, #81, #82, #83, #84, #85, #86, #87,
 #88, #89, #90, #91, #92, #93, #94, #95,
 #96, 'a', 'b', 'c', 'd', 'e', 'f', 'g',
 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o',
 'p', 'q', 'r', 's', 't', 'u', 'v', 'w',
 'x', 'y', 'z',#123,#124,#125,#126,#127,
 'А', 'Б', 'В', 'Г', 'Д', 'Е', 'Ж', 'З',
 'И', 'Й', 'К', 'Л', 'М', 'Н', 'О', 'П',
 'Р', 'С', 'Т', 'У', 'Ф', 'Х', 'Ц', 'Ч',
 'Ш', 'Щ', 'Ъ', 'Ы', 'Ь', 'Э', 'Ю', 'Я',
 'а', 'б', 'в', 'г', 'д', 'е', 'ж', 'з',
 'и', 'й', 'к', 'л', 'м', 'н', 'о', 'п',
#176,#177,#178,#179,#180,#181,#182,#183,
#184,#185,#186,#187,#188,#189,#190,#191,
#192,#193,#194,#195,#196,#197,#198,#199,
#200,#201,#202,#203,#204,#205,#206,#207,
#208,#209,#210,#211,#212,#213,#214,#215,
#216,#217,#218,#219,#220,#221,#222,#223,
 'р', 'с', 'т', 'у', 'ф', 'х', 'ц', 'ч',
 'ш', 'щ', 'ъ', 'ы', 'ь', 'э', 'ю', 'я',
 'Ё', 'ё','Є','є','Ї','ї',#246,#247,
#248,#249,#250,#251,#252,#253,#254,#255);
var
  I : Integer;
begin
 Result := DString;
 for I := 1 to Length(DString) do Result[I] := AltTable[Byte(DString[I])];
end;


Anatoly Podgoretsky   (2004-07-25 22:55:00) [16]

Ошибка в DosToWin


Наверх

Титульная страница Поиск, карта сайта Написать письмо