Easy-Acumatica
Documentation

Generic Inquiries

Access Acumatica Generic Inquiries via OData endpoints

Overview

Generic Inquiries (GI) in Acumatica are custom data queries configured through the Acumatica UI. Easy-Acumatica automatically discovers available Generic Inquiries and generates methods to access them.

All inquiries are accessed through client.inquiries and support filtering, sorting, and pagination using QueryOptions.

Python
from easy_acumatica import AcumaticaClient
from easy_acumatica.odata import QueryOptions, F

client = AcumaticaClient()

# Access a Generic Inquiry
results = client.inquiries.customer_sales_summary()

# With filtering
options = QueryOptions(
    filter=F.CustomerClass == "WHOLESALE",
    top=50
)
filtered_results = client.inquiries.customer_sales_summary(options=options)

Discovery

List available Generic Inquiries in your Acumatica instance:

Python
# List all available inquiries
for service in dir(client.inquiries):
    if not service.startswith('_'):
        print(service)

# Check if specific inquiry exists
if hasattr(client.inquiries, 'customer_sales_summary'):
    results = client.inquiries.customer_sales_summary()

# Get inquiry method info
import inspect
method = getattr(client.inquiries, 'customer_sales_summary')
print(inspect.getsource(method))

Basic Usage

Access Generic Inquiry results using the dynamically generated methods:

Python
# Call an inquiry without options
all_results = client.inquiries.open_sales_orders()

# Iterate through results
for order in all_results:
    print(f"Order: {order['OrderNbr']}, Customer: {order['CustomerID']}")

# Access specific fields
for order in all_results:
    order_number = order.get('OrderNbr')
    total = order.get('OrderTotal')
    status = order.get('Status')

Filtering Results

Use F factory and QueryOptions to filter inquiry results:

Python
from easy_acumatica.odata import QueryOptions, F

# Simple filter
options = QueryOptions(
    filter=F.CustomerClass == "WHOLESALE"
)
wholesale_customers = client.inquiries.customer_list(options=options)

# Complex filter
options = QueryOptions(
    filter=(
        (F.Status == "Open") & 
        (F.OrderTotal > 10000) &
        (F.OrderDate.year() == 2024)
    )
)
large_orders = client.inquiries.open_sales_orders(options=options)

# String operations
options = QueryOptions(
    filter=F.CustomerName.startswith("ABC")
)
abc_customers = client.inquiries.customer_list(options=options)

Pagination

Handle large result sets with pagination:

Python
# Get first 100 results
options = QueryOptions(top=100)
page1 = client.inquiries.inventory_summary(options=options)

# Get next 100 results (skip first 100)
options = QueryOptions(top=100, skip=100)
page2 = client.inquiries.inventory_summary(options=options)

# Pagination loop
page_size = 100
page = 0
all_results = []

while True:
    options = QueryOptions(top=page_size, skip=page * page_size)
    results = client.inquiries.inventory_summary(options=options)
    
    if not results:
        break
    
    all_results.extend(results)
    page += 1
    
    print(f"Fetched {len(results)} items (total: {len(all_results)})")

Field Selection

Select specific fields to reduce payload size:

Python
# Select specific fields only
options = QueryOptions(
    select=["CustomerID", "CustomerName", "Balance"],
    top=50
)
customers = client.inquiries.customer_list(options=options)

# Result contains only selected fields
for customer in customers:
    print(customer)  # Only CustomerID, CustomerName, Balance

Sorting

Sort inquiry results:

Python
# Sort ascending
options = QueryOptions(
    orderby=["CustomerName"]
)
sorted_customers = client.inquiries.customer_list(options=options)

# Sort descending
options = QueryOptions(
    orderby=["OrderTotal desc"]
)
high_value_orders = client.inquiries.open_sales_orders(options=options)

# Multiple sort fields
options = QueryOptions(
    orderby=["CustomerClass", "Balance desc"]
)
customers = client.inquiries.customer_list(options=options)

Complex Example

Combine filtering, sorting, pagination, and field selection:

Python
from easy_acumatica import AcumaticaClient
from easy_acumatica.odata import QueryOptions, F
from datetime import datetime, timedelta

client = AcumaticaClient()

# Complex inquiry with all options
thirty_days_ago = datetime.now() - timedelta(days=30)

options = QueryOptions(
    # Filter for recent high-value wholesale orders
    filter=(
        (F.CustomerClass == "WHOLESALE") &
        (F.Status == "Open") &
        (F.OrderTotal >= 5000) &
        (F.OrderDate >= thirty_days_ago)
    ),
    # Select only needed fields
    select=[
        "OrderNbr",
        "CustomerID", 
        "CustomerName",
        "OrderDate",
        "OrderTotal",
        "Status"
    ],
    # Sort by total descending
    orderby=["OrderTotal desc"],
    # First 50 results
    top=50
)

orders = client.inquiries.open_sales_orders(options=options)

# Process results
total_value = sum(order.get('OrderTotal', 0) for order in orders)
print(f"Found {len(orders)} high-value wholesale orders")
print(f"Total value: ${total_value:,.2f}")

for order in orders:
    print(f"{order['OrderNbr']}: {order['CustomerName']} - ${order['OrderTotal']:,.2f}")

Method Naming

Generic Inquiry names are converted to snake_case method names. The system removes special characters and converts spaces to underscores.

Inquiry NameMethod Name
Customer Orders Summaryclient.inquiries.customer_orders_summary()
AP-Invoice-Detailsclient.inquiries.ap_invoice_details()
Open Sales Ordersclient.inquiries.open_sales_orders()
Inventory by Locationclient.inquiries.inventory_by_location()

Best Practices

  • Use select to request only needed fields
  • Apply filters to reduce result set size
  • Use pagination for large datasets
  • Check inquiry availability with hasattr() before calling
  • Cache inquiry results when data doesn't change frequently
  • Generic Inquiries are read-only - use entity endpoints for write operations

Troubleshooting

Inquiry Not Found

Python
# Check if inquiry exists before calling
if hasattr(client.inquiries, 'my_custom_inquiry'):
    results = client.inquiries.my_custom_inquiry()
else:
    print("Inquiry 'my_custom_inquiry' not found")
    print("Available inquiries:")
    for attr in dir(client.inquiries):
        if not attr.startswith('_'):
            print(f"  - {attr}")

# Handle potential errors
try:
    results = client.inquiries.customer_sales_summary()
except AttributeError:
    print("Inquiry not available - check Acumatica configuration")
except Exception as e:
    print(f"Error accessing inquiry: {e}")

Empty Results

If an inquiry returns empty results, verify the inquiry works in the Acumatica UI and check that your filter conditions are correct.

Performance Issues

Large Generic Inquiries can be slow. Optimize by:

  • Using filters to reduce result set
  • Selecting only necessary fields
  • Adding appropriate pagination
  • Optimizing the GI query in Acumatica