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

SQL Firebird Discussion :

Importer un lot de données DOC ou XLS


Sujet :

SQL Firebird

  1. #1
    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 Importer un lot de données DOC ou XLS
    Salut !

    Dans mon travail, je reçois des données format doc. A l'heure actuelle, la démarche de migration de ces données à notre SGBDR est totalement manuelle, car il s'agit d'une saisie pure et simple. Afin d'automatiser cette tâche on pense à une requête SQL genre :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Insert fichier_xls into table (colonne)
    évidemment, dans firebird, cette syntaxe n'existe pas. Donc, ma demande est de savoir s'il est possible de créer un bloc de code comme le fait ibexpert pour insérer ce lot de données sans passer par l'ajout ligne par ligne ?

    Toute proposition est la bienvenue pour une discussion fructueuse. Votre expérience dans le domaine de la migration de données m'aidera à tracer une trajectoire et me pencher sur une solution semi ou totalement automatique.

    Merci par avance.
    Bon courage ou Bonne Chance (selon le contexte)
    Mon blog sur WordPress

  2. #2
    Rédacteur/Modérateur

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

    je dirais que pour un fichier xls ou . doc il faut faire une croix sur la partie automatique , cela aurait été un simple fichier .txt de format fixe on aurait pu envisager la liaison a une "table externe"

    les fichier .doc ou .xls contenant des 'formatages' cette solution n'est pas possible , le seul moyen est de passer par un programme qui :
    - soit fera directement la lecture du document /contrôle /écriture dans la BDD
    - soit fera une lecture du document [contrôle] + création d'un script sql
    puis exécution de ce dernier ou production d'un fichier txt ou csv

    cependant je vais modérer mon propos en ce qui concerne xls avec la version 2.5 de firebird on peut se connecter a plus d'une SGBD , le doute : est-ce possible de se lier a un xls ?


    un peu de lecture

    Importation et exportation massives de données .....
    Can I do multi-database or cross-database queries with Firebird?
    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 é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
    Merci Sergio pour la réponse.

    En lisant tes deux liens, je suis tombé sur un bout de code qui pourrait bien m'avancer. A l'exécution j'ai une erreur de type "parsing error" que je n'arrive pas à résoudre.

    voici le bout de 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
    21
    22
     execute ibeblock
       returns (outstr varchar(100))
       as
       begin
        i = 0; (-- Just a counter of inserted records)
        FS = ibec_fs_OpenFile('C:\MyData.csv', __fmOpenRead);
        if (not FS is null) then
        begin
          while (not ibec_fs_Eof(FS)) do
          begin
            s = ibec_fs_Readln(FS);
            ValCount = ibec_ParseCSVLine(Vals, s, ´´, ':', __csvEmptyStringAsNull);
            INSERT INTO Ma_table (ID, FIRST_NAME, LAST_NAME, SEX) VALUES :Vals;
            commit;
            i = i + 1;
          end
          ibec_fs_CloseFile(FS);
        end
     
        outstr = i || ' records inserted into Ma_table';
        suspend;
      end
    Bon courage ou Bonne Chance (selon le contexte)
    Mon blog sur WordPress

  4. #4
    Rédacteur/Modérateur

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

    Où as tu trouvé ce code ?
    Le parsing erreur vient certainement d'une erreur dans le fichier csv
    quant à la bibliothèque nécessaire est-ce des UDFs ?
    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 é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
    Bonjour !
    Citation Envoyé par SergioMaster Voir le message
    Où as tu trouvé ce code ?
    Parait que le bout de code t'a plu
    En fait c'est un code du help en ligne de Ibexpert.
    Citation Envoyé par SergioMaster Voir le message
    Le parsing erreur vient certainement d'une erreur dans le fichier csv
    Pas du tout, il manquait une ',' je l'ai corrigé mais là j'ai une erreur de type
    conversion error from string "Av".
    "Av" est une colonne de mon fichier csv, malgré que j'ai mis le format nombre qui correspond au type "smallint" de ma table mais j'ai toujours cette erreur.

    J'ai affiché la chaine retournée dans la variable "s" et j'ai eu le bon résultat :
    233;31.08.2013;15;15;245;21;57237;4;0;0;0;0
    Voici le bout de code en question :
    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
     execute ibeblock
       returns (Resultat varchar(50))
       as
       begin
        i = 0;
        FS = ibec_fs_OpenFile('C:\Partage\curage_chlef.csv', __fmOpenRead);
        if (not FS is null) then
        begin
          while (not ibec_fs_Eof(FS)) do
          begin
            s = ibec_fs_Readln(FS);
            ValCount = ibec_ParseCSVLine(Vals, s, '', ';', __csvEmptyStringAsNull);
            INSERT INTO tb_curage (code_commune, date_curage, nombre_reclamation, nombre_intervention,
                                   lineaire_cure, regard_cure, volume_collecte, dechet_evacue,
                                   pose_conduites, regard_realise, nbr_branchemen_realise, avaloir_cure) VALUES :Vals;
            i = i + 1;
            commit;
          end
          ibec_fs_CloseFile(FS);
        end
        Resultat = i || 'Ligne(s) inséré(s) dans la table tb_curage';
        suspend;
      end
    Le programme s'arrête à la ligne INSERT INTO
    Je continue à chercher cette erreur ..... qui persiste depuis hier
    Bon courage ou Bonne Chance (selon le contexte)
    Mon blog sur WordPress

  6. #6
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 030
    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 030
    Points : 40 928
    Points
    40 928
    Billets dans le blog
    62
    Par défaut
    Ah , je comprends , tu utilises IBExpert !! je pensais qu'il s'agissait d'un cas plus général et uniquement Firebird !


    Contrôle plutôt vals qui est la string après traitement
    et essayes ensuite en direct en remplaçant Vals
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    INSERT INTO tb_curage (code_commune, date_curage, nombre_reclamation, nombre_intervention,
                                   lineaire_cure, regard_cure, volume_collecte, dechet_evacue,
                                   pose_conduites, regard_realise, nbr_branchemen_realise, avaloir_cure) VALUES :Vals
    je pense que le problème peut venir de la date
    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

  7. #7
    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 SergioMaster Voir le message
    Ah , je comprends , tu utilises IBExpert !! je pensais qu'il s'agissait d'un cas plus général et uniquement Firebird !
    désolé de l'avoir signaler tard

    Citation Envoyé par SergioMaster Voir le message
    Contrôle plutôt vals qui est la string après traitement
    En fait, l'erreur venait d'une stupidité de moi, j'avais laisser les entêtes dans le fichier csv ....

    Là tout marche bien.

    Est-ce possible de contrôler l'existence de la ligne avant insertion ?
    Bon courage ou Bonne Chance (selon le contexte)
    Mon blog sur WordPress

  8. #8
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 030
    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 030
    Points : 40 928
    Points
    40 928
    Billets dans le blog
    62
    Par défaut
    Citation Envoyé par Just-Soft Voir le message
    Est-ce possible de contrôler l'existence de la ligne avant insertion ?
    plusieurs possibilités
    - Rajouter un IF , il va falloir réussir a extraire les données certainement a coup de SUBSTR ce qui va certainement être compliqué
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    IF (NOT EXISTS(SELECT 1 FROM tb_curage WHERE .......)) then
    - Utiliser un UPDATE OR INSERT , pour traiter en mise à jour
    http://www.firebirdsql.org/refdocs/l...or-insert.html
    - Gérer l'exception car si la clé existe cela en lèvera une
    http://www.firebirdsql.org/refdocs/l...exception.html
    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 é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
    Bonjour
    je crois que cette solution
    Citation Envoyé par SergioMaster Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    IF (NOT EXISTS(SELECT 1 FROM tb_curage WHERE .......)) then
    me convient, mais je me demande s'il est possible de tester sur la clé primaire ? car c'est une clé composée ceci dans le but d'éviter de mettre plusieurs expressions dans le where ...
    genre
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    IF (NOT EXISTS(SELECT 1 FROM tb_curage WHERE not(cle_primaire is null)))
    Bon courage ou Bonne Chance (selon le contexte)
    Mon blog sur WordPress

  10. #10
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 030
    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 030
    Points : 40 928
    Points
    40 928
    Billets dans le blog
    62
    Par défaut
    Perso , je préfère la 3° solution : gestion de l'exception
    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 é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 SergioMaster Voir le message
    Perso , je préfère la 3° solution : gestion de l'exception
    Oui mais il faut toujours passer par ce fameux if ! Chose qui ne marche pas dans mon 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
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
     execute ibeblock
       returns (Resultat varchar(100))
       as
       begin
        i = 0;
        FS = ibec_fs_OpenFile('C:\Partage\curage_chlef.csv', __fmOpenRead);
        if (not FS is null) then
        begin
          while (not ibec_fs_Eof(FS)) do
          begin
            s = ibec_fs_Readln(FS);
            ValCount = ibec_ParseCSVLine(Vals, s, '', ';', __csvEmptyStringAsNull);
     
            /* je crois que c'est le bon emplacement du test */
            IF (NOT EXISTS(SELECT 1 FROM tb_curage
                    WHERE ( (tb_curage.code_commune = substring(s from 1 for 4))
                    and tb_curage.date_curage = substring(s from 5 for 16))))
             then exception ligne_en_double;
            /* il m'affiche encore une erreur de type parsing error */
     
            INSERT INTO tb_curage (code_commune, date_curage, nombre_reclamation, nombre_intervention,
                                   lineaire_cure, regard_cure, volume_collecte, dechet_evacue,
                                   pose_conduites, regard_realise, nbr_branchemen_realise, avaloir_cure) VALUES :Vals;
     
            i = i + 1;
            commit;
          end
          ibec_fs_CloseFile(FS);
        end
        Resultat = i || ' Ligne(s) inséré(s) dans la table tb_curage';
        suspend;
      end
    Bon courage ou Bonne Chance (selon le contexte)
    Mon blog sur WordPress

  12. #12
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 030
    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 030
    Points : 40 928
    Points
    40 928
    Billets dans le blog
    62
    Par défaut
    Non , c'est pas comme ça que je voyais la gestion de l'exception

    mais ainsi

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    ....
    INSERT INTO tb_curage (code_commune, date_curage, nombre_reclamation, nombre_intervention,
                                   lineaire_cure, regard_cure, volume_collecte, dechet_evacue,
                                   pose_conduites, regard_realise, nbr_branchemen_realise, avaloir_cure) VALUES :Vals;
    i = i + 1;
    COMMIT;
    WHEN ANY DO
     BEGIN
       //Rollback ou log de l''erreur sans forcément lever a nouveau l''exception
     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

  13. #13
    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 SergioMaster Voir le message
    Non , c'est pas comme ça que je voyais la gestion de l'exception

    mais ainsi

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    ....
    INSERT INTO tb_curage (code_commune, date_curage, nombre_reclamation, nombre_intervention,
                                   lineaire_cure, regard_cure, volume_collecte, dechet_evacue,
                                   pose_conduites, regard_realise, nbr_branchemen_realise, avaloir_cure) VALUES :Vals;
    i = i + 1;
    COMMIT;
    WHEN ANY DO
     BEGIN
       //Rollback ou log de l''erreur sans forcément lever a nouveau l''exception
     END;
    même avec ça rien du tout ... toujours cette erreur ... ce when est-il à sa place ?
    Bon courage ou Bonne Chance (selon le contexte)
    Mon blog sur WordPress

  14. #14
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 030
    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 030
    Points : 40 928
    Points
    40 928
    Billets dans le blog
    62
    Par défaut
    l'erreur de parsing n'a rien à voir avec la gestion d'erreur , cette erreur là est propre à IbExpert je ne sais pas si elle peut être attrapée .
    Quant à la place du WHEN ANY là , je suis pas sûr peut être faut-il la placer avant le parsing ValCount = ibec_ParseCSVLine(Vals, s, '', ';', __csvEmptyStringAsNull); pour voir
    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

Discussions similaires

  1. Importation des données .txt et .xls vers MySQL
    Par Ammouna1204 dans le forum Documents
    Réponses: 7
    Dernier message: 05/09/2012, 15h00
  2. import données .doc vers mysql
    Par honey0 dans le forum EDI, CMS, Outils, Scripts et API
    Réponses: 2
    Dernier message: 22/08/2011, 14h14
  3. Importer données txt vers xls
    Par kikim78 dans le forum Macros et VBA Excel
    Réponses: 0
    Dernier message: 13/12/2009, 13h22
  4. Importer une base de données de 21Mo
    Par prgasp77 dans le forum Outils
    Réponses: 12
    Dernier message: 17/01/2007, 22h05

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