Sunday, April 29, 2012

The Wheel of Time [13] Towers of Midnight

This is Part 13 of my continuing series of blogs regarding what may possibly be my last re-read of The Wheel of Time, in anticipation of the 14th and final book releasing in 2013. Please see this blog post for an overview of the re-read and why I am blogging about it. Warning: CONTAINS SPOILERS FOR THE ENTIRE SERIES. The best way to approach this retrospective is via your own re-read. If you have not read the entire series yet, you may want to wait on reading this.




Book 13: Towers of Midnight (2010)
For the first time since Book 6, we get a new Wheel of Time book a year after the previous one. (I don't count the New Spring prequel that was released between Books 10 and 11 since it's not a main sequence novel. I'll cover New Spring in the next blog post since we still have around 9 months until A Memory of Light comes out.)

I can't tell you, after following this series for nigh 20 years, how great it was to get a new volume right away like that. It was awesome. We can chalk this up to all the hard work Brandon Sanderson did in the previous 2 years, since a good chunk of the material in this book had already been written, since he first approached this task with the mindset that he would only be writing one single book. When that didn't happen, material that chronologically would have happened earlier got pushed to this next volume, the second of the Sanderson Trilogy, as I've dubbed it.

This jumping around in time to fill in what happened with Perrin and Mat while Rand and Egwene were getting a full story arc in The Gathering Storm can be a bit confusing, especially when it comes to the appearances of Rand's father, Tam al'Thor. More on that later.

Thoughts Then
As usual, I took a few days off of work when the book came out and picked it up from my local Books-A-Million first thing in the morning. It was on a prominent display right at the entrance and when I brought it up to the counter, the lady there huffed and said, "I just finished setting that up!" I guess she was surprised someone came in first thing to buy it. Anyway, I continued on to the Silver Diner in Reston, VA for breakfast. Then it was back home to read. I read it straight through and finished it in two days.


I thought the book was awesome. Once again, the story moved along at a clip and many other storylines were getting resolved, fan theories years in the making were falling left and right, boring characters had become interesting again, and some of the last few Randland locations were finally being visited (Saldaea and Kandor... at this point Arafel and Mayene are the only major Randland nations we haven't actually visited in the main narrative). By the end, everyone is gathering for the meeting Rand has called at the Field of Merrilor, where he will tell them all what he plans to do at Shayol Ghul and essentially begin the Last Battle.

Reading about such happenings is bittersweet. On one hand I was very excited to actually see them doing it: getting in place for the Last Battle. On the other, it meant the story was almost over, and while I've felt that this has gone on far too long at times, you never want a good thing to end.

It was also a bit strange. Over the years my expectation would be that they get into large scale battles and it would all move to Shayol Ghul and come to head in the Last Battle. Instead, Rand just suddenly decides to break seals on some arbitrary day and lets everyone know in advance. I think there will be more to it than that, but at the end of the book that's the impression you're left with and I was not expecting it.

Sanderson Improves
Overall, I feel Sanderson improved quite a bit with this novel, compared to The Gathering Storm. Mat read much better and sounded just like the Mat of old. He got all the characters right (in my opinion) and did justice to all the major characters. In this book you can definitely tell the difference between Sanderson and Jordan when it comes to WoT; Sanderson is a bit more action-oriented and his style is more urgent than Jordan's. I believe that more of Jordan's remaining material made it into The Gathering Storm than this volume, from what Sanderson has said.

One thing I enjoy about Sanderson's work compared to Jordan's, is that even with so many character threads to deal with, he rarely lets anything drag. That's partly due to all the climaxes happening, but also to the way he structures the novels, with the POV shifting frequently... rarely do you get the same POV more than two chapters straight, compared to the blocks of 4-5 chapters with the same POV that Jordan favored (even in books that had a lot going on). Sanderson also frequently changes the POV within chapters when he doesn't even need to, something Jordan rarely did.

Speaking of differences, something I noticed while writing this blog... I kept wanting to call Brandon Sanderson "Brandon," rather than Sanderson. If you go online, you'll notice people generally call Robert Jordan by "Jordan," whereas Sanderson gets the first name treatment. I suppose that's due to the fact that he's younger and is really just a fan of the series like the rest of us. I mean, he plays Magic the Gathering with fans after signings. It just shows how much he likes to stay connected with his audience.

Perrin Becomes Cool Again
Ever since Dumai's Wells in Book 6, Lord of Chaos, Perrin has been rather boring to me. Instead of embracing the leadership offered to him, he constantly pushed it away, and it got tiresome very quick. In this book, we can see why it happened that way and when he finally takes the mantle of leadership, it's a great relief, because after 7 books, it was old and I stopped enjoying his storylines because of it.

The whole Whitecloak/Perrin storyline was something I could have cared less about—all the overblown stink about killing two Whitecloaks back in Book 1—and the only part of this book that I found "boring" were the Perrin chapters leading up to the battle between the Whitecloaks, Perrin's forces and the Shadowspawn. In the end all of that resolved nicely, the forging of Mah'alleinir was a great, iconic scene and Perrin finally accepts himself for himself, so to speak.

Perrin the Badass

Like some others, I felt the confrontation between Slayer and Perrin in Tel'aran'rhiod seemed too Matrix-like, but I'm not sure how else it could have been done. That's the nature of the dream world. It does make me wonder how Jordan would have handled it, because he and Sanderson write action scenes a lot differently, as I noted earlier.

Love is in the Air
One thing that stood out to me in this novel, and quite frankly bothered me a bit, was how everyone was suddenly getting married or bonded. Of course, there have been relations between these characters throughout the series, but now they all finally get together and commit. As if they don't think they'll survive the Last Battle, so what the hell let's get it on!

Take a look at the body count:
  • Egwene and Gawyn
  • Siuan and Gareth
  • Morgase and Tallanvor
  • Berelain and Galad
  • Thom and Moiraine

Some of these we've been expecting, but all in the same book? It feels like too much and sticks out to me. At the end of the day, though, I have to trust that what's in the books is what Jordan intended, and Sanderson just made sure they happened somewhere, which happened to be in the same book.

Despite all that, the Thom and Moiraine one feels out of place to me. Given Thom's history with Aes Sedai, and how I've always viewed Moiraine, I have trouble reconciling it all.

Zen Rand
After the "Veins of Gold" chapter in Book 12, The Gathering Storm, we've gone from hardcore Rand to a cooler, more zen-like Rand. He finally stops fighting his fate and everyone else, and begins to turn into the Messiah figure that most of us have expected. Given that I've been on Rand's side the entire series, and have been frustrated with the way others treat him—except for the second half of The Gathering Storm, when he went off the deep end—it was great to see him like this. He felt real again. And for the first time, it felt like he was really in charge.

I loved it when he nonchalantly strode into the White Tower and coolly informed Egwene that he intended to break the Seals on the Dark One's prison. He notices Darkfriends at a glance now. Cadsuane doesn't bother him anymore. He apologizes to his adoptive father, Tam al'Thor, in a touching scene. His mere presence brings life back to the land in that immediate area, and persistent cloud cover retreats. In Maradon he bitchslaps a gigantic army of Shadowspawn, using the One Power on a scale we have never before seen in the series. He's so full of awesomeness in this book, and I can't wait to see what he does in the final volume.

There are all kinds of theories about what will really happen during Tarmon Gai'don... will Rand truly die? Will he be reborn somehow? I figure he will be reborn somehow. With all the suffering and pain he's been through, he deserves to have some kind of normal life in anonymity. That would be the greatest reward for him, I think.

Some Borderland and Shadowspawn Love
As I mentioned earlier, the Borderlands get some love this volume, though you might not call hordes of Shadowspawn descending on the various nations "love." You know what I mean, though. The Borderlands, the Blight and Shadowspawn in general have been fairly lacking for many volumes, though it hasn't been as bad as the disappearance of Padan Fain. All these elements were introduced right away in Book 1, The Eye of the World, but they get short shrift as the series progresses and expands to other areas. Now they are back in force. Except for Fain, who only has a brief cameo here.

The assaults on the Kandori towers and Maradon really usher in the feeling that the Last Battle is around the corner. I can only hope that we might visit Arafel in the last book and see what's going on there.

The highlight of all this, though, is Lan's story, as he travels from World's End in Saldaea to Tarwin's Gap in dead Malkier. Here is yet another person who doesn't want to be a leader (there are a lot of those in this series, aren't there?) and I wish we could have spent more time on him, but I like how Sanderson handled this, spreading it across the whole of the novel. The whole attack at Tarwin's Gap at the end reminds me of The Lord of the Rings, where Aragorn leads an army against the Black Gates to distract Sauron's Eye as Frodo and Sam approach Mt. Doom to destroy the Ring. The parallels between the characters and situations from both stories are fairly obvious.

Lan = Aragorn, Tarwin's Gap = Black Gate

Considering all the LotR references and homages in WoT, it would not surprise me if that was deliberate on Jordan's part. But then, considering how timelines have shifted around between POVs throughout the last few volumes, this could be something that happens after the Field of Merrilor and all that. I'm especially curious to see where it fits into everything else. My guess is we might have many battles against Shadowspawn around Randland to take care of before Tarmon Gai'don itself, based on the end of this book, with Shadowspawn in Caemlyn and the Borderlands.

A Decent Cover
It's fitting that Darrell K. Sweet's last published cover for the series (before he died in December 2011) is a good one. At least the proper scene for the cover was chosen. Once they knew the Tower of Ghenjei would be in the book, how could they not choose something related to it for the cover?


Of course, there are always those little details of characters we've known for so many years that Sweet still manages to get wrong, but I won't complain about them anymore. Noal looks good, pretty much as I imagined him. All in all, a decent effort and I don't find it embarrassing to carry around a book featuring this cover. And better yet, no human trollocs on the back!

The Tower of Ghenjei
Now to discuss the cover scene itself. The crown jewel of Towers of Midnight, it's the last major scene, when Mat finally enters the Tower of Ghenjei to rescue Moiraine and outwit the Aelfinn and Eelfinn one more time. Mat killing the gholam was nice and all, but Ghenjei is the pinnacle of Mat's storyline so far. As I mentioned in a previous blog, it had been hinted at for a number books, then confirmed in Book 11, Knife of Dreams, when we finally get to read the letter Moiraine left for Thom before she disappeared into the red ter'angreal doorframe in Cairhien way back in Book 5.

When the cover art for this book was announced, we all knew the scene would be coming. But what would it be like? Would it live up to all the hype?

The Snakes and Foxes chapter
icon, by Matthew C. Nielsen

For me, it lived up to the hype and more. It was wonderfully written and I don't particularly care how much is Jordan or Sanderson. To finally read this sequence, one which we've been waiting forever for, was amazing. The secret of the ashandarei I did not see coming at all and it stunned me, was one of those shocking moments that very few books or movies have been able to deliver for me. I couldn't stop laughing—it was amazingly clever and it surprised me that no one ever thought the ashandarei might have some other greater purpose.

The reveal that Noal was the legendary Jain Farstrider was no big surprise; most of us had figured it out by then. But I like how it was done, and it was great to see him meet his end as a true hero and redeem himself for how he was "used" by the Shadow in the past. I do wish Jordan had done more with his character throughout the series, but I'm happy with what we have.

Overall, this sequence was so awesome, I immediately re-read it both during my first read and this re-read. It's easily my favorite in the entire series after Dumai's Wells (Book 6, Lord of Chaos), in terms of awesomeness and emotional impact. It's one of those iconic scenes that all fans will always remember.

The Future of Randland
Aviendha's second trip through the columns in Rhuidean, where she sees a possible future after Tarmon Gai'don, was not something I was expecting. Jordan had stated before that there would be many loose ends when the series concluded, and that there wouldn't be this happy ending with everybody happy and peaceful. The Dragon would break the world again and shatter nations. There has been this ominous feeling for a while now, that after Rand did his duty at Tarmon Gai'don, people would just go back to their petty ways, fighting amongst themselves once again. It's pretty much confirmed, based on the fact that Rand has to force many of them to do his bidding.

That's the saddest part of the entire series for me. What might possibly happen to the Aiel (based on Aviendha's visions) in the future is heartbreaking. These once proud people—essentially my favorite culture in the series—are shattered and destroyed, eventually succumbing to the dominion of the Seanchan and technology. Aviendha might still have a chance to change it, but we may never know.

It's disappointing to think that all the nations would just go back to their scheming and warring once the Last Battle is over. It's human nature, I suppose. As long as there are different cultures and points of view, people are going to fight each other.

A Double Signing
Going to Sanderson's signing this time around was a last minute decision. I had already met him on the tour for The Gathering Storm. He was coming back to the same bookstore, a Borders in Bailey's Crossroads, VA, and I didn't really want to go there, because it was a hassle to get to compared to where I lived in Reston. But at the last minute I decided to go, mainly because Harriet McDougal, Robert Jordan's widow, was going to be there.

So I trekked on out once more and bought a hardback copy of The Way of Kings (Book 1 of Sanderson's new The Stormlight Archive series) to get a signing number. There were a ton of people as usual. One of the "Tower Guards" that helped with the signing took some pictures and posted them on Dragonmount.com... and I'm in one of them. Guess which one is me.

Where's Jeff?

Harriet did a reading from Towers of Midnight, then they both answered a number of questions. One that stood out was why they didn't release the ebook version on the same day as the hardback (lots of grumbling about this online when the book came out). Harriet said it was because the bestseller lists don't count ebooks in the sales figures (obviously, since it's a hardback list). They basically wanted to ensure it was a bestseller (though I doubted they needed to do that, given that the books have consistently been #1 since Book 8).

When I got up to the table for signatures, I asked Sanderson if he was going to let The Stormlight Archive go on for 15 years or more like The Wheel of Time. It probably sounded a bit snide in retrospect, as I'm a bit disillusioned on extremely long (like 15+ years) series these days. Obviously, though, a 10 book series is going to take a while, and he said it would be at least 10 years—probably more due to finishing up The Wheel of Time. I will get around to reading it eventually, once a few more volumes come out. For now it's just sitting on my shelf; lots of other things to read first.


It was a pleasure to meet Harriet McDougal, and not knowing what else to say, I merely thanked her for continuing her husband's legacy and seeing that the series is finished. She signed the copyright page of my book, which marks the first time I've had an editor sign one of my books.

So thank you, Harriet, once again, for helping to finish this series. You don't know how much I appreciate it.



Next: 
Prequel – New Spring: The Novel


Previous:
Book 12 – The Gathering Storm
Book 11 – Knife of Dreams
Book 10 – Crossroads of Twilight
Book 9 – Winter's Heart
Book 8 – The Path of Daggers
Book 7 – A Crown of Swords
Book 6 – Lord of Chaos
Book 5 – The Fires of Heaven
Book 4 – The Shadow Rising
Book 3 – The Dragon Reborn
Book 2 – The Great Hunt
Book 1 – The Eye of the World

Tuesday, April 24, 2012

Table-Driven Dynamic Datasets in MS Access

I've used MS Access a lot over the years, and I generally think it's an underrated database application... you can do a lot with it, especially if you know your VBA and SQL.  VBA gives you an extra dimension of control that you can't always get with other database/reporting applications like Business Objects or MicroStrategy.  You can get pretty creative with those tools as well, and they are better at native report delivery, but it always seems to me that you can go one further with MS Access in terms of data processing and automation.

Now, Access is excellent for smaller datasets, though you can still use larger ones if you're creative enough.  With Access, just pull your data from a datamart and then do what you will with it locally.  I've created a number of tools like this for work, and in this blog I'd like to share how I create dynamic datasets in MS Access.

Dynamic Datasets

What do I mean by this, exactly?  At the core, these are crosstab/transform queries.  You take values that normally appear in rows and turn them into the columns themselves.  Same basic principle as a pivot table in MS Excel.

Like this:


The dynamic part is that the columns can change depending on the values in your data.  One month you might have one list of values, the next month you could have a few more or less.  The resulting crosstab has different columns as a result.  This kind of view is helpful for things like GL accounting, a P&L statement, or metric reporting.  You can save database space and speed up queries by storing the indexed field/value pairs in a simple table, then crosstabbing (is that a word?) them to get your reporting views.

Now, this is all fine and dandy if you just use the results of the crosstab query and maybe copy-paste-values it somewhere else.  But what if a crosstab is an intermediate step in a process?  What if you need to perform some calculations on the fields in the crosstab to create a new dataset?

Crosstab Tables

One easy way to work with the data is to make a table from the resulting crosstab.  Just create a new Make-Table query with the crosstab query as the source, then pull the * field down in the field list.  This creates a table from your crosstab.


If you need indexes or keys, use some data definition SQL to add them systematically:

ALTER TABLE tbl_Data_Xtab ADD PRIMARY KEY (DATA_KEY);

What if you need to add new columns to your table?  Columns can be added with data definition SQL.  Or you can put dummy/null values in your source table, to force a column to appear in a crosstab.  Like so:


But... what if you want to control which columns appear in your final dataset?  You'd have to manually add and remove fields from the make-table query that uses your crosstab.  This can be problematic when you're not always guaranteed to have the same fields and you plan on doing more processing with the crosstab table further along in the process - queries in Access will break if fields are missing.

Designing Datasets with Tables

This is where simple tables come in.  With a table and some VBA, you can create whatever dataset you want, and control the results by merely changing a few values in a table.  Many enterprise-scale applications and databases use techniques like this to easily manage systematic processes (like daily transaction loading, etc).  For reporting purposes you use it a little bit differently.

To do this, you'll need to have four things:

1. A table with your initial set of data, in crosstab form
2. A table that holds the design of your desired crosstab results
3. A "picklist" query/view of the field names and properties you want in the results
4. A VBA function to construct the SQL that creates the resultant table

After putting this together, to change your results you merely update the data in the design table.  You won't have to modify any queries or VBA.

Step 1: Initial Dataset
This can be done using the techniques described earlier.  Just create a make-table query, use a crosstab as the source and bring all fields * into the field list.  Run this to get your initial crosstab dataset.

Step 2: The Design Table
Create a table, and have one of the fields represent the fields/columns in your crosstab.  So, perhaps you have a list of metrics or months you want to use for the columns.  The table field could be DESIGN_FIELD and for each row the value is the name of resulting column.  As long as it's field in your source it will work.  Here's an example:


Now, you can add other fields to the table that represent properties that could apply to each column.  Want to control whether a field appears in the results, like an on/off switch?  Add a Yes/No (Boolean) field called SHOW_FIELD and check the ones you want to appear.  Want to force a field to be blank?  Add a Yes/No field called KEEP_BLANK for that.  Want to custom order the fields?  Add a Number field called FIELD_ORDER and order it any way you like.

NOTE: You can do that in a crosstab anyway, by concatenating an ORDER_FIELD with the field that will be used for the column.  But to dynamically build the table using VBA, you don't need to do that.  At the end of the day, the important thing is that whatever field properties you add to the table, need to be properly handled by your "picklist" query (Part 2 below) or VBA function.  So you have to build it in somewhere.

Step 3: The Picklist Query
The VBA function you write in the next step will construct the SQL statement that will create your final result table.  In order for the VBA function to know what fields to choose, you need to give it a list.  That's where the picklist comes in.

Create a query based off the design table.  Include any relevant fields and add filtering criteria based on properties.  It's better to filter in the picklist, than in VBA, but you can use either, depending on your needs.  So, if you have a property called SHOW_FIELD to control which appear in the final results, filter the picklist query to only show the fields where SHOW_FIELD is checked:


Make sure the field name is in the picklist.  Other property fields can be shown if you need to use them in the VBA code.

NOTE: For the VBA function in the next section, you cannot use a picklist query that has a wildcard (* or %) in the filter criteria (e.g. Like "Jeff*").  For some reason, VBA will not be able to open and step through such a recordset with ADO.  If you absolutely need to use a wildcard, create a table of the picklist, then use the table in its place in the code.

Step 4: The VBA Function
Now the fun part.  Here's the VBA function you can use to build your dynamic table.  Essentially all it does is loop through your picklist query one record at a time and build the SQL statement from that, selecting the data from the raw data table.  In order to run this VBA, you'll need to make sure a reference to ADO is enabled in the VBA window (Alt+F11, then Tools --> References).

You will need to substitute the names of your objects for PICKLIST_QUERY, SOURCE_TABLE and DESTINATION_TABLE in the code.  Remember, the SOURCE_TABLE is the crosstab you made earlier.

Public Sub Create_NewTable()

On Error GoTo Err_Create_NewTable  'Error Handling

    Dim rst As ADODB.Recordset  'Holds the picklist query
    Dim cmd As ADODB.Command    'For running the SQL statement
    Dim fRstOpened As Boolean   'Tracks if the recordset is open

    Dim strRunSQL As String     'SQL statement

    fRstOpened = False

    'Delete existing design table if it exists
    DoCmd.DeleteObject acTable, "DESTINATION_TABLE"

    Set rst = New ADODB.Recordset
    'Start the SQL statement
    strRunSQL = "SELECT DATA_KEY, ["

    'Open the list of fields to add
    With rst
        .Open "SELECT * FROM PICKLIST_QUERY;", _
            CurrentProject.Connection, adOpenKeyset, _
            adLockOptimistic

        'Set to true if the recordset opens
        fRstOpened = True

        If Not .EOF Then

            .MoveFirst

            'Loop through each field from the picklist

            Do Until .EOF
                strRunSQL = strRunSQL & _
                    .Fields("DESIGN_FIELD") & "], ["
                .MoveNext

            Loop

        End If
        .Close

        'Set to false now that it's closed
        fRstOpened = False

    End With
    Set rst = Nothing
   
    'Remove the final comma/bracket from the field list

    strRunSQL = VBA.Left(strRunSQL, VBA.Len(strRunSQL) - 3)

    'Finish the SQL statement
    strRunSQL = strRunSQL & " INTO DESTINATION_TABLE FROM SOURCE_TABLE;"

    'Run the SQL statement
    Set cmd = New ADODB.Command
    cmd.ActiveConnection = CurrentProject.Connection
    cmd.CommandType = adCmdText
    cmd.CommandText = strRunSQL
    cmd.Execute
    Set cmd = Nothing


Exit_Create_NewTable:

    'If recordset still open when exiting, close it
    If fRstOpened Then
        rst.Close
    End If


    'Kill all objects
    Set rst = Nothing
    Set cmd = Nothing

    Exit Sub

Err_Create_NewTable:

    'If result table doesn't exist to delete
    If Err.Number = 7874 Then Resume Next

    'OTHER ERROR HANDLING HERE

GoTo Exit_Create_NewTable

End Sub

So as a result, you get this:


This function can be reused for other datasets if you keep the same generic fieldnames in your design table.  It can further be expanded and tweaked to meet any specific field properties.  Let's say you want to force a field to be blank.  Make sure the KEEP_BLANK field is visible in the picklist query, then adjust the VBA so that when the KEEP_BLANK field is checked for a record, the property passed to the SQL statement is NULL instead of the actual field value.  Address it in the loop for the field list:

Do Until .EOF
    If .Fields("KEEP_BLANK") Then
        strRunSQL = strRunSQL & "NULL AS " & _
            .Fields("DESIGN_FIELD") & ", "
    Else
        strRunSQL = strRunSQL & .Fields("DESIGN_FIELD") & ", "
    End If
    .MoveNext

Loop


Now, this may not look all that impressive, but when you factor in 10-20 fields and things like calculations between fields, or trending between fields across multiple months, you can see how much easier it is to manage when you control the structure of your results with values in another table as opposed to manually changing queries.

NOTE: If you have trouble creating your desired SQL statement in VBA, create the query manually as a normal query in design view, then switch to SQL view.  Use that as the base in the VBA code.

Sunday, April 22, 2012

The Distant [Update 3] Expanding to a Trilogy

As I've been working on the third draft of my next book, The Distant, I've been thinking more about the setting I had created, and the fact that the ending would leave some things unresolved.  This was intentional on my part, since in reality most things don't have a fairytale ending or everything wrapped up nice and neat with a bow on top, and I wanted to leave it open-ended (yet satisfying) in case I wanted to do a sequel of sorts.  The more I thought of it, the more I realized I wanted to tell the rest of that story.  So I've decided I will expand this into a trilogy.

I've had ideas regarding this for many years now, but I could not figure out how to connect the dots between the different parts of the story that I want to tell.  During the last month I figured it out, and created outlines for the other two books in the trilogy.  Right now I'm calling the trilogy Of Houlves and Humans, though that might change.

Planning for a Series
What this means for The Distant - which will be Book 1, obviously, and keep the same title - is that I have to make sure the book makes sense within the rest of the work.  There are little things here and there, details that will make sense later, that I have to flesh out.  I'm doing some of that now in the third draft, going back over a few things and firming up the backstory and legends within the book, but I'll need to do more on the fourth draft.

Very little of the main story is changing from what I'd originally envisioned, all of the plot points are the same, I just need to do more edits to prepare for the later books.  One thing that bothers me about some series in movies or books, is when the author decides to continue things later and details aren't consistent, or a later book/movie contradicts an earlier one.

Avoiding Inconsistencies
A good example is with the original Star Wars.  Lucas had a series in mind from the start, but he could only make one movie, and if it bombed, he'd have no chance of telling the next story.  So he created a good resolution, but still made it open-ended.  He took it a step further with the prequels vs. the original trilogy, which have a totally different feel and style to them (like the way Jedi fight).

Now, he's managed to explain most of those discrepancies, inconsistencies and plot holes cleverly (e.g. Luke only had Yoda to train him, so there's no way he'd learn how to fight like the Jedi in the days of the Republic - though in reality it was due to the fact that they were shot 30 years apart and he couldn't have imagined, or wasn't able to stage, fight scenes like that back then).  There are tons like that in Star Wars (just Google it), as well as numerous dialogue and backstory inconsistencies.  But I want to avoid all that.

Sometimes it can't be helped, particularly in film.  You might not be able to do the next part of the story for a number of years.  But in fiction writing, you can keep the same feel and style twenty years later.  A book is still words on a page.  Your imagination might change, and your writing skills may have improved, but as long as you stick to the "style of the world" you're writing in and pay attention to how you write, it can read as if it's all from the same session of writing.  That's my goal.

Draft Update
So, currently I'm at page 250 of 348 in the third draft.  Should hopefully be finished by next month.  I had to rewrite some sections and wrote a new one, and currently the word count stands at 194K.  I want to keep it under 200K for sure, and perhaps try to trim it down to 180K before all is said and done.

We'll see... part of the reason I like self-publishing my work is that I don't have to modify the work to meet some criteria like publishing or contract requirements.  It will be as long as it needs to be to tell the story - but I'm still well aware that longer does not mean better, so my intent is to make it concise, without sacrificing the story or trying to shove a square peg into a round hole.