работа с Dbf

Модераторы: Duncon, Naeel Maqsudov, Игорь Акопян, Хыиуду

vav1lon
Сообщения: 21
Зарегистрирован: 25 май 2007, 08:20
Откуда: Екатеринбург
Контактная информация:

25 май 2007, 08:23

Доброе время суток скажите как быть.
я загружаю в программу дбф от отображается в DBGrid как мне это сохранить в Excel ?
Как можно сделать поиск по записям ?
как мона сделать проверку на правельность заполнения строк в столбцах в загруженном DBF ?
Помогите :(
vav1lon
Сообщения: 21
Зарегистрирован: 25 май 2007, 08:20
Откуда: Екатеринбург
Контактная информация:

25 май 2007, 09:52

задача была такова
программа загружает Dbf фаил, читает его и вставляет в таблицу.
вотом надо проверить верно ли заполнены поля в Dbf (как ето сделать ?)
vav1lon
Сообщения: 21
Зарегистрирован: 25 май 2007, 08:20
Откуда: Екатеринбург
Контактная информация:

25 май 2007, 10:10

скажите как мона сделать запрос чтобы узнать в какой кодировке подан Dbf фаил
BBB
Сообщения: 1272
Зарегистрирован: 27 дек 2005, 13:37

25 май 2007, 10:43

Методом нежного взгляда на текст?
Т.е. берем текстовое поле, анализируем, какие там символы.
Кириллические буквенные символы OEM-кодировки с кодами, большими 127
располагаются в диапазоне [128..175, 224..241].
Для ANSII-кодирорвки: [168, 184, 192..255]
То есть, "непересекающийся" части этих множеств будут,
соответственно, [128..167, 169..175] и [184, 192..223, 242..255]
Исходя из этого, перебираем по порядку символы текста,
если какой-то из них оказывается в одном из этих множеств,
считаем, что текст имеет соотвествующую кодировку.
Аватара пользователя
Игорь Акопян
Сообщения: 1419
Зарегистрирован: 13 окт 2004, 17:11
Откуда: СПБ
Контактная информация:

25 май 2007, 10:59

поиск по зяписям: Table.Locate
загрузка в Excel: зачем? просто сохранить? - через OLE, создаём TExcelApplication (закладка Servers). И в цикле по всем записям/по всем полям выводим построчно.
Если версия < 2007 то количество строк на листе не более 65535

Можно открыть из Экселя dbf и сохранить в xls
Изображение
vav1lon
Сообщения: 21
Зарегистрирован: 25 май 2007, 08:20
Откуда: Екатеринбург
Контактная информация:

25 май 2007, 11:21

Игорь Акопян писал(а):загрузка в Excel: зачем? просто сохранить?
надо просто сохранить.
Просто нам надо чтобы я мог ету таблицу потом нормально обработать вручную в excel
vav1lon
Сообщения: 21
Зарегистрирован: 25 май 2007, 08:20
Откуда: Екатеринбург
Контактная информация:

25 май 2007, 12:49

procedure TForm1.Button7Click(Sender: TObject);
var
sh:String;
begin
sh := Form1.Edit1.Text;
Form1.Table1.Locate('YEAR',sh,[loPartialKey]);
end;

где я накосячил ?
как сделать чтобы показал что нашел ?
vav1lon
Сообщения: 21
Зарегистрирован: 25 май 2007, 08:20
Откуда: Екатеринбург
Контактная информация:

25 май 2007, 23:28

1.с поиском разобрался вроде пашет тока вот найденую запись как бы выделить неподскажите ?
2. все немогу с сохранением в Excel разобратся
vav1lon
Сообщения: 21
Зарегистрирован: 25 май 2007, 08:20
Откуда: Екатеринбург
Контактная информация:

26 май 2007, 10:26

Код: Выделить всё

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;
Аватара пользователя
Игорь Акопян
Сообщения: 1419
Зарегистрирован: 13 окт 2004, 17:11
Откуда: СПБ
Контактная информация:

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
Изображение
Ответить