Форум: "Базы";
Текущий архив: 2004.08.22;
Скачать: [xml.tar.bz2];
ВнизПеренос данных с *.dbf в *.fdb Найти похожие ветки
← →
viktor (2004-07-25 22:52) [0]Здравствуйте Мастера! Никак не могу решить такой вопрос.
Для перноса даннх с *.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;
Так вот, на моем ПК перекодировка работает нормально, а на ПК
клиента выскакивают крякозябры. Подскажите пожалуста в чем дело?
← →
Anatoly Podgoretsky © (2004-07-25 22:55) [1]Ошибка в DosToWin
← →
viktor (2004-07-25 23:01) [2]Хорошо вот она:
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 23:09) [3]В таком случае, дело в таблицах, исходная не 866 или несоответствующая настрока движка. А может даже смешнее, неверно спроектированые формы вывода.
← →
viktor (2004-07-25 23:16) [4]Да, но почему у меня работает?
← →
Anatoly Podgoretsky © (2004-07-25 23:25) [5]А у тебя другие настройки или другая локализация системы.
← →
viktor (2004-07-25 23:34) [6]Хорошо, может быть я неправильно объяснил ситуацию.
У клиента 2 ПК: на одном сервер, на втором клиент. На сервере, тоже стоит клиентская программа - все работает нормально, а вот на клиенте - бяка. Причем и в базу влетают кряки. Я работаю под ХР, сервер тоже под ХР, а клиент под 98?
← →
Fay © (2004-07-26 02:29) [7]2viktor (25.07.04 23:01) [2]
Кака минимум половина значений массива лишняя. А именно первая. 8)
← →
Anatoly Podgoretsky © (2004-07-26 09:43) [8]Fay © (26.07.04 02:29) [7]
Не лишняя, она для единства, упрощения и скорости, делать полтаблицы не рационально, выигрыш в 128 байт, частично съедается кодом по анализу и преобрахованию индекса, а скорость и понятность падают существенно.
← →
ЮЮ © (2004-07-26 09:49) [9]Убрать DosToWin и настроить БДЕ так, чтобы таблица на клиенте воспринималась правильно
← →
Fay © (2004-07-26 09:52) [10]2Anatoly Podgoretsky © (26.07.04 09:43) [8]
Т.е. Вы хотите сказать, что сравнение x > 127 займёт больше времени чем чтение из массива?
← →
sniknik © (2004-07-26 09:54) [11]два вопроса
1 нафига эта функция если есть стандартные в системе?
2 как думаеш что будет на выходе если в функцию попадет уже прреобразованое значение? у тебя же безусловное преобразование. а вот начальное зависит от некоторых причин. см. настройки BDE.
> Т.е. Вы хотите сказать, что сравнение x > 127 займёт больше времени чем чтение из массива?
сравнение не одно а на каждый символ, конечно дольше и намного.
← →
Fay © (2004-07-26 10:04) [12]А чтение, часом, не каждого?
← →
Fay © (2004-07-26 10:20) [13]Я проверял. Ваш более быстрый способ медленнее, по крайней мере, в 1.5 раза. Это как считается - быстрее, что-ли?
← →
Fay © (2004-07-26 10:49) [14]Про крайние меры - это я тормознул. 8)
В текстах, содержащих только "русские буквы", проверка выигрыша (и проигрыша) не даёт.
← →
DSKalugin © (2004-07-26 18:46) [15]а DataPump-ом не хочешь воспользоваться?
А потом скриптом типа
insert into ...
select ... from ...
загнать в нужную таблицу
← →
viktor (2004-07-26 22:27) [16]sniknik © (26.07.04 09:54) [11]
Вы оказались правы. В ВДЕ DBASE настройка у меня ANSI, а у клиента
cp866. Как только поменял - все стало работать нормально. По поводу
DosToWin - у меня не только русские но и украинские символы встречаются, кроме того возможен вариант с символами до 127.
А так всем спасибо. Я просмотрел все, что касалось данной темы. Вопрос оказался достаточно популярный, но ответ нашелся только здесь. Еще раз всем спасибо!!!
Страницы: 1 вся ветка
Форум: "Базы";
Текущий архив: 2004.08.22;
Скачать: [xml.tar.bz2];
Память: 0.5 MB
Время: 0.033 c