Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 03.11.2013, 16:49   #1
8tomat8
Пользователь
 
Регистрация: 14.09.2013
Сообщений: 46
По умолчанию ADOQuery массив (Delphi)

У меня есть 10 созданных ADOQuery. Каждой из них я в окне "Properties" прописал часть SQL запроса, остальная часть добавляется вручную в зависимости от параметров.
Я хочу как-то реализовать цикл который сам будет идти по каждой квере по очереди и делать необходимые задания. Но поскольку с массивами знаком плохо, то не выходит.

Вот собственно код:
Код:
unit Main;

interface

uses
  Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
  Vcl.Controls, Vcl.Forms, Vcl.Dialogs, ComObj, Data.DB, Data.Win.ADODB,
  Vcl.StdCtrls, Vcl.ExtCtrls, Vcl.ComCtrls;

type
  TForm1 = class(TForm)
    ADOConnection1: TADOConnection;
    //Query1: TADOQuery;
    Button1: TButton;
    Label1: TLabel;
    //Query2: TADOQuery;
    //Query3: TADOQuery;
    //Query10: TADOQuery;
    //Query4: TADOQuery;
    //Query5: TADOQuery;
    //Query6: TADOQuery;
    //Query7: TADOQuery;
    //Query8: TADOQuery;
    //Query9: TADOQuery;
    Label2: TLabel;
    Label3: TLabel;
    Date1: TDateTimePicker;
    Date2: TDateTimePicker;
    StaticText1: TStaticText;
    StaticText2: TStaticText;
    procedure Button1Click(Sender: TObject);
  private
     Query: array [1..10] of TADOQuery;
  public
    { Public declarations }
  end;

var
  Form1: TForm1;
  i: integer;

implementation

{$R *.dfm}



procedure TForm1.Button1Click(Sender: TObject);
var XL,Sheet: Variant;
j: integer;
Col: integer;
s, po : string;
Where: string;
begin
Label2.Caption:=(TimeToStr(Time));
s:= formatdatetime('dd-mm-yyyy', Date1.Date);
po:= formatdatetime('dd-mm-yyyy', Date2.Date);
Where:='WHERE TCL_FIC_PER_V_.FCOD='+char(39)+'1'+char(39)+' AND FOP_DATE >= '+char(39)+s+char(39)+' AND FOP_DATE <= '
+char(39)+po+char(39)+' AND FEND_FILE = '+char(39)+''+char(39)+' AND (TCL_FIC_NMK_.FCOD LIKE '+char(39)+'316%'+char(39)+' and 
(FOP_DATE BETWEEN '+char(39)+'20121001'+char(39)+' AND '+char(39)+'20131130'+char(39)+'))';
Query[1].Close;
Query[1].SQL.Add(Where);
Query[1].Open;
XL:= CreateOleObject('Excel.Application');
XL.Workbooks.Open('C:\template.xlsx',0,True);
i:= 2;
Sheet:= XL.ActiveWorkBook.Sheets[1];
Query[1].First;
Col := Query[1].FieldCount;
while not Query[1].Eof do
begin
for j := 1 to Col do
begin
Sheet.Cells[i,j]:= Query[1].Fields[j-1].AsString;
end;
inc(i);
Query[1].Next;
Label1.Caption:=IntToStr(i-1);
end;
Label3.Caption:=(TimeTostr(Time));
XL.Visible:= true;
XL.ActiveWorkbook.SaveAS('C:\TestBook1.xlsx');
Sheet:= UnAssigned;
XL:= UnAssigned;
end;

end.

PS Вопрос равно ли Query[1].SQL.Add(); этому Query1.SQL.Add(); ?

Последний раз редактировалось 8tomat8; 03.11.2013 в 17:11.
8tomat8 вне форума Ответить с цитированием
Старый 03.11.2013, 17:33   #2
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
равно ли Query[1].SQL.Add(); этому Query1.SQL.Add(); ?
Объекты не равны.
Методы равны.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 03.11.2013, 17:40   #3
8tomat8
Пользователь
 
Регистрация: 14.09.2013
Сообщений: 46
По умолчанию

Цитата:
Сообщение от Stilet Посмотреть сообщение
Объекты не равны.
Методы равны.
А почему тогда выдает ошибку
Код:
First chance exception at $000007FEFDAF940D. Exception class EClassNotFound with message 'Class TADOQuery not found'. Process export.exe (5276)
8tomat8 вне форума Ответить с цитированием
Старый 03.11.2013, 17:45   #4
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

Потому что объекты кроме всего прочего ещё и создавать нужно, а не просто в переменной описывать
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 03.11.2013, 17:47   #5
8tomat8
Пользователь
 
Регистрация: 14.09.2013
Сообщений: 46
По умолчанию

Цитата:
Сообщение от Аватар Посмотреть сообщение
Потому что объекты кроме всего прочего ещё и создавать нужно, а не просто в переменной описывать
А можете пример написать. А то я не очень понял что имеется в виду)))
8tomat8 вне форума Ответить с цитированием
Старый 03.11.2013, 17:47   #6
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Наведи курсор мышки на TADOQuery и посмотри что она тебе напишет. В каком модуле это в твоей Делфи описано.
Да и потом, на какой строке ошибка вылетает?
Насчет создания:
Код:
Query[1]:=TAdoQuery.create(nil);
Query[1].Connection:=ADOConnection1;
...
Query[1].free;
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 03.11.2013, 17:58   #7
8tomat8
Пользователь
 
Регистрация: 14.09.2013
Сообщений: 46
По умолчанию

Цитата:
Сообщение от Stilet Посмотреть сообщение
Наведи курсор мышки на TADOQuery и посмотри что она тебе напишет. В каком модуле это в твоей Делфи описано.
Да и потом, на какой строке ошибка вылетает?
Насчет создания:
Код:
Query[1]:=TAdoQuery.create(nil);
Query[1].Connection:=ADOConnection1;
...
Query[1].free;
Если навести то пишет
Код:
TADOQuery -Data.Win.ADODB.TADOQuery
Ошибку выдает на последней строке
Код:
begin
  // Set flag that TCustomForm constructor can read, so it knows if it's being
  // created as a main form or not (required when MainFormOnTaskbar is True)
  FCreatingMainForm := (FMainForm = nil) and InstanceClass.InheritsFrom(TForm);
  Instance := nil;
  try
{$IF DEFINED(CLR)}
    Instance := InstanceClass.Create(Self);
    Reference := Instance;
{$ELSE}
    Instance := TComponent(InstanceClass.NewInstance);
    TComponent(Reference) := Instance;
    try
      Instance.Create(Self);
А если я создаю так переменную, то сохраняется то что я прописал ей в окне "Parametrs"?

PS Сейчас код выглядит вот так
Код:
procedure TForm1.Button1Click(Sender: TObject);
var XL,Sheet: Variant;
j: integer;
Col: integer;
s, po : string;
Where: string;
begin
Label2.Caption:=(TimeToStr(Time));
s:= formatdatetime('dd-mm-yyyy', Date1.Date);
po:= formatdatetime('dd-mm-yyyy', Date2.Date);
Where:='WHERE TCL_FIC_PER_V_.FCOD='+char(39)+'прибуття'+char(39)
      +' AND FOP_DATE >= '+char(39)+s+char(39)+' AND FOP_DATE <= '+char(39)
      +po+char(39)+' AND FEND_FILE = '+char(39)+''+char(39)
      +' AND (TCL_FIC_NMK_.FCOD LIKE '+char(39)+'316%'+char(39)
      +' and (FOP_DATE BETWEEN '+char(39)+'20121001'+char(39)
      +' AND '+char(39)+'20131130'+char(39)+'))';
Query[1]:=TADOQuery.Create(nil);
Query[1].Connection:=ADOConnection1;
Query[1].Close;
Query[1].SQL.Add(Where);
Query[1].Open;
XL:= CreateOleObject('Excel.Application');
XL.Workbooks.Open('C:\template.xlsx',0,True);
i:= 2;
Sheet:= XL.ActiveWorkBook.Sheets[1];
Query[1].First;
Col := Query[1].FieldCount;
while not Query[1].Eof do
begin
for j := 1 to Col do
begin
Sheet.Cells[i,j]:= Query[1].Fields[j-1].AsString;
end;
inc(i);
Query[1].Next;
Label1.Caption:=IntToStr(i-1);
end;
Label3.Caption:=(TimeTostr(Time));
XL.Visible:= true;
XL.ActiveWorkbook.SaveAS('C:\TestBook1.xlsx');
Sheet:= UnAssigned;
XL:= UnAssigned;
end;
8tomat8 вне форума Ответить с цитированием
Старый 03.11.2013, 19:31   #8
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
Ошибку выдает на последней строке
Это говорит что ты зря заремил те Кверики. Они сами по себе связаны с формой, а ты связь нарушил. Нельзя так делать. Убрал в коде - убери и на форме.
Цитата:
сохраняется то что я прописал ей в окне "Parametrs"?
Нет. Созданная в коде переменная во время работы не имеет отношения к настройкам во время дизайна.
Обьясни на словах что ты этим добиваешься.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 03.11.2013, 19:53   #9
eval
Подтвердите свой е-майл
 
Регистрация: 29.08.2012
Сообщений: 4,011
По умолчанию

так естественно не будет работать, 10 кверей мало, надо штук 20 как минимум сделать, тогда и код не надо будет, все само заработает
eval вне форума Ответить с цитированием
Старый 03.11.2013, 20:44   #10
8tomat8
Пользователь
 
Регистрация: 14.09.2013
Сообщений: 46
По умолчанию

Цитата:
Сообщение от Stilet Посмотреть сообщение
Это говорит что ты зря заремил те Кверики. Они сами по себе связаны с формой, а ты связь нарушил. Нельзя так делать. Убрал в коде - убери и на форме.

Нет. Созданная в коде переменная во время работы не имеет отношения к настройкам во время дизайна.
Обьясни на словах что ты этим добиваешься.
Есть 10 разных отчетов с разным SELECT. И надо их делать для кучи пользователей. Но условие WHERE для каждого - свое. Создаю 1 файл ексель, на каждый из 10 листов кладу по отчету и сохраняю в определенную папку. Всё.
8tomat8 вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
ADOQuery, Delphi Антон Лысенко Помощь студентам 2 24.11.2012 23:04
COmboBox Items from ADOQuery Delphi 7 detalik Компоненты Delphi 3 04.05.2011 20:38
DElphi 7 Инструкция по работе с ADOQuery? insense Помощь студентам 1 01.07.2010 15:27
[delphi] ADOQuery Проблема sPan4eZ БД в Delphi 14 17.09.2009 15:44
Помогите с запросом ADOQuery в Delphi 7 Wolverine БД в Delphi 21 25.05.2009 15:03