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 :

Supprime toutes les lignes d'une table fichier


Sujet :

WinDev

  1. #1
    Membre habitué
    Profil pro
    Inscrit en
    Juillet 2004
    Messages
    344
    Détails du profil
    Informations personnelles :
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations forums :
    Inscription : Juillet 2004
    Messages : 344
    Points : 188
    Points
    188
    Par défaut Supprime toutes les lignes d'une table fichier
    bonjour

    je souhaite supprimer toutes les lignes de ma table fichier. J'ai essayé ca :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    	i est un entier
    	pour i=TABLE_LIGCDE..Occurrence a 1 pas -1
    		TableSupprime(TABLE_LIGCDE,i)
    		SI ErreurDétectée ALORS
    			Erreur("Impossible de supprimer l'enregistrement."+RC+HErreurInfo())
    			RETOUR
    		FIN
    	FIN

    Il me supprime bien une première ligne mais plante ensuite sur la suppression de la ligne suivante avec le message :
    Echec de la suppression d'un enregistrement dans le fichier <>.

    Détail de l'erreur système :
    Description = Le descripteur de ligne faisait référence à une ligne supprimée ou à une ligne marquée comme devant être supprimée.
    Source = Microsoft Cursor Engine
    Error Number = -2147217885
    Native Error Number = 28
    Sauriez vous me dire ce qui se passe ?

    Ce que j'essaie de faire est relativement basique ...

    Merci beaucoup
    Loko

  2. #2
    Expert éminent sénior

    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    19 647
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Décembre 2004
    Messages : 19 647
    Points : 32 889
    Points
    32 889
    Par défaut
    Une table fichier contient forcément les enregistrements du fichier.
    Pour la vider, il faut vider le fichier

    Si tu veux une table vide, tu dois utiliser une table mémoire et gérer le remplissage manuellement.

    Déjà traité ici

  3. #3
    Membre habitué
    Profil pro
    Inscrit en
    Juillet 2004
    Messages
    344
    Détails du profil
    Informations personnelles :
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations forums :
    Inscription : Juillet 2004
    Messages : 344
    Points : 188
    Points
    188
    Par défaut
    Salut Guardian

    Je ne comprends pas trop ta réponse : j'ai un autre bouton qui permet de supprimer seulement la ligne sélectionnée et le TableSupprime sur cette seule ligne fonctionne très bien.

    C'est quand je fais une boucle avec un autre bouton pour tout supprimer que cela ne marche plus.

    De plus dans l'aide il est clairement écrit
    La fonction TableSupprime peut être utilisée indifféremment sur : - une table fichier ou mémoire., - ...

    // Supprimer toutes les lignes sélectionnées dans une table
    i est un entier
    NbSelection est un entier = TableSelectOccurrence(MaTable)
    POUR i = NbSelection A 1 PAS -1
    TableSupprime(MaTable,TableSelect(MaTable,i))
    FIN
    Sinon, a quoi peut bien servir TableSupprime ? Et de quelle façon vides tu le fichier ?

  4. #4
    Expert éminent sénior

    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    19 647
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Décembre 2004
    Messages : 19 647
    Points : 32 889
    Points
    32 889
    Par défaut
    Si c'est une table fichier, si tu supprimes dans la table, tu supprimes dans le fichier.
    Suppression dans une table fichier
    La fonction TableSupprime supprime l'enregistrement correspondant dans le fichier associé à la table. Si des rubriques sont reliées à d'autres fichiers, aucune modification n'est effectuée automatiquement sur ces fichiers liés.
    Mais il faut vérifier que l'indice soit correct.
    C'est probablement ce qui pose problème.

    Par contre, pour effacer un enregistrement dans un fichier, il est préférable d'utiliser HSupprime() et de réafficher la table

  5. #5
    Membre habitué
    Profil pro
    Inscrit en
    Juillet 2004
    Messages
    344
    Détails du profil
    Informations personnelles :
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations forums :
    Inscription : Juillet 2004
    Messages : 344
    Points : 188
    Points
    188
    Par défaut
    On est bien d'accord, et c'est bien le fonctionnement que j'avais compris de TableSupprime.

    Simplement je ne vois pas en quoi ma gestion d'indice serait fausse, les valeurs de TABLE_LIGCDE.Occurence et i sont bonnes au moment ou la supression plante.

    (J'ai essayé avec HSupprime(LIGCDE) dans ma boucle mais il ne trouve pas d'occurence pour ce fichier, normal j'utilise une table pour lire ce fichier (et la table est belle et bien liée à ce fichier dans ses propriétés). )

  6. #6
    Expert éminent sénior

    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    19 647
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Décembre 2004
    Messages : 19 647
    Points : 32 889
    Points
    32 889
    Par défaut
    HSupprime() s'utilise sans argument pour supprimer l'enregistrement en cours (après un HLit() par exemple)
    ou avec le nom fichier (pas celui de la table) et le numéro d'enregistrement
    HSupprime(NomFichier,NumEnr)

    Il faut différencier indice de la table et le numéro d'enregistrement qui ne sont pas forcément les mêmes

  7. #7
    Membre averti

    Profil pro
    Inscrit en
    Août 2007
    Messages
    140
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 140
    Points : 312
    Points
    312
    Par défaut
    Pour supprimer tout une table...
    Une idée pour faire avancer le schmilblick... (ou pas)..

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    nbEnr est un entier = HNbEnr(MonFichier)
    POUR i = 0 A nbEnr
      HLitPremier()
      HSupprime()
    FIN
    L'idée (pas vérifiée ici) est de connaître le nombre d'enregistrement à supprimer... Et d'effectuer une boucle qui positionne l'index de lecture sur le permier enregistrement... et de supprimer la première ligne à chaque fois...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    HLitPremier(MonFichier)
    TANTQUE PAS HEnDehors(MonFichier)
      HSupprime()
      HLitPremier()
    FIN
    ou encore.. si ça fonctionne..
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    HLitPremier(MonFichier)
    TANTQUE PAS HEnDehors(MonFichier)
      HSupprime()
      HLitSuivant()
    FIN
    Puis tu réaffiches la table qui sera alors vide...

  8. #8
    Membre averti Avatar de JPDMJC
    Profil pro
    Inscrit en
    Février 2005
    Messages
    337
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 337
    Points : 394
    Points
    394
    Par défaut
    Je ne sais pas ce que vous en pensez, mais si ta table fichier n'est pas filtrée, et que 'on veut la vider, pourquoi ne pas "bêtement" supprimer (et recréer à vide) le fichier HyperFile ?
    Pour X enregistrements d'un fichier de justement X enregistrements, je préfère sans commune mesure virer 1 fichier et le recréer plutôt que faire X suppressions (en gérant évidemment les éventuelles liaisons, mais ça reste rapide).

    Sinon belle remarque de Guardian : "...ou avec le nom fichier (pas celui de la table) et le numéro d'enregistrement".
    Je crois que c'est bien ça qui clochait dans le code, non ? (PS, sais-tu si c'est marqué dans la doc ? j'ai beau chercher ... on ne parle que d'indice de table. WD10)

  9. #9
    Membre averti

    Profil pro
    Inscrit en
    Août 2007
    Messages
    140
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 140
    Points : 312
    Points
    312
    Par défaut
    Oui supprimer le fichier est une solution...
    Mais s'il s'agit d'une base sur un serveur (cas commun), on ne peut pas donner les droits pour la suppression sur le serveur...

    Et je ne parle pas pour un HF C/S...

    Donc ta solution ne s'applique uniquement dans le cas d'une base locale (ou du moins un base qui est présente sur la meme machine que l'application...) ou on s'expose niveau sécurité de la base...

  10. #10
    Membre habitué
    Profil pro
    Inscrit en
    Juillet 2004
    Messages
    344
    Détails du profil
    Informations personnelles :
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations forums :
    Inscription : Juillet 2004
    Messages : 344
    Points : 188
    Points
    188
    Par défaut
    Citation Envoyé par Guardian Voir le message
    HSupprime() s'utilise sans argument pour supprimer l'enregistrement en cours (après un HLit() par exemple)
    ou avec le nom fichier (pas celui de la table) et le numéro d'enregistrement
    HSupprime(NomFichier,NumEnr)

    Il faut différencier indice de la table et le numéro d'enregistrement qui ne sont pas forcément les mêmes
    J'ai essayé mais ca ne passe pas car je n'ai pas fait de HLitxxx de mon fichier auparavant (normal, j'utilise une table fichier à la place).

  11. #11
    Membre habitué
    Profil pro
    Inscrit en
    Juillet 2004
    Messages
    344
    Détails du profil
    Informations personnelles :
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations forums :
    Inscription : Juillet 2004
    Messages : 344
    Points : 188
    Points
    188
    Par défaut
    Réponses aux autres intervenants (merci à eux) :

    Ma table fichier est filtrée, donc pas de suppression du fichier. En plus c'est une BD Oracle donc ...

    Pour le code de Nicolas :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    HLitPremier(MonFichier)
    TANTQUE PAS HEnDehors(MonFichier)
      HSupprime()
      HLitPremier()
    FIN
    Ca peut fonctionner, mais comme ma table est filtrée, il faut donc que je fasse plutot (au pif) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    POUR TOUTE LIGNE DE TABLE_LIGCDE
      HLitRecherchePremier(LIGCDE, clef, TABLE_LIGCDE.clef)
      HSupprimer(LIGCDE)
    FIN
    TableAffiche(TABLE_LIGCDE)
    Ca devrait marcher ... le seul souci, c'est que ma table Oracle LIGCDE a une clef primaire composée de 2 champs (me blâmez pas, je l'ai pas crée et j'peux pas la modifier) et je ne sais pas gérer cela avec les fonctions H*.

    Ca serait tout de meme bien plus simple si on pouvait faire une boucle de TableSupprime ! Je comprends toujours pas pourquoi cela ne marche pas, surtout que dans l'aide ils mettent un exemple identique ...

  12. #12
    Expert éminent sénior

    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    19 647
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Décembre 2004
    Messages : 19 647
    Points : 32 889
    Points
    32 889
    Par défaut
    Tu m'en diras tant, si c'est une BdD Oracle, ça change tout

    HSupprime() fonctionne avec les fichiers HF, pas forcément avec une table Oracle.
    Dans ce cas, il est préférable d'utiliser du code SQL

  13. #13
    Membre habitué
    Profil pro
    Inscrit en
    Juillet 2004
    Messages
    344
    Détails du profil
    Informations personnelles :
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations forums :
    Inscription : Juillet 2004
    Messages : 344
    Points : 188
    Points
    188
    Par défaut
    Citation Envoyé par Guardian Voir le message
    Tu m'en diras tant, si c'est une BdD Oracle, ça change tout
    Pardon, chavépô

    HSupprime() fonctionne avec les fichiers HF, pas forcément avec une table Oracle.
    Dans ce cas, il est préférable d'utiliser du code SQL
    cad HExecuteRequeteSql("delete from LIGCDE where ...") ?

    J'ai deja essayé ce genre de truc (pour un simpls select) et ca m'a sorti une valeur complètement érronée :-(

    PC SOFT m'a dit que les fonctions H* étaient utilisables sous Oracle, je sais pas s'ils se sont un peu trop avancés ou pas ... En tout cas TableSupprimer marche bien ... pour 1 seule occurence.

  14. #14
    Membre averti

    Profil pro
    Inscrit en
    Août 2007
    Messages
    140
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 140
    Points : 312
    Points
    312
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    HExecuteRequeteSQL("DELETE FROM MaTable")
    ou
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    HExecuteRequeteSQL("TRUNCATE TABLE MaTable")
    Pas sûr que ça marche..
    Enfin... HExecuteRequeteSQL te permettra d'exécuter la requête, pas de doutes là dessus.

    C'est à tester..
    Mais là ça supprime tout le contenu de ton fichier...

    Si tu souhaites supprimer uniquement les éléments affichés dans ta table fichier (lié à ton fichier filtré).... hmmm.... c'est plus ennuyant..
    Faudrait limite avoir une requête de suppression paramétrée où tu peux passer l'ID_Table à supprimer.
    Et pour supprimer :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    POUR TOUTE LIGNE DE MonChampTable 
      MaReqSuppression.Param_ID = MonChampTable.ID   //ID serait alors un colonne
      HExecuteRequete(MaReqSuppression)
    FIN

  15. #15
    Membre habitué
    Profil pro
    Inscrit en
    Juillet 2004
    Messages
    344
    Détails du profil
    Informations personnelles :
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations forums :
    Inscription : Juillet 2004
    Messages : 344
    Points : 188
    Points
    188
    Par défaut
    Oui Nicolas, j'pense que j'vais pas avoir d'autre choix que de faire une boucle sur un delete avec passage de l'ID en paramètre.

    Mais mon dieu que c'est compliqué pour faire quelque chose de quand même basique !

  16. #16
    Expert éminent sénior

    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    19 647
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Décembre 2004
    Messages : 19 647
    Points : 32 889
    Points
    32 889
    Par défaut
    Si tu utilisais une table mémoire plutôt qu'une table fichier, puisque de toute façon ce n'est pas une BdD HF et que tu la remplis par une requete, ce serait beaucoup plus simple à gérer

  17. #17
    Membre habitué
    Profil pro
    Inscrit en
    Juillet 2004
    Messages
    344
    Détails du profil
    Informations personnelles :
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations forums :
    Inscription : Juillet 2004
    Messages : 344
    Points : 188
    Points
    188
    Par défaut
    je ne remplis pas la table par une requete mais pas une liaison au niveau colonnes/champs.

    Moi je veux bien faire une table mémoire mais a ce moment là faut se taper toutes les lectures, filtres, jointures etc à la main, et on perd BEAUCOUP des attraits de Windev. Je trouve ca "beaucoup plus simple à gérer". Ou alors si : simple, mais bcp plus long à développer.

    Je sais pas, mais moi je trouve ca lourd de faire à chaque HLitSuivant un remplissage des champs de la table mémoire avec ceux lus en mémoire, etc ... Je ne vois plus trop l'intéret de Windev, autant faire autre chose.

    Je suis débutant en Windev mais j'avoue que je n'en saisis pas très bien la "philosophie" ...

  18. #18
    Expert éminent sénior

    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    19 647
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Décembre 2004
    Messages : 19 647
    Points : 32 889
    Points
    32 889
    Par défaut
    Citation Envoyé par Loko Voir le message
    Je suis débutant en Windev mais j'avoue que je n'en saisis pas très bien la "philosophie" ...
    Elle est simple : tout est fait pour rendre le développement facile dans le cadre de Windev
    Ici tu veux gérer une BdD Oracle au lieu d'une BdD Hyper File.

    Plus sérieusement, Windev reste un outil complexe avec une philosophie propre. Bien l'appréhender facilite grandement son utilisation, ce qui est somme toute assez logique.

    C'est vrai que certains concept sont assez déroutants au départ.
    Le mieux est de développer plusieurs petits projets "test", après avoir suivi le Guide d'Autoformation", pour en comprendre toutes les astuces.

    Si tu veux commencer par gérer une BdD Oracle avant d'avoir suivi les étapes d'apprentissage de Windev, tu risques d'avoir beaucoup plus difficile.
    Mais, bien évidemment, on n'a pas toujours le choix

  19. #19
    Membre habitué
    Profil pro
    Inscrit en
    Juillet 2004
    Messages
    344
    Détails du profil
    Informations personnelles :
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations forums :
    Inscription : Juillet 2004
    Messages : 344
    Points : 188
    Points
    188
    Par défaut
    En fait j'ai fais le truc d'auto-formation (si si !) mais ca reste tres général, et c'est loin d'étudier tous les cas (et je parle pas d'envoyer des fax ou je ne sais quoi).

    Apres, dans ce guide ou dans l'aide ou ailleurs il n'est jamais indiqué qu'avec une BD tierce on ne pourrait pas développer comme indiqué dans le guide avec HyperFile. Et y'a pas de raison qu'on ne puisse pas.

    Le fait de faire une table fichier par exemple, si t'es dans un cadre simple c'est franchement sympa : quand tu saisis une nouvelle ligne t'as aucune ligne de code pour l'enregistrement, pour la suppression (d'une ligne) t'as une ligne de code et il s'occupe de tout le reste.

    Le plus gros souci que j'ai rencontré jusqu'a présent, c'est une synchro completement foireuse entre l'analyse et la BD Oracle. Le plus fort, c'est que j'ai utilisé un HCreationSiInexistant qui a bien marché (cad qu'il m'a créé lui-meme une table dans ma base en fonction du fichier en analyse) et lors de la synchro suivante il m'a détecté une différence (sur une table qu'il a lui-meme créé !).

    Et je parle pas des plantages et bugs en tous genres, meme sur des fenetres générées par le RAD ou dans les exemples fournis.

    Moi je veux bien tout faire en requetes mais dans ce cas comme expliqué plus haut on perd bcp des atouts de Windev (liaisons, etc) et du coup je suis pas sur qu'il permette de développer "10 fois plus vite" , comme dit la pub ;-)
    D'ailleurs je viens de regarder l'exemple "gestion commerciale", ca melange du HExecuteRequeteSQL et du HLitRecherchePremier, comme quoi ... et il y a exactement ce que je voudrais faire (une fenetre avec table mere-fille commandes/lignes de commande) et bizzarement y'a pas de bouton de suppression de commande ;-)

    Avant j'utilisais Uniface, avec "clear", "retrieve" et "store" tu fais tout ce que tu veux, avec Windev faut te taper l'aide sur 100 fonctions ...

    Allez, j'y retourne ;-)

  20. #20
    Membre chevronné
    Avatar de mogwai162
    Homme Profil pro
    Inscrit en
    Janvier 2006
    Messages
    1 376
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Vosges (Lorraine)

    Informations forums :
    Inscription : Janvier 2006
    Messages : 1 376
    Points : 1 860
    Points
    1 860
    Par défaut
    Citation Envoyé par Loko Voir le message
    En fait j'ai fais le truc d'auto-formation (si si !) mais ca reste tres général, et c'est loin d'étudier tous les cas (et je parle pas d'envoyer des fax ou je ne sais quoi).
    Il est clair que ce n'est pas en une semaine que l'on maitrise parfaitement windev mais l'autoformation est là pour apprendre les bases de Windev a quelmqu'un qui maitrise la programmation

    Citation Envoyé par Loko Voir le message
    Apres, dans ce guide ou dans l'aide ou ailleurs il n'est jamais indiqué qu'avec une BD tierce on ne pourrait pas développer comme indiqué dans le guide avec HyperFile. Et y'a pas de raison qu'on ne puisse pas.
    Ben ça depend : Accès natif tout va bien sinon SQL. C'est simple !

    Citation Envoyé par Loko Voir le message
    Le fait de faire une table fichier par exemple, si t'es dans un cadre simple c'est franchement sympa : quand tu saisis une nouvelle ligne t'as aucune ligne de code pour l'enregistrement, pour la suppression (d'une ligne) t'as une ligne de code et il s'occupe de tout le reste.
    Pour Les cas plus compliqué il ne faut pas hésiter à se servir du RAD en mixant les codes de plusieurs fenètres.

    Citation Envoyé par Loko Voir le message
    Avant j'utilisais Uniface, avec "clear", "retrieve" et "store" tu fais tout ce que tu veux, avec Windev faut te taper l'aide sur 100 fonctions ...
    Un chouïa mauvaise fois là peut etre. Comme si ça pouvait etre comparé...
    Patrick Catella

    Je ne réponds pas aux messages privés si ceux ci suivent un sujet. Il est préférable pour tous de poursuivre la discussion dans le sujet d'origine.

    Je suis Concepteur développeur Windev (10 ans) et Windev mobile (4 ans) en recherche d'emploi. J'etudie toute proposition

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

Discussions similaires

  1. Réponses: 8
    Dernier message: 05/04/2010, 10h14
  2. Réponses: 3
    Dernier message: 28/04/2009, 00h42
  3. Supprimer toutes les contraintes d'une table
    Par pouss dans le forum SQL
    Réponses: 2
    Dernier message: 01/12/2008, 16h27
  4. Réponses: 2
    Dernier message: 26/09/2006, 09h08
  5. Réponses: 4
    Dernier message: 11/10/2005, 15h03

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