среда, 31 июля 2013 г.

Разработка ORACLE PL/SQL - ASP MVC 3- JavaScript Часть 1. Создание простой таблицы

Небольшой обзор технологий я уже сделал в предыдущей статье, здесь я хотел бы показать как я реализовал свой подход:

Создание хранимых процедур
Справочник регионов.
Пакет:

create or replace package admin_REGION_V01 as

    function f_sel_REGION return tab_select_REGION pipelined;

    function f_upd_REGION(p_REGION_ID        in NUMBER,
                                                p_REGION_NAME in VARCHAR2) return varchar2;

    function f_ins_REGION( p_REGION_NAME in VARCHAR2) return varchar2;

    function f_del_REGION(p_REGION_ID in NUMBER) return varchar2;

end admin_REGION_V01;


Тело пакета:

create or replace package body admin_REGION_V01 as

    function f_sel_REGION return tab_select_REGION  pipelined
    as
        l_t_select_REGION t_select_REGION;
    begin
       l_t_select_REGION:= t_select_REGION(0,'');
       for C in (select
                    REGION_ID,REGION_NAME
                from REGION
       )
       loop
         l_t_select_REGION.REGION_ID:= C.REGION_ID;
         l_t_select_REGION.REGION_NAME:= C.REGION_NAME;

       pipe row (l_t_select_REGION);

       end loop;

    return;
    end f_sel_REGION;

    function f_upd_REGION( p_REGION_ID   in NUMBER,
                           p_REGION_NAME in VARCHAR2) return varchar2
    as
        pragma autonomous_transaction;
        my_errm VARCHAR2(32000);
    begin
       update REGION
       set  REGION_NAME = p_REGION_NAME
       where REGION_ID= p_REGION_ID;

      commit;
     return 'REGION:' || p_REGION_NAME ||' was success updated';
    exception when others then
              my_errm := SQLERRM;
              rollback;
              return my_errm;
    end f_upd_REGION;

    function f_ins_REGION( p_REGION_NAME   in VARCHAR2) return varchar2
    as
        pragma autonomous_transaction;
        my_errm VARCHAR2(32000);
    begin
       insert into REGION
       (
         REGION_ID,
         REGION_NAME
       )
       values (
         seq_groups_id.nextval,
         p_REGION_NAME);
      commit;
     return 'REGION:' || p_REGION_NAME|| 'was success inserted';
    exception when others then
              my_errm := SQLERRM;
              rollback;
              return my_errm;
    end f_ins_REGION;

    function f_del_REGION(p_REGION_ID   in NUMBER) return varchar2
    as
       pragma autonomous_transaction;
       my_errm VARCHAR2(32000);
    begin
       delete from REGION
       where REGION_ID =p_REGION_ID;
       commit;
     return 'REGION: '|| p_REGION_ID||' was success deleted';
    exception when others then
        my_errm := SQLERRM;
        rollback;
        return my_errm;
    end f_del_REGION;
    
end admin_REGION_V01;


Тут собственно я обернул все необходимые DML для работы приложения с таблицей.

Дальше в ASP MVC делаем класс, фактически это все колонки Вашей таблицы:


namespace TEST.Models.OracleORM.classes
{
public class Region
{
public int RegionRegionId { set; get; }
public string RegionRegionName { set; get; }

public Region() { }
}
}


Далее ORM класс, который будет вызывать хранимые процедуры:


using System;
using System.Collections.Generic;
using COMMON.Oracle;
using Erequest3AdminTool.Models.OracleORM.classes;

namespace Erequest3AdminTool.Models.OracleORM
{
    public class RegionIUDS
    {
        private static String RegionSelect = @" select    region_id           F01
                                                                                            ,region_name     F02                                                        
                                               from table(admin_region_v01.f_sel_region())";

        private static String RegionUpdate = @"select admin_region_v01.f_upd_region(  p_REGION_ID   =>  &p_REGION_ID
                                                                                     ,p_REGION_NAME => '&p_REGION_NAME') results from dual";

        private static String RegionInsert = @"select admin_region_v01.f_ins_region( p_REGION_NAME => '&p_REGION_NAME') results from dual";

        private static String RegionDelete = @"select admin_region_v01.f_del_region(p_REGION_ID   =>&p_REGION_ID ) results from dual";

       
        public static List<Region> SelectRegion()
        {
            List<Region> result = new List<Region>();
            try
            {
                foreach (OracleField row in OracleLib.setExecuteSelect(RegionSelect))
                {
                    result.Add(new Region()
                    {
                        RegionRegionId = Convert.ToInt32(row.F01),
                        RegionRegionName = row.F02
                    });
                }
            }
            catch
            {
                throw;
            }

            return result;
        }

      public static string UpdateRegion(Region Region)
        {
            string result = "";
            try
            {
                String l_sql = RegionUpdate;

                l_sql = l_sql.Replace("&p_REGION_ID", Convert.ToString(Region.RegionRegionId));
                l_sql = l_sql.Replace("&p_REGION_NAME", Region.RegionRegionName);
              

                result = OracleLib.setExecuteIUD(l_sql);
            }
            catch
            {
                throw;
            }
            return result;
        }

      
        public static string InsertRegion(Region Region)
        {
            string result = "";
            try
            {
                String l_sql = RegionInsert;
               
                l_sql = l_sql.Replace("&p_REGION_NAME", Region.RegionRegionName);

                result = OracleLib.setExecuteIUD(l_sql);
            }
            catch
            {
                throw;
            }
            return result;
        }

       
        public static string DeleteRegion(int RegionRegionId)
        {
            string result = "";
            try
            {
                String l_sql = RegionDelete;

                l_sql = l_sql.Replace("&p_REGION_ID", Convert.ToString(RegionRegionId));

                result = OracleLib.setExecuteIUD(l_sql);
            }
            catch
            {
                throw;
            }
            return result;
        }
    }
}

Смысл я думаю понятен, просто перезаписываем переменные какими-то значениями, которые передаются из контроллера.

Далее контроллер:


namespace Erequest3AdminTool.Controllers
{
    public class RegionController : Controller
    {
        /// <summary>
        /// Полная страница для отображения
        /// </summary>       
        public ActionResult RegionShowPage()
        {
            return View("RegionTable");
        }

        /// <summary>
        /// Передает список всех пользователей через JSON
        /// </summary>       
        public ActionResult RegionSelect()
        {          
            return Json(RegionIUDS.SelectRegion(), JsonRequestBehavior.AllowGet);
        }

        /// <summary>
        /// Обновить данные о Region
        /// </summary>
        /// <param name="Region">JSON, содержит информацию для обновления</param>
        [HttpPost]
        public ActionResult RegionUpdate(Region Region)
        {
            try
            {
                if (ModelState.IsValid)
                {
                    string results = RegionIUDS.UpdateRegion(Region);

                    if (results.Contains("ORA"))
                    {
                        return PartialView("~/Views/Shared/error.cshtml", results);
                    }
                    else
                    {
                        return PartialView("~/Views/Shared/done.cshtml", results);
                    }
                }
                else
                {
                    return PartialView("~/Views/Shared/error.cshtml", "RegionUpdate invalid Model");
                }
            }
            catch (Exception e)
            {
                return View("~/Views/Shared/error.cshtml", e.Message);
            }
        }

        /// <summary>
        /// Добавление данных в Region
        /// </summary>
        /// <param name="Region">JSON, содержит информацию для обновления</param>
        [HttpPost]
        public ActionResult RegionInsert(Region Region)
        {
            try
            {
                if (ModelState.IsValid)
                {
                    string results = RegionIUDS.InsertRegion(Region);

                    if (results.Contains("ORA"))
                    {
                        return PartialView("~/Views/Shared/error.cshtml", results);
                    }
                    else
                    {
                        return PartialView("~/Views/Shared/done.cshtml", results);
                    }
                }
                else
                {
                    return PartialView("~/Views/Shared/error.cshtml", "RegionInsert invalid Model");
                }
            }
            catch (Exception e)
            {
                return View("~/Views/Shared/error.cshtml", e.Message);
            }
        }

        /// <summary>
        /// Удаление данных в Region
        /// </summary>
        /// <param name="Region">JSON, содержит информацию для удаления</param>
        [HttpPost]
        public ActionResult RegionDelete(string RegionRegionId)
        {
            try
            {
                if (ModelState.IsValid)
                {
                    string results = RegionIUDS.DeleteRegion(Convert.ToInt32(RegionRegionId));

                    if (results.Contains("ORA"))
                    {
                        return PartialView("~/Views/Shared/error.cshtml", results);
                    }
                    else
                    {
                        return PartialView("~/Views/Shared/done.cshtml", results);
                    }
                }
                else
                {
                    return PartialView("~/Views/Shared/error.cshtml", "RegionDelete invalid Model");
                }
            }
            catch (Exception e)
            {
                return View("~/Views/Shared/error.cshtml", e.Message);
            }
        }

    }

}

Фактически контроллеры принимают JSON и вызывают методы класса ORM.
И наконец View:



<!--load js-->

<script src="@Url.Content("~/Content/JavaScript/JsORM/Region/js/RegionTable.js")"></script>



<div class="span4">
   <h4>Regions</h4>
   <div style="overflow-x: auto; width: 100%" id="allRegions"></div>
</div>


Тут все происходит в RegionTable.js:

var tableRegionDescription = {
TableID: 'Region'
, ContentDiv: '#allRegions'
, Columns: [{ ColumnName: "Region Name", ColumnID: "RegionRegionName", IsSort: 1, ColumnType: 'text', IsVisible: 'true', IsPK: 'false' }
,{ ColumnName: "Id", ColumnID: "RegionRegionId", IsSort: 0, ColumnType: 'text', IsVisible: 'false', IsPK: 'true' }]
, DeleteController: '/Region/RegionDelete'
, InsertController: '/Region/RegionInsert'
, UpdateController: '/Region/RegionUpdate'
, SelectController: '/Region/RegionSelect'
, tableData: []
};

$(document).ready(function () {

//создаем заголовок для таблицы и саму таблицу без данных
$(tableRegionDescription.ContentDiv).createTableHead(tableRegionDescription);

//заполняем таблицу данными
$().createTable(tableRegionDescription);

});


И вот что мы получаем:

region

По поводу параметров:

TableID: - идентификатор таблицы, которая будет добавлена
, ContentDiv: - ID DIV, куда добавлять таблицу
, Columns: массив колонок таблицы
ColumnName - имя отображаемой колонки
ColumnID - идентификатор колонки
IsSort - включить сортировку
ColumnType - тип колонки
IsVisible - отображать в таблице или нет
IsPK - колонка, которая является первичным ключом, необходимо будет при удаление данных из таблицы
, SelectController: - контроллер, которые будет получать данные
, tableData: [] - массив, содержащий данные, которые будут загружены из SelectController

Комментариев нет:

Отправить комментарий