How to validate user input with MS SQL Table ?

Hi Community,

I have a user input task on my site. User fills the data and the data goes into MS SQL table.

I have a field (say PR No.) in my form. I want to validate the the data entered by user in the PR filed on the fly with my table to check whether PR No. entered by user exist in my table or not ?

How can i do it ?

 

Thanks for your help.

  Discussion posts and replies are publicly visible

Parents
  • Hi prup
    first you have to write query entity to fetch table data and then a!queryentity().data.PR No hear you wil get list of {PN No}
    then by using contains() function you can search the entered PR NO

    example:

    load(
    Local!PRNoList: a!queryEntity().data.PRNO,
    a!sectionLayout(
    label :"",
    contents: a!columnsLayout(
    columns: {
    a!columnLayout(
    contents: {
    a!textField(
    label: "PR NO",
    value: ri!PRNO,
    saveInto: ri!PRNO,
    validations: if(
    contains(
    local!PRNoList,
    ri!prNo
    ),
    "PR No Exists",
    {}
    )
    )
    }
    )
    }
    )
    )
    )

  • Hi  I have almost two hundred thousand (2,00,000) record in PR table and when i used the Query rule i was able to fetch only 2000 records. If i try to fetch all record i get "Function evaluation error : Memory threshold reached during output conversion". Is there anyway to fix this problem ?

  • create query rule as CheckPRNumber with below logic.

    a!queryEntity(
    entity: cons!(Constant which refers your Pr NO Entity),
    query: a!query(

    filter : if(
    isnull(ri!PRNo),
    null,
    a!queryFilter(
    field :"PRNo",
    operator:"=",
    value :ri!PRNo
    )
    ),
    pagingInfo:a!pagingInfo(
    startIndex: 1,
    batchSize: - 1
    )
    )
    )

    this rule " rule!CheckPRNumber(ri!PRnumber)" returns empty data if data is not their for that PRNo,Now  you can check with length or totalcount for validation

    a!integerField(
    label: "PR",
    labelPosition: "ABOVE",
    value: ri!PRnumber,
    saveinto: ri!PRnumber,
    refreshAfter: "UNFOCUS",
    validations: if( isnull(PRnumber),{},

    if(rule!CheckPRNumber(ri!PRnumber).totalCount=0,{},"Invalid PR Number"

    )

    )
    )

  • Hi  ,

    Thank you for your suggestion. I fixed the problem this code - 

    a!integerField(
          label: "PR",
          labelPosition: "ABOVE",
          value: ri!PRnumber,
          saveinto: ri!PRnumber,
          refreshAfter: "UNFOCUS",
          validations: {
        if(
          isnull(ri!PRnumber),
          {},
          if(
            length(rule!CheckPRNumber(ri!PRnumber)) = 0,
            "PR Number does not exist.",
            {}
          )
        )

  • Hi my requirement has been changed now. I am looking for your suggestion. Now my PR field on form can have more than 1 PR number and user can separate them using comma (,) (for ex- 123,234,456 where 123 is a PR number. Similarly 234 and 456). Earlier i was checking for only 1 PR number but now i want to validate for all the PR numbers that user enters. Also maximum, a user can enter 20 PR numbers. Is there any way to implement this ? What approach would you suggest ?
  • Hi prais1852
    You have to make
    your rule input as array ,
    Earlier you have only one validation rule which checks the valid PR Number,now you have to write two more validation rules
    1)rule which checks the length of rule input (not more than 20 inputs )
    2)one more rule which checks the duplicate in rule input array using contains function
  • Hi kchaitanyam  I have changed my rule input to array now. But the problem is on the interface. How should i take the user input for PR field. Earlier i was using a!IntegerField() but i can not use it now because if there are 2 PR nos then user will enter both numbers using comma(,) as separator.

    a!integerField(
          label: "PR",
          labelPosition: "ABOVE",
          value: ri!PRnumber,
          saveinto: ri!PRnumber,
          refreshAfter: "UNFOCUS",
          validations: {
        if(
          isnull(ri!PRnumber),
          {},
          if(
            length(rule!CheckPRNumber(ri!PRnumber)) = 0,
            "PR Number does not exist.",
            {}
          )
        )

     

    What changes should i do to make it work ? Also please help me with creating the other expression rule to detect duplicate numbers if possible.

  • +1
    A Score Level 2
    in reply to prais1852

    The below code might help you, I didn't concentrated the validation part when user enters other than number you can validate when user enters other than numbers in the text field. let me know if you face any issue.

    note: I took the rule input as Integer array type you can try with text also.

    rule!getPNData(PN:{local!list})/* please replace here with your query entity rule this rule input need to take list*/

    =load(
    local!list,
    local!dBlist,
    local!notInDB,
    a!sectionLayout(
    label: "Lorem Ipsum",
    firstColumnContents: {
    a!textField(
    label: "Lorem Ipsum",
    labelPosition: "ABOVE",
    value:ri!task,
    saveInto: {ri!task,
    if(
    rule!APN_isBlank(ri!task),
    {},
    {
    a!save(
    local!list,fn!split(ri!task,",")
    ),
    a!save(local!list,tointeger(local!list)),
    a!save(local!dBlist,
    rule!getPNData(PN:{local!list})/* please replace here with your query entity rule this rule input need to take list*/

    ),
    a!save(local!dBlist,tointeger(local!dBlist)),
    a!save(local!notInDB,difference(local!list,local!dBlist))
    }
    ),

    },
    refreshAfter: "UNFOCUS",
    validations: {
    if(rule!APN_isBlank(local!notInDB),"","Cannot able to fetch data for "&local!notInDB)
    }
    ),
    a!textField(
    label:"DB Data",
    value:local!dBlist
    )
    },
    secondColumnContents: {
    /* Add components here for a two-column section */
    },
    validations: {}
    )
    )

  • I would suggest to go for an approach involving Stored Procedure.

    The field which you want to validate pass that to the SP as parameter, run the query to check IF EXISTS in the table.
    Set a out parameter if you find the match and pass it back to the process and route the user back to the UI where it shows the error message based on the out parameter (this is on assumption you want to validate the PR No. and need to show the message on UI if it already exists).

    This will improve performance and will be quick and you wont end up with the error message for 1MB.

    Thanks
  • Hi I like your approach but i am getting problem with my expression rule. How can i modify my expression rule to store values in the same way you are doing using split() method. For all the PR numbers i am getting mismatch on using expression rule with a!queryEntity(). However when i am using Query Rule that problem is not coming but i can't use Query Rule to show exactly which PR number doesn't exist. I like your approach but finding it difficult to debug the error.
  • Hi I like your approach but i am getting problem with my expression rule. How can i modify my expression rule to store values in the same way you are doing using split() method. For all the PR numbers i am getting mismatch on using expression rule with a!queryEntity(). However when i am using Query Rule that problem is not coming but i can't use Query Rule to show exactly which PR number doesn't exist. I like your approach but finding it difficult to debug the error.
  • Hi The way expression rule is returning the values and you are formatting the user input to validate PR numbers are not matching. Result of which i am getting false value only. How can i modify my expression rule in the same format as your are formatting the input data using split() and then match for validation ?
Reply Children
No Data