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

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

Конвертация DBF из DOS в ;Win [D7, dBase, FoxPro]


Страницы:   1 2

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


Страницы:   1 2

Наверх

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