Le forum (ô combien francophone) des utilisateurs de Powerbuilder.
Salut à tous !
J'ai besoin d'effectuer une requête récupérant un bon paquet de données et je voulais savoir comment faire pour stocker ces données.
J'utilise le code suivant :
DECLARE curseur DYNAMIC CURSOR FOR SQLSA ; PREPARE SQLSA FROM "SELECT * FROM TRUC" ; OPEN DYNAMIC curseur ; FETCH curseur INTO :result ; CLOSE curseur ;
Comment doit être déclaré "result" dans ce cas ?
Sinon, comment faire pour stocker tout ?
Merci d'avance
Hors ligne
Je crois que si je fais un SELECT *, il faut que je fasse FETCH curseur INTO :result, :result2, ... ; selon le nombre de colonne récupérées.
Est-ce que je me trompe ?
Hors ligne
pourquoi tu ne passes pas directement via une datawindow ?
vu que tu peux faire un select titi1,titi2, titi3 from table1 where id_toto = 'blop'
Hors ligne
Bonjour,
Normalement, il te faut définir autant de variables qu'il y a de champs dans ta table "TRUC".
Ce serait peut être plus simple de récupérer tout ça dans une datastore.
Hors ligne
Bonjour
Si tu veux pas faire de dw ou ds
tu peux faire dans ce style
String ls_A,ls_B SELECT t.A , t.B INTO :ls_A , :ls_B FROM TRUC t WHERE xxxxxxxxxxx USING SQLSA;
suite code PB
[edit] [ code=pb ]
Hors ligne
mreminiac a écrit:
Code: pb
String ls_A,ls_B SELECT t.A , t.B INTO :ls_A , :ls_B FROM TRUC t WHERE xxxxxxxxxxx USING SQLSA;
Bonjour, ce script ne fonctionnera que si la requête renvoie une seule ligne...
Hors ligne
Ma requête fait une quarantaine de lignes.
J'aimerais ne pas avoir à utiliser un ds ou dw.
Je suis plutôt pour faire un truc comme a dit mreminiac.
Hors ligne
cradleofpain a écrit:
Ma requête fait une quarantaine de lignes.
J'aimerais ne pas avoir à utiliser un ds ou dw.
Je suis plutôt pour faire un truc comme a dit mreminiac.
40taine de lignes de quoi ?
elle doit ramener 40 lignes ou il y a tellement de colonnes dans ton select que ta requete finale tient sur 40 lignes ?
Hors ligne
En fait, il y a SELECT plein de trucs FROM (SELECT d'autres trucs avec des CASE FROM ...)
Et tout ça fait un paquet de ligne juste pour la requête.
Mais là j'ai testé et ça passe si on met chaque champs dans une variable différente.
Hors ligne
sinon,
voila une solution vite faite...
string ls_presentation, ls_syntax, ls_erreur, ls_sql ls_sql = "select * from truc" ls_presentation = "style(type=grid)" ls_syntax = SQLCA.SyntaxFromSQL(ls_sql,ls_presentation, ls_erreur) dw_liste.Create( ls_syntax, ls_erreur) dw_liste.settransobject(sqlca) dw_liste.retrieve()
il faut que tu ajoutes une datawindow vide dans ta fenetre... ici, dw_liste est vide.
ca doit bien marcher avec une datastore...
Hors ligne
Beh moi ça passe avec ce que j'ai fait.
Merci quand meme !
Hors ligne
J'ai un autre problème qui se pose.
J'utilise le code suivant :
DECLARE curseur DYNAMIC CURSOR FOR SQLSA ; PREPARE SQLSA FROM "SELECT * FROM TRUC" ; OPEN DYNAMIC curseur ; if SQLCA.sqlcode <> 0 then MessageBox( "Erreur open", SQLCA.sqlerrtext ) end if FETCH curseur INTO :result ; CLOSE curseur ;
J'ai 2 requêtes différentes à exécuter dans 2 codes différents.
Seulement voilà : il y a une requête qui passe mais pas l'autre.
La messageBox placée après le OPEN s'affiche mais le SQLCA.sqlerrtext est vide !!!
Help !
Hors ligne
SQLCA ou SQLSA ????
Hors ligne
Bonjour,
Merci d'utiliser le mod code=pb pour des questions de lisibilité des scripts (Je corrige pour cette fois).
Sinon, sais-tu que si ta requête ne ramène rien, le SQLCA.sqlcode sera à 100
(NO DATA FOUND)? Je pense que ça doit être ce qui se passe dans ton cas.
Il vaut mieux tester:
if SQLCA.sqlcode < 0 then MessageBox( "Erreur open", SQLCA.sqlerrtext ) end if
Hors ligne
inferni a écrit:
SQLCA ou SQLSA ????
Bonne remarque d'inferni, mais:
The examples assume that the default transaction object (SQLCA) has been assigned valid values and that a successful CONNECT has been executed. Although the examples do not show error checking, you should check the SQLCode after each SQL statement.
Hors ligne
Désolé, je ne sais pas où se trouve la balise code=pb il suffit juste d'utiliser la balise code et d'ajouter soi-même le = pb ?
Sinon je voulais savoir si il existe une taille maxi pour les requête dans un preparestatement ?
Hors ligne
cradleofpain a écrit:
Désolé, je ne sais pas où se trouve la balise code=pb il suffit juste d'utiliser la balise code et d'ajouter soi-même le = pb ?
Oui, il suffit de mettre code=pb à la place de code dans la balise d'ouverture:
Voir le topic: mod de coloration syntaxique
cradleofpain a écrit:
Sinon je voulais savoir si il existe une taille maxi pour les requêtes dans un preparestatement ?
Qu'entends-tu par taille maxi: Nombre de lignes de ta requête ou nombre de lignes d'enregistrements retournés par l'exécution de ta requête?
Hors ligne
Taille de la requête
Hors ligne
A ma connaissance, il n'y en a pas (mis à part la limite de la taille maximale des scripts PB).
Mais il est vrai que les requêtes via SQLSA ne sont pas ma spécialité....
Hors ligne
Est-ce que l'on est limité en nombre d'encapsulations de select ?
Ma requête fait des SELECT ... FROM (SELECT ... FROM (SELECT ...
Hors ligne
J'ai essayé ma requête dans un programme java et elle passe. Le résultat est correct.
Le problème vient donc de powerbuilder.
Est-ce que quelqu'un comprend ce qui m'arrive ???
Hors ligne
Ta requête ramène bien une seule ligne, ou plusieurs?
Hors ligne
Plusieurs.
Hors ligne