local oBO oBO=createobject('MyOrders') oBO.ShowList() oBO.EditOrder(993344) oBO.DeleteOrder(993344) oBO.PrintOrderList() *etc define class MyOrders as myBO &&parent class based on session object procedure OpenTables **open tables directly or fetch data from backend use Clients in 0 shared &&order ... use Orders in 0 shared use OrderItems in 0 shared procedure ShowList **show some form so user view / select from list of orders procedure EditOrder lparameters nOrderId *show order form local ok_pressed do form (cOrderScx) with this to ok_pressed if ok_pressed this.SaveAll() &&parent class generic method or subclass specific else this.RevertAll() &&parent class generic method endif procedure DeleteOrder lparameters nOrderId **Show dialog **delete child records **delete parent record this.SaveAll() procedure AddOrder *add new record *show edit form local ok_pressed do form (cOrderScx) with this to ok_pressed if ok_pressed this.SaveAll() &&parent class generic method or subclass specific else this.RevertAll() &&parent class generic method endif procedure ValidateOrder *validate record procedure ShowLookup lparameters nCustId *show lookup form do form (cOrderLookupScx) with this to nSomeRecordId return nSomeRecordId procedure PrintOrderList *extract / preprocess data report form (cOrderFRX) to printer preview procedure CalculateOrder **calculations *etc enddefine define class myBO as session &&parent class for all BOs procedure init this.OpenTables() procedure SaveAll *depend on architecture, saving buffered data or sending updates to backend procedure RevertAll *depend on architecture procedure DeleteCascade *etc enddefineYou might frawn at use of prg, but flexibility you get this way is just simply amazing.
**form init method lParameters oBO this.oBO=oBO &&store BO object ref to form property **Then anywhere in the form code (Some button click method, textbox validation etc) *some form method . if thisform.oBO.ValidateOrder() **action when valid else **action when invalid endifForms should contain as little of code as possible themselves. Just some controls handling if necessary and calling