Страница 1 из 3
работа с Dbf
Добавлено: 25 май 2007, 08:23
vav1lon
Доброе время суток скажите как быть.
я загружаю в программу дбф от отображается в DBGrid как мне это сохранить в Excel ?
Как можно сделать поиск по записям ?
как мона сделать проверку на правельность заполнения строк в столбцах в загруженном DBF ?
Помогите

Re: работа с Dbf
Добавлено: 25 май 2007, 09:52
vav1lon
задача была такова
программа загружает Dbf фаил, читает его и вставляет в таблицу.
вотом надо проверить верно ли заполнены поля в Dbf (как ето сделать ?)
Re: работа с Dbf
Добавлено: 25 май 2007, 10:10
vav1lon
скажите как мона сделать запрос чтобы узнать в какой кодировке подан Dbf фаил
Re: работа с Dbf
Добавлено: 25 май 2007, 10:43
BBB
Методом нежного взгляда на текст?
Т.е. берем текстовое поле, анализируем, какие там символы.
Кириллические буквенные символы OEM-кодировки с кодами, большими 127
располагаются в диапазоне [128..175, 224..241].
Для ANSII-кодирорвки: [168, 184, 192..255]
То есть, "непересекающийся" части этих множеств будут,
соответственно, [128..167, 169..175] и [184, 192..223, 242..255]
Исходя из этого, перебираем по порядку символы текста,
если какой-то из них оказывается в одном из этих множеств,
считаем, что текст имеет соотвествующую кодировку.
Re: работа с Dbf
Добавлено: 25 май 2007, 10:59
Игорь Акопян
поиск по зяписям: Table.Locate
загрузка в Excel: зачем? просто сохранить? - через OLE, создаём TExcelApplication (закладка Servers). И в цикле по всем записям/по всем полям выводим построчно.
Если версия < 2007 то количество строк на листе не более 65535
Можно открыть из Экселя dbf и сохранить в xls
Re: работа с Dbf
Добавлено: 25 май 2007, 11:21
vav1lon
Игорь Акопян писал(а):загрузка в Excel: зачем? просто сохранить?
надо просто сохранить.
Просто нам надо чтобы я мог ету таблицу потом нормально обработать вручную в excel
Re: работа с Dbf
Добавлено: 25 май 2007, 12:49
vav1lon
procedure TForm1.Button7Click(Sender: TObject);
var
sh:String;
begin
sh := Form1.Edit1.Text;
Form1.Table1.Locate('YEAR',sh,[loPartialKey]);
end;
где я накосячил ?
как сделать чтобы показал что нашел ?
Re: работа с Dbf
Добавлено: 25 май 2007, 23:28
vav1lon
1.с поиском разобрался вроде пашет тока вот найденую запись как бы выделить неподскажите ?
2. все немогу с сохранением в Excel разобратся
Re: работа с Dbf
Добавлено: 26 май 2007, 10:26
vav1lon
Код: Выделить всё
procedure ExportDBGrid(toExcel: Boolean);
var
bm: TBookmark;
col, row: Integer;
sline: string;
mem: TMemo;
ExcelApp: Variant;
begin
Screen.Cursor := crHourglass;
Form1.DBGrid1.DataSource.DataSet.DisableControls;
bm := Form1.DBGrid1.DataSource.DataSet.GetBookmark;
Form1.DBGrid1.DataSource.DataSet.First;
if toExcel then
begin
ExcelApp := CreateOleObject('Excel.Application');
ExcelApp.WorkBooks.Add(xlWBatWorkSheet);
ExcelApp.WorkBooks[1].WorkSheets[1].name := 'Grid Data';
end;
mem := TMemo.Create(Self); // Почему тут на Self прога ругается ?
mem.Visible := false;
mem.Parent := MainForm;
mem.Clear;
sline := '';
for col := 0 to Form1.DBGrid1.FieldCount-1 do
sline := sline + Form1.DBGrid1.Fields[col].DisplayLabel + #9;
mem.Lines.Add(sline);
for row := 0 to Form1.DBGrid1.DataSource.DataSet.RecordCount-1 do
begin
sline := '';
for col := 0 to Form1.DBGrid1.FieldCount-1 do
sline := sline + Form1.DBGrid1.Fields[col].AsString + #9;
mem.Lines.Add(sline);
Form1.DBGrid1.DataSource.DataSet.Next;
end;
mem.SelectAll;
mem.CopyToClipboard;
if toExcel then
begin
ExcelApp.Workbooks[1].WorkSheets['Grid Data'].Paste;
ExcelApp.Visible := true;
end;
FreeAndNil(ExcelApp);
Form1.DBGrid1.DataSource.DataSet.GotoBookmark(bm);
Form1.DBGrid1.DataSource.DataSet.FreeBookmark(bm);
Form1.DBGrid1.DataSource.DataSet.EnableControls;
Screen.Cursor := crDefault;
end;
//Допустим все что выше выполнилося
procedure TForm1.Button5Click(Sender: TObject);
begin
Тогда что писать тут для сохронения файла ?
end;
Re: работа с Dbf
Добавлено: 28 май 2007, 09:06
Игорь Акопян
1. Для вставки кода используйте тэг [noparse]
[/noparse]
2. Self отсутствует, т.к. ваша процедура не член класса, объявите её в секции, допустим public, вашей формы. При этом можно будет также опустить полное разыменование компонентов формы.
3. Проход по всем записям делается в цикле
Код: Выделить всё
while not MyTable.EOF do
begin
//
MyTable.Next;
end;
4. Для сохранения текущей позиции в таблице я бы использовал присваивание в строковую переменную MyTable.Bookmark; (восстановление в обратную сторону)
4.1. Т.к. это присваивание сопровождается парой операторов DisableControls и EnableControls, то обязательно заключите этот блок в try finally. Иными словами в блоке finally должны гарантированно выполниться: EnableControls, MyTable.Bookmark := sBM и Screen.Cursor := crDefault;
5. Если всё выполнится, надо будет просто вызвать процедуру ExportDBGrid