Le forum (ô combien francophone) des utilisateurs de Powerbuilder.
Bonjour,
Je travaille sur la maintenance d'une application PB qui a migré il y a quelques mois en 10.5.
Je dois développer une évolution pour une datawindow de recherche (avec une datawindow pour les criteres de recherches et une autre pour la liste de résultats). Actuellement, les deux datawindow sont au format 6.0 (version de PB avant la migration). Quand on clique sur le bouton "Rechercher", la fonction de recherche appelle la fonction RowsCopy() et cela fonctionne trés bien.
Par contre, quand je passe mes deux datawindow en version 10.5 (sans pour autant modifier les requetes), la fonction RowsCopy() fait planter la recherche...
Ca fait plusieurs jours que je me bats avec cette fonction sans pour autant avancer, c'est pourquoi je viens quérir vos conseils avisés !
Merci beaucoup pour votre aide !
Dernière modification par Kyoshiro (07-04-2009 16:03:42)
Hors ligne
Bonjour,
Il est difficile de répondre à ce genre de cas avec si peu d'indications (Version base, code source, SQL ...).
Tu peux toujours essayer les choses suivantes :
En faisant un "edit source" de la datawindow, la première ligne indique la version de "release" de la datawindow, si elle n'indique pas la version 10 essaye de faire une speudo modification
de la datawindow pour forcer le passage en version 10 réelle.
Il existe des cas ou il est nécessaire de reconstruire la datawindow nativement dans la nouvelle version de PB pour que cela marche correctement (Problème de migration connu par Sybase). A chaque migration, j'ai été obligé de reconstruire les crosstab, sinon j'ai une GPF en exécution.
Il faut aussi ne pas oublier que PB 10.0 est unicode et que des problèmes peuvent en découler avec le "charset" de la base de données.
Hors ligne
Avant tout, merci pour ta réponse rapide.
J'ai bien essayé comme tu m'as dit de modifier la version des datawindow : j'ai ouvert les datasource puis sauvegardé sans modifier les requetes (le release dans "edit source" est bien passé à 10.5) et ça marche.
Par contre, il y a quelque chose que je ne comprends pas avec la méthode RowsCopy(). Dans la datawindow des critères de recherche, voila la requete que j'exécute :
SELECT "EMP_A"."ID_EMP", "EMP_A"."LB_NOM_EMP", "EMP_A"."LB_PREN_EMP", "EMP_A"."ID_FNCT", emp_b.id_emp id_emp_cdv, emp_b.id_emp_resp id_emp_ddv, "EMP_B"."ID_EMP", "EMP_B"."ID_EMP_RESP" FROM "EMP" "EMP_A", "EMP" "EMP_B" WHERE ( "EMP_A"."ID_EMP_RESP" = "EMP_B"."ID_EMP" )
Puis voila la requête de la datawindow de recherche :
SELECT emp_a.id_emp, emp_a.id_fnct, emp_a.lb_nom_emp, emp_a.lb_pren_emp, emp_a.id_emp_resp, fnct.lb_fnct, emp_b.lb_nom_emp lb_nom_cdv, emp_b.lb_pren_emp lb_pren_cdv, emp_c.lb_nom_emp lb_nom_ddv, emp_c.lb_pren_emp lb_pren_ddv FROM emp emp_a, fnct, emp emp_b, emp emp_c WHERE ( emp_a.id_emp_resp = emp_b.id_emp (+)) and ( emp_b.id_emp_resp = emp_c.id_emp (+)) and ( emp_a.id_fnct = fnct.id_fnct ) ORDER BY emp_a.lb_nom_emp ASC, emp_a.lb_pren_emp ASC
La, le RowsCopy() marche bien. Par contre, une fois que je modifie le code de la requête, pour la datawindow des critères de recherche à :
SELECT "EMP_A"."ID_EMP", "EMP_A"."LB_NOM_EMP", "EMP_A"."LB_PREN_EMP", "EMP_A"."ID_FNCT", emp_b.id_emp id_emp_cdv, emp_b.id_emp_resp id_emp_ddv, "EMP_B"."ID_EMP", "EMP_B"."ID_EMP_RESP", "GFCS_LOG"."LB_GFCS_LOG" FROM "EMP" "EMP_A", "EMP" "EMP_B", "GFCS_LOG" WHERE ( "EMP_A"."ID_EMP_RESP" = "EMP_B"."ID_EMP" ) and ( emp_a.id_emp = gfcs_log.id_emp (+))
et celle de la liste des résultats à :
SELECT emp_a.id_emp, emp_a.id_fnct, emp_a.lb_nom_emp, emp_a.lb_pren_emp, emp_a.id_emp_resp, fnct.lb_fnct, emp_b.lb_nom_emp lb_nom_cdv, emp_b.lb_pren_emp lb_pren_cdv, emp_c.lb_nom_emp lb_nom_ddv, emp_c.lb_pren_emp lb_pren_ddv, gfcs_log.lb_gfcs_log FROM emp emp_a, fnct, emp emp_b, emp emp_c, gfcs_log WHERE ( emp_a.id_emp_resp = emp_b.id_emp (+)) and ( emp_b.id_emp_resp = emp_c.id_emp (+)) and ( emp_a.id_fnct = fnct.id_fnct ) and ( emp_a.id_emp = gfcs_log.id_emp (+)) ORDER BY emp_a.lb_nom_emp ASC, emp_a.lb_pren_emp ASC
La fonction RowsCopy() ne marche plus... Comment ça se fait? je crois qu'une subtilité du RowsCopy() m'échappe...
Ah oui pour info, je suis en Oracle 10g
Dernière modification par Kyoshiro (02-04-2009 11:18:22)
Hors ligne
Comme le demandait Buck, peux-tu nous copier ici ton code PB du RowsCopy.
Petit rappel :
aide PB a écrit:
A DataWindow cannot be in query mode when you call the RowsCopy method.
Hors ligne
Et bien comme je le dis dans mon premier post, je viens juste de débarquer sur la maintenance de cette application donc je ne suis pas sur d'être en mesure de vous dire ce que ça fait exactement.
Le code qui appelle RowsCopy() :
// Recopie les données saisies par l'utilisateur dans la DS de recherche ll_rowcount = dw_qbe.RowCount() IF lsrv_dsw_edit.of_Get_Ds_Rech( li_index ).Reset() < 0 THEN GOTO Error IF dw_qbe.RowsCopy( 1, ll_rowcount, Primary!, lsrv_dsw_edit.of_Get_Ds_Rech( li_index ), 1, Primary! ) < 0 THEN GOTO Error
Note : dw_qbe est la datawindow de recherche
Au fait, question stupide mais comment fait on pour savoir qu'une datawindow est en querymode ou non? j'ai regardé dans l'aide de PB et ils n'en disent rien...
Message de modération:
Hors ligne
Bonjour,
As-tu vérifié que l'ordre SQL de ta DW source est le même que celui ta DW resultat.
Il me semble que l'ordre des colonnes est important pour l'utilisation de la fonction Rowscopy().
Hors ligne
Mais si ca vient vraiment de l'ordre des colonnes, comment ca se fait que ca marche dans le premier exemple mais pas dans le deuxieme, alors que je n'ai rajouté qu'un champ (le meme dans mes deux datawindow) ?
PS : Au fait, question stupide mais comment fait on pour savoir qu'une datawindow est en querymode ou non? j'ai regardé dans l'aide de PB et ils n'en disent rien...
Hors ligne
Kyoshiro a écrit:
PS : Au fait, question stupide mais comment fait on pour savoir qu'une datawindow est en querymode ou non? j'ai regardé dans l'aide de PB et ils n'en disent rien...
Tout bêtement en faisant un describe:
IF my_dw.describe('datawindow.querymode') = 'yes' THEN //Dw en mode query END IF
Hors ligne
moi ce que je comprends pas c'est que ça ait fonctionné au départ alors que tu n'avais même pas le meme nombre de colonnes dans les 2 SQL (ou alors j'ai mal pigé un truc)
au final pour que ton rowscopy fonctionne il faut que tes DW aient le même nombre de colonnes et, pour faire simple, qu'elles soient dans le même ordre au niveau du type
(ex si 1ere colonne de DW 1 est de type Number alors 1ere colonne de DW 2 doit aussi être numérique)
Hors ligne
rincevent a écrit:
moi ce que je comprends pas c'est que ça ait fonctionné au départ alors que tu n'avais même pas le meme nombre de colonnes dans les 2 SQL (ou alors j'ai mal pigé un truc)
au final pour que ton rowscopy fonctionne il faut que tes DW aient le même nombre de colonnes et, pour faire simple, qu'elles soient dans le même ordre au niveau du type
(ex si 1ere colonne de DW 1 est de type Number alors 1ere colonne de DW 2 doit aussi être numérique)
Tout à fait d'accord avec toi Rincevent. Ce code me semble aussi trouble que les eaux de l'Ank...
Personnellement je pencherais plus pour un dérapage au niveau de li_index...
Hors ligne
Chrnico a écrit:
Ce code me semble aussi trouble que les eaux de l'Ank...
un connaisseur... :-)
Hors ligne
Bonjour,
Après avoir passé quelques jours à me battre contre le code, j'ai finalement vaincu, perçant ainsi le mystère derrière ce RowsCopy().
En fait, c'était tout bête (ou pas) : il y avait un code de ninja planqué dans un ancêtre de la DataWindow qui précisait sur quelle DataWindow effectuer la recherche et sur quelles colonnes effectuer la recherche, c'est pourquoi le RowsCopy() ne marchait pas. Une fois les nouvelles colonnes précisées, ça marchait comme sur des roulettes !
Tout ça pour ça vous me direz, n'empêche que ça m'aura bien pris la tête !
En tout cas, merci à vous tous pour votre aide
Hors ligne