![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Перенос данных с *.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