[ alfa-pro @ 07.01.2018. 22:09 ] @
Dali je izvodljivo i dali je preporucljivo da se kreira jedna forma koja je zaduzena da na osnovu nekog parametra prikazuje podatke u datagridu i da podesi polja za filtriranje na neku odredjenu tabelu u bazi.

Da pojasnim imam sifrarnik u kome se nalaze "artikli, kupci, dobavljaci,banke,skladista itd...) sada svaka od ovih stavki ima posebnu formu koja sadrzi left panel sa textBox kontrolama za filtriranje podataka u gridu u istoj formi. Sada ja zelim da izbegnem da kreiram tu istu formu za sve te tabele i da pisem iste filtere itd itd. Jel postoji mogucnost da se napravi jednostavniji put ili moram da pisem za svaku tabelu sve jovo nanovo? U tom slucaju imacu preko 50 formi za izlistavanje nekih tabela.
[ Shadowed @ 07.01.2018. 22:37 ] @
WPF ili WinForms?
[ alfa-pro @ 07.01.2018. 22:49 ] @
WinForms
[ Predrag Supurovic @ 08.01.2018. 03:57 ] @
Ne da može neko ako ceniš svoje vreme samo tako ćeš i da radiš. Pretraga šifarnika je opšti problem koji s emože primeniti na sve šifarnike uz malo podešavanja kro zprametrei nema razloga da za svaki šifarnik praviš posebnu formu za pregled.

[ S A J A @ 08.01.2018. 22:08 ] @
Ja bih išao na više formi. Podaci su različiti. Svaki grid će imati neka svoja polja, sa svojim specifičnostima i akcijama. Posle će tu da se dodaje koješta drugo. Ako se sve nagura u jednu formu, u početku će biti jednostavnije ali će kasnije morati da se prave razni kompromisi. Zajednički kod uvek može da se izmesti u neku klasu.
[ Dusan Kondic @ 09.01.2018. 06:15 ] @
Ja uvek pravim jednu CRUD formu (window) za sve šifarnike koji nemaju logiku.
Svaki novi šifarnik ovog tipa možeš samo da prikačiš na ovu formu, a ako neki postojeći dobije neku komplikovanu logiku, uvek možeš za njega da kreiraš nov form (window).
[ Predrag Supurovic @ 09.01.2018. 06:47 ] @
Citat:
S A J A:
Ja bih išao na više formi. Podaci su različiti. Svaki grid će imati neka svoja polja, sa svojim specifičnostima i akcijama. Posle će tu da se dodaje koješta drugo. Ako se sve nagura u jednu formu, u početku će biti jednostavnije ali će kasnije morati da se prave razni kompromisi. Zajednički kod uvek može da se izmesti u neku klasu.


Bezmalo sam 30 godina programer i još nisam naišao na šifarnik koji nije mogao da se uklopi u jednu univerzalnu formu. Sve različitosti se mogu rešiti podešavanjima forme.

Posebna forma se pravi samo ako zaista postoji potreba za specifičnim korisničkim interfejsom.


[ S A J A @ 09.01.2018. 07:44 ] @
Ako praviš šifarnike tako da tebi bude lakše, to je potpuno razumljivo. A ako hoćeš da praviš šifarnike koji u sebi sadrže sve specifičnosti konkretnih podataka, i da zapravo budu prilagođeni samom korisniku a ne programeru, onda neće biti praktično da se sve umulja u isto. Sa programerske strane artikli, partneri i radnici jesu jedno te isto ali u stvarnosti nisu i program treba da bude prilagođen stvarnosti a ne programeru. Ali dobro, razumem potrebu da se "smulja na brzinu". Ja kad bi to radio za sebe, svaka forma bi bila odvojena i upravo bi akcenat stavio da različitostima.
[ Dusan Kondic @ 09.01.2018. 08:31 ] @
Ja ne vidim nikakvo muljanje u ovakvom pristupu, a sigurno da programeru nije lakše.
Napraviti dinamički prozor koji će za prosleđenu tabelu automatski kreirati CRUD komande, voditi računa o spoljnim ključevima, kreirati npr. ComboBox-ove sa podacima iz povezanih tabela, pamtiti poslednje podešene širine kolona, sakrivati Id polja i druge slične stvari, sigurno programeru nije lakše. Ono što se ovim pristupom na kraju dobija je vreme. Za svaki prost šifarnik pozoveš prozor i proslediš mu naziv tabele.
S obzirom na to da pričamo o šifarnicima, ne vidim da korisniku ima šta posebno da se prilagođava. Ako ima, nije sporno, napravi nov prozor za taj entitet (tabelu).
[ Predrag Supurovic @ 09.01.2018. 09:52 ] @
Citat:
S A J A:
Ako praviš šifarnike tako da tebi bude lakše, to je potpuno razumljivo. A ako hoćeš da praviš šifarnike koji u sebi sadrže sve specifičnosti konkretnih podataka, i da zapravo budu prilagođeni samom korisniku a ne programeru, onda neće biti praktično da se sve umulja u isto. Sa programerske strane artikli, partneri i radnici jesu jedno te isto ali u stvarnosti nisu i program treba da bude prilagođen stvarnosti a ne programeru. Ali dobro, razumem potrebu da se "smulja na brzinu". Ja kad bi to radio za sebe, svaka forma bi bila odvojena i upravo bi akcenat stavio da različitostima.


Biće da u stvari ne razumeš ili su tvoji programersk dometi takvi da ne možeš da poimeš da je zaista moguće napraviti univerzalnu formu. Univerzalnost ne znači ograničenost i manju funkcionalnost, baš naprotiv ona stvara predispozicije da nemaš ograničenja šta sve možeš da napraviš.

Alfa'pro je započeo priču o jednoj univerzalnoj formi koja se korsiti za brz i jednoobazan pristup šifarnicima, dovoljna da odradi posao dok se ne napravi neka specifična forma za neki specifičan šifarnik, ako ima potrebe. To je samo mali korak ka univerzalanosti ali veoma bitan korak. Zašto je bitan: zato što će imati jednu formu. Kad mu bude trebalo neko unapređenje ili promena korisničkog interfejsa, napraviće to na toj jednoj formi i to će se automatski preslikati na sve šifarnike.

Kada je u pitanju univerzalna maska za unos, to se radi preko metadate, ne programiras masku nego je ucis da čita metadatu a metadatu podešavaš prema potrebi. Metadata se uvek na početku može automatski generisati prema strukturi podataka sa kojima radi a kasnije neko to može da prialgodi za specifične potrebe, štaviše, može čak i sam korisnik programa da je priklagodi sebi bez angažovanja programera.

I ta forma ne treba da radi samo sa šifarnicima nego sa svim dokumentima. Forme ne programiraš nego imaš samo jednu formu koju učiš da radi sa podacima koje joj daš. I to se ne odnosi sam na univerzalu formu nego i na univerzalni meni i univerzalni tabelarni pregledač i univerzalni dijalog sve do univerzalne apliakcije koja u stvari ne ume da radi ništa konkretno već radi onako kako je podesiš (ili korisnik izabere).

Smem da se kladim da to uopšte nije lakše napraviti kao što se tebi čini. Zašto smem? Pa zato što sam radio i jedno i drugo i to sam radio na više platformi (od desktop do web) i svaki put se univerzalni pristup pokazao kao dobitna kombinacija. Programiranja ima manje ali je zato zahtevnije. Dobit se oseća na kasnijem bržem razvoju, prilagođavanju potrebama korisnika i lakšem održavanju

Suština programerskog umeća i veštine je u uopštavanju. Samim svojim pitanjem je alfa-pro pokazao da je počeo da prelazi tu granicu između učukavača koda i programera. Jeste da je on zamilsio da uradi nešto što je jednostavno i jeste ograničeno ali to je početak. Bitno je da mu je kvrcnulo i da je počeo da razmišlja u tom smeru. Treba da napravi to tako kako je zamislio jer će mu se tek tada otvoriti mogućnosti i vrlo brzo će on tu svoju ograničenu univerzalno formu da unapredi o razgraniči.

Savet za Alfa-Pro: jada budeš pravio tu foirmu, nmeoj na nju stavljati direktno komponente korisničkog interfejsa kakve imaš u okruženju u kome radiš. Umesto toga, nrpavi nalsenike tih komponenti i korsiti njih, na primer umesto EditBox napravi AlfaEditoBoc koji je naslednik EditBox, umesto CheckBox, napravi AlfaCheckBox koji je nalsenik CheckBox, umesto Label, napavi AlfaLabel i tako dalje. Ti naslendici ne moraju da unose nikakvu novu funkcionlnost, već sam oda naslede. Možda ti sad ne treba ali će ti kad-tad zatrebati da menjaš funkcionlnst ili izgled komponenti. To ne možeš da uradiš sa dobijemin komponentama ali sa naslednicima možeš.
[ alfa-pro @ 09.01.2018. 09:56 ] @
Hvala na svim odgovorima.

Ja sam uradio nesto pa vi procenite jel to ispravno.

Ono sto sam ja uradio iz svoje glave pre nego sto sam dobio odgovore je sledece:

U napravio sam UserControl koji sadrzi layout: left za filtriranje podataka i middle panel koji prikazuje DataGridView sa podacima, top sa informacijama en title i bottom sa BindingNavigation.

UserControl sadrzi propertije kojima iz neke forme prosledjujem DataSource za datagridview, polja za filtriranje List<String> koja kasnije kroz loop generisem dinamicki Labele i TextBox-ove zbog pretrage grida i property za Title.


Za svaki sifrarnik ono sto trebam jeste da napravim blanko formu i da dodam UserControl i da roknem jedan DOCK FILL.
Nakon toga u konstruktoru setujem DataSource, Filtere i Title.

Primera radi za formu artikal:

Code:
       
 public Artikal()
        {
            InitializeComponent();

            List<string> filteri = new List<string>();

            filteri.Add("SIFRA");
            filteri.Add("NAZIV");
            filteri.Add("MP CENA");
            filteri.Add("VP CENA");

            FormUserControl = new TestUserControl(filteri);
            FormUserControl.Dock = DockStyle.Fill;
            FormUserControl.gridDataSource = GetTable();

            FormUserControl.TitleLabel = "Artikli";
            this.Controls.Add(FormUserControl);

        }



Controls za filtere se generisu dinamicki uz pomoc List<string> filteri

U roku od 3 min dobijam full formu sa potrebnim podacima i filterima. Jeste da na samom startu izgubim dosta vremena da kreiram taj usercotrol kako treba ali nakon toga sve se kreira u 3 koraka.

Evo usercontrol koji je srce svega:

Code:
    
public partial class TestUserControl : UserControl
    {
        private DataTable _dataSource;
        private BindingSource _bs = new BindingSource();
        private List<string> _filters;
        private TextBoxFormFilter[] controls;  // textbox and label usercontrol

        public DataTable gridDataSource 
        {
            get { return _dataSource; }
            set { _bs.DataSource = value; }
        }

        public string TitleLabel
        {
            get {  return formTitleLbl.Text; }
            set { formTitleLbl.Text = value; }
        }

        public TestUserControl(List<String> filters)
        {
            InitializeComponent();

            _filters = filters;

            controls = new TextBoxFormFilter[_filters.Count];

            dataGridView1.DataSource = _bs;
            bindingNavigator1.BindingSource = _bs;

            SetupFilters();
        }

        public void SetupFilters()
        {
            int space = 20;
            int count = 0;

            for(int i = 0; i < _filters.Count; i++)
            {
                count += 1; 

                controls[i] = new TextBoxFormFilter();
                controls[i].SetLabelValue(_filters[i]);
                controls[i].textBoxFilter.Name = "TextBox" + count.ToString();
                controls[i].Location = new Point(5, 15 + space);

                space += 50;
            }

            for(int i = 0; i < _filters.Count; i++)
            {
                filterPanel.Controls.Add(controls[i]);
            }
        }

        private void SearchBtn_Click(object sender, EventArgs e)
        {
            string s = String.Empty;
            BindingSource bs = new BindingSource();

            for (int i = 0; i < _filters.Count; i++)
            {
                string value = controls[i].GetTextBoxValue();

                if (!string.IsNullOrWhiteSpace(value) && !string.IsNullOrEmpty(value))
                {
                    s = value;

                    bs.Filter = dataGridView1.Columns[2].ToString() + " LIKE '%" + s + "%'";
                }                 
            }

            dataGridView1.DataSource = bs;

            //MessageBox.Show(s);
        }


Ovo sve radi super i eventi mogu da se pohvataju. TextBoxFormFilter je dodatna kontrola koja kreira dinamicki label i textbox. TextBoxFormFilter kontrola sadrzi label i textbox i kroz FOR petlju kreiram filtere.

Mada me predlog @Dusan Kondic za CRUID mozda vise privlaci.

Obrni okreni ja ovde opet moram da kreiram za svaki sifrarnik praznu formu (frmArtikli, frmKupci, frmDobavljaci) i svakoj da dodajem user control koji sam kreirao da bi prikazao informacije.

Mozda kada bi napravio jednu UNIQUE formu kojoj cu kao ste je receno samo da prosledim ime tabele i na osnovu toga da se ona sama generise? Samim tim bi izbegao kreiranje blanko tabela.
[ Predrag Supurovic @ 09.01.2018. 10:12 ] @
Citat:
alfa-pro
Mozda kada bi napravio jednu UNIQUE formu kojoj cu kao ste je receno samo da prosledim ime tabele i na osnovu toga da se ona sama generise? Samim tim bi izbegao kreiranje blanko tabela.


Upravo tako. u tvom slučaju ime tabele je dovoljan podatak da forma zna gde da potraži opis kako treba daizgleda za rad sa tom tabelom.

Međutim, gledaj to malo šire, isti princip možeš da primeniš i na dokument. Pod dokumentom mislim na skup tabela, recimo uznimo za primer dokument fakture, on se sastoji od zaglavlja i stavki i u praksi i još dodatnih tabela. ako formu nauči da radi sa dokumetom, ona će raditii sa šifarnikom, jer je ifarnik samo prostija varijanta dokumenta - iam samo jednu tabelu.

Potrebne su ti u stvari dve forme; jedna koja je obrazac i koja radi sve CRUD operacije i jedna koja služi za pregled (obično u obliku tabele) i izbor slogova.

Univerzalnost možeš da obezbediš i do nasitnijeg detalja kao to su validacije polja ili popunjavanje default vrednosti pa čak i na akcije kao što je recimo upis, brisanje, sve to ne treba da radi sama forma nego da koristi nekoga ko to ume da uradi sa datim podacima.

U praksi, forma u stvari ne radi direktno sa tabelama nego su njoj tabele dostupne kroz objekte koji ih predstavljaju. To objekti, osim što omogućuju pristup podacima, omogućuju i osnovne oeracije kao što su CRUD operacije, validacije i slično. Na primer, umesto da forma dobviši ime tabele otvori tabelu korisnici, u stvari će prilikom instanciranja da dobije već instanciran objekat Korisnik i njega će da koristi i za podatke i za operacije nad njima.

Tako ti forma može biti potpuno univerzalna jer ona je u stvari samo grafički korisnički interfejs a glavni posao radi namenska klasa (koja takođe može biti uopštena ali da ne komplikujemo).
[ ravni @ 09.01.2018. 11:19 ] @
Citat:
alfa-pro:
...da podesi polja za filtriranje na neku odredjenu tabelu u bazi.
... U tom slucaju imacu preko 50 formi za izlistavanje nekih tabela.
Mozes i da iskoristis samu grid komponentu za filtriranje. Otprilike ovako:
https://documentation.devexpre...ter-and-Search#auto_filter_row

Posle formi prosledjujes SQL upit cije rezultate zelis da prikazes.
[ S A J A @ 09.01.2018. 12:07 ] @
Citat:
Predrag Supurovic:
I ta forma ne treba da radi samo sa šifarnicima nego sa svim dokumentima. Forme ne programiraš nego imaš samo jednu formu koju učiš da radi sa podacima koje joj daš. I to se ne odnosi sam na univerzalu formu nego i na univerzalni meni i univerzalni tabelarni pregledač i univerzalni dijalog sve do univerzalne apliakcije koja u stvari ne ume da radi ništa konkretno već radi onako kako je podesiš (ili korisnik izabere).


Razumem ovaj koncept ali ipak više praktikujem moju varijantu. Što zbog jednostavnosti, što zbog toga što želim da mi kod bude raspoređen funkcionalno. Kad god sam probao da pravim univerzalne aplikacije, posle nekog vremena eto glavom o zid. Previše komplikovano i nedajbože da ne radiš na aplikaciji par meseci, ne možeš da se snađeš. Sve zavisi od potrebe a meni lično to nije potrebno. Ako uzmeš prosečnu poslovnu aplikaciju gde imaš artikle, partnere, dokumenta, magacine i slično, tu nema više od 10-15 različitih stvari i nemam problem sa time da za svaki segment specijalno dizajniram forme. Zapravo, to je bilo nekada davno, sada u web programiranju za svaku od tih celina pravim kontroler, model i view. Prva dva u PHP-u, view u Javaskriptu.
[ Shadowed @ 09.01.2018. 12:15 ] @
@S A J A, sve zavisi kako i koliko dobro uradis. Generalno, ljudi prvo rade tako kao ti, vremenom predju na nacin rada koji predstavlja univerzalna resenja za veci skup radnji/resenja a jos kasnije vremenom nauce da nadju balans izmedju ta dva nacina rada (ili njihovog kombinovanja).
Naravno, ili stanu negde na tom putu.
[ alfa-pro @ 09.01.2018. 14:34 ] @
Evo jedan fast test koji sam uradio da bi probao ono sto smo pricali. Formi samo prosledjujem upite i ona se generise.



Code:
namespace Sifrarnik
{
    public partial class Form1 : Form
    {
        private DataTable dt;
        private BindingSource bs;
        private string _query;

        public Form1()
        {
            InitializeComponent();
   
        }

        public Form1(string query, string title)
        {
            InitializeComponent();

            this.Text = title;

            _query = query;

            bs = new BindingSource();

            this.PopulateDataGridView();

          
        }

        /// <summary>
        /// 
        /// </summary>
        private void PopulateDataGridView()
        {
            DataTable data = GetData(_query);

            bs.DataSource = data;

            dataGridView1.DataSource = bs;
            bindingNavigator1.BindingSource = bs;
        }

        private void SetupDatagridView()
        {
            DataGridViewColumn column = dataGridView1.Columns[0];
            column.Width = 360;
        }
        /// <summary>
        /// 
        /// </summary>
        /// <param name="q"></param>
        /// <returns></returns>
        private DataTable GetData(string q)
        {
            using (var conn = new MySqlConnection(Db.connStr))
            {
                try
                {
                    conn.Open();

                    using (MySqlDataAdapter adapter = new MySqlDataAdapter(q, conn))
                    {
                        dt = new DataTable();
                        adapter.Fill(dt);

                        return dt;
                    }
                }
                catch (MySqlException e)
                {
                    MessageBox.Show(e.Message);
                }
            }

            return dt;
        }

    }
}


I evo finalne klase odakle sve zadajem

Code:
 public partial class MainWindow : Form
    {
        public MainWindow()
        {
            InitializeComponent();
        }

        /// <summary>
        /// 
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void listaArtikalaToolStripMenuItem_Click(object sender, EventArgs e)
        {
            CreatePage("CALL lista_artikala()", "Artikli");
        }
 
        private void listaKupacaToolStripMenuItem_Click(object sender, EventArgs e)
        {
            CreatePage("CALL lista_kupaca()", "Kupci");
        }

        
        private void listaDobavljacaToolStripMenuItem_Click(object sender, EventArgs e)
        {
            CreatePage("SELECT id, naziv, adresa, telefon_1, email, website FROM dobavljaci", "Dobavljači");
        }

      
        private void listaPorudzbinaToolStripMenuItem_Click(object sender, EventArgs e)
        {
            CreatePage("CALL spisak_porudzbina()", "Web Porudzbine");
        }
     


        private void CreateTabPage(Form form)
        {
            form.TopLevel = false;
            
            TabPage tabPage = new TabPage();
            tabPage.Text = form.Text;
            tabPage.Controls.Add(form);

            tabControl1.Controls.Add(tabPage);
            tabControl1.SelectedTab = tabPage;

            form.Show();
        }

         
        private void CreatePage(string query, string title)
        {
            Form1 form = new Form1(query, title);

            CreateTabPage(form);
        }


Ovo je bas grubo i brzo uradjenno, tu treba jos dosta toga da se uradi. Samo ovo je mnogo laksi nacin nego ono sto sam ja gore navodio.

Ono sto sada zelim da implementiram jeste polja za filtriranje. Dali da na osnovu naziva grid kolona po nazivu iz grida generisem TextBox-ove za filtriranje ili da dodam jos jedan parametar u konstruktoru gde cu proslediti listu polja za filtriranje koja treba da se generisu ?
[ Dusan Kondic @ 09.01.2018. 19:35 ] @
Evo ti ovo parče koda pa proanaliziraj.
Na odgovarajuće mesto upiši tačan naziv neke tabele i izvrši query.
Dobićeš podatke pomoću kojih možeš da napraviš odgovarajuće procedure, da formatiraš DataGrid i slično.
Code:

DECLARE @TableName VARCHAR(50)
SET @TableName = 'OVDE UPISI NAZIV TABELE'

SELECT * FROM sys.tables t WHERE t.name = @TableName
SELECT c.* FROM sys.tables t INNER JOIN sys.columns c ON t.object_id = c.object_id WHERE t.name = @TableName
SELECT fk.* FROM sys.tables t INNER JOIN sys.foreign_keys fk ON t.object_id = fk.parent_object_id WHERE t.name = @TableName
SELECT fk.* FROM sys.tables t INNER JOIN sys.foreign_keys fk ON t.object_id = fk.referenced_object_id WHERE t.name = @TableName
[ Predrag Supurovic @ 10.01.2018. 07:12 ] @
Citat:
S A J A:
Citat:
Predrag Supurovic:
I ta forma ne treba da radi samo sa šifarnicima nego sa svim dokumentima. Forme ne programiraš nego imaš samo jednu formu koju učiš da radi sa podacima koje joj daš. I to se ne odnosi sam na univerzalu formu nego i na univerzalni meni i univerzalni tabelarni pregledač i univerzalni dijalog sve do univerzalne apliakcije koja u stvari ne ume da radi ništa konkretno već radi onako kako je podesiš (ili korisnik izabere).


Razumem ovaj koncept ali ipak više praktikujem moju varijantu. Što zbog jednostavnosti, što zbog toga što želim da mi kod bude raspoređen funkcionalno. Kad god sam probao da pravim univerzalne aplikacije, posle nekog vremena eto glavom o zid. Previše komplikovano i nedajbože da ne radiš na aplikaciji par meseci, ne možeš da se snađeš. Sve zavisi od potrebe a meni lično to nije potrebno. Ako uzmeš prosečnu poslovnu aplikaciju gde imaš artikle, partnere, dokumenta, magacine i slično, tu nema više od 10-15 različitih stvari i nemam problem sa time da za svaki segment specijalno dizajniram forme. Zapravo, to je bilo nekada davno, sada u web programiranju za svaku od tih celina pravim kontroler, model i view. Prva dva u PHP-u, view u Javaskriptu.


Naravno, praviti univerzanu aplikaciju za neki jednostavan posao se ne isplati, prsotije je i brže slepati par formi i to je to. Međutim, mi pričamo o pravljenju kvalitetnih aplikacija, zar ne?

Da nisam usvojio ovaj metod univerzalnosti, ja danas ne bih bio programer nego bih radio nešto manje stresno. Meni je danas nezamislivo da svaki put iznova pravim jedno te isto samo zato što je struktura podataka različita, a pogotovo da to posle treba i da održavam.

MVC paternbi nije to osim ako ne napraviš negi univerzalni MVC. Radio sam to i radi korektno i šravište prilično je praktično pogotovo na webu gde korisnici ne traže fensi interfejs nego praktičan interfejs. Web je takva platforma da te prosto tera na univerzalni pristup.
[ alfa-pro @ 10.01.2018. 11:33 ] @
@Predrag Supurovic
Dali bi mogao da mi das neki link ili neku kljucnu rec sta da izguglam da vidim kako je neko uradio tu jednu univerzalnu formu koja je obrazac i koja radi sve CRUD operacije i jedna koja služi za pregled. Googlam winforms universal forms, winforms single charged form, winforms dynamic form i nista od navedenog o cemu razgovaramo.

Sto se tice prikaza to sam skontao sada je malo dilema kako da je naucim da prikazuje odredjena polja za CU(Create, Update).
[ Predrag Supurovic @ 11.01.2018. 03:18 ] @
Ne verujem da ćeš to da nađeš baš tako gotovo. To svak sebi pravi kako mu odgovara.

Od sličnih stvari imaš recimo CMS za web, oni često omogućavaju univerzalne forme, ali na pirlično rudmentarnom nivou.

[ alfa-pro @ 16.01.2018. 11:35 ] @
Sve sam ja ono uradio kako treba i funkcionise super.

E sada ja sam kreirao da kada kliknes na neki row u datagridview da ti se otvori kartica kupaca npr u novom tabu (tabControl) kojoj prosledjujem ID i tableName i na osnovu toga ja generisem textBox i Label controle uz pomoc SHOW COLUMNS FROM artikal. Sve to super sljaka i pokazuje sve kontrole ali sta ako je upitanju neka relacija? npr on meni sve vraca kao string ali sta ako hocu combobox npr grupa artikala?

Dali je mozda bolje za ovo da kreiram posebnu formu za UPDATE/CREATE za svaki sifrarnik? Malo je zeznuto nauciti je po tipu gadja neku relaciju
[ Shadowed @ 16.01.2018. 11:43 ] @
Sta koristis za rad sa bazom?Imas neki ORM ili ides pdsaka?
[ alfa-pro @ 16.01.2018. 12:59 ] @
MySQL a app mi je N-Tir. Za Bazu imam DBA Layer gde imam klasu npr Artikli i sve pesaka GetAllArticles(), FindArticleByID() ...itd

Code:


        private DataTable GetData(string q)
        {
            using (var conn = new MySqlConnection(Db.connStr))
            {
                try
                {
                    conn.Open();

                    using (MySqlDataAdapter adapter = new MySqlDataAdapter(q, conn))
                    {
                        dt = new DataTable();
                        adapter.Fill(dt);

                        return dt;
                    }
                }
                catch (MySqlException e)
                {
                    MessageBox.Show(e.Message);
                }
            }

            return dt;
        }
[ Predrag Supurovic @ 16.01.2018. 13:21 ] @
Citat:
alfa-pro:
Sve sam ja ono uradio kako treba i funkcionise super.

E sada ja sam kreirao da kada kliknes na neki row u datagridview da ti se otvori kartica kupaca npr u novom tabu (tabControl) kojoj prosledjujem ID i tableName i na osnovu toga ja generisem textBox i Label controle uz pomoc SHOW COLUMNS FROM artikal. Sve to super sljaka i pokazuje sve kontrole ali sta ako je upitanju neka relacija? npr on meni sve vraca kao string ali sta ako hocu combobox npr grupa artikala?

Dali je mozda bolje za ovo da kreiram posebnu formu za UPDATE/CREATE za svaki sifrarnik? Malo je zeznuto nauciti je po tipu gadja neku relaciju



U jednoj pd prethodnih poruka sam rekao da univerzalna forma ne treba da dobije podatke (ili daih ona izvlači iz baze po dobijenomključu) nego objekat koji već sadrži i podatke, ali pored podataka sadrži i opis tih podataka na osnovu koga forma može da zna šta i kako treba da prikayuje, validira, obradi...

Shadowed te je pitao za ORM jer ako korsitiš ORM, njegove klase već sadrže neke podatke koji bi mogli da ti pomognu.

Što se CRUD operaciaj tiče to je apsolutno izvodivo da bude sve univerzalno. Komplikacije nastaju kada se prave složeni upiti nad bazom.
[ alfa-pro @ 16.01.2018. 13:29 ] @
@Predrag Supurovic sada sam skontao sta si hteo u toj poruci da kazes.

Sve u svemu ja bi trebao da napravim neku Entity klasu npr Artikal koji ce da sadrzi sve clanove kao i baza tipa kao sto je ORM i onda formi prosledjujem samo objekat i na osnovu objekta on generise sve sto mu treba?

A dali je pametno umesto CUID i custom query classe da koristim EntityFramework?
[ Shadowed @ 16.01.2018. 15:36 ] @
Ta klasa Artikli koju imas ti je prakticno ArticlesRepository klasa i ok je glede postojanja i metoda koje ima.
ORM bi ti jako znacio i olaksao posao. Sa EF-om bi ti se taj GetAllArticles() metod (bolji naziv je GetAll jer se svakako odnosi na artikle) sveo na new MyDbContext(connectionString).Articles.ToList().

Ako bi koristio EF, imao bi ovako nesto:
Entities (Article, Customer, ...)
DbContext (klasa koja sadrzi DbSet<Article> Articles, DbSet<Customer> Customers, ...)
Repositories (ArticleRepository, CustomerRepository, ...).

Ovo poslednje imas i tu bi ostavio metode koje imas, samo bi promenio sta vracaju (umesto DataTable bi vracao liste ili IEnumerable tih objekata koji ti trebaju).
Ono sto mozes ali sto ti sada verovatno nije potrebno a i da se ne pretrpavas odmah, mozes imati i interfejse IArticleRepository, ICustomerRepository itd. koje implementiraju ovi tvoji repositoriji. Onda sve deklarises sa tim interfejsima i mozes da zamenjujes konkretne implementacije. Ali da ne idem daleko u tom smeru. Uci korak po korak :)



I da, ako si ikako u mogucnosti, kreni malo sa WPF-om (i MVVM paternom). Jednom kada udjes u stos, mislim da ce ti se prilicno svideti :)
[ alfa-pro @ 16.01.2018. 20:07 ] @
Ok instalirao EF malo se prisetio jer sam zaboravio malo davno sam ga radio u kombinaciji sa ASP MVC-om.

Sada imam EF entitete Artikle, Dobavljace itd... DB-First!

Napravim jednu blanko formu kojoj cu kroz konstruktor da prosledjujem Artikle objekat na neki klik event? I na osnovu toga objekta da prikazujem listu rezultata?