OVH Cloud OVH Cloud

[WD10] Problème avec TableSelectPlus

4 réponses
Avatar
Philippe
Bonjour,

Un code tout simple d'inversion de sélection qui devrait marcher, sauf si
j'ai raté qq. chose mais il ne fonctionne pas, mes lignes ne sont pas
sélectionnées:

---------------------------------------------------------------------------------------------------------
// Déclarations
leIndice est un entier

// Zone mémoire
MemCrée("MemTemp")

// Mémorisation des sélections
POUR leIndice=1 A TableSelectOccurrence(psTable)
MemAjoute("MemTemp",MemOccurrence("MemTemp")+1,TableSelect(psTable,leIndice))FIN// DéselectionTableSelectMoins(psTable)// Inversion de la sélectionPOUR leIndice=1 A TableOccurrence(psTable) SI MemRecherche("MemTemp",leIndice,Faux)=-1 ALORS TableSelectPlus(psTable,leIndice) FINFIN// FinMemSupprimeTout("MemTemp")---------------------------------------------------------------------------------------------------------Il refuse obstinément de me sélectionner + lignes !!!

4 réponses

Avatar
Gilles TOURREAU
Philippe avait soumis l'idée :
Bonjour,

Un code tout simple d'inversion de sélection qui devrait marcher, sauf si
j'ai raté qq. chose mais il ne fonctionne pas, mes lignes ne sont pas
sélectionnées:

---------------------------------------------------------------------------------------------------------
// Déclarations
leIndice est un entier

// Zone mémoire
MemCrée("MemTemp")

// Mémorisation des sélections
POUR leIndice=1 A TableSelectOccurrence(psTable)

MemAjoute("MemTemp",MemOccurrence("MemTemp")+1,TableSelect(psTable,leIndice))FIN//
DéselectionTableSelectMoins(psTable)// Inversion de la sélectionPOUR
leIndice=1 A TableOccurrence(psTable) SI
MemRecherche("MemTemp",leIndice,Faux)=-1 ALORS
TableSelectPlus(psTable,leIndice) FINFIN//
FinMemSupprimeTout("MemTemp")---------------------------------------------------------------------------------------------------------Il
refuse obstinément de me sélectionner + lignes !!!



Je n'arrive pas à lire ton algo...
Au lieu d'utiliser les zone mémoires qui sont plus lent à manipuler,
utiliser les tableaux dynamique :

///////////////////////////////////////////

leIndice est un entier

tbl est un tableau dynamique
tbl = allouer un tableau de 0 entiers

POUR leIndice=1 A TableSelectOccurrence(Table1)
TableauAjoute(tbl, TableSelect(Table1, leIndice))
FIN

POUR leIndice=1 A TableOccurrence(Table1)
SI TableauCherche(tbl, tcLinéaire, leIndice) = -1 ALORS
TableSelectPlus(Table1, leIndice)
SINON
TableSelectMoins(Table1, leIndice)
FIN
FIN

libérer tbl

///////////////////////////////////////////

Cordialement

--
Gilles TOURREAU
Responsable informatique


Société P.O.S
Spécialiste en motoculture depuis + de 30 ans !
http://www.pos.fr
Avatar
Philippe
Merci.

Mais le problème est aléatoire des fois ca marche des fois pas. Encore une
bizarrerie Windev :)
Avatar
Vbig
Philippe a formulé ce lundi :
Merci.

Mais le problème est aléatoire des fois ca marche des fois pas. Encore une
bizarrerie Windev :)



fait un tabletri(matable,faux) en début de traitement....
Avatar
Vbig
>
Je n'arrive pas à lire ton algo...
Au lieu d'utiliser les zone mémoires qui sont plus lent à manipuler, utiliser
les tableaux dynamique :



Scusez, je ne répond pas à la question

Celà fait plusieurs fois que je lis que les tableaux sont plus rapide
que les zones memoire.

J'utilise wd depuis la version 5, et n'ayant pas alors les fonctions de
tri et recherche sur les tableaux, les zones mémoire était plus
adéquate pour ce genre de traitement.

Maintenant avec les nouvelles fonctions sur les tableaux, ma solution
n'est peut être pas la plus rapide alors j'ai refais les test :

En création / ajout => Il n'y a pas photo, la zone mémoire est plus
rapide
En tris => Le tableau gagne
En recherche => dépend du contenu et des valeur recherchées, la
recherche dans les tableaux est parfois plus rapide, parfois plus
lente. La recherche dans la zone memoire est plus constante.

De plus, le principe des zones mémoires permet de conserver une valeur
de retour et une clé. Je ne vois pas bien comment faire celà avec les
tableaux.
En gros, je reste avec les zones mémoires :)


extrait de l'analyseur de performance,
j'ai pas été mechant, ce ne sont que des entiers que je manipulais

MemAjoute() ,100000,456 ms
TableauAjoute(),100000,1 s 47 ms

MemTrie() ,1 ,120 ms
TableauTrie() ,1 ,16 ms

MemRecherche() ,4 ,66 µs
TableauCherche(),4 ,1 ms

total pour les zone memoire : 0s576ms66
total pour les tableaux : 1s061ms00


mon code de test :
wj,wi,wk est un entier
wres est un entier
AnalyseurDébut("c:test.wpf")
MemCree("zmem")
POUR wi=1 A 100000
MemAjoute("zmem",100000-wi,wi)
FIN
MemTrie("zmem")
wres=MemRecherche("zmem",500)
wres=MemRecherche("zmem",9999)
wres=MemRecherche("zmem",10000)
wres=MemRecherche("zmem",98988)
tbl est un tableau dynamique
tbl = allouer un tableau de 0 entiers
POUR wi=1 A 100000
TableauAjoute(tbl,100000-wi)
FIN
TableauTrie(tbl,ttCroissant)
wres=TableauCherche(tbl,tcLinéairePremier,500)
wres=TableauCherche(tbl,tcLinéairePremier,999)
wres=TableauCherche(tbl,tcLinéairePremier,10000)
wres=TableauCherche(tbl,tcLinéairePremier,98988)
AnalyseurFin()
MemSupprimetout("zmem")
liberer tbl