Filter in overrided lookup on salesline ends up empty.

Hi! I have a question regarding overriding the lookup for ItemId on SalesLine in SalesTable form

The following code is inserted and as I hit the drop down on itemid on salesline it works fine. But in standard you can enter a letter or number in itemid field on the grid and it automaticaly returns a filter on the lookup. This function does not work for me. As I debug the code is run successfully but an empty result is returned on the screen.

[FormControlEventHandler(formControlStr(SalesTable, SalesLine_ItemId), FormControlEventType::Lookup)]

public static void SalesLine_ItemId_OnLookup(FormControl sender, FormControlEventArgs e)

{

str itemidFilter;

STA002ItemLookup::ItemLookup(sender,e);

itemidFilter= sender.formRun().design().controlName(formControlStr(SalesTable, SalesLine_ItemId)).valueStr();

FormControlCancelableSuperEventArgs ce = e as FormControlCancelableSuperEventArgs;

ce.CancelSuperCall();

}

So the first question is how I can get the characters the user puts in itemid field on salesline. Since my code above for itemidFilter does not work.

The second question is how I can get it to filter my lookup instead.

the only clue I have is that on salesLine table (lookupItemNumber method) there is 2 lines that has to do with a delegat. (see code below) Is this the reason? And what do I do to make it work for me. so that my lookup does not end up empty.

thanks in advance

//Regina

public static void lookupItemNumber(FormControl _formControl, SalesLine _salesLine, str _filterStr)

{

EventHandlerResult result = EventHandlerResult::newSingleResponse();

SalesLine::lookupItemNumberDelegate(_formControl, _salesLine, _filterStr, result);

if (!result.hasResult())

{

InventTable::lookupItem(_formControl);

}

}

This seems to be about D365FO - please attach a version tag next time.

itemidFilter variable in your code has no effect, therefore the code can be reduced to this:

[FormControlEventHandler(formControlStr(SalesTable, SalesLine_ItemId), FormControlEventType::Lookup)]
public static void SalesLine_ItemId_OnLookup(FormControl sender, FormControlEventArgs e)
{
    STA002ItemLookup::ItemLookup(sender,e);

    FormControlCancelableSuperEventArgs ce = e as FormControlCancelableSuperEventArgs;
    ce.CancelSuperCall();
}

The whole lookup logic is inside STA002ItemLookup::ItemLookup(), therefore you should look for a bug there. If you need our help with it, show us the code.

Hi, thanks

this is regarding version Update15 (7.0.4841.35234)

I know that itemid has no function in the code it was only ment to show the code I tried but did not work. How do I get the characters the user write in the field (itemid) on the salesline?? I only tried that without success.

I attached the code below that was missing. And when debugging I can see that it inserts rows in my tmp table. If I use the drop down beside the itemid on the salesline my lookup appears and contains all items.

But when the user enters for instance 1 or any other caracter in the itemid field on the salesline in d365 it will enter the lookup but when the lookup shows it does not contain any lines. Even though I debugged and saw lines was inserted.

public static void ItemLookup(FormControl sender, FormControlEventArgs e)

{

inventDimParm inventDimParm;

InventDim inventDim;

STA002ItemLookupTmp STAItemLookupTmp;

inventItemIdLookupSimpleView inventItemIdLookupSimpleView;

Query query;

QueryRun queryRun;

QueryBuildDataSource inventItemIdLookupSimpleViewQbds;

InventOnhand inventOnHand;

InventItemSalesSetup inventItemSalesSetup;

SysTableLookup sysTableLookup = SysTableLookup::newParameters(tableNum(STA002ItemLookupTmp), sender);

query = new Query();

inventItemIdLookupSimpleViewQbds = query.addDataSource(tableNum(inventItemIdLookupSimpleView));

inventItemIdLookupSimpleViewQbds.addSortField(fieldNum(inventItemIdLookupSimpleView, ItemId));

inventItemIdLookupSimpleViewQbds.firstFast(true);

queryRun = new QueryRun(query);

while (queryRun.next())

{

inventItemIdLookupSimpleView = queryRun.get(tableNum(inventItemIdLookupSimpleView));

STAItemLookupTmp.ItemId = inventItemIdLookupSimpleView.ItemId;

STAItemLookupTmp.NameAlias = inventItemIdLookupSimpleView.NameAlias;

STAItemLookupTmp.ProductName = inventItemIdLookupSimpleView.ProductName;

STAItemLookupTmp.ItemGroupId = inventItemIdLookupSimpleView.ItemGroupId;

STAItemLookupTmp.OD1 = inventItemIdLookupSimpleView.STAOD1;

STAItemLookupTmp.OD2 = inventItemIdLookupSimpleView.STAOD2;

STAItemLookupTmp.ID = inventItemIdLookupSimpleView.STAID;

STAItemLookupTmp.GT = inventItemIdLookupSimpleView.STAGT;

STAItemLookupTmp.Length = inventItemIdLookupSimpleView.STALength;

STAItemLookupTmp.Standard = inventItemIdLookupSimpleView.STAStandard;

STAItemLookupTmp.Condition = inventItemIdLookupSimpleView.STACondition;

STAItemLookupTmp.SteelGrade = inventItemIdLookupSimpleView.STASteelGrade;

STAItemLookupTmp.SurfaceCondition = inventItemIdLookupSimpleView.STASurfaceCondition;

inventdim = InventDim::findOrCreate(InventDim);

select firstonly inventItemSalesSetup where inventItemSalesSetup.itemid == STAItemLookupTmp.ItemId &&

inventItemSalesSetup.InventDimId == inventdim.inventDimId;

inventdim.clear();

inventDim.InventLocationId = inventItemSalesSetup.inventDimDefault().InventLocationId;

if(inventDim.InventLocationId)

{

inventDimParm.initFromInventDim(inventDim);

inventOnhand = InventOnhand::newParameters(STAItemLookupTmp.ItemId, inventDim, inventDimParm);

STAItemLookupTmp.AvailPhysical = inventOnhand.AvailPhysical();

}

else

{

STAItemLookupTmp.AvailPhysical = 0;

}

STAItemLookupTmp.insert();

}

sysTableLookup.addLookupfield(fieldNum(STA002ItemLookupTmp, ItemId), true);

sysTableLookup.addLookupfield(fieldNum(STA002ItemLookupTmp, OD1));

sysTableLookup.addLookupfield(fieldNum(STA002ItemLookupTmp, OD2));

sysTableLookup.addLookupfield(fieldNum(STA002ItemLookupTmp, ID));

sysTableLookup.addLookupfield(fieldNum(STA002ItemLookupTmp, GT));

sysTableLookup.addLookupfield(fieldNum(STA002ItemLookupTmp, Length));

sysTableLookup.addLookupfield(fieldNum(STA002ItemLookupTmp, AvailPhysical));

sysTableLookup.addLookupfield(fieldNum(STA002ItemLookupTmp, Standard));

sysTableLookup.addLookupfield(fieldNum(STA002ItemLookupTmp, Condition));

sysTableLookup.addLookupfield(fieldNum(STA002ItemLookupTmp, SteelGrade));

sysTableLookup.addLookupfield(fieldNum(STA002ItemLookupTmp, SurfaceCondition));

sysTableLookup.addLookupfield(fieldNum(STA002ItemLookupTmp, NameAlias));

sysTableLookup.addLookupField(fieldNum(STA002ItemLookupTmp, ProductName));

sysTableLookup.addLookupfield(fieldNum(STA002ItemLookupTmp, ItemGroupId));

sysTableLookup.parmTmpBuffer(STAItemLookupTmp);

sysTableLookup.performFormLookup();

}

Let me format your code so I we can see its structure:

public static void ItemLookup(FormControl sender, FormControlEventArgs e)
{
    InventDimParm inventDimParm;
    InventDim inventDim;
    STA002ItemLookupTmp staItemLookupTmp;
    inventItemIdLookupSimpleView inventItemIdLookupSimpleView;
    Query query = new Query();
    QueryRun queryRun;
    QueryBuildDataSource inventItemIdLookupSimpleViewQbds;
    InventOnhand inventOnHand;
    InventItemSalesSetup inventItemSalesSetup;

    SysTableLookup sysTableLookup = SysTableLookup::newParameters(tableNum(STA002ItemLookupTmp), sender);

    inventItemIdLookupSimpleViewQbds = query.addDataSource(tableNum(inventItemIdLookupSimpleView));
    inventItemIdLookupSimpleViewQbds.addSortField(fieldNum(inventItemIdLookupSimpleView, ItemId));
    inventItemIdLookupSimpleViewQbds.firstFast(true);

    queryRun = new QueryRun(query);

    while (queryRun.next())
    {
        inventItemIdLookupSimpleView = queryRun.get(tableNum(inventItemIdLookupSimpleView));
        staItemLookupTmp.ItemId = inventItemIdLookupSimpleView.ItemId;
        staItemLookupTmp.NameAlias = inventItemIdLookupSimpleView.NameAlias;
        staItemLookupTmp.ProductName = inventItemIdLookupSimpleView.ProductName;
        staItemLookupTmp.ItemGroupId = inventItemIdLookupSimpleView.ItemGroupId;
        staItemLookupTmp.OD1 = inventItemIdLookupSimpleView.STAOD1;
        staItemLookupTmp.OD2 = inventItemIdLookupSimpleView.STAOD2;
        staItemLookupTmp.ID = inventItemIdLookupSimpleView.STAID;
        staItemLookupTmp.GT = inventItemIdLookupSimpleView.STAGT;
        staItemLookupTmp.Length = inventItemIdLookupSimpleView.STALength;
        staItemLookupTmp.Standard = inventItemIdLookupSimpleView.STAStandard;
        staItemLookupTmp.Condition = inventItemIdLookupSimpleView.STACondition;
        staItemLookupTmp.SteelGrade = inventItemIdLookupSimpleView.STASteelGrade;
        staItemLookupTmp.SurfaceCondition = inventItemIdLookupSimpleView.STASurfaceCondition;

        inventdim = InventDim::findOrCreate(InventDim);

        select firstonly inventItemSalesSetup
            where inventItemSalesSetup.itemid == staItemLookupTmp.ItemId
               && inventItemSalesSetup.InventDimId == inventdim.inventDimId;

        inventdim.clear();
        inventDim.InventLocationId = inventItemSalesSetup.inventDimDefault().InventLocationId;
        
        if (inventDim.InventLocationId)
        {
            inventDimParm.initFromInventDim(inventDim);
            inventOnhand = InventOnhand::newParameters(staItemLookupTmp.ItemId, inventDim, inventDimParm);
            staItemLookupTmp.AvailPhysical = inventOnhand.AvailPhysical();
        }
        else
        {
            staItemLookupTmp.AvailPhysical = 0;
        }

        staItemLookupTmp.insert();
    }

    sysTableLookup.addLookupfield(fieldNum(STA002ItemLookupTmp, ItemId), true);
    sysTableLookup.addLookupfield(fieldNum(STA002ItemLookupTmp, OD1));
    sysTableLookup.addLookupfield(fieldNum(STA002ItemLookupTmp, OD2));
    sysTableLookup.addLookupfield(fieldNum(STA002ItemLookupTmp, ID));
    sysTableLookup.addLookupfield(fieldNum(STA002ItemLookupTmp, GT));
    sysTableLookup.addLookupfield(fieldNum(STA002ItemLookupTmp, Length));
    sysTableLookup.addLookupfield(fieldNum(STA002ItemLookupTmp, AvailPhysical));
    sysTableLookup.addLookupfield(fieldNum(STA002ItemLookupTmp, Standard));
    sysTableLookup.addLookupfield(fieldNum(STA002ItemLookupTmp, Condition));
    sysTableLookup.addLookupfield(fieldNum(STA002ItemLookupTmp, SteelGrade));
    sysTableLookup.addLookupfield(fieldNum(STA002ItemLookupTmp, SurfaceCondition));
    sysTableLookup.addLookupfield(fieldNum(STA002ItemLookupTmp, NameAlias));
    sysTableLookup.addLookupField(fieldNum(STA002ItemLookupTmp, ProductName));
    sysTableLookup.addLookupfield(fieldNum(STA002ItemLookupTmp, ItemGroupId));

    sysTableLookup.parmTmpBuffer(staItemLookupTmp);

    sysTableLookup.performFormLookup();
}

And we can greatly simplify it, so we can focus on the actual problem.

public static void ItemLookup(FormControl sender, FormControlEventArgs e)
{
    STA002ItemLookupTmp staItemLookupTmp;
    inventItemIdLookupSimpleView inventItemIdLookupSimpleView;
    Query query = new Query();
    QueryRun queryRun;

    SysTableLookup sysTableLookup = SysTableLookup::newParameters(tableNum(STA002ItemLookupTmp), sender);

    query.addDataSource(tableNum(inventItemIdLookupSimpleView));

    queryRun = new QueryRun(query);

    while (queryRun.next())
    {
        inventItemIdLookupSimpleView = queryRun.get(tableNum(inventItemIdLookupSimpleView));
        staItemLookupTmp.ItemId = inventItemIdLookupSimpleView.ItemId;

        staItemLookupTmp.insert();
    }

    sysTableLookup.addLookupfield(fieldNum(STA002ItemLookupTmp, ItemId), true);
    sysTableLookup.parmTmpBuffer(staItemLookupTmp);
    sysTableLookup.performFormLookup();
}

A thing that looks suspicious to me is that you don’t provide any query for sysTableLookup. Shouldn’t you create a query for reading data from STA002ItemLookupTmp and pass this query to sysTableLookup?

Note that to make the code easier to read and maintain, you should extract the logic for preparing the data to a separate method. That’s what the Single Responsibility Principle is about - you’ll have one method responsible for preparing the data and another method responsible for building the lookup.

Ok but I do not use a Query to feed the lookup I use a tmp buffer . That is why I do not have a Query.

This line feeds the lookup
sysTableLookup.parmTmpBuffer(staItemLookupTmp);

And this code actually do return the lines. The problem only occures when the user is typing a letter to search for an item in the itemfield on the salesline. If the user hits the drop down all items will be returned as it should

But thanks for your time

//Regina

You need a query to read data tables.

AHHHH, Thank´s a lot. I did not know that to have the search function working it had to be a Query in the lookup.

I only selected tmp table because they wanted available physical for the item in the lookup.