Tuesday, October 31, 2006

Fewer Bugs and Better Bug Spray

Terrence Parr, a University of San Francisco Professor of Computer Science, suggests that there are six essential elements in the debugging process:

Reproduce the error. By finding a way to reproduce an error, you can often see the cause of the error. Parr says, "A bug that appears randomly is essentially unsolvable unless you have a leap of insight."

Reduce problems to their essence. Once you have discovered how to reproduce a problem, you should attempt to isolate an error to its smallest constituents. Parr suggest slicing data inputs, for example, to see which part of a file causes the problem.

Use your powers of deduction to find causality. This involves forming a hypothesis that can be tested. Follow the path of the data and watch for factors that can contribute to an error.

Test your hypothesis. Change various elements in the environment, the data and the logic to test your hypothesis.

Draw on experience. If you are an experienced developer, you will look for problems similar to those you have seen before in like situations. If you are a new developer, then you may want to consult another developer (Magic eDeveloper discussions are available on Yahoo! groups at magicu-l, for example.
Never give up. By taking a systematic approach, you will first test the hypotheses that seem most likely based on logic and past experience. Be patient, communicate with others and the solutions will become apparent.

Never give up. Parr sees tenacity as the final essential ingredient.Fortunately for users of eDeveloper V10, a new debugger has been introduced that makes extermination of bugs much easier than before.

Let's continue our review of Magic Software's 51 reasons to upgrade to eDeveloper V10. Reasons 36 through 41 all deal with enhancements to the debugger:

36. Visual Debugging Follow the exact logic definition within the studio as you progress step-by-step in debug mode.

This feature can help you pinpoint problems that you are having in an application by stepping through an application with pauses at pre-defined breakpoints.

When you are in Debug mode (you selected Debug Mode from the Debug menu), you can run a program in Runtime mode and the Debugger will "park" on the Studio read-only screen at the exact location of where you are in the program (when a breakpoint is reached).


37. Manageable Break Points Have full control on every break point defined in the application using the fully functional break points palette.

Obviously, breakpoints are a helpful tool for debugging. As Parr suggests in his point regarding the use of deduction, you need to follow the path of your data through an application in order to deduce any flaws in your logic. Breakpoints allow you to pause the logic at any point and determine exactly where things stand. Breakpoints let you halt execution of the program at a specific location in the Studio screen, so the debugger parallels the design of your program, which also gives you a clearer ability to see where problems may be introducuing themselves.

The how-to of breakpoints is quite straightforward, when you select Breakpoints from the View menu, the Breakpoint repository appears. You should remember that when you add a breakpoint to the Logic Editor, the default Condition is Always.

38. Conditional Break Points Reduce your debugging efforts by conditioning your set breakpoints for accurate and focus debugging.

Within the Debugger, you can define a conditional breakpoint if the Enable check box is selected. The condition will be evaluated each time the breakpoint is reached. If the condition evaluates to False, the breakpoint will be ignored.

The valid options for breakpoint conditions are Always, Count and Condition. With count, the breakpoint is only activated once the specified count has been reached. And of course, with a condition, the breakpoint will only be executed if the condition is True.

Condition: Execution will break only when the condition evaluates to True. This option is only enabled if the task in which the condition is defined is in focus. You can use variables from the current task tree.


39. Watch points Easily collect all variables that require your attention in the debugging process for efficient monitoring over the progress of your logic.

The watch points are very handy and make it easy to focus in on the variables that your experience suggests are most important. The Watch Variable list displays the variables currently being watched. This allows you to see how the value of the watched variable changes. You control which variables are displayed on the Watch variable list from the Variable list itself and the Variable declaration(s).

40. Modifiable Variables Manipulate the execution of a debugged execution by directly modifying the value of any variable.

The context menu gives you control over modification of variables in the debugging process. This is useful in pursuing various "what-if" scenarios as you test various hypotheses. The context menu allows you to add and delete variables from the watch list, go to the source for the variable, edit the current value of the data in the variable, set the variable value to NULL, and expand or collapse the index size of vector variables with a cell index >0.

41. Call Stack View Get clear information pertaining the exact stack of calls at any given time.

As you might expect, the Runtime Call Stack repository displays the state of the programs that are in the current runtime task tree and the handler (aka logic unit) that called the new program. You can get to this repository by selecting Call Stack from the View menu. Naturally, the tasks are displayed in the order in which they were executed. In other words, the Main Program of the host application will be the first task in the list and the current task will be the last one listed.

The information in the Runtime Call Stack repository is displayed in five columns.
The indicator column simply shows the current line. The module column will display the component name, if any. The task column shows the task name and the handler column show the Handler (logic unit) in that task. Finally, the line column shows the line number of the current operation.

Keep in mind that you can also view the flow of the logic within your eDeveloper application from the Activity Monitor. A whole article could be dedicated to this. It is also important to note that while you can only debug one context at a time, you can switch between contexts while debugging. You can also now dynamically change what information gets entered into the log with the dynamic logging function. You can change the logging filter on the fly, and this does not require a change to the magic.ini file. Sweet.

All in all, the new eDeveloper debugger is a huge improvement and benefit to the developer that just makes your life easier. Here again, it is worth the price of admission.

In the past, eDeveloper was known as an IDE that generally produced programs with fewer bugs and less need for debugging. But the debugging procedures available were weak in the past. With eDeveloper V10, you now have both advantages: fewer bugs and a faster way to isolate them and test your hypotheses.

Thursday, October 19, 2006

Express Yourself With eDeveloper V10

Developers express themselves with logic, and that is what the expression editor is all about. eDeveloper has always been strong when it comes to creating the logic that comprises your business rules. Some have even gone so far as to call eDeveloper a business rules engine. Who besides Magic, you ask? Well, Gartner, for one.

There have been a few improvements worth noting, which Magic did in reasons 32 to 35 of the reasons to upgrade to eDeveloper V10. Let's take a look at each claim and see what's under the hood.

32. Quick Expressions rapidly set expressions on spot by directly typing the expression syntax in the expression placeholder.

This quick editor provides a quick way to enter simple expressions without opening the Expression Editor. Sometimes when things get big and powerful, they get a little clunky. So this brings us back to the lightweight feeling of the early RAD days, so to speak. How, you ask? Well, when you park on a property in the Logic or Data View editors that require an expression (such as the Init or Cnd properties), you can press the equal sign (=), which opens a text box where you can enter an expression. Then you just enter your expression, no fuss, no muss.

You need to press ENTER to save your expression and close the Quick Expression Editor. Esc or F2 closes the Quick Expression Editor without saving the expression. Any other navigation action (such as arrows, tabbing, paging up or down, mouse clicks outside the edit box) saves the entered expression. So, in this reason to upgrade, less is more.

33. Auto Complete
Have eDeveloper automatically complete function names in the expression editor by requesting its automatic completion.

This is another one of those really nice improvements that is just designed as a timesaver. Function Auto Complete is available for functions and operators that begin with a letter. How does it work> Simply type the function or operator prefix and then press CTRL+Space. For example, if you enter ab, the function list opens and the cursor parks on the ABS () function.

When there is only one matching option, the text will be completed automatically.
If there is more than one matching option, a list box with the matching options is displayed. Click to select.

You won't find this Auto Completion Cheat Sheet in the manual. Now, if I could only find a way to auto complete my blog…

34. Expression Formatting
Freely format your expression and make them more readable.

White space? Wrapping? Multiple lines? Oh my.

35. Colored Display Enjoy the enhanced expression editor full display highlighting each element of the expression in customizable colors.

To customize colors in the studio, access the Color Settings from the Options/Settings/Colors menu option and then choose the Studio tab to modify the colors used for any of the listed color uses.

Go ahead. Express Yourself as Madonna would say.

As for me, I'll have to wait till the next blog entry for that.

Auto Complete Cheat Sheet





ABS
ACOS
AddDate
AddDateTime
AddTime
ANSI2OEM
AppName
ASCIIChr
ASCIIVal
ASIN
AStr
ATAN
Blb2File
Blob2Req
BlobFromBase64
BlobSize
BlobToBase64
BOM
BOY
BufGetAlpha
BufGetBit
BufGetBlob
BufGetDate
BufGetLog
BufGetNum
BufGetTime
BufGetUnicode
BufGetVariant
BufGetVector
BufSetAlpha
BufSetBit
BufSetBlob
BufSetDate
BufSetLog
BufSetNum
BufSetTime
BufSetUnicode
BufSetVariant
BufSetVector
CallDLL
CallDLLF
CallDLLS
CallJS
CallOBJ
CallProg
CallProgURL
CallURL
CaretPosGet
CASE
CDOW
CHeight
ChkDgt
Cipher
CLeft
CLeftMDI
ClickCX
ClickCY
ClickWX
ClickWY
ClientCertificateAdd
ClientCertificateDiscard
ClipAdd
ClipRead
ClipWrite
ClrCache
CMonth
CndRange
CodePage
COMError
COMHandleGet
COMHandleSet
COMObjCreate
COMObjRelease
COS
Counter
CRC
CTop
CTopMDI
CtrlGoto
CtrlHWND
CtxClose
CtxGetAllNames
CtxGetId
CtxGetName
CtxKill
CtxLstUse
CtxNum
CtxProg
CtxSetName
CtxSize
CtxStat
CurRow
CurrPosition
CWidth
DataViewToHTML
DataViewToText
DataViewToXML
DataViewVars
Date
Day
DbCache
DbCopy
DbDel
DbDiscnt
DbERR
DbExist
DbName
DbRecs
DbReload
DbRound
DbSize
DbViewRowIdx
DbViewSize
DbXmlMixedGet
DbXmlMixedSet
DDEBegin
DDEEnd
DDEGet
DDEPoke
DDERR
DDExec
DeCipher
Del
Delay
DifDateTime
DirDlg
DiscSrvr
DOW
DragSetCrsr
DragSetData
DropFormat
DropGetData
DropMouseX
DropMouseY
DStr
DVal
EditGet
EditSet
EJBCreate
EJBExplore
EncryptionError
EOF
EOM
EOP
EOY
ErrDatabaseName
ErrDbmsCode
ErrDbmsMessage
ErrMagicName
ErrPosition
ErrTableName
EvalStr
EvalStrInfo
EXP
ExpCalc
File2Blb
File2Ole
File2Req
FileCopy
FileDelete
FileDlg
FileExist
FileListGet
FileRename
FileSize
Fill
Fix
Flip
Flow
FlwMtr
FlwMtrVars
FormStateClear
GetComponentName
GetGUID
GetLang
GetParam
GroupAdd
HandledCtrl
HitZOrdr
Hour
HStr
HTTPGet
HTTPLastHeader
HTTPPost
HVal
Idle
IF
IN
INIGet
INIGetLn
INIPut
Ins
InStr
InTrans
IOCurr
IsComponent
IsDefault
IsFirstRecordCycle
ISNULL
JCall
JCallStatic
JCreate
JException
JExceptionOccurred
JExceptionText
JExplore
JGet
JGetStatic
JInstanceOf
JSet
JSetStatic
KbGet
KbPut
LastClicked
LastPark
LDAPError
LDAPGet
Left
Len
Level
LIKE
Line
LMChkIn
LMChkOut
LMUVStr
LMVStr
Lock
LOG
Logging
Logical
Logon
LoopCounter
Lower
LTrim
MailBoxSet
MailConnect
MailDisconnect
MailError
MailFileSave
MailLastRC
MailMsgBCC
MailMsgCC
MailMsgDate
MailMsgDel
MailMsgFile
MailMsgFiles
MailMsgFrom
MailMsgHeader
MailMsgId
MailMsgReplyTo
MailMsgSubj
MailMsgText
MailMsgTo
MailSend
MainDisplay
MainLevel
MarkedTextGet
MarkedTextSet
MarkText
MAX
MDate
Menu
MenuIdx
MID
MIN
Minute
MlsTrans
MMClear
MMCount
MMCurr
MMStop
MnuAdd
MnuCheck
MnuEnabl
MnuName
MnuRemove
MnuReset
MnuShow
Month
MStr
MTblGet
MTblSet
mTime
mTStr
mTVal
MVal
NDOW
NMonth
NULL
OEM2ANSI
OSEnvGet
OSEnvSet
Owner
Page
ParamsPack
ParamsUnPack
PPD
Prog
ProgIdx
ProjectDir
RAND
Range
Rep
RepStr
Right
RightAdd
Rights
Rollback
Round
RqCtxInf
RqCtxTrm
RqExe
RqHTTPHeader
RqLoad
RqQueDel
RqQueLst
RqQuePri
RqReqInf
RqReqLst
RqRtApp
RqRtApps
RqRtCtx
RqRtCtxs
RqRtInf
RqRts
RqRtTrm
RqRtTrmEx
RqStat
RqTrmTimeout
RTrim
RunMode
Second
SetBufCnvParam
SetContextFocus
SetCrsr
SetLang
SetParam
SetWindowFocus
SharedValGet
SharedValPack
SharedValSet
SharedValUnpack
SIN
SNMPNotify
SoundX
SplitterOffset
Stat
Str
StrBuild
StrToken
StrTokenCnt
StrTokenIdx
SubformExecMode
TAN
TDepth
Term
Text
THIS
Time
Translate
TranslateNR
TransMode
TreeLevel
TreeNodeGoto
TreeValue
Trim
TStr
TVal
UDF
UDFF
UDFS
UnicodeChr
UnicodeFromANSI
UnicodeToANSI
UnicodeVal
UnLock
Upper
User
UserAdd
UserDel
UTF8FromAnsi
UTF8ToAnsi
Val
VarAttr
VarCurr
VarCurrN
VarDbName
VariantAttr
VariantCreate
VariantGet
VariantGetVector
VariantType
VarIndex
VarInp
VarMod
VarName
VarPic
VarPrev
VarSet
VecCellAttr
VecGet
VecSet
VecSize
ViewMod
Visual
WinBox
WinHelp
WinHWND
WinMaximize
WinMinimize
WinRestore
WSConsumerAttachmentAdd
WSConsumerAttachmentGet
WSProviderAttachmentAdd
WSProviderAttachmentGet
WsSetIdentity
XMLBlobGet
XMLCnt
XMLDelete
XMLExist
XMLFind
XMLGet
XMLGetAlias
XMLGetEncoding
XMLInsert
XMLModify
XMLSetEncoding
XMLSetNS
XMLStr
XMLVal
XMLValidate
XMLValidationError
Year

ab
ac

adddatet
addt
an
ap
asciic
asciiv
asi
ast
at
blb
blob2
blobf
blobs
blobt
bom
boy
bufgeta
bufgetbi
bufgetbl
bufgetd
bufgetl
bufgetn
bufgett
bufgetu
bufgetva
bufgetve
bufseta
bufsetbi
bufsetbl
bufsetd
bufsetl
bufsetn
bufsett
bufsetu
bufsetva
bufsetve

calldllf
calldlls
callj
callo

callprogu
callu
car
cas
cd
che
chk
ci

cleftm
clickcx
clickcy
clickwx
clickwy
clientcertificatea
clientcertificated
clipa
clipr
clipw
clr
cm
cn
cod
come
comhandleg
comhandles
comobjc
comobjr
cos
cou
cr

ctopm
ctrlg
ctrlh
ctxc
ctxgeta
ctxgeti
ctxgetn
ctxk
ctxl
ctxn
ctxp
ctxse
ctxsi
ctxst
curro
currp
cw
dataviewtoh
dataviewtot
dataviewtox
dataviewv
date
day
dbca
dbco
dbde
dbdi
dber
dbex
dbn
dbrec
dbrel
dbro
dbs
dbviewr
dbviews
dbxmlmixedg
dbxmlmixeds
ddbe
ddee
ddeg
ddep
dder
ddex
dec

dela
dif
dir
dis
do
dragsetc
dragsetd
dropf
dropg
dropmousex
dropmousey
ds
dv
editg
edits
ejbc
ejbe
en
eof
eom
eop
eoy
errda
errdbmsc
errdbmsm
errm
errp
errt

evalstri

expc
file2b
file2o
file2r
filec
filede
filedl
filee
filel
filer
files
fill
fix
fli
flo

flwmtrv
fo
getc
getg
getl
getp
gr
ha
hi
ho
hs
httpg
httpl
httpp
hv
id
if


inigetl
inip

inst
int
io
isc
isd
isf
isn

jcalls
jc

jexceptiono
jexceptiont
jexp

jgets
ji

jsets
kbg
kbp
lastc
lastp
ldape
ldapg
lef
len
lev
lik
lin
lmchki
lmchko
lmu
lmv
loc

logg
logi
logo
loo
low
lt
mailb
mailc
maild
maile
mailf
maill
mailmsgb
mailmsgc
mailmsgda
mailmsgde

mailmsgfiles
mailmsgfr
mailmsgh
mailmsgi
mailmsgr
mailmsgs
mailmsgt
mailmsgt
mails
maind
mainl
markedtextg
markedtexts
markt
max
md

menul
mid

minu
ml
mmcl
mmco
mmcu
mms
mnua
mnuc
mnue
mnun
mnurem
mnures
mnus
mo
ms
mtblg
mtbls
mti
mts
mtv
mv
nd
nm
nu
oe
oseenvg
oseenvs
ow
pag
paramsp
paramsu
pp

progi
proj
rand
rang

reps

righta
rights
rol
rou
rqctxl
rqctxt
rqe
rqh
rql
rqqued
rqquel
rqquep
rqreqi
rqreql

rqrtapps

rqrtctxs
rqrti
rgrts

rqrttrme
rqs
rqt
rt
ru
sec
setb
setco
setcr
setl
setp
setw
sharedvalg
sharedvalp
sharedvals
sharedvalu
si
sn
so
sp
sta

strb

strtokenc
strtokeni
su
ta
td
ter
tex
th
ti

translaten
transm
treel
treen
treev
tri
ts
tv

udff
udfs
unicodec
unicodef
unicodet
unicodev
unl
up

usera
userd
utf8f
utf8t
val
vara

varcurrn
vard
varianta
variantc

variantgetv
variantt
varind
varinp
narm
varn
varp
varpr
vars
vecc
vecg
vecse
vecsi
vie
vis
winb
winhe
winhw
winma
winmi
winr
wsconsumerattachmenta
wsconsumerattachmentg
wsproviderattachmenta
wsproviderattachmentg
wss
xmlb
xmlc
xmld
xmle
xmlf

xmlgeta
xmlgete
xmli
xmlm
xmlsete
xmlsetn
xmlst

xmlvalidate
xmlvalidati
y

Is eDeveloper V10 Up to the Task?

The newly refreshed developers toolkit in eDeveloper V10 presents a very fresh, clean development interface with an easy-to-use task editor and powerful expression editor. In our continuing series evaluating the 51 reasons to upgrade to eDeveloper V10, we will now focus on fourteen enhancements made to the task editor.

17. Task Layers Easily distinguish between Data View, Logic, and Forms definitions using the clear separation between these three main pillars of a task.

I know some of you who are currently using eDeveloper are worried about replacing Record Main. But the migration process preserves your Record Main logic as is. You don't have to change things over unless you want to – and, you can do it incrementally (which is recommended). So once you get past the usual resistance to change that comes with any minor shift in a paradigm, you will actually grow to love the new layout of your application and its visibility in the three layers of the task editor: the Data View Editor, the Logic Editor, and the Form Editor.

The Data View Editor lets you define the task's data view interface as part of the task definition. The Data View elements include source tables, fields, and range. This window replaces the Record Main and DB Table repositories from previous eDeveloper versions.

You can enter Header Rows and Detail Rows in the Data View. The Header Row data view lets you specify the data source type, define links to the data source, and declare a data source open. The property sheet shows the properties for each of these options.

Then the detail row displays the Remark, Column (when a main source is selected), Virtual and Parameter. So it provides a fairly compact view that is human readable.

The Logic Editor is used to define the task’s logical segments. Keep in mind that the header line is basically a handler and the detail line is an operation. Again very clean and compact.

The Form Editor populates an initial entry automatically for each specific task. New entries are entered automatically for each subtask. Forms let the end-user interact with the application. They contain controls that either display data options or let the end-user enter data. The Form Editor displays the form’s frame and content. You can then easily design a form by assigning form properties and selecting controls and defining their properties.

So all in all, the three layer approach to Data, Logic and Presentation (Forms) is quite coherent and neat. I like it and hears a tip: you can press CTRL+TAB to move between the three editors (but you won't be able to leave the editor if you haven't created a valid entry.

18. Hierarchical Display Easily navigate through the data-view and logic definitions of every task using the clear hierarchical display of the new task editor.

Part of the ease-of-use then comes from the hierarchical display of your logic. Use + to expand a hierarchy and – to collapse it. You can also use the "Go To Match" function which is pretty nifty and is explained here.

19. Task Properties View and handle all properties of a task from a single task properties dialog.

Remember, the Task Properties dialog box is going to open automatically when you first zoom into a task and can be opened again later with CTRL+P while in the Task Editor. They've packed tons of power and control in here, so spend some time to re-familiarize yourself with all the available properties settings. They are organized into these tabs: General, Behavior, Interface, Data, Options and Advanced.

20. Relevant Only Information For efficient reading of data-view and logic the task editor hides trivial information to maintain the information relevant and concise.

Rather than just listing all information in columns, the detailed information for a row is shown when you are parked on that row. In some cases this means a combo box type of display and in others it just means the column information is only displayed when selected. This allows you to navigate based on the important identifiers and then see the details when you want them. It really unclutters the data view and logic view allowing you to work more efficiently.

21. Range Settings Obtain a full overview of all the Range criteria defined for the task's data-view from a single Range\Locate dialog.

The range window allows you to choose from a standard eDeveloper range, a SQL Where Clause and Range Expressions.

22. Default Logic Units Customize your studio to automatically create basic logic units for every new task.

This is an .ini setting that can save you loads of time, so pay attention. This environment setting lets you automatically create a default schema, such as Task Prefix and Suffix, Record Prefix or Suffix.

Specifically, the values for this are set in the Magic.ini with the Command Line Name: AutoCreateTaskLogicUnits The available settings are:
No (which is the default), Task (Task Prefix and Suffix logic units are entered), Record (Record Prefix and Suffix logic units are entered), or Task and Record (Task Prefix and Suffix, and Record Prefix and Suffix logic units are entered). So this is a great way to jump start the logic units in the task editor.


23. Save Program Instantly save changes of any program while editing the program.

Nice. Can you think of a time when you really, really wanted that? How about when the nasty Microsoft Updates dialog rears its ugly head to tell you your machine will reboot in 5 minutes? I hate that.

24. Developer Functions Create your own functions to implement simple or complex procedures that involve composite resources. These function logic units will be available to you throughout the project as a built-in function.

I think the Magic International User Group should sponsor a contest for the most creative user defined function.

25. Flexible Control Handling Handle controls by name and achieve greater flexibility by defining the control specific logic units before the form design, utilizing the same logic unit for a control in various forms and setting global control specific logic units.

One of the control's properties is its name. This enables a robust method to refer to controls in a Class 0 form, and to refer to them in functions. The LastClicked function will return the control name. Keep in mind that the Control Name property is limited to 30 characters and trailing blanks are not allowed. Duplicate control names are not allowed, so the Copy operation for controls in the Form Editor does not copy this property.

26. Variable Change Set super responsive logic that can respond to any manual or automatic modification of any variable in a task.

The Variable Change logic unit lets you handle the change of a variable's value. And of course it is triggered whenever the variable value is changed. You can define a Variable Change logic unit for BLOBs, vectors, and ActiveXs, but not, incidentally, for OLEs. Don't ask why. I don't know. Some things just are, right?

27. Event Parameters Improve handling and raising events by clearly declaring the parameters that are expected by the event.

In each task you can define events to be handled in your project whenever they occur. For example, you can define an event called ‘Add Customer’. Events have
Descriptions, Trigger Types, Triggers, Parameters, Force Exit and in a Main Program they have Public Name and Expose settings. There are four parameters available: Name, Model, Attribute, and Picture.

28. Post Record Update Force Level Easily define event handlers to be executed only after all modifications of a record are updated within a transaction.

This makes it easier to ensure transactional integrity.

29. Direct Logic Access Quickly access and create control level logic directly from any control defined in the form editor of a task.

Simply right click on the control and choose the option to create logic. Nice.

30. Tabbing order Set the tabbing order of controls independently from the order of the fields in the data view definition. The value of each element can be set as fixed or dynamic.

Okay, you may begin the applause. Whenever Magic shows this, developers get very happy. It's the little things in life that make the difference, you know.

31. Subforms Implement Parent-Child displays quickly and easily at the click of a button by simply declaring the participating child task on the parent's form using the new Subform control.

One thing to remember here is that a Subform control works only with an online program, which means that the Subform will not be active for a Main or Batch program.

With that in mind, you can use the Subform control to integrate a task form into the form of another task, while maintaining the subform‘s task data handling and record cycle activities independently from the parent task. But you cannot define a Control logic unit or an Event logic unit for a Subform control.

Nevertheless, a subform offers several advantages: 1) you can park on the line of a parent task and see the details from the subtask, for a one-to-many task relation, 2) eDeveloper automatically refreshes the Subform data view according to the parent task only when passing parameters, 3) eDeveloper retains your last position in the Subform data view when you leave and reenter., and 4) a tab cycle is provided for the Subform task.

Okay, well that is probably about as much Joy of eDeveloper V10 as you can process in one sitting. So we will blog on about eDeveloper V10 in our next entry, where we will evaluate the improvements to the expression editor.

Tuesday, October 17, 2006

Go! Team! Go!

The next set of enhancements that Magic Software Enterprises talks about for eDeveloper V10 relate to Version Control, which is important for team development. Team development maintains concurrency among developers when working in a multi-developer environment. It allows you to be able to synchronize the developers work, keep track of changes made to the project, and be able to retrieve previous versions of the project. In eDeveloper V10, team development is made possible by the Version Control feature.

10. Version Control Facilitator of Your Choice - eDeveloper supports any version control product that implements the SCC API V1.01, such as Visual SourceSafe® and PVCS®. You can add to this list IBM Rational ClearCase and numerous other source code control programs compliant with .scc extensions. Please keep in mind that you will be able to access the version control features from within eDeveloper V10. Some aspects of the presentation may vary depending on which source code control system you are utilizing.

11. Out-Of-The-Box Version Control Software - You can immediately start working using a complementary version control software available as part of the eDeveloper installation. The included software is CVSNT. You can get more information at http://www.cvsnt.org including the online manual at http://www.cvsnt.org/manual/html Keep in mind, this is complimentary software. I don't know if the aphorism, "you get what you pay for applies," but there have been at least some reports that getting it to work with very large numbers of programs may be extremely resource intensive. So if you have an industrial-strength code base, you may want to utilize a third-party version control system.

12. Integrated Support - Utilize every version control activity directly from the eDeveloper Studio. This is a great convenience to be able to access the features of the enterprise version control system from within eDeveloper V10 itself. So even though you are working with a SCC tool in the background, it is fairly transparent after installation.

13. Rollback Support - Revert to a previous checked-in version of any atomic project module by rolling back to a selected version. In fact, you have a wide variety of features allowing you to: Check objects in and out, undo object checkout, get the latest version, get the latest project version, see the differences between versions, see a history of revisions, see a list of objects that have been checked out, add items to the version control server, exclude projects from version control, work offline with objects, and see a list of objects that are being worked with offline.

14. Revisions History - Easily view the history of all modifications done to every atomic project module. Not all SCC applications support the ability to see the revisions history. PVCS and Visual SourceSafe do provide that capability. It is from within the history, that you can click to see the differences.

15. Offline Development - You can keep on developing your version controlled projects even if you are disconnected from the version control server. When you do this, a backup copy is created. When you go back online, you then have the ability to compare the different versions.

16. Conflict Resolving - Get a clear and concise view of potential conflicts deriving from external or offline modifications. The list simply shows you which objects have been changed. However, by clicking on the object history button, you will be able to see the history and select to see differences between versions.

So there you have it: online and offline source code control that tracks revisions in a team development environment using industry standard SCC 1.01 compliant software. Due to the built-in efficiency of the eDeveloper paradigm, programming teams will tend to be smaller than with other IDEs for older language based coding paradigms such as C++, PHP5, or RPGIV. Nevertheless, the use of revision control methodologies is a great aid to team development in eDeveloper V10 by managing revisions and source code for each element of a project.

Monday, October 16, 2006

WYSIBTB: What You See Is Better Than Before

OK, you've been asking about the new features in eDeveloper V10. So I'll start with the GUI improvements. Future posts will get into the nitty gritty of other aspects of the latest version.

1. Windows XP Style - Provide your end-users a standard-looking application that adheres to the Windows XP style. For most developers, this single enhancement is worth the price of admission to the whole eDeveloper V10 upgrade show. Let's face it, a well designed, fresh looking user interface is 90% of the battle in user satisfaction and user acceptance.

2. Shifting Table Columns - Enable your end user to freely re-order the columns of any table style display. This is a runtime feature and I love it. Just click, drag release and the column is moved. As a developer, you can disable it if you want to, but in most cases this is just grease. Love it.

3. Improved Tab Control - The new Tab control style enables you to set as many tabs as you need to be easily viewed using a vertical scroll or using multi line display. And let's not forget, customize the tab order. That's been a pretty highly requested feature and should make most magicians very happy.

4. Tab, Radio, and Check Box Icons - Enrich your application's UI by adding a relevant icon for every tab in a tab control, for every option in a radio button, and for check boxes. These new icons are clean and easy to use. The GUI editor is, well, really a GUI editor now. Cool.

5. Manageable Radio Buttons - Get better control on Radio Buttons option by freely laying out any Radio Button option. And this means you can put the radio button where you want it for best use of application white space, etc.

6. 3 States Check Box - Provide a proper visualization for NULL values of logical fields by using the 3 State support of the Check box control. The NULL value is the indeterminate state and it looks like a square filling the check box. Basically letting the user know that in this instant, the check box is not relevant to be checked or unchecked.

7. Box Style for Radio button and Check box - You can choose between common display of radio button options & check boxes and a button style of appearance. Some people prefer this box around the radio buttons and check boxes, I personally think it makes the user interface a bit too busy and less Web-like. But hey, one of these days the CEO is gonna say, "Can't you put a box around that?" and it will be nice to be able to do it in a second rather than writing some ActiveX or whatnot.

8. Automatic Wide Mode - Set edit controls to automatically open the Wide view screen whenever the end-user reaches the end of the edit control. Is anybody using this yet? If so, please comment.

9. Form State Persistency - Easily configure each screen to keep the end-user's customizable state. So we also end on a "wroth the price of admission" type feature. Do you remember what kind of machinations we used to have to go through to retain all this? Sure is easy now. Check. Done.

10. Report Generator - Does this qualify as a user interface improvement? Not sure. I'll save this one for another post. Blog you later.

Welcome to The Magic of eDeveloper

Welcome to the Magic of eDeveloper, a blog for anyone who wants more information, more tutorials, more tips and more news related to Magic Software Enterprises eDeveloper V10 -- a great tool for building, compositing and integrating application software. Since there is a fair amount of material on prior versions of eDeveloper, I will of course focus on eDeveloper V10. Check here for comments on new features, tutorial information, and pretty much anything else that I can think of, borrow or umm, "steal with permission" from the R&D teams to make available to you here.

I hope that you find this both useful and enjoyable.