|
Вопрос # 5 275/ вопрос решён / |
|
Доброго времени суток, уважаемые эксперты!
У меня такой вопрос, к моей программе подключенна база данных Access в ней есть 5 таблиц с данными. Программа создает определенную отчетность и передает её в Excel, так вот как сделать что бы при выборе определенной таблицы из комбобокса данные которые содержатся в ней загружались в определенный диапозон ячеек в Excel, ну что бы у каждой таблицы был свой диапозон ячеек и данные из одной таблицы не могли записываться в диапозон другой таблицы????
 |
Вопрос задал: Анучин (статус: Посетитель)
Вопрос отправлен: 11 мая 2011, 00:06
Состояние вопроса: решён, ответов: 1.
|
Ответ #1. Отвечает эксперт: Мережников Андрей
Здравствуйте, Анучин!
если известно сколько строк отвести под каждую таблицу, то в чем проблема? Пусть m - максимальное число строк, отводимое под данные из одной таблицы, k - начальное смещение (под заголовок и т.п.), n - номер таблицы по порядку, i - номер записи по порядку из выбранной таблицы, тогда номер строки, куда помещаем данные определяется по формуле: k+(n-1)*m+i-1
 |
Ответ отправил: Мережников Андрей (статус: Абитуриент)
Время отправки: 11 мая 2011, 22:45
Оценка за ответ: 5
|
Мини-форум вопроса
Всего сообщений: 27; последнее сообщение — 18 мая 2011, 03:06; участников в обсуждении: 3.
Страницы: [1] [2] [Следующая »]
|
Мережников Андрей (статус: Абитуриент), 11 мая 2011, 06:01 [#1]:
Заранее известно сколько записей в каждой таблице?
|
|
corban (статус: 2-ой класс), 11 мая 2011, 07:58 [#2]:
Может проще заливать на отдельный лист книги?
|
|
Анучин (статус: Посетитель), 11 мая 2011, 14:19 [#4]:
corban: да на отдельный лист было бы проще, но нужно сделать что бы все отображалось на одном
|
|
Мережников Андрей (статус: Абитуриент), 11 мая 2011, 19:04 [#5]:
Цитата (Анучин):
нет количество записей может изменяться
Тогда как определить требуемый диапазон?
|
|
Анучин (статус: Посетитель), 11 мая 2011, 19:33 [#6]:
Мережников Андрей: ну максимальное количество записей в одной таблице от 15 до 20 не больше
|
|
Мережников Андрей (статус: Абитуриент), 11 мая 2011, 20:15 [#7]:
если известно сколько строк отвести под каждую таблицу, то в чем проблема? Пусть m - максимальное число строк, отводимое под данные из одной таблицы, k - начальное смещение (под заголовок и т.п.), n - номер таблицы по порядку, i - номер записи по порядку из выбранной таблицы, тогда номер строки, куда помещаем данные определяется по формуле: k+(n-1)*m+i-1
|
|
Анучин (статус: Посетитель), 11 мая 2011, 22:34 [#8]:
Мережников Андрей: хорошо с этим понятно... а подскажите тогда как реализовать следующее...
Существует 2 базы данных BD1 и BD2.
BD1-состоит из 5 таблиц( Table1, Table2...)
BD2-состоит из 1 таблицы (newTable).
Программно выбираются некоторые данные из таблиц BD1 и передаются в BD2 в newTable. Так как данные из BD1 выбираются из разных таблиц, то соответственно в newTable (BD2) они могут быть сохраненными не по порядку ( т.е. newTable будет состоять из : строка из Table1, строка из Table3, строка из Table5 ну и т.д.), так вот как сделать передачу данных из newTable в Excel, но что бы строки переданные из Table1 были записаны в диапазоне А1:А10,строки переланные из Table2 в дипозоне ячеек А11:А20 ,и так все 5 таблиц????
|
|
Мережников Андрей (статус: Абитуриент), 11 мая 2011, 22:43 [#9]:
ввести в таблицу newTable поле (например numTb), в которое записывать номер таблицы из БД1, из которой добавлена данная строка. Затем раскидывать в Excel по значению поля numTb - подставлять его значение вместо n в приведенную выше формулу.
|
|
Анучин (статус: Посетитель), 11 мая 2011, 22:57 [#10]:
Мережников Андрей: хм.... непонял, ну вот смотрите ,а как записать номер таблицы из БД1 в поле numTb, если таблицы я выбираю из combobox??
и если можно объясните на примере.
|
|
Мережников Андрей (статус: Абитуриент), 12 мая 2011, 05:47 [#11]:
combobox с именами таблиц как заполняется? В принципе можно использовать индекс из combobox в качестве номера таблицы. Если содержимое combobox всегда одинаково, то вообще никаких проблем. Если меняется, то чуть посложнее, но тоже можно.
|
|
Анучин (статус: Посетитель), 12 мая 2011, 09:26 [#12]:
Мережников Андрей: вот так я заполняю комбобокс :
procedure TForm1.sComboBox1Change(Sender: TObject);
var
str: string;
begin
ADOQuery1.Close;
ADOQuery1.SQL.Clear;
str:=' select * from '+ sComboBox1.Items[sComboBox1.ItemIndex];
ADOQuery1.SQL.Add(str);
ADOQuery1.Open;
end;
procedure TForm1.GetNames();
var
x: TStrings;
i: integer;
begin
x:=TstringList.Create;
ADOConnection1.GetTableNames(x,false);
for i := 0 to x.Count - 1 do
begin
sComboBox1.Items.Add(x.Strings[i]);
end;
sComboBox1.ItemIndex:=-1;
x.Free;
end;
procedure TForm1.FormShow(Sender: TObject);
begin
GetNames;
end;
и содержимое в нем не меняется.
|
|
Мережников Андрей (статус: Абитуриент), 12 мая 2011, 15:19 [#13]:
ну вот и использовать в качестве номера таблицы sComboBox1.ItemIndex. Но лучше, все-таки, предусмотреть возможность, что расположение строк в Combobox может измениться.
|
|
Анучин (статус: Посетитель), 12 мая 2011, 23:16 [#14]:
Мережников Андрей: блин у меня не получилось написать код как вы написали , может чего то не допонял. попытался написать немного другой, но есть проблема. смотрите вот так я вывожу данные в Excel:
procedure TForm1.Excel1Click(Sender: TObject);
var
i: integer;
Sheet: variant;
begin
ADOQuery2.SQL.Clear;
ADOQuery2.SQL.Text:= ' select * from '+ sEdit1.Text +' where numtb="Общеобразовательные_дисциплины"';
ADOQuery2.Open;
if ADOQuery2.RecordCount > 0 then
begin
Excel:=CreateOleObject('Excel.Application');
Excel.Visible:=True;
Workbook:=Excel.Workbooks.Open('C:\Лист.xlsx');
Sheet:= WorkBook.Sheets[1];
i:=6;
ADOQuery2.First;
while not ADOQuery2.Eof do
begin
Sheet.Range['B1', EmptyParam].EntireRow.AutoFit;
Sheet.Range'B'+IntToStri)]:=ADOQuery2.FieldByName'Предмет').AsString;
Sheet.Range['C' + IntToStr(i)]:= ADOQuery2.FieldByName('Экзамеы').AsString;
Sheet.Range['D' + IntToStr(i)]:= ADOQuery2.FieldByName('Зачеты').AsString;
Sheet.Range['E' + IntToStr(i)]:= ADOQuery2.FieldByName('Курсовая').AsString;
Sheet.Range['G' + IntToStr(i)]:= ADOQuery2.FieldByName('Всего').AsString;
Sheet.Range['H' + IntToStr(i)]:= ADOQuery2.FieldByName('Теоритические').AsString;
Sheet.Range['I' + IntToStr(i)]:= ADOQuery2.FieldByName('Лабораторно').AsString;
Sheet.Range['J' + IntToStr(i)]:= ADOQuery2.FieldByName('Курсовое').AsString;
ADOQuery2.Next;
i:=i+1
end;
ADOQuery2.Close;
end;
end;
///////
ADOQuery2.SQL.Text:= ' select * from '+ sEdit1.Text +' where numtb="Общеобразовательные_дисциплины"';//Общеобразовательные_дисциплины- это запись с комбобокса, получается что в Excel выводятся данные где есть эта запись.
соответственно мне так же нужно добавить и остальные записи с комбобокса, но только я незнаю куда их вписать в код, и как указать диапазон для каждой записи, подскажите.
|
|
Анучин (статус: Посетитель), 15 мая 2011, 01:41 [#15]:
ну может кто нибудь хоть что то подскажет?????
|
|
Мережников Андрей (статус: Абитуриент), 15 мая 2011, 16:36 [#16]:
добавить цикл, который будет проходить содержимое ComboBox и формировать запросы
Цитата (Анучин):
ADOQuery2.SQL.Text:= ' select * from '+ sEdit1.Text +' where numtb='+<значение из combobox>';
и поменять алгоритм:
сначала открываем лист Excel
затем в цикле делаем запросы и формируем диапазоны данных
и не забываем закрыть лист Excel после работы, чтобы не было утечки памяти.
|
|
Анучин (статус: Посетитель), 15 мая 2011, 22:49 [#17]:
Мережников Андрей: блин голова уже вообще не варит!!!! можете на примере показать, вообще ни чего не могу придумать ни запросы, ни циклы.
|
|
Мережников Андрей (статус: Абитуриент), 15 мая 2011, 23:13 [#18]:
ё-п-р-с-т! завтра, если будет время. сейчас у меня уже второй час ночи - я спать хочу - утром на работу. Осталось уже совсем элементарное - попробуйте подумать сами еще чуть-чуть.
|
|
Анучин (статус: Посетитель), 16 мая 2011, 19:11 [#19]:
Мережников Андрей: да не получается блин не как, я уже все по проге доделал, остался только этот вопрос
|
Страницы: [1] [2] [Следующая »]
Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте.
|