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 :

Problème avec FDBatchMove


Sujet :

Bases de données Delphi

  1. #1
    Membre actif

    Inscrit en
    Mai 2010
    Messages
    403
    Détails du profil
    Informations forums :
    Inscription : Mai 2010
    Messages : 403
    Points : 295
    Points
    295
    Par défaut Problème avec FDBatchMove
    Bonjour à tous,

    je souhaite transférer les données d'une vieille base de données Interbase 7.5 vers une autre Firebird 4.
    pour cela j'utilise FDBatchMove .
    la table des articles sur Interbase 7.5 ne contient aucun doublon car l'index primaire est sur codeArt.

    mais lors du transfert des articles j'obtiens un message d'erreur de violation de clé primaire .

    en plus le transfert est un peu lourd (17884 ligne)

    voici le bout de code que j'utilise :


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    procedure TFMain.Button1Click(Sender: TObject);
    begin
     
      Screen.Cursor := crHourGlass ;
     
      Application.ProcessMessages ;
      try
         DataModule1.FDBatchMove1.Execute;
         ShowMessage('Terminé');
      finally
         Screen.Cursor := crDefault ;
      end;
    end;
    Avez vous une idée SVP ?

  2. #2
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 080
    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 080
    Points : 41 027
    Points
    41 027
    Billets dans le blog
    62
    Par défaut
    La première idée qui me vient : la structure et les contraintes ne sont pas les mêmes dans la table destinataire (Firebird).
    La seconde, il y a un moyen d'obtenir la liste des erreurs, voir de les ignorer

    pour répondre plus, il faut regarder
    - la structure de la table Interbase
    - la structure de la table Firebird
    il doit y avoir des différences, je pense par exemple à une sequence (ou générateur)
    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
    Membre actif

    Inscrit en
    Mai 2010
    Messages
    403
    Détails du profil
    Informations forums :
    Inscription : Mai 2010
    Messages : 403
    Points : 295
    Points
    295
    Par défaut
    Bonjour Sergio , et merci pour la réponse et pour le suivi.
    bon , voila la structure de la table des articles:

    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    CREATE TABLE Stock 
    (
      CODEART	VARCHAR(15) NOT NULL,
      DESIGNATION	VARCHAR(100),
      STOCKREEL	NUMERIC(15, 2),
      PRIX	NUMERIC(15, 2),
    CONSTRAINT PKStock  PRIMARY KEY (CODEART)
    );

    c'est la même structure pour interbase et pour firebird.
    aucun generateur n'est utilisé.

  4. #4
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 080
    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 080
    Points : 41 027
    Points
    41 027
    Billets dans le blog
    62
    Par défaut
    Dans ce cas il faudrait faire une trace des erreurs avec TBatchMove
    Peut-être Interbase 7.5 garde t-elle la trace d'enregistrements supprimés ?
    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

  5. #5
    Membre actif

    Inscrit en
    Mai 2010
    Messages
    403
    Détails du profil
    Informations forums :
    Inscription : Mai 2010
    Messages : 403
    Points : 295
    Points
    295
    Par défaut
    Citation Envoyé par SergioMaster Voir le message
    Dans ce cas il faudrait faire une trace des erreurs avec TBatchMove
    Peut-être Interbase 7.5 garde t-elle la trace d'enregistrements supprimés ?
    normalement un backup restore de la base interbase regle le probleme.

    et aussi j'ai trouvé cette discussion qui ressemble la mienne

    How exclude primary key field from FDbatchmove append?

  6. #6
    Membre actif

    Inscrit en
    Mai 2010
    Messages
    403
    Détails du profil
    Informations forums :
    Inscription : Mai 2010
    Messages : 403
    Points : 295
    Points
    295
    Par défaut
    en suivant la solution proposée sur ce lien How exclude primary key field from FDbatchmove append?

    au lieu d'insert j'ai fait un append.

    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
    procedure TFMain.Button1Click(Sender: TObject);
    var ind:integer;
    begin
     
      Screen.Cursor := crHourGlass ;
     
      Application.ProcessMessages ;
      try
         DataModule1.FDBatchMove1.Mappings.Clear;
         DataModule1.FDBatchMove1.Mappings.AddAll;
         ind := DataModule1.FDBatchMove1.Mappings.IndexOfName('PKStock');
         if ind<>-1 then
          DataModule1.FDBatchMove1.Mappings.Delete(ind);
         DataModule1.FDBatchMove1.Execute;
         ShowMessage('Terminé');
      finally
         Screen.Cursor := crDefault ;
      end;
    end;
    ça a l'air marche bien.
    seulement dans la table Interbase j'ai 17884 lignes , mais apres le transfert dans la table firebird j'ai 17877 lignes

  7. #7
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 080
    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 080
    Points : 41 027
    Points
    41 027
    Billets dans le blog
    62
    Par défaut
    Citation Envoyé par aimer_Delphi Voir le message
    seulement dans la table Interbase j'ai 17884 lignes , mais après le transfert dans la table firebird j'ai 17877 lignes
    C'est anormal

    pour Firebird j'aurai utilisé une structure différente

    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    CREATE TABLE Stock 
    ( ID BIGINT GENERATED BY DEFAULT AS IDENTITY (START WITH 1) NOT NULL,  
      CODEART	VARCHAR(15) NOT NULL,
      DESIGNATION	VARCHAR(100),
      STOCKREEL	NUMERIC(15, 2),
      PRIX	NUMERIC(15, 2),
    CONSTRAINT PKStock  PRIMARY KEY (ID)
    );
    -- et ajouté un index (peut-être après copie pour rechercher ensuite les doublons)  
    CREATE UNIQUE INDEX IDX_CODEART ON STOCK  (CODEART);

    De plus, il y a encore une possibilité, la sensibilité à la casse. Vérifier les 'Character Set' des 2 bases de données
    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

  8. #8
    Membre actif

    Inscrit en
    Mai 2010
    Messages
    403
    Détails du profil
    Informations forums :
    Inscription : Mai 2010
    Messages : 403
    Points : 295
    Points
    295
    Par défaut
    Citation Envoyé par SergioMaster Voir le message
    C'est anormal

    De plus, il y a encore une possibilité, la sensibilité à la casse. Vérifier les 'Character Set' des 2 bases de données
    Pour interbase chartset = none
    pour firebird charset = utf8.

    en plus j'ai une autre idée ,
    1- pour la table firebird , je supprime la clé primaire.
    2-apres la copie , je cherche les doublons , et je les supprime sauf une seul ligne.
    3- je recrée la clé primaire.

    mais pour le deuxième point , comment supprimé les doublons sauf une seul ligne ?

  9. #9
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 080
    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 080
    Points : 41 027
    Points
    41 027
    Billets dans le blog
    62
    Par défaut
    J'ai proposé la même chose !
    Il s'agit donc bien d'un problème de charset
    mais pour le deuxième point , comment supprimer les doublons sauf une seul ligne ?
    avec ma proposition (utilisation d'un ID autogénéré) le choix deviendrait plus facile puisque vous pourriez déceler les différences.

    Une autre solution, que je ne conseille pas vraiment, consisterait à mettre la colonne CODEART en Charset NONE pour faire le transfert
    étudier ensuite les doublons (en traitant, dans la clause where de la requête, la colonne en charset UTF8)
    enfin une fois les corrections faites (par exemple en dupliquant la colonne) il n'y a, après tout, que 7 enregistrements à modifier
    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
    Membre actif

    Inscrit en
    Mai 2010
    Messages
    403
    Détails du profil
    Informations forums :
    Inscription : Mai 2010
    Messages : 403
    Points : 295
    Points
    295
    Par défaut
    Bonjour,
    Merci beaucoup Sergio pour la réponse et pour le suivi.
    je vais mettre cette discussion comme

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

Discussions similaires

  1. VC++ Direct3D8, problème avec LPD3DXFONT et LPD3DTEXTURE8
    Par Magus (Dave) dans le forum DirectX
    Réponses: 3
    Dernier message: 03/08/2002, 11h10
  2. Problème avec [b]struct[/b]
    Par Bouziane Abderraouf dans le forum CORBA
    Réponses: 2
    Dernier message: 17/07/2002, 10h25
  3. Problème avec le type 'Corba::Any_out'
    Par Steven dans le forum CORBA
    Réponses: 2
    Dernier message: 14/07/2002, 18h48
  4. Problème avec la mémoire virtuelle
    Par Anonymous dans le forum CORBA
    Réponses: 13
    Dernier message: 16/04/2002, 16h10

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