Le forum (ô combien francophone) des utilisateurs de Powerbuilder.
Bonjour à toutes et à tous.
J'ai créé une Datastore avec seulement affichages de 6 colonnes issue d'une simple requête avec comme paramètre un tableau.
Donc, dans ma requete, j'ai un WHERE colonne IN tableau
Le retrieve de cette datastore fonctionne bien jusqu'à 1000 lignes renvoyées, mais au delà, le retrieve retourne -1.
C'est une limite définie quelque part ? Est-ce modifiable ?
J'espère que cette question n'a pas été déjà posée. Je n'ai pas rouvé
Merci
Kalini
Hors ligne
salut
tu as la meme chose depuis ta datawindow ?
c'est pas dans la propriété de ta datawindow object ?
car une limite à 1000 lignes, ca me parait peu...
Hors ligne
tu as regardé la valeur de sqlerrtext ?
Hors ligne
pick ouic a écrit:
salut
tu as la meme chose depuis ta datawindow ?
c'est pas dans la propriété de ta datawindow object ?
car une limite à 1000 lignes, ca me parait peu...
Je n'ai mis modifié aucune propriété dans mon dataobject.
C'est une datawindow toute simple.
Et c'est vrai qu'une de mes autres Datawindow fait planté PB lorsqu'elle a + de 1000 lignes également. Mais là, c'est un plantage radical. Tout PB s'arrête.
J'ai pas fait gaffe aux autres DW.
jdobosz a écrit:
tu as regardé la valeur de sqlerrtext ?
Non, j'ai pas regardé.
Je vais vérifié de suite..
Dernière modification par Kalini (19-02-2007 13:29:12)
Hors ligne
la, un plantage au bout de 1000 enregistrements ?
un peu suspect, tout ca... il y a pas un probleme de codage dans ta datawindow ? par exemple dans l'evenement itemchanged ? ou retrieverow, ou autres ?
sinon, pour tester ton select sql, bah...utilises le avec l'outil que j'ai developpé.
http://pbadonf.fr/forum/viewtopic.php?id=410
comme ca, tu verras si cela s'arrete à 1000 lignes ou non...
Hors ligne
J'ai donc vérifié le sqlerrtext (en fait, je l'avais déjà fait pour la DW) et le message est vide .. Aucune erreur au niveau SQLCA.
Lorsqu'il s'agit d'une datastore, le retrieve ramène -1 mais ne fait pas planté PB mais lorsqu'ils'agit d'une datawindow, le retrieve finit par faire planté tout PB..
Je ne comprends pas..
Hors ligne
essayes de voir avec mon outil,
tu verras si cela plante ou pas...
l'outil construit dynamiquement une datawindow, suivant ton select... et il n'y a pas de lignes codes dessus...
Hors ligne
J'ai testé avec ton outil. Au passage, bravo, c'est excellent. mon SGBD: Oracle 8i
ça fonctionne bien. J'ai + de 5000 lignes en retour
Mais j'ai compris : Ce n'est pas ma datawindow qui plante ! C'est la requête oracle.
Car en fait, dans ma requête j'envoie un tableau de données comme je le disais, et mon tableau peut dépasser les 1000 valeurs. Or Oracle ne gère pas plus de 1000 valeurs dans un tableau utilisé dans le IN.
Il faudrait que je passe par une table temporaire, mais je n'ai pas de droits pour ça.
Bref, ce n'est donc pas un problème PB....
Désolé..
Pour ton outil, au lieu d'utiliser le IN tableau, j'ai fait un > valeur, ce qui explique pourquoi j'ai pas de plantage.
Merci pick ouic pour ton outil..
Hors ligne
ok, tout est donc résolu.
Merci merci merci...
au moins tu pourras t'en servir, pour tester tes requetes ou procedures...
A+++
t'as pas les droits pour creer de tables temporaires ?
et pourquoi tu utilises un tableau ? il y a pas moyen de faire autrement ?
Hors ligne
pick ouic a écrit:
ok, tout est donc résolu.
Merci merci merci...
au moins tu pourras t'en servir, pour tester tes requetes ou procedures...
A+++
t'as pas les droits pour creer de tables temporaires ?
et pourquoi tu utilises un tableau ? il y a pas moyen de faire autrement ?
Bien, en fait, je n'ai pas de proc stockées. Donc, toutes les requêtes se font dans les DW direct (bouton SQL). Je ne sais donc pas comment passer par une table de travail ?
Le tableau de valeurs est alimenté en fonction des éléments sélectionnés par l'utilisateur.
L'utilisateur fait d'abord une recherche suivant divers critères. Ensuite, une DW à sélection multiple affiche une liste d'éléments en résultat et il est donc possible de sélectionner plusieurs élements avec la souris. Une fois la sélection validée, les ID de chaque élément sont mémorisés dans le tableau de valeur.
Vu qu'il la possibilité de tout sélectionner, le tableau peut donc avoir + de 1000 valeurs dans certains cas..
Et c'est ce tableau que j'envoie ensuite à la DW/Datastore.
Un DBA m'a dit qu'un IN suivi d'un SELECT dans une table passait sans problème même s'il y avait + de 1000 valeurs en retour sur SELECT. Mais + 1000 valeurs figée dans un tableau, ça ne passe pas ..
Hors ligne
1000 valeurs en parametres ? la vacheeeeeeeeeeeee
Hors ligne
Kalini a écrit:
Oracle ne gère pas plus de 1000 valeurs dans un tableau utilisé dans le IN.
tiens, je croyais que c'était 255 valeurs ??
Hors ligne
pick ouic a écrit:
1000 valeurs en parametres ? la vacheeeeeeeeeeeee
Oui, c'est un mailing à envoyer à chacune des associations, donc environ jusqu'à 3700 maxi en fonction des paramètres!!
En fait, ça sera souvent l'édition d'une fiche pour quelques associations ou alors, une fiche pour toutes les associations.
Donc entre 1 et 10 voire 20 ou alors toutes.
Dernière modification par Kalini (20-02-2007 08:00:28)
Hors ligne
eRaSorZ a écrit:
tiens, je croyais que c'était 255 valeurs ??
Non, non, ça fonctionne très bien jusqu'à 1000 valeurs. les DBA m'ont confirmé que 1000 était bien la limite.
ça dépend peut-être après des versions d'Oracle
Dernière modification par Kalini (19-02-2007 15:36:04)
Hors ligne
Kalini a écrit:
ça dépend peut-être après des versions d'Oracle
oui ça doit être ça, je dois être resté bloqué sur des infos de la v7
Hors ligne
le IN dans ta requete sql, est valable pour une colonne ?
pourquoi tu ne découperais pas en plusieurs datastores ?
au bout de 500 in, tu continues la suite avec une autre datastore...ainsi de suite ?
c'est pas possible ca ?
Hors ligne
ta requete, il n'est pas possible de l'écrire autrement ?
tu peux la poster ?
Hors ligne
pick ouic a écrit:
le IN dans ta requete sql, est valable pour une colonne ?
pourquoi tu ne découperais pas en plusieurs datastores ?
au bout de 500 in, tu continues la suite avec une autre datastore...ainsi de suite ?
ce que tu peux faire pour contourner la limitation:
SELECT ... FROM ... WHERE ... AND ... AND ( colonne IN (val1, val2, ...., val1000) OR colonne IN (val1001, val1002, ...., val2000) OR colonne IN (val2001, val2002, ...., val3000) ... )
Hors ligne
pick ouic a écrit:
le IN dans ta requete sql, est valable pour une colonne ?
pourquoi tu ne découperais pas en plusieurs datastores ?
au bout de 500 in, tu continues la suite avec une autre datastore...ainsi de suite ?
c'est pas possible ca ?
Désolé pour cette absence..
J'ai fini par découper le chargement de ma DW. J'envoie les données par lot de 500 lignes..
Hors ligne
eRaSorZ a écrit:
pick ouic a écrit:
le IN dans ta requete sql, est valable pour une colonne ?
pourquoi tu ne découperais pas en plusieurs datastores ?
au bout de 500 in, tu continues la suite avec une autre datastore...ainsi de suite ?ce que tu peux faire pour contourner la limitation:
Code: pb
SELECT ... FROM ... WHERE ... AND ... AND ( colonne IN (val1, val2, ...., val1000) OR colonne IN (val1001, val1002, ...., val2000) OR colonne IN (val2001, val2002, ...., val3000) ... )
Oui, c'était une solution, j'avais essayé ça, mais je ne pouvais pas savoir combien de IN, je pouvais avoir, car le nombre de valeurs pouvais être très variable: de 1 valeur à + de 3000 valeurs..
Donc, j'avais tenté de modifier dynamiquement la requête de la DW, mais ça ne fonctionnait pas dans certains cas, je ne me rappelle plus lesquels, malheureusement.
Hors ligne
Kalini a écrit:
Oui, c'était une solution, j'avais essayé ça, mais je ne pouvais pas savoir combien de IN, je pouvais avoir, car le nombre de valeurs pouvais être très variable: de 1 valeur à + de 3000 valeurs..
une fois que tu connais tes valeurs tu peut construire la requête en fonction de ce nombre ?
Hors ligne
eRaSorZ a écrit:
Kalini a écrit:
Oui, c'était une solution, j'avais essayé ça, mais je ne pouvais pas savoir combien de IN, je pouvais avoir, car le nombre de valeurs pouvais être très variable: de 1 valeur à + de 3000 valeurs..
une fois que tu connais tes valeurs tu peut construire la requête en fonction de ce nombre ?
Oui, c'est ce que je faisais, je déterminais le nombre de OR à inclure dans la requête. J'utilisais ensuite les IF THEN ELSE dans PB pour construire ma requête dynamiquement
Ensuite, je modifiais la requête de la DW via la commande SetSQLpreview avant de faire un retrieve dessus. Mais je ne sais plus pour quelle raison, j'ai abandonné cette solution.
Hors ligne