Экспертная система Delphi.int.ru

Сообщество программистов
Общение, помощь, обмен опытом

Логин:
Пароль:
Регистрация | Забыли пароль?

Delphi.int.ru Expert

Другие разделы портала

Переход к вопросу:

#   

Статистика за сегодня:  


Лучшие эксперты

Подробнее »



Вопрос # 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

corban (статус: 2-ой класс), 11 мая 2011, 07:58 [#2]:

Может проще заливать на отдельный лист книги?
Анучин

Анучин (статус: Посетитель), 11 мая 2011, 14:18 [#3]:

Мережников Андрей: нет количество записей может изменяться
Анучин

Анучин (статус: Посетитель), 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]:

Мережников Андрей: да не получается блин не как, я уже все по проге доделал, остался только этот вопрос :(
Мережников Андрей

Мережников Андрей (статус: Абитуриент), 16 мая 2011, 19:27 [#20]:

что именно не получается?

Страницы: [1] [2] [Следующая »]

Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте.

Версия движка: 2.6+ (26.01.2011)
Текущее время: 22 февраля 2025, 11:56
Выполнено за 0.02 сек.