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 :

Contrôle de clé d'une table Mysql


Sujet :

Delphi

  1. #41
    Nouveau Candidat au Club
    Bonjour le forum!!!
    Mr ShaiLeTroll, rassurez vous ce n'est pas un programme conçu avec SGBD paradox et transformé SQL, c'est vrai c'est un programme que j'ai écris depuis 2009 et qui fonctionnait parfaitement très bien. je ne suis pas aussi nouveau comme vous le pensez. Au faites la difficulté c'est que quand je parcourt les lignes du code je ne vois aucune anomalie et c'est justement ce qui me paraît un peu bizarre. Le problème c'est que le contrôle de doublon se fait parfaitement sur plusieurs enregistrements et déconne par moment en affichant le message duplicate key et comme je ne m'en sortais pas j'ai jugé bon vous l'à soumettre pour d'éventuelle solution. Merci pour la compréhension.

  2. #42
    Membre émérite
    IL faut nous envoyer quelques éléments de votre code pour que nous puissions vous aider

  3. #43
    Nouveau Candidat au Club
    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
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    Tampon1.First;
    While not Tampon1.Eof do
    begin
      If Produit.Locate('CodPro', VarArrayOf([Tampon1.Fields[0].asstring]), []) then
      begin
        Produit.Edit;
        Produit.FieldByName('Stock').AsFloat := Produit.FieldByName('Stock').AsFloat-Tampon1.Fields[3].asfloat;
        Produit.Post;
      end;
     
      Vente.AppendRecord([Edit5.Text, Tampon1.Fields[0].AsString, Tampon1.Fields[3].AsFloat, Tampon1.Fields[5].Asfloat, Tampon1.Fields[6].Asfloat]);
      som := som + Tampon1.Fields[6].AsInteger;
      //Tot := Tot + Tampon1.Fields[7].AsInteger;
     
      tampon.First;
      If tampon.Locate('CodTam', VarArrayOf([Tampon1.Fields[0].asstring]), []) then
      begin
        tampon.Edit;
        tampon.Fields[3].AsFloat := tampon1.FieldByName('QteFin').AsFloat;
        tampon.Post;
      end;
     
      Stocker.First;
     
      if Stocker.Locate('CodPro;DatStock;Nature', VarArrayOf([Tampon1.Fields[0].AsString, DateOf(Datetimepicker1.DateTime), 'Sortie']), []) then
      begin
        Stocker.Edit;
        Stocker.FieldByName('Qte').AsFloat := Stocker.FieldByName('Qte').AsFloat + tampon1.FieldByName('Qte').AsFloat;
        Stocker.FieldByName('QteFin').AsFloat := tampon1.FieldByName('QteFin').AsFloat;
        Stocker.FieldByName('Heure').AsString := edit12.Text;
        Stocker.Post;
      end
      else
      begin
        Stocker.Insert;
        Stocker.FieldByName('CodPro').AsString := Tampon1.Fields[0].AsString;
        Stocker.FieldByName('DatStock').AsDateTime := DateOf(Datetimepicker1.DateTime); // DateTime ?
        Stocker.FieldByName('Heure').AsString := edit12.Text;
        Stocker.FieldByName('Nature').AsString := 'Sortie';
        Stocker.FieldByName('QteIni').AsFloat := tampon1.FieldByName('QteIni').AsFloat;
        Stocker.FieldByName('Qte').AsFloat := tampon1.FieldByName('Qte').AsFloat;
        Stocker.FieldByName('QteFin').AsFloat := tampon1.FieldByName('QteFin').AsFloat;
        Stocker.Post;
      end;
      Tampon1.Next;
    end;

    c'est à ce niveau que se trouve le problème et je recherche où se trouve l'anomalie. Merci

  4. #44
    Rédacteur/Modérateur

    Citation Envoyé par Pascal AFATONDJI Voir le message
    SQL n'est pas ecarté, si vous aviez une solution avec SQL proposé là moi
    Pas sans une description complète des différentes tables impliquées tampon, tampon1, stocker. par complète j'entends type de table, description des colonnes, description précise des index.
    Sans parler de la construction de ces tables tampons

    si j'avais la possibilité de vous envoyer la structure de la table
    c'est quand même pas si difficile que ça d'extraire des scripts de création de table pour un SGBD digne de ce nom
    La seule chose absolue dans un monde comme le nôtre, c'est l'humour. » Albert Einstein

    Delphi installés : D3,D7,D2010,XE4,XE7,D10 (Tokyo, Rio, Sidney) et peut être quelques autres
    SGBD : Firebird 2.5, 3, SQLite
    générateurs Etats : FastReport, Rave, QuickReport
    OS : Window Vista, Windows 10, Ubuntu, Androïd

  5. #45
    Nouveau Candidat au Club
    Mr Sergio J'ai essayé de vous envoyer le fichier mais il semble que le fichier à envoyer ne doit pas depasser 60Ko. Je dois vous préciser que la table tampon est temporaire et jout juste le rôle de la table tampon.
    voici la structure des 2 tables:
    Stocker (CodPro:Var(6), DateStockatetime, Heure: Var(12), Nature:Var(8), QteIni, Qte, QteFin)
    Tampon1(Numero:Var(6), Intitulé:Var(60), QteIni, Qte, QteFin, Prix1, Montant1, Mont1)

  6. #46
    Rédacteur/Modérateur

    Citation Envoyé par Pascal AFATONDJI Voir le message
    Mr Sergio J'ai essayé de vous envoyer le fichier mais il semble que le fichier à envoyer ne doit pas depasser 60Ko.
    Vous ai-je demandé les données ? Non, je vous ai demandé les structures

    Je dois vous préciser que la table tampon est temporaire et joue juste le rôle de la table tampon.
    ça j'avais compris, sauf que, d'après votre code vous en utilisez deux et que vous ne nous avez toujours pas dit comment vous remplissez ces tables ni même s'il s'agit de table mysql ou autre chose !


    voici la structure des 2 tables:
    Stocker (CodPro:Var(6), DateStockatetime, Heure: Var(12), Nature:Var(8), QteIni, Qte, QteFin)
    Tampon1(Numero:Var(6), Intitulé:Var(60), QteIni, Qte, QteFin, Prix1, Montant1, Mont1)
    Il y a du mieux mais je ne vois nulle part les indications d'index !

    Voilà ce que j'aurais aimé voir, quelque chose de ce genre :
    CREATE TABLE `ps_carrier` (
    `id_carrier` INT(10) UNSIGNED NOT NULL AUTO_INCREMENT,
    `id_reference` INT(10) UNSIGNED NOT NULL,
    `id_tax_rules_group` INT(10) UNSIGNED NULL DEFAULT 0,
    `name` VARCHAR(64) NOT NULL,
    `url` VARCHAR(255) NULL DEFAULT NULL,
    `active` TINYINT(1) UNSIGNED NOT NULL DEFAULT 0,
    `deleted` TINYINT(1) UNSIGNED NOT NULL DEFAULT 0,
    `shipping_handling` TINYINT(1) UNSIGNED NOT NULL DEFAULT 1,
    `range_behavior` TINYINT(1) UNSIGNED NOT NULL DEFAULT 0,
    `is_module` TINYINT(1) UNSIGNED NOT NULL DEFAULT 0,
    `is_free` TINYINT(1) UNSIGNED NOT NULL DEFAULT 0,
    `shipping_external` TINYINT(1) UNSIGNED NOT NULL DEFAULT 0,
    `need_range` TINYINT(1) UNSIGNED NOT NULL DEFAULT 0,
    `external_module_name` VARCHAR(64) NULL DEFAULT NULL,
    `shipping_method` INT(2) NOT NULL DEFAULT 0,
    `position` INT(10) UNSIGNED NOT NULL DEFAULT 0,
    `max_width` INT(10) NULL DEFAULT 0,
    `max_height` INT(10) NULL DEFAULT 0,
    `max_depth` INT(10) NULL DEFAULT 0,
    `max_weight` DECIMAL(20,6) NULL DEFAULT 0.000000,
    `grade` INT(10) NULL DEFAULT 0,
    PRIMARY KEY (`id_carrier`),
    INDEX `deleted` (`deleted`, `active`),
    INDEX `id_tax_rules_group` (`id_tax_rules_group`),
    INDEX `reference` (`id_reference`, `deleted`, `active`)
    )
    La seule chose absolue dans un monde comme le nôtre, c'est l'humour. » Albert Einstein

    Delphi installés : D3,D7,D2010,XE4,XE7,D10 (Tokyo, Rio, Sidney) et peut être quelques autres
    SGBD : Firebird 2.5, 3, SQLite
    générateurs Etats : FastReport, Rave, QuickReport
    OS : Window Vista, Windows 10, Ubuntu, Androïd

  7. #47
    Nouveau Candidat au Club
    Je viens de vous envoyé le fichier de la base de données.

  8. #48
    Rédacteur/Modérateur

    On ne retiendra que ça, cela évitera aux lecteurs de charger le SQL

    DROP TABLE IF EXISTS `stocker`;
    CREATE TABLE `stocker` (
    `CodMat` varchar(6) NOT NULL,
    `DatStock` datetime NOT NULL,
    `Heure` varchar(12) DEFAULT NULL,
    `Nature` varchar(8) NOT NULL,
    `QteIni` double DEFAULT NULL,
    `Qte` double DEFAULT NULL,
    `QteFin` double DEFAULT NULL,
    PRIMARY KEY (`CodMat`,`DatStock`,`Nature`)
    ) ENGINE=InnoDB DEFAULT CHARSET=latin1;

    --
    -- Definition of table `tampon`
    --

    DROP TABLE IF EXISTS `tampon`;
    CREATE TABLE `tampon` (
    `CodTam` varchar(10) DEFAULT NULL,
    `Libelle` varchar(60) DEFAULT NULL,
    `Date` datetime DEFAULT NULL,
    `Qte` double DEFAULT NULL,
    `Stock` double DEFAULT NULL,
    `Montant` double DEFAULT NULL,
    `Prix` double DEFAULT NULL,
    `Mont` double DEFAULT NULL,
    `Nombre` double DEFAULT NULL,
    `QteRes` double DEFAULT NULL,
    `NumFrs` varchar(20) DEFAULT NULL,
    `Caisse` varchar(20) DEFAULT NULL
    ) ENGINE=InnoDB DEFAULT CHARSET=latin1;

    --
    -- Definition of table `tampon1`
    --

    DROP TABLE IF EXISTS `tampon1`;
    CREATE TABLE `tampon1` (
    `Numero` varchar(6) DEFAULT NULL,
    `Intitule` varchar(60) DEFAULT NULL,
    `QteIni` double DEFAULT NULL,
    `Qte` double DEFAULT NULL,
    `QteFin` double DEFAULT NULL,
    `Prix1` double DEFAULT NULL,
    `Montant1` double DEFAULT NULL,
    `Mont1` double DEFAULT NULL
    ) ENGINE=InnoDB DEFAULT CHARSET=latin1;
    Quand vous nous aurez indiqué comment vous chargé ces tables tampons (qui ne sont pas des tables temporaires mais bien des tables existantes même si vous les videz par la suite)
    on y verra certainement plus clair.
    En tout cas tout administrateur de base de données trouvera beaucoup de choses à dire à vos structures !
    Un conseil : Ajoutez un identifiant unique, un entier auto-incrémenté servant de clé primaire puis passez vos index primaires en simple index unique
    La seule chose absolue dans un monde comme le nôtre, c'est l'humour. » Albert Einstein

    Delphi installés : D3,D7,D2010,XE4,XE7,D10 (Tokyo, Rio, Sidney) et peut être quelques autres
    SGBD : Firebird 2.5, 3, SQLite
    générateurs Etats : FastReport, Rave, QuickReport
    OS : Window Vista, Windows 10, Ubuntu, Androïd

  9. #49
    Nouveau Candidat au Club
    oui Mr Sergio vous auriez constatez que je n'ai pas lié les tables dans le SGBD mais je l'ai fait dans le programme pour raison personnel que ça ne vous inquiète pas.
    Pour ce qui concerne la charge des tables c'est un bouton qui enregistre les données dans la table tampon1 et pour enregistrer un produit vendu par exemple: Numéro prends la référence du produit, Intitulé prends la Désignation du produit, Qté prends la quantité vendue ainsi de suite.

  10. #50
    Rédacteur/Modérateur

    Bonjour,
    oui Mr Sergio vous auriez constaté que je n'ai pas lié les tables dans le SGBD mais je l'ai fait dans le programme pour raison personnel que ça ne vous inquiète pas.
    Oh que si, je crois que vous n'avez absolument rien compris à mes conseils et ne me rassure pas sur une mise en production multi-utilisateur
    Bien sûr que j'ai constaté le manque (criant) de références croisées (FOREIGN KEY) empirant la robustesse de la base de données mais ce n'est pas le problème actuel et il y a tellement d'autres erreurs de structures

    TABLE `stocker` : `CodMat` varchar(6) NOT NULL,
    TABLE `tampon` : `CodTam` varchar(10) DEFAULT NULL, << s'il s'agit bien du code mat rien ne vous choque ?
    TABLE `tampon1` : `Numero` varchar(6) DEFAULT NULL,
    La colonne `DatStock` datetime NOT NULL me pose problème, en tout cas, le DateOf(DateTimePicker1.date) est donc, quelque-part à éviter
    surtout que juste après vous avez une colonne `Heure` varchar(12) DEFAULT NULL, (type varchar au demeurant ) un peu d'explication sur la colonne ne ferait pas de mal !
    Pourquoi stocker des colonnes calculées ? exemple
    Tampon1
    `QteIni` double DEFAULT NULL,
    `Qte` double DEFAULT NULL,
    `QteFin` double DEFAULT NULL, // Qtefin=QteIni-Qte
    `Prix1` double DEFAULT NULL,
    `Montant1` double DEFAULT NULL, // Montant1=Qte*Prix_1
    `Mont1` double DEFAULT NULL // ????
    Pourquoi utiliser des redondances i.e les intitulés du produit

    TABLE `tampon` : `Libelle` varchar(60) DEFAULT NULL,
    TABLE `tampon1`: 'Intitule` varchar(60) DEFAULT NULL,
    au risque de tout faire foirer dans des recherches SQL futures ?
    La seule chose absolue dans un monde comme le nôtre, c'est l'humour. » Albert Einstein

    Delphi installés : D3,D7,D2010,XE4,XE7,D10 (Tokyo, Rio, Sidney) et peut être quelques autres
    SGBD : Firebird 2.5, 3, SQLite
    générateurs Etats : FastReport, Rave, QuickReport
    OS : Window Vista, Windows 10, Ubuntu, Androïd

  11. #51
    Rédacteur/Modérateur

    Pour répondre au code

    ligne 4-9
    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
      If Produit.Locate('CodPro', VarArrayOf([Tampon1.Fields[0].asstring]), []) then
      begin
        Produit.Edit;
        Produit.FieldByName('Stock').AsFloat := Produit.FieldByName('Stock').AsFloat-Tampon1.Fields[3].asfloat;
        Produit.Post;
      end;


    se remplace par
    Code SQL :Sélectionner tout -Visualiser dans une fenêtre à part
    UPDATE PRODUIT SET STOCK=STOCK-:QTE WHERE CODEPRO=:CDP

    Pourquoi faire ça ? Locate était certes adapté et rapide pour Paradox (table chargée en mémoire) si vous voulez passer à un stade au dessus (multi-utilisateur justifié par l'utilisation de MySQL) ce n'est plus adapté du tout


    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
    22
    23
    24
    var aQuery : TQuery;    // en se basant sur des composants BDE 
                                              // vous ne nous avez toujours pas indiqué quels composants de connexion vous utilisiez 
    ...
    
    aQuery:=TQuery.Create;
    aQuery.DatabaseName:=  // ????? à remplir ;
    
    try
    Tampon1.First;
    While not Tampon1.Eof do
    begin
      aQuery.SQL.text:='UPDATE PRODUIT SET STOCK=STOCK-:QTE WHERE CODEPRO=:CDP';
      aQuery.ParamByName('CDP').asString:=Tampon1.FieldByName('NUMERO').asString;
      aQuery.ParamByName('QTE').asFloat:=Tampon1.FieldByName('Qte').asfloat; // plus facile à lire
      aQuery.ExecSQL; 
    
      //... suite traitement
     
      tampon1.next;
    end;
    
    finally
     aQuery.free
    end;


    Lignes 15-21
    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     tampon.First;
      If tampon.Locate('CodTam', VarArrayOf([Tampon1.Fields[0].asstring]), []) then
      begin
        tampon.Edit;
        tampon.Fields[3].AsFloat := tampon1.FieldByName('QteFin').AsFloat;
        tampon.Post;
      end;

    Tiens, bizarre, cela ne répond plus au code (avec boucle) présenté la première fois
    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    tampon.First;
    while not tampon.Eof do
    begin
    if (tampon.FieldByName('CodTam').AsString = Tampon1.Fields[0].asstring)then
    begin
    tampon.Edit;
    tampon.Fields[3].AsFloat := tampon1.FieldByName('QteFin').AsFloat;
    tampon.Post;
    break;
    end
    else
    tampon.Next;
    end;

    Si je m'en souviens c'est qu'il m'avait particulièrement choqué !
    Ce dernier étant bien sûr remplaçable par une requête, comme il s'agit de déstockage et à moins qu'il n'y ait des quantités négatives cela se traduirai par
    Code SQL :Sélectionner tout -Visualiser dans une fenêtre à part
    SELECT MIN(QTEFIN) FROM TAMPON1 WHERE CODTAM=:CDP

    Mais comme je l'ai indiqué au niveau de l'analyse très partielle de la structure de vos tables,la colonne QTEFIN ne devrait même pas exister

    J'espère que ceci vous fera réfléchir
    La seule chose absolue dans un monde comme le nôtre, c'est l'humour. » Albert Einstein

    Delphi installés : D3,D7,D2010,XE4,XE7,D10 (Tokyo, Rio, Sidney) et peut être quelques autres
    SGBD : Firebird 2.5, 3, SQLite
    générateurs Etats : FastReport, Rave, QuickReport
    OS : Window Vista, Windows 10, Ubuntu, Androïd

  12. #52
    Nouveau Candidat au Club
    Bonjour!!!
    Mr Sergio je vois la pertinence de vos remarques faites sur la structure de la base de donnée. d'abord je dois vous préciser que les deux tables tampon créé ne font pas partir de la structure, ils sont juste là pour me garder des informations que j'exploite après dans les procédures. Par rapport aux informations calculées dont vous aviez fait mention, je vous dirai tout simplement que çà m'est utile dans la sortie de l'Etat de la fiche de stock d'un produit durant une période donnée. Peut être que ma façon d'analyser les informations et de concevoir n'est pas la meilleure et je crois que avec votre soutien j'arriverai à être professionnelle du domaine. Oui vous auriez constaté un changement du code effectivement j'avais essayé ce que Mr ShaiLeTroll m'avais apporté comme une piste de solution. C'est ça j'ai balancé. toutes mes excuses. Je vous reviens par rapport à cette dernière solution que je viens de recevoir de vous. Merci infiniment pour votre disponibilité à m'accompagner.

  13. #53
    Rédacteur/Modérateur

    Citation Envoyé par Pascal AFATONDJI Voir le message
    Par rapport aux informations calculées dont vous aviez fait mention, je vous dirai tout simplement que çà m'est utile dans la sortie de l'Etat de la fiche de stock d'un produit durant une période donnée.
    Je me doutais bien que cela avait un rapport avec les sorties (que ce soit état ou écran). Vous avez là une très mauvaise approche. Votre sortie de données devrait se faire à partir d'une requête SQL
    on peut très bien écrire
    Code SQL :Sélectionner tout -Visualiser dans une fenêtre à part
    SELECT QINI-QTE AS STOCKFIN FROM ....
    La seule chose absolue dans un monde comme le nôtre, c'est l'humour. » Albert Einstein

    Delphi installés : D3,D7,D2010,XE4,XE7,D10 (Tokyo, Rio, Sidney) et peut être quelques autres
    SGBD : Firebird 2.5, 3, SQLite
    générateurs Etats : FastReport, Rave, QuickReport
    OS : Window Vista, Windows 10, Ubuntu, Androïd

  14. #54
    Nouveau Candidat au Club
    Mr Sergio mais vous avez un bon style pour vous moquer des gens hein. Peut être que mon explication ne vous paraît pas trop clair. j'ai créé le champ QteFin pour me facilité la tâche dans la requête qui allait me sortir l'Etat. C'est ça je tentais de vous expliquer, Bon ce n'est pas là l'important. Je suis avec intérêt vos conseils

  15. #55
    Rédacteur/Modérateur

    Bonjour,
    Citation Envoyé par Pascal AFATONDJI Voir le message
    Mr Sergio mais vous avez un bon style pour vous moquer des gens hein.
    Merci, ne vous étonnez donc pas que mes conseils deviennent (quand il y en aura) de plus en plus rares

    Peut-être que mon explication ne vous paraît pas trop clair.
    Là c'est vous qui me prenez pour un idiot

    j'ai créé le champ QteFin pour me facilité la tâche dans la requête qui allait me sortir l'Etat.

    Je crois que vous confondez Requête (Query) et Table car, justement, s'il s'agissait d'une requête vous n'auriez pas besoin de ce champ calculé.
    Demandez donc a un bon DBA ce qu'il peut penser de ces champs calculés AMHA vous êtes resté coincé avec les structures de fichier Paradox.

    Savez-vous qu'il existe des colonnes calculées beaucoup plus fiables que ce qu'un programme pourrait faire (en particulier si vous ne gérez pas les transactions)
    La seule chose absolue dans un monde comme le nôtre, c'est l'humour. » Albert Einstein

    Delphi installés : D3,D7,D2010,XE4,XE7,D10 (Tokyo, Rio, Sidney) et peut être quelques autres
    SGBD : Firebird 2.5, 3, SQLite
    générateurs Etats : FastReport, Rave, QuickReport
    OS : Window Vista, Windows 10, Ubuntu, Androïd

  16. #56
    Membre expert
    Citation Envoyé par Pascal AFATONDJI Voir le message
    Mr Sergio mais vous avez un bon style pour vous moquer des gens hein.
    Je trouve ton commentaire bien péremptoire pour quelqu'un qui demande de l'aide...

    Citation Envoyé par Pascal AFATONDJI Voir le message

    Peut être que mon explication ne vous paraît pas trop clair.
    Effectivement tes explications n'ont pas souvent été très claires et SergioMaster a du te tirer les vers du nez... Ce qui lui a fait perdre du temps, tu devrai plutôt le remercier, ainsi que les autres qui ont apporté leur pierre à l'ouvrage...
    Sache qu'un exposé du problème est la condition nécessaire à la résolution d'un problème sur un forum... Si tu donnes des informations parcellaires tu n'auras que des réponses parcellaires...
    De plus en prenant le temps d'exposer ton problème par écrit de façon claire, cela va te donner de la réflexion aussi sur le dit problème et peu être que la solution viendra d'elle même

    Citation Envoyé par Pascal AFATONDJI Voir le message

    j'ai créé le champ QteFin pour me facilité la tâche dans la requête qui allait me sortir l'Etat.
    Le coup de la colonne calculé dans la table, j'en ai utilisé aussi de temps à autre pour me faciliter la vie (je le confesse), mais la remarque de SergioMaster est pertinente, c'est pas la façon la plus élégante de travailler, cette remarque visait à te donner de bonnes habitudes de programmation, c'est tout. Si tu le prends mal, c'est ton problème.

    Citation Envoyé par Pascal AFATONDJI Voir le message

    C'est ça je tentais de vous expliquer, Bon ce n'est pas là l'important. Je suis avec intérêt vos conseils
    Je pense que tu as de grosses lacunes.
    L'utilisation de composants TTable n'est pas adapté à l'usage que tu veux en faire, même si dans l'absolu ça peut fonctionner.
    Si tu ne veux pas passer par des requêtes SQL et des TQuery. Il faut simplement que tu le dise à SergioMaster, comme ça il évitera de perdre son temps à te donner des pistes dans ce sens là
    Mais je continue de penser que tu ne réfléchi pas assez à ce que tu veux coder et surtout à la façon de le coder...

    Tous les membres du forum qui t'on répondu ici ont de nombreuses années de développement derrière eux (parfois plusieurs dizaines) et les solution proposées sont toutes viables (avec un peu d'effort)... Si tu n'a pas encore résolu ce problème c'est que ta compréhension du langage et des concepts informatiques sont à renforcer

    Un problème bien énoncé est à moitié résolu, n'oublie jamais ça

    Pour en revenir à ta phrase du début :

    Citation Envoyé par Pascal AFATONDJI Voir le message
    Mr Sergio mais vous avez un bon style pour vous moquer des gens hein.
    Tu devrais méditer cette citation :


    Mieux se taire et avoir l'air stupide que le confirmer en voulant parler !

  17. #57
    Membre expert
    D'ailleurs je suis tombé sur un de tes posts en date du 22/05/2020 ici qui n'a pas eu de réponse : https://www.developpez.net/forums/d2078180/systemes/windows/impression-d-image-print-dialog/

    Comprenne qui pourra... Avec des exposés comme ça tu va pas avancer bien loin !!!

    Sur ceux, je te souhaite un bon weekend studieux dans l'étude du Pascal Objet et du SQL et je vais cultiver mon jardin !!!

  18. #58
    Nouveau Candidat au Club
    Bonjour le Forum!!!
    Mr Sergio veuillez bien m'excuser pour mes propos. mon intention n'étais pas de vous blesser mais malheureusement je m'en suis rendu compte après vous avoir lu vos dernier poste. Je profite pour remercier tous les membres qui m'ont apporté des approches de solution. j'avoue que ça n'a pas été facile mais au finish c'est le résultat qui compte.
    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
    22
    23
    24
    25
    26
    var aQuery : TQuery;    // en se basant sur des composants BDE 
                                              // vous ne nous avez toujours pas indiqué quels composants de connexion vous utilisiez 
    begin
    //...
     
     aQuery:=TQuery.Create;
     aQuery.DatabaseName:=  // ????? à remplir ;
     
     try
     Tampon1.First;
     While not Tampon1.Eof do
     begin
       aQuery.SQL.text:='UPDATE PRODUIT SET STOCK=STOCK-:QTE WHERE CODEPRO=:CDP';
       aQuery.ParamByName('CDP').asString:=Tampon1.FieldByName('NUMERO').asString;
       aQuery.ParamByName('QTE').asFloat:=Tampon1.FieldByName('Qte').asfloat; // plus facile à lire
       aQuery.ExecSQL; 
     
       //... suite traitement
     
       tampon1.next;
     end;
     
     finally
      aQuery.free
     end;
    end;

    Cette approche m'a vraiment servi, je m'en suis inspiré pour résoudre le problème définitivement. Merci une fois encore à vous tous

###raw>template_hook.ano_emploi###