![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Конвертация DBF из DOS в ;Win [D7, dBase, FoxPro]
SCORPION ZP © (2003-06-19 13:14:00)Задача стоит перевести все базы dBASE из ОЕМ(DOS)в Win, сохранив все данные и структуру. Решаю на Delphi7.
Сейчас перекодировка полей Character реализована, а вот есть вопросы по Memo и Logical. Записи поля Logical в DOS видны, а вот в Database Desktop
только первая, а остальные пусты. При конвертации естественно получаю в
этом поле только первую запись, а остальные теряю. Поле Memo(*.DBT) я
не могу передавать в функцию конвертации как string. В этом случае нужна перекодировка всего файла DBT. Или нет?
------------------------------------------
function ConvertOemToAnsi(const S : string) : string;
{$IFNDEF WIN32}
var
Source, Dest : array[0..255] of Char;
{$ENDIF}
begin
{$IFDEF WIN32}
SetLength(Result, Length(S));
if Length(Result) > 0 then
OemToAnsi(PChar(S), PChar(Result));
{$ELSE}
if Length(Result) > 0 then
begin
OemToAnsi(StrPCopy(Source, S), Dest);
Result := StrPas(Dest);
end;
{$ENDIF}
end;
-------------------------
SCORPION ZP (2003-06-20 17:15:00) [21]sniknik
Загляни в ящик!
Anatoly Podgoretsky
> В Виндоус значения этого поля видны, а в конкретной программе
> еще и в том виде в каком нужно
Значения логических полей(подчеркиваю)не видныыыыыы(т.е. средствами Database Desktop и через DBGrid)!!! а в проге мне просто не счем работать, т.к. ... нет записей!
Anatoly Podgoretsky (2003-06-20 16:04:00) [22]SCORPION ZP © (20.06.03 15:40)
В Виндоус значения этого поля видны, а в конкретной программе еще и в том виде в каком нужно.
sniknik (2003-06-20 15:59:00) [23]sniknik
> При следуещем коде в Memo1 ничего нет. Проверь сам...
присылай таблицу, проверю. в моих все есть.
SCORPION ZP (2003-06-20 15:40:00) [24]Anatoly Podgoretsky
> Неприменима такая операция к логическим полям, у них два
> значения True/False
Хорошо кааааааааак работать с этим полем в Win, если его значения
не видны(!) -нет их(!). НО в DOS(!) все(!) записи есть!!!
sniknik
При следуещем коде в Memo1 ничего нет. Проверь сам...
var MS: TMemoryStream;
begin
MS := TMemoryStream.Create;
try
Table1.DatabaseName:="d:\1\";
Table1.TableName:= "d:\1\ORDER.DBF";
Table1.Open;
TBlobField(Table1.FieldByName("LIST_SMETA")).SaveToStream(MS);
MS.Position:= 0;
Memo1.Lines.LoadFromStream(MS);
Table1.Close;
finally
MS.Free;
end;
end;
Anatoly Podgoretsky (2003-06-20 15:26:00) [25]Неприменима такая операция к логическим полям, у них два значения True/False
SCORPION ZP (2003-06-20 15:04:00) [26]sniknik
Ладно попробую с потоком, если получится...
А вот fields Logical ....
sniknik (2003-06-20 14:42:00) [27]> Как будет в твоем примере, если сделать по циклу описанному выше?
никак, я в примере в DBT напрямую не лезу.
> Или дай пояснение своему.
считал(куданибудь, тот же Мемо1) -> сконвертировал -> записал.
можно метод потока переписать и конвертировать на передаче.
> НО!!!! В DOS (!) все записи для этого поля заполнены
> В DOS - F,T
> B Win - False,True
представление только, под запись и там и там 1байт.
SCORPION ZP (2003-06-20 14:03:00) [28]sniknik
1.Я понимаю, что мне нужно:
...
открыть DBT
прочесть первую строку
----------ЦИКЛ---------
перекодировать
перезаписать
прочесть следующую
----------END----------
А как у тебя с потоком(?) пример. Как будет
в твоем примере, если сделать по циклу описанному выше?
Или дай пояснение своему.
2. //а с логическими по моему ничего делать не надо.
Я считываю каждое поле и в поле прохожу по записям. Дохожу
до логического, а в нем (например) первая запись есть,
а остальные пусты. Соответственно я получаю то же в результате.
НО!!!! В DOS (!) все записи для этого поля заполнены
В DOS - F,T
B Win - False,True
....
sniknik (2003-06-20 13:19:00) [29]> что делать с полями Мемо и логическими???
в смысле проблема прочитать/записать после конвертации?
если да может помочь
читать в Mемо
var MS: TMemoryStream;
begin
MS := TMemoryStream.Create;
try
TBlobField(Table1.FieldByName("MemoFieldName")).SaveToStream(MS);
MS.Position:= 0;
Memo1.Lines.LoadFromStream(MS);
finally
MS.Free;
end;
end;
а с логическими по моему ничего делать не надо.
SCORPION ZP (2003-06-20 12:24:00) [30]Anatoly Podgoretsky
OemToChar я приводил как 2-й вариант и ещё не проверенный.
OemToAnsi на моей проге работает нормально, но только я
не знаю , что делать с полями Мемо и логическими???
Anatoly Podgoretsky (2003-06-20 11:35:00) [31]SetLength(Str, Table1.Fields[i].Size);
Src:=PChar(Table1.Fields[i].AsString);
OemToChar(Src,PChar(Str));
---------
Src:=Table1.Fields[i].AsString;
if Length(Src)>0 then OemToChar(PChar(Src),PChar(Src));
Ну и устранить прочие ошибки, но они не относятся к преобразованию
SCORPION ZP (2003-06-20 11:12:00) [32]sniknik
Хорошо ты можешь накатать как использовать OemToChar.
Типа
.
var
Str, Src: string;
i:integer;
begin
...
try
Table1.Open;
Table1.FieldDefs.Update;
while (i<>FieldDefs.Count) do //цикл по полям в таблице
begin
FindFirst;
if (Fields[i].DataType = ftString)then
begin
if not Table1.IsEmpty then while not Eof do
begin
SetLength(Str, Table1.Fields[i].Size);
Src:=PChar(Table1.Fields[i].AsString);
OemToChar(Src,PChar(Str));
Table1.Edit;
Table1.Fields[i].AsString:=Str;
Table1.Post;
Table1.Next;
end;
end;
i:=i+1; // на следующее поле i
end;
finally
SetLength(Str, 0);
Table1.Close;
end;
end;
-------------------------------------------
Но может я не так довожу... Поля стринг у меня и так конвертятся
Я еще не знаю как логическое(его записи не видны под Win) и как
проконвертить Memo - точнее файл DBT???
sniknik (2003-06-20 10:37:00) [33]SCORPION ZP © (20.06.03 10:21)
> Anatoly Podgoretsky
> У меня Win32. С полями Logical вообще проблем. Не видны Database Desktop и я через приложение невижу пусть даже в кодировке OEM.
The OemToAnsi function is obsolete.
For compatibility with 16-bit versionsof Windows, this function is implemented as a macro that calls the OemToCharfunction, which should be used for new Win32-based applications.
как сочетается с {$IFNDEF WIN32}? поправь код. должно работать.
SCORPION ZP (2003-06-20 10:21:00) [34]Anatoly Podgoretsky
У меня Win32. С полями Logical вообще проблем. Не видны Database Desktop и я через приложение невижу пусть даже в кодировке OEM.
kudatsky
1. Я вообще не загружаю базы( около 10 000 шт.) Я указываю каталог и прога конвертит все DBF, включая подкаталоги, точнее поля character(есть еще и поля D, L, N, M)- передаю их как строку в функцию конвертации. А вот поля <BLOB Memo> находятся
конечно в *.DBT.
2. Перекодировать файл DBT:
так что ли:
...
var F:TextFile; //Memo - строки текста
s:string;
begin
AssignFile(F,FileName);
Reset(F);
while Not(F) do
begin
Readln(F,s);
Writeln(ConvertOemToAnsi(s));
end;
CloseFile;
end;
kudatsky (2003-06-19 14:01:00) [35]По поводу Memo. Не проще ли так:
1. Выгрузить из Memo в файл
2. Перекодировать
3. Загрузить
Anatoly Podgoretsky (2003-06-19 13:22:00) [36]У тебя Win16