PC SOFT

FOROS PROFESIONALES
WINDEVWEBDEV y WINDEV Mobile

Inicio → WINDEV 2024 → Suppression d'enregistrements sans raison
Suppression d'enregistrements sans raison
Iniciado por Albert Lemoine, 05,oct. 2022 19:11 - 20 respuestas
Publicado el 05,octubre 2022 - 19:11
Bonjour à tous,

J'ai un souci avec un client, qui me signale qu'en une fois un grand nombre de ses enregistrements ont disparu.

J'ai vérifié mes procédures, et le seul endroit où je mets un HSUPPRIME pour ces données est avec des garde-fous (3 fois poser la question).
Ce client m'affirme qu'il n'a jamais fait ça...

C'est une architecture client-serveur.

Comment faire :
- pour être sûr que ce client ne raconte pas de bêtises
- pour éviter ça et/ou récupérer les données : Journalisation? Comment ça fonctionne?

Je suis un peu perplexe...

D'avance merci

Albert
Miembro registrado
325 mensajes
Popularité : +8 (10 votes)
Publicado el 06,octubre 2022 - 06:17
Effectivement tu peux journaliser le ou les fichiers. (a mettre en place via l'analyse en accédant aux propriétés du fichier en question)

y a t il une transaction sur ce fichier ?
Publicado el 06,octubre 2022 - 08:08
Non, pas de transaction, ni de relation avec d'autres fichiers.
La suppression a eu lieu sur environ 1/4 des enregistrements et de manière aléatoire.

Y a-t-il d'autres modes de suppression que Hsupprime? Je n'utilise pas de requête de suppression non plus ...

Vraiment étrange ...

Albert
Miembro registrado
874 mensajes
Popularité : +39 (51 votes)
Publicado el 06,octubre 2022 - 08:37
Bonjour Albert,

En Bases classiques ou HFCS ?

Je pense qu'il n'y a pas de fumée sans feu.

Le Hsupprime dans une boucle, dans une procédure ?

Peut être nous montrer le code Hsupprime.

Bon courage et bon dev
Christian

--
Christian - kick71
Publicado el 06,octubre 2022 - 09:06
Bonjour Albert, est il possible que la base de donnée le fichier tu doit le reindexer avec la fonction HRéindexe ?
J'ai eu un cas où les enregistrements divers ont disparu dans le fichier et après réindexation, les enregistrements sont apparus.
J'espère que cela pourra vous aider,

Meilleures salutations
Publicado el 06,octubre 2022 - 09:54
Voici :
SI Nation()=5
gbool=OuiNon(Oui,"Supprimer définitivement les articles sélectionnés? (cette opération est irréversible)")
SINON
gbool=OuiNon(Oui,"DEFINITIEF vernietigen? (onomkeerbaar) ")
FIN
TableArticles..AffichageActif=Faux
TableSelectMoins(TableArticles)
SI gbool=Vrai ALORS
POUR TOUTE LIGNE DE TableArticles
SI TableArticles.COLSEL=Vrai ALORS
HLitRecherchePremier(DBNK,IDDBNK,TableArticles.COLSEQA)
SI HTrouve(DBNK) ET DBNK.Sisupprime=Vrai

HSupprime(DBNK)

La procédure s'effectue en trois phases, d'abord une suppression "d'intention" avec un booleen "DBNK.sisupprimé", ensuite l'affichage de ces DBNK, ensuite la volonté de suppression définitive.

Le problème est que, dans la première étape, les postes (DPOS) ont aussi une coche, DPOS.sisupprimé, ce qui n'a pas été le cas cette fois-ci.
Il n'y a pas de lien automatique entre DBNK et DPOS, juste des liens manuels, faits et défaits un peu partout dans le programme.

C'est vraiment comme si une intervention extérieure avait supprimé ces enregistrements ...

Autre(s) problème(s) : Je regarde la journalisation, mais je ne vois pas comment :
- récupérer / réparer (en classic ça fonctionne, et C/S WDJournal ne le propose pas, ni avec le centre de contrôle)
- savoir sur quel DBNK ces opérations sont réalisées, puisque dans ma BDD chaque dossier est un sous-répertoire, et chaque dossier a un DBNK ...

Je souffre ...
Publicado el 06,octubre 2022 - 09:58
J'ai transféré le fichier depuis le serveur, puis vérifié les index, ils étaient bons.

ma base de données est faite de fichiers structurés en CLASSIC. Selon les besoins du client, soit elle reste en local, soit elle est hébergée chez PCSCLOUD, auquel cas j'utilise "Décritconnexion" et "Ouvreconnexion".

Je n'ai jamais eu ce problème depuis 5 ans.
Miembro registrado
1.623 mensajes
Popularité : +100 (114 votes)
Publicado el 06,octubre 2022 - 10:01
Hello,

Il faudrait aussi verifier que ca a bien "disparu" en comparant avec une sauvegarde par exemple
Publicado el 06,octubre 2022 - 11:12
Bonjour,
Ce sujet m'interpelle, ayant eu un problème semblable :
Des enregistrements disparus aléatoirement (beaucoup, entre 1/3 et 1/2 de la base), et c'est arrivé plusieurs fois sur la même table, des fois en C/S et des fois en classic vu que j'ai les deux configurations possibles chez mes clients. A chaque fois, c'était sur des bases accédées par plusieurs utilisateurs, je n'ai pas eu le cas sur des applis de bureau avec la base sur le même poste.
Pas de transaction. Aucune boucle sur le Hsupprime unique qui permettait de supprimer 1 seul enregistrement à partir d'une ligne de table sélectionnée.
J'avais testé la réindexation, y compris l'"option 5", sans succès, les enregistrements n'étaient plus là.
Je n'ai jamais compris pourquoi, j'ai tout bonnement enlevé la possibilité de supprimer un enregistrement de cette table. C'est récent et je n'ai pas encore eu de cas de disparition depuis.
Je cherche toujours l'explication...
Publicado el 06,octubre 2022 - 11:36
mayi, je pense que nous sommes d'accord.

J'ai vérifié les index, les backups etc...
Miembro registrado
149 mensajes
Publicado el 06,octubre 2022 - 13:10
Bonjour,
Idem... Nous avions eu ce genre "d'évaporation de données" dans une grosse appli fonctionnant en réseau local. Après avoir cherché un peu toutes les causes possibles (mauvais codage, index endommagés, coupures réseau, intervention d'utilisateurs, etc...) nous avions opté pour un changement de machine serveur. Miraculeusement (hasard ou pas), les problèmes avaient cessé.
Miembro registrado
1.298 mensajes
Popularité : +20 (72 votes)
Publicado el 06,octubre 2022 - 18:45
commence par décrire un trigger dans ton applmi sur le fonction HSupprime et hraye

en capture avant bien entendu, ensuite dans ce trigger annule la suppression et stock un debbuginfo dans un log

--
Bertin CARRIERE
SRL RGPD.Zen-Project.be
support@zen-project.be
www.zen-project.be www.linkedin.com/in/bertincarriere

+32(0)498/10.18.58
Co-President de l'asbl Be-Dev Association des développeurs Windev de Belgique
www.be-dev.be
Publicado el 07,octubre 2022 - 09:00
J'ai également eu des enregistrements qui soit disant disparaissaient sans intervention de l'utilisateur.
Pour en avoir le cœur net j'ai mis une trace lors d'une suppression dans un nouveau fichier qui
enregistre le numéro du record effacé, la date, l'heure et le nom du poste qui effectue cette suppression.

MON_FICHIER_TRACE.NUME_ENREG = FACTURES.FACTURES_CLE_UNIQUE
MON_FICHIER_TRACE.NUME_NCLI = FACTURES.NUME_NCLI
MON_FICHIER_TRACE.DATE_SUPP = DateSys()
MON_FICHIER_TRACE.HEURE_SUPP = HeureSys()
MON_FICHIER_TRACE.NOM_DU_POSTE = NetNomMachine()
HAjoute(MON_FICHIER_TRACE)
HSupprime(FACTURES)

il est ainsi possible de tracer les activités.
Miembro registrado
1.623 mensajes
Popularité : +100 (114 votes)
Publicado el 07,octubre 2022 - 09:14
si vraiment vous pensez que le probleme provient d'un Hsupprime, pour en avoir le coeur net
Il est possible de surcharger la fonction Hsupprime()

Procedure HSupprime(NomFichier)
AddLog (DateHeureSys()+": Hsupprime : sur "+ {nomFichier,indFichier}) //AddLog a définir biensur..
RENVOYER WL.hsupprime(NomFichier)


Un truc du genre (a tester)

On obtiendra ainsi un log a chaque Hsupprime()
Mensaje modificado, 07,octubre 2022 - 09:15
Miembro registrado
2.572 mensajes
Popularité : +222 (260 votes)
Publicado el 07,octubre 2022 - 09:39
Il est possible de créer un journal sur les fichiers. J'ai essayé d'utiliser cette journalisation il y a fort longtemps (c'était en version 10). Les opérations étaient bien tracées et on pouvait les récupérer mais malheureusement ça ralentissait trop le système pour que ce soit utilisable.

Cependant ça m'avait permis de récupérer des enregistrement supprimés. Je l'avais mis en place pour des disparitions d'enregistrements sans qu'on ne sache pourquoi. Les journaux ne m'ont pas donné plus d'infos si ce n'est que je pouvais récupérer les données.

J'ai quand même dû les désactiver car trop de lenteurs...

--
Cordialement,

Philippe SAINT-BERTIN
Publicado el 07,octubre 2022 - 09:50
Bonjour,

Pour etre sûr de "capturer" la suppression (qui peut être faite aussi à
partir du CCHF) la méthode de Bertin est la seule qui fonctionne.
C'est à dire un trigger, avec une sauvegerde dans un fichier LOG.

Cordialement.
Miembro registrado
149 mensajes
Publicado el 07,octubre 2022 - 11:32
Albert Lemoine a écrit :
Voici :
SI Nation()=5
gbool=OuiNon(Oui,"Supprimer définitivement les articles sélectionnés? (cette opération est irréversible)")
SINON
gbool=OuiNon(Oui,"DEFINITIEF vernietigen? (onomkeerbaar) ")
FIN
TableArticles..AffichageActif=Faux
TableSelectMoins(TableArticles)
SI gbool=Vrai ALORS
POUR TOUTE LIGNE DE TableArticles
SI TableArticles.COLSEL=Vrai ALORS
HLitRecherchePremier(DBNK,IDDBNK,TableArticles.COLSEQA)
SI HTrouve(DBNK) ET DBNK.Sisupprime=Vrai

HSupprime(DBNK)

La procédure s'effectue en trois phases, d'abord une suppression "d'intention" avec un booleen "DBNK.sisupprimé", ensuite l'affichage de ces DBNK, ensuite la volonté de suppression définitive.

Le problème est que, dans la première étape, les postes (DPOS) ont aussi une coche, DPOS.sisupprimé, ce qui n'a pas été le cas cette fois-ci.
Il n'y a pas de lien automatique entre DBNK et DPOS, juste des liens manuels, faits et défaits un peu partout dans le programme.

C'est vraiment comme si une intervention extérieure avait supprimé ces enregistrements ...

Autre(s) problème(s) : Je regarde la journalisation, mais je ne vois pas comment :
- récupérer / réparer (en classic ça fonctionne, et C/S WDJournal ne le propose pas, ni avec le centre de contrôle)
- savoir sur quel DBNK ces opérations sont réalisées, puisque dans ma BDD chaque dossier est un sous-répertoire, et chaque dossier a un DBNK ...

Je souffre ...


Bonjour,
Je ne sais pas si vous avez ou non recopié votre code "à l'arrache" mais je note qu'il y a des SI sans ALORS, en particulier le dernier
J'ai déjà vu du code comme çà qui "passait" à la compilation mais provoquait des trucs bizarres en EXE
Miembro registrado
3.887 mensajes
Popularité : +227 (347 votes)
Publicado el 07,octubre 2022 - 12:27
Bonjour,
Tu ne contrôles pas si ta recherche n'a pas levé d'erreurs. Donc en cas d'erreur (i.e. Herreur non nul,) Htrouve n'est pas modifié. De ce fait, si la denière recherche avait réussi la recherche en cours est considérée comme fructueuse donc l'enregistrement en cours sera supprimé.
Le code suivant pourrait déjà éviter ce cas de figure.
SI HLitRecherchePremier(DBNK,IDDBNK,TableArticles.COLSEQA) ALORS //HLitRecherchePremier renvoie vrai si la recherche a réussi, Faux sinon ou en cas d'erreur cf. doc
SI DBNK.Sisupprime=Vrai ALORS
HSupprime(DBNK)
FIN
SINON
SI HErreur ALORS
TraiterErreur
FIN
FIN


--
Il y a peut être plus simple, mais, ça tourne
Publicado el 07,octubre 2022 - 15:40
Pour répondre à DENIS, je n'ai copié qu'une partie des boucles, car ensuite je regarge s'il y a des DPOS, des DBLK etc... pour les supprimer également.

Aucun de ces fichiers n'a été touché... et c'est ce qui m'interpelle le plus.

Le serveur est celui de PCSCLOUD, je suppose qu'il est stable ...
Miembro registrado
149 mensajes
Publicado el 08,octubre 2022 - 03:20
Albert Lemoine a écrit :
Pour répondre à DENIS, je n'ai copié qu'une partie des boucles, car ensuite je regarge s'il y a des DPOS, des DBLK etc... pour les supprimer également.
Aucun de ces fichiers n'a été touché... et c'est ce qui m'interpelle le plus.
Le serveur est celui de PCSCLOUD, je suppose qu'il est stable ...


En général, il y a 3 raisons principales à un comportement erratique d'un programme : L'intervention humaine volontaire ou involontaire (ils trouvent un moyen de faire quelque chose qu'on n'a pas prévu) / la défaillance du matériel / l'erreur de codage (le plus souvent).

Ma remarque concernait l'absence présence du mot ALORS.
Dans des versions "anciennes" de Windev, il était possible "d'oublier" le ALORS lors du codage et ça passait. Par contre, lors de l'exécution de l'EXE en production, le résultat était aléatoire. A priori, votre traitement concerne la suppression simultanée d'articles dans un fichier de données.

Dans un premier temps, afin "d'ouvrir le parachute", vous pourriez déjà faire 2 choses :
1) Le SUIVI des suppressions en appliquant la solution proposée par BERTIN
2) La SAUVEGARDE des enregistrements supprimés, en copiant l'enregistrement à supprimer dans une table de sauvegarde avant sa suppression.
En cas de problème, vous pourrez toujours réintégrer les données et éviter de voir pleurer le client ;)

Perso, je travaille très rarement en direct sur les fichiers de données. Pour les suppressions en masse (opération à risque), je procède ainsi :
- Attribution de droits aux utilisateurs : Tout le monde ne doit pas être habilité à supprimer des données
- Récupération des données qui m'intéresse dans une table mémoire, avec une colonne pour leur clé d'ID et une pour marquer
- Marquage des enregistrements à supprimer
- Sauvegarde optionnelle des données à supprimer dans un simple fichier ASCII
- Boucle de suppression : Parcours de la table mémoire avec l'indice des lignes pour réaliser les suppressions physiques.

Oui, je sais, c'est empirique, mais ainsi, je n'ai jamais eu de loupé en suppression (excepté prob. matériel).
J'évite aussi l'instruction POUR TOUT...

Ex. Bouton "Supprimer"
xNb_Lignes est un entier = TableOccurrence(Ma_Table)
i est un entier
POUR i = 1 À xNb_Lignes
TableSelectPlus(Ma_Table, i)
SI Ma_Table_Marque[i] = Vrai ALORS
SI OuiNon(Non,"Confirmez ?")= Oui ALORS
HLitRecherche(Client, ID_CLIENT, Ma_Table.Client_ID[i])
SI HTrouve(Client) ALORS
HSupprime(Client)
// Gestion erreur de suppression
FIN
FIN
FIN
FIN
Mensaje modificado, 08,octubre 2022 - 03:36
Miembro registrado
44 mensajes
Publicado el 27,octubre 2022 - 15:18
Bonjour,

J'ai eu ces mêmes problémes uniquement en lisant un enregistrement en direct, sans aucune suppression.
J'ai testé pas à pas le programme et procédure afin de voir d'ou pouvait venir l'anomalie (réindexage intégral du fichier avant les tests) et regardant simultanément le fichier, lecture en direct Ok, puis mise à jour de l'enregistremenent, et à cet instant précis disparition de l'enregistrement. Aucune liaison entre les fichiers.

J'ai remplacé la lecture en directe par une requete et les problemes ont disparu sans aucune autre modification.
(Test avec la même préparation que la lecture en direct).

J'espere que ce retour pourra aider.

Bonne journée à tous