I know that the readers out there who have gotten to this point are an incredibly savvy bunch. Almost by definition. Anyone who has gotten to this point must have an extraordinarily fine appreciation for the "real deal", and a razor-sharp mind. Therefore, it comes as absolutely no surprise to me that I can sense a growing unease about the ability of the information stored in the event and event_result tables to adequately represent the game detail implicit in the new structure. Clearly, the events recorded for the results of an at-bat and those that should be recorded for a runner on base are considerably different. At a minimum, it makes absolutely no sense to scroll through a long series of options when only a relative few apply to any given context. Therefore, before I launch into deeper work on the interface I want to put into place a set of codes that both makes sense and can be readily extended to cover events that have not occurred to me.
The strategy I am going to employ in assigning these codes will involve nesting the classes under which individual items will be grouped within the codes themselves. This will allow me to store the codes and their descriptions in a single table, selecting those appropriate to a given context by passing the appropriate value to a placeholder in a prepared database statement. In that sense, this will be something of a model for the manner in which a single database statement can serve multiple purposes.
The basic structure that I will employ here will therefore be something like this, albeit somewhat more sophisticated:
| Code | Descriptor |
| ABR:01:01 | Strikeout |
| ABR:01:02 | Groundout |
| ... | ... |
| ABE:01:01 | Ball |
| ABE:01:02 | Strike-Taken |
| ... | ... |
| OBE:01:01 | Out-Picked off |
| OBE:02:01 | Advance-Hit |
| Code | Descriptor | Context | Class |
| ABR:01:01 | Strikeout | ABR | Out |
| ... | ... | ... | ... |
| ABE:01:01 | Ball | ABE | |
| ... | ... | ... | ... |
| OBE:01:01 | Picked off | OBE | Out |
The value of a structure like this lies primarily in its ability to force the creation of unique codes, and thus to help promote the integrity of the information stored in the system. The code itself becomes the primary key for the table, and specification that it be unique will prevent the insertion, inadvertent or otherwise, of a second row with the same code. A second benefit of this layout lies in the potential for streamlining both queries and the manipulation of the resultant result sets. As the code value incorporates all of the pertinent levels of detail, a query to return all of the on base events that fall into a certain class need not require a link to the source table holding the codes. In sql, such a link is known as a join, and every join added to a query results in slower response and the consumption of more computer resources, because the database server must assemble the composite record before it can return the result. (While more sophisticated database servers employ a variety of techniques to minimize the toll required by this process, a query requiring joins still takes longer than one that does not.) There will be times in any reasonably complex application when a join is required to return the desired information. After all, virtually all database engines are relational databases; establishing relationships between tables is inherent in the design of a relational system. At the same time, measures such as this can reduce the number of joins required, thus optimizing overall system response and reducing the complexity of those statements that do require joins.
The actual assignation of the codes is the kind of drudge work that makes everything else easier if done adequately. As is the case with virtually everything, the first 80% takes 20% of the effort and the last 20% requires 80%. Anticipating the set of events that will be recorded in the ab_results table is not all that taxing:
At Bat Results
|
Class
|
Event
| Out
| Strikeout
| Out
| Groundout
| Out
| Flyout
| Out
| Foulout
| Out
| Sacrifice Fly
| Out
| Sacrifice Bunt
| Out
| Dropped Third Strike
| Out
| Double Play
| Out
| Triple Play
| Hit
| Single
| Hit
| Double
| Hit
| Triple
| Hit
| Home Run
| Other
| Walk
| Other
| Hit by Pitch
| Other
| Error
| | |
The final versions of the codes assigned will be more finely-grained, in that they will, for example, include the position that committed an error. It is worth restating, however, that this is just enriching the detail of the events recorded. In the absence of the more detailed codes, more specific information could simp[ly be recorded in the notes associated with that record.
The events that will be recorded in the ab_event table essentially represent the stream of balls and strikes that will be associated with an individual at bat. This description, however, belies the underlying detail required to automatically tabulate the state of the at bat.
| At Bat Events |
| Ball |
| Strike-Taken |
| Strike-Swinging |
| Foul Ball-Out of Play-Strike |
| Foul Ball-Out of Play-No Strike |
| Foul Ball-In Play-Strike-No Play |
| Foul Ball-In Play-Strike-Error |
| Foul Ball-In Play-No Strike-No Play |
| Foul Ball-In Play-No Strike-Error |
| Ball in Play |
The exception to which I referred earlier is the context in which a batter with two strikes attempts a bunt which goes foul. To prevent batters from bunting pitch after pitch foul to wear out the pitcher, this is recorded as a strikeout. Again, the specific context of the strikeout would be recorded in the associated text box.
Defining the events to be recorded for runners on base is also more difficult than it might seem. The following provides a start.
On Base Events
| Class
| Event
| Out
| Steal Attempt
| Out
| Picked Off
| Out
| Force Play
| Out
| Doubled Off
| Advance
| Hit
| Advance
| Stolen Base
| Advance
| Error
| Advance
| Wild Pitch
| Advance
| Passed Ball
| Advance
| Walk
| Advance
| Sacrifice
| Other
| Pickoff Attempt-Safe
| | |
A little reflection reveals that these codes should encapsulate somewhat more detail. As an example, during a season fans of any given team might complain that their team is playing "station to station" baseball, which means that the team's runners have gotten into a patterm in which they advance only when there is a base hit, and then often only by the number of bases that the hitter was able to garner from the hit. Potentially, of course, the actions of runners on the basepaths are much more fluid than that. In at least half of the circumstances in which a batter singles with a runner on first, for example, that runner will advance to third. There is no intermediate event to associate with the move from second to third; the runner advanced from first to third as a result of the hit. Therefore, the table of on base event codes must have seperate values distinquishing the potential locations of the runner as a result of the play. I gave consideration to two potential formulations of these codes, in the first specifying the number of bases advanced and in the second specifying the endpoint of the runner, in the end adopting the latter to ease the load on the server by reducing the contexts to which the server must respond. If I were to implement the first type of code values, the task of automatically registering key events, such as a run scored and a RBI credited to the batter, would be complicated by the necessity of comparing the nature of the recorded event with the state of the bases at the time of the event. In contrast, by specifying the endpoint of the runner's advance many of those items can be registered in a straightforward manner. It is worthwhile, however, to briefly engage in what Albert Einstein used to call a "thought experiment". Imagine, if you will, <nod to The Twilight Zone> that the number of bases runners advanced as a result of a given individual's at bats was a key piece of baseball information. (While this may seem to be important, it is likely to primarily reflect the relative speed of the individuals preceding the subject individual in the batting order, so two individuals of equivalent effectiveness at the plate would have significantly different values for this statistic.) If, however, this were important information, the first form of code value assignment would better lend itself to the accumulation of those values.
In any event, the initial form of the ob_events codes will look something like this:
On Base Events
| Event
| Result
| Code
| Pick-Off Attempt
| Out
| OBE:01:01:00:00
| Pick-Off Attempt
| Safe-Return to Base
| OBE:01:02:00:00
| Pick-Off Attempt
| Steal-Safe
| OBE:01:03:00:00
| Pick-Off Attempt
| Steal-Out
| OBE:01:04:00:00
| Pick-Off Attempt
| Advance-E1 (error on pitcher)-2nd (on seconnd base as result)
| OBE:01:05:E1:02
| Pick-Off Attempt
| Advance-E2-2nd
| OBE:01:05:E2:02
| Pick-Off Attempt
| Advance-E3-2nd
| OBE:01:05:E3:02
| Pick-Off Attempt
| Advance-E4-2nd
| OBE:01:05:E4:02
| Pick-Off Attempt
| Advance-E5-2nd
| OBE:01:05:E5:02
| Pick-Off Attempt
| Advance-E6-2nd
| OBE:01:05:E6:02
| Pick-Off Attempt
| Advance-E7-2nd
| OBE:01:05:E7:02
| Pick-Off Attempt
| Advance-E8-2nd
| OBE:01:05:E8:02
| Pick-Off Attempt
| Advance-E9-2nd
| OBE:01:05:E9:02
| Pick-Off Attempt
| Advance-E1-3rd
| OBE:01:05:E1:03
| Pick-Off Attempt
| Advance-E2-3rd
| OBE:01:05:E2:03
| Pick-Off Attempt
| Advance-E3-3rd
| OBE:01:05:E3:03
| Advance on Play
| Advance-2nd
| OBE:02:04:00:02
| | ||
For those who may question my concern with maintaining straightforward logic on the server, in the past several weeks I have been experimenting with a couple of collaborative environments that can be run an an apache server, specifically twiki and scoop. Each is interesting, but as a result of this experimentation the additional load on the server exacted by the construction of an environment capable of responding to a wide range of request became very obvious. in both cases, the machine I was employing to host the environment was several times as powerful as the root ralphzilla machine, yet the application was less responsive. This should not be interpreted as a criticism of those packages, the process of building an environment that can be customized to represent a free-form collaborative environment is a daunting one, requiring that the server respond to a wide range of requests. It does, however, illustrate the load that such entails. As the application I am building here can be constructed in such a manner as to be very specific in the manner in which requests are handled, the server's responses will be much quicker. The price that is required is the kind of specificity I am employing in the development of these codes.
Note the final code in the table above, described as "Advance on Play". This will be used to describe a circumstance in which a user advances, or attempts to, as another play is taking place. A common example of this often occurs when a batter hits a sacrifice fly with more than one runner on base. If an attempt is made to throw the lead runner out, generally at the plate, the remaining runner(s) may attempt to advance a base. Such plays are independent actions within the context of the game, not associated with other events beyond the fact that they happen while a play is being made on another runner. It is therefore my intent that such events will be tied to the events around them by simply including a short description in the associated text box.
When I wrote the draft of this chapter I had intended to simply link to a text file containing the first version of the codes I am going to run into the relevant table (Release 1.0 <grin>), rasoning that there was no point in including a big table with more than 200 seperate rows in the document itself. As I have finalized the chapter, however, I have come to believe that such a listing will have real value, that a quick scan down a formatted listing of the codes can impart a visceral understanding of their structure that will serve to augment the written description.
Before I do that, however, I want to explicitly specify the internal structure of the code values.
| Segment | Description
| XXX:xx:xx:xx:xx
| The first segment, of course, represents an acronym identifying the context for which the code is appropriate.
| xxx:XX:xx:xx:xx
| In the at bat results and on base events context, for which I have gouped the codes into classes, the second segment identifies the pertinent class, while in the much smaller set of codes pertinent to at bat events it is used to identify the major types of events that happen during an at bat (ball,strike,other) thus serving much the same purpose.
| xxx:xx:XX:xx:xx
| In the third segment the code value identifies the specific event, as in the at bat event of a foul ball on which there was an error, and on which a strike was charged.
| xxx:xx:xx:XX:xx
| The fourth segment in the codes represents the position that fielded the ball, where appropriate. While the table above uses the character "E" to preface the position code, in that more limited context being used to identify the position that had committed an error, in the release version of the code values below the position codes 1-9 are prefaced with "0". Thus in this version the segment simply identifies the position making the play; the type of play is identified by the preceding segment. While the standard position code occupies only one character, I have maintained a two-character representation to allow for unusual circumstances, as in softball leagues which employ the tenth position of short center fielder.
| xxx:xx:xx:xx:XX
| The final code segment is occupied by a value representing the final position occupied by the batter/runner as the result of the play. Here again I have used two characters to hold a value that requires only one, as a hedge against potential future use of the segment in an extended context. (In older database systems that used fixed-length hierarchical structures, empty spaces were frequently left in a record structure to allow for expansion. Those old enough may recall forms with areas defined as "reserved for future use". What I am doing here is analogous to that.) In both this and the preceding segments I occupy the segment with the string "NA" if not pertinent to the context of the specific event.
| |
Again, it is worth noting that this structure is not at all normalized. While some degree of normalization would reduce the number of codes in this table, that benefit would be far outweighed by the overhead engendered by adding one or two joins to any statements accessing records that met specific criteria. If this system were part of a larger system, and one of the non-normalized elements of this table represented the link between parts of the system, that overhead would be justified.
Given that introduction, here are the code values:
| Code | Description | Context | Class
| ABE:01:01:NA:NA | Ball | ABE
| ABE:02:01:NA:NA | Strike-Taken
| ABE:02:02:NA:NA | Strike-Swinging | ABE
| ABE:02:03:NA:NA | Foul Ball-out of play-strike | ABE
| ABE:02:04:NA:NA | Foul Ball-in play-strike-no play | ABE
| ABE:02:05:01:NA | Foul Ball-in play-strike-error pitcher | ABE
| ABE:02:05:02:NA | Foul Ball-in play-strike-error catcher | ABE
| ABE:02:05:03:NA | Foul Ball-in play-strike-error first baseman | ABE
| ABE:02:05:04:NA | Foul Ball-in play-strike-error second baseman | ABE
| ABE:02:05:05:NA | Foul Ball-in play-strike-error third baseman | ABE
| ABE:02:05:06:NA | Foul Ball-in play-strike-error shortstop | ABE
| ABE:02:05:07:NA | Foul Ball-in play-strike-error left fielder | ABE
| ABE:02:05:08:NA | Foul Ball-in play-strike-error center fielder | ABE
| ABE:02:05:09:NA | Foul Ball-in play-strike-error right fielder | ABE
| ABE:03:03:NA:NA | Foul Ball-out of play-no strike | ABE
| ABE:03:05:01:NA | Foul Ball-in play-no strike-error pitcher | ABE
| ABE:03:05:02:NA | Foul Ball-in play-no strike-error catcher | ABE
| ABE:03:05:03:NA | Foul Ball-in play-no strike-error first baseman | ABE
| ABE:03:05:04:NA | Foul Ball-in play-no strike-error second baseman | ABE
| ABE:03:05:05:NA | Foul Ball-in play-no strike-error third baseman | ABE
| ABE:03:05:06:NA | Foul Ball-in play-no strike-error shortstop | ABE
| ABE:03:05:07:NA | Foul Ball-in play-no strike-error left fielder | ABE
| ABE:03:05:08:NA | Foul Ball-in play-no strike-error center fielder | ABE
| ABE:03:05:09:NA | Foul Ball-in play-no strike-error right fielder | ABE
| ABE:03:04:NA:NA | Foul Ball-out of play-no strike-no play | ABE
| ABE:04:01:NA:NA | Hit by pitch | ABE
| ABE:05:01:NA:NA | Ball batted fair | ABE
| ABR:01:01:NA:NA | Strikeout | ABR | Out
| ABR:01:02:01:NA | Groundout-Pitcher | ABR | Out
| ABR:01:02:02:NA | Groundout-Catcher | ABR | Out
| ABR:01:02:03:NA | Groundout-First Baseman | ABR | Out
| ABR:01:02:04:NA | Groundout-Second Baseman | ABR | Out
| ABR:01:02:05:NA | Groundout-Third Baseman | ABR | Out
| ABR:01:02:06:NA | Groundout-Shortstop | ABR | Out
| ABR:01:02:07:NA | Groundout-Left Field | ABR | Out
| ABR:01:02:08:NA | Groundout-Center Field | ABR | Out
| ABR:01:02:09:NA | Groundout-Right Field | ABR | Out
| ABR:01:03:01:NA | Popout-Pitcher | ABR | Out
| ABR:01:03:02:NA | Popout-Catcher | ABR | Out
| ABR:01:03:03:NA | Popout-First Baseman | ABR | Out
| ABR:01:03:04:NA | Popout-Second Baseman | ABR | Out
| ABR:01:03:05:NA | Popout-Third Baseman | ABR | Out
| ABR:01:03:06:NA | Popout-Shortstop | ABR | Out
| ABR:01:03:07:NA | Flyout-Left Field | ABR | Out
| ABR:01:03:08:NA | Flyout-Center Field | ABR | Out
| ABR:01:03:09:NA | Flyout-Right Field | ABR | Out
| ABR:01:04:01:NA | Foulout-Pitcher | ABR | Out
| ABR:01:04:02:NA | Foulout-Catcher | ABR | Out
| ABR:01:04:03:NA | Foulout-First Baseman | ABR | Out
| ABR:01:04:04:NA | Foulout-Second Baseman | ABR | Out
| ABR:01:04:05:NA | Foulout-Third Baseman | ABR | Out
| ABR:01:04:06:NA | Foulout-Shortstop | ABR | Out
| ABR:01:04:07:NA | Foulout-Left Field | ABR | Out
| ABR:01:04:08:NA | Foulout-Center Field | ABR | Out
| ABR:01:04:09:NA | Foulout-Right Field | ABR | Out
| ABR:01:05:01:NA | Sacrifice Fly-Pitcher | ABR | Out
| ABR:01:05:02:NA | Sacrifice Fly-Catcher | ABR | Out
| ABR:01:05:03:NA | Sacrifice Fly-First Baseman | ABR | Out
| ABR:01:05:04:NA | Sacrifice Fly-Second Baseman | ABR | Out
| ABR:01:05:05:NA | Sacrifice Fly-Third Baseman | ABR | Out
| ABR:01:05:06:NA | Sacrifice Fly-Shortstop | ABR | Out
| ABR:01:05:07:NA | Sacrifice Fly-Left Field | ABR | Out
| ABR:01:05:08:NA | Sacrifice Fly-Center Field | ABR | Out
| ABR:01:05:09:NA | Sacrifice Fly-Right Field | ABR | Out
| ABR:01:06:01:NA | Sacrifice Bunt-Pitcher | ABR | Out
| ABR:01:06:02:NA | Sacrifice Bunt-Catcher | ABR | Out
| ABR:01:06:03:NA | Sacrifice Bunt-First Baseman | ABR | Out
| ABR:01:06:04:NA | Sacrifice Bunt-Second Baseman | ABR | Out
| ABR:01:06:05:NA | Sacrifice Bunt-Third Baseman | ABR | Out
| ABR:01:06:06:NA | Sacrifice Bunt-Shortstop | ABR | Out
| ABR:01:06:07:NA | Sacrifice Bunt-Left Field | ABR | Out
| ABR:01:06:08:NA | Sacrifice Bunt-Center Field | ABR | Out
| ABR:01:06:09:NA | Sacrifice Bunt-Right Field | ABR | Out
| ABR:01:07:02:NA | Out-Dropped Third Strike | ABR | Out
| ABR:01:08:NA:NA | Out-Double Play | ABR | Out
| ABR:01:09:NA:NA | Out-Triple Play | ABR | Out
| ABR:02:01:NA:01 | Hit-Single | ABR | Hit
| ABR:02:02:NA:02 | Hit-Double | ABR | Hit
| ABR:02:03:NA:03 | Hit-Triple | ABR | Hit
| ABR:02:04:NA:04 | Hit-Home Run | ABR | Hit
| ABR:03:01:NA:01 | Other-Walk | ABR | Other
| ABR:03:02:NA:01 | Other-Hit by Pitch | ABR | Other
| ABR:03:03:01:01 | Other-Reached first on error-pitcher | ABR | Other
| ABR:03:03:02:01 | Other-Reached first on error-catcher | ABR | Other
| ABR:03:03:03:01 | Other-Reached first on error-first baseman | ABR | Other
| ABR:03:03:04:01 | Other-Reached first on error-second baseman | ABR | Other
| ABR:03:03:05:01 | Other-Reached first on error-third baseman | ABR | Other
| ABR:03:03:06:01 | Other-Reached first on error-shortstop | ABR | Other
| ABR:03:03:07:01 | Other-Reached first on error-left fielder | ABR | Other
| ABR:03:03:08:01 | Other-Reached first on error-center fielder | ABR | Other
| ABR:03:03:09:01 | Other-Reached first on error-right fielder | ABR | Other
| ABR:03:03:01:02 | Other-Reached second on two-base error-pitcher | ABR | Other
| ABR:03:03:02:02 | Other-Reached second on two-base error-catcher | ABR | Other
| ABR:03:03:03:02 | Other-Reached second on two-base error-first baseman | ABR | Other
| ABR:03:03:04:02 | Other-Reached second on two-base error-second baseman | ABR | Other
| ABR:03:03:05:02 | Other-Reached second on two-base error-third baseman | ABR | Other
| ABR:03:03:06:02 | Other-Reached second on two-base error-shortstop | ABR | Other
| ABR:03:03:07:02 | Other-Reached second on two-base error-left fielder | ABR | Other
| ABR:03:03:08:02 | Other-Reached second on two-base error-center fielder | ABR | Other
| ABR:03:03:09:02 | Other-Reached second on two-base error-right fielder | ABR | Other
| ABR:03:03:01:03 | Other-Reached third on third-base error-pitcher | ABR | Other
| ABR:03:03:02:03 | Other-Reached third on third-base error-catcher | ABR | Other
| ABR:03:03:03:03 | Other-Reached third on third-base error-first baseman | ABR | Other
| ABR:03:03:04:03 | Other-Reached third on third-base error-second baseman | ABR | Other
| ABR:03:03:05:03 | Other-Reached third on third-base error-third baseman | ABR | Other
| ABR:03:03:06:03 | Other-Reached third on third-base error-shortstop | ABR | Other
| ABR:03:03:07:03 | Other-Reached third on third-base error-left fielder | ABR | Other
| ABR:03:03:08:03 | Other-Reached third on third-base error-center fielder | ABR | Other
| ABR:03:03:09:03 | Other-Reached third on third-base error-right fielder | ABR | Other
| ABR:03:03:01:04 | Other-Scored on four-base error-pitcher | ABR | Other
| ABR:03:03:02:04 | Other-Scored on four-base error-catcher | ABR | Other
| ABR:03:03:03:04 | Other-Scored on four-base error-first baseman | ABR | Other
| ABR:03:03:04:04 | Other-Scored on four-base error-second baseman | ABR | Other
| ABR:03:03:05:04 | Other-Scored on four-base error-third baseman | ABR | Other
| ABR:03:03:06:04 | Other-Scored on four-base error-shortstop | ABR | Other
| ABR:03:03:07:04 | Other-Scored on four-base error-left fielder | ABR | Other
| ABR:03:03:08:04 | Other-Scored on four-base error-center fielder | ABR | Other
| ABR:03:03:09:04 | Other-Scored on four-base error-right fielder | ABR | Other
| OBE:01:01:NA:NA | Pick-off-out | OBE | Out
| OBE:01:02:NA:NA | Steal Attempt-out | OBE | Out
| OBE:01:03:NA:02 | Force play out at 2nd | OBE | Out
| OBE:01:03:NA:03 | Force play out at 3rd | OBE | Out
| OBE:01:03:NA:04 | Force play out at home | OBE | Out
| OBE:02:01:NA:NA | Steal | OBE | Advance
| OBE:02:02:01:02 | steal attempt-error on pitcher-runner reaches 2nd | OBE | Advance
| OBE:02:02:01:03 | steal attempt-error on pitcher-runner reaches 3rd | OBE | Advance
| OBE:02:02:01:04 | steal attempt-error on pitcher-runner scores | OBE | Advance
| OBE:02:02:02:02 | steal attempt-error on catcher-runner reaches 2nd | OBE | Advance
| OBE:02:02:02:03 | steal attempt-error on catcher-runner reaches 3rd | OBE | Advance
| OBE:02:02:02:04 | steal attempt-error on catcher-runner scores | OBE | Advance
| OBE:02:02:03:02 | steal attempt-error on first baseman-runner reaches 2nd | OBE | Advance
| OBE:02:02:03:03 | steal attempt-error on first baseman-runner reaches 3rd | OBE | Advance
| OBE:02:02:03:04 | steal attempt-error on first baseman-runner scores | OBE | Advance
| OBE:02:02:04:02 | steal attempt-error on second baseman-runner reaches 2nd | OBE | Advance
| OBE:02:02:04:03 | steal attempt-error on second baseman-runner reaches 3rd | OBE | Advance
| OBE:02:02:04:04 | steal attempt-error on second baseman-runner scores | OBE | Advance
| OBE:02:02:05:02 | steal attempt-error on third baseman-runner reaches 2nd | OBE | Advance
| OBE:02:02:05:03 | steal attempt-error on third baseman-runner reaches 3rd | OBE | Advance
| OBE:02:02:05:04 | steal attempt-error on third baseman-runner scores | OBE | Advance
| OBE:02:02:06:02 | steal attempt-error on shortstop-runner reaches 2nd | OBE | Advance
| OBE:02:02:06:03 | steal attempt-error on shortstop-runner reaches 3rd | OBE | Advance
| OBE:02:02:06:04 | steal attempt-error on shortstop-runner scores | OBE | Advance
| OBE:02:02:07:02 | steal attempt-error on left fielder-runner reaches 2nd | OBE | Advance
| OBE:02:02:07:03 | steal attempt-error on left fielder-runner reaches 3rd | OBE | Advance
| OBE:02:02:07:04 | steal attempt-error on left fielder-runner scores | OBE | Advance
| OBE:02:02:08:02 | steal attempt-error on center fielder-runner reaches 2nd | OBE | Advance
| OBE:02:02:08:03 | steal attempt-error on center fielder-runner reaches 3rd | OBE | Advance
| OBE:02:02:08:04 | steal attempt-error on center fielder-runner scores | OBE | Advance
| OBE:02:02:09:02 | steal attempt-error on right fielder-runner reaches 2nd | OBE | Advance
| OBE:02:02:09:03 | steal attempt-error on right fielder-runner reaches 3rd | OBE | Advance
| OBE:02:02:09:04 | steal attempt-error on right fielder-runner scores | OBE | Advance
| OBE:02:03:01:02 | Pick off attempt-error on pitcher-runner reaches 2nd | OBE | Advance
| OBE:02:03:01:03 | Pick off attempt-error on pitcher-runner reaches 3rd | OBE | Advance
| OBE:02:03:01:04 | Pick off attempt-error on pitcher-runner scores | OBE | Advance
| OBE:02:03:02:02 | Pick off attempt-error on catcher-runner reaches 2nd | OBE | Advance
| OBE:02:03:02:03 | Pick off attempt-error on catcher-runner reaches 3rd | OBE | Advance
| OBE:02:03:02:04 | Pick off attempt-error on catcher-runner scores | OBE | Advance
| OBE:02:03:03:02 | Pick off attempt-error on first baseman-runner reaches 2nd | OBE | Advance
| OBE:02:03:03:03 | Pick off attempt-error on first baseman-runner reaches 3rd | OBE | Advance
| OBE:02:03:03:04 | Pick off attempt-error on first baseman-runner scores | OBE | Advance
| OBE:02:03:04:02 | Pick off attempt-error on second baseman-runner reaches 2nd | OBE | Advance
| OBE:02:03:04:03 | Pick off attempt-error on second baseman-runner reaches 3rd | OBE | Advance
| OBE:02:03:04:04 | Pick off attempt-error on second baseman-runner scores | OBE | Advance
| OBE:02:03:05:02 | Pick off attempt-error on third baseman-runner reaches 2nd | OBE | Advance
| OBE:02:03:05:03 | Pick off attempt-error on third baseman-runner reaches 3rd | OBE | Advance
| OBE:02:03:05:04 | Pick off attempt-error on third baseman-runner scores | OBE | Advance
| OBE:02:03:06:02 | Pick off attempt-error on shortstop-runner reaches 2nd | OBE | Advance
| OBE:02:03:06:03 | Pick off attempt-error on shortstop-runner reaches 3rd | OBE | Advance
| OBE:02:03:06:04 | Pick off attempt-error on shortstop-runner scores | OBE | Advance
| OBE:02:03:07:02 | Pick off attempt-error on left fielder-runner reaches 2nd | OBE | Advance
| OBE:02:03:07:03 | Pick off attempt-error on left fielder-runner reaches 3rd | OBE | Advance
| OBE:02:03:07:04 | Pick off attempt-error on left fielder-runner scores | OBE | Advance
| OBE:02:03:08:02 | Pick off attempt-error on center fielder-runner reaches 2nd | OBE | Advance
| OBE:02:03:08:03 | Pick off attempt-error on center fielder-runner reaches 3rd | OBE | Advance
| OBE:02:03:08:04 | Pick off attempt-error on center fielder-runner scores | OBE | Advance
| OBE:02:03:09:02 | Pick off attempt-error on right fielder-runner reaches 2nd | OBE | Advance
| OBE:02:03:09:03 | Pick off attempt-error on right fielder-runner reaches 3rd | OBE | Advance
| OBE:02:03:09:04 | Pick off attempt-error on right fielder-runner scores | OBE | Advance
| OBE:02:04:01:02 | batted ball-error on pitcher-runner reaches 2nd | OBE | Advance
| OBE:02:04:01:03 | batted ball-error on pitcher-runner reaches 3rd | OBE | Advance
| OBE:02:04:01:04 | batted ball-error on pitcher-runner scores | OBE | Advance
| OBE:02:04:02:02 | batted ball-error on catcher-runner reaches 2nd | OBE | Advance
| OBE:02:04:02:03 | batted ball-error on catcher-runner reaches 3rd | OBE | Advance
| OBE:02:04:02:04 | batted ball-error on catcher-runner scores | OBE | Advance
| OBE:02:04:03:02 | batted ball-error on first baseman-runner reaches 2nd | OBE | Advance
| OBE:02:04:03:03 | batted ball-error on first baseman-runner reaches 3rd | OBE | Advance
| OBE:02:04:03:04 | batted ball-error on first baseman-runner scores | OBE | Advance
| OBE:02:04:04:02 | batted ball-error on second baseman-runner reaches 2nd | OBE | Advance
| OBE:02:04:04:03 | batted ball-error on second baseman-runner reaches 3rd | OBE | Advance
| OBE:02:04:04:04 | batted ball-error on second baseman-runner scores | OBE | Advance
| OBE:02:04:05:02 | batted ball-error on third baseman-runner reaches 2nd | OBE | Advance
| OBE:02:04:05:03 | batted ball-error on third baseman-runner reaches 3rd | OBE | Advance
| OBE:02:04:05:04 | batted ball-error on third baseman-runner scores | OBE | Advance
| OBE:02:04:06:02 | batted ball-error on shortstop-runner reaches 2nd | OBE | Advance
| OBE:02:04:06:03 | batted ball-error on shortstop-runner reaches 3rd | OBE | Advance
| OBE:02:04:06:04 | batted ball-error on shortstop-runner scores | OBE | Advance
| OBE:02:04:07:02 | batted ball-error on left fielder-runner reaches 2nd | OBE | Advance
| OBE:02:04:07:03 | batted ball-error on left fielder-runner reaches 3rd | OBE | Advance
| OBE:02:04:07:04 | batted ball-error on left fielder-runner scores | OBE | Advance
| OBE:02:04:08:02 | batted ball-error on center fielder-runner reaches 2nd | OBE | Advance
| OBE:02:04:08:03 | batted ball-error on center fielder-runner reaches 3rd | OBE | Advance
| OBE:02:04:08:04 | batted ball-error on center fielder-runner scores | OBE | Advance
| OBE:02:04:09:02 | batted ball-error on right fielder-runner reaches 2nd | OBE | Advance
| OBE:02:04:09:03 | batted ball-error on right fielder-runner reaches 3rd | OBE | Advance
| OBE:02:04:09:04 | batted ball-error on right fielder-runner scores | OBE | Advance
| OBE:02:05:NA:02 | Advance on hit-runner reaches 2nd | OBE | Advance
| OBE:02:05:NA:03 | Advance on hit-runner reaches 3rd | OBE | Advance
| OBE:02:05:NA:04 | Advance on hit-runner scores | OBE | Advance
| |
In the next section I will begin to fill out the structure of the data entry interface.