Форум программистов, компьютерный форум, киберфорум
Delphi: Базы данных
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.50/4: Рейтинг темы: голосов - 4, средняя оценка - 4.50
0 / 0 / 0
Регистрация: 22.12.2017
Сообщений: 218
1

В Excel из БД

25.09.2018, 10:06. Показов 650. Ответов 11
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
доброе утро! с excel работаю впервые, поэтому много вопросов. надежда на Вас!
combobox заполняется записями из бд. выбираю запись в combobox, в excel
выводятся записи, связанные с выбранной записью в комбо, например: в combobox - тех.
процесс, в excel вывожу материалы по нему (получается таблица материалов по тех.
процессу).
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
// Устанавливаем размер массива с данными для экспорта
  FData:=VarArrayCreate([1,PechatUdNormForm.ADOQuery1.RecordCount+2,1,PechatUdNormForm.ADOQuery1.Fields.Count],varVariant);
  // Заполняем массив
   PechatUdNormForm.ADOQuery1.First;
   i:=1;
   while not PechatUdNormForm.ADOQuery1.Eof do
   begin
    for j:=1 to PechatUdNormForm.ADOQuery1.Fields.Count do begin
    FData[i,j]:=PechatUdNormForm.ADOQuery1.Fields[j-1].Value;
    end;
    i:=i+1;
    PechatUdNormForm.ADOQuery1.Next;
   end;
   //Копируем данные в Excel
   Excl.Range[Excl.Cells[4, 1], Excl.Cells[PechatUdNormForm.ADOQuery1.RecordCount+3, PechatUdNormForm.ADOQuery1.Fields.Count]].Value:=FData;
  //границы вокруг данных
   Excl.Range[Excl.Cells[4, 1], Excl.Cells[PechatUdNormForm.ADOQuery1.RecordCount+3, PechatUdNormForm.ADOQuery1.Fields.Count]].Select;
   Excl.Selection.Borders.LineStyle := 1;
   Excl.Selection.Borders.Weight := 2;
   Excl.Range[Excl.Cells[4, 1], Excl.Cells[4, 1]].Select;
   Excl.Range[Excl.Cells[PechatUdNormForm.ADOQuery1.RecordCount+4, 1], Excl.Cells[PechatUdNormForm.ADOQuery1.RecordCount+4, 1]].Value:='Итого:'+' '+PechatUdNormForm.Edit2.Text;
   Excl.Range[Excl.Cells[4, 1], Excl.Cells[PechatUdNormForm.ADOQuery1.RecordCount+4, 1]].WrapText:=false;
запрос в query:
Delphi
1
2
3
4
5
6
7
8
9
with PechatUdNormForm.ADOQuery1 do begin
     Close;
     SQL.Clear;
     SQL.Add('select unr.obm, n051s.nam, n051s.mar, n051s.ram, n051s.gsm, ');
     sql.Add('n051s.gss, unr.unr1, unr.kets, unr.ets, n051s.cenp, unr.unr1*n051s.cenp as cen ');
     sql.Add('from unr, n051s where n051s.obm=unr.obm');
     sql.Add('and unr.tpr='+QuotedStr(TehProcessComboBox.Text));
     Open;
     end;
это работа с одной записью. на форме
чекбокс - печать всех тех. процессов/нескольких тех. процессов.
как сделать, чтобы в excel выводились все тех. процессы со своими материалами?
большое спасибо!

Добавлено через 24 минуты
не знаю, какое условие прописать в строке 7 второго фрагмента кода.
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
25.09.2018, 10:06
Ответы с готовыми решениями:

Макрос для переноса данных из одного Excel в другой Excel файл
Уважаемые эксперты, очень нужна ваша помощь! Подскажите, пожалуйста, как прописать макрос, который...

Microsoft.Office.Interop.Excel.Application процессы Excel в памяти компьютера
Добрый день, коллеги! Программа работает с файлами Excel. В каждой процедуре я указываю, что...

Какие Excel библиотеки необходимы для создания CreateObject('Excel.Application') ?
проблема в том что клиент не хочет пользоваться MS Excel. существуют ли возможность работы с Open...

Excel: Сделать List (of Excel.Range) по столбцу с пустыми и заполненными ячейками
Доброго времени! За несколько часов так и не решил задачку. Файл Excel в столбце D имеет...

11
222 / 66 / 33
Регистрация: 23.05.2014
Сообщений: 715
26.09.2018, 08:13 2
Цитата Сообщение от tsareva Посмотреть сообщение
не знаю, какое условие прописать в строке 7 второго фрагмента кода.
а мы тем более На первый взгляд все нормально. И условие указано. Просто, если у вас по условию выбирается из БД только одна запись - она одна и будет. Если по чек боксу надо все печатать - тогда седьмую строку совсем убирать надо. Я так полагаю.
0
0 / 0 / 0
Регистрация: 22.12.2017
Сообщений: 218
26.09.2018, 14:26  [ТС] 3
Цитата Сообщение от drvolodko Посмотреть сообщение
тогда седьмую строку совсем убирать надо.
если ее убрать, то все материалы выводятся, а надо список материалов для каждого тех. процесса отдельно.
как на картинке, то же самое, только для каждого тех. процесса отдельно в одном документе.
Миниатюры
В Excel из БД  
0
222 / 66 / 33
Регистрация: 23.05.2014
Сообщений: 715
27.09.2018, 08:44 4
Тогда точно убрать и комбобокс тут не нужен. Сделай массив техпроцессов (array of word если у тебя по id связка, нет - тогда TStringList). Загрузи данные по техпроцессам.
Цитата Сообщение от tsareva Посмотреть сообщение
sql.Add('and unr.tpr='+QuotedStr(TehProcessComboBox.Text));
замени на:
Delphi
1
sql.add('and unr.tpr=:tpr');
И дальше в цикле присваивай параметру элемент массива, открывай таблицу с новыми данными и выводи.
1
0 / 0 / 0
Регистрация: 22.12.2017
Сообщений: 218
27.09.2018, 09:22  [ТС] 5
загрузила массив тех. процессов в dbgrideh, из него - в excel:
Delphi
1
2
3
4
5
6
7
8
9
 index:=2;
  PechatUdNormForm.DBGrideh1.DataSource.DataSet.First;
  for i:=1 to PechatUdNormForm.DBGrideh1.DataSource.DataSet.RecordCount do
    begin
      excl.cells[index,1]:='Технологическая операция'+' '+PechatUdNormForm.DBGrideh1.fields[0].asstring+' '+PechatUdNormForm.DBGrideh1.fields[1].asstring;
      excl.cells[index,1].WrapText:=false;
      inc(index);
      PechatUdNormForm.DBGrideh1.DataSource.DataSet.Next;
   end;
что значит
Цитата Сообщение от drvolodko Посмотреть сообщение
присваивай параметру элемент массива
?
что-то вроде этого:
Delphi
1
2
3
4
 ...
sql.add('where unr.tpr=:tpr');
     Open;
     Parameters.ParamByName('tpr').Value:=excl.cells[index,1];
?
0
222 / 66 / 33
Регистрация: 23.05.2014
Сообщений: 715
27.09.2018, 12:07 6
Цитата Сообщение от tsareva Посмотреть сообщение
загрузила массив тех. процессов
не то. Ну можно и в комобобоксе оставить, для одиночной печати. Тогда, если нужно печатать подряд все, что в комбобоксе:
Delphi
1
2
3
4
5
6
7
for i:=0 to combobox.items.count-1 do
begin
Adoquery.close;
Adoquery.Parameters.ParamByName('tpr').Value:=combobox.items.strings[i];
adoquery.open;
///выводишь полученное в excel
end;
0
0 / 0 / 0
Регистрация: 22.12.2017
Сообщений: 218
27.09.2018, 13:21  [ТС] 7
а через dbgrideh возможно связать? как я начала?
0
222 / 66 / 33
Регистрация: 23.05.2014
Сообщений: 715
27.09.2018, 14:24 8
Цитата Сообщение от tsareva Посмотреть сообщение
а через dbgrideh возможно связать?
dbgrideh - эта штуковина только отображает набор выбранных из бд данных. Все выбранные данные находятся в Adoquery после команды open и только потом, если таковое необходимо, они отобразяться в dbgrideh.
Цитата Сообщение от tsareva Посмотреть сообщение
как я начала?
И вы их точно так же для массива вывода брали из Adoquery:
Цитата Сообщение от tsareva Посмотреть сообщение
// Устанавливаем размер массива с данными для экспорта
FData:=VarArrayCreate([1,PechatUdNormForm.ADOQuery1.RecordCount+2,1,PechatUdNormForm.ADOQuery1.Fields.C ount],varVariant);
* // Заполняем массив
* *PechatUdNormForm.ADOQuery1.First;
* *i:=1;
* *while not PechatUdNormForm.ADOQuery1.Eof do
* *begin
* * for j:=1 to PechatUdNormForm.ADOQuery1.Fields.Count do begin
* * FData[i,j]:=PechatUdNormForm.ADOQuery1.Fields[j-1].Value;
* * end;
* * i:=i+1;
* * PechatUdNormForm.ADOQuery1.Next;
* *end
0
0 / 0 / 0
Регистрация: 22.12.2017
Сообщений: 218
28.09.2018, 11:15  [ТС] 9
сделала вот так:
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
index:=2;
     for i:=0 to PechatUdNormForm.TehProcessComboBox.items.count-1 do
      begin
        excl.ActiveSheet.Cells(index,1):='Технологическая операция'+' '+PechatUdNormForm.TehProcessComboBox.items.Strings[i]+' '+PechatUdNormForm.ListBox1.Items.Strings[i];
        excl.cells[index,1].WrapText:=false;
        inc(index);
      end;
index:=3;
....
index:=4;
     // Устанавливаем размер массива с данными для экспорта
      FData:=VarArrayCreate([1,PechatUdNormForm.ADOQuery1.RecordCount+3,1,PechatUdNormForm.ADOQuery1.Fields.Count],varVariant);
      // Заполняем массив
      PechatUdNormForm.ADOQuery1.First;
      k:=1;
      while not PechatUdNormForm.ADOQuery1.Eof do
      begin
        for j:=1 to PechatUdNormForm.ADOQuery1.Fields.Count do begin
        FData[k,j]:=PechatUdNormForm.ADOQuery1.Fields[j-1].Value;
      end;
        inc(k);
    PechatUdNormForm.ADOQuery1.Next;
    end;
     Excl.Range[Excl.Cells[index, 1], Excl.Cells[PechatUdNormForm.ADOQuery1.RecordCount+4, PechatUdNormForm.ADOQuery1.Fields.Count]].Value:=FData;
Delphi
1
2
3
4
5
6
7
8
 with PechatUdNormForm.ADOQuery1 do begin
     Close;
     SQL.Clear;
     SQL.Add('select unr.obm, n051s.nam, n051s.mar, n051s.ram, n051s.gsm, ');
     sql.Add('n051s.gss, unr.unr1, unr.kets, unr.ets, n051s.cenp, unr.unr1*n051s.cenp as cen ');
     sql.Add('from unr left outer join [O:\dbf\n051s.DBF] on n051s.obm=unr.obm ');
     sql.add('where unr.tpr='+QuotedStr(PechatUdNormForm.TehProcessComboBox.items.Strings[i]));
     Open;
но список материалов все равно выводит только для одного ТП.
Миниатюры
В Excel из БД  
0
222 / 66 / 33
Регистрация: 23.05.2014
Сообщений: 715
12.10.2018, 16:33 10
Может, конечно и поздновато (командировка была), но все же: 1. Где параметр? 2. Где цикл для изменения значения параметра?
0
0 / 0 / 0
Регистрация: 22.12.2017
Сообщений: 218
31.10.2018, 10:48  [ТС] 11
drvolodko. если сделать цикл, то выводятся так же материалы только для одного ТП, только уже не для первого в списке, а для последнего.
Delphi
1
2
3
4
5
6
7
8
9
10
for i:=0 to PechatUdNormForm.TehProcessComboBox.items.count-1 do begin
    with PechatUdNormForm.ADOQuery1 do begin
     Close;
     SQL.Clear;
     SQL.Add('select unr.obm, n051s.nam, n051s.mar, n051s.ram, n051s.gsm, ');
     sql.Add('n051s.gss, unr.unr1, unr.kets, unr.ets, n051s.cenp, unr.unr1*n051s.cenp as cen ');
     sql.Add('from unr INNER join [O:\dbf\n051s.DBF] on n051s.obm=unr.obm ');
     sql.add('where tpr='+QuotedStr(PechatUdNormForm.TehProcessComboBox.items.Strings[i]));
     Open;
    end;
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
index:=4;
   for i:=0 to PechatUdNormForm.TehProcessComboBox.items.count-1 do begin
     FData:=VarArrayCreate([1,PechatUdNormForm.ADOQuery1.RecordCount+3,1,PechatUdNormForm.ADOQuery1.Fields.Count],varVariant);
  // Заполняем массив
   PechatUdNormForm.ADOQuery1.First;
   k:=1;
   while not PechatUdNormForm.ADOQuery1.Eof do
    begin
       for j:=1 to PechatUdNormForm.ADOQuery1.Fields.Count do begin
       FData[k,j]:=PechatUdNormForm.ADOQuery1.Fields[j-1].Value;
       end;
       k:=k+1;
        PechatUdNormForm.ADOQuery1.Next;
    end;
 
   Excl.Range[Excl.ActiveSheet.Cells[index, 1], Excl.Cells[PechatUdNormForm.ADOQuery1.RecordCount+3, PechatUdNormForm.ADOQuery1.Fields.Count]].Value:=FData;
  end;
0
222 / 66 / 33
Регистрация: 23.05.2014
Сообщений: 715
02.11.2018, 11:19 12
Цитата Сообщение от tsareva Посмотреть сообщение
если сделать цикл, то выводятся так же материалы только для одного ТП, только уже не для первого в списке, а для последнего.
Да. Все верно. Только за одним исключением. Тут надо либо переопределять размерность массива данных и добавлять циклично отобранные новые записи в конец этого массива, либо так же в цикле этот массив сразу выводить в Excel, запоминать последнюю позицию и на следующей итерации выводить новые данные с последней_позиции_ячейки+1. И снова заполнять массив новыми данными. Как-то так. А то получается, что вы отбираете данные из БД и тянете их в массив, затирая предыдущие... Поэтому и выводится только что-то одно..
0
02.11.2018, 11:19
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
02.11.2018, 11:19
Помогаю со студенческими работами здесь

Из Excel в DBGrid. Подключиться к рабочей книге MS Excel, как к базе данных.
Доброго времени суток! У меня возникли проблемы при выводе таблицы с Excel на DBGrid, а именно:...

Передача данных из Excel в Word (через Закладки) из нескольких страниц Excel
Товарищи прошу помощи! В книге есть 3 закладки: Org - данные об организации (только 1 строчка...

Программа AtteStat1205 для Excel, встраивает модули в Excel, как ее удалить
Скачал удивительную программу AtteStat1205 интересные методы, все круто расписано. но не могу...

Скопировать диапазон ячеек одной книги Excel в другую книгу Excel
Из темы все ясно... Не могу разобраться никак. Можно ли открыть одну книгу, скопировать диапазон...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
12
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru