работа с Dbf

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

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

28 май 2007, 14:49

скажите что не так и где поправть .. Плиззз... :confused: :(

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

procedure ExportDBGrid(toExcel: Boolean);
var
  bm: TBookmark;
  col, row: Integer;
  sline: string;
  mem: TMemo;
  ExcelApp: Variant;
  MainForm: Tmemo;
begin
  Screen.Cursor := crHourglass;
  Form1.DBGrid1.DataSource.DataSet.DisableControls;
  bm := Form1.DBGrid1.DataSource.DataSet.GetBookmark;
  Form1.DBGrid1.DataSource.DataSet.First;

  // ñîçäà¸ì îáúåêò Excel
  if toExcel then
  begin
    ExcelApp := CreateOleObject('Excel.Application');
    ExcelApp.WorkBooks.Add(xlWBatWorkSheet);
    ExcelApp.WorkBooks[1].WorkSheets[1].name := 'Grid Data';
  end;

  // Ñïåðâà îòïðàâëÿåì äàííûå â memo
  // ðàáîòàåò áûñòðåå, ÷åì îòïðàâëÿòü èõ íàïðÿìóþ â Excel
//  mem := TMemo.Create(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);

  // ïîëó÷àåì äàííûå èç memo
  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;

  // êîïèðóåì äàííûå â clipboard
  mem.SelectAll;
  mem.CopyToClipboard;

  // åñëè íåîáõîäèìî, òî îòïðàâëÿåì èõ â Excel
  // åñëè íåò, òî îíè óæå â áóôåðå îáìåíà
  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.BtoExcelBClick(Sender: TObject);

begin
SaveDialog1.FileName := FName;
if SaveDialog1.Execute then
 begin
  FName := SaveDialog1.FileName;
  ExportDBGrid(ExcelApplication1.GetSaveAsFilename(FName));
 end;
end;
Это приводит к открытию excel в процессах и подвисагию программы....
Аватара пользователя
Игорь Акопян
Сообщения: 1419
Зарегистрирован: 13 окт 2004, 17:11
Откуда: СПБ
Контактная информация:

29 май 2007, 01:44

ещё одын совет: чтобы при пасте текста из буфера сохранить русские буквы надо делать копи в буфер при включенной русской раскладке ;)

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

29 май 2007, 07:07

Спасибо :) буду знать :)

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

29 май 2007, 07:18

не что то тут не то так как когда он в подвисшем состоянии, а я в этот момент открываю Excel он показывает мне окно SaveDialog с именем того файла что в программе открыт когда нажимаю сохранить в програме ошибка вылетает
Could not convert variant of type (OleStr) into type (Boolean)

что может быть не так ?
Аватара пользователя
Игорь Акопян
Сообщения: 1419
Зарегистрирован: 13 окт 2004, 17:11
Откуда: СПБ
Контактная информация:

29 май 2007, 14:32

мдя...
&quot писал(а):ExportDBGrid(ExcelApplication1.GetSaveAsFilename(FName));
фигня-с...
Убери ты вообще запрос имени. Откроешь Эксел - там жмакнешь "Сохранить"
Изображение
vav1lon
Сообщения: 21
Зарегистрирован: 25 май 2007, 08:20
Откуда: Екатеринбург
Контактная информация:

31 май 2007, 08:51

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

31 май 2007, 10:02

Вопрос такой:
после того как я загрузил все в DBGrid как мне сделать так чтобы проверить пустое поле или нет Null непрокатывает ;)

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

IF (Form1.DBGrid2.Columns.Items[0] = [B]что тут писать[/B] ) then Form1.Label4.Caption := 'Ошибок нет'
 else Form1.Label4.Caption := 'Ошибка в поле!';
Аватара пользователя
Игорь Акопян
Сообщения: 1419
Зарегистрирован: 13 окт 2004, 17:11
Откуда: СПБ
Контактная информация:

31 май 2007, 15:21

vav1lon, не в ту сторону копаешь
Проверять значение поля надо не через грид, а через Dataset...
типа

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

if Dataset.FieldByName('MyField').IsNull then 
проверит поле на Null у текущей записи.
Если тебе надо проверить есть ли null'ы в таблице вообще - проще выполнить отдельный SQL-запрос
Изображение
vav1lon
Сообщения: 21
Зарегистрирован: 25 май 2007, 08:20
Откуда: Екатеринбург
Контактная информация:

06 июн 2007, 07:29

спасибо ето помогло он проверяет но проверяет тока первую ячейку...
а как сделать чтобы весь столбец проверял?
Аватара пользователя
Игорь Акопян
Сообщения: 1419
Зарегистрирован: 13 окт 2004, 17:11
Откуда: СПБ
Контактная информация:

08 июн 2007, 00:03

vav1lon, огласи поточнее условие. Выдать все записи у которых в заданном столбце не Null?
Изображение
Ответить