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

Delphi Discussion :

insertion sans vidage des masques de saisie


Sujet :

Delphi

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre très actif
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2018
    Messages
    492
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Algérie

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2018
    Messages : 492
    Par défaut insertion sans vidage des masques de saisie
    Bonjour à Tous,
    j'ai une table PRODUIT, je fais l'insertion à partir de la fiche illustrée ci-dessous
    voici le code en appuyant sur le bouton ENREGISTRER :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    F_DM.T_Prod.edit;
    frxReport1.Preview.Free;
    DBImage1.Picture.LoadFromFile(OpenPictureDialog1.FileName);
    F_DM.T_Prod.Post;
    F_DM.AQ_Pr.DisableControls;
    F_DM.AQ_Pr.Active:=False;
    F_DM.AQ_Pr.Active:=True;
    F_DM.AQ_Pr.EnableControls;
    close;
    maintenant je veux faire une insertion en gardant la fiche et aussi les informations saisies précédemment en incrémentant uniquement le champ CODE

    merci par avance
    Images attachées Images attachées  

  2. #2
    Expert éminent
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    14 152
    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 152
    Par défaut
    Pour l'auto-incrémenter, faite le gérer par le SGBD, il en garantira l'unicité lors d'accès concurrentiel

    D'ailleurs, un clone d'une ligne peut aussi se faire un via INSERT SELECT en SQL

    En fait, nous avons un tas d'information mais pas celle utile pour vous répondre, par exemple quel est le SGBD et quel est le provider ?
    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

  3. #3
    Membre très actif
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2018
    Messages
    492
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Algérie

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2018
    Messages : 492
    Par défaut
    Citation Envoyé par ShaiLeTroll Voir le message
    En fait, nous avons un tas d'information mais pas celle utile pour vous répondre, par exemple quel est le SGBD et quel est le provider ?
    j'utilise une simple BDD MS Access !

    tous les champs sont des DBEdit

    le Before insert du Adoquery contient :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
      AQ_Pr.Last;
       if Q_Max1.RecordCount=0 then I:=1 else
        begin
          Q_Max1.Close;
          Q_Max1.SQL.Clear;
          Q_Max1.SQL.Add('select * from produits  where C_Pr = ( select max(C_Pr) from produits )');
          Q_Max1.open;
          I:=AQ_PrC_Pr.Value+1;

  4. #4
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 743
    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 743
    Billets dans le blog
    65
    Par défaut
    Access et ADO mes deux bêtes noires !

    J'aurais tendance à écrire comme ShaiLeTroll que
    1- j'aurais utilisé un autoincrément (après vérification cela s'indique par NuméroAuto comme type)
    2- j'aurais utilisé une requête de type INSERT INTO <table> (<liste des colonnes à initialiser sauf numero auto>) SELECT <liste des colonnes à initialiser> FROM <table> WHERE numeroauto=LAST(numeroauto)ou ,sans auto incrément, INSERT INTO <table> (C_Pr,<liste des colonnes à initialiser) SELECT C_Pr+1,<liste des autres colonnes à initialiser> FROM <table> WHERE C_pr=LAST(C_pr)puis un open Select * FROM produits where C_pr=Last(C_Pr);
    en simplifiant, pour ne pas insérer avant, pas de SELECT * mais une bonne liste de colonne
    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT C_Pr+1,<Liste des colonnes> from produits where C_pr=Last(C_Pr);


    Mais bon, moi et Access, on n'est pas copain, j'ai peut-être mal compris la fonction LAST()

  5. #5
    Membre très actif
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2018
    Messages
    492
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Algérie

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2018
    Messages : 492
    Par défaut
    Citation Envoyé par SergioMaster Voir le message
    en simplifiant, pour ne pas insérer avant, pas de SELECT * mais une bonne liste de colonne
    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT C_Pr+1,<Liste des colonnes> from produits where C_pr=Last(C_Pr);

    comment relier une requête insert avec des DBEdit que j'ai ?

  6. #6
    Expert éminent
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    14 152
    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 152
    Par défaut
    Expliquer mieux votre besoin !
    Vous partez dans une direction qui n'est pas forcément la bonne.

    Si vous souhaitez dupliquer une ligne via l'IHM c'est tout de même extrêmement simple
    N'utiliser pas de Table mais deux Query
    A la limite Table + Query

    Faire un Select sur la ligne à copier c'est la Query Source
    Puis dans un second Query Destination volontairement avec un WHERE 0 = 0 pour obtenir le DataSet avec la structure vide
    Cela peut être aussi el Table qui sert de Destination
    Faites votre Insert(), copier les valeurs via un for FieldCount do Fields[].Value à l'ouverture de la fenêtre
    Sur le bouton Enregistrer faire le Post() pour finir, cela va provoquer l'ajout en base ... l'ID ne sera calculé qu'à ce moment, ne surtout pas le rendre affichable avant l'insertion réelle

    Oublier votre bricolage avec MAX + 1, ce n'est pas une méthode viable.
    laisser faire ACCESS pour l'autoInc

    Personnellement, je n'utilise jamais Post(), je préfère générer le SQL moi-même à partir par exemple d'un TClientDataSet.
    Cela permet une maitrise totale des entrées sorties entre votre programme et la base de données.
    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

  7. #7
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 743
    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 743
    Billets dans le blog
    65
    Par défaut
    Citation Envoyé par LandGreen Voir le message
    comment relier une requête insert avec des DBEdit que j'ai ?
    Je ne comprends pas votre demande vous me demandez comment relier une requête insert et vous citez ma requête select
    Donc dans le cas d'un Select la question de se pose pas
    dans le cas d'un Insert, j'ai l'impression que vous ne m'avez pas lu jusqu'au bout le
    puis un open
    n'est pas là pour rien

  8. #8
    Expert éminent
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    14 152
    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 152
    Par défaut
    Il va effectivement repenser votre façon de programmer et votre approche avec la base de données.
    Laisser l'auto-inc à ACCESS.

    Pour le reste, votre demande n'est pas très clair, quel est le but réel, le besoin d'utilisateur ?


    ADO : en ce moment, je me bas lorsque tu as juste 400 lignes mais qu'un blob de 25Mo est dedans, le Open d'un clUseClient ne peut pas dépasser les 2Go sur un process 64Bits, et passer en clUseServer, ... impact encore inconnu, comme toi, ADO pour moi c'est dépassé, obsolète depuis ADO.NET qui donne l'impression que le premier a été abandonné, vu que l'application est 100% N-Tiers, j'espère la passer intégralement en UseServer\ForwardOnly pour les perf.


    Last c'est l'inverse de First sur un DataSet, cela se positionne sur le dernier record.
    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

Discussions similaires

  1. [AC-2007] Comment supprimer des masques de saisie enregistrés
    Par Jiben59 dans le forum Access
    Réponses: 3
    Dernier message: 20/03/2013, 09h41
  2. Quel outil pour gérer facilement des masques de saisie et BD?
    Par Dsphinx dans le forum Bibliothèques et frameworks
    Réponses: 1
    Dernier message: 08/11/2012, 20h34
  3. Débutant insertion sans suppression des antislash
    Par sebys dans le forum Requêtes
    Réponses: 3
    Dernier message: 17/05/2008, 16h59
  4. Vérification des champs et Masques de Saisies
    Par ToTo13 dans le forum VBA Access
    Réponses: 2
    Dernier message: 04/06/2007, 12h15
  5. numero special sans masque de saisie
    Par escobar dans le forum Access
    Réponses: 3
    Dernier message: 26/07/2006, 13h11

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