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

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

Перенос данных из удаленной базы в Excel


Smirov ©   (2003-03-07 07:59:00) 

Уважаемые мастера, подскажите пожалуйста, начинающему разобраться в проблеме:
если база данных локальная, то из Грида перебрасываю в Excel без проблем,
а когда Грид заполняется данными из удаленной базы *.gdb, то в Excel перебрасывать не хочет, пишет «Variant array index out of bounds” и посылает на строку:
ArrayData[Querys.RecNo, J]:=Querys.FieldByName(Querys.FieldDefs.Items[j-1].DisplayName).Value;


Smirov   (2003-03-11 13:09:00) [1]

Большое спасибо, уважаемые Мастера, за помощь. Заработало!


Соловьев   (2003-03-11 09:51:00) [2]


> RowCount:=Querys.RecordCount;

Это первое, я же писал что надо сделать сначала подсчет записей SQL запросом или сделать как говорит

> zacho © (07.03.03 09:57)

FetchAll.

И еще

> Querys.DisableConstraints;

Может все-таки DisableControls?


Smirov   (2003-03-11 09:21:00) [3]

Уважаемые мастера, большое спасибо за отзывчивость, но проблема пока осталась, сказывается уровень начинающего, привожу текст процедуры, подскажите, пожалуйста, чайнику, где собака порылась:
procedure TForm1.SendToExcel(ShFile: String; Querys: TQuery);
var
BeginCol, BeginRow, j :integer;
RowCount, ColCount :integer;
ExcelApp, Workbook, Range, Cell1, Cell2, ArrayData :Variant;
Begin
BeginCol:=1;
BeginRow:=9;
RowCount:=Querys.RecordCount;
ColCount:=Querys.FieldDefs.Count;
ExcelApp:= CreateOleObject("Excel.Application");
ExcelApp.Application.EnableEvents:=false;
Workbook:=ExcelApp.WorkBooks.Add("C:\Radio.xls");
ArrayData:=VarArrayCreate([1, RowCount, 1, ColCount], varVariant);
Querys.DisableConstraints;
Querys.First;
While Not Querys.Eof do
begin
for J:=1 to Querys.FieldDefs.Count do
begin
ArrayData[Querys.RecNo, J]:=Querys.Fields[j-1].Value;
End;
Querys.Next;
End;
Querys.EnableConstraints;
Cell1 :=WorkBook.WorkSheets[1].Cells[BeginRow, BeginCol];
Cell2 :=WorkBook.WorkSheets[1].Cells[BeginRow + RowCount -1, BeginCol + ColCount -1];
Range:= WorkBook.WorkSheets[1].Range[Cell1, Cell2];
Range.Value:=ArrayData;
ExcelApp.Visible:=true;
End;


zacho   (2003-03-07 10:23:00) [4]


> Соловьев © (07.03.03 10:11)

Нет, это для обработки данных в датасете. У тебя было написано "RecNo катит ", а я хотел сказать, что RecNo использовать не следует. А для подсчета записей Select count действительно лучше, или FetchAll и RecordCount это уж в зависимости от задачи


Соловьев   (2003-03-07 10:11:00) [5]


> DataSet.First;
> while not DataSet.Eof do
> begin
> ...
> DataSet.Next
> end; ?

Это для чего? Для подсчета записей?
А скорость при это вырастет? Я думаю лучше Select count...


zacho   (2003-03-07 09:57:00) [6]


> Соловьев © (07.03.03 09:28)

На самом деле следует делать FetchAll.
И еще раз повторю, в общем случае не следует использовать RecNo,
ну кто мешает пройтись по датасету циклом
DataSet.First;
while not DataSet.Eof do
begin
...
DataSet.Next
end;
?


Соловьев   (2003-03-07 09:28:00) [7]

Я тоже напоролся на эту проблему. Оказалось что то что ты видишь в гриде при локалном подключении(TTable)? то там весь набор данных и RecNo катит , но когда используется клиент-серверная БД, то данных те что в TQuery(TIBDataSet) , ровно столько сколько нужно для отображения в гриде. Перед закачкой в Excel делаю
Select Count(id) from TableForExcel
И все работает как надо.


Карелин Артем   (2003-03-07 08:55:00) [8]

>ArrayData[Querys.RecNo, J]:=Querys.FieldByName(Querys.FieldDefs.Items[j-1].DisplayName).Value;
А где тут грид?


zacho   (2003-03-07 08:21:00) [9]

Еще одно небольшое замечание: в гриде нет данных ! Данные есть в датасете. Почуствуй разницу :-)


zacho   (2003-03-07 08:10:00) [10]

Вообще-то в данном случае никакой разницы между локальным подключением и сетевым быть не должно. Так что потрассируй и посмотри, в каком случае Querys.RecNo или J выходит за границы массива.
Еще пара замечаний:
1. Не стоит использовать RecNo.
2. Вместо Querys.FieldByName(Querys.FieldDefs.Items[j-1].DisplayName).Valueлучше использовать Querys.Fields[j-1].Value(Hint: DisplayName вовсе не обязательно совпадает с FieldName)
3. Для более подробного ответа тебе стоит привести текст процедуры полностью


Наверх

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