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

WinDev Discussion :

Ajout de colonne par programmation


Sujet :

WinDev

  1. #1
    Membre habitué Avatar de GCASPIC10
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2010
    Messages
    247
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Aube (Champagne Ardenne)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Mars 2010
    Messages : 247
    Points : 144
    Points
    144
    Par défaut Ajout de colonne par programmation
    Quelle galère... Que se soit les livres, l'aide en ligne ou la recherche sur le forum, les "10 fois plus vite" en sont au stade des 1000 fois plus long

    Si j'ai bien compris les infos que j'ai capté deci delà, nous pouvons ajouter par programmation (fonction de clonage), une ou plusieurs colonnes dans une table (ici table mémoire) et y placer ensuite des données.

    Pour moi, tout va bien en ce qui concerne la création par programmation des 4 colonnes supplémentaires, mais au moment d'y afficher les données, le programme plante à la 1ère colonne ajoutée (les 3 premières initiales sont ok).

    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
    // Objectif, Lire une table Excel composée d'un nombre de Ligne quelconque mais aussi et surtout d'un nombre de colonnes variables (ex. 7 pour ici).
    // Par défaut, cette table mémoire Windev15 est composée de 3 rubriques (COL_Colonne1,COL_Colonne2, COL_Colonne3)
    // La tableau Excel est alors analysé afin de connaître le nombre de lignes et de colonnes de la feuille sélectionnée
    // Ensuite, on remplie par programmation des valeurs lues, dans la table mémoire TABLE_Table1 suivante
    TableSupprimeTout(TABLE_Table1)
    xlsID est un entier = xlsOuvre(SAI_FIC1)
    
    Nbcolonnes est une entier = xlsNbColonne(xlsID,Faux)
    NbLignes est un entier = xlsNbLigne(xlsID,Faux)
    
    // Je clone 4 fois la colonne3 qui est de type chaine 50 (soit : colonne4, colonne5, colonne6, colonne7)
    POUR i = 4 A 7
    	ChampClone(COL_Colonne3,"Colonne" + i)
    	{"Colonne"+ i,indChamp}..Libellé = "Col_Colonne" + i		// Affiche COL_Colonne+i en mode création, par programmation, pas utile ???
    	{"Colonne"+ i,indChamp}..Titre = "Colonne" + i			// Affiche Colonne+i par programmation
    FIN
    
    // Je remplis les colonnes "J" pour chaque ligne "I"
    POUR I = 1 A NbLignes
    	TableAjouteLigne(TABLE_Table1)
    	POUR J= 1 A Nbcolonnes            //Plante à J=4
    		Machaine est une chaîne= "Col_Colonne"+J
    		//trace ("TABLE_Table1."+"*"+Machaine+"*"+indchamp+"*"+I)
    		{"TABLE_Table1."+Machaine,indChamp}[I] = xlsDonnée(xlsID,I,J,Faux)
    	FIN
    FIN
    Le message est le suivant :
    Erreur à la ligne 80 du traitement Procédure locale Excel_Analyser.
    L'élément 'TABLE_Table1.Col_Colonne4' est inconnu.

    ----- Informations techniques -----

    Projet :

    Appel WL :
    Traitement de 'Procédure locale Excel_Analyser' (FEN_Exemple_XLS.PROCEDURE.Excel_Analyser), ligne 80, thread 0

    Que s'est-il passé ?
    L'élément 'TABLE_Table1.Col_Colonne4' est inconnu.

    Code erreur : 1059
    Niveau : erreur fatale (EL_FATAL)

    Dump de l'erreur du module 'WD150VM.DLL' (15.00Os).
    Identifiant des informations détaillées (.err) : 1059
    Informations supplémentaires :
    EIT_PILEWL :
    Procédure locale Excel_Analyser (FEN_Exemple_XLS.PROCEDURE.Excel_Analyser), ligne 80
    Clic sur Analyser_xls (FEN_Exemple_XLS.ONG_Onglet1.Analyser_xls), ligne 2
    EIT_DATEHEURE : 09/08/2010 16:33:11


    Peut être est-ce tout bête, mais là je ne vois plus !

    Y a t'il une autre possibilité que par clonage ?
    La patience est d'or, l'aide est inestimable ...

  2. #2
    Membre émérite

    Profil pro
    Inscrit en
    Mars 2005
    Messages
    1 683
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Mars 2005
    Messages : 1 683
    Points : 2 579
    Points
    2 579
    Par défaut
    Vous accédez à {"Col_Colonne" + J} alors que vous clonez sous le nom "Colonne" + i.

    L'exception levée est parfaitement normale et explicite (la colonne d'existe pas sous le nom que vous utilisez).

    Certes, Windev a ses défauts et on n'y développe pas 10 fois plus vite. Mais l'inattention se paye aussi cher qu'avec les autres langages

  3. #3
    Membre éprouvé
    Homme Profil pro
    Inscrit en
    Mars 2002
    Messages
    899
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Maine et Loire (Pays de la Loire)

    Informations forums :
    Inscription : Mars 2002
    Messages : 899
    Points : 1 100
    Points
    1 100
    Par défaut
    C'est sûr que tu va y passer du temps si tu bloques déjà...
    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
    // Objectif, Lire une table Excel composée d'un nombre de Ligne quelconque mais aussi et surtout d'un nombre de colonnes variables (ex. 7 pour ici).
    // Par défaut, cette table mémoire Windev15 est composée de 3 rubriques (COL_Colonne1,COL_Colonne2, COL_Colonne3)
    // La tableau Excel est alors analysé afin de connaître le nombre de lignes et de colonnes de la feuille sélectionnée
    // Ensuite, on remplie par programmation des valeurs lues, dans la table mémoire TABLE_Table1 suivante
    TableSupprimeTout(TABLE_Table1)
    xlsID est un entier = xlsOuvre(SAI_FIC1)
    
    Nbcolonnes est une entier = xlsNbColonne(xlsID,Faux)
    NbLignes est un entier = xlsNbLigne(xlsID,Faux)
    
    // Je clone 4 fois la colonne3 qui est de type chaine 50 (soit : colonne4, colonne5, colonne6, colonne7)
    POUR i = 4 A 7
    	ChampClone(COL_Colonne3,"Colonne" + i)
    	{"Colonne"+ i,indChamp}..Libellé = "Col_Colonne" + i		// Affiche COL_Colonne+i en mode création, par programmation, pas utile ???
    	{"Colonne"+ i,indChamp}..Titre = "Colonne" + i			// Affiche Colonne+i par programmation
    FIN
    
    // Je remplis les colonnes "J" pour chaque ligne "I"
    POUR I = 1 A NbLignes
    	TableAjouteLigne(TABLE_Table1)
    	POUR J= 1 A Nbcolonnes            //Plante à J=4
    		Machaine est une chaîne= "Col_Colonne"+J
    		//trace ("TABLE_Table1."+"*"+Machaine+"*"+indchamp+"*"+I)
    		{"TABLE_Table1."+Machaine,indChamp}[I] = xlsDonnée(xlsID,I,J,Faux)
    	FIN
    FIN
    Utilises les mêmes noms partout et ça marchera mieux.
    Là tu travailles sur les premières colonnes, celle qui existaient avant tes clonages.

  4. #4
    Membre émérite

    Profil pro
    Inscrit en
    Mars 2005
    Messages
    1 683
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Mars 2005
    Messages : 1 683
    Points : 2 579
    Points
    2 579
    Par défaut
    L'idéal étant d'utiliser des constantes. Quand on voit des chaines en dur à répétition, ça ne sent pas bon en général.

  5. #5
    Membre habitué Avatar de GCASPIC10
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2010
    Messages
    247
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Aube (Champagne Ardenne)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Mars 2010
    Messages : 247
    Points : 144
    Points
    144
    Par défaut
    Pour répondre à vmolines :
    - Les index ou incrément I et J sont des variables prenant une valeur de 1 à ... pour I (nbre de lignes) et de 1 à 7 pour J (nbre de colonnes, dans ce cas 7). En conséquence il n'y a pas d'erreur de ce côté.


    Pour répondre à Bowen :
    J'ai effectivement patogé dans mon affectation du Titre et du libellé d'ou l'erreur. Pour l'heure, çà marche.
    Il me faut maintenant traiter les informations pour savoir si je dois ou non l'intégrer dans ma table interne car il sagit bien d'un import avec comparaison (imaginons intégrer des contacts d'outlook dans une table windev (sans doublon pour les noms et avec modif éventuelle pour les descriptifs, en sachant que l'application prioritaire doit être définit au préalable)

    SINON, merci à tous deux, chapeau bas...
    Pour les documents d'aide, cà manque cruellement de clarté ... Je n'ai pas les moyens de me faire des stages... dommage car l'outil est sympa mais complexe à exploiter sans çà !


    Voilà la correction :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    // Je clone 4 fois la colonne3 qui est de type chaine 50 (soit : colonne4, colonne5, colonne6, colonne7)
    POUR i = 4 A 7
    	ChampClone(COL_Colonne3,"COL_Colonne" + i)
    	{"COL_Colonne"+ i,indChamp}..Libellé = "COL_Colonne" + i		// Affiche COL_Colonne+i en mode création, par programmation, pas utile ???
    	{"COL_Colonne"+ i,indChamp}..Titre = "Colonne" + i			// Affiche Colonne+i par programmation
    FIN
    La patience est d'or, l'aide est inestimable ...

  6. #6
    Membre habitué Avatar de GCASPIC10
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2010
    Messages
    247
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Aube (Champagne Ardenne)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Mars 2010
    Messages : 247
    Points : 144
    Points
    144
    Par défaut
    Ca n'est pas encore le TOP...

    En effet le clonage est géré "virtuellement" car les colonnes ajoutées ponctuellement ne sont pas mémorisées en dur dans le programme.

    1°) Il me faut maintenant aller lire ces colonnes pour y effectuer d'autres traitement. A voir par quelle méthode le faire !

    2°) D'autre part et je crois que c'est là le plus gênant car, lorsque je change de feuille excel, le nombre de colonne n'est pas à l'identique. Dans ce cas, il me faut soit ajouter d'autres colonnes ou et c'est là qu'est le binz, en supprimer. Comment gérer une suppression de colonne clonée ?

    N'y a t'il pas une autre méthode ???
    La patience est d'or, l'aide est inestimable ...

  7. #7
    Expert confirmé
    Homme Profil pro
    ?
    Inscrit en
    Juillet 2002
    Messages
    2 378
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : ?

    Informations forums :
    Inscription : Juillet 2002
    Messages : 2 378
    Points : 4 494
    Points
    4 494
    Par défaut
    Bonjour

    Tu peux mémoriser la liste des colonnes clonées dans un tableau. C'est pratique pour les manipuler par la suite.

    Comment gérer une suppression de colonne clonée ?
    ChampSupprime
    En parcourant le tableau indiqué ci-dessus il est facile de supprimer toutes les colonnes clonées

    A noter que TableSupprimeTout ne supprime pas les colonnes clonées

  8. #8
    Membre éprouvé
    Homme Profil pro
    Inscrit en
    Mars 2002
    Messages
    899
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Maine et Loire (Pays de la Loire)

    Informations forums :
    Inscription : Mars 2002
    Messages : 899
    Points : 1 100
    Points
    1 100
    Par défaut
    En s'y prenant autrement, le code serait également plus clair.
    1. Créer une variable globale à la fenêtre, qui contient le nombre de colonnes dans la table au lancement de la fenêtre. (mettons "gnNbColOrigine"
    2. Utiliser une constante pour la partie fixe du nom de la colonne
    3. Quand il y a besoin d'ajouter une colonne à la table, s'assurer qu'elle ne contient pas déjà de colonnes. Pour ça parcourir les colonnes à partir gnNbColOrigine+1 et les supprimer (cf. TableEnumèreColonne)
    4. Pour ajouter les données à la table, utiliser soit les indirections, soit FichierVersTableMémoire.

    D'une manière générale, pour éviter de confondre les noms et titres, il faut savoir que les accès par code sont toujours faits sur les noms.
    Seule la propriété ..titre permet de lire/écrire le titre de la colonne.
    Le code que tu veux mettre en place est faisable, j'ai fait un code un peu similaire qui lit des paramètres en lignes et les place en colonnes (avec un nombre de colonnes variable donc)

  9. #9
    Membre du Club
    Profil pro
    Inscrit en
    Février 2004
    Messages
    42
    Détails du profil
    Informations personnelles :
    Localisation : Tunisie

    Informations forums :
    Inscription : Février 2004
    Messages : 42
    Points : 43
    Points
    43
    Par défaut
    Ce code fonctionne correctement .
    en faite il faut cloner avec le nom de la colonne "Col_Colonne" et non pas "Colonne"

    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
    TableSupprimeTout(TABLE_Table1)
    xlsID est un entier = xlsOuvre("C:\testxls.xls")
    Nbcolonnes est une entier = xlsNbColonne(xlsID,Faux)
    NbLignes est un entier = xlsNbLigne(xlsID,Faux)
     
     
    i est un entier
    POUR i = 4 A 7
    	ChampClone(COL_Colonne3,"Col_Colonne" + i) // nom du champ destination doit etre semblable au champ clone de la table 
    	{"Col_Colonne"+ i,indChamp}..Libellé = "Col_Colonne" + i	
    	{"Col_Colonne"+ i,indChamp}..Titre = "Colonne" + i		
    FIN
     
    j est un entier
    POUR I = 1 A NbLignes
    	TableAjouteLigne(TABLE_Table1)
    	POUR J= 1 A Nbcolonnes
    		Machaine est une chaîne= "Col_Colonne"+J
    		Machaine="TABLE_Table1."+Machaine
    		{Machaine}[i]=xlsDonnée(xlsID,I,J,Faux)
    	FIN
    FIN
    xlsFerme(xlsID)


    J'espère vous avoir aider

  10. #10
    Membre habitué Avatar de GCASPIC10
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2010
    Messages
    247
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Aube (Champagne Ardenne)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Mars 2010
    Messages : 247
    Points : 144
    Points
    144
    Par défaut
    Pour répondre à rhabib,

    Oui celà fonctionne maintenant avec le code que j'ai inscrit et que tu as repris dans ton message.

    Je n'ai pas fermé la discussion dans l'espoir d'avoir une autre solution que le clonage, car la suppression des colonnes clonées (virtuelles) n'est pas réalisable en l'état.

    Il semble falloir passer par des variables (voir ci-dessus le message de BOWEN) et là je n'ai pas encore essayé (çà se bouscule un peu dans ma tête et il me faut un peu de recule !).

    Dommage que les Q/R ne soit plus interactive (c'est comme ci on parlait comme ITINERIS), par accoups



    Salutations
    La patience est d'or, l'aide est inestimable ...

  11. #11
    Membre éprouvé
    Homme Profil pro
    Inscrit en
    Mars 2002
    Messages
    899
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Maine et Loire (Pays de la Loire)

    Informations forums :
    Inscription : Mars 2002
    Messages : 899
    Points : 1 100
    Points
    1 100
    Par défaut
    Citation Envoyé par GCASPIC10 Voir le message
    Pour répondre à rhabib,

    Oui celà fonctionne maintenant avec le code que j'ai inscrit et que tu as repris dans ton message.

    Je n'ai pas fermé la discussion dans l'espoir d'avoir une autre solution que le clonage, car la suppression des colonnes clonées (virtuelles) n'est pas réalisable en l'état.

    Il semble falloir passer par des variables (voir ci-dessus le message de BOWEN) et là je n'ai pas encore essayé (çà se bouscule un peu dans ma tête et il me faut un peu de recule !).

    Dommage que les Q/R ne soit plus interactive (c'est comme ci on parlait comme ITINERIS), par accoups



    Salutations
    Les variables dont je parle dans le message ne sont pas là spécifiquement pour la suppression. Elles sont là pour être sûr d'avoir toujours le même début de nom de colonne.
    La suppression fonctionne très bien, grâce au ChampSupprime().

  12. #12
    Membre du Club
    Profil pro
    Inscrit en
    Février 2004
    Messages
    42
    Détails du profil
    Informations personnelles :
    Localisation : Tunisie

    Informations forums :
    Inscription : Février 2004
    Messages : 42
    Points : 43
    Points
    43
    Par défaut
    tu peux toujours utiliser des colonnes invisibles ça marche aussi

Discussions similaires

  1. [WD14] Affichage contenu colonne par programmation
    Par Aenur56 dans le forum WinDev
    Réponses: 4
    Dernier message: 26/05/2010, 17h11
  2. Comment ajouter un composant par programmation ?
    Par jojo86 dans le forum Composants VCL
    Réponses: 5
    Dernier message: 23/01/2008, 13h30
  3. [ODBC WINDOWS] Ajouter un DSN par programme
    Par dede92 dans le forum Windows
    Réponses: 3
    Dernier message: 26/09/2007, 15h53
  4. Réponses: 2
    Dernier message: 07/08/2006, 16h43
  5. Ajouter une colonne (par du code) dans Listview
    Par __fabrice dans le forum VB 6 et antérieur
    Réponses: 2
    Dernier message: 23/11/2005, 17h39

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