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

Windows Forms Discussion :

Dernière ligne ajoutée à une table + mise à jour


Sujet :

Windows Forms

  1. #1
    Nouveau membre du Club
    Profil pro
    Consultant MOA
    Inscrit en
    Juin 2007
    Messages
    60
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Consultant MOA
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Juin 2007
    Messages : 60
    Points : 32
    Points
    32
    Par défaut Dernière ligne ajoutée à une table + mise à jour
    Bon, ça va être compliqué à expliquer tout, mais j'essaie.
    Alors voilà, je voudrais faire une insertion de ligne dans une table. Entre autre attributs, il y a un ID qui est en numéroauto, et un nom qui est composé d'un préfixe : "TRUC_" et collé derrière, le numéro auto qui a été attribué.

    J'imagine que le plus simple, c'est de faire l'insertion, puis de récupérer l'ID qui a été attribué, puis de mettre le nom à jour en collant cet ID.

    J'ai 2 problèmes. Déjà, pour récupérer la ligne qui vient d'être ajoutée. Pour l'instant, je me suis arrangée pour que la table soit triée selon les ID décroissants, et donc la dernière ligne est Rows(0). MAIS, je trouve ça un peu tendu, disons que si l'ordre de tri change malencontreusement, c'est le drame et je serai pas toujours là pour m'assurer de ça

    Je me demandais donc s'il existe une propriété ou un outil quelconque pour récupérer la dernière ligne insérée ? Sinon n'importe quelle meilleure méthode pour faire ce que j'ai expliqué plus haut est la bienvenue.

    Accessoirement, j'ai aussi un problème avec la mise à jour après
    Voilà mon code pour tout ça :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    'Ajout de la nouvelle ligne           
    Risques_ITTableAdapter.Insert("RISK_", Nom_Actif, Nom_Vul, Nom_Menace, Text_Desc.Text)
     
    'Modif du nom
    Dim ligne As DataRow
    ligne = Base_AR_DataSet.Tables("Risques_IT").Rows(0)
    Je dirais qu'un simple update suffit derrière mais je me fais envoyer bouler quand j'essaie
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Me.Risques_ITTableAdapter.Update(ligne)
    par exemple. Comme je m'y retrouve moyen entre tout (tableadapters, etc), je suis intéressée par la bonne commande, aussi

  2. #2
    Membre chevronné
    Avatar de olsimare
    Inscrit en
    Décembre 2006
    Messages
    1 179
    Détails du profil
    Informations forums :
    Inscription : Décembre 2006
    Messages : 1 179
    Points : 1 776
    Points
    1 776
    Par défaut
    Bonjour.

    Le conseil du jour : un ID autoincrémenté à part servir de clé primaire ça sert pas à grand chose.

    Si tu as un truc à mettre derriére "TRUC_" il ne faut pas que cela soit cet ID (ça n'a pas de sens, c'est purement technique et en plus suivant les bases ça peut ressembler à tout et à rien --> TRUC{455-r4545r-t46554} c'est pas super super !).
    A la rigueur un bon timestamp avec un compteur incrémental "maison" (que tu géres à la main) c'est bien plus propre et ça reste de l'information utile, pas des subtilités techniques.

    Si c'est une volonté d'un client, explique lui que ça n'a pas de sens !

    Pour ton probléme d'insert, il faudrait voir la structure de la table ou le msg d'erreur.

    PS : pour pas être sectaire, si tu es sur une base Acces, à part ajouter une colonne datetime, faire ton insert avec now dans cette colonne et récupére l'ID via un select sur ta col datetime = le now que tu as mis initialement, y'a pas moyen.
    Si tu es sur oracle ou sql server et que ton numéro est un séquence, ça peut se retrouver en obtenant avant l'insert le prochain n° de la séquence.

    Cdt.

  3. #3
    Nouveau membre du Club
    Profil pro
    Consultant MOA
    Inscrit en
    Juin 2007
    Messages
    60
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Consultant MOA
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Juin 2007
    Messages : 60
    Points : 32
    Points
    32
    Par défaut
    Je suis assez d'accord pour l'ID, je n'aime pas l'avoir pour rien, c'est moche.
    Je l'ai repris sur la base faite par mon prédécesseur quand il m'a expliqué à quoi ça servait....Base Access, je précise. Voilà l'idée :

    mettons qu'on a une table TRUCS. Ma clé primaire va être un nom pour chaque élément, et ce nom est de la forme TRUC_1, TRUC_2, etc...
    Si j'avais pu modifier le numéroauto pour qu'il s'affiche sous la form TRUC_x, ça m'aurait parfaitement convenu. Mais je n'ai pas réussi.
    Mettre un numéro à la main, ça ne va pas non plus, il faut qu'il soit automatique pour ne pas que le client se fasse chier.
    Bref, par dépit, j'ai repris cette solution d'avoir un incrément auto et de lui piquer le numéro.

    Je conviens que c'est moche. Si tu as une meilleure solution, je ne demande pas mieux

  4. #4
    Membre chevronné
    Avatar de olsimare
    Inscrit en
    Décembre 2006
    Messages
    1 179
    Détails du profil
    Informations forums :
    Inscription : Décembre 2006
    Messages : 1 179
    Points : 1 776
    Points
    1 776
    Par défaut
    Bonjour.

    Tu peux gérer l'allocation par code en te créant une table compteur avec une colonne NomTable, une colonne NomID et une colonne ID.

    Exemple :
    NomTable | NomID | ID
    Table1 | ID1 | 45645

    La colonne ID contient le dernier n°alloué.

    Quand tu inities une création dans Table1 tu fais :
    - select de l'ID pour Table1 et ID1
    - update de l'ID pour Table1 et ID1 : ID = ID +1

    Et tu utilises l'ID sélectionné initialement.

    Le mieux c'est encore d'ouvrir une transaction et de faire :
    - début de transaction
    - update de l'ID pour Table1 et ID1 : ID = ID +1 (pose un lock sur la ligne au cas ou un autre user tenterait de faire un select concurrent)
    - select de l'ID pour Table1 et ID1
    - commit
    - fin de transaction

    Si ton appli est mono-utilisateur (et mono formulaire de création dans la table ou il y a TRUC...), ne t'embête pas, pour récupérer l'ID suivant tu fais un SELECT MAX(ID) + 1 FROM TaTable.

    Cdt.

  5. #5
    Nouveau membre du Club
    Profil pro
    Consultant MOA
    Inscrit en
    Juin 2007
    Messages
    60
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Consultant MOA
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Juin 2007
    Messages : 60
    Points : 32
    Points
    32
    Par défaut
    Je vais peut être adopter la solution de faire une table à part. Ce qui me genait avec le numéro auto, c'est que si tu supprimes des entrées à la fin, il ne permet pas de les réallouer. Du coup, j'ai pour l'instant une méthode max_ID qui prend le max des IDs présents et qui ajoute 1 l'ID du nouvel élément.
    Mais du coup, avec le numéro auto, ça faisait des décalages entre l'ID et le nom. Je me dis que finalement, on s'en fout un peu
    Et oui, le programme sera mono utilisateur.
    Bref, je vais voir ce que j'en fais, mais merci pour tes suggestions en tout cas.

  6. #6
    Rédacteur
    Avatar de JauB
    Homme Profil pro
    Freelancer
    Inscrit en
    Octobre 2005
    Messages
    1 792
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : Maroc

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

    Informations forums :
    Inscription : Octobre 2005
    Messages : 1 792
    Points : 2 914
    Points
    2 914
    Par défaut
    pour moi je récupére mon dernier ID inséré comme suit:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
     
    oSQL = " INSERT INTO maTable(champ2,champ3) " & _
    " VALUES ('" & maValeur2 & "','" & maValeur2 & "')" & _
    " SELECT idMaTable FROM maTable WHERE idMaTable = @@IDENTITY"
    cmd.CommandText = oSQL
    cmd.Connection = cn
    ....
    .....
    N.B: je taravaille avec SQL SERVER, pour d'autres SGBD il y a d'autres fonctions au lieu d'IDENTITY.
    Bon courage

  7. #7
    Nouveau membre du Club
    Profil pro
    Consultant MOA
    Inscrit en
    Juin 2007
    Messages
    60
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Consultant MOA
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Juin 2007
    Messages : 60
    Points : 32
    Points
    32
    Par défaut
    Je note, ça pourra me servir dans l'application que je fais. Si je trouve l'équivalent pour Access, je le posterai ici, ça peut servir.
    Merci !

Discussions similaires

  1. supprimer la dernière ligne d'une table
    Par hammag dans le forum SQL
    Réponses: 4
    Dernier message: 07/06/2010, 17h40
  2. Dernière ligne d'une table
    Par geofnich dans le forum SAS Base
    Réponses: 2
    Dernier message: 10/05/2010, 16h26
  3. Réponses: 2
    Dernier message: 08/09/2009, 11h57
  4. [MySQL] Sélection des dernières lignes d'une table
    Par Civet dans le forum PHP & Base de données
    Réponses: 1
    Dernier message: 25/04/2007, 15h06
  5. Réponses: 6
    Dernier message: 09/06/2006, 18h22

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