মূল কনটেন্টে যান
← ব্লগে ফিরে যান

এই নিবন্ধের মডিউল: 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: typo ছাড়া $select, $filter, $expand ও $orderby

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=50

Adapter-এ query options এক লাইনে লেখা হয়; এখানে শুধু পড়ার সুবিধার জন্য ভেঙে দেখানো হয়েছে।

চারটি option, একে একে

Optionকী করেউদাহরণ
$selectশুধু উল্লেখ করা properties ফেরত দেয়, ফলে responses ছোট থাকে$select=SalesOrder,SoldToParty
$filterশুধু সেই rows ফেরত দেয় যা condition পূরণ করে$filter=SalesOrderType eq 'OR'
$expandnavigation property-এর মাধ্যমে related entities অন্তর্ভুক্ত করে$expand=to_Item
$orderbyrows 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 করুন, যাতে নামগুলো সঠিক থাকে।

ডিজাইনার না ছেড়েই iFlows-এ কাজ করুন

Kitegra Chrome বা Microsoft Edge-এ যোগ করুন। ফ্রিতে শুরু করুন, কোনো অ্যাকাউন্ট লাগবে না।