BAQ Dataview Example Video

Here’s an example video of how to do a BAQ dataview.

BAQ Dataviews are a great way to view related data onto a screen in Epicor. If you can link the data on the screen to the data you want to display in a BAQ you can display it. They are faster and more flexible than FKVs or embedded dashboards.

and the code.

	public void CreateOrderLineOnHandBAQDV()
	{

		orderLineOnHandBAQDV = new BAQDataView("OrderLineOnHand");
		oTrans.Add("OrderLineOnHandBAQDV",orderLineOnHandBAQDV); 
		string pub1Binding = "OrderDtl.OrderNum"; 
		IPublisher pub1 = oTrans.GetPublisher(pub1Binding);
		if(pub1==null) 
		{ 
			string pubName = Guid.NewGuid().ToString();
			oTrans.PublishColumnChange(pub1Binding, pubName);
			pub1 = oTrans.GetPublisher(pub1Binding);
		} 
		if(pub1 !=null) 
			orderLineOnHandBAQDV.SubscribeToPublisher(pub1.PublishName, "OrderDtl_OrderNum");

		string pub2Binding = "OrderDtl.OrderLine"; 
		IPublisher pub2 = oTrans.GetPublisher(pub2Binding);
		if(pub2==null) 
		{ 
			string pubName = Guid.NewGuid().ToString();
			oTrans.PublishColumnChange(pub2Binding, pubName);
			pub2 = oTrans.GetPublisher(pub2Binding);
		} 
		if(pub2 !=null) 
			orderLineOnHandBAQDV.SubscribeToPublisher(pub2.PublishName, "OrderDtl_OrderLine");



	}
13 Likes

Thanks for sharing. When would be a use case for this vs something like a dynamic query implementation l?

#Always

All kidding aside whenever possible use BAQ DataView they are fast and easy and work just like any regular DataView in your form.
So you get all the EpiMagic and the events that come with it.

BAQDataViews ROCK!

4 Likes

Even better is a UBAQ as a DataView custom dataset, custom methoding, and best child views ever!

3 Likes

So, to mimic the “Retrieve” button on trackers, I would just remove the binding and have the button trigger some code that would link them?

I hope Josh doesn’t mind me sharing his screenshot, but what Josh is refering to is he actually uses UBAQ BPMs to manage the grid, no client side code (or atleast minimal). It becomes it’s own isolated business logic grid.

You know the UDXX Wizard Generated Code… its much cleaner as a BAQDataView, and can easily be re-used in other screens.

Good god where did you dig that up HA HA HA!

The only problem with BAQ Dataviews is the refresh button doesn’t pull the BAQ data again.
To manually refresh them you can use reflection.

using System.Reflection;

   MethodInfo mi = orderLineOnHandBAQDV .GetType().GetMethod("invokeExecute", BindingFlags.Instance | BindingFlags.NonPublic);

   mi.Invoke(orderLineOnHandBAQDV , new object[]{ true });

Pretty sure this code came from @josecgomez

Correct but hey reflection is still valid code :smiley:

2 Likes

This is a very timely post. Thanks for sharing!

Is there an easy button for enabling updates through a BAQDV? The BAQ is updatable but the grid is forcing it to be read only.

No easy button requires reflection

And I noticed the grid refresh was not being triggered when toggling between orders with and without lines. (version E10.1.6xx).

Ref screen shot

While I was playing around with the example in the video - thanks to Carson for that BTW

Good catch @bordway.
The publisher subscribe doesn’t like not having a row. I think embedded dashboards have a similar issue.
This cleans it up. I added an EpiViewNotification to look for a change of the order number and applying a second filter to the dataview. This also clears the view when clear is pressed.

	int currentOrder = 0;
	private void edvOrderHed_EpiViewNotification(EpiDataView view, EpiNotifyArgs args)
	{
		// ** Argument Properties and Uses **
		// view.dataView[args.Row]["FieldName"]
		// args.Row, args.Column, args.Sender, args.NotifyType
		// NotifyType.Initialize, NotifyType.AddRow, NotifyType.DeleteRow, NotifyType.InitLastView, NotifyType.InitAndResetTreeNodes
		if ((args.NotifyType == EpiTransaction.NotifyType.Initialize))
		{
			if ((args.Row > -1))
			{
				if (currentOrder != (int)view.dataView[args.Row]["OrderNum"])
				{
					currentOrder = (int)view.dataView[args.Row]["OrderNum"];
				}
			}
			else	
			{
				currentOrder = 0;
			}

			orderLineOnHandBAQDV.dataView.RowFilter = String.Format("OrderDtl_OrderNum = '{0}'", currentOrder);

		}
	} 

I must not be doing something correctly. If I have just one binding it works just fine. It’s when I try to add the second one in, it just seems to ignore one or the other. In this case, it’s returning the part with all of the customers listed. It doesn’t matter if I put CustID first or second.

	public void CreatetrkCustomerPricingBAQDV()
	{
		trkCustomerPricingBAQDV = new BAQDataView("trkCustomerPricing");
		oTrans.Add("trkCustomerPricingBAQDV",trkCustomerPricingBAQDV); 

		string pub1Binding = "MyCustomerData.CustID"; 
		IPublisher pub1 = oTrans.GetPublisher(pub1Binding);
		if(pub1==null) 
		{ 
			string pubName = Guid.NewGuid().ToString();
			oTrans.PublishColumnChange(pub1Binding, pubName);
			pub1 = oTrans.GetPublisher(pub1Binding);
		} 
		if(pub1 !=null) 
			trkCustomerPricingBAQDV.SubscribeToPublisher(pub1.PublishName, "Customer_CustID");
		
		string pub2Binding = "Part.PartNum"; 
		IPublisher pub2 = oTrans.GetPublisher(pub2Binding);
		if(pub2==null) 
		{ 
			string pubName = Guid.NewGuid().ToString();
			oTrans.PublishColumnChange(pub2Binding, pubName);
			pub2 = oTrans.GetPublisher(pub2Binding);
		} 
		if(pub2 !=null) 
			trkCustomerPricingBAQDV.SubscribeToPublisher(pub2.PublishName, "Part_PartNum");
	}

Yields this:
image

I don’t know if I’m just misunderstanding, or if something isn’t working.

Thanks!

What screen are you adding it to? Does the screen have EpiDataViews of MyCustomerData and Part?

I’m adding it to the part tracker. I have a custom EpiDataView that I store the customer data in, I have bound textboxes as well to make sure they are properly populated. The data refreshes when I put a new part in, but it doesn’t care about changing the CustID (or CustNum) field. I have a feeling I’m misunderstanding something which would explain it.

You could remove the customer ID publish/subscribe relations and do a post filter.

trkCustomerPricingBAQDV.dataView.RowFilter = String.Format("Customer_CustID= '{0}'", insert_customer_ID_here);

I did try that. The query is pretty intense, so I have changed it to a parameterized query where I just get one row back. It takes 1/10th the time. I was just hoping I could figure out something about this because this way is much easier.

I just had an interesting problem with a BAQ Dataview that was subscribed to two fields.
On a UD screen I am storing CustNum_c and ShipToNum_c and retrieving information about the shipto with a BAQ dataview. Everything worked great 90% of the time, but occasionally while moving through records the BAQ data view would not refresh correctly. It didn’t seem to be related to any specific records since sometimes I could leave a record and return to it and it would be ok. I have two other BAQ daviews with a single publish/subscribe relation that work 100% of the time. My work around was to change the my baq dataview to use the SysRowId of the UD table for the publish/subscribe relation.

Has anyone seen similar issues with subscribing to multiple fields?