* Your customer textbox valid - say name is txtCustId IF !EMPTY(THIS.VALUE) TRNLST=SYS(2015) WITH THISFORM.GRID1.Column1.COMBO1 .COLUMNCOUNT = 2 .ROWSOURCETYPE = 3 .RowSource = "SELECT PRODUCTID,DESCRIPTION FROM PRODUCT Order by PRODUCTID WHERE PRODUCT.CUSTOMERID=THIS.VALUE INTO CURSOR (M.TRNLST)" .Value = .ROWSOURCE ENDW ENDIF * Your prodcode.valid (This is column1.combo1.valid - right ?) PRODI=SYS(2015) WITH THISFORM.GRID1.Column2.COMBO1 .COLUMNCOUNT = 1 .ROWSOURCETYPE = 3 .RowSource = "SELECT PRODCOLOUR FROM PRODUCT Order by PRODCOLOUR WHERE PRODUCT.PRODUCTID = THIS.VALUE INTO CURSOR (M.PRODI)" .Value = .ROWSOURCE ENDW * Your productcolor.interactivechange stor Thisform.Grid1.COLUMN1.COMBO1.value+Thisform.GRID1.COLUMN2. COMBO1.value to rkey select product set order to 3 seek rkey if found() STOR PRICE to THISFORM.GRID1.COLUMN3.TEXT1.VALUE else STOR 0.00 to THISFORM.GRID1.COLUMN3.TEXT1.VALUE endif<hr> * Change to * As I got : * Column1 -> Productcode and has combo && Column1 renamed to cmbCode * Column2 -> Productcolor and has combo && Column2 renamed to cmbColor * Column3 -> Productprice and has textbox && Column3 renamed to txtUnitPrice * Grid.init WITH THIS.cmbCode.COMBO1 && Change this column name to ie: cmbCode .COLUMNCOUNT = 2 .ROWSOURCETYPE = 3 .RowSource = "SELECT PRODUCTID,DESCRIPTION "+; "FROM PRODUCT "+; "WHERE "+; "CUSTOMERID=thisform.txtCustId.VALUE "+; "Order by "+ "PRODUCTID "+; "INTO CURSOR prdCodes" endwith WITH THIS.cmbColor.COMBO1 .COLUMNCOUNT = 1 .ROWSOURCETYPE = 3 .RowSource = "SELECT PRODCOLOUR "+; "FROM PRODUCT "+; "WHERE PRODUCT.PRODUCTID = this.parent.parent.cmbCode.value "+; "Order by PRODCOLOUR "+; "INTO CURSOR prdtColors" ENDWith * txtCustId.valid (or lostfocus which seem to be better) THISFORM.GRID1.cmbCode.COMBO1.requery() && Repopulate combo* thisform.grid1.cmbCode.COMBO1.valid