[C#] Filter toevoegen aan query

Pagina: 1
Acties:

Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Ik ben bezig met een CRM klanten portal, maar dit lukt nog niet echt.

Ik wil nu alleen de data van de klant laten zien ik krijg het nu wel voor mekaar om alle data te laten zien uit de CRM database maar nu wil ik gaan filteren op customerid als dit kan.
Of weet iemand een veel beter idee?

De volgende code gebruik ik om de gegevens te laten zien:
C#:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
// create a new query
QueryExpression query = new QueryExpression();
query.EntityName = "msa_object";

ColumnSet objCols = new ColumnSet();
objCols.AddColumns("msa_name", "msa_soort", "statuscode", "createdon");

query.ColumnSet = objCols;

// add a condition to only return active opportunities
ConditionExpression stateCondition = new ConditionExpression();
stateCondition.AttributeName = "statecode";
stateCondition.Operator = ConditionOperator.Equal;
stateCondition.Values = new object[] { 0 };

FilterExpression filter = new FilterExpression();
filter.FilterOperator = LogicalOperator.And;
filter.Conditions.Add(stateCondition);

query.Criteria.Filters.Add(filter);

// set the Query property on the EntityGrid control
this.objGrid.Query = query;

// set the url of the page you want to open when the record is double clicked
this.objGrid.RecordUrl = "EditObjects.aspx";

// define the columns you want to display in the grid
this.objGrid.Columns.Add(new DataColumn("msa_name"));
this.objGrid.Columns.Add(new DataColumn("msa_soort"));
this.objGrid.Columns.Add(new DataColumn("statuscode"));
this.objGrid.Columns.Add(new DataColumn("createdon"));


Ik hoop dat jullie me hierbij kunnen helpen.

Acties:
  • 0 Henk 'm!

  • RobIII
  • Registratie: December 2001
  • Niet online

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

(overleden)
Je hebt al een conditionexpression en een filterexpression; waarom zou het je niet lukken een tweede conditionexpression aan die filter toe te voegen? M.a.w.: Wat heb je al geprobeerd, wat lukt er niet en waarom denk je dat 't dan niet werkt?

Sterker: Als ik op die twee termen google is de eerste hit al wat je zoekt (even los van 't feit dat er nested filters en een OR en AND operator genest worden waar jij geen hiërarchie nodig hebt).

[ Voor 48% gewijzigd door RobIII op 06-11-2009 12:22 ]

There are only two hard problems in distributed systems: 2. Exactly-once delivery 1. Guaranteed order of messages 2. Exactly-once delivery.

Je eigen tweaker.me redirect

Over mij


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
RobIII schreef op vrijdag 06 november 2009 @ 12:17:
Je hebt al een conditionexpression en een filterexpression; waarom zou het je niet lukken een tweede conditionexpression aan die filter toe te voegen? M.a.w.: Wat heb je al geprobeerd, wat lukt er niet en waarom denk je dat 't dan niet werkt?

Sterker: Als ik op die twee termen google is de eerste hit al wat je zoekt (even los van 't feit dat er nested filters en een OR en AND operator genest worden waar jij geen hiërarchie nodig hebt).
Dat is een hele goede, ik heb wel zo iets geprobeerd maar waar ik niet uit kwam hoe ik het customerid kan op vragen en laten vergelijken zo dat alleen deze word weer gegeven.

Bij Cases gaat het wel goed maar daar word een andere code gebruikt door wat al aan geleverd is.
C#:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
private QueryBase GetFullUserQuery(String sortAttribute, OrderType sortDirection)
    {
        QueryExpression fullUserQuery = new QueryExpression();
        fullUserQuery.EntityName = EntityName.incident.ToString();
        fullUserQuery.ColumnSet = new ColumnSet(casesGrid.GetColumnFields().ToArray());
        fullUserQuery.Criteria = new FilterExpression();

        contact userContact = (contact)_crmService.Retrieve(EntityName.contact.ToString(), Profile.ContactId, new ColumnSet(new String[] { "parentcustomerid" }));

        FilterExpression filter = new FilterExpression();
        filter.FilterOperator = LogicalOperator.Or;

        if (userContact.parentcustomerid != null && userContact.parentcustomerid.type == EntityName.account.ToString())
        {
            List<Guid> siblingContactIds = new List<Guid>();

            QueryByAttribute siblingContactsQuery = new QueryByAttribute();
            siblingContactsQuery.EntityName = EntityName.contact.ToString();
            siblingContactsQuery.ColumnSet = new ColumnSet(new String[] { "contactid" });
            siblingContactsQuery.Attributes = new String[] { "parentcustomerid" };
            siblingContactsQuery.Values = new Object[] { userContact.parentcustomerid.Value };

            foreach (BusinessEntity entity in _crmService.RetrieveMultiple(siblingContactsQuery).BusinessEntities)
            {
                siblingContactIds.Add(((contact)entity).contactid.Value);
            }

            filter.Conditions.Add(new ConditionExpression("customerid", ConditionOperator.Equal, new Guid[] { userContact.parentcustomerid.Value }));
            filter.Conditions.Add(new ConditionExpression("customerid", ConditionOperator.In, siblingContactIds.ToArray()));
        }

        filter.Conditions.Add(new ConditionExpression("customerid", ConditionOperator.Equal, new Guid[] { Profile.ContactId }));
        fullUserQuery.Criteria.Filters.Add(filter);

Acties:
  • 0 Henk 'm!

  • RobIII
  • Registratie: December 2001
  • Niet online

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

(overleden)
Verwijderd schreef op vrijdag 06 november 2009 @ 12:31:
Bij Cases gaat het wel goed maar daar word een andere code gebruikt door wat al aan geleverd is.
C#:
1
2
3
4
5
6
7
8
9
10
11
12
13
        contact userContact = (contact)_crmService.Retrieve(EntityName.contact.ToString(), Profile.ContactId, new ColumnSet(new String[] { "parentcustomerid" }));

        FilterExpression filter = new FilterExpression();
        filter.FilterOperator = LogicalOperator.Or;

        if (userContact.parentcustomerid != null && userContact.parentcustomerid.type == EntityName.account.ToString())
        {
            filter.Conditions.Add(new ConditionExpression("customerid", ConditionOperator.Equal, new Guid[] { userContact.parentcustomerid.Value }));
            filter.Conditions.Add(new ConditionExpression("customerid", ConditionOperator.In, siblingContactIds.ToArray()));
        }

        filter.Conditions.Add(new ConditionExpression("customerid", ConditionOperator.Equal, new Guid[] { Profile.ContactId }));
        fullUserQuery.Criteria.Filters.Add(filter);
Hoe is dat anders? (Belangrijkste regels/hints heb ik laten staan). Ik zie daar (o.a.) gewoon een Profile.ContactId en userContact.parentcustomerid etc. gebruikt worden? Dus wat is je klant-object en heeft die niet gewoon een .ID of .CustomerID of whatever property?

[ Voor 7% gewijzigd door RobIII op 06-11-2009 12:38 ]

There are only two hard problems in distributed systems: 2. Exactly-once delivery 1. Guaranteed order of messages 2. Exactly-once delivery.

Je eigen tweaker.me redirect

Over mij


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
ok allereerst bedank tot zo ver ik heb heel weinig programmeer ervaring meer met php dan met C# nu is mijn vraag wat moet ik bij de vraag tekens in vullen daar kom ik niet echt uit ik denk dat de rest wel goed is.

C#:
1
2
3
4
5
6
7
8
9
10
11
12
13
ConditionExpression stateCondition = new ConditionExpression();
        stateCondition.AttributeName = "statecode";
        stateCondition.Operator = ConditionOperator.Equal;
        stateCondition.Values = new object[] { 0 };

        ConditionExpression condition2 = new ConditionExpression();
        condition2.AttributeName = "customerid";
        condition2.Operator = ConditionOperator.Equal;
        condition2.Values = new string[] { ???? }; 

        FilterExpression filter = new FilterExpression();
        filter.FilterOperator = LogicalOperator.And;
        filter.Conditions.Add(stateCondition, condition2);

Acties:
  • 0 Henk 'm!

  • Haan
  • Registratie: Februari 2004
  • Laatst online: 09:24

Haan

dotnetter

Verwijderd schreef op vrijdag 06 november 2009 @ 13:04:
ok allereerst bedank tot zo ver ik heb heel weinig programmeer ervaring meer met php dan met C# nu is mijn vraag wat moet ik bij de vraag tekens in vullen daar kom ik niet echt uit ik denk dat de rest wel goed is.

C#:
1
2
3
4
5
6
7
8
9
10
11
12
13
ConditionExpression stateCondition = new ConditionExpression();
        stateCondition.AttributeName = "statecode";
        stateCondition.Operator = ConditionOperator.Equal;
        stateCondition.Values = new object[] { 0 };

        ConditionExpression condition2 = new ConditionExpression();
        condition2.AttributeName = "customerid";
        condition2.Operator = ConditionOperator.Equal;
        condition2.Values = new string[] { ???? }; 

        FilterExpression filter = new FilterExpression();
        filter.FilterOperator = LogicalOperator.And;
        filter.Conditions.Add(stateCondition, condition2);
Op de plek van de vraagtekens zul je een GUID moeten zetten van een customer record. Ik betwijfel overigens of je die Values array als string moet definiëren.

Dat moet inderdaad niet zo en staat ook gewoon in je eerdere voorbeeldcode:
C#:
1
2
3
4
5
6
7
8
9
10
filter.Conditions.Add(new ConditionExpression("customerid", ConditionOperator.Equal, new Guid[] { userContact.parentcustomerid.Value }));

//ofwel dit als je het volledig uitschrijft en niet gebruik maakt van 
// de constructor die ze hierboven gebruiken
ConditionExpression condition = new ConditionExpression();
condition.AttributeName = "customerid";
condition.Operator = ConditionOperator.Equal;
condition.Values = new Guid [] { userContact.parentcustomerid.Value };

filter.Condition.Add(condition);

[ Voor 20% gewijzigd door Haan op 06-11-2009 13:21 ]

Kater? Eerst water, de rest komt later


Acties:
  • 0 Henk 'm!

  • jip_86
  • Registratie: Juli 2004
  • Laatst online: 17-09 15:19
Zo te zien vermoed ik het customerid waar je op wilt zoeken.

Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
jip_86 schreef op vrijdag 06 november 2009 @ 13:16:
Zo te zien vermoed ik het customerid waar je op wilt zoeken.
Ik wil bij die vraagtekens eigenlijk een variable hebben staan die ik van te voren heb gevult met de guid vande klant.

en volgens mij heb ik een fout gemaakt in de code die ik had genoemt maar ik weet niet waarom ik deze foutmelding krijg als ik dit namelijk met alleen de stateCondition probeer gaat het wel goed. volgende foutmelding bij de volgende code
Foutmelding:CS1501: No overload for method 'Add' takes '2' arguments
C#:
1
 filter.Conditions.Add(stateCondition, condition2);

Acties:
  • 0 Henk 'm!

  • Haan
  • Registratie: Februari 2004
  • Laatst online: 09:24

Haan

dotnetter

Verwijderd schreef op vrijdag 06 november 2009 @ 13:38:
[...]


Ik wil bij die vraagtekens eigenlijk een variable hebben staan die ik van te voren heb gevult met de guid vande klant.

en volgens mij heb ik een fout gemaakt in de code die ik had genoemt maar ik weet niet waarom ik deze foutmelding krijg als ik dit namelijk met alleen de stateCondition probeer gaat het wel goed. volgende foutmelding bij de volgende code
Foutmelding:CS1501: No overload for method 'Add' takes '2' arguments
C#:
1
 filter.Conditions.Add(stateCondition, condition2);
Er mist inderdaad nogal wat basic programmeerkennis.
Je zou moeten kunnen zien dat Conditions gewoon een ArrayList is, en dat je de Add methode van een ArrayList kan gebruiken om 1 object aan de ArrayList toe te voegen. Voor ieder object dat je toe wilt voegen moet je dus een regel schrijven.
C#:
1
2
filter.Conditions.Add(stateCondition);
filter.Conditions.Add(condition2);

:9~

Kater? Eerst water, de rest komt later


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Haan schreef op vrijdag 06 november 2009 @ 14:15:
[...]

Er mist inderdaad nogal wat basic programmeerkennis.
Je zou moeten kunnen zien dat Conditions gewoon een ArrayList is, en dat je de Add methode van een ArrayList kan gebruiken om 1 object aan de ArrayList toe te voegen. Voor ieder object dat je toe wilt voegen moet je dus een regel schrijven.
C#:
1
2
filter.Conditions.Add(stateCondition);
filter.Conditions.Add(condition2);

:9~
Dat klopt helemaal als ik gewoon wat beter naar de foutmelding had gekeken, denk dat ik inderdaad heel wat kennis mis. Dit werk op zich goed alleen vraag ik me af hoe ik die variable kan vullen als ik de guid handmatig in vul laat die het goed van de klant zien maar hoe kan ik deze customerid automatisch vullen of ophalen van het juiste account?

Acties:
  • 0 Henk 'm!

  • Haan
  • Registratie: Februari 2004
  • Laatst online: 09:24

Haan

dotnetter

Verwijderd schreef op vrijdag 06 november 2009 @ 15:03:
[..]
Dit werkt op zich goed alleen vraag ik me af hoe ik die variabele kan vullen als ik de guid handmatig in vul laat die het goed van de klant zien maar hoe kan ik deze customerid automatisch vullen of ophalen van het juiste account?
Dat is niet te zeggen zonder verder de context te weten van waaruit je werkt.. Je zal ergens een account object vandaan moeten halen, en daar het accountid van gebruiken.

Kater? Eerst water, de rest komt later


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Haan schreef op vrijdag 06 november 2009 @ 15:33:
[...]

Dat is niet te zeggen zonder verder de context te weten van waaruit je werkt.. Je zal ergens een account object vandaan moeten halen, en daar het accountid van gebruiken.
Klopt bij een de acses word er deze code gebruikt
C#:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
private QueryBase GetFullUserQuery(String sortAttribute, OrderType sortDirection) 
    { 
        QueryExpression fullUserQuery = new QueryExpression(); 
        fullUserQuery.EntityName = EntityName.incident.ToString(); 
        fullUserQuery.ColumnSet = new ColumnSet(casesGrid.GetColumnFields().ToArray()); 
        fullUserQuery.Criteria = new FilterExpression(); 

        contact userContact = (contact)_crmService.Retrieve(EntityName.contact.ToString(), Profile.ContactId, new ColumnSet(new String[] { "parentcustomerid" })); 

        FilterExpression filter = new FilterExpression(); 
        filter.FilterOperator = LogicalOperator.Or; 

        if (userContact.parentcustomerid != null && userContact.parentcustomerid.type == EntityName.account.ToString()) 
        { 
            List<Guid> siblingContactIds = new List<Guid>(); 

            QueryByAttribute siblingContactsQuery = new QueryByAttribute(); 
            siblingContactsQuery.EntityName = EntityName.contact.ToString(); 
            siblingContactsQuery.ColumnSet = new ColumnSet(new String[] { "contactid" }); 
            siblingContactsQuery.Attributes = new String[] { "parentcustomerid" }; 
            siblingContactsQuery.Values = new Object[] { userContact.parentcustomerid.Value }; 

            foreach (BusinessEntity entity in _crmService.RetrieveMultiple(siblingContactsQuery).BusinessEntities) 
            { 
                siblingContactIds.Add(((contact)entity).contactid.Value); 
            } 

            filter.Conditions.Add(new ConditionExpression("customerid", ConditionOperator.Equal, new Guid[] { userContact.parentcustomerid.Value })); 
            filter.Conditions.Add(new ConditionExpression("customerid", ConditionOperator.In, siblingContactIds.ToArray())); 
        } 

        filter.Conditions.Add(new ConditionExpression("customerid", ConditionOperator.Equal, new Guid[] { Profile.ContactId })); 
        fullUserQuery.Criteria.Filters.Add(filter);


Kan ik hier iets uit gebruiken maakt dit het iets duidelijker, ik haal eigenlijk gegevens van uit crm het liefste heb wil ik graag dat het op customerid gaat maar ik weet niet of dat wel gaat lukken maar met jullie hulp vast wel !!!

Acties:
  • 0 Henk 'm!

  • Woy
  • Registratie: April 2000
  • Niet online

Woy

Moderator Devschuur®
Volgens mij is regel 32 een exact voorbeeld van wat je wil doen :?

“Build a man a fire, and he'll be warm for a day. Set a man on fire, and he'll be warm for the rest of his life.”


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Woy schreef op vrijdag 06 november 2009 @ 15:53:
Volgens mij is regel 32 een exact voorbeeld van wat je wil doen :?
Dan zou ik de volgende code krijgen?? of doe ik hier iets verkeerd?
Hierop krijg ik een fout dat "System.Web.Services.Protocols.SoapException: Server was unable to process request." lijkt er op dat die niet met die regel overweg kan als ik deze als comment neer zet gaat het wel goed maar word hij het nog niet automatisch. bij elke user weergegeven
C#:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
 ConditionExpression stateCondition = new ConditionExpression();
        stateCondition.AttributeName = "statecode";
        stateCondition.Operator = ConditionOperator.Equal;
        stateCondition.Values = new object[] { 0 };

        ConditionExpression condition2 = new ConditionExpression();
        condition2.AttributeName = "msa_bedrijf_objectid";
        condition2.Operator = ConditionOperator.Equal;
        condition2.Values = new string[] { "b0b475ea-42c5-de11-8bf0-0003ff6efd87" }; 


        FilterExpression filter = new FilterExpression();
        filter.FilterOperator = LogicalOperator.And;
        filter.Conditions.Add(stateCondition);
        filter.Conditions.Add(condition2);
        filter.Conditions.Add(new ConditionExpression("customerid", ConditionOperator.Equal, new Guid[] { Profile.ContactId }));  
      

Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Ik denk dat het organisatieid ergens op te vragen moet zijn wat bij dit account hoort ik zou alleen niet weten waar ik dit kan op vragen heeft iemand een idee groot deel van de code heb ik vancodeplex vandaan.
En ik denk dat het vrij makkelijk is omdat de cases ook gesorteerd word op organisatie hierbij werkt het dus wel. dat elke gebruiker de cases ziet die onder het bedrijf hangen.

Kan iemand mij zeggen welke stuk van de code ik voor een andere pagina kan gebruiken zodat die alleen de gegevens laat zien van de organisatie van de gebruiker of hoe ik dit het beste kan doen doen.


Snip.....

[ Voor 79% gewijzigd door Woy op 09-11-2009 15:04 ]


Acties:
  • 0 Henk 'm!

  • Woy
  • Registratie: April 2000
  • Niet online

Woy

Moderator Devschuur®
Het is dus niet de bedoeling dat we jou aan het handje gaan houden om je probleem op te lossen. Je kunt zelf natuurlijk perfect in de documentatie/code kijken welke gegevens je beschikbaar hebt, en hoe je dat moet vertalen naar de gegevens die je wil hebben.

Wat heb je zelf nou allemaal al gezocht? Ik heb het idee dat je code van codeplex gepakt hebt, en nu een beetje aan het knippen plakken bent. Het is hier in PRG de bedoeling dat je zelf moeite doet om een probleem op te lossen, als het dan niet wil lukken dan kunnen we je hier best helpen. Maar dan verwachten we wel dat je uitgebreid verteld wat je allemaal al geprobeerd/gezocht hebt, en wat daar niet mee wilde lukken.

Ook is het dus niet de bedoeling dat je maar een stuk code plaatst, en dat wij hier uit moeten gaan zoeken welke regel(s) je kunt hergebruiken. Stukjes code dienen alleen om duidelijkheid te verschaffen van wat je al gedaan hebt, maar we hebben hier dus geen zin om hele lappen code door te gaan lezen.

In je vorige topic had ik ook al een link geplaatst naar wat documentatie die ik zo snel kon vinden ( http://msdn.microsoft.com/en-us/library/dd903922.aspx ). Ik heb verder nog nooit met die software gewerkt, maar als ik er al informatie over kan vinden, dan moet jij dat ook kunnen.

[ Voor 12% gewijzigd door Woy op 09-11-2009 15:09 ]

“Build a man a fire, and he'll be warm for a day. Set a man on fire, and he'll be warm for the rest of his life.”


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Je hebt helemaal gelijk dat je dat zegt.

Volgende heb ik geprobeerd:
1. Uitgetest of ik op guid kon filteren met de ConditionExpression.
2. In de crm structuur gekeken hoe de koppelingen staan naar accountid's en gekeken of ik deze kon ophalen en kon laten vergelijken zo dat er een juist id uit komt.
3. Ik had gedacht dat het net zo als bij php zo was dat er gewoon ergens een sessie aan gemaakt werd als de gebruiker inlogt en dat ik daar gegevens op kon halen door middel van een soort GET command. dit heb ik proberen uit te zoeken maar C# is heel warrig voor mij. Zit nu al 2 weken op dit probleem te turen en te googlen zelfs een boek gekocht visual C# 2008 de basis maar daarmee kwam ik ook niet echt verder.
Toen heb ik maar even dit topic gestart in de hoop dat iemand meer ervaring had met deze programmatuur en C#.

Het enige wat ik eigenlijk wil doen is de organisatie ophalen uit een sessie van de gebruiker of dergelijke, maar ik weet gewoon niet meer waar ik moet gaan zoeken.
Dus als iemand een aanknoop punt heeft die denk waar ik kan zoeken dan kan ik weer verder knutselen.

Acties:
  • 0 Henk 'm!

  • RobIII
  • Registratie: December 2001
  • Niet online

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

(overleden)
Verwijderd schreef op maandag 09 november 2009 @ 16:08:
Volgende heb ik geprobeerd:
1. Uitgetest of ik op guid kon filteren met de ConditionExpression.
En? Wat kwam daar uit? Lukte het?
Verwijderd schreef op maandag 09 november 2009 @ 16:08:
2. In de crm structuur gekeken hoe de koppelingen staan naar accountid's en gekeken of ik deze kon ophalen en kon laten vergelijken zo dat er een juist id uit komt.
En? Wat kwam daar uit?
Verwijderd schreef op maandag 09 november 2009 @ 16:08:
3. Ik had gedacht dat het net zo als bij php zo was dat er gewoon ergens een sessie aan gemaakt werd als de gebruiker inlogt en dat ik daar gegevens op kon halen door middel van een soort GET command.
Er zal vast een "sessie" of iets dergelijks zijn; of die bevat wat je wil/zoekt is natuurlijk een tweede. Dus: wat waren je bevindingen?
Verwijderd schreef op maandag 09 november 2009 @ 16:08:
dit heb ik proberen uit te zoeken maar C# is heel warrig voor mij
Dan neem je een C# tutorial door?
Verwijderd schreef op maandag 09 november 2009 @ 16:08:
Zit nu al 2 weken op dit probleem te turen en te googlen zelfs een boek gekocht visual C# 2008 de basis maar daarmee kwam ik ook niet echt verder.
Je hebt dus de basis van C# onder de knie? Waarom is 't dan nog "warrig" voor je?
Verwijderd schreef op maandag 09 november 2009 @ 16:08:
Dus als iemand een aanknoop punt heeft die denk waar ik kan zoeken dan kan ik weer verder knutselen.
Er staat toch genoeg in dit topic :? En zo niet: wat is je concrete vraag nou dan?

Met andere woorden: je zegt een heleboel, maar eigenlijk zeg je, nofi, helemaal niks.

There are only two hard problems in distributed systems: 2. Exactly-once delivery 1. Guaranteed order of messages 2. Exactly-once delivery.

Je eigen tweaker.me redirect

Over mij


Acties:
  • 0 Henk 'm!

  • Haan
  • Registratie: Februari 2004
  • Laatst online: 09:24

Haan

dotnetter

Probeer het anders ook eens hier: http://social.microsoft.c...US/crmdevelopment/threads
Daar lopen de mensen rond die alles van Dynamics CRM weten :)

En als je nog een boek zoekt over programmeren voor Dynamics CRM, is dit boek een absolute must-have!

Kater? Eerst water, de rest komt later


Acties:
  • 0 Henk 'm!

  • Alex)
  • Registratie: Juni 2003
  • Laatst online: 21-08 11:20
Deze code werkt bij mij perfect:
C#:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
// Filteren op statecode 0
ConditionExpression stateCode = new ConditionExpression();
stateCode.AttributeName = "statecode";
stateCode.Operator = ConditionOperator.Equal;
stateCode.Values = new object[] { 0 };

// Filteren op GUID
ConditionExpression accountId = new ConditionExpression();
accountId.AttributeName = "accountid";
accountId.Operator = ConditionOperator.Equal;
accountId.Values = new string[] { "{E2A49062-FC9A-DE11-8C82-000C29AFADB9}" };

// Beide voorwaarden aan elkaar lijmen
FilterExpression filter = new FilterExpression();
filter.Conditions = new ConditionExpression[] { stateCode, accountId };
filter.FilterOperator = LogicalOperator.And;

// QueryExpression
QueryExpression getAccount = new QueryExpression();
getAccount.EntityName = EntityName.account.ToString();
getAccount.Criteria = filter;
getAccount.ColumnSet = new AllColumns();


Al zijn die CRM-queries wel enorm omslachtig... maar FetchXML is nou ook niet ideaal te noemen :Z

Als je .NET 3.5 gebruikt kun je misschien kijken naar LinqToCRM, een Linq-provider voor Dynamics CRM. Is gratis, maar stelt je in staat om SQL-achtige queries los te laten op CRM. Erg handig :)

[ Voor 10% gewijzigd door Alex) op 09-11-2009 21:23 ]

We are shaping the future


Acties:
  • 0 Henk 'm!

  • MrBucket
  • Registratie: Juli 2003
  • Laatst online: 29-10-2022
Alex) schreef op maandag 09 november 2009 @ 21:18:
Deze code werkt bij mij perfect:
C#:
1
/* knip */


Al zijn die CRM-queries wel enorm omslachtig... maar FetchXML is nou ook niet ideaal te noemen :Z
Ik zou de topicstarter adviseren om jouw voorbeeld te gebruiken als basis waarop hij zijn eigen CRM query zou moeten kunnen schrijven.
Als je .NET 3.5 gebruikt kun je misschien kijken naar LinqToCRM, een Linq-provider voor Dynamics CRM. Is gratis, maar stelt je in staat om SQL-achtige queries los te laten op CRM. Erg handig :)
Nou, zoals hier al wordt gesuggereerd:
Haan schreef op vrijdag 06 november 2009 @ 14:15:
Er mist inderdaad nogal wat basic programmeerkennis.
...lijkt me dat niet the way to go ;) Eigenlijk zou de topicstarter eerst een fatsoenlijke C#-basis moeten hebben voordat hij probeert CRM queries in elkaar te klussen, maar ja... Nu weet je niet goed hoe je zo'n query moet samenstellen, en als je een foutmelding krijgt, dan is het verdomd lastig deze te ontcijferen zonder wat basiskennis.

Best haalbare alternatief tot die tijd is bestaande voorbeelden stukje bij beetje proberen om te klussen naar hetgeen wat je wilt hebben. Denk ik dan.

Acties:
  • 0 Henk 'm!

  • Alex)
  • Registratie: Juni 2003
  • Laatst online: 21-08 11:20
De CRM-errormessages zijn wat dat betreft ook wel vaag... als je meer informatie wilt hebben over wat er nou misgaat, moet je niet kijken naar de Message van de SoapException die je krijgt, maar moet je in die SoapException kijken naar de InnerText van Detail. Daar staat dan weer een stukje XML in wat de werkelijke errormessage bevat...

We are shaping the future


Acties:
  • 0 Henk 'm!

  • MrBucket
  • Registratie: Juli 2003
  • Laatst online: 29-10-2022
Alex) schreef op maandag 09 november 2009 @ 21:53:
De CRM-errormessages zijn wat dat betreft ook wel vaag... als je meer informatie wilt hebben over wat er nou misgaat, moet je niet kijken naar de Message van de SoapException die je krijgt, maar moet je in die SoapException kijken naar de InnerText van Detail. Daar staat dan weer een stukje XML in wat de werkelijke errormessage bevat...
Maar het is wel praktisch om te weten dat als je een foutmelding krijgt, dat het dan in ieder geval niet komt omdat je een array wilt meegeven op de plaats waar een enkel argument wordt verwacht. Of hoe je een constante binnen een conditie vervangt door een methode parameter van het juiste type.

En ja, de MS CRM foutmeldingen zijn cryptisch. Maar met wat C# kennis weet je in ieder geval hoe je de QueryExpression zodanig kunt herschrijven zodat een of meer condities komen te vervallen, en je kunt controleren of de expressie dan wel werkt :)

Trouwens, nog een praktische development tip: schakel tracing in

Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Na veel programmeren op papier deze dagen heb ik de oplossing namelijk deze 2 tal rollen aan de website toegevoegt met daarbij 2 query's de gene waar het om ging is de gene die genoemt is hieronder in de code.

Mijn excusus voor de vage omschrijvingen daar ben ik altijd zo slecht in
Erg bedank voor deze links die zijn erg nuttig geweest.
De volgende code zal wel niet helemaal optimaal zijn maar het werkt.

C#:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
private QueryBase GetFullUserQuery(String sortAttribute, OrderType sortDirection)
    {
        QueryExpression fullUserQuery = new QueryExpression();
        fullUserQuery.EntityName = "msa_object";
        fullUserQuery.ColumnSet = new ColumnSet(objGrid.GetColumnFields().ToArray());
        fullUserQuery.Criteria = new FilterExpression();
        
        string _statecode = "statecode";

        contact userContact = (contact)_crmService.Retrieve(EntityName.contact.ToString(), Profile.ContactId, new ColumnSet(new String[] { "parentcustomerid" }));

        FilterExpression filter = new FilterExpression();
        filter.FilterOperator = LogicalOperator.Or;

        if (userContact.parentcustomerid != null && userContact.parentcustomerid.type == EntityName.account.ToString())
        {
            List<Guid> siblingContactIds = new List<Guid>();

            QueryByAttribute siblingContactsQuery = new QueryByAttribute();
            siblingContactsQuery.EntityName = EntityName.contact.ToString();
            siblingContactsQuery.ColumnSet = new ColumnSet(new String[] { "contactid" });
            siblingContactsQuery.Attributes = new String[] { "parentcustomerid" };
            siblingContactsQuery.Values = new Object[] { userContact.parentcustomerid.Value };

            foreach (BusinessEntity entity in _crmService.RetrieveMultiple(siblingContactsQuery).BusinessEntities)
            {
                siblingContactIds.Add(((contact)entity).contactid.Value);
            }

            filter.Conditions.Add(new ConditionExpression("msa_bedrijf_objectid", ConditionOperator.Equal, new Guid[] { userContact.parentcustomerid.Value }));
            filter.Conditions.Add(new ConditionExpression("msa_bedrijf_objectid", ConditionOperator.In, siblingContactIds.ToArray()));
        }

        filter.Conditions.Add(new ConditionExpression("msa_bedrijf_objectid", ConditionOperator.Equal, new Guid[] { Profile.ContactId }));

        FilterExpression filer2 = new FilterExpression();
        filer2.FilterOperator = LogicalOperator.Or;

        ConditionExpression stateCondition = new ConditionExpression();
        stateCondition.AttributeName = _statecode;
        stateCondition.Operator = ConditionOperator.Equal;
        stateCondition.Values = new object[] { 0 };

        filer2.Conditions.Add(stateCondition);

        fullUserQuery.Criteria.Filters.Add(filter);
        fullUserQuery.Criteria.Filters.Add(filer2);

        

       if (!String.IsNullOrEmpty(sortAttribute))
        {
            fullUserQuery.Orders.Add(new OrderExpression(sortAttribute, sortDirection));
        }

        return fullUserQuery;
    }

Acties:
  • 0 Henk 'm!

  • Haan
  • Registratie: Februari 2004
  • Laatst online: 09:24

Haan

dotnetter

Alex) schreef op maandag 09 november 2009 @ 21:18:
Deze code werkt bij mij perfect:
C#:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
// Filteren op statecode 0
ConditionExpression stateCode = new ConditionExpression();
stateCode.AttributeName = "statecode";
stateCode.Operator = ConditionOperator.Equal;
stateCode.Values = new object[] { 0 };

// Filteren op GUID
ConditionExpression accountId = new ConditionExpression();
accountId.AttributeName = "accountid";
accountId.Operator = ConditionOperator.Equal;
accountId.Values = new string[] { "{E2A49062-FC9A-DE11-8C82-000C29AFADB9}" };

// Beide voorwaarden aan elkaar lijmen
FilterExpression filter = new FilterExpression();
filter.Conditions = new ConditionExpression[] { stateCode, accountId };
filter.FilterOperator = LogicalOperator.And;

// QueryExpression
QueryExpression getAccount = new QueryExpression();
getAccount.EntityName = EntityName.account.ToString();
getAccount.Criteria = filter;
getAccount.ColumnSet = new AllColumns();


Al zijn die CRM-queries wel enorm omslachtig... maar FetchXML is nou ook niet ideaal te noemen :Z

Als je .NET 3.5 gebruikt kun je misschien kijken naar LinqToCRM, een Linq-provider voor Dynamics CRM. Is gratis, maar stelt je in staat om SQL-achtige queries los te laten op CRM. Erg handig :)
Als je wat vaker dingen doet met CRM-queries schrijf je daar wat omheen zodat je bijv. gewoon dit kan doen:
C#:
1
BusinessEntityCollection collection = QueryHelper.RetrieveMultiple("account", new string[] {"statecode", "accountid"}, new object[] { 0, "{E2A49062-FC9A-DE11-8C82-000C29AFADB9}");

O-)

Kater? Eerst water, de rest komt later


Acties:
  • 0 Henk 'm!

  • Alex)
  • Registratie: Juni 2003
  • Laatst online: 21-08 11:20
Uiteraard, bij het laatste CRM-project wat ik gedaan heb hadden we zulke dingen ook. Maar TS heeft er niet veel aan als ik hem alleen die aanroep geef (:+)

We are shaping the future

Pagina: 1