Monday, January 16, 2012

Making string field a custom lookup on user selection

Sometimes we just compile our posts to keep the things at one place so we or someone can get it easily when we in need. This post belongs to the same concept :)

Requirement was to filter the records in grid according to the selection of base enum values from a lookup. Easy task :) but then I had to make a string field a custom lookup on selection of first value from base enum and to make it a read only on selection of second value of the base enum.

This is what I did;

Filter: modified
public boolean modified()
{
    boolean ret;
    ret = super();

    if(str2enum(enum_variable,this.valueStr()) == enum::firstvalue)
    {
        stringField.allowEdit(true);
        stringField .text(' ');
    }
    else
    {
         stringField .allowEdit(False);
         stringField .text(curuserid());                
    }
    return ret;
}

StringEdit: StringField
// This lookup is populating users 
Public void lookup()
{
    Query                   query = new Query();
    QueryBuildDataSource    queryBuildDataSource;
    QueryBuildRange         queryBuildRange;
    SysTableLookup          sysTableLookup;
    ;

    //Create an instance of SysTableLookup with the form control passed in
    sysTableLookup = SysTableLookup::newParameters(tablenum(UserInfo), this);

    //Add the fields to be shown in the lookup form
    sysTableLookup.addLookupfield(fieldnum(UserInfo, id), true);
    sysTableLookup.addLookupfield(fieldnum(UserInfo, name), false);

    //create the query datasource
    queryBuildDataSource = query.addDataSource(tablenum(UserInfo));
    queryBuildRange = queryBuildDataSource.addRange(fieldnum(UserInfo, Id));
    queryBuildRange.value(element.getusers());

    //add the query to the lookup form
    sysTableLookup.parmQuery(query);

    // Perform lookup
    sysTableLookup.performFormLookup();
}

// Method to get users
str 100 getusers()
{    
    str 100                     Users;
    ;
    While Select UsersTable where  UsersTable .UserId == Curuserid()
    {
        Select Firstonly SysCompanyUserInfo where SysCompanyUserInfo.EmplId ==  UsersTable.Emplid ;
        Users+= SysCompanyUserInfo.UserId +',';
    }
    if(!Users)
        Return '\"\"' ;

    Return Users ;
}

5 comments:

  1. Nice post,, I tried this out , and I am able to see my lookup list in case of my stringEdit, yet when I select a value from the lookup, I get an error that says
    The value '001' in field 'Sales misc charge' is not found in related table 'Charges code'
    001 is the value I selected from the lookup ie Markup code value. This is my code:
    public void lookup()
    {
    SysTableLookup sysTableLookup;
    Query query;
    QueryBuildDataSource queryBuildDataSource;
    ;

    sysTableLookup = SysTableLookup::newParameters(tablenum(MarkupTable), this);
    query = new Query();
    queryBuildDataSource = query.addDataSource(tablenum(MarkupTable));
    queryBuildDataSource.addRange(fieldnum(MarkupTable,ModuleType)).value(sysQuery::value(1));
    queryBuildDataSource.addRange(fieldnum(MarkupTable,ModuleType)).value(sysQuery::value("Inventory"));
    sysTableLookup.addLookupfield(fieldnum(MarkupTable, MarkupCode));
    sysTableLookup.addLookupfield(fieldnum(MarkupTable, Txt));
    sysTableLookup.parmQuery(query);
    sysTableLookup.performFormLookup();
    }

    Sales misc charge is the name of the string edit, and charges code is the first column's header. Could you pls help me resolve this?

    ReplyDelete
  2. I am not using an enum though, the values from the markup table are strings

    ReplyDelete
    Replies
    1. Hi, did u get answer to your question, iam also facing the same issue, can u please explain me the solution if u have please

      Delete
  3. hi..my requirement is...i have a repoet dialog .in dailog having one dynamic field(year).in this year field having lookup.in this i need current to 10 previous years list.in this we have select the year.

    any body having solutions

    ReplyDelete

I will appreciate your comments !