Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

additionner les éléments d'un tuple

8 réponses
Avatar
guyguy
Bonjour
j'ai un probl=E8me avec mon programme
je cherche a additionner les valeur d'un champ qui est recup=E9rer sous
forme de liste de tuple partant de sa valeur initiale
Voici mon code


crt_obj =3D
self.pool.get('production.contrat').browse(cr,uid,vals['numcontrat'])
id_contrat =3D (str(crt_obj)[-2:-1])
coa =3D crt_obj.numcontrat
sit =3D crt_obj.situation
type_sous =3D crt_obj.type_souscri

cr.execute("SELECT tx_part FROM production_coassurance WHERE
numcontrat=3D%s AND situation=3D%s AND type_souscri=3D%s" ,[id_contrat, sit=
,
type_sous])

res =3D []
for val in cr.fetchall():
res.append(val)
if res:
tx_in =3D res[0][0] + val['tx_part']


NB: Chose =E9trange est que le premier enregistrement passe, mais ma
liste est vide et le second donne une erreur
TypeError: tx_in =3D res[0][0] + val['tx_part']
tuple indices must be integers


SVP si quelqu'un =E0 une id=E9e

8 réponses

Avatar
Alain BARTHE
guyguy a écrit :
Bonjour
j'ai un problème avec mon programme
je cherche a additionner les valeur d'un champ qui est recupérer sous
forme de liste de tuple partant de sa valeur initiale
Voici mon code


crt_obj > self.pool.get('production.contrat').browse(cr,uid,vals['numcontrat'])
id_contrat = (str(crt_obj)[-2:-1])
coa = crt_obj.numcontrat
sit = crt_obj.situation
type_sous = crt_obj.type_souscri

cr.execute("SELECT tx_part FROM production_coassurance WHERE
numcontrat=%s AND situation=%s AND type_souscri=%s" ,[id_contrat, sit,
type_sous])

res = []
for val in cr.fetchall():
res.append(val)
if res:
tx_in = res[0][0] + val['tx_part']


NB: Chose étrange est que le premier enregistrement passe, mais ma
liste est vide et le second donne une erreur
TypeError: tx_in = res[0][0] + val['tx_part']
tuple indices must be integers


SVP si quelqu'un à une idée



Je ne comprends pas ton algo, mais si val est un tuple, comme l'indique
le message, pour obtenir le premier element, tu dois utiliser val [0] et
non val ['tx_part']

Si tu veux la somme de res , utilise sum (res)
Avatar
guyguy
On 27 juin, 13:22, Alain BARTHE wrote:
guyguy a écrit :



> Bonjour
> j'ai un problème avec mon programme
> je cherche a additionner les valeur d'un champ qui est recupérer sous
> forme de liste de tuple  partant de sa valeur initiale
> Voici mon code

> crt_obj =
> self.pool.get('production.contrat').browse(cr,uid,vals['numcontrat'])
>         id_contrat = (str(crt_obj)[-2:-1])
>         coa = crt_obj.numcontrat
>         sit = crt_obj.situation
>         type_sous = crt_obj.type_souscri

>         cr.execute("SELECT tx_part FROM production_coassurance WHERE
> numcontrat=%s AND situation=%s AND type_souscri=%s" ,[id_contrat, sit,
> type_sous])

>         res = []
>         for val in cr.fetchall():
>             res.append(val)
>         if res:
>             tx_in = res[0][0] + val['tx_part']

> NB: Chose étrange est que le premier enregistrement passe, mais ma
> liste est vide et  le second donne une erreur
> TypeError:  tx_in = res[0][0] + val['tx_part']
> tuple indices must be integers

> SVP si quelqu'un à une idée

Je ne comprends pas ton algo, mais si val est un tuple, comme l'indique
le message, pour obtenir le premier element, tu dois utiliser val [0] et
non val ['tx_part']

Si tu veux la somme de res , utilise sum (res)



val n'est pas le tuple, val parcour la liste de tuple qui est renvoyer
par fetchall()
tx_part est champ de saisie
je saisie des valeurs une à une dans tx_part et avoir la somme de
toute ces valeurs ainsi que la valeure initial de tx_part
Avatar
Bruno Desthuilliers
guyguy a écrit :
Bonjour
j'ai un problème avec mon programme
je cherche a additionner les valeur d'un champ qui est recupérer sous
forme de liste de tuple partant de sa valeur initiale
Voici mon code


crt_obj > self.pool.get('production.contrat').browse(cr,uid,vals['numcontrat'])
id_contrat = (str(crt_obj)[-2:-1])
coa = crt_obj.numcontrat
sit = crt_obj.situation
type_sous = crt_obj.type_souscri

cr.execute("SELECT tx_part FROM production_coassurance WHERE
numcontrat=%s AND situation=%s AND type_souscri=%s" ,[id_contrat, sit,
type_sous])

res = []
for val in cr.fetchall():
res.append(val)



res = cr.fetchall()

if res:
tx_in = res[0][0] + val['tx_part']



ici (du moins avec ton algo), val est le dernier tuple de la liste
retournée par cr.fetchall().


NB: Chose étrange est que le premier enregistrement passe, mais ma
liste est vide et le second donne une erreur
TypeError: tx_in = res[0][0] + val['tx_part']
tuple indices must be integers



cqfd.
Avatar
Bruno Desthuilliers
guyguy a écrit :
On 27 juin, 13:22, Alain BARTHE wrote:
guyguy a écrit :



Bonjour
j'ai un problème avec mon programme
je cherche a additionner les valeur d'un champ qui est recupérer sous
forme de liste de tuple partant de sa valeur initiale
Voici mon code
crt_obj >>> self.pool.get('production.contrat').browse(cr,uid,vals['numcontrat'])
id_contrat = (str(crt_obj)[-2:-1])
coa = crt_obj.numcontrat
sit = crt_obj.situation
type_sous = crt_obj.type_souscri
cr.execute("SELECT tx_part FROM production_coassurance WHERE
numcontrat=%s AND situation=%s AND type_souscri=%s" ,[id_contrat, sit,
type_sous])
res = []
for val in cr.fetchall():
res.append(val)
if res:
tx_in = res[0][0] + val['tx_part']
NB: Chose étrange est que le premier enregistrement passe, mais ma
liste est vide et le second donne une erreur
TypeError: tx_in = res[0][0] + val['tx_part']
tuple indices must be integers
SVP si quelqu'un à une idée


Je ne comprends pas ton algo, mais si val est un tuple, comme l'indique
le message, pour obtenir le premier element, tu dois utiliser val [0] et
non val ['tx_part']

Si tu veux la somme de res , utilise sum (res)



val n'est pas le tuple,



Si.

val parcour la liste de tuple qui est renvoyer
par fetchall()



Non. val est le nom auxquels sont associés, successivement, les tuples
compris dans la liste retournée par fetchall(). Une fois sorti de la
boucle (par ailleur inutile), ce nom reste lié au dernier tuple de la
liste. IOW :

for val in cr.fetchall():
res.append(val)
assert val is res[-1]
Avatar
guyguy
On 27 juin, 15:06, Bruno Desthuilliers <bruno.
wrote:
guyguy a écrit :



> On 27 juin, 13:22, Alain BARTHE wrote:
>> guyguy a écrit :

>>> Bonjour
>>> j'ai un problème avec mon programme
>>> je cherche a additionner les valeur d'un champ qui est recupérer so us
>>> forme de liste de tuple  partant de sa valeur initiale
>>> Voici mon code
>>> crt_obj =
>>> self.pool.get('production.contrat').browse(cr,uid,vals['numcontrat'])
>>>         id_contrat = (str(crt_obj)[-2:-1])
>>>         coa = crt_obj.numcontrat
>>>         sit = crt_obj.situation
>>>         type_sous = crt_obj.type_souscri
>>>         cr.execute("SELECT tx_part FROM production_coassuranc e WHERE
>>> numcontrat=%s AND situation=%s AND type_souscri=%s" ,[id_contra t, sit,
>>> type_sous])
>>>         res = []
>>>         for val in cr.fetchall():
>>>             res.append(val)
>>>         if res:
>>>             tx_in = res[0][0] + val['tx_part']
>>> NB: Chose étrange est que le premier enregistrement passe, mais ma
>>> liste est vide et  le second donne une erreur
>>> TypeError:  tx_in = res[0][0] + val['tx_part']
>>> tuple indices must be integers
>>> SVP si quelqu'un à une idée
>> Je ne comprends pas ton algo, mais si val est un tuple, comme l'indiqu e
>> le message, pour obtenir le premier element, tu dois utiliser val [0] et
>> non val ['tx_part']

>> Si tu veux la somme de res , utilise sum (res)

> val n'est pas le tuple,

Si.

> val parcour la liste de tuple qui est renvoyer
> par fetchall()

Non. val est le nom auxquels sont associés, successivement, les tuples
compris dans la liste retournée par fetchall(). Une fois sorti de la
boucle (par ailleur inutile), ce nom reste lié au dernier tuple de la
liste. IOW :

for val in cr.fetchall():
     res.append(val)
assert val is res[-1]



Merci pour le bout de code elle marche et il me donne cette reponse
[(1,), (1,)]
mais je veux la valeur de ce resultat dans une variable pour me permet
de faire une comparaison de valeur
merci pour ce bout de code
Avatar
Alain BARTHE
Bruno Desthuilliers a écrit :
guyguy a écrit :
Bonjour
j'ai un problème avec mon programme
je cherche a additionner les valeur d'un champ qui est recupérer sous
forme de liste de tuple partant de sa valeur initiale
Voici mon code


crt_obj >> self.pool.get('production.contrat').browse(cr,uid,vals['numcontrat'])
id_contrat = (str(crt_obj)[-2:-1])
coa = crt_obj.numcontrat
sit = crt_obj.situation
type_sous = crt_obj.type_souscri

cr.execute("SELECT tx_part FROM production_coassurance WHERE
numcontrat=%s AND situation=%s AND type_souscri=%s" ,[id_contrat, sit,
type_sous])

res = []
for val in cr.fetchall():
res.append(val)



res = cr.fetchall()

if res:
tx_in = res[0][0] + val['tx_part']



ici (du moins avec ton algo), val est le dernier tuple de la liste
retournée par cr.fetchall().


NB: Chose étrange est que le premier enregistrement passe, mais ma
liste est vide et le second donne une erreur
TypeError: tx_in = res[0][0] + val['tx_part']
tuple indices must be integers



cqfd.



C'est pas clair cette histoire...
Avatar
guyguy
On 27 juin, 21:09, Alain BARTHE wrote:
Bruno Desthuilliers a écrit :

> guyguy a écrit :
>> Bonjour
>> j'ai un problème avec mon programme
>> je cherche a additionner les valeur d'un champ qui est recupérer sous
>> forme de liste de tuple  partant de sa valeur initiale
>> Voici mon code

>> crt_obj =
>> self.pool.get('production.contrat').browse(cr,uid,vals['numcontrat'])
>>         id_contrat = (str(crt_obj)[-2:-1])
>>         coa = crt_obj.numcontrat
>>         sit = crt_obj.situation
>>         type_sous = crt_obj.type_souscri

>>         cr.execute("SELECT tx_part FROM production_coassurance WHERE
>> numcontrat=%s AND situation=%s AND type_souscri=%s" ,[id_contrat, sit,
>> type_sous])

>>         res = []
>>         for val in cr.fetchall():
>>             res.append(val)

>           res = cr.fetchall()

>>         if res:
>>             tx_in = res[0][0] + val['tx_part']

> ici (du moins avec ton algo), val est le dernier tuple de la liste
> retournée par cr.fetchall().

>> NB: Chose étrange est que le premier enregistrement passe, mais ma
>> liste est vide et  le second donne une erreur
>> TypeError:  tx_in = res[0][0] + val['tx_part']
>> tuple indices must be integers

> cqfd.

C'est pas clair cette histoire...



Bruno voici l'ensemble du code

crt_obj =
self.pool.get('production.contrat').browse(cr,uid,vals['numcontrat'])
id_contrat = (str(crt_obj)[-2:-1])
coa = crt_obj.numcontrat
sit = crt_obj.situation
type_sous = crt_obj.type_souscri

cr.execute("SELECT txtp FROM production_coassurance WHERE
numcontrat=%s AND situation=%s AND type_souscri=%s" ,[id_contrat, sit,
type_sous])
res = []
for val in cr.fetchall():
res.append(val)
vals['txtp'] = res[0][0] + vals['txtp']

et sa me donne le resultat voulu(c'est à dire après chaque
enregistrement il me donne la somme de ('txtp')
Avatar
Bruno Desthuilliers
guyguy a écrit :
(snip)
Bruno voici l'ensemble du code

crt_obj > self.pool.get('production.contrat').browse(cr,uid,vals['numcontrat'])
id_contrat = (str(crt_obj)[-2:-1])
coa = crt_obj.numcontrat
sit = crt_obj.situation
type_sous = crt_obj.type_souscri

cr.execute("SELECT txtp FROM production_coassurance WHERE
numcontrat=%s AND situation=%s AND type_souscri=%s" ,[id_contrat, sit,
type_sous])
res = []
for val in cr.fetchall():
res.append(val)
vals['txtp'] = res[0][0] + vals['txtp']




et sa me donne le resultat voulu(c'est à dire après chaque
enregistrement il me donne la somme de ('txtp')



Pas exactement, non. Tu ajoutes la valeur du champ txtp *du premier
enregistrement* à chaque itération. je doute très honnêtement que ce
soit ce que tu veux.

Si tu a l'usage de res ailleurs dans ton code (et en partant du principe
que txtp est un numérique, of course...):

cr.execute("""
SELECT txtp FROM production_coassurance
WHERE numcontrat=%s
AND situation=%s
AND type_souscri=%s
""",
(id_contrat, sit, type_sous)
)

res = cr.fetchall()
vals['txtp'] += sum(rec[0] for rec in res)


Sinon (ie: tu n'utilises pas le contenu de res ailleurs), utiliser les
fonctions d'agrégation de ta base serait certainement plus payant:

cr.execute("""
SELECT sum(txtp) FROM production_coassurance
WHERE numcontrat=%s
AND situation=%s
AND type_souscri=%s
""",
(id_contrat, sit, type_sous)
)

vals['txtp'] += cr.fetchone()[0]