case ComboBox1.ItemIndex of
0: sqlWhere:=sqlWhere+t5+' = '+Edit5.Text+');'; // рівне вказаному значенню
1: sqlWhere:=sqlWhere+t5+' > '+Edit5.Text+');'; // більше
2: sqlWhere:=sqlWhere+t5+' < '+Edit5.Text+');'; // менше
3: sqlWhere:=sqlWhere+t5+' between '+Edit5.Text+' and '+Edit12.Text+');'; // в інтервалі
end;
DataModule1.Query1.SQL.Add(sqlTable+sqlWhere);
DataModule1.Query1.Active:=True;
end;
Символ процента використовується в мові SQL драйвера MS ACCESS для вибору всіх значень з предикатом Like (наприклад like’a%’ поверне всі значення що починаються з букви а), тому по замовчуванні для Edit полів таблиці товар задамо значення Text = %, для поля «Ціна за одиницю товару” Text = 0, для Edit12, поля в якому вказуэться верхня межа по замовчуванны введемо Text = 1000. Запустимо програму і перейшовши на закладку “Запити” натиснемо кнопку з підказкою “Шукати записи по введених критеріях”, після чого натиснемо на кнопку для перегляду тексту запиту з підказкою “Показати текст виконаного запиту”, отримаємо наступне:
Аналогічно створимо на панелі інструментів кнопки, яким присвоїмо властивість Hint відповідно «Знищити записи, що задовільняють критеріям», «Створити нову таблицю на основі записів, що задовільняють критеріям», «Додати новий запис» і «Ввести запит самому», для яких введемо наступний текст обробки подій OnClick:
procedure TForm1.ToolButton4Click(Sender: TObject); // знищення записів
var sqlTable,sqlWhere: String;
begin
if MessageDlg('Ви впевненні що хочете знищити записи, що задовільняють введеним даним?',
mtConfirmation, [mbYes, mbNo], 0) = mrYes then
begin
DataModule1.Query1.SQL.Clear;
sqlTable:='Delete * ';
sqlWhere:='where ';
sqlTable:=sqlTable + 'from Товар ';
sqlWhere:=sqlWhere+'('+t1+' like '''+'%'+Edit1.Text+''') and ('+t2+' like '''+Edit2.Text+''') and ('+
t3+' like '''+Edit3.Text+''') and ('+t4+' like '''+Edit4.Text+''') and (';
case ComboBox1.ItemIndex of
0: sqlWhere:=sqlWhere+t5+' = '+Edit5.Text+');';
1: sqlWhere:=sqlWhere+t5+' > '+Edit5.Text+');';
2: sqlWhere:=sqlWhere+t5+' < '+Edit5.Text+');';
3: sqlWhere:=sqlWhere+t5+' between '+Edit5.Text+' and '+Edit12.Text+');';
end;
DataModule1.Query1.SQL.Add(sqlTable+sqlWhere);
DataModule1.Query1.ExecSQL;
end;
end;
procedure TForm1.ToolButton9Click(Sender: TObject); // додання записів
var sqlInsert: String;
begin
DataModule1.Query1.SQL.Clear;
sqlInsert:='Insert into Товар Values ('''+'%'+Edit1.Text+''','''+Edit2.Text+''','''+
Edit3.Text+''','''+Edit5.Text+''','''+Edit4.Text+''');';
DataModule1.Query1.SQL.Add(sqlInsert);
DataModule1.Query1.ExecSQL;
end;
procedure TForm1.ToolButton7Click(Sender: TObject); // створення нової таблиці
var TableName,sqlCreate:string;
begin
DataModule1.Query1.SQL.Clear;
TableName:=InputBox('Введіть ім''я нової таблиці','','');
sqlCreate:='Select * into '+TableName+' from Товар where ('+t1+' like '''+'%'+Edit1.Text+''') and ('+t2+' like '''+Edit2.Text+''') and ('+
t3+' like '''+Edit3.Text+''') and ('+t4+' like '''+Edit4.Text+''') and (';
case ComboBox1.ItemIndex of
0: sqlCreate:=sqlCreate+t5+' = '+Edit5.Text+');';
1: sqlCreate:=sqlCreate+t5+' > '+Edit5.Text+');';
2: sqlCreate:=sqlCreate+t5+' < '+Edit5.Text+');';
3: sqlCreate:=sqlCreate+t5+' between '+Edit5.Text+' and '+Edit12.Text+');';
end;
DataModule1.Query1.SQL.Add(sqlCreate);
DataModule1.Query1.ExecSQL;
DataModule1.Query1.SQL.Clear;
DataModule1.Query1.SQL.Add('Select * from '+TableName);
DataModule1.Query1.Active:=True;
end;
procedure TForm1.ToolButton11Click(Sender: TObject); // самостійне введення запиту
begin
with DataModule1.Query1 do
begin
SQL.Clear;
SQL.Add(InputBox('Введіть запит','',''));
Active:=True;
end;
end;
Наведемо приклад створення запиту з двох таблиць. Помістимо на GroupBox Edit9, ComboBox3 i дві компоненти SpeedButton. Одна з них буде використовувати нашу функцію з dll GetDate. Запит повинен вибирати за введеною датою товари з таблиці «Товар» на основі дати виписки рахунку з таблиці «Рахунок». В ComboBox введемо такі елементи для вибору: Рахунок.[Сума оплати], Товар.[Назва товару], Рахунок.[Дата проплати], які користувач може вибрати для вибору сортування результатів. Введемо наступний текст для обробки події OnClick для SpeedButton4 (вибір дати) і SpeedButton6 (вивід результатів запиту):
procedure TForm1.SpeedButton4Click(Sender: TObject);
begin
Edit9.Text:=DateToStr(GetDate);
end;
procedure TForm1.SpeedButton6Click(Sender: TObject);
var sqlStr: String; sDate: string; fRep:TReplaceFlags;
begin
if Edit9.Text='' then
begin
ShowMessage('Потрібно вибрати дату');
exit;
end;
sDate:=StringReplace(Edit9.Text,'.','/',fRep);
sDate:=StringReplace(sDate,'.','/',fRep);
DataModule1.Query1.SQL.Clear;
sqlStr:='Select Товар.[Назва товару],Товар.[Опис товару],[Партія товару].[Код рахунку],Рахунок.[Дата проплати],Рахунок.[Дата виписки],Рахунок.[Сума оплати] from Товар inner join ([Партія товару] inner join '+
'Рахунок on Рахунок.[Код рахунку]=[Партія товару].[Код рахунку]) on '+
'Товар.[Код товару]=[Партія товару].[Код товару] where Рахунок.[Дата виписки]=#'+sDate+'#';
if ComboBox3.Items[ComboBox3.ItemIndex]<>'' then sqlStr:=sqlStr+' Order By '+ComboBox3.Items[ComboBox3.ItemIndex];
sqlStr:=sqlStr+';';
DataModule1.Query1.SQL.Add(sqlStr);
DataModule1.Query1.Active:=True;
end;
Перейдемо до створення останньої закладки програми – “Звітність”, в якій проілюструємо роботу з QuickReports. Виберемо в меню опцію File Þ New, в вікні вибору натиснемо на піктограмці “Report”. Збережемо новий модуль, і заберемо його з опцій проекту, як форму що створюється автоматично. На нашу закладку звітність помістимо GroupBox, Сaption якого присвоїмо “Прайс лист товарів”. Помістимо на GroupBox кнопку «Перегляд і друк», події OnClick якої присвоїмо наступне:
procedure TForm1.SpeedButton7Click(Sender: TObject);
begin
Application.CreateForm(TQuickRPrice, QuickRPrice);
QuickRPrice.Preview;
QuickRPrice.Destroy;
end;
На цьому закінчимо розробку першого звіту. Помістимо на закладку звітність ще один GroupBox, який назвемо відомості про продаж товарів, і організуємо як складний звіт з деталізацією інформації з різних таблиць. Для кнопки «Перегляд і друк» звіту введемо такий текст програми:
procedure TForm1.SpeedButton9Click(Sender: TObject);
begin
DataModule1.Table1.MasterSource:=DataModule1.DataSource2;
DataModule1.Table1.MasterFields:='Код товару';
Application.CreateForm(TQuickRSum, QuickRSum);
QuickRSum.Preview;
QuickRSum.Destroy;
DataModule1.Table1.MasterSource:=nil;
DataModule1.Table1.MasterFields:='';
end;
Створимо новий Report, назвемо його QuickRSum, властивість DataSet присвоїмо DataModule1.Table1, з групи Bands присвоїмо значення True властивостям HasTitle, HasColumnHeader, HasDetail. Помістимо на Report QRBand i QRSubDetail. На розділ Title помістимо QRLabel “Відомості про продаж товарів”, на ColumnHeader QRLabel з назвами полів таблиці «Товар», на частину Detail QRDBText відповідно з властивостю DataSet DataModule1.Table1, a DataField з назвами відповідних полів таблиці. На частину GroupHeader помістимо назви полів таблиці “Рахунок”, відповідно на частину SubDetail QRDBText з DataSet = DataModule1.Table3, i DataFiled яких надамо назви полів таблиці “Рахунок”:
Викликавши контекстне меню правою кнопкою миші можна подивитись попередій перегляд звіту, але, наприклад, в нашому випадку, звіт буде відображатись неправильно в режимі розробки програми, тому що зв'язок між таблицями «Товар» і «Партія товару» ми встановлюємо під час роботи програми. Скомпілювавши і запустивши програму ми зможемо переглянути звіт в нормальному вигляді натиснувши кнопку «Перегляд і друк».