Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > Базы данных
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 25.09.2009, 04:33
Gribok Gribok вне форума
Новичок
 
Регистрация: 25.09.2009
Сообщения: 53
Репутация: 4
По умолчанию Ошибка при выброски в Excel

Доброго времени суток!
у меня возникла проблема

вот код

Код:
procedure TForm1.Button2Click(Sender: TObject); 
var 
XL, XArr: Variant; 
i:Integer; 
j:Integer; 
begin 
XArr:=VarArrayCreate([1,ADOTable1.FieldCount],varVariant); 
XL:=CreateOLEObject('Excel.Application'); // Nicaaiea OLE iauaeoa 
XL.WorkBooks.add; 
XL.visible:=False; 
j := 1; 
//выгрузка 1го выделеного 
if RadioButton1.Checked then 
begin 
For i:=0 to ADOTable1.FieldCount-1 do 
XArr[i+1] := ADOTable1.Fields.Value; 
XL.Range['A'+IntToStr(j), 
CHR(64+ADOTable1.FieldCount)+IntToStr(j)].Value := XArr; 
end else 
//Выгрузка всей БД 
Begin 
while not ADOTable1.Eof do 
begin 
i:=1; 
while i<=ADOTable1.FieldCount do 
begin 
ADOTable1.First; 
XArr := ADOTable1.Fields[i-1].Value; 
i:= i+1; 
XL.Selection.Font.Name:='Arial cur'; 
XL.Selection.Font.Size:=10; 
XL.selection.Columns.AutoFit; 
XL.Range['A1','A1'].select; 
end; 
end; 
end; 
XL.visible:=True; 
end; 
end. 

Значит когда RadioButton1 включин выгружается только выделеная строка таблици Это работает нормально все выгружается
а когда выделение RadioButton1 снимаю то виснет и чекрез некоторое время дает ошибку
ЛЮди пожалуйсто подскажите где код криво написано!!!
БУду оченьблагодарин!
Ответить с цитированием
  #2  
Старый 25.09.2009, 07:45
roamer roamer вне форума
Активный
 
Регистрация: 15.04.2009
Сообщения: 369
Репутация: 93
По умолчанию

1.А разве во втором случае (not RadioButton1.Checked) Вы не должны обращать к ЭЛЕМЕНТАМ массива ?
Вот здесь :
XArr := ADOTable1.Fields[i-1].Value;

2. У Вас "вроде, как" получается "вечный цикл" ...
Код:
while not ADOTable1.Eof do 
begin 
  ...
  while i<=ADOTable1.FieldCount do 
  begin 
    ADOTable1.First;   <=  вот здесь ...
    ...
  end;
end;

Не зависимо от функционала должно быть примерно так :
Код:
ADOTable1.First;
while not ADOTable1.Eof do 
begin 
  ...
  for i:=0 to (ADOTable1.FieldCount-1) do 
  begin 
    ...
  end;
  ADOTable1.Next;
end;
Ответить с цитированием
  #3  
Старый 25.09.2009, 09:05
Gribok Gribok вне форума
Новичок
 
Регистрация: 25.09.2009
Сообщения: 53
Репутация: 4
По умолчанию

дружище я не очень в БД
выложи пж исправленный код если тебе не тежело
Заранее спс
Ответить с цитированием
  #4  
Старый 25.09.2009, 10:40
Аватар для UnFeeLing
UnFeeLing UnFeeLing вне форума
Прохожий
 
Регистрация: 19.09.2009
Сообщения: 4
Репутация: 10
По умолчанию

Код:
procedure TForm1.Button2Click(Sender: TObject);
var
 XL, XArr: Variant;
 i: Integer;
 j: Integer;
begin
 {подрубите ComObj}
 XArr:=VarArrayCreate([1,TableDB.FieldCount],varVariant);
 XL:=CreateOLEObject('Excel.Application'); 
 XL.WorkBooks.add;
 XL.visible:=true;

 j := 1;
 TableDB.First;
 while not TableDB.Eof do
  begin
   i:=1;
   while i<=TableDB.FieldCount do
    begin
     XArr[i] := TableDB.Fields[i-1].Value;
     i := i+1;
    end;
   XL.Range['A'+IntToStr(j),
   CHR(64+TableDB.FieldCount)+IntToStr(j)].Value := XArr;
   TableDB.Next;
   j:=j+1;
  end;
 XL.Range['A1',CHR(64+TableDB.FieldCount)+IntToStr(j)].select;
 XL.cells.select;
 XL.Selection.Font.Name:='Arial cur';
 XL.Selection.Font.Size:=10;
 XL.selection.Columns.AutoFit;
 XL.Range['A1','A1'].select;
end;

токо не пойму как импортировать всю таблицу, здесь импортирует только записи
Ответить с цитированием
  #5  
Старый 25.09.2009, 11:02
Gribok Gribok вне форума
Новичок
 
Регистрация: 25.09.2009
Сообщения: 53
Репутация: 4
По умолчанию

да нет у меня все таблица выгружается
мне нада если отмечена RadioButton1 то выгружается вся таблица
а если нет то только выделеная строка и все!!!
Ответить с цитированием
  #6  
Старый 25.09.2009, 11:10
Аватар для Страдалецъ
Страдалецъ Страдалецъ вне форума
Гуру
 
Регистрация: 09.03.2009
Адрес: На курорте, из окна вижу теплое Баренцево море. Бррр.
Сообщения: 4,721
Репутация: 52347
По умолчанию

Сначала показалось, что у вас только пара ошибок, но при детальном изучении вашего кода понял, что его надо переписать полностью
Вот так должно работать:
Код:
procedure TForm1.Button2Click(Sender: TObject);
var
  XL: Variant;
  i: Integer;
begin
 XL := CreateOLEObject('Excel.Application');
 XL.WorkBooks.Add;
 XL.Visible := False;

 ADOTable1.First;
 while not ADOTable1.Eof
 do begin
    for i := 1 to ADOTable1.FieldCount
    do begin
       XL.Selection.Font.Name := 'Arial';
       XL.Selection.Font.Size := 10;
       XL.Selection.Columns.AutoFit;
       XL.Range[Chr(64+i)+IntToStr(ADOTable1.RecNo)] := ADOTable1.Fields[i-1].AsString;
       end;
    if RadioButton1.Checked then Break;
    ADOTable1.Next;
    end;
 XL.Visible := True;
end;

Экспорт через OLE довольно тормознутая вещь. Даже при относительно небольших объемах передаваемых данных у пользователя может возникнуть ощущение, что прога зависла. Поэтому не всегда полезно скрывать Эксел при экспорте.
__________________
Жизнь такова какова она есть и больше никакова.
Помогаю за спасибо.
Ответить с цитированием
  #7  
Старый 25.09.2009, 11:12
Аватар для Страдалецъ
Страдалецъ Страдалецъ вне форума
Гуру
 
Регистрация: 09.03.2009
Адрес: На курорте, из окна вижу теплое Баренцево море. Бррр.
Сообщения: 4,721
Репутация: 52347
По умолчанию

Цитата:
да нет у меня все таблица выгружается
мне нада если отмечена RadioButton1 то выгружается вся таблица
а если нет то только выделеная строка и все!!!
Вообще-то в первоначальном варианте происходило все наоборот.
Но с учетом новой концепции поправьте в моем примере строчку:
Код:
if not RadioButton1.Checked then Break;
__________________
Жизнь такова какова она есть и больше никакова.
Помогаю за спасибо.

Последний раз редактировалось Страдалецъ, 25.09.2009 в 11:15.
Ответить с цитированием
  #8  
Старый 25.09.2009, 13:52
Gribok Gribok вне форума
Новичок
 
Регистрация: 25.09.2009
Сообщения: 53
Репутация: 4
По умолчанию

Цитата:
Сообщение от Страдалецъ
Сначала показалось, что у вас только пара ошибок, но при детальном изучении вашего кода понял, что его надо переписать полностью
Вот так должно работать:
Код:
procedure TForm1.Button2Click(Sender: TObject);
var
  XL: Variant;
  i: Integer;
begin
 XL := CreateOLEObject('Excel.Application');
 XL.WorkBooks.Add;
 XL.Visible := False;

 ADOTable1.First;
 while not ADOTable1.Eof
 do begin
    for i := 1 to ADOTable1.FieldCount
    do begin
       XL.Selection.Font.Name := 'Arial';
       XL.Selection.Font.Size := 10;
       XL.Selection.Columns.AutoFit;
       XL.Range[Chr(64+i)+IntToStr(ADOTable1.RecNo)] := ADOTable1.Fields[i-1].AsString;
       end;
    if RadioButton1.Checked then Break;
    ADOTable1.Next;
    end;
 XL.Visible := True;
end;

Экспорт через OLE довольно тормознутая вещь. Даже при относительно небольших объемах передаваемых данных у пользователя может возникнуть ощущение, что прога зависла. Поэтому не всегда полезно скрывать Эксел при экспорте.


Спс огромное за код!!! все работает!! отлично!!!
Благодарю!!!
Ответить с цитированием
  #9  
Старый 25.09.2009, 13:52
Gribok Gribok вне форума
Новичок
 
Регистрация: 25.09.2009
Сообщения: 53
Репутация: 4
Радость

Цитата:
Сообщение от Страдалецъ
Сначала показалось, что у вас только пара ошибок, но при детальном изучении вашего кода понял, что его надо переписать полностью
Вот так должно работать:
Код:
procedure TForm1.Button2Click(Sender: TObject);
var
  XL: Variant;
  i: Integer;
begin
 XL := CreateOLEObject('Excel.Application');
 XL.WorkBooks.Add;
 XL.Visible := False;

 ADOTable1.First;
 while not ADOTable1.Eof
 do begin
    for i := 1 to ADOTable1.FieldCount
    do begin
       XL.Selection.Font.Name := 'Arial';
       XL.Selection.Font.Size := 10;
       XL.Selection.Columns.AutoFit;
       XL.Range[Chr(64+i)+IntToStr(ADOTable1.RecNo)] := ADOTable1.Fields[i-1].AsString;
       end;
    if RadioButton1.Checked then Break;
    ADOTable1.Next;
    end;
 XL.Visible := True;
end;

Экспорт через OLE довольно тормознутая вещь. Даже при относительно небольших объемах передаваемых данных у пользователя может возникнуть ощущение, что прога зависла. Поэтому не всегда полезно скрывать Эксел при экспорте.


Спс огромное за код!!! все работает!! отлично!!!
Благодарю!!!
Ответить с цитированием
  #10  
Старый 28.09.2009, 17:42
Gribok Gribok вне форума
Новичок
 
Регистрация: 25.09.2009
Сообщения: 53
Репутация: 4
По умолчанию

есть код выгружающий название столбцов из Grid
Код:
procedure TForm1.Button3Click(Sender: TObject); 
var 
XL, XArr: Variant; 
i:Integer; 
j:Integer; 
sline: string; 
mem:TMemo; 
col, row: Integer; 

//создаем обьект Excel 
begin 
XArr:=VarArrayCreate([1,ADOTable1.FieldCount],varVariant); 
XL:=CreateOLEObject('Excel.Application'); 
XL.WorkBooks.add; 
xl.WorkBooks[1].WorkSheets[1].name := 'Отчёт'; 
XL.visible:=False; 
j := 1; 

begin 
mem := TMemo.Create(Self); 
mem.Visible := false; 
mem.Parent := Form1; 
mem.Clear; 
sline := ''; 
sline :=(#9'БД студентов на '+DateToStr(date)); 
mem.Lines.Add(sline); 
sline := ''; 

end; 
for col := 0 to DBGrid1.FieldCount-1 do 
if DBGrid1.Columns[col].Visible then 
sline := sline + DBGrid1.Columns[col].Title.Caption + #9; 
mem.Lines.Add(sline); 
mem.Lines.Add(''); 
for row := 0 to DBGrid1.DataSource.DataSet.RecordCount-1 do 
mem.SelectAll; 
mem.CopyToClipboard; 
begin 
XL.Visible := true; 
xl.Workbooks[1].WorkSheets['Отчёт'].Paste; 
end; 
end; 

и есть код выгружающий выделеную строку из DBGrid 
procedure TForm1.Button2Click(Sender: TObject); 
var 
XL, XArr: Variant; 
i:Integer; 
j:Integer; 
begin 

XArr:=VarArrayCreate([1,ADOTable1.FieldCount],varVariant); 
XL:=CreateOLEObject('Excel.Application'); // Nicaaiea OLE iauaeoa 
XL.WorkBooks.add; 
XL.visible:=False; 
j := 1; 

For i:=0 to ADOTable1.FieldCount-1 do 
XArr[i+1] := ADOTable1.Fields.Value; 
XL.Range['A'+IntToStr(j), 
CHR(64+ADOTable1.FieldCount)+IntToStr(j)].Value := XArr; 
XL.Range['A1',CHR(64+ADOTable1.FieldCount)+IntToStr(j)].select; 
XL.Selection.Font.Name:='Arial cur'; 
XL.Selection.Font.Size:=10; 
XL.selection.Columns.AutoFit; 
XL.Range['A1','A1'].select; 
XL.visible:=True; 
end; 
end. 
Admin: Не забываем про теги!

а как зделать чтоб выгружало название полей с даными ввыделеной строки
ну как совместить эти 2 кода????
я просто не силен в БД
может кто знает!!!

Последний раз редактировалось Admin, 28.09.2009 в 17:51.
Ответить с цитированием
Ответ


Delphi Sources

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 02:09.


 

Сайт

Форум

FAQ

RSS лента

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2023

ВКонтакте   Facebook   Twitter