IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

WinDev Discussion :

Passage d'un tableau de tableau à une fonction d'un composant COM


Sujet :

WinDev

  1. #1
    Expert éminent
    Avatar de jurassic pork
    Homme Profil pro
    Bidouilleur
    Inscrit en
    Décembre 2008
    Messages
    3 949
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Bidouilleur
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2008
    Messages : 3 949
    Points : 9 277
    Points
    9 277
    Par défaut Passage d'un tableau de tableau à une fonction d'un composant COM
    hello,
    j'essaie de passer un tableau de tableau à une fonction d'un composant COM à partir de windev mais je n'y arrive pas . Est-ce possible réellement ?
    j'ai fait des essais avec des structures,des variants. Soit j'ai paramètre invalide ou soit le paramètre n'est pas bon.
    Quand j'utilise vbscript avec le même objet COM cela passe :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    MyArray = p.execute ("dbtest", uid, "test", "res.partner.address", "search", Array(Array("city","=","Namur")))
    en Windev avec des variants :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    MaRecherche  est  un tableau de 3 Variants = ["city","=","Namur"]
    montbRecherche est un tableau  de  Variant
    TableauAjoute(montbRecherche,MaRecherche)
    MaListeId = MonProxy>>execute("dbtest", uid,"test", "res.partner.address", "search",montbRecherche)
    j'ai l'erreur suivante retournée :
    ValueError: Invalid term 'city' in domain expression ['&', '&', '&', ('active', '=', 1), 'city', '=', 'Namur']
    normalement je devrais avoir pour que cela passe :
    ['&', '&', '&', ('active', '=', 1), ('city', '=', 'Namur')]
    Ami calmant, J.P
    Jurassic computer : Sinclair ZX81 - Zilog Z80A à 3,25 MHz - RAM 1 Ko - ROM 8 Ko

  2. #2
    Membre expérimenté Avatar de Tober
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juillet 2007
    Messages
    824
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : Luxembourg

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Finance

    Informations forums :
    Inscription : Juillet 2007
    Messages : 824
    Points : 1 381
    Points
    1 381
    Par défaut
    Je te préviens, j'y comprend pas grand chose dans ce type de programmation, mais on sait jamais sur un mal-entendu...
    On dirait dans ton message d'erreur que ton deuxième tableau montbRecherche n'est même pas pris en compte...

    Est-ce que tu as essayé de juste passer MaRecherche en argument (au lieu de montbRecherche) ? et quel est le retour de la fonction ?

    Essaye avec MaRecherche est un tableau de 3 chaines (à la place de variant)

    Tu peux aussi de faire un seul tableau à deux dimensions :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    MaRecherche est un tableau fixe de 1 par 3 chaîne = [["city","=","Namur"]]
    Fixe car dans l'aide :
    Il est conseillé d'utiliser :

    Un tableau fixe pour passer en paramètre un tableau aux fonctions API Windows.
    Voilà déjà quelques tests a effectuer, si ça marche pas, tu peux aussi nous montrer les messages d'erreurs pour chaque test ? ca peut toujours nous guider...

    Bonne chance !

  3. #3
    Membre averti
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2009
    Messages
    178
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Industrie

    Informations forums :
    Inscription : Mars 2009
    Messages : 178
    Points : 416
    Points
    416
    Par défaut
    Bonjour,

    Avez-vous essayé avec ConstruitVariantAutomation, qui devrait en théorie permettre de résoudre ce problème ?

    Je précise en théorie car j'ai eu un problème similaire pour utiliser les procédures d'un activeX, mais je n'ai jamais réussi à le faire fonctionner en utilisant les procédure Windev, je m'étais donc résolu à tout encapsuler dans des VBScript comme vous...

  4. #4
    Expert éminent
    Avatar de jurassic pork
    Homme Profil pro
    Bidouilleur
    Inscrit en
    Décembre 2008
    Messages
    3 949
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Bidouilleur
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2008
    Messages : 3 949
    Points : 9 277
    Points
    9 277
    Par défaut
    hello,
    merci pour vos réponses.
    Pour Tober
    Lorsque je mets :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    montbRecherche est un tableau  de 0 par 3 chaînes
    TableauAjouteLigne(montbRecherche,"city","=","Namur")
    voici ce qui se passe :
    En tentant d'invoquer la méthode <execute>, l'objet Automation/ActiveX a renvoyé l'erreur suivante :
    'Erreur 80070057, Un ou plusieurs arguments sont invalides'
    Lorsque je mets :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     MontbRecherche est un tableau fixe de 1 par 3 chaîne = [["city","=","Namur"]]
    j'obtiens :
    Erreur à la ligne 45 du traitement Clic sur Bouton4.
    Vous avez appelé la méthode Automation 'execute'.
    Le paramètre 6 n'est pas convertible en paramètre automation.
    Si je remplace dans l'appel de la fonction execute le paramètre MontbRecherche par ConstruitVariantAutomation(MontbRecherche)
    j'ai ce message :
    La fonction ConstruitVariantAutomation aurait dû renvoyer une valeur.
    cela veut dire qu'il n'arrive pas à construire le variant automation.

    Ami calmant, J.P
    Jurassic computer : Sinclair ZX81 - Zilog Z80A à 3,25 MHz - RAM 1 Ko - ROM 8 Ko

  5. #5
    Membre émérite
    Homme Profil pro
    Inscrit en
    Octobre 2007
    Messages
    1 075
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Octobre 2007
    Messages : 1 075
    Points : 2 441
    Points
    2 441
    Par défaut
    Bonsoir,

    Pas de tableau de tableaux, dixit la doc.

    Tableau (Type de variable)

    Limites
    Éléments d'un tableau


    Un tableau peut être constitué de classes uniquement si ces classes possèdent un constructeur sans paramètres (ou avec des paramètres facultatifs).
    Un tableau ne peut pas être constitué :
    - de variables composées,
    - de tableaux.


    Voir aussi Structure (Type de variable) : Quels types "avancés" peuvent être membre ?, en bas de page.

    En fait, il faut faire un tableau de structure(s) de tableau(x) !

    Hemgé

  6. #6
    Expert éminent
    Avatar de jurassic pork
    Homme Profil pro
    Bidouilleur
    Inscrit en
    Décembre 2008
    Messages
    3 949
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Bidouilleur
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2008
    Messages : 3 949
    Points : 9 277
    Points
    9 277
    Par défaut
    bonsoir Hemgé,

    merci pour ta réponse, effectivement j'avais vu que le tableau de tableau était interdit mais je gardais espoir.

    J'ai essayé de faire ce que tu as dis (tableau de structure(s) de tableau(x)). Soit je m'y prend mal , soit je n'ai rien compris ou soit cela ne marche pas en faisant comme ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    MaStruct est une structure
     MaRecherche est un tableau de Variants	
     FIN
     
    MonFiltre est une MaStruct = [["city","=","Namur"]]
     
     montbRecherche est un tableau  de MaStruct
    TableauAjoute(montbRecherche,MonFiltre)
     
    MaListeId = MonProxy>>execute("dbtest", uid,"test", "res.partner", "search",montbRecherche)
    j'obtiens :
    Vous avez appelé la méthode Automation 'execute'.
    Le paramètre 6 n'est pas convertible en paramètre automation.
    Ami calmant, J.P
    Jurassic computer : Sinclair ZX81 - Zilog Z80A à 3,25 MHz - RAM 1 Ko - ROM 8 Ko

  7. #7
    Membre émérite
    Homme Profil pro
    Inscrit en
    Octobre 2007
    Messages
    1 075
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Octobre 2007
    Messages : 1 075
    Points : 2 441
    Points
    2 441
    Par défaut
    Bonsoir,

    Je vous décrivais ce qui suit :
    Niveau 1 : un tableau dont une colonne est
    Niveau 2 : une structure dont un ou plusieurs membres sont
    Niveau 3 : des tableaux

    Soit un tabFicDeAna de DescriptionFic qui comprend des variables simples et des tableaux (RubrDeFic, ClésDeFic, LiensDeFic), comme ceci qui fonctionne :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    DescriptionFic est une Structure 
    ...
    RubrDeFic est un tableau dynamique 
    ClésDeFic est un tableau dynamique 
    LiensDeFic est un tableau dynamique 
    DernMAJ est une DateHeure 
    FIN
    tabFicDeAna est un tableau <agrandissement> de DescriptionFic
    Ce que vous avez fait, c'est
    Un tableau (MontbRecherche) qui contient une structure de variants (MonFiltre).
    Cela semble correct en dehors du contexte de votre passage de paramètres.
    Je ne comprends pas pourquoi vous vouliez utiliser un tableau de tableaux.

    Qu'attend exactement votre composant et sous quelle forme ?

    Hemgé

  8. #8
    Expert éminent
    Avatar de jurassic pork
    Homme Profil pro
    Bidouilleur
    Inscrit en
    Décembre 2008
    Messages
    3 949
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Bidouilleur
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2008
    Messages : 3 949
    Points : 9 277
    Points
    9 277
    Par défaut
    Le composant COM ne sert seulement que "d'intermédiaire" pour transmettre sous protocole xmlrpc une commande à un WebService qui utilise du python comme langage.
    voici la définition de la commande search du webservice :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    def search(self, cr, user, args, offset=0, limit=None, order=None, context=None, count=False):
            """
            Search for records based on a search domain.
     
            :param cr: database cursor
            :param user: current user id
            :param args: list of tuples specifying the search domain [('field_name', 'operator', value), .....]. Pass an empty list to match all records.
            :param offset: optional number of results to skip in the returned values (default: 0)
            :param limit: optional max number of records to return (default: **None**)
            :param order: optional columns to sort by (default: self._order=id )
            :param context: optional context arguments, like lang, time zone
            :type context: dictionary
            :param count: optional (default: **False**), if **True**, returns only the number of records matching the criteria, not their ids
            :return: id or list of ids of records matching the criteria
            :rtype: integer or list of integers
            :raise AccessError: * if user tries to bypass access rules for read on the requested object.
     
            **Expressing a search domain (args)**
     
            Each tuple in the search domain needs to have 3 elements, in the form: **('field_name', 'operator', value)**, where:
     
                * **field_name** must be a valid name of field of the object model, possibly following many-to-one relationships using dot-notation, e.g 'street' or 'partner_id.country' are valid values.
                * **operator** must be a string with a valid comparison operator from this list: ``=, !=, >, >=, <, <=, like, ilike, in, not in, child_of, parent_left, parent_right``
                  The semantics of most of these operators are obvious.
                  The ``child_of`` operator will look for records who are children or grand-children of a given record,
                  according to the semantics of this model (i.e following the relationship field named by
                  ``self._parent_name``, by default ``parent_id``.
                * **value** must be a valid value to compare with the values of **field_name**, depending on its type.
     
            Domain criteria can be combined using 3 logical operators than can be added between tuples:  '**&**' (logical AND, default), '**|**' (logical OR), '**!**' (logical NOT).
            These are **prefix** operators and the arity of the '**&**' and '**|**' operator is 2, while the arity of the '**!**' is just 1.
            Be very careful about this when you combine them the first time.
     
            Here is an example of searching for Partners named *ABC* from Belgium and Germany whose language is not english ::
     
                [('name','=','ABC'),'!',('language.code','=','en_US'),'|',('country_id.code','=','be'),('country_id.code','=','de'))
     
            The '&' is omitted as it is the default, and of course we could have used '!=' for the language, but what this domain really represents is::
     
                (name is 'ABC' AND (language is NOT english) AND (country is Belgium OR Germany))
     
            """
            return self._search(cr, user, args, offset=offset, limit=limit, order=order, context=context, count=count)
    C'est le paramètre args qui pose problème. En fait il faut transmettre une liste de tuples.
    En vbs avec un Array(Array("city","=","Namur")) cela fonctionne.
    j'ai l'impression que je tombe sur le problème qu'évoquait Hibernatus dans un message :
    Pour avoir un tableau de tableaux, il faut déclarer une structure contenant un tableau local, puis déclarer un tableau de structures.

    Dans les 2 cas, votre tableau ne sera pas binairement compatible avec celui en C.

    Ami calmant, J.P
    Jurassic computer : Sinclair ZX81 - Zilog Z80A à 3,25 MHz - RAM 1 Ko - ROM 8 Ko

  9. #9
    Membre émérite
    Homme Profil pro
    Inscrit en
    Octobre 2007
    Messages
    1 075
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Octobre 2007
    Messages : 1 075
    Points : 2 441
    Points
    2 441
    Par défaut
    Bonjour,

    Each tuple in the search domain needs to have 3 elements, in the form: **('field_name', 'operator', value)**, where:
    Je remarque que les tupples doivent être bornés par de simples ', comme pour SQL. Ce qui ne sera pas le résultat de "city","=","Namur".
    Dans cette perspective, je suppose que value, sans guillemet simple, renvoie à une valeur numérique.

    Il faut tenter "'city'", "'='", "'Namur'" et je pense que cela devrait fonctionner avec une simple chaîne de caractères "'city', '=', 'Namur'", à construire comme pour passer des valeurs en SQL.

    Hemgé

  10. #10
    Expert éminent
    Avatar de jurassic pork
    Homme Profil pro
    Bidouilleur
    Inscrit en
    Décembre 2008
    Messages
    3 949
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Bidouilleur
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2008
    Messages : 3 949
    Points : 9 277
    Points
    9 277
    Par défaut
    hello,
    ça ne fonctionne pas mieux.

    avec "'city'", "'='", "'Namur'"

    j'obtiens :
    ValueError: Invalid term "'city'" in domain expression ['&', '&', '&', ('active', '=', 1), "'city'", "'='", "'Namur'"]
    avec "'city', '=', 'Namur'"
    j'obtiens :
    ValueError: Invalid term "'city','=','Namur'" in domain expression ['&', ('active', '=', 1), "'city','=','Namur'"]
    '
    les "simple quote" sont une repésentation des chaînes en python.

    On ne va pas insister. On risque de perdre du temps pour rien. Comme le suggérait themayu on va passer par du vbscript, vu que l'on peut exécuter du vbscript dans Windev avec l'objet automation MSScriptControl.ScriptControl. Merci pour vos participations.

    A titre indicatif voici comme je fais pour m'en sortir avec du vbscript dans windev :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    oScript est un objet Automation "MSScriptControl.ScriptControl"
    ScriptVBS est une chaîne = [
    Function FuncOpenErp()
    dim f, p
    set f = CreateObject("pocketXMLRPC.Factory")
    set p = f.Proxy("http://version61.openerp-online.com:8061/xmlrpc/common")
    uid = p.login("dbtest","admin","test")
    set p = f.Proxy("http://version61.openerp-online.com:8061/xmlrpc/object")
    MyArray = p.execute ("dbtest", uid, "test", "res.partner.address", "search", Array(Array("%1","%2","%3")))
    dim sInfo
    for each x in MyArray
    	sInfo = sInfo & x & chr(13) &  chr(10)
    	next
    	FuncOpenErp = sInfo
    End Function
    ]
    ScriptVBS= ChaîneConstruit(ScriptVBS,"city","=","Namur") 
    oScript>>Language("VBScript")
    oScript>>AddCode(ScriptVBS)
    oScript>>Timeout(-1)   
    sResultat est une chaîne = oScript>>Run("FuncOpenErp")
    Trace(sResultat)
    Ami calmant, J.P
    Jurassic computer : Sinclair ZX81 - Zilog Z80A à 3,25 MHz - RAM 1 Ko - ROM 8 Ko

  11. #11
    Membre émérite

    Profil pro
    Inscrit en
    Février 2005
    Messages
    1 751
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 1 751
    Points : 2 368
    Points
    2 368
    Par défaut
    Bonjour à tous,

    J'arrive après la bataille...

    JP, pour répondre à ta question, le tableau est correctement géré et transmis vers COM si
    (1) le type de base est un Variant (impérativement un Variant) et
    (2) qu'il est multidimensionnel.
    Code WLangage : Sélectionner tout - Visualiser dans une fenêtre à part
    MontbRecherche est un tableau fixe de 0 par 3 Variant= [["city","=","Namur"]]

    Mais je ne crois pas que ton composant COM attende un tableau multidimensionnel...

    Il attend plutôt des tableaux unidimensionnels imbriqués.

    Cette imbrication de tableaux est autorisée en WLangage (grâce au type de base Variant), mais hélas l'imbrication n'est pas gérée par WinDev lors d'un passage de paramètres vers COM.

    Quant à ConstruitVariantAutomation(), on cherche l'homme qui a vu l'homme qui a vu l'homme... qui l'a fait fonctionner !

    Pour rester sur le WLangage et l'imbrication de tableaux unidimensionnels (sans idée d'un passage vers COM) ...
    La fonction TableauAjoute() réalise une concaténation.
    Donc ce qui suit ne fonctionne pas si tu veux imbriquer le tableau MaRecherche dans le tableau à 1 dimension montbRecherche:
    Code WLangage : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    MaRecherche est un tableau de 3 Chaîne = ["city","=","Namur"]
    montbRecherche est un tableau de Variant
    TableauAjoute(montbRecherche,MaRecherche)
    A la place, tu peux faire
    Code WLangage : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    MaRecherche est un tableau de 3 Chaîne = ["city","=","Namur"]
    montbRecherche est un tableau de Variant
    TableauAjoute(montbRecherche,Null)
    montbRecherche[montbRecherche..occurrence] = MaRecherche
    ou plus simplement
    Code WLangage : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    MaRecherche est  un tableau de 3 Chaîne = ["city","=","Namur"]
    montbRecherche est un tableau de Variant = [MaRecherche]


  12. #12
    Expert éminent
    Avatar de jurassic pork
    Homme Profil pro
    Bidouilleur
    Inscrit en
    Décembre 2008
    Messages
    3 949
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Bidouilleur
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2008
    Messages : 3 949
    Points : 9 277
    Points
    9 277
    Par défaut
    hello JBO,
    merci pour ta réponse. A tout hasard j'ai réessayé le passage de paramètres avec tes deux derniers codes mais j'obtiens toujours :
    Vous avez appelé la méthode Automation 'execute'.
    Le paramètre 6 n'est pas convertible en paramètre automation.
    ce qui confirme ce que tu dis :
    Cette imbrication de tableaux est autorisée en WLangage (grâce au type de base Variant), mais hélas l'imbrication n'est pas gérée par WinDev lors d'un passage de paramètres vers COM.
    Ami calmant, J.P
    Jurassic computer : Sinclair ZX81 - Zilog Z80A à 3,25 MHz - RAM 1 Ko - ROM 8 Ko

  13. #13
    Candidat au Club
    Homme Profil pro
    Développeur Web
    Inscrit en
    Novembre 2014
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : Conseil

    Informations forums :
    Inscription : Novembre 2014
    Messages : 3
    Points : 3
    Points
    3
    Par défaut
    Je rencontre le même problème pour communiquer depuis Windev avec Odoo au travers de erppeek et pocketXMLRPC.

    Avez-vous trouvé une autre solution entre temps ?

    Merci de vos conseils.
    Didier

Discussions similaires

  1. Réponses: 0
    Dernier message: 15/06/2010, 10h58
  2. passage tableau 2 dimensions à une fonction
    Par zentaf dans le forum C++
    Réponses: 4
    Dernier message: 11/01/2010, 01h36
  3. Réponses: 6
    Dernier message: 28/12/2009, 16h45
  4. Passage de tableau de structure à une fonction
    Par Kefass dans le forum Débuter
    Réponses: 2
    Dernier message: 18/08/2009, 19h07
  5. passage de tableau 2D a une fonction
    Par watashinoitadakimasu dans le forum C
    Réponses: 2
    Dernier message: 11/09/2003, 02h33

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo