Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Вывод данных из SQL в Excel, [?] 
V
    Опции темы
Yantarik
  Дата 13.8.2007, 10:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 53
Регистрация: 8.8.2007
Где: г.Москва

Репутация: 1
Всего: 1



Здравствуйте!
Я новичок в Дельфи. 
Не подскажите как вывести из SQL в Excel данные?
Желательно с использованием ADO.

Спасибо.
PM MAIL   Вверх
pseud
Дата 13.8.2007, 10:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Экспёрт Тыдыщ
***


Профиль
Группа: Завсегдатай
Сообщений: 1175
Регистрация: 18.5.2007
Где: Минск, Беларусь

Репутация: 16
Всего: 40



а поискать слабо?
Поиск по ветке слова "Excel"

Добавлено через 1 минуту и 51 секунду
если что-то конкретное будет не получаться - спрашивай


--------------------
Испытание чужого терпения можно считать успешным, если оно лопнуло...
PM MAIL   Вверх
Yantarik
Дата 13.8.2007, 12:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 53
Регистрация: 8.8.2007
Где: г.Москва

Репутация: 1
Всего: 1



С этого я и начала smile
Ничего толкового(=понятное для меня) не нашла.
После чего зарегистрировалась.

PM MAIL   Вверх
SergeBS
Дата 13.8.2007, 15:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1111
Регистрация: 10.6.2005
Где: Владимир

Репутация: 11
Всего: 22



Yantarik
Идешь на delphi world, скачиваешь тамошний хелп и читаешь. Хоть что-то да поймешь, поскольку там куча разных способов.
PM MAIL   Вверх
pseud
Дата 13.8.2007, 15:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Экспёрт Тыдыщ
***


Профиль
Группа: Завсегдатай
Сообщений: 1175
Регистрация: 18.5.2007
Где: Минск, Беларусь

Репутация: 16
Всего: 40



Цитата(Yantarik @  13.8.2007,  12:33 Найти цитируемый пост)
 и начала


итак пример (для девушки ничего не жалко)

Допустим: у тебя есть ADOQuery1 в который по запросу SQL отобраны данные и кнопка Button1.
По нажатию на кнопку пишем такой код

Код

procedure TForm1.Button1Click(Sender: TObject);
const
  xlWBATWorksheet = -4167;
  xlContinuous = 1;
var
  XLApp: Variant;
  XLWorkbook: Variant;
  XLSheet: Variant;
  XLArrayData : OLEVariant;
  XLCellBegin: Variant;
  XLCellEnd: Variant;
  XLRange: Variant;

  iColumnsCount: Integer;
  iRowsCount: Integer;
  i: Integer;
  j: Integer;
begin


  try
    XLApp := CreateOleObject('Excel.Application'); //это чтоб нас никто не видел
    XLApp.Application.EnableEvents := False;   // Отключение событий Excel для ускорения экспорта
  except
    Application.MessageBox('Приложение MS Office Excel не найдено.', PChar(Self.Caption), MB_OK + MB_ICONERROR);
    Exit;
  end;

  try
    XLApp.DisplayAlerts := False;
    Screen.Cursor := crHourGlass;
    try
      XLWorkbook := XLApp.Workbooks.Add(xlWBATWorkSheet);
      XLSheet := XLWorkbook.Sheets[1];

      iRowsCount := ADOQuery1.RecordCount + 1; // + шапка

      iColumnsCount:= ADOQuery1.FieldCount;

      XLArrayData := VarArrayCreate([1, iRowsCount, 1, iColumnsCount], varVariant);

      ADOQuery1.First;

      // шапка
      for j:= 1 to iColumnsCount do
        XLArrayData[1, j] := ADOQuery1.Fields.Fields[j - 1].DisplayLabel;

      // данные
      for i := 2 to iRowsCount do
      begin
        for j:= 1 to iColumnsCount do
          XLArrayData[i, j] := ADOQuery1.Fields.Fields[j - 1].AsString;
        ADOQuery1.Next;
      end;

      XLCellBegin := XLSheet.Cells[1, 1];
      XLCellEnd := XLSheet.Cells[iRowsCount, iColumnsCount];

      XLRange := XLSheet.Range[XLCellBegin, XLCellEnd];
      XLRange.NumberFormat := '@';

      // передача массива данных в эксцель
      XLRange.Value := XLArrayData;

      // контуры таблицы
      XLRange.Borders.LineStyle := xlContinuous;

      for i:= 1 to iColumnsCount do
        XLSheet.Columns[i].AutoFit;

      XLApp.Visible := True;
    finally
      Self.Enabled:= True;
      Screen.Cursor := crDefault;
      XLApp.DisplayAlerts:= True;
      VarClear(XLArrayData);
    end;
  except
    XLApp.Quit;
    Application.MessageBox(PChar('Ошибка экспорта в Excel.'), PChar(Self.Caption), MB_OK + MB_ICONERROR);
  end;

end;


не забываем в uses добавить ComObj

P.S. код работает супер быстро, что обеспечено за счет передачи данных через вариантный массив
единственное что может заторомозить - это вывод контуров таблицы XLRange.Borders.LineStyle := xlContinuous;
поэтому на больших объемах данных лучше не юзать (если конечно важна скорость)



--------------------
Испытание чужого терпения можно считать успешным, если оно лопнуло...
PM MAIL   Вверх
Yantarik
Дата 14.8.2007, 12:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 53
Регистрация: 8.8.2007
Где: г.Москва

Репутация: 1
Всего: 1



Пока написанный выше код не использовала. 
Нашла другой. После исправления параметров на свои, мне программа выдает ошибку:
"Произошли ошибки во время выполнения многошаговой операции OLE DB. По возможности проверьте значения всех состояний OLE DB"

Как это можно проверить?


И сразу вот такой еще вопрос № 2
Не очень понимаю вот это:
Код

ADOCommandForExcel.CommandText:='insert into [Телефоны] '+
'([Телефон], [Имя], [Улица], [Дом], [Корпус], [Квартира]) '+
' values' +
'(:pPhone, :pName, :pUl, :pHouse, :pKorp, :pFlat)';



То есть я понимаю: из таблицы Телефоны выбрать столбцы "Телефон", "Имя", "Улицу", "Дом", "Корпус", "Квартира", а вот что такое дальше?


Это сообщение отредактировал(а) Yantarik - 14.8.2007, 12:17
PM MAIL   Вверх
pseud
Дата 14.8.2007, 14:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Экспёрт Тыдыщ
***


Профиль
Группа: Завсегдатай
Сообщений: 1175
Регистрация: 18.5.2007
Где: Минск, Беларусь

Репутация: 16
Всего: 40



insert - вставить новую запись
select - выбрать записи
update - редактировать записи
delete - удалить записи

читаем основы SQL

Добавлено через 57 секунд
Цитата(Yantarik @  14.8.2007,  12:16 Найти цитируемый пост)
 мне программа выдает ошибку:


в каком месте?

Добавлено через 5 минут и 33 секунды
думаю тебе для начала пойдет это

Короткий справочник по SQL

P.S. ну очень короткий


--------------------
Испытание чужого терпения можно считать успешным, если оно лопнуло...
PM MAIL   Вверх
Yantarik
Дата 15.8.2007, 12:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 53
Регистрация: 8.8.2007
Где: г.Москва

Репутация: 1
Всего: 1



Цитата(pseud @ 14.8.2007,  14:04)
Цитата(Yantarik @  14.8.2007,  12:16 Найти цитируемый пост)
 мне программа выдает ошибку:


в каком месте?


На  ADOConnectionForExcel.Open;

"insert - вставить новую запись
читаем основы SQL"
Сорри, с селектом перепутала. 

Про вопрос №2:
В очень кратком справочнике нет опсисаия термина(или что это?)
"values". 
Интуитивно я понимаю, что ":pName" - это переменная. НО откуда она берётся и почему перед ней ":" ?

PM MAIL   Вверх
pseud
Дата 15.8.2007, 18:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Экспёрт Тыдыщ
***


Профиль
Группа: Завсегдатай
Сообщений: 1175
Регистрация: 18.5.2007
Где: Минск, Беларусь

Репутация: 16
Всего: 40



Цитата(Yantarik @  15.8.2007,  12:19 Найти цитируемый пост)
Про вопрос №2:


если тебе не нужен Insert, то не нужен и Values

выложи лучше свой нерабочий SQL 


--------------------
Испытание чужого терпения можно считать успешным, если оно лопнуло...
PM MAIL   Вверх
Yantarik
Дата 16.8.2007, 10:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 53
Регистрация: 8.8.2007
Где: г.Москва

Репутация: 1
Всего: 1



Как раз Insert нужен smile
Код

procedure TForm1.BADOClick(Sender: TObject);
var
i:integer;
begin
SourceDatasetInit;
//выставляем параметры подключения для xls-ки
ADOConnectionForExcel.ConnectionString:=
'Provider=MSDASQL.1; '+
'Persist Security Info=False; '+
'Data Source=Файлы Excel; '+
'Location='+'"'+GetCurrentDir+'\1.xls'+'";'+
'Mode=ReadWrite; '+
'Initial Catalog='+'"'+GetCurrentDir+'\"';
ADOConnectionForExcel.DefaultDatabase:=GetCurrentDir+'\1.xls';
ADOConnectionForExcel.Open;
//создаем книгу
ADOCommandForExcel.CommandText:='create table [Телефоны] '+
' ([Телефон] char (100), '+
' [Имя] char (100), '+
' [Улица] char (100), '+
' [Дом] char (100), '+
' [Корпус] char (100), '+
' [Квартира] char (100)) ';
ADOCommandForExcel.Execute;
ADODataSetSource.First;
//собственно экспорт
//Настоятельно советую работать через параметры т.к. в данном случае это быстрее
ADOCommandForExcel.CommandText:='insert into [Телефоны] '+
'([Телефон], [Имя], [Улица], [Дом], [Корпус], [Квартира]) '+
' values' +
'(:pPhone, :pName, :pUl, :pHouse, :pKorp, :pFlat)';
if ADODataSetSource.RecordCount>0 then begin
repeat
for i:=0 to ADODataSetSource.FieldCount-1 do
  if ADODataSetSource.fields[i].Value=null then
  ADOCommandForExcel.Parameters[i].Value:=' '//на пустую строку '' ODBC ругается
                                      else
  ADOCommandForExcel.Parameters[i].Value:=ADODataSetSource.fields[i].AsString;
Application.ProcessMessages;
ADOCommandForExcel.Execute;
ADODataSetSource.Next;

until ADODataSetSource.Eof;
                                   end;// if ADODataSet1.RecordCount>0 then begin
showmessage('Экспорт завершен');
ADOConnectionForExcel.Close;
shellexecute(Application.Handle,'open',PAnsiChar(GetCurrentDir+'\1.xls'),nil,nil, sw_ShowNormal);

end;



С ошибкой  мы разобрались. 

PM MAIL   Вверх
Yantarik
Дата 16.8.2007, 10:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 53
Регистрация: 8.8.2007
Где: г.Москва

Репутация: 1
Всего: 1



И еще я не понимаю:
зачем создается еще одна таблица в базе, если мне надо, чтобы считывались данные и переносились(записывались) в Эксель?

PM MAIL   Вверх
pseud
Дата 16.8.2007, 11:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Экспёрт Тыдыщ
***


Профиль
Группа: Завсегдатай
Сообщений: 1175
Регистрация: 18.5.2007
Где: Минск, Беларусь

Репутация: 16
Всего: 40



Yantarik
получи (+1) в репутацию за новый для меня способ экспорта в Excel пусть и сочиненный не тобой и не доконца тобой понятый smile
в базе таблиц не создается это создается именно файл Excel


--------------------
Испытание чужого терпения можно считать успешным, если оно лопнуло...
PM MAIL   Вверх
Yantarik
Дата 16.8.2007, 11:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 53
Регистрация: 8.8.2007
Где: г.Москва

Репутация: 1
Всего: 1



Цитата(pseud @ 16.8.2007,  11:00)
в базе таблиц не создается это создается именно файл Excel

Так в том-то и дело, что у меня при переименовании таблицы создается новая таблица в базе.
Возможно надо что-то "особенное" указать в Object Inspector для ADOCommandForExcel.CommandText и ADOCommandForExcel.Execute. 
Сейчас у меня там ссылка(не знаю, как это правильно называется)  на базу.


И еще один вопрос:
Мне надо выгрузить всю таблицу.
В селекте это *, а вот в инсерте это как описывается? Нужно ли в данном случае перечисление столбцов(их около 30-40 штук) или можно как-то похоже с селектом описать?
PM MAIL   Вверх
pseud
Дата 16.8.2007, 12:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Экспёрт Тыдыщ
***


Профиль
Группа: Завсегдатай
Сообщений: 1175
Регистрация: 18.5.2007
Где: Минск, Беларусь

Репутация: 16
Всего: 40



вот она кучка проблем из твоего экспорта вылилась

можно конечно поковырять твой экспорт, но...
а почему не хочешь мной описанный способ испробовать?

1. он универсален
2. не создает новых таблиц в базе
3. Не нужно перечисление столбцов




--------------------
Испытание чужого терпения можно считать успешным, если оно лопнуло...
PM MAIL   Вверх
Yantarik
Дата 16.8.2007, 13:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 53
Регистрация: 8.8.2007
Где: г.Москва

Репутация: 1
Всего: 1



Цитата(pseud @  16.8.2007,  12:07 Найти цитируемый пост)
а почему не хочешь мной описанный способ испробовать?

1. Потому что я его не понимаю совсем smile))
То есть мне нужно объяснять каждую строчку ,начиная с первых 4хзначных цифр: что это откуда берется? Я не знаю, кода прописывать свою базу и т.д.

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

PM MAIL   Вверх
pseud
Дата 16.8.2007, 14:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Экспёрт Тыдыщ
***


Профиль
Группа: Завсегдатай
Сообщений: 1175
Регистрация: 18.5.2007
Где: Минск, Беларусь

Репутация: 16
Всего: 40



Цитата(Yantarik @  16.8.2007,  13:33 Найти цитируемый пост)
 Потому что я его не понимаю совсем


но если кто-то доработает твой код до того, что тебе нужно
ты получается тоже не поймешь и придется объяснять

тебе нужно кому-то потом объяснить, что написано? или главное чтоб экспорт происходил?

эту процедуру можно немножко доработать и использовать ее в любом проекте без изменений
а понимание придет позже

ну постарайся: var - переменные, const - константы и т.д. smile


--------------------
Испытание чужого терпения можно считать успешным, если оно лопнуло...
PM MAIL   Вверх
Yantarik
Дата 16.8.2007, 14:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 53
Регистрация: 8.8.2007
Где: г.Москва

Репутация: 1
Всего: 1



Цитата(pseud @  16.8.2007,  14:00 Найти цитируемый пост)
а понимание придет позже


А мне не нужно позже. Я хочу ПОНИМАТЬ, а не тупо списывать. smile
Чтобы при необходимости я могла все, что нужно/захочется исправить.

Что такое переменные и константы я знаю smile))))
Я могу тебе написать все, что мне не понятно по твоему скрипту smile))

Код

xlWBATWorksheet = -4167;
 xlContinuous = 1;

Откуда взялись эти числа? Почему именно они?

Код

Screen.Cursor := crHourGlass;

Что делает это? (и сразу зачем оно нужно) и откуда взялась crHourGlass? Какое у нее значение? 

Код

XLWorkbook := XLApp.Workbooks.Add(xlWBATWorkSheet);
      XLSheet := XLWorkbook.Sheets[1];

Эти два тоже не понятны. Опять же откуда берутся значения после знака присвоить?

Код

iRowsCount := ADOQuery1.RecordCount + 1;

Это я так понимаю переход на новый столец?

(остальное потом. думаю. что на первый раз хватит)


И ГЛАВНЫЙ вопрос: ты сказал, что на больших таблицах он будет тормозить.
Как ты думаешь сколько ему потребуется времени, чтобы обработать около 80.000 строк с 30-40 столбцами(в которых приемущественно строки(не цифры)) ?
smile))))
PM MAIL   Вверх
pseud
Дата 16.8.2007, 14:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Экспёрт Тыдыщ
***


Профиль
Группа: Завсегдатай
Сообщений: 1175
Регистрация: 18.5.2007
Где: Минск, Беларусь

Репутация: 16
Всего: 40



Цитата(Yantarik @  16.8.2007,  14:19 Найти цитируемый пост)
Откуда взялись эти числа? Почему именно они?

делай раз:
1. запусти Excel
2. сервис -> макрос -> редактор VisualBasic
3. View -> ObjectBrowser
4. Во второй комбобокс вбей xlWBATWorksheet, бинокль, изучи (внизу описано)
5. вбей xlContinuous - изучи

эти говорящие константы я ввел именно для понимания, а мог ведь просто передать цифири

Цитата(Yantarik @  16.8.2007,  14:19 Найти цитируемый пост)
Что делает это? (и сразу зачем оно нужно) и откуда взялась crHourGlass? Какое у нее значение? 

делай два:
экспорт наш может длиться очень долго - покажем как юзеру на это время ЧасикиСтеклянные (HourGlass)

Цитата(Yantarik @  16.8.2007,  14:19 Найти цитируемый пост)
Эти два тоже не понятны. Опять же откуда берутся значения после знака присвоить?

это свойства COM объекта, о которых дельфи ничего не знает, а мы только догадываемся.
если у тебя еще открыт VisualBasic, то поковыряв его еще немножко, ты все поймешь.
Впринципе в дельфи есть страничка Servers где висят объекты, которые предоставляют эти непонятности в более понятным способом. Но я их не юзал.

Цитата(Yantarik @  16.8.2007,  14:19 Найти цитируемый пост)
Это я так понимаю переход на новый столец?

все переменные говорящие
iRowsCount - количесвто строк в Excel файле

Цитата(Yantarik @  16.8.2007,  14:19 Найти цитируемый пост)
И ГЛАВНЫЙ вопрос

если уберешь строку 
Код

XLRange.Borders.LineStyle := xlContinuous;

то пару секунд




--------------------
Испытание чужого терпения можно считать успешным, если оно лопнуло...
PM MAIL   Вверх
Yantarik
Дата 16.8.2007, 16:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 53
Регистрация: 8.8.2007
Где: г.Москва

Репутация: 1
Всего: 1



Const xlWBATWorksheet = -4167 (&HFFFFEFB9)
    Member of Excel.XlWBATemplate
 
Единственное, что я из этого поняла, что это какая-то константа в Экселе smile
А почему у нее такое значение?

Const xlContinuous = 1
    Member of Excel.XlLineStyle

вообще непонятное число... Зачем вводить константу равную 1? Если название этой константы в 12 раз длинее цифры 1? smile

Цитата(pseud @  16.8.2007,  14:40 Найти цитируемый пост)
о которых дельфи ничего не знает

Как же он тогда поймет, что написано?

Код

XLWorkbook := XLApp.Workbooks.Add(xlWBATWorkSheet);
      XLSheet := XLWorkbook.Sheets[1];

О чем говорит XL?

Код

iColumnsCount:= ADOQuery1.FieldCount;

Что значит данная строчка?


Еще:
Я не вижу, где я должа прописать свою базу. И у меня в базе не одна таблица а около 30...
И путь к эксель-файла тоже не вижу. 
:((((
PM MAIL   Вверх
pseud
Дата 16.8.2007, 16:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Экспёрт Тыдыщ
***


Профиль
Группа: Завсегдатай
Сообщений: 1175
Регистрация: 18.5.2007
Где: Минск, Беларусь

Репутация: 16
Всего: 40



Цитата(Yantarik @  16.8.2007,  16:13 Найти цитируемый пост)
А почему у нее такое значение?


а потому, что другие значения заняты другими константами

Цитата(Yantarik @  16.8.2007,  16:13 Найти цитируемый пост)
вообще непонятное число... Зачем вводить константу равную 1? Если название этой константы в 12 раз длинее цифры 1? 


ты соврала
Цитата(Yantarik @  16.8.2007,  14:19 Найти цитируемый пост)
Что такое переменные и константы я знаю ))))


тебе понятней так?
Код

XLWorkbook := XLApp.Workbooks.Add(-4167);
XLRange.Borders.LineStyle := 1;

или так?
Код

XLWorkbook := XLApp.Workbooks.Add(xlWBATWorkSheet);
XLRange.Borders.LineStyle := xlContinuous;


все переменные и константы должны быть говорящие, чтоб ты сама или кто-то после тебя могли быстро разобраться в коде.
xlContinuous:
xl - приставка, говорящая что мы работаем с Excel
Continuous - (англ.) непрерывный.

а о чем скажет цифра 1????????????

Цитата(Yantarik @  16.8.2007,  16:13 Найти цитируемый пост)
Как же он тогда поймет, что написано?

никак не поймет
просто попытается вызвать указанные тобой методы
если ты ошиблась хоть в одной буковке - получешь Error

Цитата(Yantarik @  16.8.2007,  16:13 Найти цитируемый пост)
О чем говорит XL?

говорящая приставка (см.выше) - говорящая не для Delphi - ей до лампочки - говорящая для программиста


Цитата(Yantarik @  16.8.2007,  16:13 Найти цитируемый пост)
Что значит данная строчка?

iColumnsCount (говорящая переменная)
i - Integer
Columns - колонки
Count - количество

Цитата(Yantarik @  16.8.2007,  16:13 Найти цитируемый пост)
Я не вижу, где я должа прописать свою базу

ADOQuery1 - это компонент куда ты отобрала свои данные по SQL

Цитата(Yantarik @  16.8.2007,  16:13 Найти цитируемый пост)
 И у меня в базе не одна таблица а около 30...

Одним заходом?

Цитата(Yantarik @  16.8.2007,  16:13 Найти цитируемый пост)
И путь к эксель-файла тоже не вижу. 

А при обычном открытии Excel ты видишь новый файл а пути его не видишь.
Мы в фоне все экспортим и открываем эксель.
При попытке закрыть эксель спросит - сохранить?
Можно конечно и программно сохранить.


--------------------
Испытание чужого терпения можно считать успешным, если оно лопнуло...
PM MAIL   Вверх
Yantarik
Дата 17.8.2007, 11:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 53
Регистрация: 8.8.2007
Где: г.Москва

Репутация: 1
Всего: 1



Отвлеченно:
Из-за чего может вылетать ошибка:
"Операция не допускается, если объект открыт"

На всякий случай: при запуске кода файл успевается открыться, а до строчки закрытия файла он не доходит. Я делаю программ ресет... То есть получается, что я его не закрываю при повторном перезапуске... Идия закрыть файл в самом начале почему-то не работает(наверное и не должна)...
PM MAIL   Вверх
pseud
Дата 17.8.2007, 12:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Экспёрт Тыдыщ
***


Профиль
Группа: Завсегдатай
Сообщений: 1175
Регистрация: 18.5.2007
Где: Минск, Беларусь

Репутация: 16
Всего: 40



Цитата(Yantarik @  17.8.2007,  11:24 Найти цитируемый пост)
Отвлеченно


отвлеченно не стоит
новый вопрос = новая тема

да и из описания ничего не понял - код - место ошибки
это работа с файлами? если да то новый вопрос причем не в эту ветку
или все тот же экспорт в Excel


--------------------
Испытание чужого терпения можно считать успешным, если оно лопнуло...
PM MAIL   Вверх
Yantarik
Дата 17.8.2007, 12:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 53
Регистрация: 8.8.2007
Где: г.Москва

Репутация: 1
Всего: 1



Цитата(pseud @  17.8.2007,  12:37 Найти цитируемый пост)
или все тот же экспорт в Excel 

Все та же работа с Excel.

Я нажимаю F9, программа начинает выполняться. В процессе выполнения открывается файл(экселевский), потом зацикливается. Я ее останавливаю, что-то правлю, (когда понимаю, в чем ошибка) и запускаю заново. И после этого он выдает такую ошибку.
PM MAIL   Вверх
Yantarik
Дата 17.8.2007, 13:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 53
Регистрация: 8.8.2007
Где: г.Москва

Репутация: 1
Всего: 1



По поводу твоего кода.
1. Я так и не поняла, как мне прописать свою базу?
ADOQuery1 описывается как TADODataSet?

2. При выполнении выскакивает пустая форма. Откуда она берется? 

p.s. я так полагаю, чтобы для меня переменные были говорящими надо где-то с полгода программить. smile)) Для меня пока это темный лес.
Поняла, что в название переменных/констант вы вкладываете их сущность. 
И не поняла, зачем константа равная единице. 
PM MAIL   Вверх
pseud
Дата 17.8.2007, 13:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Экспёрт Тыдыщ
***


Профиль
Группа: Завсегдатай
Сообщений: 1175
Регистрация: 18.5.2007
Где: Минск, Беларусь

Репутация: 16
Всего: 40



Цитата(Yantarik @  17.8.2007,  12:56 Найти цитируемый пост)
Все та же работа с Excel.


какой метод используешь? тот что я написал? или свой?

предположу:
ошибка происходит из-за аварийного завершения проги, т.к. объект Excel остается подвисший и при следующей попытке его создать  - еррор.

Ctrl+Alt+Del - Диспетчер задач - закл.Процессы - видим висящий EXCEL.EXE - убей его

а вообще чтоб такого не происходило необходима конструкция
Код

try 
  создать объект
finally // выполниться даже при вылетании эксепшена
  убить объект
end;


Добавлено через 9 минут и 44 секунды
ты в своем примере используешь ADODataSetSource
это я полагаю DataSet в который отобраны данные для экспорта

можешь использовать его же
тогда в моем коде все места ADOQuery1 замени на ADODataSetSource

видимо надо с нуля:
  •  Создаешь новый проект
  •  Кидаешь на него свой ADODataSetSource и видимо ADOConnetion 
  •  Гглянь как эти компоненты в твоем проекте были настроены и настрой здесь так же.
  •  Кидаешь кнопку Button1
  •  Двойной клик по кнопке - попадаем в процедуру нажатия кнопки
    там пишем мой код
  •  F9
  •  Жми Button1.



--------------------
Испытание чужого терпения можно считать успешным, если оно лопнуло...
PM MAIL   Вверх
Yantarik
Дата 17.8.2007, 14:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 53
Регистрация: 8.8.2007
Где: г.Москва

Репутация: 1
Всего: 1



Цитата(pseud @  17.8.2007,  13:46 Найти цитируемый пост)
какой метод используешь?

Эта ошибка возникает при моем методе. Подвисшего екселя нет.

Цитата(pseud @  17.8.2007,  13:46 Найти цитируемый пост)
создать объект
finally // выполниться даже при вылетании эксепшена
  убить объект

Что за объект? и почему его потом убить?
PM MAIL   Вверх
Yantarik
Дата 17.8.2007, 14:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 53
Регистрация: 8.8.2007
Где: г.Москва

Репутация: 1
Всего: 1



Цитата(pseud @  17.8.2007,  13:46 Найти цитируемый пост)
Кидаешь на него

Ты, наверное повесишься, но я не знаю, как это делается smile))))

Я изучала Паскаль, в Дельфи делала только то, что руками пишется(как в Паскале) и все визуальные возможности я только потихоньку узнаю и радуюсь. smile)))
Если, конечно, понимаю как это работает и чем мне в этом плюс smile)))

PM MAIL   Вверх
pseud
Дата 17.8.2007, 15:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Экспёрт Тыдыщ
***


Профиль
Группа: Завсегдатай
Сообщений: 1175
Регистрация: 18.5.2007
Где: Минск, Беларусь

Репутация: 16
Всего: 40



 :(
найди хоть какую-нить книгу по дельфи, хоть по дельфи 1 и немножко полистай, а лучше множко
ну или в инете
побросай компонентики, пожмякай их
таким основам я не возьмусь обучать
не осилю

раз у вас на работе дельфи, то должен найтись человек, который сможет тебе основы преподать


--------------------
Испытание чужого терпения можно считать успешным, если оно лопнуло...
PM MAIL   Вверх
Yantarik
Дата 20.8.2007, 16:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 53
Регистрация: 8.8.2007
Где: г.Москва

Репутация: 1
Всего: 1



Знать Дельфи и преродать(=объяснить) - это ж разные вещи. smile)))
Да и я не все понимаю. Книг тоже много, но я пока не нашла не одной, которая мне была бы понятна smile 
Может это у меня мохг как-то не так устроен? smile)))

Ладно, с основами я как-нибудь сама. Потихоньку...

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

PM MAIL   Вверх
pseud
Дата 20.8.2007, 18:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Экспёрт Тыдыщ
***


Профиль
Группа: Завсегдатай
Сообщений: 1175
Регистрация: 18.5.2007
Где: Минск, Беларусь

Репутация: 16
Всего: 40



Цитата(Yantarik @  20.8.2007,  16:03 Найти цитируемый пост)
А что за пустое окно выскакивает при выполнении твоей программы? откуда оно? 


при создании нового проекта в дельфи, автоматом создается одна форма TForm1
поэтому при запуске проекта (F9) ты ее и увидишь
на нее и надо кинуть ту самую кнопочку

настоятельно рекомендую найти книгу по дельфи, что-то типа "Для чайников" "За Х дней"
В них обычно не очень-то с толковостью, но хотя бы поймешь, как простой проект накидать
А вообще рекомендую авторов Стив Тейксейра и Ксавье Пачеко



--------------------
Испытание чужого терпения можно считать успешным, если оно лопнуло...
PM MAIL   Вверх
SergeBS
Дата 21.8.2007, 08:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1111
Регистрация: 10.6.2005
Где: Владимир

Репутация: 11
Всего: 22



Yantarik
Как на форму кидать кнопки - читай у Фленова "Библия Делфи"  Там кроме этого ничего нет, так что не запутаешься. Лучше тащи электронный вариант, чтобы через 1-2 месяца не стало жаль денег. DJVU - 3 MB, PDF - 10 MB. И не читай околотеоретических рассуждений насчет машинной логики и т.п. - помимо неточностей там еще и ошибки есть. По части теории автор либо слаб, либо косноязычен.
На форуме есть раздел по компьютерной литературе. Там полно ссылок на любой вкус.

Цитата
А вообще рекомендую авторов Стив Тейксейра и Ксавье Пачеко

Весьма забористое чтиво. В смысле грамотно подают материал, причем более серьезный чем "кнопка на форме". Признанные гуру по Делфи (как Круглински по VC++). Но для начинающих - тяжеловата: при чтении надо понимать, а не запоминать как набор рецептов.


Константы Excel - ищешь в каталоге Дельфи excel*.pas и смотришь. Группировка и названия достаточно понятны. В ссылке, что я дал - ИСЧЕРПЫВАЮЩИЕ объяснения как работать с excel - 39 статей. Со всеми твоими нынешними и будущими задачами на эту тему. И много всякого другого. 5000  статей. В DRKB - тоже 18 статей есть по excel. Не вижу в чем проблема.

PM MAIL   Вверх
Yantarik
Дата 22.8.2007, 11:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 53
Регистрация: 8.8.2007
Где: г.Москва

Репутация: 1
Всего: 1



SergeBS,  при скачивании "Библии Дельфи" на одном из указанных сайтов антивирусник ругается на какой-то U.exe. 
На других что-то я его не нашла :(

Добавлено через 6 минут и 34 секунды
pseud, в твоем коде есть RecordCount - вроде как количество строк.
Как это работает? 
И если это действительно количество строк, то по какой причине может быть такое:
у меня оно равно 50, а строк 80.000 с копейками. (может ли это быть из-за ограничения строк Excel-я? (у него на листе должно быть не больше 35.000 с копейками. А т.к. больше то программа берет какое-то значение, вбитое поумочанию)
PM MAIL   Вверх
pseud
Дата 22.8.2007, 11:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Экспёрт Тыдыщ
***


Профиль
Группа: Завсегдатай
Сообщений: 1175
Регистрация: 18.5.2007
Где: Минск, Беларусь

Репутация: 16
Всего: 40



ADOQuery1.RecordCount

возвращает количество строк отобранных в твой набор ADOQuery1
если ты знаешь, что их там 80.000, а тебе возвращает 50, то могу лишь предположить, что строки где-то буферизуются и тебе просто возвращается количество строк на текущей "странице" выборки.



--------------------
Испытание чужого терпения можно считать успешным, если оно лопнуло...
PM MAIL   Вверх
Yantarik
Дата 22.8.2007, 13:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 53
Регистрация: 8.8.2007
Где: г.Москва

Репутация: 1
Всего: 1



Цитата(pseud @  22.8.2007,  11:43 Найти цитируемый пост)
что строки где-то буферизуются

Оказалось, что в свойствах стояло в MaxRecords  число 50.
PM MAIL   Вверх
Yantarik
Дата 22.8.2007, 15:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 53
Регистрация: 8.8.2007
Где: г.Москва

Репутация: 1
Всего: 1



Так, у меня новая ошибка(наверное, ее надо отдельной темой)
Опять же в том же выводе в Excel появляется:
"OLE error 800A03EC"
И из-за нее выводятся не все данные. (из 2196 строк только 1908).

Что значит сие?

PM MAIL   Вверх
pseud
Дата 22.8.2007, 15:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Экспёрт Тыдыщ
***


Профиль
Группа: Завсегдатай
Сообщений: 1175
Регистрация: 18.5.2007
Где: Минск, Беларусь

Репутация: 16
Всего: 40



надо бы определить в каком месте ошибка

попробуем отловить
зайди в процедуру экспорта
стань на первую команду и нажми F5 - получишь красную полосу (место где прога остановится и буде ждать от тебя дальнейших действий)
запусти проект F9
при попадании в процедуру Дельфи тебя выкинет в код 
далее жмякай F8 - это пошаговое выполнение команд
цель - определить какая конкретно команда вызывает эту ошибку


--------------------
Испытание чужого терпения можно считать успешным, если оно лопнуло...
PM MAIL   Вверх
Yantarik
Дата 23.8.2007, 13:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 53
Регистрация: 8.8.2007
Где: г.Москва

Репутация: 1
Всего: 1



Цитата(pseud @  22.8.2007,  15:27 Найти цитируемый пост)
надо бы определить в каком месте ошибка

Разобралась.
Я посмотрела в excel'е на какой строке останавливается, нашла эту строку через Enterprise Manager, там в этой строке в одной из ячеек стоит: <Long Text>. А оно скорей всего обозначается каким-то спецсимволом, на который и ругается программа. (На этой ячейке и вылетает)
PM MAIL   Вверх
Страницы: (3) [Все] 1 2 3 
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Базы данных и репортинг"
Vit
Петрович

Запрещено:

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами


Обязательно указание:

1. Базы данных (Paradox, Oracle и т.п.)

2. Способа доступа (ADO, BDE и т.д.)


  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи
  • Вопросы по SQL и вопросы по базам данных не связанные с Дельфи задавать здесь

FAQ раздела лежит здесь!


Если Вам помогли и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, Vit, Петрович.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Базы данных и репортинг | Следующая тема »


 




[ Время генерации скрипта: 0.1535 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.