zachattack05 70 Posting Pro in Training

I should probably clarify, this is being written as a stored procedure in the SQL server.

zachattack05 70 Posting Pro in Training

So I have a table I am trying to create, but as I am working on this, I am worried that the idea is flawed.

Here's the SQL code to create the table so far:

    CREATE TABLE #ConversionLog
    (
        EventTime DATETIME NULL,
        EventType NVARCHAR(20) NULL,
        RecordID INT NULL,
        EventTarget NVARCHAR(255) NULL,
        OldValue NVARCHAR(MAX) NULL,
        NewValue NVARCHAR(MAX) NULL,
        EventMessage NVARCHAR(MAX) NULL
    )

The Columns are defined as:

  • EventTime: The time of the log entry.
  • EventType: The type of action that occured, such as insert, update, delete, error, message etc...
  • RecordID: The primary key of the record that the event occured on.
  • EventTarget: Contains the table name and column name the event is affecting in the format of TABLE.COLUMN.
  • OldValue: The value before an update or the old value of a system setting that has changed if the entry is of that type.
  • NewValue: The new value after the update or the new system setting value.
  • EventMessage: Shows a message regarding the event. Could be many things.

So the problem is, since this is supposed to be used for logging events and value changes, I'm not sure what data type to use for OldValue and NewValue since in one case it could be a bit type, in another an int, or even a string value.

Is this going to work or is there a flexable data type that will basically just record the changing data as a string (which is fine since all of the data can be …

zachattack05 70 Posting Pro in Training

Thanks for the replies!

It's been busy and I haven't had a chance to reply. I think I'm going to just add columns to the table and after many years the old data in the current columns will no longer be kept and I can drop those columns.

At least that's the plan for now. Hopefully it works!

zachattack05 70 Posting Pro in Training

Good morning strangers! I haven't posted in a while, but you always seem to be helpful...

I have an application that uses SQL as a back-end to store data so that multiple users can access it at once. The question I have is, the requirements have changed and the SQL schema needs to change, and I'm not sure what the best way to do this is.

I have a table that contains a "log" of sorts. Basically it allows us to keep track of tasks and indicate (via a boolean value) if the task was completed. So when the task is done, the user checks a checkbox. Now we need to have the user indicate the date that the task was completed, not just check a box.

Since we have nearly 75,000 records in this table already, and we need to maintain the old information, would it be best to:

  • Add new columns to the existing table, and just not use the boolean fields for new records?
  • Create a brand new table that mimics the old one and just use date fields instead of the boolean ones and keep the old table for reference?

I've never actually had to change something like this before, normally it was "we don't need this column anymore and it's safe to just drop it and all the data in it."

Any suggestions?

zachattack05 70 Posting Pro in Training

Out of curiosity, when you start a new solution and you add your first project to it, if it's a window's form application, you get a nice and neat form called "Form1" (how creative!). Do you rename that file? If so, what do you name it? If not, why?

2f9411f0a0998da1589835c36807a955

zachattack05 70 Posting Pro in Training

Good afternoon!

I am wondering if there is a way to log queries that have occured on a database or specific table? For example, is it possible to log the user, the query type (insert, update, delete, select, execute etc...), date, time, table, row and column(s) affected by the queries (if applicable) so that someone can in effect, "audit" our system?

This isn't a web database, it's a local sql server on our intranet.

Any suggestions or ideas would be greatly appreciated!

zachattack05 70 Posting Pro in Training

That's the thing...I don't want a style. I want the application to use the system's default, boring grey form with square controls etc...similar to if you set the windows 7 theme to windows classic.

Also, I am an avid hater of WPF. XML should not be used to control style or anything else. It's a bloated "language" that while should be human readable, is more difficult to read than old ini files. That's my opinion anyway.

zachattack05 70 Posting Pro in Training

So I was playing around with Visual Studio 2010 and when I removed the Application.EnableVisualStyles() method from the Main() method, I noticed that the controls on the design surface don't change, they maintain their visual style, but when the application is run, it doesn't have the styles.

Is there a way to disable visual styles on the design surface? I can't seem to figure it out. The closest I got was changing the OS theme.

Seems kinda silly to try to design an application without Visual Styles and be forced to do it with visual styles enabled on your design surface. Kinda like trying to draw a picture using just a sheet of carbon paper and not seeing what your drawing looks like for real, just a idea.

zachattack05 70 Posting Pro in Training

I have 2010 Professional and since I am paying out of pocket, $499 for the upgrade every 2 or so years is a bit steep for me.

Wow...when I look at it, $499 is nothing in 2 years...I SHOULD be upgrading...Maybe I'll skip 2012 and just wait for the next one and pull the trigger then.

zachattack05 70 Posting Pro in Training

That's the only way to do it as far as I know.

You can create just one handler method though and have all the controls subscribe to the same one so you don't have to make 84 handlers. That is assuming they all do the same thing and you can achieve what you are after with one method.

You can also cast the sender object to see which control it came from.

zachattack05 70 Posting Pro in Training

So it kinda sounds like you update each time a new version is released?

I wasn't sure if the changes to VS were that big that it warranted updating each time, unless of course, like tinstaafl pointed out, you are building secure apps and need to be running the newest of the new.

zachattack05 70 Posting Pro in Training

Thank you! That's exactly what I was looking for!

zachattack05 70 Posting Pro in Training

I am attempting to replicate the grid you see below taken from a popular accounting software program. I'm not after the title bar or any of the other controls, just a data grid view that behaves like the one shown, kinda like a check register. Does anyone know if this is possible with the DataGridView control or if a custom control needs to be built for this:

0f9e1ee61beee6d2c49c61e9e4091b2a

I have looked online for this, and maybe I'm searching for the wrong thing because everything talks about wraping text in a cell, I don't care about that, I'm after wraping cells in a row.

Forgive the black marks, they are there to protect the innocent and to hide irrelevant stuffs.

I appreciate any feedback.

zachattack05 70 Posting Pro in Training

There have been a total of 9 different versions of Visual Studio now going all the way back to 1995. My question is for those of you who use Visual Studio, how often have you upgraded your Visual Studio version? Going from 2005 to 2012 for example, not applying updates, but actually buying a different version?

zachattack05 70 Posting Pro in Training

Nevermind, I think I figured it out.

Instead of inheriting from UserControl (which provides the benefit of hiding some events and properties that I didn't want visible) I just inherited from ListBox instead and used an override on the SelectedIndex property, and called my code in the set accessor before calling base.SelectedIndex = value;

Here's a simple snippet of what I did:

namespace X.XxX.UX.Controls
{
    public partial class ServicesRenderedList : ListBox
    {
        public ServicesRenderedList()
        {
            InitializeComponent();
        }

        protected override void OnPaint(PaintEventArgs pe)
        {
            base.OnPaint(pe);
        }

        public override int SelectedIndex
        {
            get
            {
                return base.SelectedIndex;
            }
            set
            {
                // my code for SelectedIndexChanging goes here

                base.SelectedIndex = value;
            }
        }
    }
}

Just thought I would share in case someone was interested in doing the same.

zachattack05 70 Posting Pro in Training

Ketsuekiame,

Some controls do support events like I am describing, but since this is a custom control, I'm having difficulties on two levels, one, the listbox properties and events aren't accessable directly to the user of the control, two, the listbox doesn't have an event for SelectedIndexChanging.

I don't really care what the value of the index is going to be before it changes, I just need to know that it is about to change, but hasn't yet. This is something that can be done when you create custom events, it's not complicated.

I guess what I really need to know is, given a control, any control, and you derive from it, can you override events and replace them with your own?

zachattack05 70 Posting Pro in Training

I'm not really sure how to accomplish this task and would like some help with ideas or, if someone knows how to do this, some advice would be greatly appreciated!

I am working on a custom usercontrol. The usercontrol has a listbox (or rather it IS a listbox, just docked to fill the control surface), anyway, I need to catch/intercept when a user changes the selected index of the listbox in the control. The listbox is bindable (it has the DataSource, DisplayMember, SelectedValue and ValueMember properties exposed) and the binding works great! However, I want to give my control two custom events, one that executes when the selected index is about to change but before it has, and one after the selected index has changed.

I know how to implement custom events, that's not the problem, the problem is that since the listbox control does not have an event for selectedindexchanging and only one for selectedindexchanged, I can't seem to figure out the best way to "intercept" the index change before it actually occurs.

I don't know if that actually makes much sense, I hope it does.

Also, since the control I am creating has a base of UserControl and not ListBox the listbox events and properties are not exposed when the usercontrol is added to the design surface, and they are not editable in code. I would need to implement them on my own to make them public, which is exactly what I want, but I need some of …

zachattack05 70 Posting Pro in Training

Nevermind!

Adding RefreshProperties(RefreshProperties.Repaint), AttributeProvider(typeof(IListSource))] seems to have done the trick!

I love metadata!

zachattack05 70 Posting Pro in Training

Hi everyone!

I am working on a custom control, and for the life of me I can't figure this one out.

As of right now, all properties for controls that are settable in the editor I use this code:

        [Browsable(true),
        Description(""),
        Category(""),
        DefaultValue()]

I fill in the blanks appropriately, but the control I am working on now will be bindable, and I need a DataSource property which is fine, but I can't get the editor to allow me to set the property since the property uses an object. Is there a way to achieve this:
b59b72f3fab6b3edd674baae0077551b

Right now I get nothing. The property is grey and can't be set except in code. Am I missing an attribute or is there something else I can do?

zachattack05 70 Posting Pro in Training

Ancient Dragon, the @ translates to literal so that you don't have to escape all escape characters. In other words:

"this is a line\r\l this is a new line" will print:

this is a line
this is a new line

while @"this is a line\r\l this is a new line" will print:

this is a line\r\l this is a new line

zachattack05 70 Posting Pro in Training

I plan on running everything through an attorney. I already have one lined up to help with that when I get to that point.

I think I'm going to have to research this a bit more on keeping people out of the database except through the application's interface. I know there has to be a way to do this.

zachattack05 70 Posting Pro in Training

I would like to see a forum dedicated to UX/UI design.

I know that a good application or website performs its job exceptionally well and the look and feel of the application doesn't affect, or shouldn't affect it's performance. But come on! It does.

UX/UI design is more than just the color to use for a background and putting pretty pictures on the splash screen, it's also setting tab order, laying out controls in an easy to read and scannable fashion. It also encompasses when to use a new form compared to changing panel contents or when to open a new browser window or instead refresh an iframe. UX/UI design is a science...no really it is! Companies spend boatloads of cash on studies following eye movement of computer users, surveys, and publishing internal and public guidelines.

Having a high performance application with awesome speed and no bugs (I'm talking in a perfect world here) but having a poorly designed UI is like putting the body of a Cessna 175 on a MD F-15 Eagle Fighter Jet Engine. It doesn't work.

I would suggest that the design forums be separated by Desktop Applications and Web Applications because mashing them together into one forum is just going to cause confusion and they really are two different beasts.

DaniWeb is a great community, and is a place I love going to chat, get ideas and share ideas. But some of us, me included, are pretty good with the development part of applications. Writing …

zachattack05 70 Posting Pro in Training

Ketsuekiame,

I kind of agree and I understand that some trust has to be given to employees. That's really not what I am worried about.

The sabatoge that Joe Employee does by using the application and messing things up that way is the least of my worries.

I'm worried about an employee with some knowledge of SQL that wants to "tinker" or sabatoge the system that way, rather than through the application interface.

I was hoping there was a way for SQL to identify the application connecting to it and either allow or disallow that application.

For example, since the application that I am writing deals with medical information, I want to make sure that no one can just "dump" entire tables into a file and walk out the door with SSNs and names and addresses etc... Obviously I can't stop someone from sitting in front of my application and writing them down, or printing records one at a time. Data theft is like software piracy, the only way to completely stop it is to not let anyone see it or use it and you just can't do that, but you can make it difficult for them to do it.

I doubt most of the people using the application will have rogue employees, and I doubt of the ones they do have even less would know SQL or have the knowledge to execute it, but you never know.

I was hoping for a way to allow access to a database …

zachattack05 70 Posting Pro in Training

This is true.

My logic is that if they are in the same namespace, they need to be in the same folder (or subfolder) otherwise I get confused when looking for the components of a namespace. If I need to know what falls in a given namespace, I just open the explorer and find the folder and bam! That's all that's in the namespace and nothing else.

My mind just works better that way. To each his own!

zachattack05 70 Posting Pro in Training

Ketsuekiame,

I know that it doesn't open it up to everyone, but the problem is that if Joe Employee has delete permissions because it is part of his job, and he becomes angry or whatever, and decides to delete or change data to cause problems that's what I am trying to prevent.

Momerath,

Do you know of a good resource where I can read about that concept or if you have a moment, could you elaborate on how something like that would work?

WDrago,

I think you are talking about the same thing Momerath is? Do you have any resources where I can read about that concept as well?

Thanks so much for your help!

zachattack05 70 Posting Pro in Training

In fact, in VS, if you create a folder in the project explorer, and then create a new file in that new folder, it will automatically set the namespace for you to include that folder name. It's quite handy!

zachattack05 70 Posting Pro in Training

So I've been thinking about SQL security lately and wanted to see what others are doing.

I have been using integrated security (window's authentication), stored procecedures when necessary and have done my best to limit access to tables and those stored procedures with SQL server in conjunction with my application. But I'm starting to wonder if that is enough.

Imagine for a moment that you are developing an application that requires strict security, say for a bank or something and SQL was going to be used as the backend to keep track of transactions and account balances etc... Now, you can use stored procedures and all that I have above, but what is there to stop some rogue employee from installing SQL Server Management Studio or literally any sql tool to talk directly to the sql server. Even if you limit access with your application or even on the server level, a delete permission is a delete permission and it doesn't matter if your application issues it or if another one does.

Is there a way to prevent this other than on the workstation level (preventing install permissions for users etc...) Can you actually setup SQL to only talk to your application and that's it to prevent others from accessing the data?

I'm just curious how larger corporations would do something like this. I mean, imagine Epic, the health information software, or the software that banks use, or the software that any large corporation would use to track accounts and …

zachattack05 70 Posting Pro in Training

Hmmm...I suppose that works as well. Be careful though. If the try block fails and it is caught, chances are your dtETLClient object will be empty.

I would keep the return for the dtETLClient object in the finally block and put a return Null; after the finally block and just have the caller check for a null value. Or you could throw your own exception after the finally block. If everything goes correctly the method will return in the finally block and never reach the return or the exception after the finally block.

Just my 2¢ worth.

zachattack05 70 Posting Pro in Training

Yes, different name spaces in one project are allowed. :)

I think of namespaces as a folder tree with each "." defining a new folder. I use them a lot for organizing my code.

zachattack05 70 Posting Pro in Training

I think one in the finally block will work.

But yes, a try statement is a branch in the code, things can go fine and the try and finally block execute, but if it goes bad, the catch block might fix/handle the exception and the finally block will still execute. If the exception is unhandled and there is no catch for the exception thrown, the method immediately exits and it doesn't matter if there is a return statement because it will never reach it.

Try putting your return statement in the finally block and see if that fixes it.

zachattack05 70 Posting Pro in Training

Yes,

What I have done in the past is create a base form that all others will inherit from. Make that form have no border and add my own basic window design. Make sure you add close buttons, minimize and maximize buttons. If you feel creative, add properties to show and hide those buttons during design time so you can set similar features as a basic winform window (to show/hide specific buttons).

You can even add colour properties so you can set different windows to different colours or allow your users to change the theme of their windows in a setting.

It can be fun to do, but remember, it's all in what the program does and not how it looks that matters! A shiny penny is still worth less than a tarnished and beat up quarter.

zachattack05 70 Posting Pro in Training

Hiya!

Your catch and/or finally blocks don't return a value. If the try statement throws an exception, and the catch block handles it, it should return a Datatable (or rethrow the exception), in either the catch or finally block.

I use the using statement when I have something that doesn't dispose of on its own. I would probably do the same thing you did otherwise I would explicity dispose of the object when I was finished with it. You can read about the using statement here.

Hope this helps!

zachattack05 70 Posting Pro in Training

Thanks for the input guys!
I think what I might do though is just pull the data out of the database with a dataset query. The information that goes into the 3rd box is stored in a SQL server (along with the drop down items) so I think I'll just use SQL and let the framework do the dirty work. Or at least try that first.

Thanks a ton! I really appreciate it!

zachattack05 70 Posting Pro in Training

I have a DataGridView that contains 3 columns, the first is a drop down and the second and third are textboxes. However, the third one is read-only and is only there to provide information to the user on the item selected from the dropdown column.

If the user changes the drop-down, I need to update the text in the third column appropriately, but my problem is finding the appropriate event to handle this. I need the update to occur immediately, not after the row is validated, or after the row is committed. The information that the user enters in the second box is somewhat dependant on what the third box says.

Any suggestions?

zachattack05 70 Posting Pro in Training

What is Nhibernate?

zachattack05 70 Posting Pro in Training

Well what I intended to do was during the setup of the application, ask "do you want to provide account numbers, or auto-generate them?" and if they want to auto-generate them the database would be built setting the identity property to true, and if they want to make up their own, set it to false and let them type their own account number.

I would only have one column, just depends if the identity property is set to true or false when the database is built.

zachattack05 70 Posting Pro in Training

I am considering an option for users that will allow them to write their own account numbers or create their own algorythm for creating custom account numbers for customers, but also want an option that will auto-generate them if the user doesn't care by using the identity property in SQL.

I've always heard that if the PK is supposed to mean anything to users (which an account number would), that using the identity feature is a bad idea, but was never really certain on the reason(s) why?

Any suggestions or thoughts on this?

zachattack05 70 Posting Pro in Training

Kind of. What I am after is a form that tests a pre-defined SQL connection string, if the connection passes then a setting is set to true and the form will not be opened in the future so long as the connection still works. If, in the future, the connection fails, the setting is reset to false. If the false setting is found, the RunOnce dialog appears asking the user to verify the connection information and to re-test the connection.

I kind of need one application to open, adjust the connection string in the settings and then start the main application with those new settings.

Since the connection string is stored in the application settings file and has an application scope, not user scope, I can't edit the string without restarting the application. I was hoping this would fix that problem, but it actually doesn't seem to and I found a way to adjust the setting and restart the application in a different manner.

Thank you for the code example!

zachattack05 70 Posting Pro in Training

In order to show a first run dialog (a window that appears before the main application starts if certain conditions are met) I have decided to modify the Main method and do this:

        static void Main()
        {
            Application.EnableVisualStyles();
            Application.SetCompatibleTextRenderingDefault(false);

            if (Properties.Settings.Default.FirstRun)
            {
                Application.Run(new RunOnce());
            }

            Application.Run(new Main());
        }

Is this a bad idea? It works, and with a bit of additional logic I can prevent the main application from even opening should the user cancel out of the first run dialog.

Thoughts?

zachattack05 70 Posting Pro in Training

I suppose so. It still irks me to see xml in a SQL table...in my head, it just doesn't belong! But since I don't use xml, I guess it's harder for me to see through that.

Thanks for trying to explain that...while it still makes no sense to me, I guess I'm willing to accept that it does to someone else. :)

zachattack05 70 Posting Pro in Training

Interesting.

But I'm still not convinced, maybe it's because I am on the side of "XML is the child of evil programmers and data engineers bent on world domination and must be destroyed."

I just find it rather amusing that anyone would have non-relational (XML) data in a relational (SQL) database...obviously in this example the data in the XML field IS related to the specific row, and not only that, since some XML tags appear more than once, is a perfect candidate for relational data and 1-n tables...am I wrong in thinking that?

zachattack05 70 Posting Pro in Training

So I downloaded the Adventureworks 2012 SQL database to browse hoping to find something interesting and just nearly fell asleep looking at example data when I came across something new or that I at least never noticed before...a field with a data type of "xml(CONTENT Person.AdditionalContactInfoSchemaCollection)" and when viewing the example data I see things like:

<AdditionalContactInfo xmlns="http://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ContactInfo" xmlns:crm="http://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ContactRecord" xmlns:act="http://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ContactTypes">
  <act:telephoneNumber>
    <act:number>425-555-1112</act:number>
    <act:SpecialInstructions>Call only after 5:00 p.m.</act:SpecialInstructions>
  </act:telephoneNumber>Note that the customer has a secondary home address.<act:homePostalAddress><act:Street>123 Oak</act:Street><act:City>Seattle</act:City><act:StateProvince>WA</act:StateProvince><act:PostalCode>98001</act:PostalCode><act:CountryRegion>USA</act:CountryRegion><act:SpecialInstructions>If correspondence to the primary address fails, try this one.</act:SpecialInstructions></act:homePostalAddress>Customer provided additional email address.<act:eMail><act:eMailAddress>customer1@sample.com</act:eMailAddress><act:SpecialInstructions>For urgent issues, do not send e-mail. Instead use this emergency contact phone<act:telephoneNumber><act:number>425-555-1111</act:number></act:telephoneNumber>.</act:SpecialInstructions></act:eMail><crm:ContactRecord date="2001-06-02Z">This customer is interested in purchasing high-end bicycles for his family. The customer contacted Michael in sales.</crm:ContactRecord></AdditionalContactInfo>

And it got me thinking...is Microsoft advocating using xml tags in database fields instead of setting up 1-n relationships?

The example above could be split into a 1-n relationship on all of the xml tags, phone numbers, special instructions, address information, and other non-specific comments.

I hear the nay-sayers and xml lovers and abusers now saying that splitting such information up among many different tables creates a tangled web of relationships and dependancies which can be a nightmare to follow; and I will concede to that to a point, but coming from a database with probably over 50 relationships already, why opt for a custom data type that:

  1. bloats the field size to accomodate xml markup,
  2. requires additional parsing by the …
zachattack05 70 Posting Pro in Training

Thanks!

zachattack05 70 Posting Pro in Training

The question I have involves 3 basic objects, (1)a class that contains methods to serialize and deserialize another class that is then saved to a file on a disk, (2)a class that contains methods and values that is marked serializable and is the class that is serialized to disk and (3)an interface that the serialized class utilizes.

So, here's the question. If the class that is marked serializable contains the following method which is defined in the interface it inherits from:

public int MyMethod()
{
    Return 1;
}

is serialized to a file successfully, and then later on, an update to the software is made. In the update, the interface remains the same, as does the class that contains methods to serialize and deserialize the file, but the class that can be serialized earlier is now different, and is now:

public int MyMethod()
{
    Return 0;
}

when the method that deserializes the old serialized file that returns 1, is run and the class object is returned and I call MyMethod() will it return 1 still?

I guess the question could also be asked, when a class is serialized, are the methods, properties and entire structure of the class preserved as well?

I would really appreciate any help anyone might have to offer!

Happy turkey day to everyone by the way!

zachattack05 70 Posting Pro in Training

That's kinda what I thought. Just wanted to make sure, I was doubting myself :)

zachattack05 70 Posting Pro in Training

Yes, programmaticly.

I don't know of any shape controls that show on the design surface other than the vb ones, but the methods to draw shapes in C# are in the system.drawing.graphics class. You could make your own control? Or use a panel if you want a rectangle, but that would change how you access the controls in the panel.

I have a rectangle control that I've used in the past that will let you drag and drop from the toolbox to the design surface, but I'd have to find it again. If you are interested in that I can post the code (or link to the dll).

zachattack05 70 Posting Pro in Training

Try removing the shapes and drawing the shapes using System.Drawing and see if that fixes the problem. I've never used the vbPowerPack stuff so I'm not sure if that could be the cause, but wasn't the vbPowerPack stuff supposed to be used with VB only? I didn't even know it worked in C#...I just assumed it was for vb considering the name.

Anyway, I would remove the vb shapes (and the project reference, at least temporarily) and try drawing the rectangles yourself and see if that fixes it.

zachattack05 70 Posting Pro in Training

Silly question I am sure, and I'm almost positive I know the answer to this, but, if I have a static method that has a return type that is a non-static class type, when the static method is executing and after the method has initialized the class to return (but has not returned it yet), without locking the method it IS thread safe since it is not using a shared object and if the static method is called in succession by many threads, each will return their own correct "version" of the class object, correct?

For example (this is really quick so just follow the general idea):

public class myClass
{
    int i;
    string s;

    public myClass ()
    {

    }
}

public class myOtherClass
{
    public myOtherClass()
    {

    }

    public static myClass myMethod(int i, string s)
    {
        myClass mc = new myClass();

        mc.i = i;
        mc.s = s;

        return mc;
    }
}

If multiple threads call myMethod() at the same time, is that thread safe? I would say yes. Anyone disagree?

zachattack05 70 Posting Pro in Training

I think I may have solved the problem myself by changing the first column's width to 100% and the other 2 to autosize. That seemed to fix the problem!

zachattack05 70 Posting Pro in Training

Correction: The columns are aligned in a 25%, 25%, 50% fashion to the left, not right.