home *** CD-ROM | disk | FTP | other *** search
/ Archive Magazine 1996 / ARCHIVE_96.iso / discs / gerald / abacus / z_line / Custom01 / ReadMe < prev   
Text File  |  1993-10-24  |  21KB  |  157 lines

  1. {Version:1.05;01 Oct 1993;Fireworkz;Gerald Lewis Fitton;6500 1024 5321 6154}
  2. {Block:0;0;;32;1;33;;32;1;33}
  3. {Style:ZLBase;{ColWidth:11055}{ColName:#}{RowHeight:0}{RowHeightFix:0}{RowUnbreakable:1}{RowName:#}{MarginLeft:1134}{MarginRight:850}{MarginPara:0}{Tablist}{Background:255;255;255}{ParaStart:0}{ParaEnd:288}{LineSpace:0;72}{Justify:3}{NewObject:3}{Numform:#,##0.00}{NumformDT:dd.mm.yy}{NumformSE:@}{BorderColour:0;187;255}{Border:0}{GridLeftColour:0;187;255}{GridTopColour:0;187;255}{GridRightColour:0;187;255}{GridBottomColour:0;187;255}{GridLeft:0}{GridTop:0}{GridRight:0}{GridBottom:0}{Typeface:Times}{Fontx:0}{Fonty:240}{Underline:0}{Bold:0}{Italic:0}{Superscript:0}{Subscript:0}{Foreground:0;0;0}}
  4. {StyleBase:ZLBase}
  5. {Style:ZLHeadFoot}
  6. {StyleHeaderFooter:ZLHeadFoot}
  7. {Style:ZLHeading;{LineSpace:0;72}{Justify:1}{Fonty:320}{Bold:1}{Italic:1}}
  8. {Style:ZLSubHead;{ParaStart:289}{Typeface:Helvetica}{Bold:1}}
  9. {Style:ZLByLine;{Fonty:280}}
  10. {Style:ZLKeywords;{MarginLeft:2268}{MarginPara:-1133}{Tablist:L0}{Italic:1}}
  11. {Style:ZL FileName;{Italic:1}}
  12. {Paper:From Printer;0;16839;11907;737;284;284;284;0;0;0;0;16;;0}
  13. {PrintQuality:0}
  14. {StartOfData}
  15. {S:X;X;0;0;Custom Functions from the Beginning \ù Part 1{ITR-X}by Gerald L Fitton}
  16. {S:X;X;0;1;Keywords:{ITT-X}RProL Custom Function Introduction Parameter Sequence Fitton}
  17. {S:X;X;0;2;If you are new to Resultz then I suggest that you read the [ReadMe] file in the Documents directory before this one.  If you are new to worksheets (sometimes called spreadsheets) then I suggest that you have a look at the simpler tutorials in the Sheets series before embarking on the more advanced features of Resultz such as custom functions, names and arrays.}
  18. {S:X;X;0;3;Introduction to \ÉRProL\æ{ITR-X}{ITR-X}This is the first tutorial article of a series which, I hope, will help you to get to grips with one of the advanced features of Resultz which first appeared in PipeDreamá4, custom functions.  If you wish to use these custom functions then you need to learn the Resultz custom function programming language which, at present, doesn\æt have a name.  I shall call it \ÉRProL\æ.  I'm not sure of the best pronunciation but \ÉR-prol\æ seems OK to me!}
  19. {S:X;X;0;4;One thing to clear up from the start.  Custom functions can not be used to move blocks around within a document nor indeed to change the \Éshape\æ of a document in any way.  However, what you can do with custom functions is to process the data which already exists within the slots of a document (or within a set of documents) in more intricate ways than can be done simply with the \Éstandard\æ functions provided.  Just like any standard function such as (a1á+áa2) or the more complex lookup(a1,b1b10,c1c10), a custom function is \Écalled\æ from a slot and the \Éresult\æ of executing the function is returned to the slot from which it is called.}
  20. {S:X;X;0;5;Calling Custom Functions{ITR-X}{ITR-X}Let's have a look at a custom function at work.  Double click on the file [AddOne] and you will find that you load to the screen not only [AddOne] but a dependent document which I have called [c_AddOne] containing a simple, two line, custom function.  I have deliberately limited the width of [c_AddOne] so that it will fit across a mode 12 screen.}
  21. {S:X;X;0;6;You can use any valid filing system file name for a custom function document but, so that I can recognise which Resultz (or Fireworkz) files are \Éordinary\æ documents and which are custom function documents, I have prefixed all my custom function documents with c_ (a lower case c followed by an underline).  I suggest that you follow this convention\\\; it is recommended not only by me but by Colton Software as well.}
  22. {S:X;X;0;7;Because Resultz (like Wordz) saves the position of a Resultz document on the screen and the position of the cursor within the document, what you should find is that [AddOne] is visible and alive (a yellow top bar) with the cursor in slot [AddOne]a3.  If not then position the pointer on the number in [AddOne]a3 (it should be the number 2 unless you\æve modified the file) and click the mouse select (left) button.  You should see the same number in the formula line (at the top of the document just to the right of the cross and tick).  Tap some other number, say 9, and then tap <Return>.  If all goes well then, besides [AddOne]a3 changing to 9, the number in [AddOne]b3 will change to 10.}
  23. {S:X;X;0;8;The custom function \Écalled\æ from [AddOne]b3 is not a spectacular custom function.  The \Éresult\æ returned to the slot [AddOne]b3 is (a3á+á1), one more than the number in the slot [AddOne]a3.  Change the value in [AddOne]a3 a few times and convince yourself that the value in [AddOne]b3 is always 1 more than the value in [AddOne]a3.}
  24. {S:X;X;0;9;Now let\æs have a look at the content of slot [AddOne]b3.  Place the pointer over [AddOne]b3 and click select.  The formula line does not show the simple, non custom function way of adding 1 which would be (a3á+á1)\\\; instead it shows the formula used to \Écall\æ the custom function, namely [c_AddOne]one_more_than(a3).  Before looking at the custom function document, [c_AddOne], let's have a look at the formula used to call the custom function in more detail.}
  25. {S:X;X;0;10;The \Écalling\æ formula is in three parts:{ITR-X}{ITR-X}The first part - [c_AddOne] - is the name of the dependent document which contains the custom function.  A custom function document such as [c_AddOne] can contain more than one custom function.  Indeed, it is desirable to \Ésplitáup\æ large, exotic custom functions into a set of smaller custom functions (stored within the same \Éc_\æ document) in the same way that it is usually desirable to split up a long program written in BASIC into more easily digested PROCs and FNs.}
  26. {S:X;X;0;11;The second part - one_more_than - is the name of the custom function within [c_AddOne].  If you look at slot a7 of the document [c_AddOne] you will see that -áone_more_thaná-, the name of the custom function, appears after the word \Éfunction\æ.  Another convention which I recommend to you is that the names of custom functions should be totally in lower case (no capitals).  The reason is that lower case and upper case function names are equivalent (unlike BASIC procedures) and Resultz converts upper case letters in the custom function names to lower case anyway!}
  27. {S:X;X;0;12;The third part - (a3) - is the single piece of data which is passed to the custom function for processing.  To be more accurate, [AddOne]a3 is the slotref of the data passed to [c_AddOne] for processing.  The data passed to a custom function this way is called a \Éparameter\æ.  A parameter is a \Ésort of\æ variable which has a \Éfixed\æ value within the custom function but can be varied outside the custom function.  As we shall see in a later tutorial, it is possible to pass more than one parameter to a custom function.  You can pass as many different parameters as you wish to a custom function but, if you want to pass a large amount of data, rather than use many parameters (a rather cumbersome method), it is better to pass a range of slots or an array as one single parameter.}
  28. {S:X;X;0;13;Returning the Result{ITR-X}{ITR-X}\ÉCalling\æ the custom function - [c_AddOne]one_more_than(a3) - from slot [AddOne]b3 returns the result of the processing to the slot from which it was called, [AddOne]b3.  Although the result can be returned to only a single slot this does not mean that you can return only one value from a custom function!  You can return many values to one slot by returning an array to the calling slot.  This array can then be expanded using set_value(range,slotref) where \Éslotref\æ contains the array (and the calling function) and where \Érange\æ is the range of slots containing the expanded array.  We shall return to examples of this tactic in a later tutorial.}
  29. {S:X;X;0;14;Programming in General{ITR-X}{ITR-X}Before we look at the custom function in [c_AddOne] in detail I am going to digress and discuss programming from a broader point of view.}
  30. {S:X;X;0;15;Perhaps you are familiar with writing short programs in BASIC.  That may help or it may not!  Perhaps you write \Éwell written\æ or perhaps \Ébadly written\æ BASIC programs.  Both types usually work most of the time\\\; both types sometimes fail.  The difference between the two is often apparent only when you want to \Édebug\æ, modify, improve or extend the program you (or maybe someone else) has written.  Those programs which I class as \Égood\æ are usually easier to \Édebug\æ if they don\æt work first time and easier for others to modify if they wish to extend or improve them.  Short \Ébad\æ programs can usually be written in a much shorter time so too many programmers with no formal training pick up some bad habits when they start programming.  This is particularly true if they write short \Ébad\æ programs which work.  Early \Ébad\æ habits learnt that way are often the most difficult to break.}
  31. {S:X;X;0;16;Some languages encourage \Égood\æ programming.  Others permit \Ébad\æ or even \Évery bad\æ programming.  I think I would put \ÉRProL\æ in the \Éfairly good\æ category!}
  32. {S:X;X;0;17;Programming in \ÉRProL\æ{ITR-X}{ITR-X}Custom function documents such as - [c_AddOne] - contain custom functions such as -áone_more_than - which are written in the programming language I have called \ÉRProL\æ.  A custom function is a set of instructions which is designed to process similar data in a similar way.  No matter what the actual value of the data, the same set of instructions are followed.  For example, in the case of -áone_more_thaná- the data passed to it is a parameter representing a single number such as 2 and the pair of instructions which make up -áone_more_thaná- process the number represented by the parameter by adding 1 and returning the result.}
  33. {S:X;X;0;18;Whatever the number which is passed as a parameter to -áone_more_thaná- the \Éresult\æ returned is one more than the original number.  That original number is represented within the custom function as the parameter \öparameter\ò.  Custom functions are written so that they can and most often do operate on variables (symbols representing any similar piece of data) rather than sets of instructions which process data directly.}
  34. {S:X;X;0;19;There are many ways of classifying variables\\\; one is by the way in which they retain or lose their identity when the overall program is broken down into smaller units.  Using this classification a parameter is a \Ésort of\æ variable\\\; there are two more sorts called \Élocal\æ and \Églobal\æ variables which I shall introduce in another tutorial.}
  35. {S:X;X;0;20;Within all but the simplest programming languages the manner of processing the data (best included as variables) is based on four concepts.  We shall study these concepts under the headings: \öSequence\ò, \öRepetition\ò (such as \öforá-ánext\ò loops), \öDecision\ò (such as \öifá-áthen\ò statements) and \öInterrupt\ò (which will include the use of the \ÉRProL\æ commands - input - and - alert).  I shall limit this tutorial to a discussion of \öSequence\ò and the use of a parameter.  In later tutorials we shall discover other sorts of variables as well as the concepts of \öRepetition\ò, \öDecision\ò and \öInterrupt\ò.}
  36. {S:X;X;0;21;Sequence{ITR-X}{ITR-X}This topic is concerned with the order in which the commands are executed.  Every sequence must have a start and a finish.}
  37. {S:X;X;0;22;In a large number of spreadsheets you must choose whether to recalculate along the rows (one at a time, starting at the top and running from left to right along each row) or down the columns (one at a time starting with the left most column and working down each column from top to bottom).  In Resultz recalculation takes place in an order which is called \önatural\ò.  Here is not the place to explain in detail what is meant by \önatural\ò\\\; essentially, with \önatural\ò recalculation, every slot can be regarded as part of a chain and the calculation proceeds along the chain in such a way that slots which depend on other slots are processed last no matter where they are located within the document.  When a slot is changed in Resultz only those chains which are affected are recalculated.}
  38. {S:X;X;0;23;In a Resultz custom function the default sequence is that commands are executed, one at a time, down a single column.  The start is identified by the command -áfunctioná- and the end is identified by the command -áresult.}
  39. {S:X;X;0;24;The Custom Function{ITR-X}{ITR-X}What we haven't looked at yet is the custom function itself to see how it adds one to the parameter and returns the 'result'.  To do this we must bring the custom function - [c_AddOne]one_more_than - into view.}
  40. {S:X;X;0;25;Let\æs look at the commands in detail and see how they process data.}
  41. {S:X;X;0;26;Row 7 - function("one_more_than","parameter:number"){ITR-X}In this custom function the \ÉRProL\æ command -áfunctioná- has two arguments.  The first argument is the name of the custom function, -á"one_more_than"á- note that the name is included in inverted commas.  The second argument is the one and only parameter passed to the function.  The name of the one parameter passed to -á[c_AddOne]á- is -áparameterá- and its \Étype\æ has been declared (after the colon) as a number.  Because of this declaration, if you try to pass anything other than a number to this function then an error will be generated.  You do not have to declare the type of variable if you want to pass a number sometimes and, say, a string on another occasion.}
  42. {S:X;X;0;27;Try typing Fred (without and then with inverted commas) into [AddOne]a3 and you will find that the error message -áString not expectedá- is returned to slot [AddOne]b3.  You will find the error message foreshortened in the body of the [AddOne] document.  If you want to read the full error message then you must look n the Status line at the top of the document.}
  43. {S:X;X;0;28;Row 8 - result(@parameter+1){ITR-X}The command - ...result - terminates the sequence of commands and returns a value to the slot from which it was called, [AddOne]b3.  Note the  sign preceding the word -áparameterá- and the inverted commas have gone.  The  sign \Égoes with\æ the word -áparameterá- try return(1+ parameter), it gives the same result.}
  44. {S:X;X;0;29;Try changing return( parameter+2).  You have to do this in the formula line of [c_AddOne].  Even when you have modified the custom function, the number 3 in the slot [AddOne]b3 does not change.  To make that change, and indeed if you want to check whether you have introduced any \Ébugs\æ (errors in programming) in [c_AddOne] you must \Érun\æ the custom function by \Écalling\æ it again from the document [AddOne].  The simplest way of doing this is to place the cursor in slot [AddOne]b3, then move the pointer to the formula line and click on [c_AddOne]one_more_than(a3).  Finally, click on the green tick to the left of the formula line\\\; when you click on the green tick the custom function will be called and the new \Éresult\æ will be returned to [AddOne]b3.}
  45. {S:X;X;0;30;Over to you now{ITR-X}{ITR-X}As your first exercise in writing custom functions try to recreate the pair of documents, [AddOne] and [c_AddOne].  Only when you have succeeded are you ready to continue!  If you have problems then reload my [c_AddOne] and study it carefully.  You should type the expression -áfunction("one_more_than","parameter:number") - into a number slot and tap <Return>!  In case you really get stuck I have included in this directory a file call [CustomFn] which you might like to load and then save as a custom function template.}
  46. {S:X;X;0;31;Summary{ITR-X}{ITR-X}A custom function is a sequence of commands which start with a -áfunctioná- command and end with a -áresultá- command.  Once there is a custom function within a document then the whole document is a custom function document.  Custom function documents behave differently from \Éordinary\æ documents \ù but they do not have a different file type!}
  47. {S:X;X;0;32;The next tutorial{ITR-X}{ITR-X}The next tutorial of this series is in the Custom02 directory.}
  48. {BR:;;;;;;;;1;1;{StyleHandle:ZLBase}}
  49. {BR:;;;;;;;;1;1;{ColWidth:0}}
  50. {BR:0;;;;1;;;;1;0;{StyleHandle:ZLBase}}
  51. {R:0;0;;32;1;1;;32;0;0;{StyleHandle:ZLHeading}}
  52. {R:0;0;50;3;1;1;;32;0;0;{StyleHandle:ZLByLine}}
  53. {R:0;1;;32;1;2;;32;0;0;{StyleHandle:ZLKeywords}}
  54. {R:0;3;;32;1;4;23;3;0;0;{StyleHandle:ZLSubHead}}
  55. {R:0;4;453;3;1;5;462;3;0;0;{Bold:1}}
  56. {R:0;4;483;3;1;5;505;3;0;0;{Bold:1}}
  57. {R:0;5;110;3;1;6;118;3;0;0;{StyleHandle:ZL FileName}}
  58. {R:0;5;174;3;1;6;182;3;0;0;{StyleHandle:ZL FileName}}
  59. {R:0;5;228;3;1;6;238;3;0;0;{StyleHandle:ZL FileName}}
  60. {R:0;5;329;3;1;6;339;3;0;0;{StyleHandle:ZL FileName}}
  61. {R:0;5;;32;1;6;24;3;0;0;{StyleHandle:ZLSubHead}}
  62. {R:0;2;59;3;1;3;67;3;0;0;{StyleHandle:ZL FileName}}
  63. {R:0;2;80;3;1;3;89;3;0;0;{StyleHandle:ZL FileName}}
  64. {R:0;2;247;3;1;3;253;3;0;0;{StyleHandle:ZL FileName}}
  65. {R:0;7;165;3;1;8;173;3;0;0;{StyleHandle:ZL FileName}}
  66. {R:0;7;238;3;1;8;248;3;0;0;{Bold:1}}
  67. {R:0;7;301;3;1;8;311;3;0;0;{Bold:1}}
  68. {R:0;7;622;3;1;8;632;3;0;0;{Bold:1}}
  69. {R:0;7;662;3;1;8;672;3;0;0;{Bold:1}}
  70. {R:0;8;34;3;1;9;44;3;0;0;{Bold:1}}
  71. {R:0;8;118;3;1;9;128;3;0;0;{Bold:1}}
  72. {R:0;8;132;3;1;9;140;3;0;0;{Bold:1}}
  73. {R:0;8;179;3;1;9;189;3;0;0;{Bold:1}}
  74. {R:0;8;212;3;1;9;222;3;0;0;{Bold:1}}
  75. {R:0;8;275;3;1;9;285;3;0;0;{Bold:1}}
  76. {R:0;8;321;3;1;9;331;3;0;0;{Bold:1}}
  77. {R:0;9;45;3;1;10;55;3;0;0;{Bold:1}}
  78. {R:0;9;81;3;1;10;91;3;0;0;{Bold:1}}
  79. {R:0;9;205;3;1;10;213;3;0;0;{Bold:1}}
  80. {R:0;9;287;3;1;10;314;3;0;0;{Bold:1}}
  81. {R:0;9;365;3;1;10;375;3;0;0;{StyleHandle:ZL FileName}}
  82. {R:0;10;69;3;1;11;79;3;0;0;{Bold:1}}
  83. {R:0;10;192;3;1;11;202;3;0;0;{StyleHandle:ZL FileName}}
  84. {R:0;6;261;3;1;7;263;3;0;0;{StyleHandle:ZL FileName}}
  85. {R:0;11;18;3;1;12;31;3;0;0;{Bold:1}}
  86. {R:0;11;76;3;1;12;86;3;0;0;{StyleHandle:ZL FileName}}
  87. {R:0;11;109;3;1;12;111;3;0;0;{Bold:1}}
  88. {R:0;11;128;3;1;12;138;3;0;0;{StyleHandle:ZL FileName}}
  89. {R:0;11;159;3;1;12;172;3;0;0;{Bold:1}}
  90. {R:0;12;17;3;1;13;21;3;0;0;{Bold:1}}
  91. {R:0;12;129;3;1;13;139;3;0;0;{Bold:1}}
  92. {R:0;12;177;3;1;13;187;3;0;0;{StyleHandle:ZL FileName}}
  93. {R:0;13;;32;1;14;20;3;0;0;{StyleHandle:ZLSubHead}}
  94. {R:0;13;64;3;1;14;91;3;0;0;{Bold:1}}
  95. {R:0;13;104;3;1;14;114;3;0;0;{Bold:1}}
  96. {R:0;13;190;3;1;14;200;3;0;0;{Bold:1}}
  97. {R:0;13;461;3;1;14;485;3;0;0;{Bold:1}}
  98. {R:0;14;75;3;1;15;85;3;0;0;{StyleHandle:ZL FileName}}
  99. {R:0;14;;32;1;15;22;3;0;0;{StyleHandle:ZLSubHead}}
  100. {R:0;17;;32;1;18;22;3;0;0;{StyleHandle:ZLSubHead}}
  101. {R:0;17;70;3;1;18;80;3;0;0;{StyleHandle:ZL FileName}}
  102. {R:0;17;118;3;1;18;131;3;0;0;{Bold:1}}
  103. {R:0;17;427;3;1;18;440;3;0;0;{Bold:1}}
  104. {R:0;17;564;3;1;18;577;3;0;0;{Bold:1}}
  105. {R:0;18;56;3;1;19;69;3;0;0;{Bold:1}}
  106. {R:0;21;;32;1;22;8;3;0;0;{StyleHandle:ZLSubHead}}
  107. {R:0;23;160;3;1;24;168;3;0;0;{Bold:1}}
  108. {R:0;23;214;3;1;24;220;3;0;0;{Bold:1}}
  109. {R:0;24;;32;1;25;19;3;0;0;{StyleHandle:ZLSubHead}}
  110. {R:0;24;205;3;1;25;228;3;0;0;{Bold:1}}
  111. {R:0;26;104;3;1;27;112;3;0;0;{Bold:1}}
  112. {R:0;26;192;3;1;27;207;3;0;0;{Bold:1}}
  113. {R:0;26;379;3;1;27;389;3;0;0;{Bold:1}}
  114. {R:0;26;397;3;1;27;406;3;0;0;{Bold:1}}
  115. {R:0;27;61;3;1;28;71;3;0;0;{Bold:1}}
  116. {R:0;27;157;3;1;28;167;3;0;0;{Bold:1}}
  117. {R:0;27;235;3;1;28;243;3;0;0;{StyleHandle:ZL FileName}}
  118. {R:0;30;;32;1;31;15;3;0;0;{StyleHandle:ZLSubHead}}
  119. {R:0;31;;32;1;32;7;3;0;0;{StyleHandle:ZLSubHead}}
  120. {R:0;32;;32;1;33;17;3;0;0;{StyleHandle:ZLSubHead}}
  121. {R:0;32;72;3;1;33;80;3;0;0;{StyleHandle:ZL FileName}}
  122. {R:0;31;84;3;1;32;92;3;0;0;{Bold:1}}
  123. {R:0;31;120;3;1;32;126;3;0;0;{Bold:1}}
  124. {R:0;28;;32;1;29;28;3;0;0;{Bold:0}}
  125. {R:0;26;8;3;1;27;52;3;0;0;{Bold:1}}
  126. {R:0;28;8;3;1;29;28;3;0;0;{Bold:1}}
  127. {R:0;28;48;3;1;29;57;3;0;0;{Bold:1}}
  128. {R:0;28;154;3;1;29;164;3;0;0;{Bold:1}}
  129. {R:0;28;203;3;1;29;212;3;0;0;{Bold:1}}
  130. {R:0;28;284;3;1;29;293;3;0;0;{Bold:1}}
  131. {R:0;28;300;3;1;29;320;3;0;0;{Bold:1}}
  132. {R:0;29;13;3;1;30;33;3;0;0;{Bold:1}}
  133. {R:0;29;79;3;1;30;89;3;0;0;{StyleHandle:ZL FileName}}
  134. {R:0;29;166;3;1;30;176;3;0;0;{Bold:1}}
  135. {R:0;29;314;3;1;30;324;3;0;0;{StyleHandle:ZL FileName}}
  136. {R:0;29;400;3;1;30;408;3;0;0;{StyleHandle:ZL FileName}}
  137. {R:0;29;473;3;1;30;483;3;0;0;{Bold:1}}
  138. {R:0;29;540;3;1;30;567;3;0;0;{Bold:1}}
  139. {R:0;29;745;3;1;30;755;3;0;0;{Bold:1}}
  140. {R:0;30;117;3;1;31;125;3;0;0;{StyleHandle:ZL FileName}}
  141. {R:0;30;130;3;1;31;140;3;0;0;{StyleHandle:ZL FileName}}
  142. {R:0;30;236;3;1;31;246;3;0;0;{StyleHandle:ZL FileName}}
  143. {R:0;30;304;3;1;31;349;3;0;0;{Bold:1}}
  144. {R:0;30;465;3;1;31;475;3;0;0;{StyleHandle:ZL FileName}}
  145. {PageHefoBreakValues-H:0;0;0;;1;396;0;0;;;0;;;1;0;0;0;;;0}
  146. {HD-H:0;2}
  147. {HBR-H:0;2;;32;;32;{StyleHandle:ZLBase}}
  148. {HBR-H:0;2;;32;;32;{StyleHandle:ZLHeadFoot}}
  149. {HD-H:0;3}
  150. {HBR-H:0;3;;32;;32;{StyleHandle:ZLBase}}
  151. {HBR-H:0;3;;32;;32;{StyleHandle:ZLHeadFoot}}
  152. {EndOfData}
  153. {CmdGroup:{ViewCreate:5248;13984;12480;13952}
  154. {ViewControl:100;0;1;1;0;0;0;2048;0;2048}
  155. {CurrentPosition:0;0;0;3}
  156. }
  157.