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

Firebird Discussion :

Probleme acces Table externe


Sujet :

Firebird

  1. #1
    Membre expert
    Avatar de Barbibulle
    Profil pro
    Inscrit en
    Octobre 2002
    Messages
    2 048
    Détails du profil
    Informations personnelles :
    Âge : 53
    Localisation : France

    Informations forums :
    Inscription : Octobre 2002
    Messages : 2 048
    Points : 3 342
    Points
    3 342
    Par défaut Probleme acces Table externe
    Bonjour à tous,

    J'ai un problème avec les tables externes :

    Environnement :

    * Win 7 32bits dans une machine virtuelle.

    * Firebird-2.1.5.18497_0_Win32

    Firebird.conf modifié :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ExternalFileAccess = Full
    Arret du service firebird et redemarrage.

    Je crée dans une base existante une table externe

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    CREATE TABLE Z_TABLE EXTERNAL 'C:\REPEXT\TABLE' (
        ID  CHAR(10)
    );
    Je crée un fichier

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ECHO 1234567890>c:\REPEXT\TABLE
    Le fichier est au bon endroit et contient 1234567890

    Si je fais un
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    select T.ID from Z_TABLE T
    J'ai un message d'erreur :
    Unsuccessful execution caused by a system error that precludes
    successful execution of subsequent statements.
    Access to external file "C:\REPEXT\TABLE" is denied by server administrator.
    J'ai bien essayé d'autres répertoires mais rien n'y fait.

  2. #2
    Membre expert
    Avatar de Barbibulle
    Profil pro
    Inscrit en
    Octobre 2002
    Messages
    2 048
    Détails du profil
    Informations personnelles :
    Âge : 53
    Localisation : France

    Informations forums :
    Inscription : Octobre 2002
    Messages : 2 048
    Points : 3 342
    Points
    3 342
    Par défaut
    Bon, je me répond à moi même.

    Tout fonctionne, j'ai cru devenir fou .

    C'est un problème liè à Windows et à la façon dont j'ai modifié le firebird.conf.

    Firebird.conf se trouve dans une zone protégée de windows (program files).

    Je n'ai pas tous les tenant et aboutissants de l'histoire (il y a des différences suivant l'édition de windows et probablement le paramétrage).

    Toujours est il, dans le windows en question, j ai essayé de modifier en directe le firebird.conf avec PSPAD. (Clic droit sur le fichier).
    PSPAD n'ayant pas de droits admin (et ne m a pas demandé non plus une élévations des droits), windows a virtualisé la modification du fichier (dans c:\user\xxx\AppData\Local\VirtualStore\Program files\firebird\firebird_2_1\firebird.conf).

    Donc la modification du fichier était visible que de PSPAD. Firebird lui continuait de voir le firebird.conf non modifié.

    J'ai copié le firebird.conf sur le bureau, je l'ai modifié avec notepad puis j'ai copié du bureau vers \program files\firebird\Firebird_2_1\

    Arret du service Firebird, puis redemarrage. Tout fonctionne.

  3. #3
    Membre confirmé Avatar de cantador
    Homme Profil pro
    Chef de projet
    Inscrit en
    Mars 2006
    Messages
    569
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Aude (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Chef de projet
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Mars 2006
    Messages : 569
    Points : 484
    Points
    484
    Par défaut
    si je supprime le fichier TABLE
    la table se vide automatiquement
    et je remets le fichier à sa place
    il apparaît à nouveau dans les datas de la table
    donc, la table externe est en relation directe avec le fichier

    oui ?

    cantador

  4. #4
    Membre confirmé Avatar de cantador
    Homme Profil pro
    Chef de projet
    Inscrit en
    Mars 2006
    Messages
    569
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Aude (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Chef de projet
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Mars 2006
    Messages : 569
    Points : 484
    Points
    484
    Par défaut
    @Barbibulle

    je te pose cette question car j'ai un gros machin à faire (fusion de fichiers avec des formats différents)
    et la création de table externe m'intéresse..
    j'ai testé ta manip avec un fichier csv (séparateur ";")
    pas de souci pour la création de la table
    mais l'importation des données par le SELECT ne marche pas
    je suis d'ailleurs étonné de l'utilisation du SELECT..
    peux-tu m'éclairer ?

    désolé te reprendre ce post résolu, mais comme le sujet est le même..
    j'ai également lu l'autre post sur table externe..

    cantador

  5. #5
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 036
    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 036
    Points : 40 941
    Points
    40 941
    Billets dans le blog
    62
    Par défaut
    Citation Envoyé par cantador Voir le message
    si je supprime le fichier TABLE
    la table se vide automatiquement
    et je remets le fichier à sa place
    il apparaît à nouveau dans les datas de la table
    donc, la table externe est en relation directe avec le fichier
    oui ?
    La question est confuse mais OUI si on supprime le fichier externe nommé 'C:\REPEXT\TABLE' sans supprimer la déclaration de la table externe Z_TABLE dans l'exemple de Barbibulle alors un SELECT sur Z_TABLE donnera un ensemble vide

    pour avoir une table Z_TABLE temporaire (donc inutilisable après fermeture de la session) il aurait fallu mettre
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    CREATE GLOBAL TEMPORARY TABLE Z_TABLE EXTERNAL  'C:\REPEXT\TABLE' ( ID  CHAR(10)) ON COMMIT PRESERVE ROWS
    au sein d'une transaction le ON COMMIT PRESERVE ROWS ne sera pas mis, la table disparaissant en fin de transaction

    désolé te reprendre ce post résolu, mais comme le sujet est le même..
    le sujet est bien sur les tables externes mais ce n'est pas pour cela qu'il est "le même"
    pas de souci pour la création de la table,mais l'importation des données par le SELECT ne marche pas
    il aurait été mieux de créer un nouveau sujet sur le soucis (avec un s sinon il s'agit de la fleur) et bizarrerie de la langue française même quand il n'y a pas de soucis il reste avec son s. Et indiquer pourquoi le SELECT ne fonctionne pas (ou du moins quelle erreur cela produit, quel résultats non attendus apparaissent etc...)
    Écrire "ne marche pas" ne donne aucun renseignement

    En conclusion : Autre sujet, autre titre, et question bien tournée (au moins sept fois dans son crâne )
    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
    Membre expert
    Avatar de Barbibulle
    Profil pro
    Inscrit en
    Octobre 2002
    Messages
    2 048
    Détails du profil
    Informations personnelles :
    Âge : 53
    Localisation : France

    Informations forums :
    Inscription : Octobre 2002
    Messages : 2 048
    Points : 3 342
    Points
    3 342
    Par défaut
    +1 surtout que le problème est différent... Moi c'était un soucis avec Windows et là c'est un problème de fichier d'entrée mal formaté...

    CSV n'est pas un format accepté par les tables externes... Il faut de la longueur de champs et donc de record fixe !

  7. #7
    Membre confirmé Avatar de cantador
    Homme Profil pro
    Chef de projet
    Inscrit en
    Mars 2006
    Messages
    569
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Aude (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Chef de projet
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Mars 2006
    Messages : 569
    Points : 484
    Points
    484
    Par défaut
    ON COMMIT PRESERVE ROWS
    merci à tous les deux et j'ai bien noté toutes les subtilités..
    c'est vrai, le sujet est différent et malgré ça, Barbibulle a déjà répondu à une partie de mon
    nouveau projet (j'en ai beaucoup en ce moment..)
    CSV n'est pas un format accepté par les tables externes... Il faut de la longueur de champs et donc de record fixe !
    Comme d'habitude, avant de me lancer, je passe au moins une bonne journée à chercher tout ce qui a pu être déjà créé sur le sujet
    et après, je pose des questions..
    j'ai trouvé un certain nombre d'articles signalant les mêmes difficultés auxquelles je suis confronté mais sans donner de solutions réelles.
    Le sujet est le suivant :
    fusionner des fichiers (format principal csv, mais il y en a d'autres, shp, tab etc..)
    avec des noms et nombre de champs différents, mais avec toutefois un champ COMMUN (ouf..)
    en fait, on doit pouvoir sélectionner un ou plusieurs fichiers dans une liste et crac badaboum, la fusion apparaît dans un beau grid triable, filtrable, exportable etc..
    j'ai bien sûr déjà des idées..

    si vous être d'accord, je crée un nouveau post.

    cantador

  8. #8
    Expert éminent sénior Avatar de Artemus24
    Homme Profil pro
    Agent secret au service du président Ulysses S. Grant !
    Inscrit en
    Février 2011
    Messages
    6 379
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Agent secret au service du président Ulysses S. Grant !
    Secteur : Finance

    Informations forums :
    Inscription : Février 2011
    Messages : 6 379
    Points : 19 060
    Points
    19 060
    Par défaut
    Salut à tous.

    Comme je ne savais pas comment importer des données depuis un fichier externe, j'ai fait le test !

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    CREATE GLOBAL TEMPORARY TABLE Z_TABLE EXTERNAL  'C:\REPEXT\TABLE' ( ID  CHAR(10)) ON COMMIT PRESERVE ROWS
    J'ai suivi ton conseil SergioMaster, mais malheureusement, cela ne fonctionne pas.
    Il n'est pas possible d'associer un "create global temporary" avec un fichier externe.
    --> http://www.firebirdsql.org/refdocs/l...ddl-table.html
    An EXTERNAL [FILE] clause is not allowed on a global temporary table.
    Est-ce dû à la version FireBird 2.5.4 que j'utilise ?

    Je n'ai pas rencontré le problème de Barbibulle. Mon FireBird est installé directement dans WampServer. Pas de problème d'autorisation.

    Si je peux me permettre une remarque, le répertoire 'program files' est utilisés pour installer des applications Windows ou compatibles Windows.
    Un serveur Web n'est pas une application Windows, de ce fait, il ne doit pas être inséré dans ce répertoire.
    De plus, il y a un espace dans le nom 'program files', ce qui peut causer des problèmes.

    Citation Envoyé par cantador
    pas de souci pour la création de la table
    mais l'importation des données par le SELECT ne marche pas
    je suis d'ailleurs étonné de l'utilisation du SELECT..
    peux-tu m'éclairer ?
    Voici mon test et cela fonctionne correctement.
    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
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    DROP   DATABASE;
    CREATE DATABASE '..\Data\Base.fdb' page_size 4096 DEFAULT CHARACTER SET ISO8859_1;
     
    -- =====================
    -- Création table 'test'
    -- =====================
     
    CREATE TABLE test (
      id   integer      NOT NULL,
      lib  varchar(255) NOT NULL
    );
     
    -- ===============================
    -- Création table Externe 'Import'
    -- ===============================
     
    CREATE TABLE Import EXTERNAL 'E:\23.FireBird\7.Table_Externe\Ex_01\Import.txt' (
      ID    char(02),
      PV1   char(01),
      LIB   char(10),
      CRLF  char(02)
    );
     
    -- =============================
    -- Vidage table externe 'Import'
    -- =============================
     
    select * from Import;
     
    ID     PV1    LIB        CRLF
    ====== ====== ========== ======
    01     ;      un
     
    02     ;      deux
     
    03     ;      trois
     
     
     
    -- =============================
    -- Importation dans table 'test'
    -- =============================
     
    insert into test select id, lib from Import;
     
    -- ===================
    -- Vidage table 'test'
    -- ===================
     
    select * from test;
     
              ID LIB
    ============ ===============================================================================
               1 un
               2 deux
               3 trois
     
     
    exit;
     
    Appuyez sur une touche pour continuer...
    Mon fichier externe, je l'ai créé en mettant des champs de longueurs fixes
    J'ai même utilisé comme caractère de séparation le point-virgule ';'. C'est la colonne 'PV1' (Point-virgule 1) qui réceptionne ce caractère.

    Question : comment procéder si la longueur des champs est variable ?
    Le caractère de séparation reste bien le point-virgule et en fin de ligne, il y a bien les caractères CR + LF puisque je suis sous windows.

    Dois-je faire une procédure stockée ? Si oui comment faire ?

    @+
    Si vous êtes de mon aide, vous pouvez cliquer sur .
    Mon site : http://www.jcz.fr

  9. #9
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 036
    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 036
    Points : 40 941
    Points
    40 941
    Billets dans le blog
    62
    Par défaut
    Citation Envoyé par Artemus24 Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    CREATE GLOBAL TEMPORARY TABLE Z_TABLE EXTERNAL  'C:\REPEXT\TABLE' ( ID  CHAR(10)) ON COMMIT PRESERVE ROWS
    J'ai suivi ton conseil SergioMaster, mais malheureusement, cela ne fonctionne pas.
    au temps pour moi

    Question : comment procéder si la longueur des champs est variable ?
    Le caractère de séparation reste bien le point-virgule et en fin de ligne, il y a bien les caractères CR + LF puisque je suis sous windows.
    Dois-je faire une procédure stockée ? Si oui comment faire ?
    Une procédure stockée me semble possible voir ici
    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 confirmé Avatar de cantador
    Homme Profil pro
    Chef de projet
    Inscrit en
    Mars 2006
    Messages
    569
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Aude (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Chef de projet
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Mars 2006
    Messages : 569
    Points : 484
    Points
    484
    Par défaut
    @Artemus24


    Voici mon test et cela fonctionne correctement.
    essaie en plaçant une extension .csv à ton fichier et importe au moins 3 champs.

    merci

  11. #11
    Expert éminent sénior Avatar de Artemus24
    Homme Profil pro
    Agent secret au service du président Ulysses S. Grant !
    Inscrit en
    Février 2011
    Messages
    6 379
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Agent secret au service du président Ulysses S. Grant !
    Secteur : Finance

    Informations forums :
    Inscription : Février 2011
    Messages : 6 379
    Points : 19 060
    Points
    19 060
    Par défaut
    Salut à tous.

    @ cantador : voici un autre exemple où j'ai mis trois champs à insérer dans une table de trois colonnes.
    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
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    DROP   DATABASE;
    CREATE DATABASE '..\Data\Base.fdb' page_size 4096 DEFAULT CHARACTER SET ISO8859_1;
     
    -- =====================
    -- Création table 'test'
    -- =====================
     
    CREATE TABLE test (
      id    integer      NOT NULL,
      lib1  varchar(10) NOT NULL,
      lib2  varchar(10) NOT NULL,
      lib3  varchar(10) NOT NULL
    );
     
    -- ===============================
    -- Création table Externe 'Import'
    -- ===============================
     
    CREATE TABLE Import EXTERNAL 'E:\23.FireBird\7.Table_Externe\Ex_01\Import.txt' (
      ID    char(02),
      PV1   char(01),
      LB1   char(10),
      PV2   char(01),
      LB2   char(10),
      PV3   char(01),
      LB3   char(10),
      CRLF  char(02)
    );
     
    -- =============================
    -- Vidage table externe 'Import'
    -- =============================
     
    select * from Import;
     
    ID     PV1    LB1        PV2    LB2        PV3    LB3        CRLF
    ====== ====== ========== ====== ========== ====== ========== ======
    01     ;      un         ;      eins       ;      one
     
    02     ;      deux       ;      zwei       ;      two
     
    03     ;      trois      ;      drei       ;      three
     
     
     
    -- =============================
    -- Importation dans table 'test'
    -- =============================
     
    insert into test select id,
                            trim(lb1) as lib1,
                            trim(lb2) as lib2,
                            trim(lb3) as lib3
                     from Import;
     
    -- ===================
    -- Vidage table 'test'
    -- ===================
     
    select * from test;
     
              ID LIB1       LIB2       LIB3
    ============ ========== ========== ==========
               1 un         eins       one
               2 deux       zwei       two
               3 trois      drei       three
     
     
    exit;
     
    Appuyez sur une touche pour continuer...
    Et voici mon fichier de type '.csv'.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    01;un        ;eins      ;one       
    02;deux      ;zwei      ;two       
    03;trois     ;drei      ;three
    L'exemple que je traite ici, c'est récupérer des champs de longueurs fixes.
    Or dans la réalité, on ne va pas perdre bêtement de l'espace, juste pour avoir des champs de longueurs fixes.

    Je me suis attaqué à un second exemple, où les champs sont de longueurs variables.
    Voici le nouvel exemple :
    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
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    DROP   DATABASE;
    CREATE DATABASE '..\Data\Base.fdb' page_size 4096 DEFAULT CHARACTER SET ISO8859_1;
     
    -- =====================
    -- Création table 'test'
    -- =====================
     
    CREATE TABLE test (
      id    integer     NOT NULL,
      lib1  varchar(10) NOT NULL,
      lib2  varchar(10) NOT NULL,
      lib3  varchar(10) NOT NULL
    );
     
    -- ===============================
    -- Création table externe 'Import'
    -- ===============================
     
    CREATE TABLE Import external 'e:/23.FireBird/7.Table_Externe/Ex_02/Import.txt' (
      libelle char(35),
      CRLF    char(02)
    );
     
    select * from Import;
     
    LIBELLE                             CRLF
    =================================== ======
    1;un;eins;one
     
    2;deux;zwei;two
     
    3;trois;drei;three
     
     
     
    -- ============================
    -- Création Procédure 'remplir'
    -- ============================
     
    set term $$ ;
     
    create procedure remplir
    as
    declare id      integer     default 0;
    declare lib1    varchar(10) default '';
    declare lib2    varchar(10) default '';
    declare lib3    varchar(10) default '';
     
    declare newpos  integer     default 0;
    declare oldpos  integer     default 0;
    declare token   char(01)    default ';';
    declare result  char(255)   default '';
    declare input   char(35)    default '';
    declare arret   integer     default 1;
     
    declare tab cursor for (select libelle from Import);
    begin
      open tab;
     
      fetch tab into input;
     
      while (row_count > 0) do
      begin
        id   = 0;
        lib1 = '';
        lib2 = '';
        lib3 = '';
     
    -- ======================================================================
     
        oldpos = 1;
        newpos = 1;
        arret  = 1;
     
        while (arret=1) do
        begin
          newpos = position(token, input, oldpos);
     
          if (newpos > 0) then
          begin
            result = substring(input from oldpos for newpos - oldpos);
            oldpos = newpos + 1;
          end
          else
              begin
            result = substring(input from oldpos);
            arret = 0;
          end
     
               if (id   =  0) then id   = cast(result as integer);
          else if (lib1 = '') then lib1 = '>' || trim(cast(result as varchar(10))) || '<';
          else if (lib2 = '') then lib2 = '>' || trim(cast(result as varchar(10))) || '<';
          else if (lib3 = '') then lib3 = '>' || trim(cast(result as varchar(10))) || '<';
        end
     
    -- ======================================================================
     
        insert into test values (:id, :lib1, :lib2, :lib3);
     
        fetch tab into input;
      end
     
      close tab;
    end$$
     
    set term ; $$
     
    commit;
     
    -- =============================
    -- Exécution Procédure 'remplir'
    -- =============================
     
    execute procedure remplir;
     
    -- select * from remplir;
     
    select * from test;
     
              ID LIB1       LIB2       LIB3
    ============ ========== ========== ==========
               1 >un<       >eins<     >one<
               2 >deux<     >zwei<     >two<
               3 >trois<    >drei<     >three<
     
     
    exit;
     
    Appuyez sur une touche pour continuer...
    Et voici mon jeu d'essai.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    1;un;eins;one                      
    2;deux;zwei;two                    
    3;trois;drei;three                 
    4;quatre;vier;four
    En fait, j'ai triché. La longueur de la zone contenant mes champs dans mon jeu d'essai, est de longueur fixe.
    Ce que je ne sais pas faire, c'est récupérer depuis le fichier externe, les lignes de longueurs variables.

    Si quelqu'un a une idée de comment faire, je suis preneur !

    @+
    Si vous êtes de mon aide, vous pouvez cliquer sur .
    Mon site : http://www.jcz.fr

  12. #12
    Membre confirmé Avatar de cantador
    Homme Profil pro
    Chef de projet
    Inscrit en
    Mars 2006
    Messages
    569
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Aude (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Chef de projet
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Mars 2006
    Messages : 569
    Points : 484
    Points
    484
    Par défaut
    Artemus24:

    ça confirme ce que j'ai obtenu de mon côté avec un fichier .csv
    quand j'ouvre la table toutes les données sont mélangées..
    dommage, car les tables externes m'auraient bien servi dans mon projet.
    ->> voir le post DELPHI que j'ai lancé sur la fusion des fichiers si ça t'intéresse..

    merci

    @+

  13. #13
    Membre confirmé Avatar de cantador
    Homme Profil pro
    Chef de projet
    Inscrit en
    Mars 2006
    Messages
    569
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Aude (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Chef de projet
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Mars 2006
    Messages : 569
    Points : 484
    Points
    484
    Par défaut
    @Artemus24

    la seule différence est que je n'ai pas besoin du SELECT..
    je place mon fichier .csv (qui s'ouvre parfaitement avec EXCEL) au bon endroit et je crée ma table dans une base existante
    (pour simplifier..)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    CREATE TABLE Z_TABLE EXTERNAL 'C:\REPEXT\TABLE.CSV' (DATES  CHAR(10),
    SERVICE CHAR(20),LOGIN CHAR(30),COMPUT CHAR(20),IP CHAR(20),CHNOM CHAR(30),
    CHCOMU CHAR(30),REFC CHAR(7));
    ensuite, j'ouvre ma table dans EMS SQL manager
    et là les données apparaissent mais toutes mélangées sauf avec un seul champ (l'exemple de Barbibulle marche..)

    et si je passe tout en char(30)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    CREATE TABLE Z_TABLE EXTERNAL 'C:\REPEXT\TABLE.CSV' (DATES  CHAR(30),
    SERVICE CHAR(30),LOGIN CHAR(30),COMPUT CHAR(30),IP CHAR(30),CHNOM CHAR(30),
    CHCOMU CHAR(30),REFC CHAR(30));
    alors que normalement, le CHAR(30) devrait mettre des blanc à droite et du coup avoir des longueurs fixes
    ça ne marche pas non plus, les données restent mélangées..
    ?

  14. #14
    Membre expert
    Avatar de Barbibulle
    Profil pro
    Inscrit en
    Octobre 2002
    Messages
    2 048
    Détails du profil
    Informations personnelles :
    Âge : 53
    Localisation : France

    Informations forums :
    Inscription : Octobre 2002
    Messages : 2 048
    Points : 3 342
    Points
    3 342
    Par défaut
    Citation Envoyé par Barbibulle Voir le message
    CSV n'est pas un format accepté par les tables externes... Il faut de la longueur de champs fixe et donc des record fixes !
    C'est écrit plus haut..

    Pas de CSV.

    Il faut un fichier à longueur d'enregistrement fixe et donc les champs sont à longueur fixe également.

    Exemple :


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    CREATE TABLE Z_TABLE EXTERNAL 'C:\REPEXT\TABLE.CSV' (DATES  CHAR(10), SERVICE CHAR(20),LOGIN CHAR(30),COMPUT CHAR(20));
    Le fichier doit être formaté comme ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    2015/12/20Informatique        Barbibulle                    OrdinateurMachin   2015/11/29Commercial          Bill                          OrdinateurTruc      2015/12/01Achat               Homer                         OrdinateurPlaymobile
    Pour que le fichier soit plus facile à lire pour un humain vous pouvez ajouter des retours chariots mais dans ce cas il faut en tenir compte dans la définition de la table.

    Le CSV vous avez un fichier comme ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    2015/12/20;Informatique;Barbibulle;OrdinateurMachin
    2015/11/29;Commercial;Bill;OrdinateurTruc
    2015/12/01;Achat;Homer;OrdinateurPlaymobile
    Ce qui n'a rien à voir....

    Ouvrez vos fichiers avec Blocnote et non Excel vous constaterez que ce n'est qu'un fichier texte.

  15. #15
    Expert éminent sénior Avatar de Artemus24
    Homme Profil pro
    Agent secret au service du président Ulysses S. Grant !
    Inscrit en
    Février 2011
    Messages
    6 379
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Agent secret au service du président Ulysses S. Grant !
    Secteur : Finance

    Informations forums :
    Inscription : Février 2011
    Messages : 6 379
    Points : 19 060
    Points
    19 060
    Par défaut
    Salut à tous.

    En effet, la longueur de l'enregistrement dans le fichier doit être de longueur fixe.
    J'ai essayé de faire le test inverse, à savoir créer un fichier externe, afin de voir son contenu.
    Même en mettant un varchar, le champs est aussi de longueur fixe, complété par le caractère NULL.

    En ce qui concerne la fin de ligne, sous windows, dans la table il faut déclarer une colonne comme ci-après :
    contenant le caractère ASCII(13) ('Carriage Return')suivi du caractère ASCII(10) ('Line Feed').

    Sous MySql, il existe un utilitaire de nom 'LOAD DATA INFILE'. Y-a-t-il un équivalent de ceci sous FireBird ?

    @+
    Si vous êtes de mon aide, vous pouvez cliquer sur .
    Mon site : http://www.jcz.fr

  16. #16
    Rédacteur/Modérateur

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

    il suffit de chercher un peu dans les ThirdParty tools et on tombe rapidement sur des programmes tels que FBExport
    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

  17. #17
    Membre confirmé Avatar de cantador
    Homme Profil pro
    Chef de projet
    Inscrit en
    Mars 2006
    Messages
    569
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Aude (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Chef de projet
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Mars 2006
    Messages : 569
    Points : 484
    Points
    484
    Par défaut
    ben dis donc, pour un post résolu, on en a fait des tonnes..
    et SergioMaster nous a mis en appétit avec le FBExport

    ça serait bien, il pouvait nous en dire un peu plus..
    merci

    cantador

  18. #18
    Expert éminent sénior Avatar de Artemus24
    Homme Profil pro
    Agent secret au service du président Ulysses S. Grant !
    Inscrit en
    Février 2011
    Messages
    6 379
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Agent secret au service du président Ulysses S. Grant !
    Secteur : Finance

    Informations forums :
    Inscription : Février 2011
    Messages : 6 379
    Points : 19 060
    Points
    19 060
    Par défaut
    Salut à tous.

    C'est tout le talent de SergioMaster !

    @+
    Si vous êtes de mon aide, vous pouvez cliquer sur .
    Mon site : http://www.jcz.fr

  19. #19
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 036
    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 036
    Points : 40 941
    Points
    40 941
    Billets dans le blog
    62
    Par défaut
    Bonjour,
    Citation Envoyé par Artemus24 Voir le message
    C'est tout le talent de SergioMaster !
    il n'y a aucun talent, juste de la mémoire et de l'expérience

    Citation Envoyé par Cantador
    ça serait bien, s'il pouvait nous en dire un peu plus..
    le manuel de FBExport est la seule explication que je pourrais donner et, non, je n'ai jamais essayer l'import de fichier CSV juste l'export ainsi qu'une tentative de copie de base vers base avec le format fbx, tentative car dans mes tables j'ai des champs calculés et ceux-ci (à l'époque, je ne sais ce qu'il en est maintenant) sont aussi inclus rendant l'import dans l'autre base plus complexe (utilisation de -Q)

    j'aurais peut être bientôt besoin de faire cette manipulation (CSV dans Table) à nouveau mais le "chantier" est long à démarrer (passage de Sage à mon logiciel) le client étant motivé mais s'il l'est il ne répond pas très vite à mes demandes pour établir le cahier des charges de cette migration
    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

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

Discussions similaires

  1. Réponses: 0
    Dernier message: 17/03/2014, 11h27
  2. Probleme Acces Table
    Par jmjmjm dans le forum Bases de données
    Réponses: 1
    Dernier message: 16/12/2005, 21h24
  3. [Acces] Gros probleme ouvrir Table ????
    Par Aspic dans le forum Access
    Réponses: 7
    Dernier message: 07/11/2005, 12h30
  4. Table externe et drivers d'accès
    Par ze_patoche dans le forum Oracle
    Réponses: 2
    Dernier message: 19/10/2005, 13h44
  5. Probleme 'ALTER TABLE' et 'FOREIGN KEY'
    Par maahta dans le forum SQL Procédural
    Réponses: 2
    Dernier message: 30/09/2003, 14h25

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