Utilisation de scriptforge

Bonjour,
J’ ai réécrit un programme python en vu de l’ adapter au module scriptforge.
Ce script se lance depuis un bouton d’ un formulaire mais pour l’ instant, rien ne se passe. Je pense que c’ est la fonction appelée qui est mal construite mais je n’ arrive pas à la modifier correctement.
Après le lancement du script, rien ne se passe. J’ ai le message d’ erreur en retour.

com.sun.star.container.NoSuchElementException:at/home/buildslave/
source/libo-core/forms/source/misc/InterfaceContainer.cxx697 (Error
during invoking function ordrebourse in module file:///home/
elfouster/.config/libreoffice/4/user/Scripts/python/ob_test.py ("<class
'uno.com.sun.star.container.NoSuchElementException'>: at /home/
buildslave/source/libo-core/forms/source/misc/InterfaceContainer.cxx697
File "/opt/libreoffice7.6/program/pythonscript.py", line916 in invoke
ret = self.func(*args)
File "/home/elfouster/.config/libreoffice/4/user/Scripts/python/
ob_test.py ", line 43 in ordrebourse
	subform = frm.getByName("Mn_Gn")
))

Dans Apso, en cliquant sur le bouton Executer, rien ne se passe mais j’ ai le message suivant:

Error during invoking function ordrebourse in module file:///home/elfouster/.config/libreoffice/4/user/Scripts/python/ob_test.py (<class 'TypeError'>: ordrebourse() missing 1 required positional argument: 'event'
  File "/opt/libreoffice7.6/program/pythonscript.py", line 916, in invoke
    ret = self.func( *args )
)

Lorsque je cherche à ouvrir le débogueur Apso, en retour, je reçoit le message d’ erreur suivant:

Traceback (most recent call last):
  File "/home/elfouster/.config/libreoffice/4/user/uno_packages/cache/uno_packages/lu1715eyc.tmp_/apso.oxt/python/pythonpath/apso_debug.py", line 832, in debug
    inspect.getcallargs(script.func)

Ci-dessous, voici le texte du script:
Base_Test.odb (12,2 Ko)
Par avance, merci de vos conseils
Cordialement

Le fichier joint ne comprend pas de répertoire Scripts/python.
D’autre part la question “Autoriser les macros/Refuser les macros” est posée à l’ouverture du formulaire, pas à l’ouverture du fichier Base.

Le fichier semble donc mal construit …?

Merci de vérifier.

Bonjour,
Voici le script manquant.

#!/usr/bin/env python3

from scriptforge import CreateScriptService
 
doc = CreateScriptService("Base")
 
def achat():
    investissement = input("Combien voulez-vous investir ? ")
    inv = int(investissement)
    vlractions = input("Cote d' une action ?                      ")
    valeur = float(vlractions)
    xactions = int(inv / valeur)
    print ("Vous pouvez acheter un maximum de ", xactions, "actions")
    nbractions = input("Combien voulez-vous acheter de titres ? ")
    xachat = int(nbractions)
    frais = input("Montant des frais ?                               ")
    fraisordre = float(frais)
    montantachat = (xachat * valeur) + fraisordre
    achattitres = float(montantachat)
    prixrevient = achattitres / xactions
    valeurtitre = float(prixrevient)
    cotemini = valeurtitre * 1.05
    print ("Cout de l' opération  : " , montant , " €")
    print ("Prix de revient unitaire :", "{0:3f}".format(round(prixrevient, 3), " €"))
    print ("prix de vente minimum : ", round(ventemini, 3), " €")

def vente(): 
    nombreactions = input("Combien d' actions voulez-vous vendre ? ")
    xactions = int(nombreactions)
    vlractions = input("Cote d' une action ?                      ")
    valeur = float(vlractions)
    frais = input("Montant des frais ?                               ")
    fraisordre = float(frais)
    vente = (xactions * valeur) - fraisordre
    recette = float(vente)
    prixrevient = recette / xactions
    valeurtitre = float(prixrevient)
    print ("Bilan de l' opération : ", round(vente, 2), ' €')

def ordrebourse():
#    ctrl = event.Source
#    frm = event.Source.Model.Parent
#    subform = frm.getByName("Mn_Gn")
    try: 
        ordre = input("Voulez-vous acheter ou vendre des actions ?")
        if ordre == 'v' or ordre == 'V':
            vente()
        else :
            achat()
    except EOFError as e:
        print (e)

Cordialement

Rien dans ce script n’est lié à LibreOffice Base ni à ScriptForge ?? Il sembre avoir été copié/collé d’un tout autre contexte.

Que voulez-vous faire exactement ?

Bonsoir,
Vous avez raison en disant qu’ il provient d’ un autre script qui fonctionnait depuis libreoffice base. Toutefois, au fil des mises à jour, je n’ ai plus aucun script qui fonctionne. Je peux toujours les utiliser avec l’ IDE Thonny que j’ utilise régulièrement mais plus depuis mon application base. C’ est gênant.
Le but de ce script test, c’ est de le rendre opérationnel depuis LO puis de modifier les autres en conséquence.
Cordialement

Malheureusement vous ne m’aidez pas à vous aider.
Le script fourni n’a rien à voir avec LO Base.
Je ne sais donc pas ce que vous voulez faire.
Si vous ne me le dites pas, je ne vais pas tâtonner pour le deviner.
Merci d’avance de bien vouloir préciser tout cela.

Bonjour,
Je ne vois pas ce que je peux vous dire de plus. Pour être plus précis:
Le script se lance depuis un bouton du formulaire.
Le calcul s’ effectue, suivant les données transmises par les inputs.
Il affiche le résultat.
Il s ’ effectue indépendamment de LO et je ne lui demande pas d’ enregistrer quoique se soit.
La problématique est que je ne peux pas le lancer depuis LO. Je ,suis obligé de passer par l’ EDI pour effectuer le calcul.
En espérant avoir été plus précis.
Cordialement

Les instructions print() et input() ne fonctionnent que dans une console. Donc j’ai “pondu” le code suivant:

A essayer parce que non testé … !

#!/usr/bin/env python3

from scriptforge import CreateScriptService
 
basic = CreateScriptService("Basic")
 
def achat():
    investissement = basic.InputBox("Combien voulez-vous investir ? ")
    inv = int(investissement)
    vlractions = basic.InputBox("Cote d' une action ?                      ")
    valeur = float(vlractions)
    xactions = int(inv / valeur)
    basic.MsgBox ("Vous pouvez acheter un maximum de " = str(xactions) + "actions")
    nbractions = basic.InputBox("Combien voulez-vous acheter de titres ? ")
    xachat = int(nbractions)
    frais = basic.InputBox("Montant des frais ?                               ")
    fraisordre = float(frais)
    montantachat = (xachat * valeur) + fraisordre
    achattitres = float(montantachat)
    prixrevient = achattitres / xactions
    valeurtitre = float(prixrevient)
    cotemini = valeurtitre * 1.05
    basic.MsgBox ("Cout de l' opération  : "  + str( montant) + " €")
    basic.MsgBox ("Prix de revient unitaire :" + "{0:3f}".format(round(prixrevient, 3) + " €"))
    basic.MsgBox ("prix de vente minimum : " + str( round(ventemini, 3)) + " €")

def vente(): 
    nombreactions = basic.InputBox("Combien d' actions voulez-vous vendre ? ")
    xactions = int(nombreactions)
    vlractions = basic.InputBox("Cote d' une action ?                      ")
    valeur = float(vlractions)
    frais = basic.InputBox("Montant des frais ?                               ")
    fraisordre = float(frais)
    vente = (xactions * valeur) - fraisordre
    recette = float(vente)
    prixrevient = recette / xactions
    valeurtitre = float(prixrevient)
    basic.MsgBox ("Bilan de l' opération : " + str(round(vente, 2)) + ' €')

def ordrebourse():
#    ctrl = event.Source
#    frm = event.Source.Model.Parent
#    subform = frm.getByName("Mn_Gn")
    try: 
        ordre = basic.InputBox("Voulez-vous acheter ou vendre des actions ?")
        if ordre == 'v' or ordre == 'V':
            vente()
        else :
            achat()
    except EOFError as e:
        basic.MsgBox (repr(e))

I could cry when I see this amateurish code from self-proclaimed star developers!

basic.MsgBox ( f"Bilan de l' opération : {vente:.2f} €" )

I presume you are ready to cite your sources ???
Oh, btw, we are always willing to welcome contributors … :smiley:

Bonsoir,
Je vous remercie du temps que vous avez bien voulu passé sur mon projet. Depuis
apso, j’ arrive à lancer le script. Il reste deux, trois petits bugs que je pense pouvoir résoudre. Il faut que je me penche également sur la méthode de lancement du script depuis libreoffice.
Une fois ces problèmes réglés, je ne manquerais pas de communiquer le résultat final.
D’ autre part je suis navré de la réaction peut constructive de karolus. Comme vous le dites si bien, pourquoi ne pas apporter son aide puisqu’ il semble une lumière en Python.
Bien cordialement

Bonsoir,
Comme promis, je vous communique mes dernières élucubrations. Ce script est fonctionnel mais largement améliorable. Pour bien faire, au lieu d’ avoir une succession de InputBox, il faut que je passe par une boite de dialogue qui me permettra de regrouper les questions.
Dans la fonction achat(), il faut supprimer les deux dernières MsgBox pour regrouper les informations dans la première. Pour l’ instant, je bute sur le saut de ligne Chr(13). Le script m’ envoie bouler avec le message:
Chr(13) n’ est pas défini!!.
Code basic permettant de lancer le script Python:

Sub LancerScriptInvestissement()

	Dim script as String, session as Object
	
	GlobalScope.BasicLibraries.LoadLibrary("ScriptForge") 	
	script = "investissement.py$ordrebourse"
	session = CreateScriptService("Session")
	session.ExecutePythonScript(session.SCRIPTISPERSONAL, script)
	
End Sub

et la dernière version du script Python:

#!/usr/bin/env python3

from scriptforge import CreateScriptService
 
bas = CreateScriptService("Basic")
 
def achat():
    investissement = bas.InputBox("Combien voulez-vous investir ? ", "MONTANT DE L' INVESTISSEMENT")
    inv = int(investissement)
    x = bas.InputBox("Cote d' une action ?", "VALEUR DU TITRE")
    valeur = float(x.replace(',', '.'))
    xactions = int(inv / valeur)
    bas.MsgBox ("Vous pouvez acheter un maximum de " + str(xactions) + " actions", "NOMBRE DE TITRES ACHETABLES")
    nbractions = bas.InputBox("Combien voulez-vous acheter de titres ? ","QUANTITE DE TITRES")
    xachat = int(nbractions)
    frais = bas.InputBox("Montant des frais ?","FRAIS D'UN ORDRE")
    fraisordre = float(frais.replace('.', '.'))
    montantachat = (xachat * valeur) + fraisordre
    prixrevient = montantachat / xactions
    cotemini = prixrevient * 1.05
    bas.MsgBox ("Cout de l' opération  : "  + str(round(montantachat, 3)) + " €" )
    bas.MsgBox ("Prix de revient unitaire : " + str(round(prixrevient, 3)) + " €")
    bas.MsgBox ("prix de vente minimum : " + str(round(cotemini, 3)) + " €")

def vente(): 
    nombreactions = bas.InputBox("Combien d' actions voulez-vous vendre ? ","NOMBRE DE TITRES À VENDRE")
    xactions = int(nombreactions)
    vlractions = bas.InputBox("Cote d' une action ?", "VALEUR DU TITRE")
    valeur = float(vlractions.replace(',', '.'))
    frais = bas.InputBox("Montant des frais ? ","MONTANT DES FRAIS")
    fraisordre = float(frais)		
    vente = (xactions * valeur) - fraisordre
    bas.MsgBox ( f"Bilan de l' opération : {vente:.2f} €" )

def ordrebourse():
    try: 
        ordre = bas.InputBox("Voulez-vous acheter(a/A) ou vendre(v/V) des actions ?", "PASSER UN ORDRE")
        if ordre == 'v' or ordre == 'V':
            vente()
        else :
            achat()
    except EOFError as e:
        bas.MsgBox (repr(e))

Cordialement

J’ai l’impression que tu devrais d’abord apprendre les bases de python.

(Le tutoriel Python — Documentation Python 3.12.1)

Pourquoi python ? Avec une boîte de dialogue et un script Basic, ça se fait en 10 minutes.
Bonne soirée

mais curieusement, @ElCatala demande python

…et oui en 10 minutes j’écris pour cela un “cli” qui se passe complètement d’installation de Libreoffice.

Bonjour à tous,
Je vais tenter de vous expliquer ma position, en espérant ne froisser personne. Tout d’ abord, il faut savoir que je suis un vieux monsieur qui fait de la programmation en dilettante. D’ autre part, quand je peux me simplifier la vie, je n’ hésite pas une seconde.
Pour le langage, le Basic est sûrement très bien mais extrêmement rébarbatif, surtout si l’ on tente de décrypter l’ outil Xray.
Python me parait plus intuitif même s’ il ne pardonne rien. Voir le script avec Chr et chr.
Scriptforge est vraiment particulier puisque il lie Python et Basic. Il permet par exemple de lancer un script Python en 3 lignes de commandes au lieu d’ une dizaine en Basic.
D’ autre part, sachez vous montrer un peu indulgent messieurs les programmeur, ce forum est sympa. Il serait dommage de le pourrir comme certains autres forums, ou une virgule de travers entraîne deux pages de polémiques( raison pour laquelle je l’ ai quitté à ma grande satisfaction).
Je sais très bien que votre temps est précieux, aussi, ne perdait pas le votre si vous juger ne pas avoir à répondre ou que mon programme est trop nul pour tenter de l’ améliorer.
Merci de vos remarques. Sachez que je les accepte avec modestie et que je conçois ne pas savoir grand chose en programmation.
Ceci dit, voici l’ amélioration des trois dernières lignes de la fonction achat():

bas.MsgBox ("Cout de l' opération  : "  + str(round(montantachat, 3)) + " €" + chr(10) +\
    "Prix de revient unitaire : " + str(round(prixrevient, 3)) + " €" + chr(10) +\
    "Prix de vente minimum : " + str(round(cotemini, 3)) + " €")

Je publie ceci uniquement pour servir à d’ autre intervenants s’ ils estiment pouvoir en faire quelque chose.
Cordialement

bas.MsgBox (f"Cout de l' opération  : {montantachat:.3f} €\n"
            f"Prix de revient unitaire : {prixrevient:.3f} €\n"
            f"Prix de vente minimum : {cotemini:.3f} €")

Bonjour,
Sans polémique aucune, je trouve qu’il y a un biais avec de la confusion sur les outils de programmation.
Programmer en Python et utiliser les Entrées/Sorties Basic (InputBox et MsgBox) relève de la voltige !
D’autant plus que le programme en question n’utilise rien d’un document LibreOffice, si ce n’est les interpréteurs Python et Basic.
Un script AutoIt dans une Boîte MsDos suffirait (comme le “cli” de karolus)

Xray n’a rien à voir avec Basic, même s’il est écrit dans ce langage. La structure des objets LibreOffice décrite par Xray est la même pour tous les langages (Basic, Python, Java). Je pense que la lecture attentive du document qui le contient donne suffisamment d’explications sur le sujet.
Pour être constructif, si cela t’intéresse je te fais un document avec le bout de script qui va bien, la boîte de dialogue, et les explications sur la manière de construire et relier tout ça.
Pas pour convaincre, mais pour montrer que c’est simple. Mon côté prof, probablement…
A plus

Bonsoir ou Bonjour,
Je suis un peu d’accord avec @jeanmi2403 !

Je suis également un vieux monsieur.
et pour ma retraite je me suis dit … et si j’apprenais Python !
Et bien c’est fait, mais je ne suis pas une star et le langage objet et un peu abstrait pour moi mais je m’y suis accroché et j’ai pondu quelques trucs sympa.
Pour ton programme de calcul si tu n’as pas besoin d’attaquer une base de données tu peux faire ça “en un clic” direct avec l’interpréteur python3. Personnellement j’utilise pyQt5 qui te permet de faire de jolies windows et d’attaquer des bases de données puissantes comme mySQL et autres si affinité :smile:
Mais je trouve que c’est plus long à programmer, mais plus souple que LO.
Je trouve vraiment que tu te compliques la vie. A moins que se soit pour le fun alors là … :wink: rien à dire.
J’ai essayé un peu Scriptforge, je trouve ça d’une lourdeur effroyable !
Pour mes bases de données j’utilise LO et Firebird avec Basic c’est beaucoup moins verbeux que python mais un peu moins souple et ouvert.
Tu devrais sauter sur la proposition de @jeanmi2403
Bon courage.