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 :

Copier des enregistrements d'une table à une autre en utilisant des paramètres


Sujet :

Bases de données Delphi

  1. #1
    Futur Membre du Club
    Homme Profil pro
    Ingénieur commercial
    Inscrit en
    Juin 2011
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ariège (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur commercial
    Secteur : Distribution

    Informations forums :
    Inscription : Juin 2011
    Messages : 10
    Points : 6
    Points
    6
    Par défaut Copier des enregistrements d'une table à une autre en utilisant des paramètres
    bonjour
    J’utilise ce code pour transférer des enregistrements d'une table à l'autre en utilisant des paramètres.
    Mais le problème qui me ploque que les dates Nulles transférés dans le champ (date_enr) prenne par défaut 30/12/1899
    S’il vous plaît aidez mois à corriger ce code et bon courage
    Merci.


    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
     
    var
    i : integer;
    Begin
     
    DM1.Source.close;
    DM1.Source.open;
    DM1.Source.first;
     
    While Not DM1.Source.eof  Do
     
    Begin
     With DM1.destination Do
     
         Begin
         Active:=False;
         SQL.Clear;
         SQL.Add('Insert into customer (N°, FIRSTNAME,LASTNAME,CITY,COUNTRY,date_enr)');
         SQL.Add('Values (:b1 , :b2 , :b3 , :b4 , :b5, :b6)');
       for i:= 0 to DM1.Source.FieldCount-1 do
         Params[i].Value := DM1.source.Fields[i].Value;
         ExecSQL;
         End;
       DM1.source.next;
    End;

  2. #2
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 045
    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 045
    Points : 40 963
    Points
    40 963
    Billets dans le blog
    62
    Par défaut
    Bonsoir,

    avec tout bon SGBD, une copie de table à table peut se faire en un seul SQL pas besoin de tant de code !
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    INSERT INTO TABLEDESTINATION(champs destinations) SELECT (champs sources) FROM TABLESOURCE
    pour ce qui est de la date c'est une autre histoire qui dépend plus du SGBD qu'autre chose
    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
    Futur Membre du Club
    Homme Profil pro
    Ingénieur commercial
    Inscrit en
    Juin 2011
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ariège (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur commercial
    Secteur : Distribution

    Informations forums :
    Inscription : Juin 2011
    Messages : 10
    Points : 6
    Points
    6
    Par défaut
    Bonsoir

    merci pour ta réponse mais le problème j'utilise deux (databaseName) différentes
    la table source est dans un serveur à distance
    et la table destinataire dans mon serveur

    Bon Courage

  4. #4
    Futur Membre du Club
    Homme Profil pro
    Ingénieur commercial
    Inscrit en
    Juin 2011
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ariège (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur commercial
    Secteur : Distribution

    Informations forums :
    Inscription : Juin 2011
    Messages : 10
    Points : 6
    Points
    6
    Par défaut
    bonjour

    Je voudrais copier une table d'une base de données à l'autre. Je sais que vous pouvez facilement faire ce qui suit si les bases de données sont sur le même serveur SQL.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    INSERT INTO TABLEDESTINATION(champs destinations) SELECT (champs sources) FROM TABLESOURCE
    Existe-t-il un moyen simple de le faire si les bases de données se trouvent sur deux serveurs SQL différents, sans devoir parcourir tous les enregistrements de la table d'origine et les insérer dans la nouvelle table?

  5. #5
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 045
    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 045
    Points : 40 963
    Points
    40 963
    Billets dans le blog
    62
    Par défaut
    Bonjour difficile à dire quand on a aucune indication du dit SGBD ! (à moins que je n'ai besoin de nouvelles lunettes)
    Avec Firebird 2.5 c'est possible
    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
    Futur Membre du Club
    Homme Profil pro
    Ingénieur commercial
    Inscrit en
    Juin 2011
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ariège (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur commercial
    Secteur : Distribution

    Informations forums :
    Inscription : Juin 2011
    Messages : 10
    Points : 6
    Points
    6
    Par défaut
    bonjour

    le serveur de base de données Source : ingres
    et le serveur de base de données destination flashfiler

    Comment faire et Merci

  7. #7
    Expert confirmé
    Avatar de anapurna
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2002
    Messages
    3 421
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Mai 2002
    Messages : 3 421
    Points : 5 820
    Points
    5 820
    Par défaut
    salut


    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
    Begin
        ... 
        for i:= 0 to DM1.Source.FieldCount-1 do
        begin
           if DM1.source.Fields[i].DataType in [ftDate,ftDateTime]) then
           begin
              if  DM1.source.Fields[i].isnull Then 
              begin 
                 Params[i].Clear;
                 Params[i].Bound := TRUE;
                 Params[i].DataType := ftDateTime;
              end
              else  
                 Params[i].Value := DM1.source.Fields[i].Value;
            end
            else
              Params[i].Value := DM1.source.Fields[i].Value;  
         end;
         ExecSQL;
       End;
       DM1.source.next;
    End;
    Nous souhaitons la vérité et nous trouvons qu'incertitude. [...]
    Nous sommes incapables de ne pas souhaiter la vérité et le bonheur, et sommes incapables ni de certitude ni de bonheur.
    Blaise Pascal
    PS : n'oubliez pas le tag

  8. #8
    Futur Membre du Club
    Homme Profil pro
    Ingénieur commercial
    Inscrit en
    Juin 2011
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ariège (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur commercial
    Secteur : Distribution

    Informations forums :
    Inscription : Juin 2011
    Messages : 10
    Points : 6
    Points
    6
    Par défaut
    Bonjour
    Merci pour votre réponse Monsieur anapurna

    J’ai testé votre code Monsieur toute va bien la vitesse du transfert des enregistrements est impeccable ( 30 000 enregistrements dans moins de deux minutes).
    Mais le seul problème et je n'étais pas en mesure de trouver une solution en ce qui concerne les domaines qui sont du type datetime.
    pour les enregistrements vierges (valeurs nulles) dans la table source sont déplacés vers la table de destination en tant que date du 30/12/1899.
    Et pour m'assurer que le problème dans la qualité du champ datetime je l'ai converti en chaîne dans la table de destination et les valeurs de transfert nulles facilement, mais je veux que mon champ dans la table destination de type datetime.
    2 - Le second problème est que si le champ entier est vide dans la source, quel que soit son type, même s'il s'agit d'une chaîne, cela nous donne une erreur, c'est à dire qu'il ne reconnaît pas la plateforme à transférer vers destination.
    Résumé : La conclusion de ce que j'ai essayé est que le problème dans les valeurs nulles
    Comment forcer le code à convertir les valeurs nulles de la source à la destination quel que soit le type de champ datetime, string, integer ........


    Merci pour votre attention

  9. #9
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 045
    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 045
    Points : 40 963
    Points
    40 963
    Billets dans le blog
    62
    Par défaut
    Bonjour,

    Ingres comme FlashFiler sont pour moi des inconnues.

    A mon avis soit vous traitez les valeurs NULL à la source par l'intermédiaire de COALESCE en fournissant alors une valeur par défaut
    soit vous traitez ce problème au cours de votre transfert cependant , ce problème est double :
    - d'une part et c'est pour moi la première cause vous passez vos paramètres de manières non typées Params[i].Value := DM1.source.Fields[i].Value;, si je reprend le code proposé par anapurna j'aurais écrit Params[i].asDateTime := DM1.source.Fields[i].asDateTime;- d'autre part, en ce qui concerne la date 30/12/1899 c'est certainement le comportement normal de FlashFiler, en tout cas c'est le comportement de Paradox pour le traitement d'une date "nulle"

    Pour tout ce qui concerne les NULL vous devez, avant tout, lire la documentation de Flashfiler à ce sujet (non, je n'ai pas cherché) pour des chaines un code du genre
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
      if  DM1.source.Fields[i].isNull then 
          begin
            DM1.source.Fields[i].DataType in [ftString] then Params[i].asString:=''; // chaine vide donc avec un 0x00
            ..... 
          end;
    réglera certainement le problème du NULL pour les strings (notez que ce n'est ni plus ni moins que de mettre des valeurs par défaut !)

    NB. vous pouvez peut être aussi joué avec votre composant de requête mais comme, là également, vous n'avez pas indiqué de quel type de composant il s'agit ...
    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

  10. #10
    Futur Membre du Club
    Homme Profil pro
    Ingénieur commercial
    Inscrit en
    Juin 2011
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ariège (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur commercial
    Secteur : Distribution

    Informations forums :
    Inscription : Juin 2011
    Messages : 10
    Points : 6
    Points
    6
    Par défaut
    bonsoir

    D'abord, Monsieur SergioMaster, merci de m'occuper de mon problème
    J'ai essayé vos suggestions mais malheureusement le même problème toutes les valeurs nulles dans la tables source sont Convertis par la date par défaut du serveur FlashFiler dans la table testination.

    ce qui concerne aux composantes des requêtes utilisés dans mon code sont les suivantes. (TQuery et TffQuery)

    Nom : 1.PNG
Affichages : 1112
Taille : 1,3 Ko

  11. #11
    Futur Membre du Club
    Homme Profil pro
    Ingénieur commercial
    Inscrit en
    Juin 2011
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ariège (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur commercial
    Secteur : Distribution

    Informations forums :
    Inscription : Juin 2011
    Messages : 10
    Points : 6
    Points
    6
    Par défaut
    Bonjour,

    Merci à tous ceux qui m'ont aidé à trouver la solution, en particulier Monsieur anapurna et Monsieur SergioMaster
    Ce code fonctionne très bien en MYSQL

    Merci une autre fois et bon courage pour tous le monde

    salutations


    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
    Begin
        ... 
        for i:= 0 to DM1.Source.FieldCount-1 do
        begin
           if DM1.source.Fields[i].DataType in [ftDate,ftDateTime]) then
           begin
              if  DM1.source.Fields[i].isnull Then 
              begin 
                 Params[i].Clear;
                 Params[i].Bound := TRUE;
                 Params[i].DataType := ftDateTime;
              end
              else  
                 Params[i].Value := DM1.source.Fields[i].Value;
            end
            else
              Params[i].Value := DM1.source.Fields[i].Value;  
         end;
         ExecSQL;
       End;
       DM1.source.next;
    End;

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

Discussions similaires

  1. [AC-2007] insérer des enregistrements au milieu d'une table
    Par kroma23 dans le forum Access
    Réponses: 2
    Dernier message: 28/01/2016, 09h33
  2. [AC-2010] Enregistrer Valeurs Champ d'une table à une autre
    Par piwa6291 dans le forum VBA Access
    Réponses: 2
    Dernier message: 20/03/2015, 14h13
  3. Réponses: 6
    Dernier message: 28/01/2015, 16h34
  4. Réponses: 30
    Dernier message: 30/05/2009, 18h49
  5. Réponses: 2
    Dernier message: 27/07/2006, 07h46

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