Bonjour a tous,
Longue hésitation avant de poster ce 1er post, j'aime bien fouiller le net pour trouver les solutions mais la je suis en échec sur ce bout de code depuis trop longtemps alors je demande un peu d'aide.
Merci d'avance a tous ceux qui pourront me filer un coup de main.
J'ai une Bdd SQL server (local) avec une seul table composé d'une colonne "reponse" (string) et de X colonnes composé de 1 ou de 0 (byte).
Je souhaite obtenir la somme de chaque colonne puis déterminer avec un petit trie ou une comparaison (sorte d'algo), la somme la plus proche d'une valeur déterminer à l'avance.
Pour l’accès a la BDD j'ai essayer pas mal de choses: entity to SQL, to Object, to Entity, avec ou sans lambda , LinQ dynamic bref je suis pas chauvin :) . Les entities, Ienumerateur, obejectcontext reste des notions très flou pour moi alors je les ai toutes tester avec plus ou moins de succès mais jusque la je travailler exclusivement dans le code. Je me lance dans la création de méthode et je suis en misère.
Autre soucis, ancien adepte du php je me lance dans le c# et essayer de réfléchir en php puis de le traduire en c# est une mauvaise manière de réfléchir mais c'est dur de racrocher :).
Je vous donne mon code C# et celui en php qui fonctionne très bien au cas ou mes explications ne seraient pas assez claires.
voila pour le code.Code:
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
58
59
60
61
62
63
64
65
66
67
68
69 using System; using System.Collections.Generic; using System.Linq; using System.Data; using System.Data.Entity; using System.Web; using System.Web.UI; using System.Web.UI.WebControls; using System.Data.Entity.Core.Objects; using System.Data.Entity.Core.Objects.DataClasses; using DiaDocV1.App_Data; using System.Text; using System.Globalization; using System.Data.SqlClient; using System.Data.Common; using System.Data.Entity.Core.EntityClient; using System.Linq.Dynamic; namespace Dadidou { public partial class pagetestEF : System.Web.UI.Page { public partial class effet // La méthode qui doit me renvoyer le nom de la colonne dont la somme est la plus proche d'une valeur determiné { public double bidu; // la variable qui stock cette somme public string Name; // nom de la colonne public int Somme; // somme de la colonne public effet() { using (var db = new DiagEntities()) // appel de mon fichier edmx qui contiens les info de la bdd "DiagTab" { effet[] pets = { new effet {Name= "sumvivant", Somme= db.DiagTabs.Sum(p => p.Vivant)}, //4 - 5,5 new effet {Name="sumpetit", Somme= db.DiagTabs.Sum(p => p.Petit)}, //13 -3,5 new effet {Name="summanger", Somme= db.DiagTabs.Sum(p => p.Manger)}, //3 - 6,5 new effet {Name="sumbricolage", Somme= db.DiagTabs.Sum(p => p.Bricolage) }, //6 - 3,5 new effet {Name="sumeanimal", Somme=db.DiagTabs.Sum(c => c.Animal) }, //3 -6,5 new effet {Name="sumcuisine", Somme=db.DiagTabs.Sum(c => c.Cuisine) }, //4 5,5 new effet {Name="sumefeminin", Somme=db.DiagTabs.Sum(c => c.Feminin) }, //13 - 3,5 new effet {Name="sumtienmain", Somme=db.DiagTabs.Sum(c => c.Tienmain) }, //11 - 1,5 new effet {Name="sumbureau", Somme=db.DiagTabs.Sum(c => c.Bureau) } //3 -6,5 }; foreach (effet item in pets) // j'ai choisi comme valeur a s'approcher pour linstant "9,5" { double[] boubou = new[] { Math.Abs(9.5 - item.Somme) }; // création d'un tableau qui récupère en valeur absolue l'écart par rapport à 9,5 double ValeurMax = boubou[0]; // on initialise, pour linstant VarMax égal a valeur de boubou[0] for (int i = 0; i < boubou.Length; i++) { if (boubou[i] < ValeurMax) { ValeurMax = boubou[i]; } double bidu = ValeurMax; } } } } } protected void Page_Load(object sender, EventArgs e) // a la suite ma class http qui va afficher des truc sur ma page web { effet toto = new effet(); // appel de la class effet Tata5.Text = toto.bidu(); // requete qui doit me renvoyer... je sais plus vraiment quoi, la valeur? l'item, bref c'est faux...
- Bon l'algo ne va pas. Est-ce qu'un tri des valeurs absolue dans une liste type "enumerator" et la selection du dernier "Last" ne serait pas plus judicieux? J'ai essayer mais je n'arrive pas à récuperer ensuite le nom de la variable qui va bien...
- La méthode est aussi foireuse, j'ai tenté un Out in bidu mais sans grand succés
-la récupération de la requêtes ensuite pour l'afficher (ou en faire autre choses) n'est pas bonne non plus mais comme le reste ne fonctionne pas difficile de l'évaluer (exeption overflow).
Voila si vous pouvez m'aider sur un de ces 3 points ou même les 3 ça serait vraiment sympas.
Si ça peut aider j'ai refait le truc en php qui marche lui a la perfection , voici le code :
Encore une fois merci de votre aideCode:
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 <?php $req = $bdd->prepare('SELECT SUM(c_vivant) AS sum_vivant, SUM(Petit) AS sum_petit, SUM(manger) AS sum_manger, SUM(bricolage) AS sum_bricolage, SUM(c_animal) AS sum_c_animal, SUM(cuisine) AS sum_cuisine, SUM(feminin) AS sum_feminin, SUM(tien_main) AS sum_tien_main, SUM(dans_bureau) AS sum_dans_bureau FROM animal_seq'); $req->execute(); while ($donnees2 = $req-> fetch()) { $colonn1 = $bdd->prepare('SELECT COUNT(REPONSE) FROM animal_seq'); $colonn1->execute(); $nligne1 = $colonn1->fetchAll(PDO::FETCH_COLUMN, 0); $notre_chiffre1= $nligne1[0]/2; //permet de définir une variable reference (=nombre de ligne restante /2 et pour mon exemple j'ai mis 9,5) if ($nligne1[0]>=0 && $nligne1[0]<21) { foreach($donnees2 as $new) { //on cree une variable qui sera notre ecart en valeur absolue $abs=abs($new-$notre_chiffre1); //et on cree un nouveau tableau $array qui contiendra la valeur "normale" associee a son ecart par //rapport au nombre choisi en valeur absolue (ou plutot l'inverse) $array[$abs]=$new; } ksort($array); //on trie les clés dans l'ordre croissant $ecartok=current($array); //on recupere le premier element du tableau $array $key = array_search($ecartok, $donnees2); // retourne la clé de la valeur trouvé } elseif($n_ligne==0) { echo 0; } } $req->closeCursor(); ?>