IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Langage SQL Discussion :

Acquisition d' informations par un champs plutôt que par une requête


Sujet :

Langage SQL

  1. #1
    Membre régulier Avatar de yoshï
    Profil pro
    Inscrit en
    Mai 2003
    Messages
    206
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2003
    Messages : 206
    Points : 88
    Points
    88
    Par défaut Acquisition d' informations par un champs plutôt que par une requête
    Bonjour à tous,

    Je viens solliciter votre expertise en matière de conception.

    Il me semble qu'il est formellement déconseillé d'avoir des champs redondants dans une base.
    Je pense que la principale raison vient du risque d'intégrité lors d'une maj partielle des champs.
    Que se passe t'il si 2 champs sémantiquement identiques n'indiquent plus la même valeur?!
    En outre, avoir 2 champs identiques dans 2 tables différentes semble relever d'une erreur de conception car ça ne présente, à priori, aucun intérêt.

    Mon problème est un peu différent. Il existe des données que je peux avoir par le biais de requêtes lourdes et complexes (multiples jointures avec groupement, tri et comptage).
    Dès lors pour éviter d'avoir à lancer ces requêtes en permanence, la solution d'un champs stockant l'information peut être utile même si
    il existe une alternative pour avoir la donnée sans la présence de ce champs.

    Je vais essayer d'illustrer avec un exemple. Imaginons le cas suivant :


    Dans une BDD répertoriant les business sur une plateforme B2B, on veut connaître le volume d'affaire généré par un commercial.
    Il y a une table qui répertorie les transactions avec leurs montants. On part de cette table pour remonter vers la société associée à la transaction puis vers la table
    des commerciaux et des sociétés associées. En gros il y a 2 jointures à faire et il faut ensuite faire la somme de toutes les transactions renvoyés par la requête.

    Bon dans cet exemple ça passe encore mais vous voyez la problématique. Quand les requêtes commencent à être trop lourdes n'est il pas préférable de stocker l'info directement dans un champs spécifique?

    Dans mon exemple, je pourrai créer un champs volume d'affaire dans la table des commerciaux et à chaque fois qu'une nouvelle transaction concernant une société associée à ce commercial est créée
    j'ajoute le montant de la transaction à son volume d'affaire.
    Qu'en pensez vous?

    Merci pour vos conseils

  2. #2
    Expert éminent
    Avatar de StringBuilder
    Homme Profil pro
    Chef de projets
    Inscrit en
    Février 2010
    Messages
    4 153
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Chef de projets
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2010
    Messages : 4 153
    Points : 7 403
    Points
    7 403
    Billets dans le blog
    1
    Par défaut
    Bonjour,

    Selon les SGBD, vous avez accès aux "vue stockées" (c'est à dire des vues, au détail près que les données sont stockées physiquement, et mise à jour dynamiquement en fonction des tables référencées).

    Et aussi mais surtout, vous avez accès aux "colonnes calculées", qui peuvent être persistantes et résultantes d'une fonction stockée, mais en plus, peuvent être indexées !

    Et ça, c'est un remède élégant à votre problématique !

    Seul souci, c'est que ces colonnes calculées (en tout cas sous SQL Server) ne peuvent être persistante que si elle ne font pas d'aggrégat, ce qui semble être le cas chez vous. Dans ce cas, le moteur devra malheureusement recalculer les valeurs à chaque fois. Cependant, votre requête restera parfaitement lisible, ce qui est déjà pas mal !

    Autre alternative, qui devrait fonctionner sur à peut près tous les SGBD : gérer le recalcul de façon manuelle, avec des triggers. Seul hic, ça peut être lourd à mettre en place, surtout si les règles évoluent dans le temps (par exemple, le calcul du prix total d'une facture peut s'enrichir à chaque débat politique, ils aiment bien nous rajouter des taxes à la con... Cela implique de repasser dans les X triggers simultanément, ce qu n'est pas forcément très simple à suivre.

    Voici un exemple sous SQL Server 2014 pour avoir une idée de ce que ça donne.

    L'exemple doit marcher depuis 2008 au moins, peut-être 2005.

    Code sql : 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
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
     
    drop table facture_ligne;
    drop table facture;
     
    drop function facture_nblignes;
    drop function facture_total;
     
    go
     
    create table facture
    (
    	id int primary key not null identity,
    	reference varchar(50) not null unique
    );
     
    create table facture_ligne
    (
    	id int primary key not null identity,
    	facture_id int not null references facture(id),
    	quantite numeric not null,
    	prix money not null,
    	total as (quantite * prix) persisted not null
    );
    go
     
    create function facture_total
    (
    	@id int
    )
    returns money
    as
    begin
    	return (select sum(total) from facture_ligne where facture_id = @id);
    end;
    go
     
    create function facture_nblignes
    (
    	@id int
    )
    returns int
    as
    begin
    	return (select count(id) from facture_ligne where facture_id = @id);
    end;
    go
     
    alter table facture
    add total as (dbo.facture_total(id));
    go
     
    alter table facture
    add nblignes as (dbo.facture_nblignes(id));
    go
     
    declare @newid table(id int);
     
    insert into facture (reference) output inserted.id into @newid values ('Facture 1');
    insert into facture_ligne (facture_id, quantite, prix) values ((select top 1 id from @newid), 10, 20.49);
    insert into facture_ligne (facture_id, quantite, prix) values ((select top 1 id from @newid), 100, 1.73);
    insert into facture_ligne (facture_id, quantite, prix) values ((select top 1 id from @newid), 30, 139.99);
    delete @newid;
     
    insert into facture (reference) output inserted.id into @newid values ('Facture 2');
    insert into facture_ligne (facture_id, quantite, prix) values ((select top 1 id from @newid), 10, 20.49);
    delete @newid;
     
    insert into facture (reference) output inserted.id into @newid values ('Facture 3');
    insert into facture_ligne (facture_id, quantite, prix) values ((select top 1 id from @newid), 30, 139.99);
    insert into facture_ligne (facture_id, quantite, prix) values ((select top 1 id from @newid), 100, 1.73);
    insert into facture_ligne (facture_id, quantite, prix) values ((select top 1 id from @newid), 5, 14.99);
    insert into facture_ligne (facture_id, quantite, prix) values ((select top 1 id from @newid), 30, 139.99);
    insert into facture_ligne (facture_id, quantite, prix) values ((select top 1 id from @newid), 100, 1.73);
    delete @newid;
     
    insert into facture (reference) output inserted.id into @newid values ('Facture 4');
    insert into facture_ligne (facture_id, quantite, prix) values ((select top 1 id from @newid), 10, 20.49);
    insert into facture_ligne (facture_id, quantite, prix) values ((select top 1 id from @newid), 5, 14.99);
    insert into facture_ligne (facture_id, quantite, prix) values ((select top 1 id from @newid), 100, 1.73);
    insert into facture_ligne (facture_id, quantite, prix) values ((select top 1 id from @newid), 30, 139.99);
    insert into facture_ligne (facture_id, quantite, prix) values ((select top 1 id from @newid), 5, 14.99);
    insert into facture_ligne (facture_id, quantite, prix) values ((select top 1 id from @newid), 100, 1.73);
    delete @newid;
     
    select * from facture;
    On ne jouit bien que de ce qu’on partage.

  3. #3
    Membre régulier Avatar de yoshï
    Profil pro
    Inscrit en
    Mai 2003
    Messages
    206
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2003
    Messages : 206
    Points : 88
    Points
    88
    Par défaut
    Merci pour ces informations. Je vais étudier tout ça de près.
    Pour information j'utilise MySQL comme SGBD.

  4. #4
    Membre éclairé

    Inscrit en
    Novembre 2008
    Messages
    418
    Détails du profil
    Informations forums :
    Inscription : Novembre 2008
    Messages : 418
    Points : 828
    Points
    828
    Par défaut
    Citation Envoyé par StringBuilder Voir le message
    Bonjour,

    Autre alternative, qui devrait fonctionner sur à peut près tous les SGBD : gérer le recalcul de façon manuelle, avec des triggers. Seul hic, ça peut être lourd à mettre en place, surtout si les règles évoluent dans le temps (par exemple, le calcul du prix total d'une facture peut s'enrichir à chaque débat politique, ils aiment bien nous rajouter des taxes à la con... Cela implique de repasser dans les X triggers simultanément, ce qu n'est pas forcément très simple à suivre.
    Ne serait-il pas possible d'appeler une procédure stockée à partir des triggers ? Du coup il suffit de repasser dans la procédure en question...

  5. #5
    Expert éminent sénior Avatar de Flodelarab
    Homme Profil pro
    Inscrit en
    Septembre 2005
    Messages
    5 243
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente (Poitou Charente)

    Informations forums :
    Inscription : Septembre 2005
    Messages : 5 243
    Points : 13 458
    Points
    13 458
    Par défaut
    Bonjour,

    mysql??? Est-il raisonnable d'entamer une discussion d'intégrité avec un SGBD qui n'a même pas l'obligation d'assurer l'intégrité référentielle? Tout dépend du moteur qu'il y a derrière, mais mysql n'a pas l'obligation de le faire.
    Cette réponse vous apporte quelque chose ? Cliquez sur en bas à droite du message.

  6. #6
    Expert éminent
    Avatar de StringBuilder
    Homme Profil pro
    Chef de projets
    Inscrit en
    Février 2010
    Messages
    4 153
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Chef de projets
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2010
    Messages : 4 153
    Points : 7 403
    Points
    7 403
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par fatbob Voir le message
    Ne serait-il pas possible d'appeler une procédure stockée à partir des triggers ? Du coup il suffit de repasser dans la procédure en question...
    Effectivement, un trigger qui appelle une procédure stockée fera en partie l'affaire.

    Cependant, si le calcul est complexe, selon depuis quelle table on lance la procédure stockée, on risque d'avoir des traitements différents (recalcul en cascade de données intermédiaires par exemple).

    Dans mon exemple (très simple) : on n'aura pas les mêmes traitements si on supprime une ligne dans les lignes de facture (simple recalcul de l'entête) ou si on ajoute une nouvelle ligne (calcul du total de la ligne puis recalcul de l'entête).

    Je vous laisse imaginer ce que ça donne avec une table de tarifs dégressifs couplé à une table de remises selon critères complexes : il faut déclencher si on change une remise, si on change une condition d'application de remise, si on change un tarifs, si on change un seuil d'application du tarif, si on change une ligne de facture, si on change un élément de la facture (ou du client ou autre) qui concerne un élément de déclenchement d'une remise...

    Bref, très lourd à mettre en place, là où une colonne calculée saura toujours faire le traitement avec une unique fonction.
    On ne jouit bien que de ce qu’on partage.

  7. #7
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 768
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Expert bases de données / SQL / MS SQL Server / Postgresql
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2002
    Messages : 21 768
    Points : 52 719
    Points
    52 719
    Billets dans le blog
    5
    Par défaut
    Citation Envoyé par yoshï Voir le message
    Bonjour à tous,

    Je viens solliciter votre expertise en matière de conception.

    Il me semble qu'il est formellement déconseillé d'avoir des champs redondants dans une base.
    Je pense que la principale raison vient du risque d'intégrité lors d'une maj partielle des champs.
    Il y en as beaucoup d'autres, notamment concernant la baisse des performances :
    - accroissement du volume de données => diminution des données en cache (du fait de la redondance)
    - augmentation du nombre de colonnes d'une table => difficulté d'indexation
    ...

    Que se passe t'il si 2 champs sémantiquement identiques n'indiquent plus la même valeur?!
    C'est un défaut d'intégrité et vous êtes dans la merde !

    En outre, avoir 2 champs identiques dans 2 tables différentes semble relever d'une erreur de conception car ça ne présente, à priori, aucun intérêt.
    Exact

    Mon problème est un peu différent. Il existe des données que je peux avoir par le biais de requêtes lourdes et complexes (multiples jointures avec groupement, tri et comptage).
    Dès lors pour éviter d'avoir à lancer ces requêtes en permanence, la solution d'un champs stockant l'information peut être utile même si
    il existe une alternative pour avoir la donnée sans la présence de ce champs.

    Je vais essayer d'illustrer avec un exemple. Imaginons le cas suivant :


    Dans une BDD répertoriant les business sur une plateforme B2B, on veut connaître le volume d'affaire généré par un commercial.
    Il y a une table qui répertorie les transactions avec leurs montants. On part de cette table pour remonter vers la société associée à la transaction puis vers la table
    des commerciaux et des sociétés associées. En gros il y a 2 jointures à faire et il faut ensuite faire la somme de toutes les transactions renvoyés par la requête.
    sur un bon SGBDR, avec une base bien conçue, mêmes des requêtes avec 15 ou 20 jointures ne posent aucun problème !


    Bon dans cet exemple ça passe encore mais vous voyez la problématique. Quand les requêtes commencent à être trop lourdes n'est il pas préférable de stocker l'info directement dans un champs spécifique?

    Dans mon exemple, je pourrai créer un champs volume d'affaire dans la table des commerciaux et à chaque fois qu'une nouvelle transaction concernant une société associée à ce commercial est créée
    j'ajoute le montant de la transaction à son volume d'affaire.
    Qu'en pensez vous?

    Merci pour vos conseils
    Dans le pire des cas il existe les vues indexées (SQL Server) ou les vues matérialisées (Oracle). Ceci pré-calcule des données en fonction d'une requête.

    Mais avant tout commencez à maquettez votre problème sur un vrai SGBDR avec un vrai modèle et une bonne base bien indexée avec quelques centaines de milliers de lignes (minimum) dans vos tables. Vous risquez d'avoir d'agréables surprises !

    A +
    Frédéric Brouard - SQLpro - ARCHITECTE DE DONNÉES - expert SGBDR et langage SQL
    Le site sur les SGBD relationnels et le langage SQL: http://sqlpro.developpez.com/
    Blog SQL, SQL Server, SGBDR : http://blog.developpez.com/sqlpro
    Expert Microsoft SQL Server - M.V.P. (Most valuable Professional) MS Corp.
    Entreprise SQL SPOT : modélisation, conseils, audit, optimisation, formation...
    * * * * * Expertise SQL Server : http://mssqlserver.fr/ * * * * *

  8. #8
    Membre régulier Avatar de yoshï
    Profil pro
    Inscrit en
    Mai 2003
    Messages
    206
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2003
    Messages : 206
    Points : 88
    Points
    88
    Par défaut
    Merci pour votre message. Je réponds avec un petit peu de retard.

    Dans le pire des cas il existe les vues indexées (SQL Server) ou les vues matérialisées (Oracle). Ceci pré-calcule des données en fonction d'une requête.
    A votre connaissance, est ce que MySQL dispose de ce type de fonctionnalité?

    Mais avant tout commencez à maquettez votre problème sur un vrai SGBDR
    Est ce que MySQL rentre dans la catégorie des "vrais SGBDR"?

    quelques centaines de milliers de lignes (minimum) dans vos tables
    Il y a très peu de chance pour que ma BDD atteigne un jour ce nombre d'entrées (tout au plus quelques dizaines de milliers) mais je comprends l'intérêt de faire des tests de performance sur un très grand nombre de données.

  9. #9
    Modérateur

    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 799
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur d'études en informatique
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2006
    Messages : 16 799
    Points : 34 031
    Points
    34 031
    Billets dans le blog
    14
    Par défaut
    Citation Envoyé par yoshï Voir le message
    Citation Envoyé par SQLPro
    Dans le pire des cas il existe les vues indexées (SQL Server) ou les vues matérialisées (Oracle). Ceci pré-calcule des données en fonction d'une requête.
    A votre connaissance, est ce que MySQL dispose de ce type de fonctionnalité?
    À ma connaissance, non.


    Citation Envoyé par yoshï Voir le message
    Est ce que MySQL rentre dans la catégorie des "vrais SGBDR"?
    SQLPro dira que non.
    http://blog.developpez.com/sqlpro/p9...oudre_aux_yeux


    Citation Envoyé par yoshï Voir le message
    Il y a très peu de chance pour que ma BDD atteigne un jour ce nombre d'entrées (tout au plus quelques dizaines de milliers) mais je comprends l'intérêt de faire des tests de performance sur un très grand nombre de données.
    Alors si votre BDD est bien modélisée et bien indexée et des requêtes bien écrites, même avec le mauvais MySQL, vous ne devriez pas avoir de problème de performance.
    Philippe Leménager. Ingénieur d'étude à l'École Nationale Supérieure de Formation de l'Enseignement Agricole. Autoentrepreneur.
    Mon ancien blog sur la conception des BDD, le langage SQL, le PHP... et mon nouveau blog sur les mêmes sujets.
    « Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément ». (Nicolas Boileau)
    À la maison comme au bureau, j'utilise la suite Linux Mageïa !

  10. #10
    Membre chevronné
    Inscrit en
    Août 2009
    Messages
    1 073
    Détails du profil
    Informations forums :
    Inscription : Août 2009
    Messages : 1 073
    Points : 1 806
    Points
    1 806
    Par défaut
    Citation Envoyé par yoshï Voir le message
    Bon dans cet exemple ça passe encore mais vous voyez la problématique. Quand les requêtes commencent à être trop lourdes n'est il pas préférable de stocker l'info directement dans un champs spécifique?

    Dans mon exemple, je pourrai créer un champs volume d'affaire dans la table des commerciaux et à chaque fois qu'une nouvelle transaction concernant une société associée à ce commercial est créée
    j'ajoute le montant de la transaction à son volume d'affaire.
    Qu'en pensez vous?
    La dénormalisation est un éternel débat ... même si eon arrive à de meilleurs résultats en normalisant _bien_ , quand on part d'un système plus ou moins pourri (et dieu sait si c'est fréquent quand on arrive sur des projets déjà bien en place) pour lequel on ne peut pas repartir de zéro, il est régulièrement avantageux de mettre en place des éléments de dénormalisation (le terme étant un peu impropre parce qu'on part dans ces cas là de quelque chose de pas du tout normalisé).

    Il y a aussi le cas particulier des bases dites décisionnelles, avec aucune écriture sauf le rafraîchissement, et dans ce cas précis on ne se gêne pas pour pré-calculer toute sorte de valeurs.

  11. #11
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 768
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Expert bases de données / SQL / MS SQL Server / Postgresql
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2002
    Messages : 21 768
    Points : 52 719
    Points
    52 719
    Billets dans le blog
    5
    Par défaut
    Citation Envoyé par Rei Ichido Voir le message
    La dénormalisation est un éternel débat ... même si eon arrive à de meilleurs résultats en normalisant _bien_ , quand on part d'un système plus ou moins pourri (et dieu sait si c'est fréquent quand on arrive sur des projets déjà bien en place) pour lequel on ne peut pas repartir de zéro, il est régulièrement avantageux de mettre en place des éléments de dénormalisation (le terme étant un peu impropre parce qu'on part dans ces cas là de quelque chose de pas du tout normalisé).
    Non, ça c''est TOUJOURS stupide. Il faut tout simplement refactoriser. Je vous renvoie aux ouvrages suivants :
    http://www.amazon.com/Refactoring-Da.../dp/0321774515
    http://www.amazon.com/Refactoring-SQ...ne+faroult+sql
    Par exemple, dans SQL Server, en utilisant des index avec clause INCLUDE, vous pouvez facilement factoriser "à l'envers"...

    Il y a aussi le cas particulier des bases dites décisionnelles, avec aucune écriture sauf le rafraîchissement, et dans ce cas précis on ne se gêne pas pour pré-calculer toute sorte de valeurs.
    SQL est le langage des bases de données relationnelles donc OLTP (One Line Transaction Processing) et vous êtes dans le forum consacré à SQL... Rien à voir avec le decisionnel (OLAP : On Line Analytical Process) pour lesquels les moteurs de stockage et le langage de requêtes (généralement MDX) n'ont rien à voir (même si certains continue d'utiliser du SQL et un SGBDR pour faire du décisionnel de manière parfaitement stupide !)

    A +
    Frédéric Brouard - SQLpro - ARCHITECTE DE DONNÉES - expert SGBDR et langage SQL
    Le site sur les SGBD relationnels et le langage SQL: http://sqlpro.developpez.com/
    Blog SQL, SQL Server, SGBDR : http://blog.developpez.com/sqlpro
    Expert Microsoft SQL Server - M.V.P. (Most valuable Professional) MS Corp.
    Entreprise SQL SPOT : modélisation, conseils, audit, optimisation, formation...
    * * * * * Expertise SQL Server : http://mssqlserver.fr/ * * * * *

  12. #12
    Modérateur
    Avatar de Waldar
    Homme Profil pro
    Customer Success Manager @Vertica
    Inscrit en
    Septembre 2008
    Messages
    8 452
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Customer Success Manager @Vertica
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2008
    Messages : 8 452
    Points : 17 820
    Points
    17 820
    Par défaut
    Sauf que le MDX ça ne prend pas, ça reste au sein de Microsoft.

    Le SQL dans le décisionnel enterrera le MDX pour sûr.
    Je pense même que les bases 100% OLAP avec des cubes vont disparaître.

Discussions similaires

  1. [CR 10] Sélection via un max date en sélection plutôt que par les sections
    Par castorameur dans le forum SAP Crystal Reports
    Réponses: 2
    Dernier message: 25/06/2015, 12h52
  2. [AC-2002] Afficher le nom original des champs plutôt que leur légende
    Par J1 dans le forum Requêtes et SQL.
    Réponses: 3
    Dernier message: 14/05/2014, 13h09
  3. Navigation par tag ou par catégorie plutôt que par parenté
    Par Mickael_Istria dans le forum Evolutions du club
    Réponses: 17
    Dernier message: 17/11/2011, 12h18
  4. Script maxl, appel par le client plutôt que par le serveur
    Par jsonline dans le forum EPM (Hyperion)
    Réponses: 1
    Dernier message: 20/05/2011, 14h40
  5. Réponses: 4
    Dernier message: 14/03/2011, 15h29

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo