Pas d'inquiétude, avec PBAdonf, c'est dans la poche ! ^^

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.
  • Index
  •  » Powerscripts
  •  » [RESOLU] Impossible de créer 2 fonctions globales de même nom mais avec type de

#1 29-04-2008 17:15:28

rincevent  
Modérateur
Award: bf
Lieu: Belgique
Date d'inscription: 06-02-2007
Messages: 722
Pépites: 100,002,023
Banque: 0

[RESOLU] Impossible de créer 2 fonctions globales de même nom mais avec type de

Bonjour,

une fois de plus tout ou presque est dans le titre.

je cherche à créer 2 fonctions globales Today(), dont une renverrai une Date et l'autre un Datetime (puisque la fonction Today() "système" de PB renvoie un coup date un coup datetime)

je veux faire ça pour ne plus êttre dépendant de l'heure du poste local mais uniquement de l'heure du serveur Oracle

Problème : apparament cette @#[@#{^@# de PB comprends pas qu'une fonction se différencie d'une autre fonction par son nom, ses paramètres ET son type de valeur de retour

Quand j'essaye de sauver ma 2eme fct° globale j'ai un message qui me demande si je veux remplacer la fonction existante et si je dis non il se passe rien (je n'ai tjrs qu'un version de la fct° global hors il m'en faut 2)

Ha oui, je peux toujours les sauver dans 2 pbl's différentes mais à ce moment là c'est uniquement la fct qui est dans la 1ere pbl lue qui est prise en compte donc je suis pas plus avancé fèèèèèèè chieeeeeeeeeeeer

des commentaires, remarques, suggestions ?

Dernière modification par rincevent (29-04-2008 17:19:36)


http://img114.imageshack.us/img114/8519/userbar175801nb.gif
Pourquoi ne puis-je vivre comme n'importe quel être humain ? Pourquoi mon destin est-il de ne pouvoir cesser de me battre ?

Hors ligne

 

#2 29-04-2008 17:35:08

foon  
N2iGeek + MangasGeek = foon
Award: bf
Lieu: Bonchamp-Lès-Laval
Date d'inscription: 28-02-2007
Messages: 2493
Pépites: 106
Banque: 9,223,372,036,854,775,808

Re: [RESOLU] Impossible de créer 2 fonctions globales de même nom mais avec type de

Bonjour,

Franchement, je ne sais pas si c'est possible sans passer par un userobjet non visuel.
Parceque là, tu souhaites carrément remplacer la fonction PB générique par deux fonctions customisées.

Pour info, chez mon précédent client, ils avaient surchargé le SQLCA avec une fonction fnv_getsysdatetime
que l'on utilisait systématiquement à la place de la fonction Today()
(Cela dit, je comprends que tu ne veuilles pas repasser dans toutes tes PBL pour remplacer les références à Today)


Seuls ceux qui ne font rien ne font jamais d'erreurs
http://www.nerdtests.com/images/badge/163124fb7fb459a3.gif

Hors ligne

 

#3 29-04-2008 18:01:20

rincevent  
Modérateur
Award: bf
Lieu: Belgique
Date d'inscription: 06-02-2007
Messages: 722
Pépites: 100,002,023
Banque: 0

Re: [RESOLU] Impossible de créer 2 fonctions globales de même nom mais avec type de

foon a écrit:

Bonjour,

Franchement, je ne sais pas si c'est possible sans passer par un userobjet non visuel.
Parceque là, tu souhaites carrément remplacer la fonction PB générique par deux fonctions customisées.

Pour info, chez mon précédent client, ils avaient surchargé le SQLCA avec une fonction fnv_getsysdatetime
que l'on utilisait systématiquement à la place de la fonction Today()
(Cela dit, je comprends que tu ne veuilles pas repasser dans toutes tes PBL pour remplacer les références à Today)

tu as tout compris, l'intérêt du truc c'est Justement de remplacer d'un coup et de façon certaine tous les appels existants de today() (ou crées dans le futur)


http://img114.imageshack.us/img114/8519/userbar175801nb.gif
Pourquoi ne puis-je vivre comme n'importe quel être humain ? Pourquoi mon destin est-il de ne pouvoir cesser de me battre ?

Hors ligne

 

#4 29-04-2008 18:06:56

erasorz  
Admin
Lieu: Babylone
Date d'inscription: 23-11-2006
Messages: 5122
Pépites: 97,200
Banque: 2,147,483,647

Re: [RESOLU] Impossible de créer 2 fonctions globales de même nom mais avec type de

Salut, je crois qu'en PB les fonctions de même nom se différencient uniquement par le nb/type d'arguments.

Finding and executing functions and events

PowerBuilder looks for a matching function or event based on its name and its argument list. (...)

si ta fonction personnalisée Today() renvoie un datetime et que tu veux une date tu peux faire un simple Date( Today() )


N'envoyez jamais un humain faire le travail d'un programme.

Hors ligne

 

#5 30-04-2008 09:52:55

Cortex  
Modérateur
Lieu: Arlon
Date d'inscription: 08-02-2008
Messages: 194
Pépites: 6,904
Banque: 2,109,818,425,070

Re: [RESOLU] Impossible de créer 2 fonctions globales de même nom mais avec type de

Desole cher Rincevent,

Mais c'est un grand classique de l'overloading: le type de retour ne permet jamais de differencier deux methodes, uniquement sa signature (nom + arguments)...

Donc ce que tu essaye de faire, outre que ca part d'un bon sentiment, est un peu voue a l'echec. Tu ne pourras pas redefinir les 2 today() de PB...

Hors ligne

 

#6 30-04-2008 13:55:29

FMolinas  
Membre Geek
Lieu: Lyon
Date d'inscription: 12-06-2007
Messages: 87
Pépites: 97
Banque: 6,435,474,948,567

Re: [RESOLU] Impossible de créer 2 fonctions globales de même nom mais avec type de

Le souci avec ton approche, c'est à la base ta volonté de créer deux fonctions globales de même nom. Une fonction globale dans PowerBuilder, c'est une classe au même titre qu'une fenêtre ou une datawindow, et pas une méthode (de quel objet ?) que tu pourrais surcharger.
Tu peux effectivement créer deux fonctions globales de même nom, obligatoirement dans deux pbl différentes. Dans ce cas c'est comme d'habitude la première dans l'ordre de recherche qui sera utilisée, et celle-ci seulement.

La meilleure solution à ton problème (récupérer l'heure de ton serveur Oracle et pas celle de ton poste client), c'est celle de foon. Crée une classe qui hérite de Transaction, avec une méthode supplémentaire pour récupérer un Datetime. Tu pourras convertir de façon explicite ce Datetime en Date au besoin, ce qui rend en plus ton code plus facile à maintenir en évitant au relecteur de se poser la question.
Si besoin, tu peux aussi créer une fonction globale Today, qui appelle la méthode de ta classe Transaction personnalisée (ou génère systématiquement une erreur si tu veux être méchant avec tes collègues développeurs ).

Hors ligne

 

#7 30-04-2008 16:27:03

rincevent  
Modérateur
Award: bf
Lieu: Belgique
Date d'inscription: 06-02-2007
Messages: 722
Pépites: 100,002,023
Banque: 0

Re: [RESOLU] Impossible de créer 2 fonctions globales de même nom mais avec type de

FMolinas, quitte à ne pouvoir avoir qu'une version de la fcontion today je ne pige pas l'intérêt de la définir comme fct° d'un objet ? (autant utiliser direct une fct Globale) et je comprends encore moins pourquoi tu parles d'hériter de l'objet transaction, peux tu m'expliquer ? (désolé si je suis un peu boulet :-) )

merci pour vos réponses. c'est quand même assez emmerdant de ne pas être capable de faire en tant que Dev. ce que PB se permets (ie avoir une fonction qui renvoie un coup une date un coup une datetime) ça fout vraiment le boxon, ils pouvaitent pas faire une fonction today() et une todaynow() non ?

j'insite aussi sur l'intérêt de pouvoir remplacer de façon transparente les appels à today() comparé à simplement appeller une nouvelle fonction style gf_today() ce qui pose le problème de devoir faire attention en permanence à jamais utiliser today(), ce qui est vite arrivé, surtout quand beaucoup de consultants différents travaillent sur l'appli pour des courtes périodes. Autrement dit si je peux pas remplacer de façon transparente je sais d'office qu'un jour qqun va récup l'heure du PC au lieu de l'heure serveur.

enfin merci pour vos contributions en tout cas.

Dernière modification par rincevent (30-04-2008 16:35:46)


http://img114.imageshack.us/img114/8519/userbar175801nb.gif
Pourquoi ne puis-je vivre comme n'importe quel être humain ? Pourquoi mon destin est-il de ne pouvoir cesser de me battre ?

Hors ligne

 

#8 30-04-2008 17:21:35

foon  
N2iGeek + MangasGeek = foon
Award: bf
Lieu: Bonchamp-Lès-Laval
Date d'inscription: 28-02-2007
Messages: 2493
Pépites: 106
Banque: 9,223,372,036,854,775,808

Re: [RESOLU] Impossible de créer 2 fonctions globales de même nom mais avec type de

rincevent a écrit:

FMolinas, quitte à ne pouvoir avoir qu'une version de la fcontion today je ne pige pas l'intérêt de la définir comme fct° d'un objet ? (autant utiliser direct une fct Globale) et je comprends encore moins pourquoi tu parles d'hériter de l'objet transaction, peux tu m'expliquer ?

Pour l'utilisation d'un userobject hérité de l'objet transaction, la réponse est simple: La base de donnée!

En effet, si tu veux récupérer la date système, tu dois aller la chercher via ton SGBD (avec des instructions différentes d'un SGBD à l'autre: SYSDATE pour ORACLE, GETDATE() pour SYBASE par exemple).

Maintenant, imagine que tu dois taper sur 2 SGBD différents au sein d'une même application (Une base ORACLE et une base SQLAnywhere par exemple): Si tu veux récupérer la date système sur l'un ou l'autre serveur, il va te falloir deux fonctions globales différentes (avec les problèmes que tu as toi même soulevé car elles devront être dans deux PBL différentes si elles ont le même nom et les mêmes arguments).

Tandis qu'avec des userobjets hérités de l'objet transaction, il te sera plus facile de "jongler" entre les deux.
Ce n'est d'ailleurs pas un hasard si Sybase a repris ce principe avec ses PFC et toutes les méthodes de gestion transactionnelles et de BDD
of_commit, of_begin, of_distinctvalues,etc... implémentées au niveaux de descendants de l'objet transaction (Pour rappel, pfc_n_tr et ses descendants).

De plus, cela facilite la maintenance d'avoir tout de regroupé dans un même objet, plutôt que de multiplier les fonctions globales.


Seuls ceux qui ne font rien ne font jamais d'erreurs
http://www.nerdtests.com/images/badge/163124fb7fb459a3.gif

Hors ligne

 

#9 01-05-2008 14:02:24

Chrnico  
N2I Power
Award: bf
Lieu: Vanves
Date d'inscription: 05-06-2007
Messages: 1206
Pépites: 12,884,901,943
Banque: 9,223,372,036,854,775,808
Site web

Re: [RESOLU] Impossible de créer 2 fonctions globales de même nom mais avec type de

Pour revenir sur ton problème de ne pas laisser passer un appel au Today() de PB, fais ce que dit Fmolinas en créant une fonction Today() globale, mais fais la retourner une string. Tous les appels à la fonction Today() seront très vite localisés à la compil :sifs:
Et si tu la laisse dans des PBL de ta bibliothèque d'objets, tu seras certain que plus personne ne pourra appeler Today() pour obtenir la date du jour. Du coup, il n'y aura pas d'autre solution que d'appeler ta méthode de ta transaction (ex : sqlca.uf_get_today()). 

Pour revenir à l'interêt d'avoir une méthode de l'objet transaction, c'est qu'effectivement chaque objet trans étant connecté à un serveur, tu peux ainsi obtenir la date et surtout l'heure de tes différents serveur. C'est très pratique pour les sociétés ayant plusieurs serveurs localisés dans différents fuseaux horaires (tu peux ainsi calculer très facilement les décalages horaires réels entre 2 sites par exemple). A l'inverse, si tous les serveurs sont dans le même fuseau horaire, tu peux faire une routine de vérification en PB pour s'assurer que tous les serveurs tourne avec la même heure... C'est très pratique pour les applications accédant à plusieurs bases et où l'heure est sensible. J'ai déjà eu le cas sur un site où c'est l'équipe de dev qui a remonté une anomalie d'heure sur un serveur qui n'avait pas changé d'heure suite au passage de l'heure d'été à l'heure d'hivers...


Tu dois donc tu peux (Kant)

Tu peux donc tu dois (N2i)
www.n2i.fr

Hors ligne

 

#10 02-05-2008 13:50:18

FMolinas  
Membre Geek
Lieu: Lyon
Date d'inscription: 12-06-2007
Messages: 87
Pépites: 97
Banque: 6,435,474,948,567

Re: [RESOLU] Impossible de créer 2 fonctions globales de même nom mais avec type de

Ah, le mois de mai et ses trous dans l'emploi du temps... Je tarde à répondre, mais du coup j'aurai moins à dire

rincevent a écrit:

FMolinas, quitte à ne pouvoir avoir qu'une version de la fcontion today je ne pige pas l'intérêt de la définir comme fct° d'un objet ? (autant utiliser direct une fct Globale) et je comprends encore moins pourquoi tu parles d'hériter de l'objet transaction, peux tu m'expliquer ? (désolé si je suis un peu boulet :-) )

L'intérêt d'avoir des méthodes plutôt que des fonctions globales, c'est que tu peux hériter/surcharger les premières, mais pas les secondes (qui sont, mine de rien, des classes à elles toutes seules).
Quant à hériter de l'objet Transaction, foon a tout dit J'ajoute tout de même une fonctionnalité intéressante : les fonctions locales externes. Tu peux par ce moyen définir une fonction PB qui se trouve être un alias pour l'appel d'une procédure stockée de ta base. C'est un moyen pratique d'appeler une procédure stockée depuis un script PB sans être obligé de passer par les fonctionnalités barbares et exotiques du SQL dynamique... Jette un coup d'oeil à l'aide, à la rubrique "stored procedures, declaring".
Et il me revient aussi que l'appel d'une fonction globale est, il me semble, assez coûteux : à chaque appel, la machine virtuelle PB doit instancier la classe de ta fonction, puis nettoyer une fois la fonction finie. Ce n'est pas forcément rhédibitoire en termes de performances, mais quand même... Alors que normalement, tu as un objet (éventuellement hérité de) Transaction instancié en permanence.

rincevent a écrit:

merci pour vos réponses. c'est quand même assez emmerdant de ne pas être capable de faire en tant que Dev. ce que PB se permets (ie avoir une fonction qui renvoie un coup une date un coup une datetime) ça fout vraiment le boxon, ils pouvaitent pas faire une fonction today() et une todaynow() non ?

En fait, je soupçonne PB de n'avoir qu'une seule fonction qui renvoie un DateTime... automatiquement tronqué en date au besoin. C'est un peu limite quand même ce genre de pratique... En fait, le PowerScript ne travaille pas nativement sur le type DateTime, qui n'est fourni que pour assurer la communication avec les SGBD. Il gère les deux types Date et Time, mais quasiment pas leur combinaison... ce qui explique la désespérante pauvreté des fonctions de gestion date/heure

rincevent a écrit:

j'insite aussi sur l'intérêt de pouvoir remplacer de façon transparente les appels à today() comparé à simplement appeller une nouvelle fonction style gf_today() ce qui pose le problème de devoir faire attention en permanence à jamais utiliser today(), ce qui est vite arrivé, surtout quand beaucoup de consultants différents travaillent sur l'appli pour des courtes périodes. Autrement dit si je peux pas remplacer de façon transparente je sais d'office qu'un jour qqun va récup l'heure du PC au lieu de l'heure serveur.

Pas la peine d'insister, nous sommes d'accord sur le grand intérêt de la chose. La fourberie de Chrnico est magnifique, je la ressortirai un jour s'il n'a pas breveté le procédé

Hors ligne

 

#11 05-05-2008 11:21:11

rincevent  
Modérateur
Award: bf
Lieu: Belgique
Date d'inscription: 06-02-2007
Messages: 722
Pépites: 100,002,023
Banque: 0

Re: [RESOLU] Impossible de créer 2 fonctions globales de même nom mais avec type de

encore pour toutes vos contributions, j'vais voir ce que je peux faire de tout ça maintenant


http://img114.imageshack.us/img114/8519/userbar175801nb.gif
Pourquoi ne puis-je vivre comme n'importe quel être humain ? Pourquoi mon destin est-il de ne pouvoir cesser de me battre ?

Hors ligne

 
  • Index
  •  » Powerscripts
  •  » [RESOLU] Impossible de créer 2 fonctions globales de même nom mais avec type de

Pied de page des forums

Propulsé par FluxBB 1.2.22