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 :

Enregistrement non situé sur Edit de SGBD


Sujet :

Bases de données Delphi

  1. #1
    Membre confirmé
    Avatar de JP.NUAGE
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    769
    Détails du profil
    Informations personnelles :
    Âge : 81
    Localisation : France

    Informations forums :
    Inscription : Avril 2006
    Messages : 769
    Points : 542
    Points
    542
    Par défaut Enregistrement non situé sur Edit de SGBD
    Bonjour à tous

    Il y a quelque choise qui m'énerve depuis longtemps. Jusqu'à présent je m'en suis sorti par des pirouttes, mais j'aimerais bien comprendre. Voici le code

    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
    17
    18
    19
    20
    procedure TFRM_MENU.xxx;
    var i : integer;
    begin
        CDS_ART.Open;
        i := 1;
        with CDS_ART do
           while not eof do
              if fieldvalues['CODE_CLASSE'] = 'SK' then
                 begin
                    edit;
                    fieldvalues['CODE_ART'] := 'SK'+rightStr('000'+inttostr(i),3);
                    inc(i);
                    post;
                    applyupdates(0);
                    next;
                 end
              else
                 Next;
     
    end;
    Quelques précisions :

    CODE_ART n'est pas un champ d'index, ni un champ servant d'ID. Le champ qui sert d'ID n'est pas utilisé ici
    Je travaille SEUL : il n'y a pas de réseau, ni de multitache

    Le fichier s'ouvre bien, mais sur l'ApplyUpdates, j'ai le message

    Enregistrement non trouvé ou modifié par un autre utilisateur
    Si je visualise l'enregistrement je suis sur le bon.

    Ce n'est tout de même pas un programme sophistiqué !

    Alors

    Merci d'éclairer ma modeste lanterne.
    Ce qui se conçoit bien s'énonce clairement
    Et les mots pour le dire viennent aisément (Boileau)

  2. #2
    Rédacteur/Modérateur

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

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

    Informations forums :
    Inscription : Janvier 2007
    Messages : 15 029
    Points : 40 928
    Points
    40 928
    Billets dans le blog
    62
    Par défaut
    Citation Envoyé par JP.NUAGE Voir le message
    Bonjour à tous

    Il y a quelque chose qui m'énerve depuis longtemps. Jusqu'à présent je m'en suis sorti par des pirouttes, mais j'aimerais bien comprendre.
    Heureusement le B est loin du P de pirouettes vénéré équilibriste

    plus sérieusement , j'aurais écrit différemment

    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
    17
    18
    19
    20
    21
    procedure TFRM_MENU.xxx;
    var i : integer;
    begin
        CDS_ART.Open;
        i := 1;
        with CDS_ART do
        begin  
           while not eof do
             begin
              if fieldvalues['CODE_CLASSE'] = 'SK' then
                 begin
                    edit;
                    fieldvalues['CODE_ART'] := 'SK'+rightStr('000'+inttostr(i),3);
                    inc(i);
                    post;
                 end;
                 Next;
             end; // While
           ApplyUpdates(0);   // encore que , pour cela faudrait savoir comment elle est ouverte cette table ?
        end; // With 
    end;
    MVP Embarcadero
    Delphi installés : D3,D7,D2010,XE4,XE7,D10 (Rio, Sidney), D11 (Alexandria), D12 (Athènes)
    SGBD : Firebird 2.5, 3, SQLite
    générateurs États : FastReport, Rave, QuickReport
    OS : Window Vista, Windows 10, Windows 11, Ubuntu, Androïd

  3. #3
    Expert éminent sénior
    Avatar de Cl@udius
    Homme Profil pro
    Développeur Web
    Inscrit en
    Février 2006
    Messages
    4 878
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Février 2006
    Messages : 4 878
    Points : 10 008
    Points
    10 008
    Par défaut
    +1 avec SergioMaster, je sortirais l'ApplyUpdates de la boucle.

    Et pour mettre mon grain de sel , pour ceci:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    fieldvalues['CODE_ART'] := 'SK'+rightStr('000'+inttostr(i),3);
    je l'écrirais plutôt ainsi:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    FieldValues['CODE_ART'] := Format('SK%.3d', [I]);
    [Edit]
    Qu'est-ce qui se passe si tu as plus de 1000 enregistrements dans ta table ? CODE_ART est un VARCHAR(5) ?

  4. #4
    Modérateur
    Avatar de Rayek
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2005
    Messages
    5 235
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Haute Savoie (Rhône Alpes)

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

    Informations forums :
    Inscription : Mars 2005
    Messages : 5 235
    Points : 8 504
    Points
    8 504
    Par défaut
    Pour rajouter une couche, moi je passerai par une requete, ça sera encore plus fiable que de passer par les éditions des champs.
    Modérateur Delphi

    Le guide du bon forumeur :
    __________
    Rayek World : Youtube Facebook

  5. #5
    Rédacteur/Modérateur

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

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

    Informations forums :
    Inscription : Janvier 2007
    Messages : 15 029
    Points : 40 928
    Points
    40 928
    Billets dans le blog
    62
    Par défaut
    +1 avec Rayek , je ne regardais que le code
    MVP Embarcadero
    Delphi installés : D3,D7,D2010,XE4,XE7,D10 (Rio, Sidney), D11 (Alexandria), D12 (Athènes)
    SGBD : Firebird 2.5, 3, SQLite
    générateurs États : FastReport, Rave, QuickReport
    OS : Window Vista, Windows 10, Windows 11, Ubuntu, Androïd

  6. #6
    Membre confirmé
    Avatar de JP.NUAGE
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    769
    Détails du profil
    Informations personnelles :
    Âge : 81
    Localisation : France

    Informations forums :
    Inscription : Avril 2006
    Messages : 769
    Points : 542
    Points
    542
    Par défaut Enregistrement non situé
    Bon alors avec toutes ces couches je vais ouvrir une maternité

    A Rayek

    Bien sûr, les PIROUETTES que j'utilisais, c'est précisément un requête. D'accord çà marche

    A SergioMaster:

    Mettre l'ApplyUpdates en dehors de la boucle While a aussi été essayé et j'ai le même message.

    A Cl@udius

    Je ne pense pas que la codification de CODE_ART entre en ligne de compte car j'ai eu ce type de pb bien des fois avec des champs différents et des modes de remplissage tout aussi différents (et j'ai contourné en faisant ce que dit Rayek).

    Et enfin, dans ce cas précis, le nombre d'articles est inférieur à 1000 : ce n'est qu'un peu de code que j'ai tenté d'écrire pour ne pas avoir à faire

    soit un requete
    soit taper 400 fois SKxxx dans IBExpert (ce que j'ai finalement fait )

    Ma question pourrait aussi se résumer ainsi : pourquoi existe-t-il un ordre Edit, un ordre Post et un ordre ApplyUpdates s'il faut de toutes façons passer par une requête ou un procédure ?

    Mais peut-être que c'est un bug de Delphi ?

    Qu'en pense l'honorable assemblée ?
    Ce qui se conçoit bien s'énonce clairement
    Et les mots pour le dire viennent aisément (Boileau)

  7. #7
    Modérateur
    Avatar de Rayek
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2005
    Messages
    5 235
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Haute Savoie (Rhône Alpes)

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

    Informations forums :
    Inscription : Mars 2005
    Messages : 5 235
    Points : 8 504
    Points
    8 504
    Par défaut
    Citation Envoyé par JP.NUAGE Voir le message
    Ma question pourrait aussi se résumer ainsi : pourquoi existe-t-il un ordre Edit, un ordre Post et un ordre ApplyUpdates s'il faut de toutes façons passer par une requête ou un procédure ?

    Mais peut-être que c'est un bug de Delphi ?

    Qu'en pense l'honorable assemblée ?
    Non, ce n'est pas un bug, je pense que c'était surtout pour ceux qui ne connaissait pas (à l'époque du début des bases de données) les requêtes (qui autant au début n'existaient même pas aussi ).
    C'était un moyen facile pour traiter des données sans trop se casser la tête et sans apprendre un nouveau langage (le SQL).
    Mais de nos jours avec les volumes de plus en plus conséquent des bases de données, il est nécessaire de laisser de coté cette "vielle" programmation (ça ne veut pas dire qu'il ne faut plus l'utiliser, mais il faut faire attention à comment on l'utilise) et s'arranger pour tout faire avec des requêtes/procédure stockées.

    Bien sur ce n'est que mon avis et le début est surtout une supposition de comment c'était avant, moi j'ai toujours connu les requêtes depuis que je développe sur des bases de données.
    Modérateur Delphi

    Le guide du bon forumeur :
    __________
    Rayek World : Youtube Facebook

  8. #8
    Rédacteur/Modérateur

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

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

    Informations forums :
    Inscription : Janvier 2007
    Messages : 15 029
    Points : 40 928
    Points
    40 928
    Billets dans le blog
    62
    Par défaut
    c'est pour cela que j'avais mis un commentaire sur le ApplyUpdates si la table n'est pas ouverte en Cache cela ne sert a .... rien
    MVP Embarcadero
    Delphi installés : D3,D7,D2010,XE4,XE7,D10 (Rio, Sidney), D11 (Alexandria), D12 (Athènes)
    SGBD : Firebird 2.5, 3, SQLite
    générateurs États : FastReport, Rave, QuickReport
    OS : Window Vista, Windows 10, Windows 11, Ubuntu, Androïd

  9. #9
    Membre confirmé
    Avatar de JP.NUAGE
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    769
    Détails du profil
    Informations personnelles :
    Âge : 81
    Localisation : France

    Informations forums :
    Inscription : Avril 2006
    Messages : 769
    Points : 542
    Points
    542
    Par défaut
    Molière, le Médecin malgré lui
    C'est ce qui fait Monsieur que votre fille est muette
    Bon : maintenant je saurai.

    Juste pour être sûr que j'emploie les bons mots

    Pour moi une procédure se gère en ajoutant un Objet SQLStrocProc et en créant une procédure par exemple avec IBExpert

    Une requête est un code du type (je n'ai pas tout mis : ne corrigez pas et il n'a rien à voir avec le cas traité ici)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    SQ1.SQL.Clear;
       SQ1.SQL.Add('CREATE TABLE VENTES_FAMILLE(');
       SQ1.SQL.Add('FAMILLE VARCHAR(6), LIBELLE VARCHAR(20),');
       // Etc.....
       SQ1.ExecSQL(true);
    Correct ou totalement idiot ?
    Ce qui se conçoit bien s'énonce clairement
    Et les mots pour le dire viennent aisément (Boileau)

  10. #10
    Rédacteur/Modérateur

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

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

    Informations forums :
    Inscription : Janvier 2007
    Messages : 15 029
    Points : 40 928
    Points
    40 928
    Billets dans le blog
    62
    Par défaut
    je ne suis absolument pas spécialiste en IBExpert mais que ce soit en FIB+ ou
    en BDE cela me semble CORRECT

    Je ne voit pas le rapport avec un Objet StoredProc par contre
    MVP Embarcadero
    Delphi installés : D3,D7,D2010,XE4,XE7,D10 (Rio, Sidney), D11 (Alexandria), D12 (Athènes)
    SGBD : Firebird 2.5, 3, SQLite
    générateurs États : FastReport, Rave, QuickReport
    OS : Window Vista, Windows 10, Windows 11, Ubuntu, Androïd

  11. #11
    Membre confirmé
    Avatar de JP.NUAGE
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    769
    Détails du profil
    Informations personnelles :
    Âge : 81
    Localisation : France

    Informations forums :
    Inscription : Avril 2006
    Messages : 769
    Points : 542
    Points
    542
    Par défaut
    SQLStoredProc :

    Dans la liste de Objet Delphi, onglet dbExpress, je trouve SQLStoredProc. Je le colle dans ma fenêtre et je le lie à mon SQLConnection, puis je cherche la procédure enregistrée dans la base. Après je l'appelle par un code du style

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Proc.ParamByName('xxx').Values := ......
    .....
    Proc.ExecProc
    En tout cas ceci me conforte : j'utilise le bon vocabulaire. Merci
    Ce qui se conçoit bien s'énonce clairement
    Et les mots pour le dire viennent aisément (Boileau)

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

Discussions similaires

  1. Champs formule texte non visible sur nouvel enregistrement
    Par Anton2015 dans le forum Salesforce.com
    Réponses: 2
    Dernier message: 12/06/2015, 11h33
  2. Réponses: 1
    Dernier message: 27/04/2010, 10h10
  3. Réponses: 0
    Dernier message: 10/02/2010, 11h53
  4. [dessin] enregistrer un jpeg sur lequel j'ai dessiné
    Par fonta13 dans le forum Graphisme
    Réponses: 4
    Dernier message: 02/07/2004, 14h05
  5. Bip non sollicité sur les Edit
    Par David dans le forum Composants VCL
    Réponses: 2
    Dernier message: 09/09/2003, 20h32

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