Le forum (ô combien francophone) des utilisateurs de Powerbuilder.
Pages: 1
Bonjour,
Dans mon appli PowerBuilder, il m'arrive parfois que l'affichage d'une datawindow ou le rechargement d'un datachilditem plante, sans aucun message d'erreur.
Le seul point commun entre les deux erreurs est que dans les deux cas, on retrieve plus de 1000 éléments.
D'ou ma question : y'a t'il une limite technique du nombre d'éléments que ces deux composants peuvent afficher, et si oui laquelle? (1000??)
Mais le plus étonnant, c'est que meme si c'est le cas, comment ca se fait que mon datachilditem ne plante pas à l'affichage, malgré son trés grand nombre d'éléments, mais plante lors de son rechargement?? xD
Merci pour votre aide !!
Hors ligne
Bonjour,
Il est très difficile de de répondre avec si peu de détails. Je gère des tables avec plusieurs millions de lignes sans aucun problème.
- Base de données ?
- Version de Powerbuilder ?
- Qu'appelles-tu plantages ? Retrieve = -1 sur le child ? retrievials arguments erronées (Retrieve = 0) ... ?
- Peux tu nous mettre un extrait de ton code ?
Hors ligne
Bonjour,
La version de ma base de données est Oracle 10g et l'application est en PB 10.5.1.
En fait, en ce qui concerne le plantage sur le DataChildItem, le TreeView gere 4 niveaux :
- la racine de l'arborescence (1 item)
- des entités (20 items)
- des responsables d'entités (environ 10 responsables par entité)
- les employés des responsables (entre 100 et 1000 employé par responsable)
Le premier affichage tout se passe bien. Par contre, quand j'ajoute un élément à une entité ayant plus de 1000 éléments (responsables et employés confondus), je rafraichis le TreeView aprés l'ajout. Ce rechargement se fait via une fonction récursive (qui stocke les indices des handles dans un tableau)... puis quand j'arrive au 1001eme élément de mon DataChildItem, j'ai une exception "Array Boundary exceeded".
Donc OK, je suis sorti des limites du tableau mais pourquoi systématiquement aprés le 1000eme élément?
Hors ligne
as-tu déclaré ton tableau de handles en tab[1000] ?
Hors ligne
Pas dans ma déclaration initiale en tout cas... mais je pense que ca vient effectivement de la, car quand je me mets en mode debug, à l'init mon tableau n'a aucun indice de précisé, puis une fois que quelques fonctions sont passées, il a une taille fixe tab[1000]... j'avoue que j'avais pas pensé que mon tableau pourrait passer de taille variable à taille fixe...
Mais dans ce cas, en admettant que je trouve ou l'initialisation du tableau se fait à 1000 éléments, comment s'écrit la déclaration d'un tableau à deux dimensions de taille variable? tab[,] ??
Hors ligne
Bon aprés avoir revu un peu la doc la dessus, il est bien précisé que "Only one-dimensional arrays can be variable-size arrays".
Donc ca voudrait en gros dire, que je serais obligé de spécifier une valeur assez grande pour mon indice pour celui ci ne soit "jamais" atteint? n'y a t'il pas moyen de faire quelque chose de plus adaptable? (sachant que dans la fonction de rafraichissement, je n'ai aucun moyen de savoir le nombre d'item à rafraichir)
Hors ligne
tu peux contourner cela en utilisant un tableau à taille variable de structures contenant un tableau à taille variable :
// déclaration structure global type s_tableau from structure long dimension2[] end type // déclaration tableau s_tableau lstr_tab[] // affectation lstr_tab[i].dimension2[j] = k
cela dit c'est étrange qu'un tableau à taille variable se transforme en tab[1000]
Hors ligne
N'est ce pas?
Je vais chercher dans cette voie en tout cas, merci beaucoup pour votre aide !
Etant donné que j'ai eu un probleme de ce genre sur une DataWindow, est ce que je peux en déduire également que l'affichage des lignes de ma DataWindow est fonctionnellement limité à 1000, à cause d'un probleme du meme genre?
Hors ligne
Rebonjour,
Je pense que ça n'a plus grand chose à voir mais, après avoir augmenté la taille de mon tableau, je me suis heurté à un autre probleme. Quand j'insère mon élément dans le TreeView avec la méthode InsertItemLast(), je fais un Sort() sur toute la branche de mon TreeView à laquelle j'ajoute l'élément...
Si cet élément doit se situer en début de liste (élément commençant par un 'a') alors que je l'ai inséré à la fin de la liste, le programme remonte les nœuds un par un en partant de la fin pour trouver l'endroit ou placer le nouvel élément...
Cependant, au bout d'un certain nombre d'appels à ma fonction de tri, l'application se ferme toute seule, sans aucun message d'erreur !
Une idée sur ce qu'il se passe?
Hors ligne
Bonjour,
Pour faire une synthèse, les tableaux dans Powerbuilder se dimensionne effectivement dynamiquement si tu les déclares de la façon suivante :
integer li_size string ls_data[] string ls_get ls_data[1] = 'laurent' ls_data[2] = 'jacques' ls_data[1000] = 'vincent' li_size = UpperBound(ls_data) //=> 1000 ls_get = ls_data[1500] // => Array Boundary exceeded
La taille de ton tableau est déterminé par l'indice le plus élevé que tu utilises lorsque tu initialises le tableau.
Cependant, au bout d'un certain nombre d'appels à ma fonction de tri, l'application se ferme toute seule, sans aucun message d'erreur !
Je ne suis pas surpris. Tu travailles je suppose comme tu l'as dit avec des tableaux de dimensions conséquentes que tu passes en arguments de méthodes.
Il faut préciser à tes méthodes de passer le tableau par référence sinon tu crées en mémoire une nouvelle copie du tableau et tu accrois l'occupation mémoire de ton application de façon constante.
Le "garbage collector" ramasse miette est connu pour ne pas bien remplir son rôle dans ce cas. La mémoire occupée par la copie du tableau en sortie de méthode n'est pas correctement libérée.
Tu peux essayer de suivre l'occupation mémoire de ton application à partir du gestionnaire de tâche de windows.
Hors ligne
J'ai lu rapidement le topic en diagonale . J'ai juste une petite remarque, n'oubliez pas que la Datawindow de type External utilisée dans une datastore peut être un excellent moyen de stocker de la donnée en mémoire à la place d'un tableau à n dimensions maintenant que nous avons des machines suffisamment puissante pour ne pas être à quelques Ko prêt.
Une DW de ayant trois colonnes dim1, dim2 et dim3 peut permettre de gérer 3 dimensions.
Dim1 Dim2 Dim3
a1 b1 c1
a1 b1 c2
a1 b2 c3
a1 b2 c4
a2 b3 c5
etc...
Et l'avantage est que l'on peut utiliser les méthodes des DW pour manipuler les données : find, sort, filter, delete, setitem, getitem, rowcount(), etc.
Hors ligne
Chrnico a écrit:
Une DW de ayant trois colonnes dim1, dim2 et dim3 peut permettre de gérer 3 dimensions.
Dim1 Dim2 Dim3
a1 b1 c1
a1 b1 c2
a1 b2 c3
a1 b2 c4
a2 b3 c5
pour l'utilisation d'un dwo/ds, qui permet en plus d'utiliser des indices autres que des entiers (réels, chaines...)
en revanche pour gérer 3 dimensions, il faut 4 colonnes, 3 pour les dimensions et une pour la valeur :
Dim1 Dim2 Dim3 Valeur
a1 b1 c1 x1
a1 b1 c2 x2
a1 b2 c3 x3
a1 b2 c4 x4
a2 b3 c5 x5
ce qui équivaut à :
Matrice[a1,b1,c1]=x1
Matrice[a1,b1,c2]=x2
etc
Hors ligne
Salut
C'est ce que j'utilise à la place des tableaux multidimensionnel... On peut très bien utiliser l'indice de la ligne et l'indice de la colonne cela évite d'ajouter une 4ème colonne, non??
Hors ligne
Pages: 1