এই নিবন্ধের মডিউল: Integration Flow Helper
SAP CPI OData receiver: typo ছাড়া $select, $filter, $expand ও $orderby
SAP CPI OData receiver-এর query options লিখুন: উদাহরণসহ $select, $filter, $expand, $orderby ও $top, V2 ও V4-এর পার্থক্য, এবং যে ভুলগুলো HTTP 400 দেয়।

SAP CPI-এর OData receiver adapter একটি Resource Path ও এক লাইনের query options-কে একটি OData service call-এ রূপান্তর করে, যেমন SAP S/4HANA-এর একটি API। Query options ঠিক করে কোন fields, rows ও related entities ফেরত আসবে, আর service-এর call প্রত্যাখ্যান করতে একটি ভুল বানানের property name-ই যথেষ্ট।
এই নিবন্ধে একটি উদাহরণসহ $select, $filter, $expand ও $orderby, OData V2 ও V4-এর যে পার্থক্যগুলো মানুষকে বিভ্রান্ত করে, এবং নামগুলো সঠিক রাখার উপায় আলোচনা করা হয়েছে।
OData receiver-এ query options কোথায় লেখা হয়
Adapter-এর Processing tab-এ আপনি operation বেছে নেন, তারপর Resource Path সেট করেন, অর্থাৎ যে entity set বা entity-কে call করছেন, এবং Query Options, অর্থাৎ URL-এ ?-এর পরে যা কিছু আসে। Adapter-এর query wizard service-এর metadata থেকে দুটোই তৈরি করতে পারে, এবং সেই metadata, অর্থাৎ EDMX ফাইল, iFlow-এর resources-এ সংরক্ষণ করে।
Query options-এ Simple expressions থাকতে পারে, তাই values message থেকে আসতে পারে, যেমন $filter=SoldToParty eq '${property.customerId}'। নিচের উদাহরণটি API_SALES_ORDER_SRV থেকে, যা একটি OData V2 service, sales orders তাদের items-সহ পড়ে:
Resource Path: A_SalesOrder
Query Options: $select=SalesOrder,SoldToParty,CreationDate,to_Item/SalesOrderItem,to_Item/Material
&$expand=to_Item
&$filter=SoldToParty eq '${property.customerId}' and CreationDate ge datetime'2026-01-01T00:00:00'
&$orderby=CreationDate desc
&$top=50Adapter-এ query options এক লাইনে লেখা হয়; এখানে শুধু পড়ার সুবিধার জন্য ভেঙে দেখানো হয়েছে।
চারটি option, একে একে
| Option | কী করে | উদাহরণ |
|---|---|---|
$select | শুধু উল্লেখ করা properties ফেরত দেয়, ফলে responses ছোট থাকে | $select=SalesOrder,SoldToParty |
$filter | শুধু সেই rows ফেরত দেয় যা condition পূরণ করে | $filter=SalesOrderType eq 'OR' |
$expand | navigation property-এর মাধ্যমে related entities অন্তর্ভুক্ত করে | $expand=to_Item |
$orderby | rows sort করে, default হিসেবে ascending | $orderby=CreationDate desc |
$top ও $skip ফলাফল সীমিত করে ও pages-এ ভাগ করে। OData V2-তে expand করা entity-এর property একটি path দিয়ে select করা হয়, যেমন to_Item/Material, আর navigation property-টিও $expand-এ থাকতে হবে।
$filter-এর নিজস্ব operators আছে: eq, ne, gt, ge, lt, le, যা and, or ও not দিয়ে যুক্ত হয়। Text values single quotes-এ লেখা হয়, আর তারিখের জন্য service-এর version যে literal রূপ প্রত্যাশা করে সেটি লাগে।
OData V2 ও V4 আলাদাভাবে লেখা হয়
OData adapter দুটি version-ই support করে, আর SAP-এর অনেক API দুটোতেই আছে। এক version থেকে অন্যটিতে query copy করা ভুলের একটি সাধারণ উৎস:
OData V2: $inlinecount=allpages
$filter=substringof('Smith',CustomerName)
$filter=CreationDate ge datetime'2026-01-01T00:00:00'
OData V4: $count=true
$filter=contains(CustomerName,'Smith')
$filter=CreatedAt ge 2026-01-01T00:00:00Z
$expand=_Item($select=Product,Quantity)- Rows গোনা: V2-তে
$inlinecount=allpages, V4-এ$count=true। - Text-এর ভেতরে খোঁজা: V2-তে
substringof('Smith',CustomerName), V4-এcontains(CustomerName,'Smith')। লক্ষ করুন, arguments-এর ক্রম উল্টো। - তারিখ: V2 লেখে
datetime'2026-01-01T00:00:00'; V4 value লেখে কোনো prefix ছাড়া। - Expand করা properties: V2 সেগুলো path দিয়ে select করে; V4 options-কে expand-এর ভেতরে nest করে, যেমন
$expand=_Item($select=Product,Quantity)।
যে typos HTTP 400 দেয়
কোনো query option ভুল হলে service সাধারণত HTTP 400 দিয়ে উত্তর দেয় এবং যে অংশটি পড়তে পারেনি তা জানায়। এর পেছনের ভুলগুলো প্রায় সবসময় একই:
- ভুল case: OData-এর নাম case-sensitive, তাই
soldToPartyআরSoldToPartyএক নয়। - Navigation property-এর জায়গায় entity set:
$expand=to_Item-এর বদলে$expand=A_SalesOrderItem। - এমন property যা অন্য entity-তে আছে, বা শুধু service-এর অন্য version-এ আছে।
- Text values-এর চারপাশে quotes বাদ পড়া, বা V4 service-এ V2-এর date literal পাঠানো।
- Separator-এর সমস্যা: options
&দিয়ে যুক্ত হয়, আর প্রতিটি option-এর নাম$দিয়ে শুরু হয়।
Expressions নিজস্ব ঝুঁকি যোগ করে: ${property.customerId} খালি হলে filter হয়ে যায় SoldToParty eq '' এবং error না দিয়ে নিঃশব্দে কোনো row ফেরত দেয় না। Simple expressions নিয়ে নিবন্ধটি ব্যাখ্যা করে এই values কীভাবে পড়া হয়।
Query ও service-কে সামঞ্জস্যপূর্ণ রাখুন
- নামের জন্য iFlow-এর resources-এ থাকা EDMX-কে source of truth হিসেবে নিন, এবং service বদলালে সেটি refresh করুন।
- শুধু সেই fields select করুন যা আপনি map করেন; ছোট response দ্রুত এবং trace-এ পড়া সহজ।
- বড় reads-এর জন্য একটি বিশাল response-এর বদলে adapter-এর pages-এ process করার option ব্যবহার করুন।
- Query-টি একবার ঠিক সেই values দিয়ে test করুন যা একটি আসল message এতে বসাবে।
OData service-এর বদলে REST API call করছেন? Postman ও OpenAPI নিয়ে নিবন্ধটি HTTP receiver ব্যাখ্যা করে।
Kitegra কীভাবে সাহায্য করে
Kitegra browser এক্সটেনশন OData receiver channel-এর জন্য সেই EDMX পড়ে যা আপনার iFlow-এ আগে থেকেই আছে। ডিজাইনারে এটি সেই EDMX থেকে Resource Path এবং $select, $filter, $expand ও $orderby-এর জন্য property ও navigation names সাজেস্ট করে, তাই আপনি নাম টাইপ না করে বেছে নেন।
এর lint panel EDMX-এ নেই এমন OData নাম চিহ্নিত করে, সঙ্গে বন্ধ না করা ${ এবং এমন headers বা properties যা কিছুই সেট করে না। কোনো channel সাজেশন না পেলে দেখুন তার EDMX iFlow-এর resources-এ আছে কিনা। এক্সটেনশনটি কখনো কোনো iFlow-এর content সংরক্ষণ, deploy বা edit করে না, এবং আপনার tenant কেবল তখনই বদলায় যখন আপনি নাম দেওয়া চারটি action-এর একটিতে ক্লিক করেন, যেগুলো বন্ধও করা যায়।
OData service আসলে কী উত্তর দিয়েছে তা যাচাই করতে message-টি step by step trace করুন এবং call-এর পরের body পড়ুন।
Kitegra অ্যাকাউন্ট ছাড়া এটি প্রতিটি মডিউলে 5টি iFlow-এ কাজ করে। Free প্ল্যানে 50, Starter-এ 100 এবং Pro-তে 300টি iFlow অন্তর্ভুক্ত; Business-এ কোনো সীমা নেই। প্ল্যানগুলো তুলনা করুন।
আপনার পরবর্তী iFlow-এ চেষ্টা করুন
SAP Integration Suite ডিজাইনারে Kitegra কী করে তা পড়ুন, অথবা Kitegra-এর অন্য Chrome এক্সটেনশনগুলোর পাশে এটি দেখুন।
সাধারণ জিজ্ঞাসা
SAP CPI OData adapter-এ $filter কোথায় লিখব?
Receiver channel-এর Processing tab-এর Query Options field-এ, অন্য options-এর সঙ্গে, যেমন $select=SalesOrder&$filter=SalesOrderType eq 'OR'।
OData filter-এর ভেতরে কি header বা property ব্যবহার করা যায়?
হ্যাঁ। Query options Simple expressions গ্রহণ করে, যেমন $filter=SoldToParty eq '${property.customerId}'। Value খালি হলে filter কোনো row ফেরত দেয় না, তাই আগে সেটি যাচাই করুন।
$inlinecount ও $count-এর পার্থক্য কী?
$inlinecount=allpages OData V2-এর; $count=true OData V4-এর রূপ। দুটোই ফলাফলের সঙ্গে condition পূরণ করা rows-এর মোট সংখ্যা ফেরত দেয়।
আমার service-এ substringof কেন fail করে?
substringof শুধু OData V2-তে আছে। একটি OData V4 service contains(Property,'text') ব্যবহার করে, যেখানে arguments-এর ক্রম উল্টো।
Service কেন HTTP 400 দিয়ে উত্তর দেয়?
সাধারণত কারণ query-এর কোনো নাম সেই entity-তে নেই, প্রায়ই case-এর কারণে, navigation property ও entity set গুলিয়ে ফেলায়, বা OData-এর অন্য version-এর syntax ব্যবহার করায়।
SAP CPI OData metadata কোথায় রাখে?
Query wizard service-এর EDMX ফাইল iFlow-এর resources-এ সংরক্ষণ করে। Service বদলালে সেটি refresh করুন, যাতে নামগুলো সঠিক থাকে।