# Native Code > برنامه نویسی در Delphi > مباحث عمومی دلفی و پاسکال >  ساختن فاکتور

## sobhangh

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

----------


## skflower

سلام دوست عزیز. شما اول لطف بفرمایید و یکم بیشتر توضیح بدید تا بهتر جواب بگیرید. اینطوری که شما سوال کردید، در جواب باید بگم از یکی از ابزار گزارش سازی استفاده کنید. اما اگه بدونم مشکلتون چیه که زحماتتون به هدر میره، شاید بهتر بتونم و بتونیم کمکتون کنیم.
با تشکر

----------


## ar_mokhtari

در تاپيك وقتي چنين سوال كلي پرسيده ميشه هيچكسي نميتونه كمكي به شما كنه. لطفاً وقتي سوالي مطرح ميكنيد اول خودتون رو جاي پاسخ دهنده قرار بديد ببينيد اطلاعات براي پاسخ كافيست يا خير.
1- ورژن Delphi‌ شما؟
2- برنامه مورد نظر شما فقط فاكتور چاپ ميكنه يا قرار هست يك نرم‌افزار فروش بشه كه فاكتور هم جزئي از اون هست.
3- اگر جواب سوال دوم مثبت هست پيشنهاد شخصي من استفاده از بانك SqlServer هست.
4- اين كه ميخواهيد غير از چاپ بصورت فايل جداگانه هم خروجي داشته باشيد كار سختي نيست كافيست براي تهيه چاپ از نرم‌افزاري مثل FastReport استفاده كنيد. امكان ارسال گزارش در قالبهاي pdf-Excel-Word-Text براي شما فراهم ميشود. يا اينكه از كامپوننت ارسال به Excel و ... استفاده كنيد.
5- براي ساخت چنين برنامه‌اي شما بايد قيل از هرچيز سيستم كدينگ كالا رو تعريف كنيد. (براي چه صنفي؟ آيا براي فروش از روش شناسايي ويژه استفاده ميشود يا خير؟)

----------


## sobhangh

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

----------


## ar_mokhtari

براي شروع به ساخت فاكتور فروش كه فقط براي چاپ ازش استفاده بشه و به ديگر قسمتهاي يك سيستم فروش استاندارد اتصال نداشته باشد!!! (مثل موجودي اول دوره-رسيد كالا-حواله انبار- ...) شما احتياج به موارد زير خواهيد داشت(ميتونيد از Access هم استفاده كنيد):
1-تهيه فرم ورود اطلاعاتي و Table در DataBase به نام «مشتريان».
2-تهيه فرم ورود اطلاعاتي و Table در DataBase‌ به نام «كدينگ كالا».
3-تهيه فرم ورود اطلاعاتي و Table در DataBase به نام «فاكتور فروش» به مشخصات زير:
1-3) يك Table براي مشخصات كلي فاكتور شامل شماره(Uniq)، تاريخ، كد مشتري(Lookup به جدول مشتريان)، نوع فاكتور، روش پرداخت، دريافت كننده، قيمت كل و توضيحات فاكتور.
2-3) يك Table‌براي مشخصات اقلام هر فاكتور شامل شماره(Uniq)، شماره راهنماي اصلي فاكتور، كد كالا(Lookup به جدول كدينگ كالا)، تاريخ، تعداد، مقدار، في، قيمت كالا و توضيحات.
نكته: بين فيلدهاي شماره اصلي فاكتور در جدول 1-3 و شماره راهنماي اصلي فاكتور در جدول 2-3 بايد Relation برقرار كنيد كه هم شامل Update و هم شامل Delete بشود.
براي گزارش هم ميتوانيد از reportBuilder و يا FastReport استفاده بفرمائيد.
شما بسم الله رو بگو اگر موردي داشتي ما در خدمتيم.

----------


## sobhangh

سلام
توی ارتباط مشکل پیدا کردم.
من جدول 1-3 رابه جدول اول ارتباط دادم و ای باعث شد که توی فرم اصلی که قرار بود فاکتور نوشته بشه. نشه هیچکاری کرد.و فقط به درد نمایش بخوره. البته توی فرم آخر من هر چهار تا table را باز کردم که شاید مشکلش از همینجا باشه.
اگه می بینید بدون امتحان تمامی موارد ممکن دارم سوال می کنم بخاطر اینکه به زودی اینترنتم قطع می شه و من می خوام از شما اساتید استفاده کنم.
برای ارتباط هم از عنصر ado table استفاده کردم.
راستی فیلدی که با هم مرتبطشون کردم یک کلید از نوع auto number بوده.
و البته کدی که تاریخ کامپیوتر را برمی گردونه چیه.
و هرچیز دیگه ای که فکر می کنید من باید بدونم برای این کار چون این اولین تجربه ی من توی ارتباط دیتابیس هست و کارهای قبلی یک دیتابیس بیشتر نداشته و یا جدا بودن. امید وارم وقت کافی برای توضیح جامع داشته باشید.

----------


## asd_moghadas

سلام 
report vewer حلال مشکلات

----------


## ar_mokhtari

> من جدول 1-3 رابه جدول اول ارتباط دادم و ای باعث شد که توی فرم اصلی که قرار بود فاکتور نوشته بشه. نشه هیچکاری کرد


جدول اول؟ يعني جدول مشتريان؟ شما فقط بايد جدول اصلي فاكتور و جدول جزئيات آن را با يك فيلد مشترك به هم Relation كني.
فيلد نام مشتري را در فرم فاكتور بايد Lookup كني از Table مشتريان.



> البته توی فرم آخر من هر چهار تا table را باز کردم که شاید مشکلش از همینجا باشه.


توي فرم اصلي فاكتور فروش فقط بايد از Table اصلي فاكتور و Table جزئيات استفاده كني. (همزمان) كاربر بايد اول اطلاعات اصلي فاكتور و بعد جزئيات آن را (مثلاً در يك DbGrid) ورود اطلاعات كند. 
همونطور كه گفتم بايد كد كالا رو هم تحت يك فيلد Lookup از جدول كدينگ بخوني.



> برای ارتباط هم از عنصر ado table استفاده کردم.


از AdoQuery استفاده كنيد. (پيشنهاد شخصي من)

همچنين براي پركردن اطلاعات مشتريان و كدينگ كالا به دو فرم ورود اطلاعاتي نياز داري.(همونطور كه برات نوشتم).

ضمن اين كه جناب sobhangh عزيز، نوشتن اين پروژه زمان خاص خودش رو ميبره. چون ماهيتش يكي از اصليترين برنامه‌هاي معمول برنامه‌نويسان هست. با عجله به نتيجه نميرسيد.

----------


## sobhangh

سلام
با کمک های شما دارم به جاهایی می رسم اما نمی دونم چطوری Look up کنم. یعنی روش و کد و... درکل هیچی ازش نمی دونم.
تاحالا مشکل دیگه ای نبوده و فکر می کنم با فهمیدن این موضوع بتونم فاکتور تحویل بدم.

----------


## skflower

سلام دوست عزیز. من تو همین وبسایت مطالب جالبی راجع به فیلدهای Lookup دیدم. میتونید یه search کنید.
موفق باشید.

----------


## sara.mahdavi

با سلام :لبخند: 
دوستان من طبق این راهنمایی ها جداولم رو به هم متصل کردم 
ولی در قسمت 



> 2-3) يك Table‌براي مشخصات اقلام هر فاكتور شامل شماره(Uniq)، شماره  راهنماي اصلي فاكتور، كد كالا(Lookup به جدول كدينگ كالا)، تاريخ، تعداد،  مقدار، في، قيمت كالا و توضيحات.


نمیدونم چطوری به هم متصلشون کنم
من چهارتا جدول دارم 

Customer و SoftWare و Sell و FieldSell

توی قسمت SQL جدول Customer  نوشتم
Select * From Customer
توی قسمت SQL جدول  SoftWare نوشتم
Select * From SoftWare
توی قسمت SQL جدول  Sell نوشتم
select *
from Sell
where CustomerID = @ID or @ID = 0
توی قسمت SQL جدول  FieldSell نمیدونم چی باید بنویسم که جداول درست متصل بشن
امیدوارم منظورم رو رسونده باشم
ممنون میشم راهنماییم کنید  :لبخند:

----------


## gholami146

با سلام
برای ساخت برنامه فاکتور زنی میتونید از برنامه محسن سافت که معروف به (محسن فاکتور)هست الهام بگیرید (تو نت سرچ کنید برنامه فری هست پیداش میکنید)
و اما
برای اینکه شما بتونید یک برنامه فاکتور با استفاده از دلفی و بانک اکسس طراحی کنید باید به این روش کلی عمل کنید
1- بانکی داشته باشید که تمامی فاکتور ها چه خرید و چه فروش در آن باشد و در فیلد های آن اطلاعات کلی فاکتور موجود باشد مثلا نام مشتری ، کد مشتری ، شماره فاکتور ، تاریخ فاکتور ، مبلغ خدمات ، تخفیف ، مبلغ کل فاکتور و  ... که مهم ترین فیلد برای ما شماره فاکتور هست که باید یک فیلد یکتا باشد
2- جدولی که در بردارنده ریز اقلام فاکتور ها باشه که به غیر از داشتن یک فیلد آوتو نامبر فیلدی رو داشته باشه که در اون مقدار فیلد بانک فاکتورها رو در خود جای بده یعنی
ID,TblFacID,Sharh,Qty,Price,Total
که در TblFacID شما باید تمامی ردیف ها تون مقدار جدول فاکتور ها رو داشته باشه
3- برای نوشتن و خوندن فاکتورها باید یک جدول دقیقا مشابه جدول دوم داشته باشید که بصورت موقت ایجاد بشه و در زمانی که کاربر اقدام به ثبت یا ویرایش اطلاعات یک فاکتور جدید میکنه تمامی مقادیر موجود در داخل جدول اصلی رو با استفاده از یک کوئری خونده و در داخل اون بریزید و یا در هنگام ثبت فاکتور جدید بعد از انجام عمل ثبت مقادیر رو به داخل جدول اصلی انتقال بدید
به همین سادگی این یک روش برای طراحی فاکتور است که باهاش میتونید یک فاکتور زن رو پیاده سازی کنید 
اگه سئوالی داشتید من در خدمتم
موفق باشید

----------


## sara.mahdavi

ممنون از شما  :لبخند: 
این مطالب خیلی بهم کمک کرد ولی من این جداولی که گفتید رو درست کردم حالا باید به هم متصلشون کنم ک بتونم توی فاکتور ازشون استفاده کنم 
توجه کنید من فقط میخوام یک برگه فروش (فاکتور) توی یک فرم درست کنم و قصد چاپ ندارم 
میشه یکم راهنمایی کنید؟؟؟؟؟ :لبخند:

----------


## یوسف زالی

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

----------


## sara.mahdavi

موارد خیلی خوبی بیان کردید :چشمک: 
این فاکتوری که من میخوام طراحی کنم خیلی ساده ست و تخفیف آن بصورت دستی محاسبه میشه
البته اگه این موارد رو هم بشه توضیح داد خیلی خوبه  :خجالت: 
ولی همین ک بتونم یک فاکتور ساده ایجاد کنم کار منو راه میندازه 
در حال حضر مشکل من روی اتصال جداول به همدیگست (پست شماره 11) چطوری باید این کار رو انجام بدم ؟؟؟؟
واقعا از کمکتون ممنونم :لبخند:

----------


## یوسف زالی

فرض می کنم که جداولتون این هاست:

Customers
----------
CST_Serial int identity(1, 1)
CST_Code varchar(100) not null
CST_Name varchar(500) not null
CST_Family varchar(500) not null
CST_NationalCode int not null
CST_Tel varchar(20) null
CST_Address varchar(4000) null
.
.

Goods
------
GUD_Serial int identity(1, 1)
GUD_Code varchar(100) not null
GUD_Name varchar(500) not null
GUD_DefaultPrice decimal null
.
.

FactorBodies
-------------
FCB_Serial int identity(1, 1)
FCB_CST int not null related to CST_Serial
FCB_Code int not null
FCB_Date char(10) not null
FCB_Increments decimal not null
FCB_Decrements decimal not null
.
.

FactorItems
------------
FCI_Serial int identity(1, 1)
FCI_FCB int not null related to FCB_Serial
FCI_GUD int not null related to GUD_Serial
FCI_Amount decimal not null
FCI_Price decimal not null
.
.

البته اگر دوستم نیاد بگه داریم منحرفت می کنیم! ( :لبخند گشاده!: )، این یکی از طراحی ها برای کارهای کوچیکه که قرار نیست تفکیک کالایی برای تخفیفات یا مالیات ها اتفاق بیفته.

پس از این طراحی ها، و گذاشتن ریلیشن ها در دی بی، نوبت می رسه به SP ها یا کوئری ها.
برای مشتری و کالا که راحته، برای فاکتورها:

بدنه ی فاکتور:

select *
from FactorBodies
  join Customers on CST_Serial = FCB_CST
where
  (FCB_Serial = @FCB_Serial or @FCB_Serial = 0)
  and
  (FCB_CST = @FCB_CST or @FCB_CST = 0)
  and
  (FCB_Code = @FCB_Code or @FCB_Code = 0)
  and
  (FCB_Date between @FCB_DateFrom and @FCB_DateTo)


اقلام فاکتور:

select *
from FactorItems
  join Goods on GUD_Serial = FCI_GUD
where
  (FCI_Serial = @FCI_Serial or @FCI_Serial = 0)
  and
  (FCI_FCB = @FCI_FCB or @FCI_FCB = 0)
  and
  (FCI_GUD = @FCI_GUD or @FCI_GUD = 0)



این فقط یکی از راههاست. تاکید : ممکنه کس دیگه بیاد راه دیگه ای ارائه بده. من با توجه به مشخصات داده شده راه دادم (یعنی مطمئنم میادا  :قهقهه:  (خنده هیستریک))

در کدوم مورد ابهام دارید؟

----------


## sara.mahdavi

:لبخند: ممنون من همین رو می خواستم فقط وقتی این 2 تا کوئری رو واسه جداول خودم می نویسم 
این ارور رو میده

Syntax error n FROM clause

کجا مشکل دارم ؟؟؟ :ناراحت: 
درضمن دیتا بیس من Access

----------


## یوسف زالی

کوئری رو بگذارید.

----------


## sara.mahdavi

select *
from Sell
  join Customer on ID = CustomerID
where
  (ID = @ID or @ID = 0)
  and
  (CustomerID = @CustomerID or @CustomerID = 0)
  and
  (SellDate between @SellDateFrom and @SellDateTo)

----------


## gholami146

اصلا نیازی به این کارها نیست
با یک ریلیشن شیپ ساده این کار رو حل کنید

----------


## gholami146

من تمامی مراحل رو نوشتم نمی دونم شما دیگه چی لازم دارید
این بانک ها رابطه پیچیده ای نداره فقط کافی اطلاعات رو داخل جداول بزارید

----------


## یوسف زالی

راستش من اکسس بلد نیستم، اما این راه رو امتحان کن:
به جای Join از ,  استفاده کن، و به جای On بگذار تو where.
مثلا این طوری:
select * from A, B where ID1 = ID2 and ...

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

----------


## gholami146

دوست عزیز نیازی به لوکیت نداره
شما اگر از مستر فیلد ها استفاده کنید در زمانی که ریلیشن شیپ رو بر قرار کنید با انتخاب داده در جدول اصلی تمامی زیر اطلاعات در جدول فرزند با استفاده از قابلیت ریلیشن شیپ بطور اتوماتیک انتخاب میشه و نیازی به هیچ دخالتی از سمت کاربر نداره

----------


## یوسف زالی

منظور من مستر - دیتیل نیست!
شما مسترت می شه بدنه فاکتور، دیتیل می شه اقلام، حالا در همون مستر کنار شماره فاکتور و تاریخ، نام مشتری هم می خوای، و در دیتیل کنار قیمت نام کالا رو هم می خوای. اینها رو از کجا میاری؟
اگر از 4 تا گرید یا دیتاست استفاده کنی که درست نیست.
منظور من در همون مستر هست. برای آوردن نام مشتری در گرید فاکتور ها.
راه شما چیه؟ چطور می شه با استفاده از راه شما این کار رو کرد؟
ضمنا کدهایی که نوشتم هم باید در همون مستر - دیتیل انجام بشه. در رویداد AfterScroll

----------


## gholami146

در این روش هرگاه ردیف 1 انتخاب گردد که مشتری ان غلامی است در جدول دوم تمامی کالای فروخته شده به ایدی 1 که برابر 1 است انتخاب میشود

----------


## sara.mahdavi

دوستان واقعا ازتون ممنونم ولی بذارید برای اینکه راحتر بتونید راهنماییم کنید یکم کاملتر توضیح بدم

 من از دیتا بیس اکسس استفاده می کنم
و توی دلفی از ADOQuery  استفاده میکنم 
*اطلاعات جداول 
*

Customer
----------
ID int identity(1, 1)
IDCustomer varchar(100) not null
Name varchar(500) not null
Family varchar(500) not null
NationalCode int not null
Tel varchar(20) null
Address varchar(4000) null
.
.....................
کوئری >>
.....................
Select * From Customer
____________________________________________

SoftWare
------
ID int identity(1, 1)
Name varchar(500) not null
DefaultPrice decimal null
.
.....................
کوئری >>
.....................
Select * From SoftWare
____________________________________________

Sell
-------------
ID int identity(1, 1)
CustomerID int not null related to IDCustomer
SellDate char(10) not null
TotalPrice decimal not null
.
.....................
کوئری >>
.....................
select *
from Sell
  join Customer on ID = CustomerID
where
  (ID = @ID or @ID = 0)
  and
  (CustomerID = @CustomerID or @CustomerID = 0)
  and
  (SellDate between @SellDateFrom and @SellDateTo)


____________________________________________

FieldSell
------------
ID int identity(1, 1)
IDSell int not null related to ID
IDSoftWare int not null related to ID
Price decimal not null
.
.....................
کوئری >>
.....................
select *
from FieldSell
  join SoftWare on ID= IDSoftWare
where
  (ID = @ID or @ID = 0)
  and
  (IDSell = @IDSell  or @IDSell  = 0)
  and
  (IDSoftWare  = @IDSoftWare or @IDSoftWare = 0)

____________________________________________



در حال حاضر مشکلی که دارم اینکه دوتا جدول FieldSell و  Sell رو باز نمیکنه و این ارور رو میده

Syntax error n FROM clause

حالا با توجه به این اطلاعات لطفا راهنماییم کنید

با تشکر فراوان از تمامی دوستان بخصوص آقای *You-See* و آقای *gholami146*  :لبخند:

----------


## sara.mahdavi

> در این روش هرگاه ردیف 1 انتخاب گردد که مشتری ان غلامی است در جدول دوم تمامی کالای فروخته شده به ایدی 1 که برابر 1 است انتخاب میشود


 آقای غلامی من ریلیشن ها رو همیطوری که شما می فرمایید در اکسس به هم متصل کردم 
حالا سوال من اینه که با توجه به اینکه من از ADOQuery استفاده می کنم چطوری باید کوئری اونها رو بنویسم؟؟

----------


## gholami146

مثال زیر رو ببینید

----------


## gholami146

این هم لینک اجرایی این مثال

----------


## یوسف زالی

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

خانم سارا، فکر کنم ایراد شما به خاطر همنامی فیلد هاتون هست.
نام فیلد ها رو یونیک کنید یا این که در سلکتتون * رو به نام فیلد ها تغییر بدید.

----------


## gholami146

دوست عزیز اقای "یوسی" این جداول فقط نمونه ای برای نمایش ایجاد روابط بین دو جدول به سرکار خانم مهدوی بود

----------


## sara.mahdavi

> غلامی جان! شما نام مشتری رو در فاکتور آوردید؟؟!!!
> نام کالا رو هم در اقلام آوردید؟؟؟؟؟!!!!
> می دونید این روش طراحی یعنی چی؟
> فکر کنم اصلا متوجه جداولی که من گذاشتم نشدید.
> توصیه می کنم یک بار با حوصله بیشتری اون ها رو ببینید.
> 
> خانم سارا، فکر کنم ایراد شما به خاطر همنامی فیلد هاتون هست.
> نام فیلد ها رو یونیک کنید یا این که در سلکتتون * رو به نام فیلد ها تغییر بدید.


کارایی که فرمودید رو انجام دادم ولی بازم همون ارورر رو میده
اینم تغییرات

select ID_Sell,CustomerID,SellDate,TotalPrice
from Sell
  join Customer on ID_Customer = CustomerID
where
  (ID_Sell = @ID_Sell or @ID_Sell = 0)
  and
  (CustomerID = @CustomerID or @CustomerID = 0)
  and
  (SellDate between @SellDateFrom and @SellDateTo)

----------


## یوسف زالی

سوال من در پست های قبلی مربوط بود به طراحی ای که ارائه دادم.
در اون طراحی برای آوردن نام مشتری مجبورید join کنید.
لزومی برای استفاده از SP نیست ولی وقتی درگیر پروژه بشید مثلا برای تنظیم چاپ، ارسال به اکسل، اعمال شرایط برای مکش رکورد ها... اونوقت اس پی یک ابزار فوق العاده هست. از طرفی در حالتی که SP استفاده نمی کنید و مثل اینجا از کوئری استفاده می شه، چطور می خواهید چنین کاری انجام بدید؟ 

خانم سارا، اگر ممکنه DB خودتون رو ضمیمه کنید. همراه با سورس، بهش نگاه بندازم ببینم چشه.

----------


## sara.mahdavi

> مثال زیر رو ببینید


 آقای غلامی این مثالی که شما زدید رو قبلا من انجام دادم 
توی این روش از ADOTable استفاده میشه ولی من گفتم دارم از ADOQuery استفاده میکنم 
حالا در هرصورت اگه این روش جواب بده من حتما بجای ADOQuery از ADOTable استفاده میکنم 
درضمن اینو هم به من بفرمایید که :
من جهارتا جدول دارم که توی فاکتور باید از همشون استفاده بشه که شما اینجا فقط بدنه و اقلام فاکتور رو به هم متصل کردید 
حالا من چطوری توی فاکتور یک قسمت بذارم که کاربر
 1-مشتری خودش رو انتخاب کنه
2-اطلاعات کلی فاکتور رو وارد بشه (شماره فاکتور ، تاریخ ، مبلغ کل و...) 
3-از جدول کالا ها ، کالای مورد نظرشو انخاب کنه و توی جدول اقلام فاکتور ریخته بشه؟؟
بازم ممنونم :لبخند:

----------


## یوسف زالی

خانم سارا،
بخش های مرتبط به فرم Data Entry رو با گرید های نمایشی قاطی نکنید.
بگذارید یکی یکی پیش برید.
اونجا کار خیلی ساده هست.

----------


## sara.mahdavi

> خانم سارا، اگر ممکنه DB خودتون رو ضمیمه کنید. همراه با سورس، بهش نگاه بندازم ببینم چشه.


SoftWares.rar
ممنون از کمکتون

----------


## یوسف زالی

همون طور که حدس زدم ایراد از Join بود:


select ID_Sell,CustomerID,SellDate,TotalPrice
from Sell
  , Customer
where ID_Customer = CustomerID
  and
  (ID_Sell = @ID_Sell or @ID_Sell = 0)
  and
  (CustomerID = @CustomerID or @CustomerID = 0)
  and
  (SellDate between @SellDateFrom and @SellDateTo)



اگر به مقادیر پارامتر ها گیر داد، براشون مقدار اولیه ست کنید:
از دکمه پارامترها در خصوصیات ADOQuery تمام لیست رو انتخاب کرده و یک اینتر بزنید. تمام.

----------


## sara.mahdavi

:تشویق: با تشکر درست شد  :لبخند: 
وقتی در قسمت سلکت * میذارم تمام فیلد های جدول Customer رو هم میاره 
آیا این کارم درسته؟؟ یا باید فقط تمام فیلدهای جدول Sell رو بخونم؟؟
بازم ممنون :چشمک:

----------


## یوسف زالی

در داده های کم مهم نیست. در داده هایی با رکورد های بیش از 100 هزار تا بهتره که تعداد فیلدهاتون کمتر باشه.

----------


## sara.mahdavi

لطفا کسی از دوستان اگه یک آموزش ساخت فاکتور (ک به تمام نکات لازم اشاره کرده) داره اینجا بذاره :خجالت: 

یا یک مثال همراه با سورس آخه نمیدونم دقیقا باید چطور عمل کنم که بتونم عملیات فکتور زنی رو درست انجام بدم

واقعا از کمک تمامی دوستان متشکرم :قلب:

----------


## fahimi

برای ساخت فاکتور 4 تیبل نیاز است 
1-تیبل که نام مشتریان را نگهداری کند(کد مشتری -نام مشتری )
2-تیبل که نام کالا ها را نگهداری کند(کد کالا-نام کالا)
3-تیبل که تیتر فاکتور را نگهداری کند(شماره فاکتور-تاریخ صدور-کد مشتری)
4-تیبل که جزئیات را نگهداری کند(شماره فاکتور-کدکالا-تعداد-قیمت)

----------


## sara.mahdavi

ممنون اینا رو میدونم و توی پست های قبلی هم در مورد همین جداول بحث شده
الان یکم توضیح میخام واسه طرز استفاده در فرم فاکتور که چوری عمل کنم 
ممنون

----------


## یوسف زالی

ساخت فاکتور با تمام جزییات خودش یه پروژه هست. دقیقا در کدوم قسمتش اطلاعات می خوای؟
تحلیل - طراحی - پیاده سازی - ورود داده - گزارش گیری - ...
و در چه حدی؟ کامل ؟

مثلا برای یک فاکتور کامل جداول مورد نیاز می تونه اینها باشه:

جدول مستر فاکتور لینک به جداول زیر:
- شرکت ها
- شعبات
- درخواست ها
- مشتریان
- بازاریاب ها
- انواع پرداخت
- انواع فاکتور
- لیست های قیمت

جدول اقلام فاکتور لینک به جداول زیر:
- هدر فاکتور
- کالا ها
- اقلام برگشتی

جدول تخفیفات لینک به جداول زیر:
- هدر فاکتور
- انواع بدهکار بستانکار کف فاکتور
- کالا ها

همون طور که می بینی شصت تا جدول درگیر می شه برای این که فاکتور رو کامل پیاده سازی کنید. ( :لبخند گشاده!:  لبخند هیستریک!)
اما برای کاربرد های ساده تر از جداولی چشم پوشی می شه.

----------


## sara.mahdavi

خب من در حال حاضر فقط میخوام یک فاکتور ساده بسازم
توی پست های قبلی شما و بقیه دوستان خیلی بهم کمک کردین و تونستم جداول و ارتباط اونها رو درست برقرار کنم
حالا توی فرم فاکتور می خوام :
1- کاربر نام مشتری رو انتخاب کنه 
2- اقلام فاکتور رو اضافه کنه 
3-فاکتور رو ذخیره کنه
روش صحیح انجام این کار رو بلد نیستم :افسرده: 
فکر کنم اینهایی که گفتم یعنی توضیح کامل :خجالت: 
اما هرچقدر ک بتونید کمکم کنید ازتون ممنون میشم :چشمک:

----------


## sara.mahdavi

دوستان کسی نیس راهنمایی کنه؟؟؟؟؟

حداقل بگید چطوری اقلام فاکتور رو وارد کنم ؟؟
ممنون

----------


## mojtaba0912433

fakotor.rar
مثال

----------


## sara.mahdavi

ممنون بابت این مثال خیلی خوب بود  :چشمک: 
توی این مثال هیچ جدولی به جدول دیگه متصل نبود یعنی ریلیشن نداشت 
و باید هر اطلاعاتی که توی فاکتور به اون نیاز داری (نام مشتری و یا مشخصات اون ،نام کالا و مشخصات و... ) در داخل جدول فاکتور یک فیلد برای اون بسازی که این روش درست نیست
ولی از شما بسیار ممنونم واسه این مثال، که اگه از این تایپک به نتیجه ای نرسیدم از همین روش که شما در مثالتون آوردید استفاده میکنم
باز هم ممنونم :لبخند:

----------


## mojtaba0912433

> ممنون بابت این مثال خیلی خوب بود 
> توی این مثال هیچ جدولی به جدول دیگه متصل نبود یعنی ریلیشن نداشت 
> و باید هر اطلاعاتی که توی فاکتور به اون نیاز داری (نام مشتری و یا مشخصات اون ،نام کالا و مشخصات و... ) در داخل جدول فاکتور یک فیلد برای اون بسازی که این روش درست نیست
> ولی از شما بسیار ممنونم واسه این مثال، که اگه از این تایپک به نتیجه ای نرسیدم از همین روش که شما در مثالتون آوردید استفاده میکنم
> باز هم ممنونم


 خیلی درگیر ریلیشن نشو البته برای یک نرم افزار فروش  احتیاج به گزینه های خیلی زیادتری داری که باید به جداول اضافه کنی. برنامه های زیادی هست که بدون ریلیشن کارکرد صحیحتری نسبت به برنامه های پیچیده دارند

----------


## یوسف زالی

> خیلی درگیر ریلیشن نشو البته برای یک نرم افزار فروش احتیاج به گزینه های خیلی زیادتری داری که باید به جداول اضافه کنی. برنامه های زیادی هست که بدون ریلیشن کارکرد صحیحتری نسبت به برنامه های پیچیده دارند


این گفته اشتباهه.
باید برای تمام حالات ممکن ارتباطات رو در نظر بگیرید.
هیچ برنامه ای بدون ارتباط از ورژن با ارتباطش بهتر کار نمی کنه. فقط بزن در رو تر نوشته می شه.
سر فرصت یک نمونه آماده می کنم براتون.

----------


## یوسف زالی

متاسفانه حجم کار بالا بود  :لبخند گشاده!:  و نشد نمونه براتون آماده کنم.
اما اجمالا:

- یکی از راههای قدیمی برای ثبت هدر و دیتیل فاکتور، استفاده از فاکتور های Fake بود که به دلایل زیادی استفاده ازش روش صحیحی نیست و دردسر زیاد داره.
- برای ثبت یا اصلاح فاکتور، هر دو جدول مستر و دیتیل رو همزمان آپدیت کنید، اگر دی بی شما از اس پی پشتیبانی نمی کند، این کار رو با BeginTrans می تونید انجام بدید.
- برای ثبت همزمان این دو، یکی از بهترین روش ها استفاده از XML هست، البته اگر دی بی شما در اس پی اون رو ساپورت کنه، وگرنه در اس پی هاش می تونید با یک رشته اون رو پیاده کنید.
- برای اطمینان از این که کد های اشتباه در ثبت اقلام یا مشتری وارد نشه، از DBLookupCombpBpx استفاده کنید.
- بهتره قسمت ورود داده رو روی خود گرید انجام ندید و براش فرم مجزا در نظر بگیرید. می تونید از فریم ها هم استفاده کنید که من ازش خیلی بدم میاد!
- همه قسمت ها تا قبل از زدن دکمه ذخیره، در حافظه یا در کلاینت دیتاست باقی می مونه، بعد از ثبت یا انصراف در موردش تصمیم گرفته می شه.

البته همه اینها بدیهیات بود!
شما بگو دقیق تو کدوم قسمت سوال داری، اگر بلد باشم جواب می دم.
موفق باشید.  :لبخند:  (لبخند ساده هیستریک)

----------


## sara.mahdavi

ممنون بابت این اطلاعات  :لبخند: 
من برای ورود نام مشتری یک دکمه گذاشتم که کاربر با استفاده از اون به لیست مشتریان میره و یک مشتری رو انتخاب میکنه ، بعد از انتخاب مشتری ،کد اون رو برای قسمت مشتری فاکتور استفاده میکنم و بطور اتومات شماره فاکتور و تاریخ اون ثبت میشه و جدول بدنه فاکتور یکبار Post میشه و دوباره Edit میشه بعد در قسمت ورود کالا هم همینطور عمل کردم ولی بعد از انتخاب کالا موقعی که میخواد یک فیلد به جدول موقت اقلام فاکتور اضافه کنه این اخطار رو میده


you cannot add or change a record because a related record is in table 'Sell'


من فکر میکنم هنوز توی اتصال جداول مشکل دارم :افسرده:

----------


## یوسف زالی

فکر می کنم به جای سریال جدول یک فیلد اشتباه دارید پاس می دید.
روشتون بد نیست ولی عالی هم نیست.
در این روش اگر وسط پست کردن مستر برق بره چی می شه؟

----------


## fahimi

با سلام 
تعداد پست های  زیاد در این خصوص شده و موضوع بحث کمی  بی راهه رفته است من برای اینکه انسجامی به این بحث داده شود   یک نمونه ساده از ثبت فاکتور را آماده کردم  و برای راحتی استفاده  از آن فقط از کامپوننت های پایه دلفی استفاده شده   از اساتید محترم تقاضایی نقد و بررسی  آن را دارم در کل از موارد ساده و پیش پا افتاد صرف نظر کرده ام

----------


## sara.mahdavi

> فکر می کنم به جای سریال جدول یک فیلد اشتباه دارید پاس می دید.
> روشتون بد نیست ولی عالی هم نیست.
> در این روش اگر وسط پست کردن مستر برق بره چی می شه؟


 ممنون
فکر میکنم هیچ اطلاعاتی ثبت نمیشه دیگه :متفکر:

----------


## sara.mahdavi

> با سلام 
> تعداد پست های  زیاد در این خصوص شده و موضوع بحث کمی  بی راهه رفته است من برای اینکه انسجامی به این بحث داده شود   یک نمونه ساده از ثبت فاکتور را آماده کردم  و برای راحتی استفاده  از آن فقط از کامپوننت های پایه دلفی استفاده شده   از اساتید محترم تقاضایی نقد و بررسی  آن را دارم در کل از موارد ساده و پیش پا افتاد صرف نظر کرده ام


خیلی ممنون نمونه خوبیه من همچین چیزی می خواستم :تشویق: 
فقط نمیدونم چطوری فیلدهای TempClientDS رو آوردی (یعنی از کجا این فیلد ها اومده)؟؟؟؟؟؟؟؟؟؟؟؟
بازم ممنون :لبخند:

----------


## benyaminrahimi

شاید مربوط به بحث نباشه ولی استفاده از sp فراموش نشه   :) (لبخند غیر هیستیریک)

----------


## fahimi

با سلام 
آقای شاهین عشایری  آموزش استفاده از ClientDataSet بصورت شیوا تهیه کرده است .
http://www.irstu.com/?p=1580

----------


## fahimi

> شاید مربوط به بحث نباشه ولی استفاده از sp فراموش نشه   :) (لبخند غیر هیستیریک)


آقای رحیمی منظور شما بحث Stored Procedures در Sql Server است

----------


## sara.mahdavi

> با سلام 
> تعداد پست های  زیاد در این خصوص شده و موضوع بحث کمی  بی راهه رفته است من برای اینکه انسجامی به این بحث داده شود   یک نمونه ساده از ثبت فاکتور را آماده کردم  و برای راحتی استفاده  از آن فقط از کامپوننت های پایه دلفی استفاده شده   از اساتید محترم تقاضایی نقد و بررسی  آن را دارم در کل از موارد ساده و پیش پا افتاد صرف نظر کرده ام


 میشه یکم در مورد این کوئری 

SELECT Order.OrderID, Order.OrderDate, Customers.CustomerName,
(select sum(Quantity) from Order_Details where OrderID=Order.OrderID Group by OrderID   ) as total
FROM [Order] INNER JOIN Customers ON Order.CustomerID = Customers.CustomerID;

توضیح بدید
ممنون :لبخند:

----------


## fahimi

یک سلکت ساده است ولی نکته آن استفاده از یک SubQuery برای بدست آوردن جمع فاکتور ها در لیست فاکتور فروش است .
و برای  نمایش نام مشتریان ،از JOIN به جدول Customers استفاده کرده ام

----------


## یوسف زالی

روش خوبی هست. می تونید به جای استفاده از دیتاست از آرایه و رکورد و این چیزها هم استفاده کنید که خیلی مهم نیست.
اما قسمت مهم اینه که بعد از ثبت هدر فاکتور، در صورت بروز اختلال، یک فاکتور بدون دیتیل خواهیم داشت. بهتر بود از تراکنش استفاده می شد.



> استفاده از sp فراموش نشه :)


ایشون دیتابیسشون اکسسه، ولی برای پیاده سازی تراکنش می تونن از همون BeginTrans شی اتصالشون (البته من در مورد اتصال ADOConnection می دونم) استفاده کنند.
 :لبخند:  (لبخند یه ذره هیستریک!)

----------


## fahimi

در خصوص تراکنش کاملا حق با شما است .من این برنامه در دو سه ساعت تهیه کردم  بعضی چیزها را به عمد و بعضی ها را هم به دلیل ضعف علمی حذف کردم .از این که دوستان با یادوری  ضعف این برنامه را هدیه میکند تشکر میکنم
به هر حال قسمت ذخیره به شکل زیر اصلاح کردم

var
 TA: integer;
begin
  TA:=DataModule2.ADOConnection1.BeginTrans;
  try
      Save_Order_Table;
      Save_Order_detilTable;
      showmessage('فاکتور با شماره' + maxid + 'ذخیره شد');
      Close;
      DataModule2.ADOConnection1.CommitTrans;
    except
    on E:Exception do DataModule2.ADOConnection1.RollbackTrans;
  end;
end;

----------


## sara.mahdavi

> نوشته شده توسط *fahimi*


یک سوال دیگه درمورد نمونه برنامه ای که گذاشتید

چرا توی برنامه مستقیم از تیبل Order استفاده نکردید و اطلاعات اون رو با ADOQuery  مورد استفاده قرار دادید؟

نمیشد با همون تیبل Order و دیتاست کار کرد؟ من فکر میکنم اضافه کاری شده

درضمن من میخوام یک کد واسه حذف اطلاعات این جدول بنویسم نمیدونم چطوری انجام بدم (زیاد به ADOQuery مسلط نیستم)

ممنون :لبخند:

----------


## fahimi

1 بطور خیلی خلاصه ADOQuery یا هر شی مشابه دیگر جهت استفاده از زبان T-SQL می باشد.واژه SQL از حروف اول Structured Query Language یا زبان جستجوی ساختار یافته گرفته شده است, و SQL زبان جستجوی بانک های رابطه ای است و برای ایجاد و ویرایش و جستجو   داده های موجود بر روی سیستم های مدیریت اطلاعات بکار می رود. 
2-در FormActivate  من از یک procedure به نام ListForosh فروش استفاده کرده ام - هدف از آن لیستی از فاکتور را ارئه می دهد که شامل شماره فاکتور،تاریخ  فاکتور ،نام مشتری ،مبلغ فاکتور می باشد 
چگونه می شود این اطلاعات را از تیبل Orders بازیابی کرد در حالیکه به تیبل نگاه کنید شامل فیلدهای (شماره فاکتور،تاریخ فاکتور،کد مشتری) می باشد
3-در مورد حذف داده ها 

procedure DelOrderID(Morder_Id:string);
begin
  with DataModule2 do
  begin
    query1.Close;
    query1.SQL.Clear;
    query1.SQL.Add('DELETE * FROM Order_Details');
    query1.SQL.Add(' where OrderID=:OrderID');
    query1.Parameters.ParamByName('OrderID').Value := Morder_Id;
    query1.ExecSQL;
  end;
end;

 را می توانید سایر تیبل بسط دهید

----------


## Ramin_khan

ببخشید دوستان من میخوام یه برنامه فاکتور بسازم ولی توی یه قسمتش دچار مشکل شدم
از clientdataset استفاده نکردم چون بلد نیستم
من یه جدول مشخصات فاکتور و یه جدول اقلام فاکتور دارم که فاکتور جدید ثبت میکنه و برای نمایش مجدد هم مشکلی نداره توی گزارش گرفتن!
فقط نمیدونم اگر بخوام تعداد یکی از اقلام فاکتور رو که قبلا ثبت کردمو ویرایش کنم(مثلا قبلا توی فاکتور 4 تا مداد بوده حالا میخوام بشه 8 تا) یا یک ردیف از اقلام فاکتور رو حذف کنم باید چکار کنم!!!
ممنون میشم راهنمایی کنید.

----------

