Модераторы: gambit
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> db-фреймворк :) - требуются добровольцы для доработки и развития проекта, групповой проект 
:(
    Опции темы
kulibin
Дата 23.11.2007, 11:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 229
Регистрация: 9.5.2005
Где: Украина, Запорожь е

Репутация: 1
Всего: 3



имеется проектец: библиотечка-конструктор для рапид-разработки прикладных приложений для работы с бд. Изначально была универсальной - потом я её таки заточил под PostgreSQL - на нём я работаю. У него просто много довольно своих фич не стандартных - и я подумал, что не стоит ему крылья подрезать ради каких-то пока реально мне не нужных призрачных перспектив. Но в принципе если кому сильно надо - то можно сделать опять её универсальной - или по крайней мере под несколько субд заточить.
Краткая предыстория:
Были у меня оч наполеоновские планы по разработке одной учётной программы. Эта библиотечка входила в этот проект - а потом была отделена - для дальнейшего использования в разных проектах. Так вот - нет больше у меня силов самому это всё тянуть :(. На данный момент та учётная программа - вместе с автором - уже работает 3-й месяц. Но длинна туду-лист этого проекта потрясающая - и вообще стремится к бесконечности smile. Там как минимум нужна отладка - и ещё нужно дописать ряд фич. 

Была мысль вообще из этой библиотечки сделать опен-сурс-проект. Но для этого я ещё не созрел. И вообще планируется в этой библиотечке сделать функции для защиты. Поэтому я не склонен открывать её код для всех. 

Сейчас я хотел бы найти 1-3 шарящих человека, поделиться с ними этим проектом - в надежде что никому из них тоже не придёт в голову мысль устраивать из этого опен-сурс-проект без моего согласия smile. Ну и сообща это дело долизывать, дописывать и развивать. Ну и каждый чтобы использовал сам по себе это дело в своих прикладных проектах на своё усмотрение.

Ну и немного описалова:
Вот пример кода для создания в прикладной программе формы для работы с таблицей бд - простым справочником:
Код

using System;
using System.Drawing;
using System.Collections.Generic;
using System.Text;
using System.Data;
using System.Windows.Forms;
using sbsit;
using sbsit.forms;
using sbsit.db;
using Npgsql;
using NpgsqlTypes;

namespace cito.spr
{
    public class prep : sbsit.forms.DataForm
    {
        dbo_prep prep_dbo;

        protected override void MkForm()
        {
            base.MkForm();
            ToolsMenuAddItem("Найти в прайсах (F3)", Pictures.page_find1, new EventHandler(fnd_in_ppr_Click));
        }
        void Grid_PreviewKeyDown(object sender, PreviewKeyDownEventArgs e)
        {
            if (e.KeyData == Keys.F3) { fnd_in_ppr_Click(null, EventArgs.Empty); }
        }
        void fnd_in_ppr_Click(object sender, EventArgs e)
        {
            if (CurrentDataRow == null) { MessageBox.Show("Выберите позицию для поиска."); return; }
            cito.zak.post_prices prices = new cito.zak.post_prices(dbo.connection);
            prices.ShowForSelect(frm, (int)CurrentDataRow[Cols.id]);
        }

        public prep(NpgsqlConnection con):base(con)
        {
            Grid.PreviewKeyDown += new PreviewKeyDownEventHandler(Grid_PreviewKeyDown);
        }
        protected override Type ColsList { get { return typeof(Cols); } }
        protected override sbsit.db.DbObjectAutoEdit dbo { get { return this.prep_dbo; } }
        protected override string FormCaption { get { return "Препараты"; } }
        protected override void MkDbo(NpgsqlConnection con)
        {
            prep_dbo = new dbo_prep(con);
            prep_dbo.LoadSchema();
        }
        protected override System.Drawing.Bitmap MenuImage { get { return Pictures.pill; } }

        //Cols:
        public static class Cols
        {
            [ColHiddenAtribute()]
            public const string id = "id";
            [ColCaptionAtribute("Группа")]
            [Filter("select grp from spr.grp order by grp;")]
            public const string grp = "grp";
            [ColSelSpr("cito.spr.grp", new string[]{"grp"})]
            public const string fk_grp = "fk_grp";
            [ColCaptionAtribute("Препарат")]
            [Filter()]
            public const string prep = "prep";
            [ColCaptionAtribute("Макс.Нац.")]
            [ColNumberFormatAtribute(NumberFormatEnum.fDec)]
            public const string max_nac = "max_nac";
            [ColCaptionAtribute("НДС")]
            public const string nds = "nds";
            [ColCaptionAtribute("Поиск")]
            public const string fnd_prep = "fnd_prep";
            [ColCaptionAtribute("Поиск Произв.")]
            public const string fnd_proizv = "fnd_proizv";
            [ColCaptionAtribute("ATC-группа")]
            [Filter()]
            public const string atc = "atc";
            [ColCaptionAtribute("Аннотация")]
            public const string anotashka = "anotashka";
        }

        //dbo:
        public class dbo_prep : sbsit.db.DbObjectAutoEdit
        {
            public dbo_prep(NpgsqlConnection con)
            {
                this.con = con;
                this.LoadSchema();
            }

            protected override NpgsqlCommand CmdSelSchema
            {
                get
                {
                    return new NpgsqlCommand("select * from spr.vw_prep limit 0;", this.con);
                }
            }

            protected override NpgsqlCommand CmdSel
            {
                get
                {
                    return new NpgsqlCommand("select * from spr.vw_prep;", this.con);
                }
            }

            protected override NpgsqlCommand CmdIns
            {

                get
                {
                    NpgsqlCommand c = new NpgsqlCommand("spr.prep_ins", this.con);
                    c.CommandType = CommandType.StoredProcedure;
                    c.Parameters.Add(Cols.fk_grp, NpgsqlDbType.Integer, 0, Cols.fk_grp);
                    c.Parameters.Add(Cols.prep, NpgsqlDbType.Text, 0, Cols.prep);
                    c.Parameters.Add(Cols.max_nac, NpgsqlDbType.Numeric, 0, Cols.max_nac);
                    c.Parameters.Add(Cols.nds, NpgsqlDbType.Boolean, 0, Cols.nds);
                    c.Parameters.Add(Cols.fnd_prep, NpgsqlDbType.Text, 0, Cols.fnd_prep);
                    c.Parameters.Add(Cols.fnd_proizv, NpgsqlDbType.Text, 0, Cols.fnd_proizv);
                    c.Parameters.Add(Cols.atc, NpgsqlDbType.Text, 0, Cols.atc);
                    c.Parameters.Add(Cols.anotashka, NpgsqlDbType.Text, 0, Cols.anotashka);
                    return c;
                }
            }

            protected override NpgsqlCommand CmdUpd
            {

                get
                {
                    NpgsqlCommand c = new NpgsqlCommand("spr.prep_upd", this.con);
                    c.CommandType = CommandType.StoredProcedure;
                    c.Parameters.Add(Cols.id, NpgsqlDbType.Integer, 0, Cols.id);
                    c.Parameters.Add(Cols.fk_grp, NpgsqlDbType.Integer, 0, Cols.fk_grp);
                    c.Parameters.Add(Cols.prep, NpgsqlDbType.Text, 0, Cols.prep);
                    c.Parameters.Add(Cols.max_nac, NpgsqlDbType.Numeric, 0, Cols.max_nac);
                    c.Parameters.Add(Cols.nds, NpgsqlDbType.Boolean, 0, Cols.nds);
                    c.Parameters.Add(Cols.fnd_prep, NpgsqlDbType.Text, 0, Cols.fnd_prep);
                    c.Parameters.Add(Cols.fnd_proizv, NpgsqlDbType.Text, 0, Cols.fnd_proizv);
                    c.Parameters.Add(Cols.atc, NpgsqlDbType.Text, 0, Cols.atc);
                    c.Parameters.Add(Cols.anotashka, NpgsqlDbType.Text, 0, Cols.anotashka);
                    return c;
                }
            }

            protected override NpgsqlCommand CmdDel
            {

                get
                {
                    NpgsqlCommand c = new NpgsqlCommand("spr.prep_del", this.con);
                    c.CommandType = CommandType.StoredProcedure;
                    c.Parameters.Add(Cols.id, NpgsqlDbType.Integer, 0, Cols.id);
                    return c;
                }
            }
        }
    }
}


Так же имеются более сложные там модели: шапки документов с формами "деталей" - например таблицей позиций накладной и т.п. Оч просто делается выбор со справочников - как в 1С. также с 1С слизан поиск при наборе на любой таблице smile. Так же довольно просто делаются многотабличные формы типа мастер-детайл. Таблицы на форму можно лепить в неограниченном количестве - пока не надоест smile. Так же можно - и даже видимо нужно smile - их связывать - т.е. при переходе со строки на строку одной таблицы меняются отображаемые данные другой/других таблиц.
Есть так же простой, дешовый и интересный способ печати: хтмл-отчёты. На стандартной форме этот отчёт дёшево и сердито можно перегнать в excel/word, сохранить на диске в хтмл. Делается это оч простым компонентом на основе веб-браузер-компонента которому в конструктор передаётся объект-комманд. Этот комманд уже должен содержать необходимые параметры. А в бд есть хранимка, возвращающая текст хтмл - на PostgreSQL опятьже делается она довольно легко - ещё с дополнительными функциями в бд по работе с хтмл.

На сегодняшний день полностью отсутствуют механизмы для разграничений прав доступа. Ну и ещё пара пунктов есть в туду-листе без которых пока применить эту технологию к серьёзным и масштабным проектам низзя :(. Точнее можно - и нужно даже - и для этого то оно и было создано - но проект не будет без этого иметь завершонный вид. Хотя работать на нём уже можно будет.

Ещё в проекте был реализован механизм генерации для формирования текста хранимок и классов шарповских по таблице бд и вьюхе для представления данных этой таблицы. Но сейчас оно устарело немного - отстало от остальных частей проекта и потеряло актуальность. Но его тоже можно долизать и использовать по назначению.

Есть ещё компонент-дата-визард - пока не входит в проект - но будет долизан и туда включён.
Ну и много ещё чего. С одним токо проблемы - устал я очень сам это тянуть :(. Охота найти соратников хороших под это дело - и возможно не только под это. Есть и прикладной один проект очень амбициозный. И к нему ещё и уже прилагается очередь из потенциальных клиентов проявляющих к этому делу интерес УЖЕ ДАВНО - но я никак его не домучаю. Возможно и с ним когда-то я созрею чтобы с кем-то разделить ету нелёгкую ношу smile.

В прикреплённом архиве скрины прикладного приложения на этой длл написанного - или недонаписаного smile. Скрины оч жестоко пережаты - чтобы удовлетворить требованию макс.размера прикреплённого файла - извините smile.

Всех желающих принять участие в проекте прошу тут об этом сообщать. Ну и если можно в 2-х словах об себе тоже - и об своём опяте, проектах. Извините конечно за такой подход - просто на это дело я убил туеву хучу времени, сил и нервов - и раздавать комунипопадя етот код не хочу - т.к. у нас ещё не коммунизм и не сантаклаус я тоже. Не хочу никого обидеть или за чей-то счёт самоутвердиться - но тут будет какое-то подобие конкурсного отбора. Вплоть до того, что если серьёзных кандидатов/предложений не будет - то я вообще готов отказаться от этого плана и тянуть эту лямку дальше сам. такие пироги

Присоединённый файл ( Кол-во скачиваний: 12 )
Присоединённый файл  cito_scr.zip 87,74 Kb
PM MAIL WWW ICQ   Вверх
kulibin
Дата 27.11.2007, 14:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 229
Регистрация: 9.5.2005
Где: Украина, Запорожь е

Репутация: 1
Всего: 3



up
PM MAIL WWW ICQ   Вверх
Exception
Дата 1.12.2007, 15:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 4525
Регистрация: 26.12.2004

Репутация: 2
Всего: 186



Мне больше нравится O/R + DataBinding.
PM   Вверх
kulibin
Дата 1.12.2007, 16:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 229
Регистрация: 9.5.2005
Где: Украина, Запорожь е

Репутация: 1
Всего: 3



Exception - это дело я тоже собираюсь переносить на генерические коллекции - вместо datatable и т.п. и вместо класса, где задаются названия столбцов (cols) с проставлением атрибутов - делать классы обыектов, представляющих датаэнтри. Ну и на них таким же макаром проставлять атрибуты аналогичные. Ну и ещё хочу проставлять атрибутами тоже инфу о параметрах на полях/столбцах и на самом объекте атрибутами названия хранимок инсерт/апдейт/делите. или не названия - а просто наличие/отсутствие - как-то так. ещё не определился. ну и вообще там планов оч много. вообще в идеале всё это в конечном итоге должно представлять что-то по функциям схожее (но не по принципу работы!) с 1ской - чтобы была возможность быстренько собрать например учётную программу из стандартных компонентов. Только в отличие от 1с будет гораздо больше гибкости: всё, что нельзя из стандартных компонентов собрать будет писаться на шарпе любым доступным способом. или наследованием стандартных компонентов и переопределеним родительских свойств/методов

Добавлено через 1 минуту и 17 секунд
ещё вот тут можно глянуть что в конечном итоге с помощью этой длл делать можно:
http://cito.sbs-it.zp.ua
PM MAIL WWW ICQ   Вверх
kulibin
Дата 1.12.2007, 17:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 229
Регистрация: 9.5.2005
Где: Украина, Запорожь е

Репутация: 1
Всего: 3



Exception, всёже я не понял причём здесь "O/R + DataBinding"? вот этот код, что выше там в первом моём посте - это ВЕСЬ код форы - ВКЛЮЧАЯ ИНТЕРФЕЙС - и вообще полностью ВСЁ - так причём же тут O/R?! Я тоже это дело может на о/р-маппинг переведу - токо причём здесь это? о/р-маппинг, дататейблы с датасетами и всё такое-прочее - это не всё, что нужно для приложения для работы с бд - разве токо если приложение консольное smile.

так вот - а у меня полная рапид-разработка стандартного интерфейса - со всякими примочками по типу поиска при наборе на таблице, менюхе для фильтрации, выбора со справочника по нажатии кнопки в таблице и туева хуча всего. это в изначальном замысле ПОЛНЫЙ конструктор для построения СЛОЖНЫХ программ - по типу учётных и т.п. это изначальный такой замысел smile - на сегодняшний день в текущей реализации есть мелкие жуки и кое-что недописано из требуемого функционала. Ну а вообще предела совершенству тут нет - конца этому проекту не будет.

если кто-то ещё напишет что-то по типу "предпочитаю DataSet" - убью smile
PM MAIL WWW ICQ   Вверх
kulibin
Дата 1.12.2007, 17:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 229
Регистрация: 9.5.2005
Где: Украина, Запорожь е

Репутация: 1
Всего: 3



может это я виноват что так понимается не правильно что я написал. вот прилагаю скрин того, что делается отем кодом в первом моём посте. при этом ещё хочу сделать акцент на том, что это ВЕСЬ код, который надо написать в клиентском приложении (в бд ещё хранимки smile) чтобы получить ПОЛНОФУНКЦИОНАЛЬНУЮ эту форму. разве токо там идёт выбор со справочника подобного этому - ну тоисть и его тоже сначала написать нужно. он полностью аналогичен этому. и эту форму тоже можно использовать для аналогичного выбора по справочнику для других форм - это рулится всего навсего одним атрибутом в классе cols. 

Присоединённый файл ( Кол-во скачиваний: 11 )
Присоединённый файл  sel_spr.jpg 78,78 Kb
PM MAIL WWW ICQ   Вверх
kulibin
Дата 1.12.2007, 17:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 229
Регистрация: 9.5.2005
Где: Украина, Запорожь е

Репутация: 1
Всего: 3



ещё примерчик - календарик в таблице. в отличие от датагридвью (тут не он используется) он нулебл сам по себе - без гемора. и дата вводится текстом - вплоть до использования вместо разделителя запятой - он сам потом корректно всё переводит по окончании редактирования

Присоединённый файл ( Кол-во скачиваний: 9 )
Присоединённый файл  dtp.jpg 21,82 Kb
PM MAIL WWW ICQ   Вверх
kulibin
Дата 1.12.2007, 17:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 229
Регистрация: 9.5.2005
Где: Украина, Запорожь е

Репутация: 1
Всего: 3



вот ещё форма с интервалом дат и формой деталей (их много можно наоткрывать - они не модальные) - элемент стандартного интерфейса. выскакивает по F4. Опять же - чтобы там это сделать нужно пару строчек кода. просто всё до безобразия - всё - кроме библиотечки-конструктора

Присоединённый файл ( Кол-во скачиваний: 6 )
Присоединённый файл  date_interval_details_formS.jpg 72,24 Kb
PM MAIL WWW ICQ   Вверх
kulibin
Дата 1.12.2007, 18:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 229
Регистрация: 9.5.2005
Где: Украина, Запорожь е

Репутация: 1
Всего: 3



ещё на форме деталей обратите внимания на итоги в статусбаре - они тоже безобразно просто добавляются. они пересчитываются по ходу редактирования - и обновляются не только на дочерней форме - а и на родительской в таблице, на строке, для которой редактируются детали.
Вот как это делается:
Код

protected override List<sbsit.forms.itog> Itogi {
get
{
     return new List<sbsit.forms.itog>(new sbsit.forms.itog[]{
    new sbsit.forms.itog("Поз.","Count(id)","cnt"),
    new sbsit.forms.itog("Сумма","","sum"),                                   new sbsit.forms.itog("Сумма с ндс","","snds"),
    new sbsit.forms.itog("Сумма рассчётная","SUM(summ)","rsum"),
    new sbsit.forms.itog("Расхождение","","otkl")
   });
}

 


ну и ещё примерчик формы деталей - с условным форматированием - там если срок годности меньше года - то красным и жирным он выделен. тоже не сложно очень это делается - не атрибутом конечно - чуть сложнее - но тоже минимум кода.
Код




Присоединённый файл ( Кол-во скачиваний: 4 )
Присоединённый файл  uslovniy_format.jpg 65,42 Kb
PM MAIL WWW ICQ   Вверх
kulibin
Дата 1.12.2007, 18:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 229
Регистрация: 9.5.2005
Где: Украина, Запорожь е

Репутация: 1
Всего: 3



и исчё smile - обработка ошибок юзверьского ввода. Всё это проверяется в хранимках на сервере. например:
Код

CREATE OR REPLACE FUNCTION skl.prih_doc_upd(p_id integer, p_fk_ka integer, p_data date, p_num_doc text, p_nds boolean, p_sum numeric, p_ok boolean, p_f2 boolean, p_descr text)
  RETURNS skl.vw_prih_doc AS
$BODY$
declare
/* ПРОВЕРКА:
    1. на наличие расхода если пытаются снять отметку об оприходованнии;
    2. соответствия рассчётной суммы той, что указана от руки.
*/
    v_otkl numeric; v_ok bool; -- old ok!!!
    rw skl.vw_prih_doc;
begin
    v_ok=(select coalesce(ok,false) from skl.prih_doc where id=p_id);
    if p_ok and not v_ok then
    -- если пытаются провести накладную - т.е. параметр p_ok=true и ok в таблице false||null:
        v_otkl =(select otkl from skl.vw_prih_doc where id=p_id);
        if v_otkl is not null then
            raise exception E'Расхождение между указаной в шапке суммой и рассчетной суммой составляет %\r\nПровести накладную не возможно. Проверьте сумму и повторите попытку.',v_otkl;
        end if;
    elsif not p_ok and v_ok then
    -- снимается отметка о проводке с УЖЕ проведеной накладной. проверяем наличие расхода по єтой накладной:
        if exists(select id from skl.rash_poz where fk_prih_poz=any(select id from skl.prih_poz where fk_doc=p_id)) then
            raise exception 'По этой накладной был отпуск. Отменить проведение документа не возможно.';
        end if;
    end if;
    update skl.prih_doc set 
        fk_ka=p_fk_ka,data=coalesce(p_data,now()),num_doc=p_num_doc,nds=p_nds,sum=p_sum,ok=p_ok,f2=p_f2,descr=p_descr 
    where id=p_id;
    select * into rw from skl.vw_prih_doc where id=p_id;
    return rw;
end
$BODY$
  LANGUAGE 'plpgsql' VOLATILE;


все подобные проверки делаются на сервере. кстати отсюда и специфика постгресовская для длл этой - я не знаю на чём ещё можно нормально такое реализовать. а на клиенте такое делать конечно можно - но токо если на сервере тоже это делается smile - токо так

ну и как на клиенте такие ошибки отрабатываются - смотрим прикреплённый скрин. кода для этого никакого писать не нужно - в прикладном приложении. всё написано в длл.


Присоединённый файл ( Кол-во скачиваний: 8 )
Присоединённый файл  data_error.jpg 47,51 Kb
PM MAIL WWW ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Прежде чем создать тему, посмотрите сюда:
stab
mr.DUDA
Exception

Используйте теги [code=csharp][/code] для подсветки кода. Используйтe чекбокс "транслит" если у Вас нет русских шрифтов.

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, stab, mr.DUDA, Exception.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Базы данных под .NET | Следующая тема »


 




[ Время генерации скрипта: 0.0917 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.