Synchronisation pour chaque et save()

Bonjour

Dans la table j’ai l’enregistrement contient designation et imputation
dans cette méthode je ne sais pas récupérer l’imputation de la désignation

C_COLLECTION($DesigUniq)
C_OBJET($es)
C_ENTIER LONG($item)
C_TEXTE($Enregt)
$es:=ds.COMPTA.all()
$DesigUniq:=$es.distinct("designation")
Pour chaque ($Selection;$DesigUniq)
	$Entity:=ds.TempPrint.new()
	$Entity.designation:=$Selection
	$Entity.imputation:="TEST"        //Comment trouver l'imputation de la designation
	$Status:=$Entity.save()
	Si ($Status.success)
		  //MESSAGE("Enregistrement "+Chaîne($Entity.nomDesignation)+" est crée dans table 'DESIGNATION' ")
		$item:=$item+1
	Fin de si 
Fin de chaque 

Merci De vos pistes

Ce n’est pas parce que tu as une designation que chaque enregistrement possède la même paire designation et imputation…

Donc, je ne vois pas de solution simple.

Tu peux essayer d’en récupérer une, mais sera-t-elle (la) bonne ?

Bonjour Manuel

pour les désignations identiques j’ai une imputation unique

dans un enregistrement dans la table COMPTA j’ai une designation, une imputation une date un montant

mon but de récupérer pour chaque designation distincte l’imputation puis faire la somme des montant mois par mois

j’espère être clair

Tu pourrais faire cela :

$Entity.imputation:=$es.query(“designation =:1”;$Selection).first().imputation

Mais, j’ai peur qu’en travaillant ainsi par petit bout, tu perdes la coherence de ton but et que du coup le chemin soit inutilement tortueux…

Merci Manuel

avec ta ligne de code j’obtiens ce que je veux pour l’instant :smiley:

mais j’en suis long de la transformation de ma méthode pour calculer et éditer un compte d’exploitation

J’ai conscience que je travaille par petit bout, j’espère y arriver même si le chemin est tortueux

Bon WE à toi

Très cordialement

Attention avec la ligne suivante et surtout avec .first()
$Entity.imputation:=$es.query(“designation =:1”;$Selection).first().imputat<code 4D>

</code 4D>ion

Il faut être sur de trouver quelque chose, sinon erreur.

j’ai pris le parti de décomposer la chose et de tester que $es.query (xxx) ne retourne pas un NULL. Ensuite j’applique le reste.

Patrick

Patrick tu as raison, mais dans ce cas précis, on est sûr d’avoir un résultat car on extrait une info d’un enregistrement qui existe puisqu’on l’a utilisé juste avant (avec le distinct), mais c’est pour cela que j’indiquais ma réticence à faire les choses de cette façon…

Je pense qu’une approche globale du problème serait plus pertinente dans ce cas.

Bojour Manuel
Bonjour Patrick

Je veux bien faire une approche globale mais comment convertir cette méthode pour éditer un compte d’expoitation qui date de 15 ans

maintenant je butte sur la ligne en bleue

CHERCHER([COMPTA];[COMPTA]dateAchat>=vDeb;*)
CHERCHER([COMPTA]; & ;[COMPTA]dateAchat<=vFin)
 
VALEURS DISTINCTES([COMPTA]moisAchat;TabMois)
TRIER TABLEAU(TabMois;>)  //  ne plus y toucher jusqu'à la fin de la proc
TRIER([COMPTA];[COMPTA]designation;>)
Tant que (Non(Fin de sélection([COMPTA])))
	CHERCHER([TempPrint];[TempPrint]designation=[COMPTA]designation)
	Si (Enregistrements trouvés([TempPrint])=0)
		Si ([COMPTA]designation#"")
			CRÉER ENREGISTREMENT([TempPrint])
			[TempPrint]designation:=[COMPTA]designation
			[TempPrint]imputation:=[COMPTA]imputation
			STOCKER ENREGISTREMENT([TempPrint])
		Fin de si 
	Fin de si 
	$lig:=Chercher dans tableau(TabMois;[COMPTA]moisAchat)
	Si ($lig=-1)
		ALERTE("Le mois recherché est "+Chaîne([COMPTA]moisAchat))
	Fin de si 
	Si ($lig>0)
	      Champ(14;$lig+3)->:=Champ(14;$lig+3)->+[COMPTA]credit-[COMPTA]debit // champ $lig+3 de la table 14
	Sinon 
		TRACE
		  //  il y a une erreur interne dans 4d…ou bien on a plus de 20 référents distincts
	Fin de si 
	STOCKER ENREGISTREMENT([TempPrint])
	LIBÉRER ENREGISTREMENT([TempPrint])
	LIBÉRER ENREGISTREMENT([COMPTA])
	ENREGISTREMENT SUIVANT([COMPTA])
Fin tant que 
  //--------------------------------------------------------Calcul du Total par Ligne
TOUT SÉLECTIONNER([TempPrint])
Tant que (Non(Fin de sélection([TempPrint])))
	[TempPrint]total:=0
	Boucle ($i;1;Taille tableau(TabMois))
		[TempPrint]total:=[TempPrint]total+Champ(14;$i+3)->
	Fin de boucle 
	STOCKER ENREGISTREMENT([TempPrint])
	LIBÉRER ENREGISTREMENT([TempPrint])
	ENREGISTREMENT SUIVANT([TempPrint])
Fin tant que 
  //--------------------------------------------------------Calcul du Total Général
TOUT SÉLECTIONNER([TempPrint])
Boucle ($i;1;Taille tableau(TabMois))
	$p:=Pointeur vers("vt"+Chaîne($i))
	$p->:=Somme(Champ(14;3+$i)->)
Fin de boucle 
  //--------------------------------------------------------Mise en Place des Libéllés des Colonnes
TOUT SÉLECTIONNER([TempPrint])
TRIER([TempPrint];[TempPrint]imputation;>)
CUMULER SUR([TempPrint]Tps1;[TempPrint]Tps2;[TempPrint]Tps3;[TempPrint]Tps4;[TempPrint]Tps5;[TempPrint]Tps6;[TempPrint]Tps7;[TempPrint]Tps8;[TempPrint]Tps9;[TempPrint]Tps10;[TempPrint]Tps11;[TempPrint]Tps12;[TempPrint]total;[TempPrint]budget)
NIVEAUX DE RUPTURES(1)
Boucle ($i;1;Taille tableau(TabMois))
	$p1:=Pointeur vers("LibRef"+Chaîne($i))
	Au cas ou 
		: (TabMois{$i}=1)
			$p1->:="Janvier"
		: (TabMois{$i}=2)
			$p1->:="Février"
		: (TabMois{$i}=3)
			$p1->:="Mars"
		: (TabMois{$i}=4)
			$p1->:="Avril"
		: (TabMois{$i}=5)
			$p1->:="Mai"
		: (TabMois{$i}=6)
			$p1->:="Juin"
		: (TabMois{$i}=7)
			$p1->:="Juillet"
		: (TabMois{$i}=8)
			$p1->:="Août"
		: (TabMois{$i}=9)
			$p1->:="Septembre"
		: (TabMois{$i}=10)
			$p1->:="Octobre"
		: (TabMois{$i}=11)
			$p1->:="Novembre"
		: (TabMois{$i}=12)
			$p1->:="Décembre"
	Fin de cas 
Fin de boucle 
LibEntete:="Compte d'Exploitation du  "+Chaîne(vDeb;Interne date long)+"  au  "+Chaîne(vFin;Interne date long)
vAn:=Année de(vDeb)  //Date du budget
CHERCHER([BUDGET];[BUDGET]imputBudget="Revenus";*)
CHERCHER([BUDGET]; & ;[BUDGET]anBudget=vAn)  //On Recherche les Revenus de l'année
vRevenu:=Somme([BUDGET]creditBudget)
FIXER OPTION IMPRESSION(2;2;73)
FORM FIXER SORTIE([TempPrint];"Etat_Sortie")
FIXER OPTION IMPRESSION(Option échelle;77)  // 77%
FIXER OPTION IMPRESSION(Option orientation;2)  // Paysage
IMPRIMER SÉLECTION([TempPrint])

Bonjour Bernard,
le code ci-dessous est écrit à la volée et non testé, mais cela devrait te donner des pistes. N’hésites pas à regarder la doc, elle donne beaucoup d’informations :wink:

<code 4D>
//CHERCHER([COMPTA];[COMPTA]dateAchat>=vDeb;)
//CHERCHER([COMPTA]; & ;[COMPTA]dateAchat<=vFin)
//VALEURS DISTINCTES([COMPTA]moisAchat;TabulationMois)
//TRIER TABLEAU(TabulationMois;>) // ne plus y toucher jusqu’à la fin de la proc
C_COLLECTION($tabMois)
$tabMois:=ds.COMPTA.query(“dateAchat >=:1 and dateAchat<=:2”;vDeb;vFin).distinct(“moisAchat”).orderBy(ck ascending)
//TRIER([COMPTA];[COMPTA]designation;>)
//Tant que (Non(Fin de sélection([COMPTA])))
//CHERCHER([TempPrint];[TempPrint]designation=[COMPTA]designation)
//Si (Enregistrements trouvés([TempPrint])=0)
//Si ([COMPTA]designation#"")
//CRÉER ENREGISTREMENT([TempPrint])
//[TempPrint]designation:=[COMPTA]designation
//[TempPrint]imputation:=[COMPTA]imputation
//STOCKER ENREGISTREMENT([TempPrint])
//Fin de si
//Fin de si
//$lig:=Chercher dans tableau(TabulationMois;[COMPTA]moisAchat)
//Si ($lig=-1)
//ALERTE(“Le mois recherché est “+Chaîne([COMPTA]moisAchat))
//Fin de si
//Si ($lig>0)
//Champ(14;$lig+3)->:=Champ(14;$lig+3)->+[COMPTA]credit-[COMPTA]debit // champ $lig+3 de la table 14
//Sinon
//TRACE
// // il y a une erreur interne dans 4d…ou bien on a plus de 20 référents distincts
//Fin de si
//STOCKER ENREGISTREMENT([TempPrint])
//LIBÉRER ENREGISTREMENT([TempPrint])
//LIBÉRER ENREGISTREMENT([COMPTA])
//ENREGISTREMENT SUIVANT([COMPTA])
//Fin tant que
$designationS:=ds.COMPTA.all().disctint().orderBy(ck ascending)
Pour chaque ($compta;$designationS)
Si ($compta.designation#””)
$trouve:=ds.TempPrint.query(“designation =:1”;$compta.designation)
Si ($trouve#Est un null)
$es:=:=ds.TempPrint.new()
$es.designation:=$compta.designation
$es.imputation:=$compta.imputation
$es.total:=0
$status:=$es.save()
Fin de si
Fin de si
Fin de chaque
//--------------------------------------------------------Calcul du Total par Ligne
//TOUT SÉLECTIONNER([TempPrint])
//Tant que (Non(Fin de sélection([TempPrint])))
//[TempPrint]total:=0
//Boucle ($i;1;Taille tableau(TabulationMois))
//[TempPrint]total:=[TempPrint]total+Champ(14;$i+3)->
//Fin de boucle
//STOCKER ENREGISTREMENT([TempPrint])
//LIBÉRER ENREGISTREMENT([TempPrint])
//ENREGISTREMENT SUIVANT([TempPrint])
//Fin tant que
$tempPrints:=ds.TempPrint.all()
Pour chaque ($TempPrint;$tempPrintS)
Pour chaque ($mois;$tabMois)
$TempPrint.total:=$TempPrint.total+Champ(14;Num($mois)+3)->
$status:=$TempPrint.save(dk auto merge)
Au cas ou
: ($status.success)
// ALERTE(“mis(e) à jour: OK”)
: ($status.status=dk status automerge failed)
ALERTE($status.statusText)
Fin de cas
$p:=Pointeur vers(“vt”+Chaîne(Num($mois)))
$p->:=Somme(Champ(14;3+$Num($mois)i)->)
Fin de chaque
Fin de chaque
//--------------------------------------------------------Calcul du Total Général
//TOUT SÉLECTIONNER([TempPrint])
//Boucle ($i;1;Taille tableau(TabulationMois))
//$p:=Pointeur vers(“vt”+Chaîne($i))
//$p->:=Somme(Champ(14;3+$i)->)
//Fin de boucle
//--------------------------------------------------------Mise en Place des Libéllés des Colonnes
TOUT SÉLECTIONNER([TempPrint])
TRIER([TempPrint];[TempPrint]imputation;>)
CUMULER SUR([TempPrint]Tps1;[TempPrint]Tps2;[TempPrint]Tps3;[TempPrint]Tps4;[TempPrint]Tps5;[TempPrint]Tps6;[TempPrint]Tps7;[TempPrint]Tps8;[TempPrint]Tps9;[TempPrint]Tps10;[TempPrint]Tps11;[TempPrint]Tps12;[TempPrint]total;[TempPrint]budget)
NIVEAUX DE RUPTURES(1)
Boucle ($i;1;Taille tableau(TabulationMois))
$p1:=Pointeur vers(“LibRef”+Chaîne($i))
$p1->:=Choisir(TabulationMois{$i};“Janvier”;“Février”;“Mars”;“Avril”;“Mai”;“Juin”;“Juillet”;“Août”;“Septembre”;“Octobre”;“Novembre”;“Décembre”)
Fin de boucle
LibEntete:="Compte d’Exploitation du “+Chaîne(vDeb;Entréenal date long)+” au "+Chaîne(vFin;Entréenal date long)
vAn:=Année de(vDeb) //Date du budget
//CHERCHER([BUDGET];[BUDGET]imputBudget=“Revenus”;
)
//CHERCHER([BUDGET]; & ;[BUDGET]anBudget=vAn) //On Recherche les Revenus de l’année
//vRevenu:=Somme([BUDGET]creditBudget)
$type:=“Revenus”
vRevenu:=ds.BUDGET.query(“imputBudget =:1 and anBudget =:2”;$type;vAn).sum(“creditBudget”)
FIXER OPTION IMPRESSION(2;2;73)
FORM FIXER SORTIE([TempPrint];“Etat_Sortie”)
FIXER OPTION IMPRESSION(Option échelle;77) // 77%
FIXER OPTION IMPRESSION(Option orientation;2) // Paysage
IMPRIMER SÉLECTION([TempPrint])

</code 4D>

Bonsoir Patrick

je ne sais pas quoi faire pour te remercier de m’aider

à la ligne 33 ‘$designationS:=ds.COMPTA.all().disctint().orderBy(ck ascending)’ dans le trace
j’ai un 1er message "attribut distinct pas trouvé dans datastore COMPTA je fais continuer
puis un 2 ème message “méthode membre inconnue” je fais continuer
puis un 3 ème message “objet ou collection attendu” je fais continuer
puis un 4 ème message “arguments incompatibles” je fais continuer et je passe la la ligne suivante

$designationS valeur nulle

j’ai rajouter ensuite C_COLLECTION($designationS) avant la ligne 33 pour typer en collection même effet même punition

dois je decomposer la ligne en 3 lignes?

encore merci

: Bernard DORET

dois je decomposer la ligne en 3 lignes?

oui, je pense que ce serait mieux.

$designationS:=ds.COMPTA.all().disctint().orderBy(ck ascending)

Avant de découper cette ligne, essaye avec celle-ci (pas sur que ce soit mieux) :

$designationS:=ds.COMPTA.all().disctint(“designation”).orderBy(ck ascending)

Patrick

essais avec cela directement :
C_OBJET($designationS)
$designationS:=ds.COMPTA.all()

merci à vous deux

avec ce code cela marche, je pense que c’est le trie qui marche pas et dans le trace ils sont tries $designationS[0]est “AAA” $designationS[1]est AAB" etc

$designationS:=ds.COMPTA.query(“dateAchat >=:1 and dateAchat<=:2”;vDeb;vFin).distinct(“designation”)

j’ai donc virer tous les orderBy(ck ascending)

je continue les tests

je coince à la deuxième partie “Recupération du crédit et ou du debit”

mais avec vous je vais y arriver ( je dois dire que j’en rêve la nuit)
Encore MERCI

TOUT SÉLECTIONNER([TempPrint]) // Table devant recevoir les valeurs pour Imprimer le Compte d'exploitation de la période 
SUPPRIMER SÉLECTION([TempPrint])

C_COLLECTION($DesigUniq;$MoisAchat)
C_OBJET($es;$Entity;$Status)
C_ENTIER LONG($item)
C_TEXTE($Selection)
$es:=ds.COMPTA.query("dateAchat >= :1 and dateAchat<= :2 and imputation != 'Revenus' and imputation != 'Divers' and imputation != 'Investissement'";$vDeb;$vFin)
$DesigUniq:=$es.distinct("designation")
$tabMois:=ds.COMPTA.query("dateAchat >=:1 and dateAchat<=:2";vDeb;vFin).distinct("moisAchat")
Pour chaque ($Selection;$DesigUniq)  // j'ai dans TempPrint toutes les designations semblables avec l'impution correspondante
	$Entity:=ds.TempPrint.new()
	$Entity.designation:=$Selection
	$Entity.imputation:=$es.query("designation =:1";$Selection).first().imputation
	$Status:=$Entity.save()
	Si ($Status.success)
		$item:=$item+1
	Fin de si 
Fin de chaque 
  //--------------------------------------------------------Recupération du crédit et ou du debit pour toutes des désignations uniques et a stocher dans Table 14 soit TempPrint et Champ 4 soit Tps1 , Champ 5 soit Tps2 etc

$tempPrints:=ds.TempPrint.all()
Pour chaque ($TempPrint;$tempPrintS)
	Pour chaque ($mois;$tabMois)
		$TempPrint.total:=$TempPrint.total+Champ(14;Num($mois)+3)->+[COMPTA]credit-[COMPTA]debit // comment récuperer c'est valeur
		$status:=$TempPrint.save(dk auto merge)
		Au cas ou 
			: ($status.success)
				  // ALERTE("mis(e) à jour: OK")
			: ($status.status=dk status automerge failed)
				ALERTE($status.statusText)
		Fin de cas 
		$p:=Pointeur vers("vt"+Chaîne(Num($mois)))
		$p->:=Somme(Champ(14;3+$Num($mois)i)->)
	Fin de chaque 
Fin de chaque

Voici la table

[]34122848;“Your comment here…”[/]

Bonsoir

cette ligne là est celle qui te pose problème :

$TempPrint.total:=$TempPrint.total+Champ(14;Num($mois)+3)->+[COMPTA]credit-[COMPTA]debit

Si je comprend bien, il te faut cumuler “credit” et “debit” de la table COMPTA pour le “mois” concerné.
Donc pour cela, je ferai un truc du genre:

$temp:=$es.query(“moisAchat = :1”;Num($mois))
$credit:=$temp.sum(“credit”)
$debit:=$temp.sum(“debit”)
$TempPrint.total:=$TempPrint.total+Champ(14;Num($mois)+3)->+$credit-$debit

patrick

Bonjour Patrick

C’est pas exactement cela

je dois pour une designation donnée “Medecin acuponcteur” cumuler le débit et le credit par mois il peut y avoir plusieurs designation identiques par mois

j’espère m’exprimer clairement

Merci

Bonjour patrick

je modifie ce que sait modifier mais sur cette boucle je ne récupère que à partir de février

si je mais dans choisir ;""avant janvier c’est bon mais c’est pas catholique comme programmation?

Boucle ($i;1;Taille tableau(TabMois))
$p1:=Pointeur vers(“LibRef”+Chaîne($i))
$p1>:=Choisir(TabMois{$i};“Janvier”;“Février”;“Mars”;“Avril”;“Mai”;“Juin”;“Juillet”;“Août”;“Septembre”;“Octobre”;“Novembre”;“Décembre”)
Fin de boucle

merci de ton aide

Bonjour Bernard,

que vaut TabMois{$i} quand tu obients “Février”.
Si c’est la valeur pour janvier et que cela te sors Février, dans ce cas tu fais (TabMois{$i}-1) et le tour est joué, sinon, oui, tu peux insérer un “” pour décaler le tout (moins propre à mon avis)

Patrick

il te faut dans ce cas ajouter un second critère de recherche correspondant à la désignation