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 :

Insertion dans une table


Sujet :

Bases de données Delphi

  1. #1
    Membre du Club
    Inscrit en
    Janvier 2009
    Messages
    129
    Détails du profil
    Informations forums :
    Inscription : Janvier 2009
    Messages : 129
    Points : 52
    Points
    52
    Par défaut Insertion dans une table
    Bonjour,
    J'ai un problème d'insertion avec ma base de données.
    Sur la fiche
    Paiement
    , j'ai les champs suivants:
    Editnumpaie,Editrefsinistre,Editdatepaie,Editmontant,Editnumpiece et Editlibelle.
    Et derrière le bouton
    valider
    j'ai écrit les codes suivants qui me permettent d'inserer dans la table
    Paiement
    les elements ci_dessus,voici le code:
    base.tpaiement.FieldByName('Num_paiement').Value:=strtoint(Editnumpaie.Text);
    base.tpaiement.FieldByName('Ref_Sinistre').Value:=Editrefsinistre.Text;
    base.tpaiement.FieldByName('Date_Paye').Value:=strtoDateTime(Editdatepaie.Text);
    base.tpaiement.FieldByName('Montant').Value:=strtoint(EditMontant.Text);
    base.tpaiement.FieldByName('Numero_Pièce').Value:=Editnumpiece.Text;
    base.tpaiement.FieldByName('Libelle').Value:=Editlibelle.Text;
    base.tpaiement.Append;
    .
    Mais quand j'exécute voici le message qu'il me donne:Violation de clé.
    Un index ou une clé principale ne peut pas contenir une valeur null.
    Etant donné que
    'Num_paiement'
    est la clé principale et l'insert après la dernière valeur de
    Num_Paiement
    sans confusion de valeur.
    Mais si je met un
    DBEdit
    au niveau de
    'Num_paiement'
    les Edits chez les autres ils ne s'affiche pas sur la même ligne que
    'Num_paiement'
    et j'aimerais les faire tous comme des
    Edits
    .
    Qui a une idée pour me donner?
    Je suis vraiment dans cette difficulté, aidez moi pour me permetre de passer à cette étape.
    Merci par avance.
    Par Zizou7.

  2. #2
    Membre émérite
    Homme Profil pro
    Directeur technique
    Inscrit en
    Mai 2008
    Messages
    2 401
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Algérie

    Informations professionnelles :
    Activité : Directeur technique
    Secteur : Service public

    Informations forums :
    Inscription : Mai 2008
    Messages : 2 401
    Points : 2 304
    Points
    2 304
    Par défaut
    Salut;

    l'erreur est claire tu as une clé en double. pour contourner le problème faut travailler avec BeforeInsert ou OnNewRecord, c'est ici que ton Num_Paiement doit recevoir sa valeur.
    Bon courage ou Bonne Chance (selon le contexte)
    Mon blog sur WordPress

  3. #3
    Membre du Club
    Inscrit en
    Janvier 2009
    Messages
    129
    Détails du profil
    Informations forums :
    Inscription : Janvier 2009
    Messages : 129
    Points : 52
    Points
    52
    Par défaut Insertion dans une table
    Meerci pour votre reponse.
    Pouvez-Vous me donner un exemple d'utilisation de
    OnNewRecord?
    Par Zizou7

  4. #4
    Membre émérite
    Homme Profil pro
    Directeur technique
    Inscrit en
    Mai 2008
    Messages
    2 401
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Algérie

    Informations professionnelles :
    Activité : Directeur technique
    Secteur : Service public

    Informations forums :
    Inscription : Mai 2008
    Messages : 2 401
    Points : 2 304
    Points
    2 304
    Par défaut
    Re;

    onNewRecord est une méthode. son utilisation est assez facile, genre :

    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
     
    var
      Num_P : Integer;// en supposant que le type est integer sinon à toi de le changer
    ....
    Table1BeforePost(Sender : TObject);
    begin
      Num_Paiement := Num_P;
    end;
     
    Table1NewRecord(Sender : TObject)
    begin
      // se positionner le le dernier enregistrement
      Table1.Last;
      // on récupère la dernière clé
      Num_P := Table1.FieldByName('Num_Paiement').Value;
      // on l'incrémente
      inc(Num_P);
    end;
    attention le code n'est pas testé mais l'idée c'est ça. on résumé, on récupère la dernière clé sur un nouvelle enregistrement (OnNewRecord) puis avant validation des données on affecte la valeur de la clé.
    Bon courage ou Bonne Chance (selon le contexte)
    Mon blog sur WordPress

  5. #5
    Membre éprouvé
    Avatar de Andry
    Profil pro
    Informaticien
    Inscrit en
    Juillet 2002
    Messages
    1 164
    Détails du profil
    Informations personnelles :
    Localisation : Madagascar

    Informations professionnelles :
    Activité : Informaticien

    Informations forums :
    Inscription : Juillet 2002
    Messages : 1 164
    Points : 1 181
    Points
    1 181
    Par défaut
    Just Soft, ton système risque de créer des erreurs en mode multi-utilisateurs.
    Zizou, est ce que tu peux en dire plus sur la base de donnée et le composant d'accès utilisés.
    Sinon, j'ai remarque une petite erreur dans ton code. Généralement, on fait Append avant les affectations et Post pour valider.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    WIth base.tpaiement do
    try
        Append;
        FieldByName('Num_paiement').Value:=strtoint(Editnumpaie.Text);
        FieldByName('Ref_Sinistre').Value:=Editrefsinistre.Text;
        FieldByName('Date_Paye').Value:=strtoDateTime(Editdatepaie.Text);
        FieldByName('Montant').Value:=strtoint(EditMontant.Text);
        FieldByName('Numero_Pièce').Value:=Editnumpiece.Text;
        FieldByName('Libelle').Value:=Editlibelle.Text;
        Post;
    except
        //Ici traitement des erreurs.
    end;
    A+
    On progresse .....

  6. #6
    Membre émérite
    Homme Profil pro
    Directeur technique
    Inscrit en
    Mai 2008
    Messages
    2 401
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Algérie

    Informations professionnelles :
    Activité : Directeur technique
    Secteur : Service public

    Informations forums :
    Inscription : Mai 2008
    Messages : 2 401
    Points : 2 304
    Points
    2 304
    Par défaut
    @ Andry bien vu pour Append et Post.
    Absolument le code que j'ai proposé fonctionne en mode mono-poste.
    Bon courage ou Bonne Chance (selon le contexte)
    Mon blog sur WordPress

  7. #7
    Membre du Club
    Inscrit en
    Janvier 2009
    Messages
    129
    Détails du profil
    Informations forums :
    Inscription : Janvier 2009
    Messages : 129
    Points : 52
    Points
    52
    Par défaut Insertion dans une table
    Merci beaucoup de vos differentes reponses car je suis vraiment satisfait.
    Mais j'ai une question sur le même problème qui est le suivant:
    Comment Comparée une valeur qui est sur un
    DBGRID
    avec une valeur qu'on saisit sur un
    DBEdit?
    Par exemple on a les valeurs suivantes sur un
    DBGRID
    500/03334/08, 20000, 16000, 4000
    et on saisit
    3000
    sur un
    DBEdit
    qu'on ne veut pas que ce montant soit superieur à
    4000
    qui est sur le
    DBGRID
    . Comment le faire?
    Merci par avance.
    Je suis vous considère car ce site me donne de l'essentiel.
    Dans l'attente d'une suite favorable.
    NB:Ces differentes valeurs qui sont sur le
    DBGRID
    sont sur les differentes colonnes du
    DBGRID
    .

  8. #8
    Membre du Club
    Inscrit en
    Janvier 2009
    Messages
    129
    Détails du profil
    Informations forums :
    Inscription : Janvier 2009
    Messages : 129
    Points : 52
    Points
    52
    Par défaut Insertion dans une table
    J'ai trouvé autre moyen qui me permet d'affiché ce reste sur un
    DBEdit2
    par exemple à travers une requete parametrée. Mais j'aimerais savoir comment comparée cette valeur à une valeur qu'on saisit sur un autre
    DBEdit4
    par exemple?
    Pour ne pas que la valeur qu'on saisit sur le DBEdit4 ne soit pas superieur à celle affichée sur le
    DBEdit2
    par exemple.
    celui ou celle qui a une idée par rapport à cela m'aidera beaucoup.
    Merci par avance.
    Par Zizou7.

  9. #9
    Membre émérite
    Homme Profil pro
    Directeur technique
    Inscrit en
    Mai 2008
    Messages
    2 401
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Algérie

    Informations professionnelles :
    Activité : Directeur technique
    Secteur : Service public

    Informations forums :
    Inscription : Mai 2008
    Messages : 2 401
    Points : 2 304
    Points
    2 304
    Par défaut
    Re;

    DBEdit ou DBGrid ne font qu'afficher les données de ta table. Donc ces composant ne font que refléter les données de ton DataSet.

    Si tu fais la saisis dans l'un comme dans l'autre elle n'est prise en compte qu'après validation (post). Cela reste valable à 100% pour le DBGrid qui fait des post explicites. donc, si tu saisis tes données dans un DBGrid, tu as de la chance de les voir dans tes différents DBEdit, à défaut un refresh et tes données apparaissent. Contrairement à DBEdit où tu dois faire un post implicite pour que la saisie soit prise en considération.

    Mais l'un comme l'autre, faut voir les données dans le dataset et pas dans les composant orientés données. Pour résoudre ton problème tu dois te dire dois-je ou pas valider une saisie ne répondant pas à un critère donnée ?

    là tu as deux solutions :
    • valider la donnée, faire une recherche dans la table et si elle existe plus d'une fois la supprimer (?)
    • ne pas valider la donnée si celle là est déjà présente (!)


    le plus simple reste la seconde méthode, donc faut utiliser un BeforePost (avant validation si j'ose dire). et là tu peux par une simple recherche dans la table savoir si tu as déjà cette donnée ou pas.
    Bon courage ou Bonne Chance (selon le contexte)
    Mon blog sur WordPress

  10. #10
    Membre du Club
    Inscrit en
    Janvier 2009
    Messages
    129
    Détails du profil
    Informations forums :
    Inscription : Janvier 2009
    Messages : 129
    Points : 52
    Points
    52
    Par défaut Insertion dans une table
    Merci de votre reponse,
    Mais pouvez vous me donner un exemple conret de tout ce dont vous venez de dire?
    je vous attends impatiemment.
    Merci par avance
    Zizou7.

  11. #11
    Membre du Club
    Inscrit en
    Janvier 2009
    Messages
    129
    Détails du profil
    Informations forums :
    Inscription : Janvier 2009
    Messages : 129
    Points : 52
    Points
    52
    Par défaut Comparaison
    Toujours dans le même souci, je veux comparer deux valeurs celle qui est déclarée sous
    access
    en entier long qui est Provision_Initiale et celle dont j'écris sous delphi encore sur
    DBEdit
    dont voici le code:
    longint(DBEdit4.Text)>base.tsinistre.FieldByName('Provision_Initiale').Value ;
    begin
    Showmessage('Ce montant est superieur à la provision initiale');
    end.
    Il m'affiche ce message dont j'ai écrit dans Showmessage même si c'est 4 ou 3 que je saisi. Qu'est ce qui fait cela?
    J'avais écrit
    strtoint(DBEdit4.Text)
    mais il m'affichait le message suivant: cette valeur n'est pas une valeur entière correcte.
    Donc j'aimerais que celui qui a une proposition m'aide.
    Merci par avance.
    Par Zizou7.

  12. #12
    Membre émérite
    Homme Profil pro
    Directeur technique
    Inscrit en
    Mai 2008
    Messages
    2 401
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Algérie

    Informations professionnelles :
    Activité : Directeur technique
    Secteur : Service public

    Informations forums :
    Inscription : Mai 2008
    Messages : 2 401
    Points : 2 304
    Points
    2 304
    Par défaut
    Salut
    mais où est le test ???

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    if DBEdit4.value > base.tsinistre.FieldByName('Provision_Initiale').Value then
    Showmessage('Ce montant est superieur à la provision initiale');
    à vérifier que DBEdit dispose de value sinon un StrToFloat s'impose !
    Bon courage ou Bonne Chance (selon le contexte)
    Mon blog sur WordPress

  13. #13
    Membre du Club
    Inscrit en
    Janvier 2009
    Messages
    129
    Détails du profil
    Informations forums :
    Inscription : Janvier 2009
    Messages : 129
    Points : 52
    Points
    52
    Par défaut Comparaison
    Les DBEDit4.Text ne possede pas de value et si tu met un strtofloat(DBEDit4.Text) il t'affiche le message suivant:n'est pas une valeur en virgule flottante correcte.
    Je ne sais pas pourquoi ce message?
    Merci.

  14. #14
    Membre émérite
    Homme Profil pro
    Directeur technique
    Inscrit en
    Mai 2008
    Messages
    2 401
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Algérie

    Informations professionnelles :
    Activité : Directeur technique
    Secteur : Service public

    Informations forums :
    Inscription : Mai 2008
    Messages : 2 401
    Points : 2 304
    Points
    2 304
    Par défaut
    ce message je le connais assez bien, il s'agit du séparateur décimal. faut mettre celui du panneau de configuration à défaut si tu as mis le '.' faut le changer par une ',' sinon c'est l'inverse.

    NB : faut voir les propriétés du DBEdit pas du DBEDitx.Text ça n'a pas de cens car Text lui même est une propriété.
    Bon courage ou Bonne Chance (selon le contexte)
    Mon blog sur WordPress

  15. #15
    Membre du Club
    Inscrit en
    Janvier 2009
    Messages
    129
    Détails du profil
    Informations forums :
    Inscription : Janvier 2009
    Messages : 129
    Points : 52
    Points
    52
    Par défaut Comparaison
    Dans quelle partie du panneau de configuration que vous parlez?
    Et de quel séparateur decimal que vous parlez?
    Merci par

  16. #16
    Membre émérite
    Homme Profil pro
    Directeur technique
    Inscrit en
    Mai 2008
    Messages
    2 401
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Algérie

    Informations professionnelles :
    Activité : Directeur technique
    Secteur : Service public

    Informations forums :
    Inscription : Mai 2008
    Messages : 2 401
    Points : 2 304
    Points
    2 304
    Par défaut
    Citation Envoyé par Zizou7 Voir le message
    Dans quelle partie du panneau de configuration que vous parlez?
    Et de quel séparateur decimal que vous parlez?
    Merci par
    pour le moment oublie ce que j'ai dis concernant le panneau de configuration, remplace juste le . par une , ou l'inverse selon ce que tu as fais.
    Bon courage ou Bonne Chance (selon le contexte)
    Mon blog sur WordPress

  17. #17
    Membre émérite Avatar de edam
    Homme Profil pro
    Développeur Delphi/c++/Omnis
    Inscrit en
    Décembre 2003
    Messages
    1 894
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Maroc

    Informations professionnelles :
    Activité : Développeur Delphi/c++/Omnis
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Décembre 2003
    Messages : 1 894
    Points : 2 771
    Points
    2 771
    Par défaut
    Citation Envoyé par Just-Soft Voir le message
    pour le moment oublie ce que j'ai dis concernant le panneau de configuration,
    pas seulement sa, oublie tout ce qui se passe dans ta tete,
    comme ta dit just soft, les dbedit et db grid sont de "refleteur" des donnée , ne jamai utilise le contenut d'un dbgrid ou d'un autre composant oriente donnée pour lire ou ecrire a la main
    pour ton probleme, il faut que tu nous dise, ton dbgrid relier a quel table, et aussi ton dbedit,
    sont-ils relier a la même table ou a 2 table différent?
    pour tester tu peut utilise les événement (onpost) tout la ligne, ou sur chaue champ modifier, onvalidate, ou autre

    [edit] et avant tout lis un peut svp:
    http://delphi.developpez.com/cours/?page=sgbd#sgbd-ado
    http://fadace.developpez.com/sgbdcmp/ pour le choix d'un sgbd (pour moi je préfére Firberd et le commencement
    lis et lis encore, regarde les examples et les tutoriels des autre, débute avec un simple table, connaitre la puissance et les défauts des composants,
    avant de poste
    merci
    PAS DE DESTIN, C'EST CE QUE NOUS FAISONS

Discussions similaires

  1. [ZEOSLIB] Problème Insertion dans une table
    Par moscovisci dans le forum Bases de données
    Réponses: 1
    Dernier message: 09/06/2005, 12h05
  2. [interbase6]probleme d'insertion dans une table
    Par macadam314 dans le forum Bases de données
    Réponses: 10
    Dernier message: 22/02/2005, 14h21
  3. [Sybase] Temps d'une insertion dans une table
    Par vsavoir dans le forum Décisions SGBD
    Réponses: 5
    Dernier message: 14/02/2005, 10h04
  4. Extraction d'un .txt et Insertion dans une table
    Par PoPmiSiR dans le forum Access
    Réponses: 8
    Dernier message: 28/10/2004, 19h13
  5. Détection insertion dans une Table
    Par abelman dans le forum MS SQL Server
    Réponses: 5
    Dernier message: 06/07/2004, 14h24

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