
মাইক্রোসফট এক্সেস লিংকড টেবিল জুড়ে জটিল কম্পিউটেশন অটোমেট করার জন্য শক্তিশালী ফিচার অফার করে যা ম্যানুয়াল ডেটা এন্ট্রি কমায়, ত্রুটি নূন্যতম করে এবং আপনার ডেটাবেসকে রিয়েল-টাইমে কনসিস্টেন্ট রাখে। ক্যালকুলেটেড ফিল্ড ডেটাবেসকে আরও অটোমেটিক बनाয়; ব্যবহারকারীদের ম্যানুয়ালি টোটাল, ডিসকাউন্ট, ডিউ ডেট বা প্রফিট ভ্যালু এন্টার করানোর বদলে এক্সেস সেটি বিদ্যমান ফিল্ড থেকে ক্যালকুলেট করে দিতে পারে।
এই টিউটোরিয়ালে আমরা দেখাব কীভাবে অ্যাক্সেস টেবিলে ক্যালকুলেটেড ফিল্ড যোগ করে অটোমেটিক ক্রস-লিংকড কম্পিউটেশন করা যায়। আসুন এইস ক্যালকুলেটেড ফিল্ড তৈরি করি যা অটোমেটিক্যালি রিলেটেড টেবিল থেকে ভ্যালু টেনে কম্পিউট করবে।
মনে রাখবেন যে একটি অ্যাডভান্সড ডেটাবেসে ক্যালকুলেটেড ফিল্ড যেভাবেই ব্যবহার করা উচিত না। সবচেয়ে গুরুত্বপূর্ণ নিয়মটি হলো:
- সেই রেকর্ডের ফিল্ডের ওপর নির্ভরশীল ভ্যালুর জন্য ক্যালকুলেটেড ফিল্ড ব্যবহার করুন
- লিংকড টেবিল বা একাধিক রেকর্ডের ওপর নির্ভরশীল ক্যালকুলেশনের জন্য কোয়েরি ব্যবহার করুন
ধাপ ১: স্যাম্পল রিলেটেড টেবিল সেট আপ করুন
এক টেবিল থেকে অন্য টেবিলে রেফারেন্স দিয়ে ক্যালকুলেটেড ফিল্ড তৈরির জন্য স olid রিলেশনশিপ প্রয়োজন। এক এক্সপ্রেশন লিখার আগে এখান থেকে শুরু করুন।
রিলেশনশিপ তৈরি করুন:
- Database Tools ট্যাবে যান >> Relationships সিলেক্ট করুন
- টেবিলগুলো যোগ করুন।
- CustomerID Customers টেবিল থেকে CustomerID Orders টেবিলে ড্র্যাগ করুন
- ProductID Products টেবিল থেকে ProductID OrderDetails টেবিলে ড্র্যাগ করুন
- OrderID Orders টেবিল থেকে OrderID OrderDetails টেবিলে ড্র্যাগ করুন
- Enforce Referential Integrity এনাবল করুন
- OK ক্লিক করুন

এই সেটআপ ক্রস-লিংকড কম্পিউটেশন অনুমতি দেয় (যেমন: অর্ডার সাবটোটাল як লাইন টোটালের সমষ্টি)। এই লিংকেজই ক্রস-টেবিল লুকআপকে विश्वস্ত করে। এর না থাকলে, একটি ক্যালকুলেটেড ফিল্ড রেফারেন্সড রেকর্ড ডিলিট বা মিসম্যাচ হলে সাইলেন্টলি null রিটার্ন করতে পারে।
ধাপ ২: একটি টেবিলে সিম্পল ক্যালকুলেটেড ফিল্ড যোগ করুন
- OrderDetails টেবিল Design View-এ খুলুন
- প্রথম খালি সারিতে:
- Field Name: LineTotal
- Data Type: Calculated
- অ্যাক্সেস Expression Builder খুলবে
- আপনার ফর্মুলা লিখুন:
- অথবা ভিজুয়ালি তৈরি করুন: OrderDetails টেবিল এক্সপ্যান্ড করুন >> Quantity এবং UnitPrice ডাবল-ক্লিক করুন, তারপর * অপারেটর যোগ করুন
- Result Type (Currency, Number, Text, ইত্যাদি) সেট করুন যা এক্সপ্রেশন রিটার্ন করে
- Field Properties এক্সপ্যান্ড করুন >> Currency সিলেক্ট করুন
- টেবিল Save করুন

ডিসকাউন্টসহ টোটাল:
[Quantity] * [UnitPrice] * (1 - [DiscountRate])

এখন এক্সেস প্রতিটি রেকর্ডের জন্য LineTotal অটোমেটিক্যালি কম্পিউট করবে — কোনো VBA নয়, কোনো ম্যানুয়াল আপডেট প্রয়োজন নয়। ডেটاشিট ভিউতে Quantity বা UnitPrice যোগ বা এডিট করার পর LineTotal অটোমেটিক্যালি আপডেট হবে।

ধাপ ৩: ক্রস-লিংকড কম্পিউটেশন হ্যান্ডল করা — কোয়েরিতে ডোমেইন এগ্রিগেট ফাংশন ব্যবহার করুন
টেবিল ক্যালকুলেটেড ফিল্ডে ডায়রেক্ট ক্রস-টেবিল রেফারেন্স অ্যালাওড নয়। আপনাকে কোয়েরি বা VBA ব্যবহার করতে হবে। ডোমেইন এগ্রিগেট ফাংশন হলো অ্যাক্সেসের বিল্ট-ইন মেকানিজম যা অন্য টেবিল বা কোয়েরি থেকে কম্পিউটেড ভ্যালু এক্সপ্রেশনে টেনে আনতে সাহায্য করে। সবচেয়ে উপযোগীগুলো হলো:
| Function | Purpose |
|---|---|
| DLookup() | অন্য টেবিল থেকে একক ভ্যালু রিটার্ন করে |
| DSum() | কন্ডিশন মিলে যাওয়া অন্য টেবিলের ভ্যালু সমষ্টি করে |
| DCount() | অন্য টেবিলে মিলে যাওয়া রেকর্ড কাউন্ট করে |
| DAvg() | অন্য টেবিলের ভ্যালুগুলোর গড় বের করে |
| DMax() / DMin() | অন্য টেবিল থেকে ম্যাক্স বা মিন ভ্যালু রিটার্ন করে |
একটি কোয়েরি তৈরি করুন:
- Create ট্যাবে যান >> SQL Query সিলেক্ট করুন
- Add Tables পেন থেকে Orders এবং Customers টেবিল যোগ করুন
- ফিল্ড যোগ করুন: CustomerName, OrderID
- এক ব্ল্যাঙ্ক Field কলামে Total এর জন্য ক্যালকুলেটেড ফিল্ড তৈরি করুন
- নিচের এক্সপ্রেশন লিখুন:
Total: DSum("[LineTotal]","OrderDetails","[OrderID]=" & [OrderID])
- DSum() মিলে যাওয়া OrderID-এর জন্য LineTotal সমষ্টি করে (একটি ডোমেইন এগ্রিগেট ফাংশন যা টেবিল জুড়ে কাজ করে)
- qryOrderSummary নামে Save করুন
- Run ক্লিক করুন

কোয়েরিটি প্রতি রানে রি-কম্পিউট হবে। এই কোয়েরিটি ফর্ম, রিপোর্টের রিকর্ড সোর্স হিসেবে বা আরও ক্যালকুলেশনের ভিত্তি হিসেবে ব্যবহার করুন।
Currency-তে ফরম্যাট করুন:
Total: CCur(DSum("[LineTotal]","OrderDetails","[OrderID]=" & [Orders].[OrderID]))

ধাপ ৪: একটি মাল্টি-টেবিল কম্পিউটেড কোয়েরি তৈরি করুন ক্যালকুলেশন সোর্স হিসেবে
আরও জটিল সিন্যারিওর জন্য — যেমন একটি কাস্টমারের টিয়ার (এক টেবিল থেকে) এবং প্রোডাক্ট প্রাইস (আন্য টেবিল থেকে) জড়িত ডিসকাউন্টেড টোটাল কম্পিউট করা — আপনাকে সব প্রাসঙ্গিক টেবিল জয়েন করে একটি বেস কোয়েরি বানাতে হবে, তারপর সেই কোয়েরিকে আপনার ক্যালকুলেটেড ফিল্ড বা ফর্মে রেফারেন্স দিতে হবে।
ধাপগুলো:
- Create ট্যাবে যান >> SQL Query সিলেক্ট করুন
- Orders, Products, এবং OrderDetails কোয়েরিতে যোগ করুন
- ফিল্ড যোগ করুন: OrderID, ProductName
- একটি খালি Field সেলে ক্যালকুলেটেড কলাম যোগ করুন:
Profit: [DiscountedTotal] - [CostPrice]
- কোয়েরিটি qryOrderProfit নামে Save করুন
- Run ক্লিক করুন

এখন আপনার সকল অর্ডারের প্রফিট রিপোর্ট প্রোডাক্ট নেমসহ পাওয়া যাচ্ছে।

এখন যেকোনো ফর্ম, রিপোর্ট, বা ডাউনস্ট্রিম ক্যালকুলেটেড ফিল্ড DLookup() বা সাবকোয়েরি দিয়ে qryOrderProfit-এর विरুদ্ধ ফুলি কম্পিউটেড ভ্যালু পেতে পারে — সব ক্রস-লিংকড এবং অটোমেটিক।
ধাপ ৫: ডেটা ম্যাক্রোসহ আপডেট অটোমেট করুন
যখন আপনাকে একটি ক্যালকুলেটেড রেজাল্ট স্টোর করতে হয় (শুধু ডিসপ্লে না করে) — উদাহরণস্বরূপ, OrderDetails রেকর্ড চেঞ্জ হলে কম্পিউটেড টোটাল Orders টেবিলে প্রতিবার রাইট করা — তবে চাইল্ড টেবিলের সাথে অ্যাটাচড ডেটা ম্যাক্রো ব্যবহার করুন।
Orders টেবিলে Total ফিল্ড যোগ করুন:
- প্রথমে Orders টেবিল Design View-এ খুলুন
- Field Name: Total
- Data Type: Currency
এটি অবশ্যই একটি নরমাল Currency ফিল্ড হতে হবে, ক্যালকুলেটেড ফিল্ড নয়।
সেটআপ:
- OrderDetails Design View-এ খুলুন
- Table Tools ট্যাবে যান >> Table ট্যাব >> After Insert / After Update সিলেক্ট করুন

- ম্যাক্রো এডিটরে SetField এবং LookupRecord একশন ব্যবহার করুন:
- LookupRecord সিলেক্ট করুন
Lookup Up A Record In: Orders Where Condition: [Orders].[OrderID] = [OrderDetails].[OrderID]
- EditRecord >> SetField সিলেক্ট করুন
Name: [Orders].[Total] Value: DSum("[LineTotal]","OrderDetails","[OrderID]=" & [OrderID])
- Save ক্লিক করুন

এটি OrderDetails-এ প্রতিটি ইনসার্ট বা আপডেটে অটোমেটিক্যালি ফায়ার করবে, রিকম্পিউটেড টোটাল প্যারেন্ট Orders টেবিলে পুশ করবে — ফুলি অটোমেটেড, কোনো VBA প্রয়োজন নেই।
After Update-এর জন্য রিপিট করুন:
After Insert ম্যাক্রো টোটাল আপডেট করে শুধু যখন একটি নতুন ডিটেইল রো যোগ হয়। যদি ব্যবহারকারী Quantity, UnitPrice, বা DiscountRate চেঞ্জ করে, তবে টোটালও আপডেট হতে হবে।
একই ম্যাক্রো যোগ করুন:
Look Up A Record In Orders Where Condition: [Orders].[OrderID]=[OrderDetails].[OrderID] EditRecord SetField Name: [Orders].[Total] Value: DSum("[LineTotal]","OrderDetails","[OrderID]=" & [OrderDetails].[OrderID])
- এটিও Save করুন
এখন, OrderDetails-এ রেকর্ড ইনসার্ট বা আপডেট হলে, অ্যাক্সেস অটোমেটিক্যালি অর্ডার টোটাল রিক্যালকুলেট করে ম্যাচিং রেকর্ডে Orders টেবিলে স্টোর করবে।

ধাপ ৬: কম্পিউটেশন ডিসপ্লে ও ব্যবহার করুন
- Datasheet View-এ: ক্যালকুলেটেড ফিল্ড লাইভ দেখাবে এবং আপডেট হবে।
- Forms/Reports-এ: ফর্ম বা রিপোর্টের ভিত্তি কোয়েরি (qryOrderSummary) করে ফুল ক্রস-লিংকড রেজাল্ট পান। এক্সপ্রেশন সহ আনবাউন্ড টেক্সট বক্স যোগ করুন।
- ফিল্টারিং/সোর্টিং: কোয়েরি ক্রিটেরিয়া বা সোর্টে ক্যালকুলেটেড ফিল্ড ব্যবহার করতে পারেন।
টিপ: পরে টেবিল ক্যালকুলেটেড ফিল্ড এডিট করতে:
- Datasheet View-এ: কলাম সিলেক্ট করুন >> Fields ট্যাব >> Expression মডিফাই করুন
- অথবা Design View-এ ফিরে যান >> Properties >> Expression সিলেক্ট করুন।
সেরা অনুশীলন ও পারফরম্যান্স বিবেচনা
- টেবিল ক্যালকুলেটেড ফিল্ডের বদলে কোয়েরি প্রিয়োরিটি দিন একাধিক টেবিল, এগ্রিগেট, বা ভবিষ্যতে পরিবর্তন জড়িত যেকোনো কিছুর জন্য। কোয়েরি বেশি পোর্টেবল (যেমন SQL Server-এ) এবং নমনীয়।
- ক্যালকুলেশন স্টোর করবেন না যদি না পারফরম্যান্সের জন্য বাধ্যটা হয় (যেমন: বড় ডেটাসেট যেখানে অন-দ-ফ্লাই সম দ্রুত নয়)। কোয়েরিতে রি-ক্যালকুলেট করুন।
- নরমালাইজেশন: শুধু রateninপুট স্টোর করুন। আউটপুট ডাইনামিক্যালি কম্পিউট করুন।
- টেস্টিং: পরিবর্তনের পর সবসময় স্যাম্পল ডেটা দিয়ে ভেরিফাই করুন, বিশেষ করে রিলেশনশিপ যোগ করার পর।
- পারফরম্যান্স: খুব বেশি ক্যালকুলেটেড ফিল্ড বা বড় টেবিলে জটিল DSum() কল দিন দিয়ে প্রসেস স্লো করতে পারে। ফরেন কী ইনডেক্স করুন।
- লিমিটেশন রিক্যাপ:
- টেবিল ক্যালকুলেটেড এক্সপ্রেশনে অন্য টেবিলের ফিল্ড ডায়রেক্টলি নয়।
- টেবিল ক্যালকুলেটেড ফিল্ডে রেস্ট্রিক্টেড ফাংশন (ফুল VBA এক্সেসের জন্য কোয়েরি ব্যবহার করুন)।
- রেজাল্ট রিড-অনলি।
- স্কেলিং টিপ: খুব অ্যাডভান্সড প্রয়োজনের জন্য, লজিক SQL ভিউ বা SQL Server-जেনের ব্যাকএন্ডে মাইগ্রেট করার কথা ভাবুন, যেখানে কম্পিউটেড কলাম বেশি পাওয়ারফুল।
সাধারণ সমস্যা ও ট্রাবলশুটিং
- #Error বা #Name?: চেক করুন ফিল্ড নাম ব্র্যাকেট []-এ আছে কিনা, ডেটা টাইপ ম্যাচ করছে কিনা, এবং রিলেশনশিপ এক্টিভ কিনা।
- সার্কুলার রেফারেন্স: নিজের এক্সপ্রেশনে ক্যালকুলেটেড ফিল্ড রেফারেন্স করবেন না বা লুপ তৈরি করবেন না।
- ডেটা টাইপ মিসম্যাচ: Result Type এক্সপ্লিসিটলি সেট করুন (যেমন: মানি ফিল্ডের জন্য Currency)।
- ক্রস-টেবিল ফেইল: লজিক কোয়েরিতে জয়েনসহ বা DSum() দিয়ে সরান।
- লিংকড টেবিল ব্যবহার করলে (যেমন: SharePoint বা অন্য ডেটাবেস), ক্যালকুলেটেড ফিল্ডের রো লিমিট বা রিফ্রেশ ইস্যু হতে পারে।
উপসংহার
উপরের ধাপগুলো অনুসরণ করলে আপনি অ্যাক্সেস টেবিলে ক্যালকুলেটেড ফিল্ড যোগ করে অটোমেটিক ক্রস-লিংকড কম্পিউটেশন করতে পারবেন। ক্যালকুলেটেড ফিল্ড মাইক্রোসফট অ্যাক্সেসে রো-লেভেল ক্যালকুলেশন অটোমেট করার জন্য উপযোগী — লাইন টোটাল, ডিসকাউন্ট, ডিউ ডেট, এবং অর্ডার লাইন প্রতি প্রফিটের মতো ভ্যালুর জন্য এটি ভালো কাজ করে। অ্যাডভান্সড ক্রস-লিংকড কম্পিউটেশনের জন্য কোয়েরি সঠিক টুল: এগুলো টেবিলের মধ্যে রিলেশনশিপ ফলো করে এবং অর্ডার টোটাল, কাস্টমার সেলস টোটাল, ইনভেন্টরি ব্যালেন্স, এবং প্রফিট সামারি ক্যালকুলেট করে। ক্যালকুলেটেড ফিল্ড এবং ক্রস-লিংকড কম্পিউটেশন অ্যাক্সেসে মাস্টার করলে একটি স্ট্যাটিক ডেটা স্টোর একটি লিভিং, সেলফ-মেইনটেইনিং সিস্টেমে রূপান্তরিত হয়।
Get FREE Advanced Excel Exercises with Solutions!