Загрузка данных


// МОДУЛЬ 3 (форма2)
//---------------------------------------------------------------------------

#include <vcl.h>
#pragma hdrstop
#include "Unit1.h"
#include "Unit2.h"
#include "Unit3.h"
#include "Unit4.h"
#include <Vcl.Imaging.pngimage.hpp>
#include <Vcl.Imaging.jpeg.hpp>
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TfrmMain *frmMain;

void TfrmMain::LoadProducts()
{
String sql = "SELECT * FROM Products p "
"JOIN Categories c ON p.Category_ID = c.Category_ID "
"JOIN Manufacturers m ON p.Manufacturer_ID = m.Manufacturer_ID "
"JOIN Suppliers s ON p.Supplier_ID = s.Supplier_ID WHERE 1=1 ";
if (edtSearch->Text != "")
sql += "AND (p.ProductName LIKE '%" + edtSearch->Text + "%' "
"OR p.Description LIKE '%" + edtSearch->Text + "%' "
"OR c.CategoryName LIKE '%" + edtSearch->Text + "%' "
"OR m.ManufacturerName LIKE '%" + edtSearch->Text + "%') ";
if (cmbSupplier->ItemIndex > 0)
sql += "AND s.SupplierName = '" + cmbSupplier->Text + "' ";
if (cmbSort->ItemIndex == 1) sql += "ORDER BY p.StockQuantity ASC";
else if (cmbSort->ItemIndex == 2) sql += "ORDER BY p.StockQuantity DESC";
qProducts->Close();
qProducts->SQL->Text = sql;
qProducts->Open();
}


//---------------------------------------------------------------------------
__fastcall TfrmMain::TfrmMain(TComponent* Owner)
	: TForm(Owner)
{
}
//---------------------------------------------------------------------------
void __fastcall TfrmMain::FormShow(TObject *Sender)
{
Caption = "Список товаров - " + userFio;
	TADOQuery *q = new TADOQuery(NULL);
	q->Connection = frmLogin->ADOConnection1;
	bool isAdmin = (userRole == 1);
	bool isManager = (userRole == 2);
	bool isClient = (userRole == 3);
	bool isGuest = (userRole == 0);
	Panel2->Visible = (isAdmin || isManager);
btnAdd->Visible = isAdmin;
btnDelete->Visible = isAdmin;
btnEdit->Visible = isAdmin;
	if (isAdmin || isManager) {
		cmbSupplier->Items->Clear();
		cmbSupplier->Items->Add("Все поставщики");
		q->SQL->Text = "SELECT SupplierName FROM Suppliers";
		q->Open();
		while (!q->Eof) {
			cmbSupplier->Items->Add(q->Fields->Fields[0]->AsString);
			q->Next();
		}
		q->Close();
		cmbSupplier->ItemIndex = 0;
        cmbSort->ItemIndex = 0;
    }
    delete q;
	LoadProducts();
}
//---------------------------------------------------------------------------

void __fastcall TfrmMain::FormClose(TObject *Sender, TCloseAction &Action)
{
qProducts->Close();
}
//---------------------------------------------------------------------------

void __fastcall TfrmMain::btnExitClick(TObject *Sender)
{
frmLogin->Show();
Close();
}
//---------------------------------------------------------------------------

void __fastcall TfrmMain::dbgProductsDrawColumnCell(TObject *Sender, const TRect &Rect,
          int DataCol, TColumn *Column, TGridDrawState State)
{
TCanvas *c = dbgProducts->Canvas;
double disc = qProducts->FieldByName("DiscountPrice")->AsFloat;
int stock = qProducts->FieldByName("StockQuantity")->AsInteger;
if (stock == 0) c->Brush->Color = (TColor)0xFFAAAA;
else if (disc > 15) c->Brush->Color = (TColor)0x578B2E;
else c->Brush->Color = clWhite;
c->FillRect(Rect);
if (Column->FieldName == "Price" && disc > 0)
{
double p = qProducts->FieldByName("Price")->AsFloat;
c->Font->Color = clRed;
c->Font->Style = TFontStyles() << fsStrikeOut;
c->TextOut(Rect.Left + 2, Rect.Top + 2, FormatFloat("0.00", p));
c->Font->Color = clBlack;
c->Font->Style = TFontStyles();
c->TextOut(Rect.Left + 55, Rect.Top + 2, FormatFloat("0.00", p * (100 - disc) / 100));
}
else { c->Font->Color = clBlack; c->TextOut(Rect.Left + 2, Rect.Top + 2, Column->Field->AsString); }

}
//---------------------------------------------------------------------------

void __fastcall TfrmMain::dbgProductsCellClick(TColumn *Column)
{
if (qProducts->IsEmpty()) return;

    String photoPath = qProducts->FieldByName("PhotoPath")->AsString;
    if (photoPath != "" && FileExists(photoPath))
  imgProduct->Picture->LoadFromFile(photoPath);
 else
  imgProduct->Picture->LoadFromFile("picture.png");
}
//---------------------------------------------------------------------------

void __fastcall TfrmMain::edtSearchChange(TObject *Sender)
{
LoadProducts();
}
//---------------------------------------------------------------------------

void __fastcall TfrmMain::cmbSortChange(TObject *Sender)
{
LoadProducts();
}
//---------------------------------------------------------------------------

void __fastcall TfrmMain::cmbSupplierChange(TObject *Sender)
{
LoadProducts();
}
//---------------------------------------------------------------------------

void __fastcall TfrmMain::btnAddClick(TObject *Sender)
{
frmEdit = new TfrmEdit(NULL);
frmEdit->isEdit = false;
frmEdit->ShowModal();
delete frmEdit;
LoadProducts();
}
//---------------------------------------------------------------------------

void __fastcall TfrmMain::btnDeleteClick(TObject *Sender)
{
if (qProducts->IsEmpty()) return;
int id = qProducts->FieldByName("Product_ID")->AsInteger;
TADOQuery *q = new TADOQuery(NULL);
q->Connection = frmLogin->ADOConnection1;
q->SQL->Text = "SELECT COUNT(*) FROM OrderItems WHERE Product_ID = " + IntToStr(id);
q->Open();
if (q->Fields->Fields[0]->AsInteger > 0)
ShowMessage("Нельзя удалить товар, который есть в заказах!");
else if (MessageDlg("Удалить товар?", mtWarning, TMsgDlgButtons() << mbYes << mbNo, 0) == mrYes)
{
q->Close();
q->SQL->Text = "DELETE FROM Products WHERE Product_ID = " + IntToStr(id);
q->ExecSQL();
LoadProducts();
}
q->Close();
delete q;
}
//---------------------------------------------------------------------------

void __fastcall TfrmMain::btnEditClick(TObject *Sender)
{
if (userRole != 1) return;  // только администратор
	if (qProducts->IsEmpty()) {
		ShowMessage("Нет товара для редактирования!");
		return;
	}
	frmEdit = new TfrmEdit(NULL);
	frmEdit->isEdit = true;
	frmEdit->editId = qProducts->FieldByName("Product_ID")->AsInteger;
	frmEdit->ShowModal();
	delete frmEdit;
	LoadProducts();
}
//---------------------------------------------------------------------------

void __fastcall TfrmMain::btnOrdersClick(TObject *Sender)
{
frmOrders = new TfrmOrders(NULL);
frmOrders->userRole = userRole;
frmOrders->ShowModal();
delete frmOrders;
}
//---------------------------------------------------------------------------


// unit2.h

//---------------------------------------------------------------------------

#ifndef Unit2H
#define Unit2H
//---------------------------------------------------------------------------
#include <System.Classes.hpp>
#include <Vcl.Controls.hpp>
#include <Vcl.StdCtrls.hpp>
#include <Vcl.Forms.hpp>
#include <Data.DB.hpp>
#include <Data.Win.ADODB.hpp>
#include <Vcl.DBGrids.hpp>
#include <Vcl.ExtCtrls.hpp>
#include <Vcl.Grids.hpp>
#include <Vcl.Imaging.pngimage.hpp>
//---------------------------------------------------------------------------
class TfrmMain : public TForm
{
__published:	// IDE-managed Components
	TImage *imgLogo;
	TButton *btnExit;
	TADOQuery *qProducts;
	TDataSource *dsProducts;
	TDBGrid *dbgProducts;
	TPanel *Panel1;
	TImage *imgProduct;
	TPanel *Panel2;
	TEdit *edtSearch;
	TComboBox *cmbSort;
	TComboBox *cmbSupplier;
	TButton *btnAdd;
	TButton *btnDelete;
	TButton *btnEdit;
	TButton *btnOrders;
	void __fastcall FormShow(TObject *Sender);
	void __fastcall FormClose(TObject *Sender, TCloseAction &Action);
	void __fastcall btnExitClick(TObject *Sender);
	void __fastcall dbgProductsDrawColumnCell(TObject *Sender, const TRect &Rect, int DataCol,
          TColumn *Column, TGridDrawState State);
	void __fastcall dbgProductsCellClick(TColumn *Column);
	void __fastcall edtSearchChange(TObject *Sender);
	void __fastcall cmbSortChange(TObject *Sender);
	void __fastcall cmbSupplierChange(TObject *Sender);
	void __fastcall btnAddClick(TObject *Sender);
	void __fastcall btnDeleteClick(TObject *Sender);
	void __fastcall btnEditClick(TObject *Sender);
	void __fastcall btnOrdersClick(TObject *Sender);
private:	// User declarations
public:		// User declarations
	__fastcall TfrmMain(TComponent* Owner);
	int userId;
	int userRole;
	String userFio;
	void LoadProducts();
};
//---------------------------------------------------------------------------
extern PACKAGE TfrmMain *frmMain;
//---------------------------------------------------------------------------
#endif

// МОДУЛЬ 3 ФОРМА 3.
//---------------------------------------------------------------------------

#include <vcl.h>
#pragma hdrstop

#include "Unit3.h"
#include "Unit1.h"
#include "Unit2.h"
#include <JPEG.hpp>
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TfrmEdit *frmEdit;
//---------------------------------------------------------------------------
__fastcall TfrmEdit::TfrmEdit(TComponent* Owner)
	: TForm(Owner)
{
}

//---------------------------------------------------------------------------
void __fastcall TfrmEdit::FormShow(TObject *Sender)
{
if (isEdit)
{
Caption = "Редактирование товара";
TADOQuery *q = new TADOQuery(NULL);
q->Connection = frmLogin->ADOConnection1;
q->SQL->Text = "SELECT * FROM Products WHERE Product_ID = " + IntToStr(editId);
q->Open();
edtName->Text = q->FieldByName("ProductName")->AsString;
memDesc->Text = q->FieldByName("Description")->AsString;
edtPrice->Text = q->FieldByName("Price")->AsString;
edtUnit->Text = q->FieldByName("Unit")->AsString;
edtStock->Text = q->FieldByName("StockQuantity")->AsString;
edtDiscount->Text = q->FieldByName("DiscountPrice")->AsString;
oldPhoto = q->FieldByName("PhotoPath")->AsString;
cmbCategory->ItemIndex = q->FieldByName("Category_ID")->AsInteger - 1;
cmbManufacturer->ItemIndex = q->FieldByName("Manufacturer_ID")->AsInteger - 1;
cmbSuppliers->ItemIndex = q->FieldByName("Supplier_ID")->AsInteger - 1;
q->Close();
delete q;
if (oldPhoto != "" && FileExists(oldPhoto))
imgPreview->Picture->LoadFromFile(oldPhoto);
}
else Caption = "Добавление товара";

}
//---------------------------------------------------------------------------
void __fastcall TfrmEdit::btnLoadPhotoClick(TObject *Sender)
{
if (OpenDialog1->Execute())
imgPreview->Picture->LoadFromFile(OpenDialog1->FileName);
}
//---------------------------------------------------------------------------
void __fastcall TfrmEdit::btnSaveClick(TObject *Sender)
{
	if (edtId->Text == "") { ShowMessage("Введите ID товара!"); return; }
	if (edtName->Text == "") { ShowMessage("Введите наименование!"); return; }
    if (edtPrice->Text.ToDouble() < 0) { ShowMessage("Цена не может быть отрицательной!"); return; }
	if (edtStock->Text.ToInt() < 0) { ShowMessage("Количество не может быть отрицательным!"); return; }

	int id = edtId->Text.ToInt();
	int catId = cmbCategory->ItemIndex + 1;
    int manId = cmbManufacturer->ItemIndex + 1;
	int supId = cmbSuppliers->ItemIndex + 1;

    String photoPath = oldPhoto;

    // сохранение картинки
    if (OpenDialog1->FileName != "")
    {
        if (oldPhoto != "" && FileExists(oldPhoto))
            DeleteFile(oldPhoto);

        photoPath = ExtractFilePath(Application->ExeName) +
                    "img_" + IntToStr(id) + ".jpg";

        Graphics::TBitmap *bmp = new Graphics::TBitmap();
        bmp->Width = 300;
        bmp->Height = 200;
        bmp->Canvas->StretchDraw(Rect(0, 0, 300, 200), imgPreview->Picture->Graphic);

        TJPEGImage *jpg = new TJPEGImage();
        jpg->Assign(bmp);
        jpg->SaveToFile(photoPath);

        delete jpg;
        delete bmp;
    }

    TADOQuery *q = new TADOQuery(NULL);
    q->Connection = frmLogin->ADOConnection1;

    try
    {
        if (isEdit)
        {
            q->SQL->Text =
                "UPDATE Products SET "
                "ProductName = '" + edtName->Text + "', "
                "Description = '" + memDesc->Text + "', "
                "Price = " + edtPrice->Text + ", "
                "Unit = '" + edtUnit->Text + "', "
                "StockQuantity = " + edtStock->Text + ", "
                "DiscountPrice = " + edtDiscount->Text + ", "
                "PhotoPath = '" + photoPath + "', "
                "Category_ID = " + IntToStr(catId) + ", "
                "Manufacturer_ID = " + IntToStr(manId) + ", "
                "Supplier_ID = " + IntToStr(supId) +
                " WHERE Product_ID = " + IntToStr(id);
        }
        else
        {
            q->SQL->Text =
                "INSERT INTO Products "
                "(Product_ID, Arcticle, ProductName, Price, Unit, StockQuantity, DiscountPrice, Description, PhotoPath, Category_ID, Supplier_ID, Manufacturer_ID) "
                "VALUES ("
                + IntToStr(id) + ", "
                "'ART" + IntToStr(id) + "', '"
                + edtName->Text + "', "
                + edtPrice->Text + ", '"
                + edtUnit->Text + "', "
                + edtStock->Text + ", "
                + edtDiscount->Text + ", '"
				+ memDesc->Text + "', '"
                + photoPath + "', "
                + IntToStr(catId) + ", "
                + IntToStr(supId) + ", "
                + IntToStr(manId) + ")";
        }

        q->ExecSQL();
    }
    __finally
    {
        delete q;
    }

    Close();
}
//---------------------------------------------------------------------------
void __fastcall TfrmEdit::btnCancelClick(TObject *Sender)
{
Close();
}
//---------------------------------------------------------------------------
//unit3.h

//---------------------------------------------------------------------------

#ifndef Unit3H
#define Unit3H
//---------------------------------------------------------------------------
#include <System.Classes.hpp>
#include <Vcl.Controls.hpp>
#include <Vcl.StdCtrls.hpp>
#include <Vcl.Forms.hpp>
#include <Vcl.ExtCtrls.hpp>
#include <Data.DB.hpp>
#include <Data.Win.ADODB.hpp>
#include <Vcl.Dialogs.hpp>
//---------------------------------------------------------------------------
class TfrmEdit : public TForm
{
__published:	// IDE-managed Components
	TLabel *Label1;
	TLabel *Label2;
	TLabel *Label3;
	TLabel *Label4;
	TLabel *Label5;
	TLabel *Label6;
	TLabel *Label7;
	TLabel *Label8;
	TLabel *Label9;
	TLabel *Label10;
	TLabel *Label11;
	TEdit *edtId;
	TEdit *edtName;
	TComboBox *cmbCategory;
	TMemo *memDesc;
	TComboBox *cmbManufacturer;
	TComboBox *cmbSuppliers;
	TEdit *edtPrice;
	TEdit *edtStock;
	TEdit *edtUnit;
	TEdit *edtDiscount;
	TImage *imgPreview;
	TButton *btnSave;
	TButton *btnCancel;
	TButton *btnLoadPhoto;
	TOpenDialog *OpenDialog1;
	TADOQuery *qEdit;
	void __fastcall FormShow(TObject *Sender);
	void __fastcall btnLoadPhotoClick(TObject *Sender);
	void __fastcall btnSaveClick(TObject *Sender);
	void __fastcall btnCancelClick(TObject *Sender);
private:	// User declarations
public:		// User declarations
	__fastcall TfrmEdit(TComponent* Owner);
bool isEdit;
int editId;
String oldPhoto;


};
//---------------------------------------------------------------------------
extern PACKAGE TfrmEdit *frmEdit;
//---------------------------------------------------------------------------
#endif