Page 1 sur 1

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

Publié : 30 mai 2006 10:55
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.

Publié : 30 mai 2006 11:34
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

Re: Macro pour supprimer une ligne sur deux

Publié : 30 mai 2006 11:35
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

Publié : 31 mai 2006 07:29
par Dredd
On pourrait avoir un retour de la part de M. jefferson. Simple histoire de politesse vis-à-vis du temps consacré.

Re: Macro pour supprimer une ligne sur deux

Publié : 16 juil. 2010 09:49
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.

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

Publié : 17 juil. 2010 08:20
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 ... 

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

Publié : 17 juil. 2010 11:22
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"