| 
| 
 | Вопрос # 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] [Следующая »]  Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте. |