using 4gl super-widgets! - innov8 computer solutions · using 4gl super-widgets! ... • the only...
TRANSCRIPT
BP0550: Using 4GL Super-Widgets!
StepUp Accounting™
Hansdip Singh BindraPhone: +1 (973) 361-4224 Fax: +1 (973) 537-6946e-mail: [email protected]
Web: www.innov8cs.com
© 2002-2005. Innov8 Computer Solutions, LLC. Transforming Business Processes into Software…™ 01
About Us:
• StepUp Accounting™• You do not have to Reinvent the Accounting Wheel• The ONLY “Web-Services Ready” Progress based G/L, A/R, A/P• Made just for ISV's and Consultants
• ProcessWare FrameWork™
• Consulting…• Progress 4GL / Database / GUI• WebSpeed• DWP and WebClient• Web-Services / Sonic / .Net / EAI• Experienced / High-Quality Off-Shore Services
© 2002-2005. Innov8 Computer Solutions, LLC. StepUp Accounting™ 02
“Super-Widgets”
• Browse-based Viewer
• Group Member Representation
• Drop-Down Browse
• Updateable Browse Enhancements
• Advanced Browsers
© 2002-2005. Innov8 Computer Solutions, LLC. Transforming Business Processes into Software…™ 03
Browse-based Viewer -Overview:
What is a Viewer?• Group of “display widgets” such as non-sensitive Fill-Ins stacked
below a main Browse
• Used in Inquiry or Information Retrieval applications
Why a Browse based Viewer?• Simple UI with uniform “Look and Feel”• Similar to ActiveX Grids with “Label” and “Value” cells• Takes up less area than stacked Fill-Ins• Customize Viewer colors/fonts at runtime
© 2002-2005. Innov8 Computer Solutions, LLC. StepUp Accounting™ 04
Browse-based Viewer - Comparison
Regular Viewer made up of Stacked Fill-Ins
Browse-based Viewer
** DEMO **
© 2002-2005. Innov8 Computer Solutions, LLC. Transforming Business Processes into Software…™ 05
Browse-based Viewer -Browse Properties:
Property Value Enabled NO Multiple-Selection YES No-Labels YES Open the Query YES Scrollbar-Vertical NO Separators YES
© 2002-2005. Innov8 Computer Solutions, LLC. StepUp Accounting™ 06
Browse-based Viewer -Temp-Table and Associated Buffers:
• Temp-Table based
• Example: “Static” Temp-Table and Browse widget for simplicity
• Can construct with “dynamic” Temp-Table and Browse widget
• Number of Buffers = Number of Rows in Viewer
/** Define Temp-Table for Browse based Viewer **/DEFINE TEMP-TABLE TempBrowseViewer NO-UNDO
FIELD LineNo AS INTEGERFIELD Label01 AS CHARACTERFIELD Value01 AS CHARACTERFIELD Label02 AS CHARACTERFIELD Value02 AS CHARACTERINDEX LineNo IS PRIMARY UNIQUE LineNo ASC.
/** Define Buffers for each Row of the Viewer **/DEFINE BUFFER TempBrowseViewer-Line01 FOR TempBrowseViewer.DEFINE BUFFER TempBrowseViewer-Line02 FOR TempBrowseViewer.DEFINE BUFFER TempBrowseViewer-Line03 FOR TempBrowseViewer.DEFINE BUFFER TempBrowseViewer-Line04 FOR TempBrowseViewer.DEFINE BUFFER TempBrowseViewer-Line05 FOR TempBrowseViewer.
© 2002-2005. Innov8 Computer Solutions, LLC. Transforming Business Processes into Software…™ 07
Browse-based Viewer -Free Form Query:
• Simple FOR EACH Query attaches Temp-Table to Viewer’s Browse• “Value” cells have default foreground/background colors• Easier readability than non-sensitive Fill-Ins with grayscale colors
TempBrowseViewer.Label01 FORMAT "X(15)":U COLUMN-BGCOLOR 8TempBrowseViewer.Value01 FORMAT "X(38)":U TempBrowseViewer.Label02 FORMAT "X(15)":U COLUMN-BGCOLOR 8TempBrowseViewer.Value02 FORMAT "X(38)":U.
© 2002-2005. Innov8 Computer Solutions, LLC. StepUp Accounting™ 08
Browse-based Viewer -TempViewerCreateProc:
• Creates Temp-Table Rows• Executed before Window or Dialog-Box is realized• Assigns data to “Label” cells• Uses all Associated Buffers• Buffers are locked in default “Update” mode• Buffers are updated in other Internal Procedures without Re-Finds
CREATE TempBrowseViewer-Line01.
ASSIGN TempBrowseViewer-Line01.LineNo = 1 TempBrowseViewer-Line01.Label01 = "Address 1:"TempBrowseViewer-Line01.Label02 = "Sales Agent:".
© 2002-2005. Innov8 Computer Solutions, LLC. Transforming Business Processes into Software…™ 09
Browse-based Viewer -TempViewerFillProc:
• Main Procedure for Viewer• Called from VALUE-CHANGED for main Browse, e.g. Customer List• Assigns data to “Value” cells
• One Input Parameter inType – Values “Assign/Initialize”
CASE inType:
WHEN "Assign":U THENASSIGN TempBrowseViewer-Line01.Value01 = Customer.Address
TempBrowseViewer-Line01.Value02 = Customer.Sales-Rep...
WHEN "Initialize":U THENASSIGN TempBrowseViewer-Line01.Value01 = ""
TempBrowseViewer-Line01.Value02 = ""...
END CASE.
© 2002-2005. Innov8 Computer Solutions, LLC. StepUp Accounting™ 10
Browse-based Viewer -TempViewerQueryProc:
• Re-opens Temp-Table Query associated with Viewer• Called from VALUE-CHANGED for main Browse• Executed after TempViewerFillProc• Contains simple FOR EACH on Temp-Table
/** If Customer is selected then Fill Browse based Viewer with Customerinformation, otherwise initialize the Viewer
**/
IF AVAILABLE Customer THENRUN TempBrowseViewerFillProc(INPUT "Assign":U).
ELSERUN TempBrowseViewerFillProc(INPUT "Initialize":U).
/** Refresh Browse based Viewer **/RUN TempBrowseViewerQueryProc.
© 2002-2005. Innov8 Computer Solutions, LLC. Transforming Business Processes into Software…™ 11
Browse-based Viewer -TempViewerDisplayProc:
• Central location for customizing color/font for “Value” cells• Change properties for a single cell without changing entire Column
IF TempBrowseViewer.LineNo = 3 THENDO:
/* If Balance exceeds Credit Limit - Red otherwise Green */IF AVAILABLE Customer AND
Customer.Balance > Customer.Credit-Limit THENASSIGN TempBrowseViewer.Value02:BGCOLOR IN BROWSE browseViewer = 12.
ELSEASSIGN TempBrowseViewer.Value02:BGCOLOR IN BROWSE browseViewer = 10.
END....
© 2002-2005. Innov8 Computer Solutions, LLC. StepUp Accounting™ 12
Group Member RepresentationOverview:
• Group/Members – Customers by Region – Users in Security Group
• “Left-to-Right” Method – “Left”: List of ALL Potential Members of Group– “Right”: Current SELECTED Members in Group
• Temp-Table Framework– Mandatory Logical Fields: MemberOfGroup and Removed– Indexes for mandatory Fields
© 2002-2005. Innov8 Computer Solutions, LLC. Transforming Business Processes into Software…™ 13
Group Member RepresentationUsage and Components:
** DEMO **
•“Left” Browse widget
•“Right” Browse widget
•Insert and Remove Buttons
•TempMember Temp-Table
•Internal ProceduresExample screen
© 2002-2005. Innov8 Computer Solutions, LLC. StepUp Accounting™ 14
Group Member RepresentationInternal Procedures:
• TempMemberFillProc– MemberOfGroup = YES, Removed = NO– White Background
• ItemAddProc– MemberOfGroup = NO, Removed = NO– Yellow Background
• ItemRemoveProc
• UpdateProc (Commit)
© 2002-2005. Innov8 Computer Solutions, LLC. Transforming Business Processes into Software…™ 15
Group Member RepresentationTempMemberFillProc:
FOR EACH CustomerGroupMember WHERECustomerGroupMember.CustomerGroup = CustomerGroup.CustomerGroupNO-LOCK:
FIND FIRST Customer WHERECustomer.Cust-Num = CustomerGroupMember.Cust-NumNO-LOCK NO-ERROR.
CREATE bufferTempMember.
BUFFER-COPY CustomerGroupMember EXCEPT CustomerGroupMember.CustomerGroup TO bufferTempMember.
ASSIGN bufferTempMember.Name = IF AVAILABLE bufferCustomer THENbufferCustomer.Name
ELSE"".
/** ADD EXISTING MEMBER - DO NOT MODIFY **/ASSIGN bufferTempMember.Removed = NO
bufferTempMember.MemberOfGroup = YES./** **/
RELEASE bufferTempMember.END. /* FOR EACH CustomerGroupName */
© 2002-2005. Innov8 Computer Solutions, LLC. StepUp Accounting™ 16
Group Member RepresentationItemAddProc:
FIND FIRST bufferTempMember WHEREbufferTempMember.Cust-Num = Customer.Cust-NumNO-ERROR.
IF NOT AVAILABLE bufferTempMember THENDO:
CREATE bufferTempMember.
ASSIGN bufferTempMember.Cust-Num = Customer.Cust-NumbufferTempMember.Name = Customer.Name
/** ADD NEW MEMBER IN SESSION - DO NOT MODIFY **/bufferTempMember.MemberOfGroup = NO
/** **/...
END./** ELSE – Simply Re-Activate Existing Member from TempMemberFillProc **/
...
/** ADD NEW MEMBER IN SESSION - DO NOT MODIFY **/ASSIGN bufferTempMember.Removed = NO/** **/
...
© 2002-2005. Innov8 Computer Solutions, LLC. Transforming Business Processes into Software…™ 17
Group Member RepresentationItemRemoveProc:
DEFINE INPUT PARAMETER inMemberOfGroup AS LOGICAL NO-UNDO.
IF inMemberOfGroup = YES THENDO:
/** CASE 1: Existing Member - MemberOfGroup = YES **/FIND CURRENT TempMember EXCLUSIVE-LOCK NO-ERROR.
IF AVAILABLE TempMember THENDO:
/** Set Removed = YES **/ASSIGN TempMember.Removed = YES.
FIND CURRENT TempMember NO-LOCK NO-ERROR.END.
/** Open Query where Removed = NO **/RUN TempMemberQueryProc(INPUT ?).
END.ELSE
DO: /** CASE 2: Member Added during Present Session – MemberOfGroup = NO **/FIND CURRENT TempMember EXCLUSIVE-LOCK NO-ERROR.
/** Delete Row from Temp-Table and Browse/Query **/DELETE TempMember.
browseTempMember:DELETE-CURRENT-ROW().END.
© 2002-2005. Innov8 Computer Solutions, LLC. StepUp Accounting™ 18
Group Member RepresentationUpdateProc (Commit):
ACTION MemberOfGroup Removed NEW Member NO NO EXISTING (Updated) Member YES NO DELETED Member YES YES
• “Right” Browse committed to Database
• Referential Integrity – Two Counters– numTotalUpdateMember – Number of Members to Commit– numUpdateMember – Number of Members actually Committed
© 2002-2005. Innov8 Computer Solutions, LLC. Transforming Business Processes into Software…™ 19
Drop-Down Button-List (Browse) -Overview:
Why?• Similar to Drop-Down Grids in Visual Basic or Delphi• “Data Aware” Combo-Box• Standard “Look and Feel”• “Black-Box” philosophy – Reusable• Replaces ActiveX Grids and SO Selection Browses
Advantages
• Performance – Reads data from data set as needed• Browse can be tied to Table, Temp-Table, and SDO• User’s focus remains on main Window
© 2002-2005. Innov8 Computer Solutions, LLC. StepUp Accounting™ 20
Drop-Down Button-List (Browse)
** DEMO **
© 2002-2005. Innov8 Computer Solutions, LLC. Transforming Business Processes into Software…™ 21
Drop-Down Button-List (Browse)Visual Layout/Setup:
• Browse (associated Query) defined in External (Frame) Procedure• Linked to main Window through CHOOSE of Down Arrow Button• API Driven – “Customizable”• External Procedure outputs three Values
Widget Width Height Row ColumnFill-In <varies> 1.00 <varies> <varies>Button 4.20 1.14 Fill-In Row – 0.05 Fill-In Column +
Fill-In WidthBrowse <varies> Normally 6 Fill-In Row + 1 (for Drop
Down) or Fill-In Row –Browse Height (for Drop Up)
Normally Fill-InColumn (Left-Edge)
All values in Characters
© 2002-2005. Innov8 Computer Solutions, LLC. StepUp Accounting™ 22
Drop-Down Button-List (Browse)API and Result Value:
RUN DropDownCustomer.p (INPUT {&WINDOW-NAME}:HANDLE, /* Parent Handle */INPUT scrCustomerName:ROW + 1, /* Row */INPUT scrCustomerName:COLUMN, /* Column */INPUT 1, /* Number of Locked Cols */INPUT "Double-Click to select Customer",/* ToolTip */INPUT YES, /* Reposition */INPUT SELF:HANDLE, /* Initial Widget - Focus */INPUT scrCustomerName, /* Position to Row Value */OUTPUT localValidResult, /* YES/NO */OUTPUT localWidgetHndl, /* Final Widget - Focus */OUTPUT localRowid). /* Result – Value */
• Valid Result = YES (Double-Click on Row): Process Result Value• Simple data-type (i.e. CHARACTER): ASSIGN to Fill-In • ROWID or multiple Fields: FIND appropriate data, then ASSIGN• Valid Result = NO (Click outside Browse): Provide Focus (or Default
Action) to Output Widget Handle
© 2002-2005. Innov8 Computer Solutions, LLC. Transforming Business Processes into Software…™ 23
Drop-Down Button-List (Browse)External Procedure – Overview:
• “Action” Object• Develop once, then Reuse• Save as .p, or .w (suppressed Window)
• Major Components– Fixed (Internal/Standard) Sections – Customizable Sections
• Fixed Sections: 4 Include Files (Require NO Modifications) • Customizable Sections: Modify for particular Application/Table(s)
© 2002-2005. Innov8 Computer Solutions, LLC. StepUp Accounting™ 24
Drop-Down Button-List (Browse)External Procedure – Fixed Sections:
DropDown-MainBlock.i• LEAVE Browse Frame CLOSE Procedure HIDE Browse• Informs PARENT Window that CHILD Drop Down Browse is Open• Input Parameters ASSIGN Browse Properties
– PARENT Window or Frame– ROW and COLUMN– TOOLTIP and HELP– NUM-LOCKED-COLUMNS, etc.
/** Set Parent for Browse Frame **/IF inWindowHndl:TYPE = "WINDOW":U THEN
ASSIGN inWindowHndl:PRIVATE-DATA = "<DropDownFileOpen>":UFRAME frameDropDown:PARENT = inWindowHndl.
ELSEASSIGN FRAME frameDropDown:FRAME = inWindowHndl.
© 2002-2005. Innov8 Computer Solutions, LLC. Transforming Business Processes into Software…™ 25
Drop-Down Button-List (Browse)External Procedure – Customizable Sections:DOUBLE-CLICK or DEFAULT-ACTION• SELECTED Row ASSIGN Result Value Valid Result = YES
• LEAVE Browse Frame CLOSE Procedure
/** Reposition will allow Scrolling Up and Down on Browse from Highlighted Row **/FIND FIRST Customer WHERE
Customer.Name >= inFillInValue NO-LOCK NO-ERROR.
ASSIGN localRowID = IF AVAILABLE Customer THENROWID(Customer)
ELSE?.
OPEN QUERY queryDropDown FOR EACH Customer NO-LOCK USE-INDEX Name INDEXED-REPOSITION.
IF localRowID <> ? THENREPOSITION queryDropDown TO ROWID localRowID.
OPEN and REPOSITION Query
© 2002-2005. Innov8 Computer Solutions, LLC. StepUp Accounting™ 26
Updateable Browse EnhancementsUpdateable Cell – Drop-Down Button-List (Browse):
** DEMO **
Focus in the Updateable Browse –Customer Name Cell
Drop-Down List (Browse) overlaying Updateable Browse
© 2002-2005. Innov8 Computer Solutions, LLC. Transforming Business Processes into Software…™ 27
Updateable Browse EnhancementsUpdateable Cell – Drop-Down Button-List (Browse):
Components• Updateable Browse widget• Example: Free-Form Query• Drop-Down Button-List (Browse)
– Fill-In Widget Editable Cell• Down-Arrow Button
– Placement – Visibility
© 2002-2005. Innov8 Computer Solutions, LLC. StepUp Accounting™ 28
Updateable Browse EnhancementsUpdateable Cell – Drop-Down Button-List (Browse):
Down Arrow Button – Placement and Visibility• Uses X,Y, WIDGET-HANDLE of Editable Cell
• Localized in Internal Procedure– Example: ButtonCustomerNamePlacementProc
• Execute Internal Procedure from two Events – SCROLL-NOTIFY of Updateable Browse– ENTRY of Editable Cell
• FOCUS in Editable Cell Button HIDDEN = NO• FOCUS in any other Widget Button HIDDEN = YES
© 2002-2005. Innov8 Computer Solutions, LLC. Transforming Business Processes into Software…™ 29
Updateable Browse EnhancementsUpdateable Cell – Drop-Down Button-List (Browse):
DO WITH FRAME {&FRAME-NAME}:/** Assign Widget Handle of the TempCustomerList.CustomerName Cell with Focus **/ASSIGN hndlCellCustomerName = TempCustomerList.CustomerName:HANDLE IN BROWSE
browseCustomerList.
/** If TempCustomerList.CustomerName Cell is horizontally not visible in the Browse Widget, then hide the Button, else set the Column position. **/
IF hndlCellCustomerName:X < 0 THEN ASSIGN buttonCustomerName:HIDDEN = YES.
ELSE ASSIGN buttonCustomerName:X = hndlCellCustomerName:X
+ browseCustomerList:X + hndlCellCustomerName:WIDTH-PIXELS- buttonCustomerName:WIDTH-PIXELS+ 3 /* Separator Pixels */.
/** If TempCustomerList.CustomerName Cell is vertically not visible in the Browse Widget, then hide the Button, else set the Row position. **/
IF hndlCellCustomerName:Y < 0 THEN ASSIGN buttonCustomerName:HIDDEN = YES.
ELSE ASSIGN buttonCustomerName:Y = hndlCellCustomerName:Y
+ browseCustomerList:Y.
/** If TempCustomerList.CustomerName Cell with Focus is visible in the Browse Widget then display and enable the Button. **/
IF AVAILABLE TempCustomerList THENDO:
IF hndlCellCustomerName:X >= 0 ANDhndlCellCustomerName:Y >= 0 THEN ASSIGN buttonCustomerName:HIDDEN = NO
buttonCustomerName:SENSITIVE = YES.END.
END.
ButtonCustomerNamePlacementProc
© 2002-2005. Innov8 Computer Solutions, LLC. StepUp Accounting™ 30
Updateable Browse EnhancementsDynamic Conversion of Updateable Cell to Non-Updateable Cell:
Functionality/Need• Entire editable Column, non-editable: READ-ONLY = YES
• Business Rules based• Examples:
– Price Items Matrix– User Security-based Field/Cell Level data entry
• Some cells (Rows) in Column are editable• Other cells in same Column are non-editable
© 2002-2005. Innov8 Computer Solutions, LLC. Transforming Business Processes into Software…™ 31
Updateable Browse EnhancementsDynamic Conversion of Updateable Cell to Non-Updateable Cell:
• City Column• Ranks 1 – 5 are editable cells• Ranks 6 – 10 are non-editable cells• Editable cells: Blue/White• Non-Editable cells: Black/Light Grey
Example screen
** DEMO **
© 2002-2005. Innov8 Computer Solutions, LLC. StepUp Accounting™ 32
Updateable Browse EnhancementsDynamic Conversion of Updateable Cell to Non-Updateable Cell:
ROW-DISPLAY• Manage Color combination for Editable/Non-Editable cells• Consistent “Look and Feel”
– Non-editable Columns– Non-editable cells in editable Column
IF TempCustomerList.Rank > 5 THENASSIGN TempCustomerList.City:FGCOLOR IN BROWSE browseCustomerList = 0
TempCustomerList.City:BGCOLOR IN BROWSE browseCustomerList = 8.
© 2002-2005. Innov8 Computer Solutions, LLC. Transforming Business Processes into Software…™ 33
Updateable Browse EnhancementsDynamic Conversion of Updateable Cell to Non-Updateable Cell:
VALUE-CHANGED• “Action” Event• Manage cell’s READ-ONLY (editable) attribute• Appropriate Updateable cell Non-Updateable • Does not convert entire COLUMN to Non-Updateable
IF TempCustomerList.Rank > 5 THENASSIGN TempCustomerList.City:READ-ONLY IN BROWSE browseCustomerList = YES.
ELSEASSIGN TempCustomerList.City:READ-ONLY IN BROWSE browseCustomerList = NO.
© 2002-2005. Innov8 Computer Solutions, LLC. StepUp Accounting™ 34
Advanced BrowsersOverview:
• Using Temp-Table Managers
• Working with Array Columns
• Positioning Multi-Select Browses
© 2002-2005. Innov8 Computer Solutions, LLC. Transforming Business Processes into Software…™ 35
Advanced BrowsersDemo of Sales Analysis System:
** DEMO **
SORT COLUMNARRAY ELEMENTS
SELECTED COLUMN
© 2002-2005. Innov8 Computer Solutions, LLC. StepUp Accounting™ 36
Advanced BrowsersUsing Temp-Table Managers:
• Temp-Table to Manage Column Handles• Load Handles ONCE only!• Dynamic Access/Modify Cell (Column) Attributes:
LABEL, FGCOLOR, VISIBLE, etc.• Avoid Compiler Errors and Limitations – Arrays
DEFINE TEMP-TABLE tempBrowseColumns NO-UNDOFIELD BrowseName AS CHARACTER FIELD ColumnHandle AS WIDGET-HANDLE EXTENT 51 /* NUM-COLUMNS */INDEX BrowseName IS PRIMARY UNIQUE BrowseName ASC.
/* WRONG – WILL NOT COMPILE */ASSIGN CustomerSales.SalesMonth[i]:BGCOLOR IN BROWSE browseMain = 12.
/* CORRECT – WILL COMPILE *//* We have assigned the Handles of each Column to the Array Elements in
tempBrowseColumns.ColumnHandle Field */ ASSIGN tempBrowseColumns.ColumnHandle[i]:BGCOLOR = 12.
© 2002-2005. Innov8 Computer Solutions, LLC. Transforming Business Processes into Software…™ 37
Advanced BrowsersWorking with Array Columns:
• CURRENT-COLUMN:NAME is always the “same”• How to differentiate which Array Element Column is
Selected?• CURRENT-COLUMN:TYPE is “FILL-IN” always!• Use CURRENT-COLUMN:INDEX (1…No. of Elements)• Now you can SORT or Manipulate Cells & Column
Headers for selected ColumnON START-SEARCH of browseMain DO ...
/* Validate Selected Column Handle, determine it is SalesMonth Array Field, and send Array Element Number to Sort Procedure */
IF VALID-HANDLE(browseMain:CURRENT-COLUMN) ANDbrowseMain:CURRENT-COLUMN:NAME = “SalesMonth” THEN
RUN SortColumnProc(INPUT browseMain:CURRENT-COLUMN:INDEX)...
© 2002-2005. Innov8 Computer Solutions, LLC. StepUp Accounting™ 38
Advanced BrowsersPositioning Multi-Select Browses:
• Multiple Selected Rows Multiple Bands of Blue• Position to a single Row One Blue Row. How?• Simple SET-REPOSITIONED-ROW will NOT work!
– Reposition OK– Will NOT Highlight One Blue Row (ONLY “- - -” Band)
/* Remove Bands of Blue from Multiple Selected Rows */IF browseMain:NUM-SELECTED-ROWS > 0 THEN
browseMain:DESELECT-ROWS().
/* Position Browser Query to desired Row */REPOSITION browseMain TO ROWID localRowid.
/* Visualize desired Row on Browse – put a “---” Band around the Row */browseMain:SET-REPOSITIONED-ROW(INTEGER(browseMain:HEIGHT-CHARS / 2),”CONDITIONAL”:U)
/* Highlight desired Row – One Blue Row */browseMain:SELECT-FOCUSED-ROW().
© 2002-2005. Innov8 Computer Solutions, LLC. Transforming Business Processes into Software…™ 39
Questions?Additional Information and Downloads…
http://www.innov8cs.com
StepUp Accounting™…You do not have to Reinvent the Accounting Wheel
…The ONLY “Web-Services Ready” Progress based G/L, A/R, A/P …Made just for ISV's and Consultants
© 2002-2005. Innov8 Computer Solutions, LLC. StepUp Accounting™ 40