Friday, 11 December 2009

WCSF po naše.....

Malo sem se igral, da vidimo ali lahko WCSF prilagodimo, našim željam. Na

CodeSnippetsAndTemplates\Microsoft Web Client Software Factory February 2008.zip

Sem objavil en zip, ki vsebuje popravke/posodobitve WCSFja. Vse kar je potrebno narediti je da si ta zip razpakirate v program files mapo, kjer je nameščen WCSF. Vse ostalo uporabljate kot sedaj.

Znani problemi....

Ponekod je potrebno dodati reference do microsoft....... in mogoče kje do PBRT4WCSF, ki pa se nahaja na TFS-ju v PBRT4Web\PBRT4Web\Infrastructure\PBRT4WCSF

Če pa še kdo najde kaj naj sporoči da preverimo.

Wednesday, 9 December 2009

ManyToOne - Hack; ( ko imamo več kot en "ključ" )


UPDATE : pri atributu KEY je potrebno dodati : Update = false

CODE :















1.) Uporabimo SET in nastavimo WHERE ; to je naš fiksni pogoj za join.

2.) Definiramo "primarni" ključ, kjer moramo eksplicitno navesti "pk" tabele za join (Column) in ime propertija, ki ga bomo uporabili za filter (PropertyRef).

3.) Definiramo OneToMany relacijo ( jup ... prav si prebral "One To MANY" in ne "Many To One" kot bi si mogoče želel :) )

4.) Public property in v get; s pomočjo Linq poizvedbe dobimo željen element.

Zadeva je "dirty-hack" ampak naredi to kar potrebujemo.

Thursday, 3 December 2009

Splošna polja BO

V BusinessBase sta bila dodana dva polja :

  • ActiveRecord; uporablja za beleženje aktivnosti posameznega zapisa [ mehko brisanje ]
  • Notes ; uporablja kot vnos opisa [ npr. v šifrantih je vedno polje OPIS ].

Oba propertija sta public tako, da večjih težav z implementacijo nebi smelo biti.

Monday, 22 June 2009

An item with the same key has already been added.

Problem ni bil v CSLA in Linq amapak v vsebini Liste. Vse je bilo podvojeno, ker je v BussinesBase objek prišel dvakrat in napolnil Listo poredovanj. Problem je bil rešen z if-om... žal.

Thursday, 21 May 2009

CSLADataSource vs. ObjectDataSource

ObjectDataSource podpira direktni bind na objekte, tudi CSLA s tem, da pričakuje tudi select, update in insert medote znotraj teh objektov. Parametri metod so že v naprej določeni, tako ima update lahko listo vrednosti ali objekt razreda, ki se tudi posodablja.
S tem načinom ni mogoče uporabiti Presenterja in nanjga vezano logiko zato je bolj sprejemljiva uporaba
CSLAdataSource, kjer preko metod SelectObject, UpdateObject in InsertObject bolje lahko nadzorujemo uporabo objektov in manipulacijo podatkov, caching, ViewState, ... Slaba stran je ta, da je potrebno uporabljati CSLA.DataMaper, ki pare Name-Value preslika v propertyje objekta in je potrebno paziti na pravilnost vnešenih podatkov.

primer:
IOView.aspx.cs
protected void CslaDataSourceInput_UpdateObject(object sender, Csla.Web.UpdateObjectArgs e)
{
_presenter.OnSave(e);
}
protected void CslaDataSourceInput_InsertObject(object sender, Csla.Web.InsertObjectArgs e)
{
_presenter.OnSave(e);
}

IOViewPresenter.cs
public void OnSave(Csla.Web.UpdateObjectArgs e)
{
Csla.Data.DataMapper.Map(e.Values, _wInput.Value);
_wInput.Value.Save();
_wInput.Value = WInput.NewEntity();
}

Wednesday, 20 May 2009

Povezava knjižnic iz različnih projektov

Implementirala se je opcija povezave objektov iz različnih knjižnic skupaj. Vse potrebne nastastavitve se opravijo v .config datoteki.

Dodamo novo sekcijo.

Ki jo potem uporabimo in se držimo strukture
Libreries, kjer so v seznamu vse knjižnice, ki bodo uporabljale objekte drugih knjižnic.
Add Name="xxxx"
Ko dodamo knjižnico ("Library"), dodamo pod njo še seznam knjižnic, od katerih bomo dedovali.
Add DependentLibrary="xxxx"
pri dedovani knjižnici še lahko uporabim schemo, ki jo uporabja, v primeru da se nahaja na drugi podatkovni bazi.
DataBaseSchema="xxx.dbo"

Primer:
Če ni primera v .config datoteki, potem mi javi ti ga bom posredoval. Ko bo dokončano b vključen tusi xsd za intelisens.


Tuesday, 12 May 2009

Windows [Templates ]- Complex Add form -

Na TFS sem naložil nove predloge za kompleksni vnos [ parent - child ].

Celoten sistem je zelo spremenjen ... saj predhodni sistem ni deloval 100% [ težave pri kreiranju več "workspace" objektov -- npr. želel si imeti odprti 2 formi za urejanje kontaktov ]
Nov sistem je nastavljen tako, da ob kreiranju vsake ChildForme nastavimo njen Parent --- tako dobimo dostop do njenih objektov izpostavljenih v vmesniku.


1. ) Parent forma implementira vmesnik IComplexForm

1.png


2. ) Child forma implementira vmesnik IComplexChildForm

2.png


Formi PartnerMaEdit in ContactMaEdit sta že bili spremenjeni --- za referenco !.


Lp,

Thursday, 23 April 2009

Lokalizacija DevExpress ASPxPerience (web komponent)

Postopek:

(1) Langugage resource datoteke (.resx) je potrebno skopirati iz direktorija, kjer imamo instalirane DevExpress komponente. Privzeto so instalirane v direktoriju

'C:\Program Files\Developer Express .NET vX.Y\Sources\DevExpress.Web.ASPxGlobalResources\'

v direktorij:

'~/App_GlobalResources/'

kjer se nahaja naša spletna aplikacija.

Posamezne kontrole imajo svoj pripadujoč resource file.

(2) Prevedemo polja v resx datotekah komponent, ki jih želimo lokalizirat in spremenimo ime datoteke v 'DevExpress_Web_vX_Y.sl.resx', kjer je .sl "cultrue code" glede na standard, ki se nahaja na naslovu:

http://download1.parallels.com/Sitebuilder/Windows/docs/4.5/en_US/sitebuilder-4.5-win-l10n-guide/index.htm?fileName=38330.htm

primer: DevExpress_Web_ASPxGridView_v9_1.sl.resx

Skopiramo prevedene in preimenovane datoteke v '~/App_GlobalResources/' direktorij naše spletne aplikacije, poleg datotek, ki smo jih skopirali v prvem koraku.

(3) V web.config vstavimo pod <system.web> </system.web> node naslednjo vrstico
<globalization culture="sl-SI" uiculture="sl">


Pri nekaterih vrednostih za cultrue je treba upoštevat tole:

http://support.microsoft.com/kb/939949

Tuesday, 21 April 2009

NHibernate - ANY

Podroben članek

Sometimes, well known associations just don’t cut it. We sometimes need to be able to go not to a single table, but to a collection of table. For example, let us say that an order can be paid using a credit card or a wire transfer. The data about those are stored in different tables, and even in the object model, there is no inheritance association them.

< any name="Payment" id-type="System.Int64" meta-type="System.String" cascade="all">
< meta-value value="CreditCard" class="CreditCardPayment"/>
< meta-value value="Wire" class="WirePayment"/>
< column name="PaymentType"/>
< column name="PaymentId"/>
< /any>

Monday, 20 April 2009

NHibernate - Join

Join - Podroben članek

On the face of it, it looks like a nice way to merge tables together, but that isn’t actually the primary reason for this feature. You can use it for that, for sure, but that is mostly useful in legacy databases. In most cases, your object model should be more granular than the database model, not the other way around.

The really interesting part about this feature is that it allows us to mix & match inheritance strategies. It let us create a table per hierarchy that store all the extra fields on another table, for example. That significantly reduce the disadvantage of using a table per hierarchy or table per subclass, since we can tell very easily what is the type of the class that we are using, and act appropriately.

< join
table="tablename" (1)
schema="owner" (2)
catalog="catalog" (3)
fetch="join|select" (4)
inverse="true|false" (5)
optional="true|false"> (6)
<
key ... />
< property ... />
< /join>


Tuesday, 14 April 2009

XML Komentraji in priprava projekta za dokumentiranje

Podroben članek o uporabi XML komentarjev v kodi in nastavitve projekta.

>> Članek


Osnovni in OBVEZNI elementi so
  • summary
  • remarks

V primeru daljšega opisa je priporočena uporaba tag-a param - kreiranje odstavkov.

NHibernate - Set

NHibernate - SET Mapping [članek ]

<set
name="propertyName" (1)
table="table_name" (2)
schema="schema_name" (3)
lazy="true|false" (4)
inverse="true|false" (5)
cascade="all|none|save-update|delete|all-delete-orphan" (6)
sort="unsorted|natural|comparatorClass" (7)
order-by="column_name asc|desc" (8)
where="arbitrary sql where condition" (9)
fetch="select|join|subselect" (10)
batch-size="N" (11)
access="field|property|ClassName" (12)
optimistic-lock="true|false" (13)
outer-join="auto|true|false" (14)
/>

<key .... />
<one-to-many .... />
>

Friday, 10 April 2009

NHibernate - Dedovanje

Kako implementiramo dedovanje.

Podroben članek

..

NHibernate - Many-To-One

Kako implementiramo relacijo many-to-one s pomočjo NHibernate.

Podroben članek



Definicija
<many-to-one
name="PropertyName" (1)
column="column_name" (2)
class="ClassName" (3)
cascade="all|none|save-update|delete" (4)
fetch="join|select" (5)
update="true|false" (6)
insert="true|false" (7)
property-ref="PropertyNameFromAssociatedClass" (8)
access="field|property|nosetter|ClassName" (9)
unique="true|false" (10)
optimistic-lock="true|false" (11)
not-found="ignore|exception" (12)
/>

Wednesday, 11 March 2009

Povezava Tabele na samo sebe.

V primeru da imamo povezavo objekta na samega sebe moramo pri polja, ki je ključ navesti v ime tujega ključa besedo "none". Ta nam ne ustvari tujega ključa na tabeli. primer:


 class name="xxxx" lazy="false" table="xxxx"
    set name="xxxSet" lazy="false" 
      key column="xxParent" foreign-key="none" 
      one-to-many class="xxxx" not-found="ignore" 
   set
 class

Thursday, 19 February 2009

Group By in dodatne SQL funkcije


Opis:
Kako uporabiti Group by ali podobne funkcije nad podatki, ki jih pozanamo iz SQL-a. (Sum, Count, max, min,.....). 

Rešitev:
Narediti moramo objekte, ki dedujejo od Analise in AnaliseList. Implementirati lastnosti, ki so potrebne na teh objektih uporabiti public konstruktor brez parametrov. Seznam polj katere bomo poterebovali iz podatkovne baze, ter javne lastnosti le teh. Enako kot na vseh ostalih PBBusinessBase objektih. AnaliseList je enak kot drugi List objekti, doda se samo implementacija kriterija, ki je opisana spodaj v primeru. Obvezna uporaba Transformer Objekta, ker nam takšen način uporabe kriterija vrne Array[], ki ga je potrebno transformirat. Za to poskrbi Transformer objekt, ki uporablja javne lastnosti objekta in javni konstruktor. Obvezno moramo poskrbeti da uporabimo Alias, ki je enak imenu lastnosti.

Primer:
var projections = Projections.ProjectionList()
                        .Add(Projections.Sum("Qty"),"Qty")
                        .Add(Projections.Max("ProductName"), "ProductName")
                        .Add(Projections.GroupProperty("ProductId"), "ProductId");                    
_iCriteria.SetMaxResults(5).AddOrder(Order.Desc("Qty"));_iCriteria.SetProjection(projections).SetResultTransformer(Transformers.AliasToBean(typeof(WOrderItemAnalise)));

Zadržki:


Vir:
http://japikse.blogspot.com/2009/02/using-projections-and-transformers-in.html

Monday, 16 February 2009

Brisanje zapisov [CSLA]

Remove,Contains, and ContainsDeleted
Collections that inherit from BusinessListBase automatically have Remove(), Contains(), and
ContainsDeleted() methods. Each of these accepts a reference to a child object as a parameter, and
often that is sufficient.
For this collection, however, it turns out that the UI code in Chapters 9 and 10 is much simpler
if it is possible to remove or check for a child object based on a resource Id property value rather
than a child object reference. To provide this capability, each of these three methods is overloaded
with a different implementation. For instance, here’s the Remove() method:
public void Remove(int resourceId)
{
foreach (ProjectResource res in this)
{
if (res.ResourceId == resourceId)
{
Remove(res);
break;
}
}
}

This method accepts the resourceId value as a parameter, and that value is used to locate the child
object (if any) in the collection. The Contains() and ContainsDeleted() overloads follow the same basic
approach.
Not all collections will need overloads of this type, but such overloads are often useful to simplify
the use of the collection and reduce code in the UI.

Wednesday, 28 January 2009

Authorization

Dodali smo možnost uporaba authorizacije nad posameznimi podatki. To vključimo tako, da uporabimo atributom Authorization nad PBBusinessbase in PBReadOnlyBase objektom. V polje DataRole na tabeli se bodo vpisovale podatkovne role. Podatkovne role, ki se bodo vpisovale v to polje nastavimo na posameznem uporabniku, tako da izberemo WriteDataRole. Do katerih podaktov pa lahko dostopamo pa nastavimo z izbiro ReadDataRole. Ponavadi sta obe izbrane vrednosti enaki. 

Saturday, 24 January 2009

Razširjanje obstoječih razredov FCLja

Z Extension methods, lahko obstoječe tipe framework class librarja razširimo, kot že ime pove s lastnimi user-defined metodami, brez dedovanja ali ponovnega kompajliranja.

Recimo, da potrebujemo na obstoječem tipu String novo metodo, ki bo preverila ali stanje objekta ustreza določemu pravilu. Lahko bi z regular expressions preverili ali je obstoječa vrednost objekta pravilen e-mail naslov ali ne.

V našem primeru bomo razširili tip String z metodo, ki bo preverila ali je vrednost palindrom.

Napišemo extensiom method takole:

1 public static class String
2 {
3 public static bool isPalindrome(this string s)
4 {
5 string result = string.Empty;
6 char[] charArray = s.ToCharArray();
7
8 for (int i = 0; i < s.Length; i++)
9 {
10 result = result + charArray[s.Length - (i + 1)];
11 }
12
13 if (s == result)
14 return true;
15 else
16 return false;
17 }
18 }


Lame implementacija palindrom-checker funkcije, če ve kdo boljšo naj pove :)

Za test naredimo array stringov in za vsak element v arraju pokličimo naš nov extension method isPalidrome()

1 var words = new string[] { "kaj", "ata", "bab", "bla", "radar" };
2
3 var foo = words.Select(x => x.isPalindrome());
4
5 foreach (bool b in foo)
6 Console.WriteLine(b);
Loop izpiše, F, T, T, F, T

Primer s preverjanjem stringa, če ustreza vzorcu veljavnega email naslova. User defined extension metode so lahko tudi v poljubnem razredu. Smotrno je, da imamo vse extension metode na enem mestu npr. v MyExtensions razredu. Če so splošno uporabne, lahko naredimo tudi code library(assembly) in ga vključimo v nadaljnje aplikacije, ki jih bomo razvijali.

1 public static class MyExtensions
2 {
3 public static bool IsValidEmailAddress(this string s)
4 {
5 Regex regex = new Regex(@"^[\w-\.]+@([\w-]+\.)+[\w-]{2,4}$");
6 return regex.IsMatch(s);
7 }
8 }

Preverjanje nove extension metode na listi stringov:

Action je delegat, ki kaže na anonimno metodo izraženo z lambda izrazom.
Na generični kolekciji uporabimo default extension metodo ForEach() in ji damo
za parameter delegat(pointer na anonimno metodo).

1 Action<string> email = e => Console.WriteLine(e.IsValidEmailAddress());
2
3 var emailList = new List<string>
4 {
5 "bla@bla",
6 "matjaz.curic@pro-bit.si",
7 "localhost",
8 "root@google.com.com.com.si"
9 };
10
11 emailList.ForEach(email);


Izpiše, F, T, F, T (Zadnji T verjetno ni vredu ... tako se je sparsal string na podlagi regular izraza, obstajajo tudi boljši pattern marcheri( za maile, ampak to zdaj ni tema ...).

Friday, 23 January 2009

Generične kolekcije, anonimne metode, lambda izrazi

Iz primera je razvidna priročnost anonimnih funkcij, gnezdenja funkcij (fluent interface) na generičnih kolekcijah.

Kadar predvidevamo, da bomo neko funkcijo uporabili samo enkrat, jo definiramo kar "in-line". Drugi funkciji lahko damo kot parameter funkcijo samo. Izrazno močen in eleganten način pisanja anonimih funkcij je s pomočjo lambda izrazov.

Primer:

Izpis kvadratov celih števil od 1 do 10

1 var squares = Enumerable.Range(0, 10).Select(x => x * x);
2
3 foreach (int num in squares)
4 {
5 Console.WriteLine(num);
6 }
7

Iz naslednjega primera bo še bolj razvidna moč fluent interface-a.

Primer:

Na množici celih števil od 1 do 10, izberimo podmnožico lihih števil razvrščene od največjega do namanjšega. Vsak element podmnožice korenimo s kvadratnim korenom. Ustvarimo močno tipizirano generično kolekcijo z novim anonimnim tipom, ki naj ima dva propertija, osnovo in kvadratni koren osnove.

Omenjeno transformacijo je možno naredit v eni vrstici, zaradi preglednosti je koda zapisana v "več" vrsticah.
var collection = Enumerable.Range(0, 10)
.Where(x
=> x % 2 != 0)
.Reverse()
.Select(x
=>
new
{ Original = x,
SquareRoot
= Math.Sqrt(x)
});


V parameter listi metode Select() smo na desni strani lambda izraza uporabili object initializer in s keywordom "new" ustvarili nov anonimni tip. Compiler v compile time-u v odzadju ustvari nov anonimni razred, njegovo definicijo pa izpelje(type inference) iz object initializerja.
Vsaka od generičnih metod na IEnumerable tipu vrne novo instanco enakega tipa, torej IEnumerable, zato je mogoče gnezditi izraze v "neskočnost" (pipelines of operations).

Primer iz PBRT4Lividature, kjer je bilo potrebno zgenerirat argumente za eksterni program za risanje grafov:

Na objektu List je bila uporabljena extension metoda ForEach, kateri sem dal za parameter anonimno funkcijo za obdelavo stringov.
1 var documentFlow = (List<Posta_referent>)p.ForwardedTo;
2
3 documentFlow.ForEach(refer =>
4 {
5 edge = edge + refer.Referent_posredoval + " -> " + refer.Referent + ";";
6 });

Torej kadar delamo operacije nad elementi v kolekcijah, pride prav obsoječi interface "extension" method, ki jih je microsoft dodal v tipe generičnih kolekcij. Anonimne metode ni potrebno več izražati z delegati, saj so na voljo lambda izrazi, s katerimi je možno definirati anonimne metode še bolj kompaktno.

Sprememba tipa polja na bazi

Če spremenimo tip polja, ki že obstaja na bazi, moramo polje zbrisati na podatkovni bazi, da bo avtomatska posodobitev polja delovala pravilno. V nasprotnem primeru upgrade podatkovne baze smatra da je polje že ustvarjeno in ga ne ustvari ponovno. NE PREVERJA TIPOV.

Monday, 19 January 2009

povezave na bazo

Ko kreiramo objekt moramo paziti na DatabaseKey property, ki je defniran v PBBussinesBase in PB ReadOnlyBussinesBase objektu. V primeru da ga pustimo nespremenjenega je pametno da uporabljamo Prefikse tabel glede na projekt za katerega gre, da bodo posamezne tabele ločene že s samim imenom. 

V nasprotnem primeru je potrebno prepisat property DatabaseKey, ki je definiran v dedovanem objektu. Vračati nam more ime datoteke, v kateri je zapisana povezava na podatkovno bazo. Uporabljati moramo imena datotek, ki so povezana z projektom, da ne bomo uporabljali iste podatkovne baze za dostop do različnih podatkov.

Z uporabo OldTable atributa, je obvezno spremeniti ime datoteke, ki dostopa do podatkovne baze.

Updgrade podatkovne baze

Pri Avtomatskem upgradu podatkovne baze je potrebno paziti na OldTable attribute, ker nam ena sama uporaba v eni knjižnici, izključi opcijo za celotno knjižnico. 

Takšne objekte navedemo ločenem projektu.

Friday, 16 January 2009

Naredimo Text polje na bazi.

Če želimo narediti text polje na podatkovni bazi mu moramo določiti tip in dolžino, kot je v primeru spodaj.

 [Property(Name = "Code", Column = "Code", Type = "AnsiString", Length = 10000)]


Monday, 12 January 2009

Uporaba Default Sheme


Pri kreiranju povezave na bazo, moramo uporabiti default shemo, če imamo vklopljeno NT avtentikacijo za dostop do baze. V nasprotnem primeru, bo avto upgrade kreiral tabele v namespacu od NT uporabnika. 


Monday, 5 January 2009

Osnovna Aplikacija

Na Y:\PBRT4\PBRT4_Base Je objavljena prva verzija prazne aplikacije. Vsebuje samo Administrativni del in povezavo na sistemsko bazo.

Zaporedje namestitve komponent

Zaporedje namestitev [za pravilno delovanje!]

1. Enterprise Library May 2007 [3.1]

2. Guidance Automation Extension

3. Guidance Automation Toolkit for VS 2008

4. Smart Client Software Factory [April]


Datoteke za namestitev se nahajajo na Y:\PBRT4\...

NHibernate Profiler

A Profiler For NHibernate? What’s The Point?

If you’re not very experienced with NHibernate, it’s not always clear what NHibernate is doing behind the scenes. What kind of queries is it generating? How many entities are we loading? How often does it go the database? Even experienced NHibernate users can make mistakes which may result in inefficient data access, high memory usage, slow response times, etc. When used properly however, you can get excellent performance out of NHibernate.

http://davybrion.com/blog/2009/01/nhibernate-profiler-review/