PDA

View Full Version : کند اجرا شدن کوئری محاسباتی



safa.net
یک شنبه 19 شهریور 1396, 18:06 عصر
با سلام، لطفا دوستانی که برنامه حسابداری کار کردن راهنمایی بفرمایند.
مشکل در گزارش گیری از فاکتورهای فروش برای بازه تاریخی کل سال بوجود میاد یعنی وقتی که کاربر روی این گزارش باشه و تعداد فاکتور ها بالای هزار تا باشه این مشکل بوجود میاد که صفحه کلا سیاه میشه.
سناریو پیاده سازی هم به شکل زیر است :
جدول Invoices که در آن فیلدهای مربوط به اطلاعات کلی فاکتور مثل شماره، تاریخ و... نگهداری میشه
جدول sells که اطلاعات مربوط به فروش ها در اون نگهداری میشه مثل نوع کالا، تعداد، قیمت و...
بین دو جدول هم یک کلید خارجی تعریف شده که با هم ارتباط دارند.

کدهای زیر دکمه جستجو به صورت زیر می باشند :
Connection cn = new Connection(); SqlCommand cmd = new SqlCommand("Select * from Invoices where invoice_date between '" + mskDate1.Text + "' and '" + mskDate2.Text + "'", cn.GetConnection());
cn.Open();
DataSet ds = new DataSet();
SqlDataAdapter adapter = new SqlDataAdapter(cmd);
adapter.Fill(ds, "Acc");
DataTable dtContact = ds.Tables[0];
dgv.DataSource = dtContact;
cmd.Dispose();
cn.Close();
if (first)
{
SetGridView();
first= false;
SettxtTotal();
SetRemain();

}
CalcTotal();

البته تابع آخر هم کدهاش در زیر هست:


foreach (DataGridViewRow row in dgv.Rows)
{
long total = 0;
int invId = Convert.ToInt32(row.Cells["invoice_id"].Value);
Connection cn = new Connection();
SqlCommand cmd = new SqlCommand("Select sell_price,qty,discount,tax from sells where invoice_id = " + invId + "", cn.GetConnection());
cn.Open();
SqlDataReader dat;
dat = cmd.ExecuteReader();
while (dat.Read())
{
long tmpTax = Convert.ToInt64(dat["tax"]);
long tmpDis = Convert.ToInt64(dat["discount"]);
long qty = Convert.ToInt64(dat["qty"]);
long price = Convert.ToInt64(dat["sell_price"]);
long tmpTotal = Convert.ToInt64(qty * price - tmpDis + tmpTax);
total += tmpTotal;
}
dat.Close();


row.Cells["txtTotal"].Value = total;
long tempRemain = total - Convert.ToInt64(row.Cells["pay"].Value);
row.Cells["txtRemain"].Value = tempRemain;



}


دوستان یادم رفت بگم این قطعه کد آخر که فکر میکنم علت کند شدن اجرا میشه برای اینه که مبالغ قابل پرداخت و مانده هر فاکتور رو روی دیتاگرید نمایش بدیم چون در جدول ذخیره نمیکنیم باید اونهارو محاسبه کنیم.

مواردی که نیاز دارم اینه که کاربر بعد از وارد کردن بازه تاریخ باید در گرید اطلاعات زیر رو ببینه :
دکمه ویرایش - چاپ - کد - شماره فاکتور - تاریخ - دریافتی - توضیحات - قابل پرداخت - مانده
اسکرییپت جدول فاکتورها :
.
USE [Acc]
GO


SET ANSI_NULLS ON
GO


SET QUOTED_IDENTIFIER ON
GO


CREATE TABLE [dbo].[Invoices](
[invoice_id] [int] IDENTITY(1100,1) NOT NULL,
[Serial] [bigint] NULL,
[buyer_id] [int] NOT NULL,
[invoice_date] [nchar](10) NULL,
[pay] [bigint] NOT NULL,
[comment] [nvarchar](max) NULL,
CONSTRAINT [PK_Invoices] PRIMARY KEY CLUSTERED
(
[invoice_id] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY]


GO


ALTER TABLE [dbo].[Invoices] WITH CHECK ADD CONSTRAINT [FK_Invoices_Buyers] FOREIGN KEY([buyer_id])
REFERENCES [dbo].[Buyers] ([buyer_id])
ON UPDATE CASCADE
ON DELETE CASCADE
GO


ALTER TABLE [dbo].[Invoices] CHECK CONSTRAINT [FK_Invoices_Buyers]
GO

اسکریپت اطلاعات فاکتورها:

USE [Acc]
GO


SET ANSI_NULLS ON
GO


SET QUOTED_IDENTIFIER ON
GO


CREATE TABLE [dbo].[sells](
[sell_id] [bigint] IDENTITY(1,1) NOT NULL,
[object_id] [int] NOT NULL,
[sell_price] [bigint] NOT NULL,
[qty] [float] NOT NULL,
[discount] [bigint] NOT NULL,
[tax] [bigint] NOT NULL,
[invoice_id] [int] NOT NULL,

CONSTRAINT [PK_sells] PRIMARY KEY CLUSTERED
(
[sell_id] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY]

GO

Mahmoud.Afrad
یک شنبه 19 شهریور 1396, 20:10 عصر
یک join ساده نیاز هست
Select
Invoices.invoice_id,
Invoices.invoice_date,
Invoices.buyer_id,
Invoices.pay,
SUM(sells.sell_price*sells.qty - discount + tax) as Total,
SUM(sells.sell_price*sells.qty - discount + tax)-Invoices.pay as Remain
from Invoices
join sells on Invoices.Invoice_id = sells.Invoice_id
where invoice_date between '1396/06/01' and '1396/06/31'
group by Invoices.invoice_id,
Invoices.invoice_date,
Invoices.buyer_id,
Invoices.pay

safa.net
سه شنبه 21 شهریور 1396, 18:28 عصر
یک join ساده نیاز هست
Select
Invoices.invoice_id,
Invoices.invoice_date,
Invoices.buyer_id,
Invoices.pay,
SUM(sells.sell_price*sells.qty - discount + tax) as Total,
SUM(sells.sell_price*sells.qty - discount + tax)-Invoices.pay as Remain
from Invoices
join sells on Invoices.Invoice_id = sells.Invoice_id
where invoice_date between '1396/06/01' and '1396/06/31'
group by Invoices.invoice_id,
Invoices.invoice_date,
Invoices.buyer_id,
Invoices.pay
ممنون از اینکه وقت گذاشتین. لطفا راهنمایی کنید چطور این کد رو با دیتاگرید خودم نشون بدم. تشکر