Powerbuilder pour les completement Geeks !

Le forum (ô combien francophone) des utilisateurs de Powerbuilder.

Recherche rapide

Annonce

Certaines rubriques, dont des cours, sont uniquement visibles par les membres du forum ^^.
Dans la rubrique Liens & Références, vous avez accès à un sommaire de téléchargement, profitez-en !
Il existe maintenant un nouveau TOPIC "Votre CV en Ligne" accessible uniquement par demande.

#1 05-04-2013 10:41:18

_francois_  
Bienfaiteur du site
Lieu: TOULOUSE
Date d'inscription: 25-03-2010
Messages: 151
Pépites: 178,983,268,111
Banque: 9,223,372,036,854,776,000

PBNI: Est-ce possible ?

Bonjour,

d'abord le contexte:

Nous sommes en train de développer une application en PB 12.5.1 Classic

Nous avons diverses applications dans diverses versions de PB (en 10 et 12 logiquement)

Nous devons accéder depuis certaines anciennes application à des fonctionnalités de la nouvelle application (en gros un Visual UserObject et quelques Non Visual UserObject)
Ma partie de la nouvelle application est plutôt clean c'est à dire que toute la logique métier est dans les NVO, mes visuals font du shareData avec les NVO et il y a peu de code dedans (en gros du code spécifique à l'interaction graphique avec l'utilisateur et les fenêtres contiennent les visual et appellent les méthode des visual)

La hiérarchie a décidé au départ de l'application que la nouvelle application serait en Classic et que les accès se ferait par partage de pbl ce qui implique de migrer toutes nos applications à interfacer en pb 12.5.1 (pour le moment 5 applications) moi ça m'embête fortement pour plusieurs raisons:
Toutes nos applications devront être faites dans la même version de PB donc si un jour on veut faire une application dans une nouvelle version de PB on va devoir migrer toutes nos applications
Il va falloir déployer les runtime PB 12.5.1 sur plusieurs milliers de postes à travers toute la France même chez les clients n'ayant pas la nouvelle application (car on ne va pas maintenir les anciennes applis à la fois en PB10 et PB12.5.1) sachant que la plupart des utilisateurs ont la phobie de l'informatique et que lancer un simple exécutable pour déployer les runtime revient à relever un challenge incroyable.
Tester les applications migrées en PB 12.5.1 va être long et fastidieux vu le nombre de fonctionnalités et de cas différents qui sont traités par ces applications.
On a commencé à migrer des applications et on rencontre des problèmes avec des petites choses qui ne marchent plus.

Les anciennes applications peuvent fonctionner de manière "non connectée" (en lecture seule avec une base locale) donc déployer des WebServices sur les laptop des gens concernés va être compliqué.

Personnellement j'avais proposé d'autres solutions avant le début du développement mais la situation est comme ça et il est trop tard pour en changer (la nouvelle application est presque bouclée)

Donc la question est la suivante:
Quelles sont les solutions pour éviter de devoir migrer nos anciennes applications vers PB12.5.1) ?
En regardant du coté de PBNI j'ai vu qu'il semblait être possible d'appeler des NVO des programmes en C++
Sachant que nous n'avons aucun développeur C++ chez nous je voulais avoir votre avis éclairé sur la question avant de me lancer dans la bataille (même pas peur)
Est-ce bien possible de faire une espèce de Wrapper PBNI de certains objets de l'application PB 12.5.1 pour les utiliser dans PB10 ?
Est-ce que ça marche aussi avec les Visual ?

Sinon vous voyez d'autres solutions ?

Merci par avance

Hors ligne

 

#2 05-04-2013 11:47:34

seki  
0x73656B69
Award: bf
Lieu: Laquenexy & Luxembourg
Date d'inscription: 20-11-2008
Messages: 1118
Pépites: 4,296,080,204
Banque: 9,223,372,036,854,776,000
Site web

Re: PBNI: Est-ce possible ?

_francois_ a écrit:

Est-ce bien possible de faire une espèce de Wrapper PBNI de certains objets de l'application PB 12.5.1 pour les utiliser dans PB10 ?

Pour faire une extension avec le framework PBNI,
- il faut un PB >= 9
- il faut Visual Studio (ici 2005,  ça marche aussi avec les versions ultérieures et express).
- et visual studio compile avec les fichiers relatifs à PBNI contenus dans le répertoire SDK fournit avec PB

Maintenant à une release de PB donnée (à partir du 9) correspond un SDK PBNI, et quand on voit les problèmes qui arrivent parfois (instabilité) quand des versions de dll différentes sont utilisées (p. exemple une application est déployée sur un poste où le runtime n'est pas du même EBF) j'ai des doutes sur la faisabilité d'appeler dans une dll pbni des objets / fonctions d'un PB différent.

_francois_ a écrit:

Est-ce que ça marche aussi avec les Visual ?

Je ne suis pas sûr de comprendre la question.

Si la question est de faire des pbni visuels, oui c'est possible les objets codés en c++ dans une dll pbni peuvent êtres visuels ou non visuels (il y a des exemples sur Codexchange)

Si la question de savoir si on peut accéder à des visual userobjects depuis le code c++, oui c'est possible.


The best programs are the ones written when the programmer is supposed to be working on something else. - Melinda Varian

Mes réponses PB sur StackOverflow
http://stackoverflow.com/users/flair/317266.png

Hors ligne

 

#3 08-04-2013 06:53:53

_francois_  
Bienfaiteur du site
Lieu: TOULOUSE
Date d'inscription: 25-03-2010
Messages: 151
Pépites: 178,983,268,111
Banque: 9,223,372,036,854,776,000

Re: PBNI: Est-ce possible ?

Merci pour cette réponse

oui c'est pour accéder à un Visual Object depuis C++

par contre la question que je me pose: Quid des variables globales ?
En gros dans l'application PB 12.5.1 nous avons deux variables globales l'object transaction sqlcg et un nvo n_global qui contient (entre autres) la déclaration des external functions et des variables "globales" en gros quand on veut une variable globale on la met en variable d'instance dans n_global et on y accède par gnv_global.ma_variable

Vu qu'un a un planning assez chargé en ce moment au boulot et que j'ai un planning perso aussi assez chargé qui me laisse peu de temps pour les heures sup en ce moment je me renseigne donc sur la viabilité d'une telle méthode avant de m'y lancer dedans (sachant que je ferai de toute façon sûrement ça juste pour ma culture personnelle car c'est important la culture personnelle dans notre métier)

Pour ce qui est des différente versions de PB:
Toutes les applications PB 10 sont développées avec le même niveau de Patch de PB
Toutes les applications PB 12 sont développées avec le même niveau de Patch de PB
Ce sont les mêmes runtime PB 10 qui sont déployés chez tous nos clients
Ce sont les mêmes runtime PB 12 qui sont déployés chez tous nos clients

Pour la dll je suppose qu'il va falloir que j'en compile plusieurs versions
Une pointant sur le SDK PB10 pour nos applications PB10
Une pointant sur le SDK PB12 pour nos applications PB12

J'essaierai de trouver du temps pour tester tout ça je vous tiendrai au courant pour vous faire part des résultats des recherches.

Hors ligne

 

#4 09-04-2013 06:58:51

_francois_  
Bienfaiteur du site
Lieu: TOULOUSE
Date d'inscription: 25-03-2010
Messages: 151
Pépites: 178,983,268,111
Banque: 9,223,372,036,854,776,000

Re: PBNI: Est-ce possible ?

Bon j'ai pu faire quelques test hier (en mode appel de mon application 12.5 en application console pour commencer)
J'ai pu appeler mon application, initialiser ma transaction et ma variable globale, instancier un objet en C++ et appeler des méthode sur mon objet

Par contre quand la méthode retourne un string je n'ai que le premier caractère de la chaine

Code: cpp

  PBCallInfo ci2;

  pbmethodID midGB = session->GetMethodID(cls, _T("getitemstring"),
    PBRT_FUNCTION, _T("SLXS"));

  // Initialize call info structure based on method ID
  session->InitCallInfo(cls, midGB, &ci2);
  
  ci2.pArgs-> GetAt(0)->SetLong(1);
  ci2.pArgs-> GetAt(1)->SetString(_T("nom_doc"));

  try
  {
    session->InvokeObjectFunction(pbobj, midGB, &ci2);

    // Was PB exception thrown?
    if (session->HasExceptionThrown())
    {
      // Handle PB exception
      session->ClearException();
    }
  }
  catch (...)
  {
    // Handle C++ exception
  }

  pbstring sret = ci2.returnValue->GetString();
  LPCTSTR pstr = session->GetString(sret);
  
  fprintf(stderr, "Nom du document: %s\n",
     pstr);


Je vais chercher mais si quelqu'un a une idée je suis preneur.

Edit: le session->GetStringLenght me retourne bien la bonne longueur de chaîne
le documentation me parle d'un session->SetPBString mais mon gentil VC++ 2010 me dit que IPB_session n'a pas de membre SetPBString

Merci

Dernière modification par _francois_ (09-04-2013 07:27:46)

Hors ligne

 

#5 09-04-2013 07:41:39

_francois_  
Bienfaiteur du site
Lieu: TOULOUSE
Date d'inscription: 25-03-2010
Messages: 151
Pépites: 178,983,268,111
Banque: 9,223,372,036,854,776,000

Re: PBNI: Est-ce possible ?

bon en fait j'ai trouvé, il fallait que je passe le jeu de caractères de mon projet à Non défini (par défaut il est placé sur Unicode) pour avoir la chaîne en entier.

Hors ligne

 

Pied de page des forums

Propulsé par FluxBB 1.2.22