Exemplo n.º 1
0
        string script; // will hold the script to return

        #endregion Fields

        #region Methods

        public bool Delete(int UIFSformid, long formid, ref UIFS.SQL SQL, bool test)
        {
            try
            {
                string query_delete = "";
                // if bool test is set, we want to encap in a tran and roll it back.
                if (test)
                {
                    query_delete = "BEGIN TRAN UIFSTest \n";
                }
                //. build our query
                query_delete += "DELETE FROM [UIFS.Form_" + UIFSformid.ToString() + "] WHERE [id]=" + formid.ToString();
                // if test, rollback
                if (test)
                {
                    query_delete += "\n ROLLBACK TRAN UIFSTest";
                }
                SQL.Query = query_delete;
                SQL.cmd = SQL.Command(SQL.Data);
                SQL.cmd.ExecuteNonQuery();
                return true;
            }
            catch (Exception ex)
            {
                SQL.WriteLog_Error(ex, "Failed to delete form: " + SQL.Query, "UIFS.FormInput.Delete");
                return false;
            }
        }
Exemplo n.º 2
0
        // ---------------------------------------------------------------------------------------------------------------
        /* -- FormOutput.LoadData --
        // ---------------------------------------------------------------------------------------------------------------
         |  returns saved data on a specific form/version
         |  NOTE: expects data retrieved to match loaded form version controls via UIFS.Form.Load()
         |  -- this means that the user application should "know" and have loaded the right version of the Form..
        */
        public Form_Input.InputValue[] LoadData(FormDataStruct FormData, ref UIFS.SQL SQL, long formid)
        {
            Form_Input.InputValue[] FormValues = new Form_Input.InputValue[FormData.ControlList.Length];
            UIFS.FormControl Control;
            string query_from = "FROM [UIFS.Form_" + FormData.id + "]";
            string query_select = "SELECT ";
            string query_where = "WHERE [id]="+formid.ToString();
            string ctrl_dbver = "";
            int ctrl_currentversion;
            try
            {
                //. build a select statement from controls loaded
                // ?: do we need to parse values?

                // 1) For each control for the form: build insert statement with correct column names: id_ver
                // 2) and find the value(s) for the control from the form data and add to VALUES part of query
                for (int t = 0; t < FormData.ControlList.Length; t++)
                {
                    Control = FormData.Get_Control(FormData.ControlList[t].id);
                    //. determine if this control is the latest version or older..
                    SQL.Query = string.Format(SQL.SQLQuery.Form_ControlcurrentVersion, FormData.id, Control.id);
                    SQL.cmd = SQL.Command(SQL.Data);
                    ctrl_currentversion = Convert.ToInt32(SQL.cmd.ExecuteScalar());
                    if (Control.version != ctrl_currentversion)
                    { // NOT CURRENT version, specific column name required
                        ctrl_dbver = "_"+Control.version.ToString();
                    }
                    else { ctrl_dbver = ""; }
                    switch (FormData.ControlList[t].type)
                    {
                        // All of the following return a single string values
                        case ControlType.Textbox:
                        case ControlType.DateTime:
                        case ControlType.List:
                            query_select = query_select + "[" + Control.id + ctrl_dbver + "],";
                            break;
                        // The following return a single numeric values
                        case ControlType.Percentage:
                        case ControlType.Number:
                            query_select = query_select + "[" + Control.id + ctrl_dbver + "],";
                            break;
                        // Checkbox controls are always true/false with an optional input field
                        case ControlType.Checkbox:
                            UIFS.FormControl.Checkbox CB = (UIFS.FormControl.Checkbox)Control;
                            if (CB.hasinput)
                            {
                                query_select = query_select + "[" + Control.id + ctrl_dbver + "], [" + Control.id + ctrl_dbver + "_text],"; ;
                            }
                            else
                            {
                                query_select = query_select + "[" + Control.id + ctrl_dbver + "],";
                            }
                            break;
                        // Ranges have start/end values
                        case ControlType.Range:
                            query_select = query_select + "[" + Control.id + ctrl_dbver + "_Start], [" + Control.id + ctrl_dbver + "_End],";
                            break;
                    }
                }

                // dbread
                SQL.Query = query_select.Substring(0, query_select.Length - 1) + " " + query_from+" " +query_where;
                SQL.cmd = SQL.Command(SQL.Data);
                SQL.sdr = SQL.cmd.ExecuteReader();
                SQL.sdr.Read();
                if (SQL.sdr.HasRows)
                {
                    int fieldcount = 0;
                    // Get data in the SAME ORDER as query
                    for (int t = 0; t < FormData.ControlList.Length; t++)
                    {
                        Control = FormData.Get_Control(FormData.ControlList[t].id);
                        FormValues[t] = new Form_Input.InputValue();
                        FormValues[t].Controlid = Control.id;
                        switch (FormData.ControlList[t].type)
                        {
                            case ControlType.DateTime:
                                UIFS.FormControl.DateTime DT = (FormControl.DateTime)Control;
                                switch (DT.type)
                                {
                                    case FormControl.DateTime.datetimetype.date:
                                        FormValues[t].value = SQL.sdr.GetDateTime(fieldcount).ToString("MM/dd/yyyy");
                                        break;
                                    case FormControl.DateTime.datetimetype.datetime:
                                        FormValues[t].value = SQL.sdr.GetDateTime(fieldcount).ToString("MM/dd/yyyy hh:mmtt");
                                        break;
                                    case FormControl.DateTime.datetimetype.time:
                                        FormValues[t].value = SQL.sdr.GetDateTime(fieldcount).ToString("hh:mmtt");
                                        break;
                                }
                                break;
                            // All of the following return a single string values
                            case ControlType.Textbox:
                            case ControlType.List:
                                //. FILTER text...
                                FormValues[t].value = LoadData_parsetextinput(SQL.sdr.GetString(fieldcount));
                                break;
                            // The following return numeric values
                            case ControlType.Percentage:
                                FormValues[t].value = SQL.sdr.GetByte(fieldcount).ToString();
                                break;
                            case ControlType.Number:
                                FormValues[t].value = SQL.sdr.GetDecimal(fieldcount).ToString();
                                break;
                            // Checkbox controls are always true/false with an optional input field
                            case ControlType.Checkbox:
                                UIFS.FormControl.Checkbox CB = (UIFS.FormControl.Checkbox)Control;
                                if (CB.hasinput)
                                {
                                    FormValues[t].value = SQL.sdr.GetBoolean(fieldcount).ToString();
                                    fieldcount += 1; // advance to next value
                                    FormValues[t].input = LoadData_parsetextinput(SQL.sdr.GetString(fieldcount));
                                }
                                else
                                {
                                    FormValues[t].value = SQL.sdr.GetBoolean(fieldcount).ToString();
                                }
                                break;
                            // Ranges have start/end values
                            case ControlType.Range:
                                UIFS.FormControl.Range Range = (UIFS.FormControl.Range)Control;
                                switch (Range.type)
                                {
                                    case FormControl.Range.Rangetype.Currency:
                                    case FormControl.Range.Rangetype.MinMax:
                                        FormValues[t].Start = SQL.sdr.GetDecimal(fieldcount).ToString();
                                        fieldcount += 1; // advance to next value
                                        FormValues[t].End = SQL.sdr.GetDecimal(fieldcount).ToString();
                                        break;
                                    case FormControl.Range.Rangetype.DateRange:
                                        FormValues[t].Start = SQL.sdr.GetDateTime(fieldcount).ToString("MM/dd/yyyy");
                                        fieldcount += 1; // advance to next value
                                        FormValues[t].End = SQL.sdr.GetDateTime(fieldcount).ToString("MM/dd/yyyy");
                                        break;
                                    case FormControl.Range.Rangetype.DateTimeRange:
                                        FormValues[t].Start = SQL.sdr.GetDateTime(fieldcount).ToString("MM/dd/yyyy hh:mmtt");
                                        fieldcount += 1; // advance to next value
                                        FormValues[t].End = SQL.sdr.GetDateTime(fieldcount).ToString("MM/dd/yyyy hh:mmtt");
                                        break;
                                    case FormControl.Range.Rangetype.TimeRange:
                                        // our Any+Time plugin requires the date in a SPECIFIC format
                                        FormValues[t].Start = SQL.sdr.GetDateTime(fieldcount).ToString("hh:mmtt");
                                        fieldcount += 1; // advance to next value
                                        FormValues[t].End = SQL.sdr.GetDateTime(fieldcount).ToString("hh:mmtt");
                                        break;
                                }
                                break;
                        }
                        fieldcount += 1; // advance to next value
                    }
                }
                SQL.sdr.Close();
                return FormValues;
            }
            catch (Exception ex)
            {
                SQL.WriteLog_Error(ex, "Error retrieving saved form data: " + SQL.Query, "UIFS.FormOutput.LoadData");
                return null;
            }
        }
Exemplo n.º 3
0
        // Returns the HTML formatted output for a Control, "div contained"
        public void HTML_FormControl(UIFS.ControlType type, UIFS.FormControl Control, ref string HTML, ref string Javascript)
        {
            // Format strings for proper display/output
            Control.prompt = HTML_Escape(Control.prompt);
            Control.tip = HTML_Escape(Control.tip);
            // Control div
            HTML = HTML + "<div id='Control_" + Control.id + "_div' class='ControlType_" + type.ToString() + "' >";
            switch (type)
                {
                    case UIFS.ControlType.Textbox:
                        FormControl.Textbox ControlTextbox = (FormControl.Textbox)Control;
                        HTML = HTML + "<table><tr title='"+ControlTextbox.tip+"' class='Control_tip'>"+
                            "<td class='Control_prompt'>" + ControlTextbox.prompt + "</td>" +
                            "<td class='Control_input'>";
                        if (ControlTextbox.lines == 1)
                        {
                            HTML = HTML + "<input type='text' id='Control_" + ControlTextbox.id + "' size='" + ControlTextbox.width + "' /></td>";
                        }
                        else {
                            HTML = HTML + "<textarea id='Control_" + ControlTextbox.id + "' rows='" + ControlTextbox.lines + "' cols='" + ControlTextbox.width + "'></textarea></td>";
                        }
                        HTML = HTML + "</tr></table>";
                        // onblur watching...
                        Javascript = Javascript + "document.getElementById('Control_" + Control.id + "').onblur = function(){ FormControlsTouched.push('" + Control.id + "'); };";
                        break;

                    case UIFS.ControlType.List:
                        FormControl.List ControlList = (FormControl.List)Control;
                        HTML = HTML + "<table><tr title='" + ControlList.tip + "' class='Control_tip'>" +
                            "<td class='Control_prompt'>" + ControlList.prompt + "</td>";
                        if (ControlList.type == FormControl.List.listtype.slider) { HTML = HTML + "<td class='Control_input slider'>"; }
                        else { HTML = HTML + "<td class='Control_input'>"; }
                        switch (ControlList.type)
                        {
                            case FormControl.List.listtype.radio:
                                for (int t = 0; t < ControlList.Items.Length; t++)
                                {HTML = HTML + "<input type='radio' id='Control_" + ControlList.id + "' name='Control_" + ControlList.id +
                                    "' value='" + ControlList.Items[t].value + "'>" + ControlList.Items[t].name + "<br/>";}
                                break;
                            case FormControl.List.listtype.dropdown:
                            case FormControl.List.listtype.slider:
                                HTML = HTML + "<select id='Control_" + ControlList.id + "' /><option value=''>-=Choose=-</option>";
                                for (int t = 0; t < ControlList.Items.Length; t++)
                                { HTML = HTML + "<option value='" + ControlList.Items[t].value + "'>" + ControlList.Items[t].name + "</option>"; }
                                HTML = HTML + "</select>";
                                break;
                        }
                        HTML = HTML + "</td></tr></table>";

                        // --[ Javascript ]--
                        // Since the dropdown and the slider use the same html...separated this out
                        if (ControlList.type == FormControl.List.listtype.slider)
                        {
                            Javascript = Javascript + "$('#Control_" + ControlList.id + "').selectToUISlider();";
                        }
                        // onblur watching...
                        Javascript = Javascript + "document.getElementById('Control_" + Control.id + "').onblur = function(){ FormControlsTouched.push('" + Control.id + "'); };";

                        break;

                    case UIFS.ControlType.Checkbox:
                        FormControl.Checkbox ControlCheckbox = (FormControl.Checkbox)Control;
                        HTML = HTML + "<table><tr title='" + ControlCheckbox.tip + "' class='Control_tip'>" +
                            "<td class='Control_prompt'>" + ControlCheckbox.prompt + "</td>" +
                            "<td class='Control_input'>";
                        string initialState_checkbox="",initialState_select="",initialState_input="";
                        if (ControlCheckbox.initialstate)
                        { // setup initial state if chosen
                            initialState_checkbox = " checked='1' ";
                            initialState_select = " selected='1' ";
                            initialState_input = "display: inline;";
                        }
                        else {
                            initialState_input = "display: none;";
                        }
                        switch (ControlCheckbox.type)
                        {
                            case FormControl.Checkbox.checkboxtype.standard:
                                HTML = HTML + "<input type='checkbox' id='Control_" + ControlCheckbox.id + "' "+initialState_checkbox+" onchange=\"Checkbox_Change('"+ControlCheckbox.id+"', 1) \" />";
                                break;
                            case FormControl.Checkbox.checkboxtype.YesNo:
                                HTML = HTML + "<select id='Control_" + ControlCheckbox.id + "' onchange=\"Checkbox_Change('" + ControlCheckbox.id + "', 2)\"  /><option value='0'>No</option><option value='1' " + initialState_select + ">Yes</option></select>";
                                break;
                            case FormControl.Checkbox.checkboxtype.OnOff:
                                HTML = HTML + "<select id='Control_" + ControlCheckbox.id + "' onchange=\"Checkbox_Change('" + ControlCheckbox.id + "', 2)\"  /><option value='0'>Off</option><option value='1' " + initialState_select + ">On</option></select>";
                                break;
                        }
                        if (ControlCheckbox.hasinput)
                        {
                            HTML = HTML + "<input type='text' id='Control_" + ControlCheckbox.id + "_input' size='30' style='" + initialState_input + "' />";
                        }
                        HTML = HTML + "</td></tr></table>";
                        // onblur watching...
                        Javascript = Javascript + "document.getElementById('Control_" + Control.id + "').onblur = function(){ FormControlsTouched.push('" + Control.id + "'); };";
                        break;

                    case UIFS.ControlType.DateTime:
                        FormControl.DateTime ControlDateTime = (FormControl.DateTime)Control;
                        string AnyTime_format = "", AnyTime_value="";
                        switch (ControlDateTime.type)
                        {
                            case FormControl.DateTime.datetimetype.datetime: // {format:'%m/%d/%Y %h:%i%p'}
                                AnyTime_format = "%m/%d/%Y %h:%i%p"; AnyTime_value= "1/1/1900 12:00AM";
                                break;
                            case FormControl.DateTime.datetimetype.date: // {format:'%m/%d/%Y'}
                                AnyTime_format = "%m/%d/%Y";AnyTime_value= "1/1/1900";
                                break;
                            case FormControl.DateTime.datetimetype.time: // {format:'%h:%i%p'}
                                AnyTime_format = "%h:%i%p";AnyTime_value= "12:00AM";
                                break;
                        }

                        HTML = HTML + "<table><tr title='" + ControlDateTime.tip + "' class='Control_tip'>" +
                            "<td class='Control_prompt'>" + ControlDateTime.prompt + "</td>" +
                            "<td class='Control_input'><input type='text' id='Control_" + ControlDateTime.id + "' size='23' class='Control_DateTime' value='"+AnyTime_value+"' onfocus=\"AnyTime.noPicker('Control_" + ControlDateTime.id + "'); $('#Control_" + ControlDateTime.id + "').AnyTime_picker({format:'" + AnyTime_format + "'}); this.onfocus=null; \" /></td>" +
                            "</tr></table>";
                        //Javascript = Javascript + "AnyTime.noPicker('Control_" + ControlDateTime.id + "');";
                        // Based on the type:
                        // Step #1: run the 'noPicker' function to remove any associated controls before creating a new AnyTime control
                        // Step #2: bind a function to create the picker to the *focus* event of the control  (this is b/c of display issues with anytime run on hidden elements)

                        // onblur watching...
                        Javascript = Javascript + "document.getElementById('Control_" + Control.id + "').onblur = function(){ FormControlsTouched.push('" + Control.id + "'); };";

                        break;

                    case UIFS.ControlType.Number:
                        FormControl.Number ControlNumber = (FormControl.Number)Control;
                        // Standard text input field
                        HTML = HTML + "<table><tr title='" + ControlNumber.tip + "' class='Control_tip'>" +
                                "<td class='Control_prompt'>" + ControlNumber.prompt + "</td>" +
                                "<td class='Control_input'><input type='text' id='Control_" + ControlNumber.id + "' size='7' onchange=\"Number_Validate(this, '" + ControlNumber.min + "','" + ControlNumber.max + "','" + ControlNumber.interval + "') \" />";
                        if (ControlNumber.slider)
                        { // Slider type control
                            HTML = HTML + "<span id='Control_" + ControlNumber.id + "_slider' class='Control_Number_Slider'></span>";
                            Javascript = Javascript + "$(function(){  $('#Control_" + ControlNumber.id + "_slider').slider({min:" + ControlNumber.min + ", max:" + ControlNumber.max + ", step:" + ControlNumber.interval +
                                ", slide:function(event,ui){$('#Control_" + ControlNumber.id + "').val(ui.value);}  });   }); ";
                        }
                        HTML = HTML + "</td></tr></table>";
                        // onblur watching...
                        Javascript = Javascript + "document.getElementById('Control_" + Control.id + "').onblur = function(){ FormControlsTouched.push('" + Control.id + "'); };";

                        break;

                    case ControlType.Percentage:
                        FormControl.Percentage ControlPercentage = (FormControl.Percentage)Control;
                        // Dropdown with values per interval
                        HTML = HTML + "<table><tr title='" + ControlPercentage.tip + "' class='Control_tip'>" +
                            "<td class='Control_prompt'>" + ControlPercentage.prompt + "</td>" +
                            "<td class='Control_input'><select id='Control_" + ControlPercentage.id + "'>";
                        for (int t = 0; t < 100 ; t+=ControlPercentage.interval)
                        {
                            HTML = HTML + "<option value='"+t.ToString()+"'>"+t.ToString()+"%</option>";
                        }
                        HTML = HTML + "<option value='100'>100%</option></select>";
                        // Slider control
                        //HTML = HTML + "<div id='Control_" + ControlPercentage.id + "_slider' class='Control_slider'></div>";

                        HTML = HTML + "</td></tr></table>";
                        //Javascript = Javascript + "$(function(){  $('#Control_" + ControlPercentage.id + "_slider').slider({min:0, max:100, step:" + ControlPercentage.interval +
                        //    ", slide:function(event,ui){$('#Control_" + ControlPercentage.id + "').val(ui.value);}  });   }); ";
                        Javascript = Javascript + "$('#Control_" + ControlPercentage.id + "').selectToUISlider();";
                        // onblur watching... (PARENT YO!)
                        Javascript = Javascript + "$('#Control_" + ControlPercentage.id + "').parent().find('.ui-slider').slider({ change: function(){FormControlsTouched.push('" + Control.id + "');} });";
                        break;

                    case ControlType.Range:
                        FormControl.Range ControlRange = (FormControl.Range)Control;
                        string AnyTime_datetimeformat = "", AnyTime_start = "", AnyTime_end = "", AnyTime_size="";
                        HTML = HTML + "<table><tr title='" + ControlRange.tip + "' class='Control_tip'>" +
                            "<td class='Control_prompt'>" + ControlRange.prompt + "</td>" +
                            "<td class='Control_input'><table>";
                        switch (ControlRange.type)
                        {
                            case FormControl.Range.Rangetype.TimeRange:
                            case FormControl.Range.Rangetype.DateRange:
                            case FormControl.Range.Rangetype.DateTimeRange:
                                switch (ControlRange.type)
                                {
                                    case FormControl.Range.Rangetype.TimeRange:
                                        AnyTime_datetimeformat = "%h:%i%p";AnyTime_start="12:00AM";AnyTime_end="12:00AM";AnyTime_size="10";
                                        break;
                                    case FormControl.Range.Rangetype.DateRange:
                                        AnyTime_datetimeformat = "%m/%d/%Y";AnyTime_start="1/1/1900";AnyTime_end="1/1/1900";AnyTime_size="12";
                                        break;
                                    case FormControl.Range.Rangetype.DateTimeRange:
                                        AnyTime_datetimeformat = "%m/%d/%Y %h:%i%p";AnyTime_start="1/1/1900 12:00AM";AnyTime_end="1/1/1900 12:00AM";AnyTime_size="20";
                                        break;
                                }
                                HTML = HTML + "<tr><td class='label'>FROM</td><td class='value'><input type='text' id='Control_" + ControlRange.id + "_Start' size='" + AnyTime_size + "' class='Control_DateTime' value='" + AnyTime_start + "' " +
                                    "onfocus=\"AnyTime.noPicker('Control_" + ControlRange.id + "_Start'); $('#Control_" + ControlRange.id + "_Start').AnyTime_picker({format:'" + AnyTime_datetimeformat + "'}); this.onfocus=null; \" /></td></tr>" +
                                    "<tr><td class='label'>TO</td><td class='value'><input type='text' id='Control_" + ControlRange.id + "_End' size='" + AnyTime_size + "' class='Control_DateTime' value='" + AnyTime_end + "' " +
                                    "onfocus=\"AnyTime.noPicker('Control_" + ControlRange.id + "_End'); $('#Control_" + ControlRange.id + "_End').AnyTime_picker({format:'" + AnyTime_datetimeformat + "'}); this.onfocus=null; \" /></td></tr>";
                                break;

                            // -----
                            // These control range types are combined...
                            case FormControl.Range.Rangetype.Currency:
                            case FormControl.Range.Rangetype.MinMax:
                                string Designator = "";
                                if (ControlRange.type == FormControl.Range.Rangetype.Currency) { Designator = "'$'+"; }

                                HTML = HTML + "<tr><td>From</td><td><input type='text' id='Control_" + ControlRange.id + "_Start' size='7' readonly='1'  /></td>" +
                                              "<td>To</td><td><input type='text' id='Control_" + ControlRange.id + "_End' size='7'  readonly='1' /></td></tr>";
                                HTML = HTML + "<tr class='slider'><td colspan='4'><div id='Control_" + ControlRange.id + "_slider'></div></td></tr>";
                                Javascript = Javascript + "$(function(){  $('#Control_" + ControlRange.id + "_slider').slider({range: true, min:" + ControlRange.min + ", max:" + ControlRange.max + ", values: [" + ControlRange.min + "," + ControlRange.max + "]" +
                                    ", slide:function(event,ui){$('#Control_" + ControlRange.id + "_Start').val(" + Designator + "ui.values[0]); $('#Control_" + ControlRange.id + "_End').val(" + Designator + "ui.values[1]);}  });  " +
                                    "$('#Control_" + ControlRange.id + "_Start').val(" + Designator + ControlRange.min+ "); $('#Control_" + ControlRange.id + "_End').val(" + Designator + ControlRange.max+ ");  }); ";

                                break;

                        }
                        HTML = HTML + "</table>"; // end input formatting...
                        HTML=HTML+"</td></tr></table>";

                        // onblur watching...
                        Javascript = Javascript + "document.getElementById('Control_" + Control.id + "_Start').onblur = function(){ FormControlsTouched.push('" + Control.id + "S'); };";
                        Javascript = Javascript + "document.getElementById('Control_" + Control.id + "_End').onblur = function(){ FormControlsTouched.push('" + Control.id + "E'); };";
                        break;

                    default:
                        break;

                }
            // End Control div
            HTML = HTML + "</div>";
        }
Exemplo n.º 4
0
        /* /-------[   class: FormControl_formatqueryandlanguage       ]-------\
           | based on UIFS.ControlType, we will have different ways to build
           | a query.  This being the standardized routine
           \-------------------------------------------------------------------/
         */
        public void FormControl_formatqueryandlanguage(UIFS.ControlType ctrltype, UIFS.FormControl Control, ReportDefinition.Detail detail, ref string Query, ref string Language)
        {
            string[] selections;
            ReportingSubject.Detail RSDetail = new ReportingSubject.Detail(); // used to pass data for building queries

            switch (ctrltype)
            {
                // All of the following return a single string values
                case ControlType.Textbox:
                case ControlType.DateTime:
                case ControlType.List:
                    RSDetail.db="[" + Control.id.ToString() + "]";
                    RSDetail.lang=detail.lang;
                    RSDetail.name = Control.name;
                    RSDetail.type="text";
                    Query = Query_FormatDetail(RSDetail, detail.selection, ref Language);
                    break;
                // The following return a single numeric values
                case ControlType.Percentage:
                case ControlType.Number:
                    RSDetail.db="[" + Control.id.ToString() + "]";
                    RSDetail.lang=detail.lang;
                    RSDetail.name = Control.name;
                    RSDetail.type="number";
                    Query = Query_FormatDetail(RSDetail, detail.selection, ref Language);
                    break;
                // Checkbox controls are always true/false with an optional input field
                case ControlType.Checkbox:
                    RSDetail.db="[" + Control.id.ToString() + "]";
                    RSDetail.lang=detail.lang;
                    RSDetail.name = Control.name;
                    RSDetail.type="bit";
                    Query = Query_FormatDetail(RSDetail, detail.selection, ref Language);
                    break;
                // Ranges have start/end values

                //TODO: this type
                case ControlType.Range:
                    switch (Language)
                    {
                        case "IS BETWEEN":
                            selections = detail.selection.Split(new char[] { ',' });
                            //Query = "[" + Control.id + "_Start]>=" + selections[0] + " AND [" + Control.id + "_End]<='" + selections[1] + "'";
                            break;
                    }
                    break;

            }
        }
Exemplo n.º 5
0
        /* /-------[   function: BuildReport                           ]-------\
           | Currently, this will build Query and Language strings
           | These could be saved at the time the report is created since they will not change
           | Then used to get data, etc.
           \-------------------------------------------------------------------/
         */
        // So, a report is based on a "Subject" that has its specific "Details" (we have our special "Form" subject and direct form info from the using app)
        // Optionally, we can link in other "Subjects" with their specific "Details" (those subjects that ARE related/linked)
        public bool BuildReport(ref UIFS.ReportDefinition ReportDefinition)
        {
            string Query = "",Q_FieldSelection="SELECT ", Q_Subject="", Q_Details=" WHERE ", Q_Joins="";
            string columnnames = "";
            string Language = "";
            string[] selections;
            string Temp_Query="",Temp_Language="";
            int iFormLinkdetail, iReportingSubject; // index holders
            ReportingSubject.Detail RSDetail = new ReportingSubject.Detail(); // used to pass data for building queries
            string FormDbName = ""; // SINGULAR forms will set this.  Used in Aggregate query building

            try
            {
                // --] LOAD Needed Data [--
                Load_ReportingSubjects();

                Q_Subject = " FROM [" + FormLinks.TableName + "]"; // Our Subject clause always starts from the main table

                //. Add required id fields
                Q_FieldSelection = Q_FieldSelection + "[" + FormLinks.TableName + "].[UIFS_formid],[" + FormLinks.TableName + "].[formid],";
                columnnames = columnnames + "_UIFS_formid,_formid,";
                //. Need to add in all linked form fields, but they will (can) be hidden from the output (used for easy linking)
                foreach (FormLink.Detail FLdetail in FormLinks.Details)
                {
                    Q_FieldSelection += "["+ FormLinks.TableName+"].["+ FLdetail.field+ "],";
                    columnnames += FLdetail.name.Replace(",", "") + ","; // make sure no commas in field name
                }

                //. Start with the Main Subject
                switch (ReportDefinition.Description.lang)
                {
                    case "ALL": // all forms

                        break;
                    case "singular": // single form
                        //. load the form details
                        UIFS.Form Form = new Form(ref SQL);
                        UIFS.FormDataStruct FormData = new FormDataStruct(); // hold our data

                        // TODO: diff form version loading here...
                        if (!Form.Load(Convert.ToInt32(ReportDefinition.Description.selection),-1, ref FormData))
                        { // failed to load, end
                            SQL.WriteLog_Error(Form.ErrorEx, "failed to load specified formdata", "UIFS.Reporting.BuildReport()");
                            return false;
                        }
                        FormDbName = "[UIFS.Form_" + FormData.id.ToString() + "]";
                        //. Construct a field selection clause based on all fields in this form
                        // TODO: if report is on a different version other than the current form version...need to specify that.
                        //       Can get the form version by querying the chosen form....

                        //. build list of fields to extract, default is all
                        /* NOTES:
                         * - not sure if we want to use the user selected fields, or just have everything in the data output
                         */
                        // WARNING: make sure to remove comma's from fieldnames as we use this as our list separator.
                        // we do this with: .Replace(",", "");
                        string fieldid = "", fieldname="";
                        foreach (FormDataStruct.ControlListDetail formctrl in FormData.ControlList)
                        {
                            switch (formctrl.type)
                            {
                                case ControlType.Range: // TWO FIELDS/VALUES/COLUMNS
                                    fieldid = FormDbName + ".[" + formctrl.id.ToString() + "_Start]," + FormDbName + ".[" + formctrl.id.ToString() + "_End],";
                                    fieldname = FormData.Get_Control(formctrl.id).name.Replace(",", "") + "[FROM]," + FormData.Get_Control(formctrl.id).name.Replace(",", "")+"[TO]";
                                    break;
                                case ControlType.Checkbox: // checkbox can have an INPUT field...
                                    fieldid = FormDbName + ".[" + formctrl.id.ToString() + "],";
                                    fieldname = FormData.Get_Control(formctrl.id).name.Replace(",", "");
                                    break;
                                case ControlType.Textbox:
                                case ControlType.Number:
                                case ControlType.List:
                                case ControlType.DateTime:
                                case ControlType.Percentage:
                                    fieldid = FormDbName + ".[" + formctrl.id.ToString() + "],";
                                    fieldname = FormData.Get_Control(formctrl.id).name.Replace(",", "");
                                    break;
                            }
                            Q_FieldSelection += fieldid;
                            columnnames += fieldname + ",";
                        }
                        Q_FieldSelection = Q_FieldSelection.Remove(Q_FieldSelection.Length - 1); // take out last comma

                        //. link form table by formid from formlinks main table (standard practice)
                        Q_Joins = Q_Joins + " INNER JOIN " + FormDbName + " ON " + FormDbName + ".[id] = [" + FormLinks.TableName+"].[formid] AND ";
                        Language = "A report that shows for this '" + ReportDefinition.Description.name + "': <span class='detail'>" + FormData.name + "</span><br/>";

                        if (ReportDefinition.Description.Details != null)
                        {
                            //. walk through the non-[global] details that are form specific
                            foreach (ReportDefinition.Detail detail in ReportDefinition.Description.Details)
                            {
                                if (detail.name.StartsWith("[global]")) { continue; } // skip globals (dealt with later)
                                // GET the assigned name/id for this Detail
                                // NOTE: since we are working with [Form] Subject data, this is actually an identifier(int)
                                UIFS.FormControl detail_ctrl = FormData.Get_Control(Convert.ToInt32(detail.name)); // so, get Form->Control name

                                //. specific query building for UIFS.FormControl
                                FormControl_formatqueryandlanguage(FormData.ControlList[FormData.Find_ControlListEntry_byControlID(Convert.ToInt32(detail.name))].type, detail_ctrl, detail, ref Temp_Query, ref Temp_Language);
                                //. from returned vars, build query and language
                                Q_Joins = Q_Joins + FormDbName + "." + Temp_Query; // select using [form].[detail]
                                Language = Language + Temp_Language;
                            }
                        }
                        if (Q_Joins.EndsWith("ON ")) { Q_Joins = Q_Joins.Remove(Q_Joins.Length - 3); } // this would occur if no detailed selection was made..."no detail filter"
                        else { if (Q_Joins.EndsWith("AND ")) { Q_Joins = Q_Joins.Remove(Q_Joins.Length - 5); } }

                        Q_Details = Q_Details + " [" + FormLinks.TableName + "].UIFS_formid=" + FormData.id.ToString() + " AND ";
                        // the query detail string always adds an "AND " after each addition

                        break;
                    case "plural": // multiple forms
                        Q_Details = Q_Details + " [UIFS_formid] IS IN (";
                        selections = ReportDefinition.Description.selection.Split(new char[] { ',' });
                        foreach (string specificdetail in selections)
                        {
                            Q_Details = Q_Details + specificdetail + ",";
                        }
                        Q_Details = Q_Details.Remove(Q_Details.Length - 1); // remove last comma
                        Q_Details = Q_Details + ") AND ";
                        break;
                }

                // On Forms we have these [global] fields that the user/application has added that are linked to a specific form
                // these are contained in the same user table that has the main form linking data

                //. Now deal with [global] details
                if (ReportDefinition.Description.Details != null)
                {
                    foreach (ReportDefinition.Detail detail in ReportDefinition.Description.Details)
                    {
                        if (detail.name.StartsWith("[global]"))
                        {
                            //. Get
                            iFormLinkdetail = FormLinks.Find_detail(detail.name.Remove(0, 8)); // index of our global detail info
                            switch (FormLinks.Details[iFormLinkdetail].type)
                            {
                                case "Subject": // need to join data from another collection
                                    //. find Subject info
                                    iReportingSubject = Find_ReportingSubject(FormLinks.Details[iFormLinkdetail].name);
                                    //. restrict our query to a selection of this subject
                                    Q_Joins = Q_Joins + " INNER JOIN [" + ReportingSubjects[iReportingSubject].db + "]" +
                                        " ON [" + ReportingSubjects[iReportingSubject].db + "].[" + ReportingSubjects[iReportingSubject].db_id + "]=[" + FormLinks.TableName + "]." + FormLinks.Details[iFormLinkdetail].field;
                                    RSDetail.db = "[" + FormLinks.TableName + "].[" + FormLinks.Details[iFormLinkdetail].field + "]";
                                    RSDetail.lang = detail.lang;
                                    RSDetail.name = ReportingSubjects[iReportingSubject].name;
                                    RSDetail.type = "id"; // currently fixed
                                    Q_Details = Q_Details + Query_FormatDetail(RSDetail, detail.selection, ref Temp_Language);
                                    Language = Language + Temp_Language;
                                    break;
                                case "Detail": // this specific field data exists in the user 'FormLink' table
                                    RSDetail.db = "[" + FormLinks.TableName + "].[" + FormLinks.Details[iFormLinkdetail].field + "]";
                                    RSDetail.lang = detail.lang;
                                    RSDetail.name = detail.name.Remove(0, 8);
                                    RSDetail.type = FormLinks.Details[iFormLinkdetail].datatype;
                                    Q_Details = Q_Details + Query_FormatDetail(RSDetail, detail.selection, ref Temp_Language);
                                    Language = Language + Temp_Language;
                                    break;
                            }
                        }
                    }
                }

                //. Details cleanup
                if (Q_Details == "WHERE ") { Q_Details = ""; }
                else
                { // remove last " AND " from query (if exists)
                    if (Q_Details.EndsWith("AND ")) { Q_Details = Q_Details.Remove(Q_Details.Length - 5); }
                }

                //. put the query together
                Query = Q_FieldSelection + Q_Subject + Q_Joins + Q_Details;

                //. Assign/Push
                ReportDefinition.query = Query;
                ReportDefinition.language = Language;
                ReportDefinition.columns = columnnames.Remove(columnnames.Length-1); // Q_FieldSelection.Substring(7);

                // --[ AGGREGATION ]--
                //
                //. build a query for each type of aggregation the user wants
                string AggrTable = "", AggrQuery = "",AggrGroup="";
                ReportDefinition.Aggregate RDA;
                if (ReportDefinition.Description.Aggregates != null)
                {
                    for (int t = 0; t < ReportDefinition.Description.Aggregates.Length; t++)
                    {
                        RDA = ReportDefinition.Description.Aggregates[t];
                        //. find our field
                        AggrTable = ""; AggrQuery = ""; AggrGroup = "";
                        if (RDA.title.StartsWith("[global]"))
                        {
                            AggrTable = FormLinks.TableName;
                        }
                        else
                        {
                            AggrTable = FormDbName;
                        }

                        switch (RDA.manipulation)
                        {
                            case "CNT":
                                switch (RDA.datatype)
                                {
                                    case "bit": // boolean sum(iF(flushot,0,1)),sum(flushot)
                                        AggrQuery = "SELECT COUNT(CASE " + AggrTable + ".[" + RDA.db + "] WHEN 0 THEN 1 ELSE null END), COUNT(CASE " + AggrTable + ".[" + RDA.db + "] WHEN 1 THEN 1 ELSE null END) ";
                                        break;
                                    default:
                                        AggrQuery = "SELECT COUNT(" + AggrTable + ".[" + RDA.db + "]) ";
                                        break;
                                }
                                break;
                            case "SUM":
                                AggrQuery = "SELECT SUM(" + AggrTable + ".[" + RDA.db + "]) ";
                                break;
                            case "AVG":
                                AggrQuery = "SELECT AVG(" + AggrTable + ".[" + RDA.db + "]) ";
                                break;
                            case "SUM_DTRANGE":
                            case "SUM_DRANGE":
                            case "SUM_TRANGE":
                                AggrQuery = "SELECT DATEADD(ms, SUM(DATEDIFF(ms,[" + RDA.db + "_Start],[" + RDA.db + "_End])),0)";
                                //AggrQuery = "SELECT SUM([" + RDA.db + "_End]-[" + RDA.db + "_Start])";
                                break;
                            case "AVG_DTRANGE":
                            case "AVG_DRANGE":
                            case "AVG_TRANGE":
                                AggrQuery = "SELECT DATEADD(ms, AVG(DATEDIFF(ms,[" + RDA.db + "_Start],[" + RDA.db + "_End])),0)";
                                break;
                        }
                        if (AggrQuery != "")
                        {
                            AggrQuery = AggrQuery + Q_Subject + Q_Joins + Q_Details + AggrGroup; // rest of query is same...except for grouping
                            RDA.query = AggrQuery;
                        }
                    }
                }

                // END BuildReport
                return true;
            }
            catch (Exception ex)
            {
                SQL.WriteLog_Error(ex, "failed", "UIFS.Reporting.BuildReport()");
                return false;
            }
        }
Exemplo n.º 6
0
        public InputValue[] FilterInput(System.Collections.Specialized.NameValueCollection querystring, UIFS.FormDataStruct FormData)
        {
            int cnt = 0;
            InputValue[] IVs = new InputValue[FormData.ControlList.Length];
            UIFS.FormControl Control;

            foreach (UIFS.FormDataStruct.ControlListDetail CtrlDetail in FormData.ControlList)
            {
                Control = FormData.Get_Control(CtrlDetail.id);
                IVs[cnt] = new InputValue();
                IVs[cnt].Controlid = CtrlDetail.id; // set control id
                // now set the correct values based on control type
                switch (CtrlDetail.type)
                {
                    case ControlType.Textbox:
                    case ControlType.DateTime:
                    case ControlType.List:
                        IVs[cnt].value = querystring["c_" + Control.id.ToString()];
                        break;
                    case ControlType.Percentage:
                    case ControlType.Number:
                        IVs[cnt].value = querystring["c_" + Control.id.ToString()];
                        if (IVs[cnt].value == "") {
                            IVs[cnt].value = "0"; // DEFAULT to 0 if nothing returned
                        }
                        break;
                    // This checkbox control may also have an attached text input field
                    case ControlType.Checkbox:
                        UIFS.FormControl.Checkbox CB = (UIFS.FormControl.Checkbox)Control; //FormData.Get_Control(CtrlDetail.id);;
                        if (CB.hasinput)
                        {
                            IVs[cnt].value = SQLBOOL(querystring["c_" + Control.id.ToString()]);
                            IVs[cnt].input = querystring["c_" + Control.id.ToString()+"_I"];
                        }
                        else { IVs[cnt].value = SQLBOOL(querystring["c_" + Control.id.ToString()]);}
                        break;

                    // Ranges have a *Start and *End set of values
                    case ControlType.Range:
                        UIFS.FormControl.Range R = (UIFS.FormControl.Range)Control;
                        IVs[cnt].Start = querystring["c_" + Control.id.ToString() + "_S"];
                        IVs[cnt].End = querystring["c_" + Control.id.ToString() + "_E"];
                        switch (R.type) {
                                // numbers
                            case FormControl.Range.Rangetype.Currency:
                            case FormControl.Range.Rangetype.MinMax:
                                // DEFAULT to 0 if nothing returned
                                if (IVs[cnt].Start == ""){IVs[cnt].Start = "0"; }
                                if (IVs[cnt].End == ""){IVs[cnt].End = "0"; }
                            break;
                            case FormControl.Range.Rangetype.DateRange:
                            case FormControl.Range.Rangetype.DateTimeRange:
                            case FormControl.Range.Rangetype.TimeRange:
                                // DEFAULTs are typically set by Calendar widget..control creation..
                            break;
                        }
                        break;

                }
                cnt += 1; // increase our array counter
            }
            return IVs;
        }
Exemplo n.º 7
0
        // ---------------------------------------------------------------------------------------------------------------
        /* -- FormInput.EditSave --
        // ---------------------------------------------------------------------------------------------------------------
         |  1) updates the db record for the form with new field changes
         |  2) returns a text value "LOG" entry to the user application for it to do what it wants (a basic table example is: UIFS_formid, formid, [changes text])
         |
        */
        public bool Update(UIFS.FormDataStruct FormData, long formid, InputValue[] FormValues_Old, InputValue[] FormValues_New, ref UIFS.SQL SQL, bool test, ref string Changes)
        {
            UIFS.FormControl Control;
            string query_update = "UPDATE [UIFS.Form_" + FormData.id + "]";
            string query_values = " SET ";
            string query_where = " WHERE [id]="+formid.ToString();
            int iOldCtrl, iNewCtrl, ctrl_currentversion;
            string ctrl_dbver = "";
            Changes = ""; // clear out first

            // if bool test is set, we want to encap in a tran and roll it back.
            if (test)
            {
                query_update = "BEGIN TRAN UIFSTest \n" + query_update;
            }

            // begin...
            try
            {
                // We are going to build a querystring from all the values
                // : making sure to parse values

                // For each control for the form: find the value(s) for the control from the form data and check for changes
                foreach (UIFS.FormDataStruct.ControlListDetail CtrlDetail in FormData.ControlList)
                {
                    Control = FormData.Get_Control(CtrlDetail.id);
                    iNewCtrl = -1; iOldCtrl = -1;

                    //. determine if this control is the latest version or older..
                    SQL.Query = string.Format(SQL.SQLQuery.Form_ControlcurrentVersion, FormData.id, Control.id);
                    SQL.cmd = SQL.Command(SQL.Data);
                    ctrl_currentversion = Convert.ToInt32(SQL.cmd.ExecuteScalar());
                    if (Control.version != ctrl_currentversion)
                    { // NOT CURRENT version, specific column name required
                        ctrl_dbver = "_" + Control.version.ToString();
                    }
                    else { ctrl_dbver = ""; }
                    for (int t = 0; t < FormValues_Old.Length;t++)
                    {
                        if (FormValues_Old[t].Controlid == Control.id)
                        { // Found the control data, now we can add to the query strings
                            iOldCtrl = t; break;
                        }
                    }
                    for (int t = 0; t < FormValues_New.Length;t++)
                    {
                        if (FormValues_New[t].Controlid == Control.id)
                        { // Found the control data, now we can add to the query strings
                            iNewCtrl = t; break;
                        }
                    }
                    if (iNewCtrl == -1 || iOldCtrl == -1) {
                        // error, could not match control value arrays!
                        continue;
                    }
                    switch (CtrlDetail.type) {
                        // All of the following return a single string values
                        case ControlType.Textbox:
                        case ControlType.DateTime:
                        case ControlType.List:
                            if (FormValues_Old[iOldCtrl].value != FormValues_New[iNewCtrl].value)
                            {
                                query_values = query_values + "[" + Control.id + "]='" + SQL.ParseInput(FormValues_New[iNewCtrl].value) + "',";
                                Changes = Changes + Control.name + "(" + Control.id + ") was changed from: " + FormValues_Old[iOldCtrl].value + " to: " + FormValues_New[iNewCtrl].value + "\n";
                            }
                            break;
                        // The following return a single numeric values
                        case ControlType.Percentage:
                        case ControlType.Number:
                            if (FormValues_Old[iOldCtrl].value != FormValues_New[iNewCtrl].value)
                            {
                                query_values = query_values + "[" + Control.id + "]=" + FormValues_New[iNewCtrl].value + ",";
                                Changes = Changes + Control.name + "(" + Control.id + ") was changed from: " + FormValues_Old[iOldCtrl].value + " to: " + FormValues_New[iNewCtrl].value + "\n";
                            }
                            break;
                        // Checkbox controls are always true/false with an optional input field
                        case ControlType.Checkbox:
                            UIFS.FormControl.Checkbox CB = (UIFS.FormControl.Checkbox)Control;
                            if (CheckboxBOOL(FormValues_Old[iOldCtrl].value) != CheckboxBOOL(FormValues_New[iNewCtrl].value)) {
                                query_values = query_values + "[" + Control.id + ctrl_dbver + "]=" + FormValues_New[iNewCtrl].value + ",";
                                Changes = Changes + Control.name + "(" + Control.id + ") was changed from: " + CheckboxBOOL(FormValues_Old[iOldCtrl].value) + " to: " + CheckboxBOOL(FormValues_New[iNewCtrl].value) + "\n";
                            }
                            if (CB.hasinput)
                            {
                                if (FormValues_Old[iOldCtrl].input != FormValues_New[iNewCtrl].input)
                                {
                                    query_values = query_values + "[" + Control.id + ctrl_dbver + "_text]='" + SQL.ParseInput(FormValues_New[iNewCtrl].input) + "',";
                                    Changes = Changes + Control.name + "(" + Control.id + ")'s input was changed from: " + FormValues_Old[iOldCtrl].input + " to: " + FormValues_New[iNewCtrl].input + "\n";
                                }
                            }
                            break;
                        // Ranges have start/end values
                        case ControlType.Range:
                            if (FormValues_Old[iOldCtrl].Start != FormValues_New[iNewCtrl].Start)
                            {
                                query_values = query_values + "[" + Control.id + ctrl_dbver + "_Start]='" + SQL.ParseInput(FormValues_New[iNewCtrl].Start) + "',";
                                Changes = Changes + Control.name + "(" + Control.id + ")'s Start was changed from: " + FormValues_Old[iOldCtrl].Start + " to: " + FormValues_New[iNewCtrl].Start + "\n";
                            }
                            if (FormValues_Old[iOldCtrl].End != FormValues_New[iNewCtrl].End)
                            {
                                query_values = query_values + "[" + Control.id + ctrl_dbver + "_End]='" + SQL.ParseInput(FormValues_New[iNewCtrl].End) + "',";
                                Changes = Changes + Control.name + "(" + Control.id + ")'s End was changed from: " + FormValues_Old[iOldCtrl].Start + " to: " + FormValues_New[iNewCtrl].Start + "\n";
                            }
                            break;
                    }
                }
                // dbwrite
                SQL.Query = query_update + query_values.Substring(0, query_values.Length - 1) + query_where;
                // if test, rollback
                if (test)
                {
                    SQL.Query = SQL.Query + "\n ROLLBACK TRAN UIFSTest";
                }
                SQL.cmd = SQL.Command(SQL.Data);
                SQL.cmd.ExecuteNonQuery();
                return true;
            }
            catch (Exception ex)
            {
                SQL.WriteLog_Error(ex, "Failed to save form data: " + SQL.Query, "UIFS.FormInput.SaveForm");
                return false;
            }
        }
Exemplo n.º 8
0
        public bool Save(UIFS.FormDataStruct FormData, InputValue[] FormValues, ref UIFS.SQL SQL, bool test, ref long newFormid)
        {
            UIFS.FormControl Control;
            string query_insert = "INSERT INTO [UIFS.Form_" + FormData.id + "] (version,";
            string query_values = "VALUES("+FormData.version+",";

            // if bool test is set, we want to encap in a tran and roll it back.
            if (test)
            {
                query_insert = "BEGIN TRAN UIFSTest \n" + query_insert;
            }

            // begin...
            try
            {
                // We are going to build a querystring from all the values
                // : making sure to parse values

                // 1) For each control for the form: build insert statement with correct column names: id_ver
                // 2) and find the value(s) for the control from the form data and add to VALUES part of query
                foreach (UIFS.FormDataStruct.ControlListDetail CtrlDetail in FormData.ControlList)
                {
                    Control = FormData.Get_Control(CtrlDetail.id);
                    foreach (InputValue IV in FormValues)
                    {
                        if (IV.Controlid == Control.id)
                        { // Found the control data, now we can add to the query strings
                            switch (CtrlDetail.type)
                            {
                                // All of the following return a single string values
                                case ControlType.Textbox:
                                case ControlType.DateTime:
                                case ControlType.List:
                                    query_insert = query_insert + "[" + Control.id + "],";
                                    query_values = query_values + "'" + SQL.ParseInput(IV.value) + "',";
                                    break;
                                // The following return a single numeric values
                                case ControlType.Percentage:
                                case ControlType.Number:
                                    query_insert = query_insert + "[" + Control.id + "],";
                                    query_values = query_values + "" + IV.value + ",";
                                    break;
                                // Checkbox controls are always true/false with an optional input field
                                case ControlType.Checkbox:
                                    UIFS.FormControl.Checkbox CB = (UIFS.FormControl.Checkbox)Control;
                                    if (CB.hasinput)
                                    {
                                        query_insert = query_insert + "[" + Control.id + "], [" + Control.id + "_text],"; ;
                                        query_values = query_values +  IV.value + ",'" + SQL.ParseInput(IV.input) + "',";
                                    }
                                    else
                                    {
                                        query_insert = query_insert + "[" + Control.id + "],";
                                        query_values = query_values + "" + IV.value + ",";
                                    }
                                    break;
                                // Ranges have start/end values
                                case ControlType.Range:
                                    query_insert = query_insert + "[" + Control.id + "_Start], [" + Control.id + "_End],";
                                    query_values = query_values + "'"+SQL.ParseInput(IV.Start)+ "','" + SQL.ParseInput(IV.End) + "',";
                                    break;

                            }
                            break;
                        }

                    }
                }

                // dbwrite
                // NOTE: we have to trim our trailing commas from created strings
                SQL.Query = query_insert.Substring(0, query_insert.Length - 1) + ") " + query_values.Substring(0, query_values.Length - 1) + ")  SELECT @@IDENTITY";
                // if test, rollback
                if (test) {
                    SQL.Query = SQL.Query + "\n ROLLBACK TRAN UIFSTest";
                }
                SQL.cmd = SQL.Command(SQL.Data);
                newFormid = Convert.ToInt64(SQL.cmd.ExecuteScalar());
                return true;
            }
            catch (Exception ex)
            {
                SQL.WriteLog_Error(ex, "Failed to save form data: "+SQL.Query, "UIFS.FormInput.SaveForm");
                return false;
            }
        }