[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 !
jefferson
Fraîchement OOthentifié
Messages : 3
Inscription : 30 mai 2006 08:52

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

Message par jefferson »

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 modification par Oukcha le 16 juil. 2010 17:50, modifié 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
poukram
Membre OOrganisé
Membre OOrganisé
Messages : 93
Inscription : 03 avr. 2006 15:50

Message par poukram »

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/ ... c1414.html
OOo 2.0.2 sous windows XP
Avatar de l’utilisateur
Dredd
Membre cOOnverti
Membre cOOnverti
Messages : 362
Inscription : 24 mai 2006 09:15
Localisation : Mega-City One

Re: Macro pour supprimer une ligne sur deux

Message par Dredd »

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

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 cOOnverti
Membre cOOnverti
Messages : 362
Inscription : 24 mai 2006 09:15
Localisation : Mega-City One

Message par Dredd »

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
programmeheure
Fraîchement OOthentifié
Messages : 7
Inscription : 16 juil. 2010 09:43

Re: Macro pour supprimer une ligne sur deux

Message par programmeheure »

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
Avatar de l’utilisateur
Churay
ManitOOu
ManitOOu
Messages : 2668
Inscription : 30 avr. 2009 04:54
Localisation : CATALUNYA

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

Message par Churay »

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

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 modification par Churay le 22 juil. 2010 21:25, modifié 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...
Pierre-Yves Samyn
Grand Maître de l'OOffice
Grand Maître de l'OOffice
Messages : 11276
Inscription : 02 mai 2006 08:42

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

Message par Pierre-Yves Samyn »

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

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

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

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

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"
Vous ne pouvez pas consulter les pièces jointes insérées à ce message.