Bonjour,

Je suis actuellement en train de développer une application qui utilise grandement les bases de données, et cela avec InterBase.

Pour cela, j'ai créé une procédure stockée, me permettant d'afficher dans une StringGrid, une chaine de caractères concaténée, sachant que la chaine de caractères obtenues est issue de plusieurs ligne de mes tables. Jusque là, pas de soucis.

Ce que j'aimerai faire est de trier les informations en fonction de la quantité. Par exemple, si on a :
Nom Argent Unite
Toto 5 €
Dupond 10 €
Dupuis 50 cts

Je souhaiterai pouvoir l'afficher sous la forme :

Dupond_10€,Toto_5€,Dupuis_50cts

Le tri se fait donc en fonction des champs Argent et Unite.

Pour cela, j'ai déjà créé un algo sous C++ Builder pour faire un test :

Code c++ : Sélectionner tout - Visualiser dans une fenêtre à part
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
int main(int argc, char* argv[])
{
  int iTab[10] = {54,987,23,78,54,4789,32,45,65,923};
  AnsiString asUnite[10] = {"€","cts","€","cts","cts","€","€","cts","€","cts"};
  bool en_desordre = true;
 
    cout << "Liste non triee :\n";
    for(int i=0; i < 10; i++)
    {
      cout << iTab[i];
      cout << asUnite[i].c_str() << endl;
    }
 
    for(int i=0; i < 10; i++)
    {
      if(asUnite[i] == "€")
        iTab[i] = iTab[i]*100;
    }
 
    cout << "\nListe non triee apres conversion :\n";
    for(int i=0; i < 10; i++)
    {
      cout << iTab[i];
      cout << asUnite[i].c_str() << endl;
    }
 
	  for (int i = 0; i < 10 && en_desordre; ++i)
	  {
		  en_desordre = false;
		  for (int j = 1; j < 10 - i; ++j)
			  if (iTab[j-1] > iTab[j])
			  {
				  std::swap(iTab[j], iTab[j-1]);
          std::swap(asUnite[j], asUnite[j-1]);
				  en_desordre = true;
 			  }
	  }
 
    cout << "\nListe triee apres conversion :\n";
    for(int i=0; i < 10; i++)
    {
      cout << iTab[i];
      cout << asUnite[i].c_str() << endl;
    }
 
    for(int i=0; i < 10; i++)
    {
      if(asUnite[i] == "€")
        iTab[i] = iTab[i]/100;
      //cout << asUnite[i] << endl;
    }
 
    cout << "\nListe triee :\n";
    for(int i=0; i < 10; i++)
    {
      cout << iTab[i];
      cout << asUnite[i].c_str() << endl;
    }
    getch();
 
  return 0;
}

En parallèle, j'ai également développé une procédure stockée qui, pour le moment, me créé la chaine de caractère comme au dessus, mais sans faire de tri :

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
BEGIN
    RESULTAT = '';
    cnt = 0;
    iCpt = 0;
        FOR
            SELECT nom || '_' || cast(argent AS decimal(15,2)) || unite     FROM personne 
            INTO :CHAINE
        DO
            BEGIN
               IF(iCpt = 1) THEN
                    RESULTAT = RESULTAT || ',';
               RESULTAT = RESULTAT || CHAINE;
               iCpt = 1;
            END
        SUSPEND;
END
(j'ai un peu allégé le code, donc si j'ai oublié quelque chose... )

Donc l'idée serait de faire ce qui est fait dans le premier code en C++ dans la procédure stockée. Cependant, je ne sais pas du tout comment il est possible de stocker les différentes informations, dans un objet similaire à un tableau.
Cela est il possible ?

Au pire ça se fera dans le code directement

Merci par avance

Petit Edit : j'ai un peu recherché si c'est possible de créer un Array en SQL, et j'ai trouvé sur le forum ce petit code :

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
DECLARE
	   TYPE TYPE_TAB IS VARRAY (100) OF VARCHAR2(1);
	   TAB TYPE_TAB := TYPE_TAB(1,2,3,4);
BEGIN
	 TAB(1) := 'T';
	 TAB(2) := 'O';
	 TAB(3) := 'T';
	 TAB(4) := 'O';
	 FOR I IN 1..4
	 LOOP
	 	 DBMS_OUTPUT.PUT_LINE(TAB(I));
	 END LOOP;
END;
Alors je me dis super, j'ai qu'à implémenter ça dans Interbase. Sauf que, quand je rajoute la déclaration, Interbase me dit qu'il ne connait pas TYPE_TAB, alors qu'il s'agit simplement du nom de ma variable (tableau ici en l'occurence) .
Donc si il est possible de mettre en oeuvre une telle solution, je pense que ce sera bon pour ma procédure !
Encore faut il que ça fonctionne (merci l'aide en ligne qui est HS... )