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

Bases de données Delphi Discussion :

Firedac - Ajouter 1 colonne absente de la table


Sujet :

Bases de données Delphi

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Expert confirmé
    Avatar de qi130
    Homme Profil pro
    Expert Processus IT
    Inscrit en
    Mars 2003
    Messages
    3 932
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 64
    Localisation : France

    Informations professionnelles :
    Activité : Expert Processus IT
    Secteur : Finance

    Informations forums :
    Inscription : Mars 2003
    Messages : 3 932
    Par défaut Firedac - Ajouter 1 colonne absente de la table
    Bonjour,

    Ma question du jour vient certainement d'une incompréhension quant à la "bonne" approche de mon sujet.

    J'ai 1 table comportant des séries de mesures de pression, chaque série a 1 nb variable de mesures et est à considérer comme "slave" d'une table "master" contenant le n° de la série.

    Cherchant à construire 1 courbe avec ces mesures, je teste les compos RiverSoftAVG (6.8) en version PE et notamment le DBLineChart (DBaware donc) mais je suis confronté au fait que ma série de mesures ne dispose d'aucun élément d'horodatage. Je sais juste que l'écart entre chaque mesure est de 5 secondes (l'ordre des mesures est assuré pas 1 colonne auto-incrément).

    Évidemment, le compos demande les données pour l'axe X afin d'assures le tracé!

    J'ai tenté d'ajouter un champ "manuel" dans le FDQuery (Ok) afin d'y définir les valeurs {0,5,10,15,...} et satisfaire l'attente du compo.

    Mais je n'arrive pas à alimenter ce champ "manuel" car la FDQuery s'entête à rester en dsBrowse malgré:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    if not (ProfQr.State in [dsEdit,dsinsert]) then
            ProfQr.Edit;
    Je ne vois pas où est mon erreur.

    Merci par avance.

  2. #2
    Expert éminent
    Avatar de Paul TOTH
    Homme Profil pro
    Freelance
    Inscrit en
    Novembre 2002
    Messages
    8 964
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 56
    Localisation : France, Paris (Île de France)

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

    Informations forums :
    Inscription : Novembre 2002
    Messages : 8 964
    Par défaut
    euh...la colonne n'est pas absente puisque tu dis que c'est l'ID qui sert à compter le temps...

    un champ "manuel" ? tu veux dire un champ calculé ? dans ce cas il faut définir l'évènement OnCalcFields
    Developpez.com: Mes articles, forum FlashPascal
    Entreprise: Execute SARL
    Le Store Excute Store

  3. #3
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 598
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 69
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2007
    Messages : 15 598
    Billets dans le blog
    65
    Par défaut
    Bonjour,
    Citation Envoyé par qi130 Voir le message
    Mais je n'arrive pas à alimenter ce champ "manuel" car la FDQuery s'entête à rester en dsBrowse
    Logique parce que la colonne ne fait pas réellement partie de la table de la base de données.
    Le champ calculé est une méthode nécessitant la déclaration des colonnes et l'ajout du champ (clic droit sur TQuery, déclarer les champs, ajouter un champ de type fdCalc)

    Perso, je verrai plutôt l'obtention de cette valeur via le SQL directement. Si mes souvenirs sont bons, il s'agit de Firebird version 2.1 une requête récursive ou une procédure (plus facilement réalisable)
    fournira le dataset nécessaire sans champ calculé à ajouter

  4. #4
    Expert confirmé
    Avatar de qi130
    Homme Profil pro
    Expert Processus IT
    Inscrit en
    Mars 2003
    Messages
    3 932
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 64
    Localisation : France

    Informations professionnelles :
    Activité : Expert Processus IT
    Secteur : Finance

    Informations forums :
    Inscription : Mars 2003
    Messages : 3 932
    Par défaut
    Citation Envoyé par SergioMaster Voir le message
    Logique parce que la colonne ne fait pas réellement partie de la table de la base de données.
    Le champ calculé est une méthode nécessitant la déclaration des colonnes et l'ajout du champ (clic droit sur TQuery, déclarer les champs, ajouter un champ de type fdCalc)
    C'est pourtant bien ce que j'ai fait
    Citation Envoyé par qi130
    J'ai tenté d'ajouter un champ "manuel" dans le FDQuery (Ok)
    et ce champ est bien en calculate...

    Par contre, qu'entends-tu par
    méthode nécessitant la déclaration des colonnes
    Est-ce autre chose que mentionner les colonnes de la table des mesures? (elles sont toutes là quand je regarde les Fields dans l'explorateur d'objet; le nom du champ ajouté étant préfixé du "name" de la query)

    Ceci étant, je ne comprends pas pourquoi la FDQuery ne veut pas passer en mode dsEdit

  5. #5
    Expert éminent
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    14 086
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Développeur C++\Delphi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2006
    Messages : 14 086
    Par défaut
    Pourquoi ne pas la produire directement en SQL avec un Sequence Number, la syntaxe dépend du SGBD, tu n'auras plus besoin de modifier le DataSet


    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    SELECT ROW_NUMBER() * 5 AS secondes, T.* FROM
    (
      SELECT ... FROM ... ORDER BY ... 
    ) AS T

    Selon les SGDB ce genre de colonne ROW_NUMBER est perturbé par le Order appliqué après le WHERE mais avant le Tri
    FireDAC oui mais sur FireBird, SQL Server, Oracle ?


    Surtout que modifier un DataSet ce n'est pas anodin, faudrait pas générer des SQL par erreur, veillez à ce que cela reste bien en cache local
    Quelle est la valeur de CanModify ?
    CachedUpdates est bien à True ?




    Citation Envoyé par Paul TOTH Voir le message
    euh...la colonne n'est pas absente puisque tu dis que c'est l'ID qui sert à compter le temps...

    un champ "manuel" ? tu veux dire un champ calculé ? dans ce cas il faut définir l'évènement OnCalcFields
    Avec un champ fkCalculated, un RecNo * 5 semble une tricherie possible dans OnCalcFields

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    procedure TForm1.DataSetCalcFields(DataSet: TDataSet);
    begin
      DataSet.FieldByName('Secondes').AsInteger := DataSet.RecNo * 5; // Si RecNo est valide
    end;
    Aide via F1 - FAQ - Guide du développeur Delphi devant un problème - Pensez-y !
    Attention Troll Méchant !
    "Quand un homme a faim, mieux vaut lui apprendre à pêcher que de lui donner un poisson" Confucius
    Mieux vaut se taire et paraître idiot, Que l'ouvrir et de le confirmer !
    L'ignorance n'excuse pas la médiocrité !

    L'expérience, c'est le nom que chacun donne à ses erreurs. (Oscar Wilde)
    Il faut avoir le courage de se tromper et d'apprendre de ses erreurs

  6. #6
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 598
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 69
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2007
    Messages : 15 598
    Billets dans le blog
    65
    Par défaut
    C'est pourtant bien ce que j'ai fait
    je ne pense pas


    Alors voilà au moins un SQL qui te permettra d'avoir les X sans avoir besoin de se casser la tête si ce n'est que cela dépend du dialect de la Bdd
    cf FAQ Firebird

    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    SELECT 
    rdb$get_context('USER_TRANSACTION', 'row#') as X, 
    rdb$set_context('USER_TRANSACTION', 'row#', 
    COALESCE(rdb$get_context('USER_TRANSACTION','row#'),0) + 5),  -- COALESCE(cast(rdb$get_context('USER_TRANSACTION', 'row#') as integer), 0) + 1), si dialect 3 
    A.*
    FROM latable A 
    WHERE SERIE=:S
    ORDER BY a.colonneincrémentée
    malheureusement, il y a la petite pollution de la colonne RDB$set_context obligatoire

    la solution CTE RECURSIVE doit être a peu près comme ça
    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    WITH RECURSIVE P(X,VALEUR) AS 
      (select 0 AS X,VALEUR FROM TABLESERIE WHERE SERIE=:S
        union all 
       select SKIP (P.X+1) P.X+1,T.VALEUR FROM TABLESERIE T JOIN P on 1=1  WHERE SERIE=:S 
    )
    SELECT X*5 X,VALEUR FROM P

  7. #7
    Expert éminent
    Avatar de Paul TOTH
    Homme Profil pro
    Freelance
    Inscrit en
    Novembre 2002
    Messages
    8 964
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 56
    Localisation : France, Paris (Île de France)

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

    Informations forums :
    Inscription : Novembre 2002
    Messages : 8 964
    Par défaut
    j'ai mal compris ou "l'ordre des mesures est assuré pas 1 colonne auto-incrément" indique qu'il existe déjà une colonne ?

    ah par contre, l'ID n'est pas forcément séquentiel s'il y a plusieurs sources par exemple

    ID, Source, Valeur
    1, 1, 1
    2, 2, 1
    3, 1, 12
    4, 1, 25
    5, 2, 10
    Developpez.com: Mes articles, forum FlashPascal
    Entreprise: Execute SARL
    Le Store Excute Store

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [AC-2000] Ajouter une colonne de données à une table via vrai faux
    Par AmaAna dans le forum Modélisation
    Réponses: 1
    Dernier message: 17/05/2011, 16h46
  2. Ajout de colonnes en début de table ?
    Par joseph_p dans le forum Oracle
    Réponses: 14
    Dernier message: 16/08/2006, 15h56
  3. Réponses: 5
    Dernier message: 16/06/2006, 22h39
  4. Réponses: 4
    Dernier message: 17/05/2006, 09h21
  5. prob ajout de colonne ds une table en tant NOT NULL
    Par elhosni dans le forum Access
    Réponses: 3
    Dernier message: 19/11/2005, 22h18

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