[Résolu][Base] Supprimer une ligne sur deux

Discussions et questions sur tout ce qui concerne la programmation tous langages et tous modules confondus.

Modérateur: Vilains modOOs

Règles du forum
:alerte: Balisage obligatoire dans cette section !
Aidez-nous à vous aider au mieux en balisant correctement votre question : reportez-vous sur les règles de cette section avant de poster !

[Résolu][Base] Supprimer une ligne sur deux

Messagepar jefferson » 30 Mai 2006 11:55

Salut,
je suis un nouvelle adepte d'OOo suite au cramage de mon disque dur....
Je suis étudiant, et je dois traiter des données climatologiques.
Mes données de base ont un pas de temps de 15mins, mais je dois travailler sur un pas de temps de 30mins; d'ou le besoin de supprimer une ligne sur deux... Et comme j'ai 7500 lignes par tableau, c'est mieux de pas tout faire en manuel...donc une macro s'impose
Mais comment on fait quand on est pas fort?
merci d'avance.
Dernière édition par Oukcha le 16 Juil 2010 18:50, édité 1 fois.
Raison: Balisage, l'auteur ne s'étant plus manifesté depuis 2006, et la solution étant toujours d'actualité...
OOo 2.0.2 sous WinXP SP2
jefferson
Fraîchement OOthentifié
 
Message(s) : 3
Inscrit le : 30 Mai 2006 09:52

Messagepar poukram » 30 Mai 2006 12:34

Salut salut !
Perso je ferai ca directement en sql je pense
Tu peux t'inspirer du code poster ici pour l'accès a la base de donnée.
A toi de changer le sInstrSQL correctement.

http://user.services.openoffice.org/fr/forum/ftopic1414.html
OOo 2.0.2 sous windows XP
Avatar de l’utilisateur
poukram
Membre OOrganisé
Membre OOrganisé
 
Message(s) : 93
Inscrit le : 03 Avr 2006 16:50

Re: Macro pour supprimer une ligne sur deux

Messagepar Dredd » 30 Mai 2006 12:35

jefferson a écrit:Mais comment on fait quand on est pas fort?
merci d'avance.

Déjà tu peux faire le 1er jet en utilisant le menu Outils / Macros / Enregistrer une macro.

Après comme je te l'ai dit, tu fais une boucle. Cela te donne :
Code : Tout sélectionner   AgrandirRéduire
REM  *****  BASIC  *****


sub EffaceLigne
rem ----------------------------------------------------------------------
rem define variables
dim document   as object
dim dispatcher as object
dim nbLigne as integer
dim args2(1) as new com.sun.star.beans.PropertyValue
rem ----------------------------------------------------------------------
rem get access to the document
document   = ThisComponent.CurrentController.Frame
dispatcher = createUnoService("com.sun.star.frame.DispatchHelper")
args2(0).Name = "By"
args2(0).Value = 1
args2(1).Name = "Sel"
args2(1).Value = false

nbLigne = InputBox( "Nombre de lignes à supprimer ?", "Attention")

do while nbLigne <> 0
   rem ----------------------------------------------------------------------
   dispatcher.executeDispatch(document, ".uno:DeleteRows", "", 0, Array())
   
   dispatcher.executeDispatch(document, ".uno:GoDown", "", 0, args2())
   nbLigne = nbLigne-1
loop

end sub
Propulsé par OpenOffice 4.1.6 sous Windows 10 x64
Avatar de l’utilisateur
Dredd
Membre cOOnfirmé
Membre cOOnfirmé
 
Message(s) : 246
Inscrit le : 24 Mai 2006 10:15

Messagepar Dredd » 31 Mai 2006 08:29

On pourrait avoir un retour de la part de M. jefferson. Simple histoire de politesse vis-à-vis du temps consacré.
Propulsé par OpenOffice 4.1.6 sous Windows 10 x64
Avatar de l’utilisateur
Dredd
Membre cOOnfirmé
Membre cOOnfirmé
 
Message(s) : 246
Inscrit le : 24 Mai 2006 10:15

Re: Macro pour supprimer une ligne sur deux

Messagepar programmeheure » 16 Juil 2010 10:49

Bonjour,

je viens de tomber sur ce fil et il répond parfaitement à mes attentes, je te remercie pour ta macro qui m'a bien servi.
OOo3 windows xp
programmeheure
Fraîchement OOthentifié
 
Message(s) : 7
Inscrit le : 16 Juil 2010 10:43

Re: [Résolu][Base] Supprimer une ligne sur deux

Messagepar Churay » 17 Juil 2010 09:20

Bonjour

Je trouve l'utilisation du dispatcher toujours un peu lourde, donc j'essaye de m'en passer.

La macro suivante supprime les lignes paires :
Code : Tout sélectionner   AgrandirRéduire
Sub SupprLignes
Dim oSheet, oCurseur As Object
Dim LigMax As Long
   oSheet = ThisComponent.Sheets(0)    ' Définit la 1ere feuille
   oCurseur = oSheet.createCursor
   oCurseur.gotoEndOfUsedArea( False )
   LigMax = oCurseur.RangeAddress.EndRow ' Index de la dernière ligne
   '
   For i = LigMax To 0 step -1
      If (i AND 1) Then
         ' Supprime les Lignes Paires
         oSheet.Rows.removeByIndex(i,1)
      Else
         ' Supprime les Lignes Impaires
         ' oSheet.Rows.removeByIndex(i,1)
      Endif
   Next i
End Sub


Pour supprimer les lignes impaires, il faut mettre en commentaire la 1ère ligne oSheet.Rows.removeByIndex(i,1) et activer la seconde.

cOOordialement


 Ajout : Je viens de remarquer qu'il s'agissait de Base... :roll:
Je dois être mal réveillé ce matin... :marto:
Tant pis, je laisse : la récupération peut très bien se faire sur Calc, quitte à transférer ensuite le résultat vers Base ... 
Dernière édition par Churay le 22 Juil 2010 22:25, édité 1 fois.
cOOordialement
---
AOO 4.0.1 W7-PRO & LO 5.1.6.2 Debian 7.8 & Ubuntu 16.04 LTS
---
F1 : ça aide...
XRay + SDK :super:
---
Quand le NOT CONFIRMED sera corrigé (OOo et LO) , je serai heureux...
Avatar de l’utilisateur
Churay
ManitOOu
ManitOOu
 
Message(s) : 2668
Inscrit le : 30 Avr 2009 05:54
Localisation : CATALUNYA

Re: [Résolu][Base] Supprimer une ligne sur deux

Messagepar Pierre-Yves Samyn » 17 Juil 2010 12:22

Bonjour

Churay a écrit:Je viens de remarquer qu'il s'agissait de Base... :roll:
Je dois être mal réveillé ce matin... :marto:


En effet... de plus il s'agit d'un sujet datant de 2006 :)

Cela dit, puisque le sujet est remonté, qu'il s'agit de base et que le sujet est intéressant, ci-dessous une solution à base de SQL.

On veut supprimer une ligne sur deux. L'idée qui vient est de supprimer les lignes (im)paires.

On va donc commencer par ajouter un compteur de ligne. Pour cela, dans Outils > SQL exécuter une instruction du type :

Code : Tout sélectionner   AgrandirRéduire
CREATE SEQUENCE "PYS" AS INTEGER


Cette instruction crée un compteur. Bien que créé dans Outils > SQL (et non dans une requête ou "dans" un champ de table) le compteur ne sera pas volatile, même après fermeture/réouverture de la base.

On peut utiliser ce compteur dans une requête du type :

Code : Tout sélectionner   AgrandirRéduire
SELECT "ID", "Nom", "Date naissance", NEXT VALUE FOR "PYS" AS "CPT" FROM "Table2"


Capture-1.png


  • Comme le montre la copie d'écran il est nécessaire d'exécuter ceci en mode SQL direct (le bouton correspondant doit être enfoncé)
  • On demande pour chaque ligne la valeur suivante pour le compteur.
  • S'agissant d'un compteur "base" (et non lié à la table) la valeur sera séquentielle mais pas nécessairement partant de zéro (commence à la dernière valeur utilisée + 1 soit 278 dans l'exemple)

En partant de ces données "numérotées" on peut sélectionner les ID des enregistrements des lignes paires :

Code : Tout sélectionner   AgrandirRéduire
SELECT "ID" FROM "Numéroter" AS "Numéroter" WHERE MOD( "CPT", 2 ) = 0


Nous créons une "vue" en partant de cette requête (car l'étape suivante nécessite une table ou une vue). Voir la vue "VueTravail" dans la base exemple.

La suppression des données (une ligne sur deux) se fera en exécutant par Outils > SQL une instruction du type :

Code : Tout sélectionner   AgrandirRéduire
DELETE FROM "Table2" WHERE "ID" IN (SELECT "ID" FROM "VueTravail"  )


Autrement dit, on supprime de la table tous les enregistrements pour lesquels le champ ID est figure dans la liste des enregistrements sélectionnés par la vue "VueTravail"
Pièces jointes
SupprimerUneLigneSurDeux.odb
(5.79 Kio) Téléchargé 161 fois
Pierre-Yves Samyn
Grand Maître de l'OOffice
Grand Maître de l'OOffice
 
Message(s) : 11276
Inscrit le : 02 Mai 2006 09:42


Retour vers Macros et API

Qui est en ligne ?

Utilisateur(s) parcourant ce forum : Aucun utilisateur inscrit et 2 invité(s)