**********************************************************************
* Mise en Tableau du budget pour edition
* Programme chaine a partir d'un projet VB
* Sbastien                                               12/07/01
**********************************************************************
* Ouvertures des fichiers
**************************************************************
EXECUTE "SET-THOUS ."
EXECUTE "SET-DEC ,"
EXECUTE "DATE.FORMAT"
OPEN "","BUDGET" TO F.BUDGET ELSE PRINT "BUDGET"
OPEN "","BUDGETCLES" TO F.BUDGETCLES ELSE PRINT "BUDGETCLES"
OPEN "","SSCLASSE" TO F.SSCLASSE ELSE PRINT "SSCLASSE"
OPEN "","SCLASSE" TO F.SCLASSE ELSE PRINT "SCLASSE"
OPEN "","CLASSE" TO F.CLASSE ELSE PRINT "CLASSE"
OPEN "","TEMPO" TO F.TEMPO ELSE STOP

**************************************************************
* Recuperation des arguments
**************************************************************
PROCREAD ARGUMENTS ELSE PRINT "Procread"

W_REQUETE = FIELD(ARGUMENTS,"|",2)
W_CODESECTANAL = FIELD(ARGUMENTS,"|",3)
W_MOISDEBUT = FIELD(ARGUMENTS,"|",4)
W_MOISFIN = FIELD(ARGUMENTS,"|",5)
W_CODEENTITE = FIELD(ARGUMENTS,"|",6)
W_EXER = FIELD(ARGUMENTS,"|",7)

*W_REQUETE = 'SSELECT BUDGET AVEC 0 >= "N00020000000000" AND AVEC 0 <="N0002999999999" AND AVEC 2 >="00" AND AVEC 2 <="11" PAR 0'
*W_CODESECTANAL = "100"
*W_MOISDEBUT = "00"
*W_MOISFIN = "11"
*W_CODEENTITE = "002"

**************************************************************
* Format d'une ligne ENR_TEMPO
**************************************************************
* 1 : = 0 si total
*     = 1 si classe
*     = 2 si sous classe
*     = 3 si sous sous classe
*     = 4 si compte budgetaire ou ligne vide
* 2 : n de compte (10 chiffre)
* 3 : Libelle du compte
* 4 : Valeur budgetee 
* 5 : Cle de rpartition (3 chiffre)
* 6 : Pourcentage
* 7 : Part Analytique
**************************************************************

*********************************************************
*Initialisation des variables
*********************************************************
ENR_TEMPO = ""
ENR_BUDGET = ""
ENR_BUDGETCLES = ""

W_CUMULBUDGET0 = 0	;* Cumul fichier
W_CUMULBUDGET1 = 0	;* Cumul 1er chiffre
W_CUMULBUDGET2 = 0	;* Cumul 2eme chiffre
W_CUMULBUDGET3 = 0	;* Cumul 3eme chiffre

W_CUMULPARTANAL0 = 0	;* Cumul fichier
W_CUMULPARTANAL1 = 0	;* Cumul 1er chiffre
W_CUMULPARTANAL2 = 0	;* Cumul 2eme chiffre
W_CUMULPARTANAL3 = 0	;* Cumul 3eme chiffre


W_RUPTURE = ""	;* Rupture

W_POSITION = 0	;* Position dans ENR_TEMPO

W_LIGNEID = ""	;* Identifiant d'une ligne de la requete

W_VALEURBUDGETEE = 0	;* Valeur budgetee
W_PARTANAL = 0	;* Part analytique

W_FINI = "FAUX"

*****************************
* TRAITEMENT GLOBAL
*****************************

	EXECUTE W_REQUETE 

	GOSUB 200	;* Analyse de la requete

	IF W_POSITION > 0 THEN
		GOSUB 1000	;* une ligne vierge
		GOSUB 600	;* Ajoute 3 chiffre
		GOSUB 700	;* Ajoute 2 chiffre
		GOSUB 800	;* Ajoute 1 chiffre
		GOSUB 1000	;* une ligne vierge
		GOSUB 900	;* Ajoute le total
	END

	WRITE ENR_TEMPO ON F.TEMPO,"EDITIONBUDGET"   
	
	STOP 

*****************************
* TRAITEMENT D'UNE LIGNE DE LA REQUETE
*****************************
100
	GOSUB 400	;* Calcul Valeur Budgetee
	GOSUB 500	;* Calcul du pourcentage
	IF W_VALEURBUDGETEE < 0 THEN
		W_PARTANAL = INT((W_VALEURBUDGETEE/100) * (W_POURCENT / 100) - 0.5)
	END ELSE
		W_PARTANAL = INT((W_VALEURBUDGETEE/100) * (W_POURCENT / 100) + 0.5)
	END
	GOSUB 300	;* Cumul

	IF ABS(W_PARTANAL) < 1 THEN
		RETURN
	END

	W_POSITION = W_POSITION + 1
	ENR_TEMPO<W_POSITION,1> = 4
	ENR_TEMPO<W_POSITION,2> = W_LIGNEID[6,10] 
	ENR_TEMPO<W_POSITION,3> = ENR_BUDGET<1>
	ENR_TEMPO<W_POSITION,4> = W_VALEURBUDGETEE 
	ENR_TEMPO<W_POSITION,5> = ENR_BUDGET<4>
	ENR_TEMPO<W_POSITION,6> = W_POURCENT 
	ENR_TEMPO<W_POSITION,7> = W_PARTANAL 

	GOSUB 1100	;* Mise en forme

	RETURN


*****************************
* TRAITEMENT DE LA REQUETE
*****************************
200
	LOOP
		READNEXT W_LIGNEID ELSE W_FINI = "VRAI"
	WHILE W_FINI <> "VRAI" DO
		
		READ ENR_BUDGET FROM F.BUDGET,W_LIGNEID THEN
			IF W_RUPTURE = "" THEN
				W_RUPTURE = W_LIGNEID[6,10]
			END
			GOSUB 100
		END ELSE
			PRINT "LECTURE BUDGET"
		END
	REPEAT
	
	RETURN


****************************
* EFFECTUE LE CUMUL
****************************
300
	IF (ABS(W_VALEURBUDGETEE) < 1) OR (ABS(W_PARTANAL) < 1) THEN
		RETURN
	END 

	IF W_RUPTURE[1,1] = W_LIGNEID[6,1] THEN
		IF W_RUPTURE[2,1] = W_LIGNEID[7,1] THEN
			IF W_RUPTURE[3,1] = W_LIGNEID[8,1] THEN
				* Rien a faire
			END ELSE
				IF ABS(W_CUMULPARTANAL3) >= 1 THEN
					GOSUB 1000	;* une ligne vierge
					GOSUB 600	;* Ajoute sous sous classe
					GOSUB 1000	;* une ligne vierge
				END
			END
		END ELSE
			IF ABS(W_CUMULPARTANAL3) >= 1 OR ABS(W_CUMULPARTANAL2) >= 1 THEN
				GOSUB 1000	;* une ligne vierge
				GOSUB 600	;* Ajoute sous sous classe
				GOSUB 700	;* Ajoute sous classe
				GOSUB 1000	;* une ligne vierge
			END
		END
	END ELSE
		IF ABS(W_CUMULPARTANAL3) >= 1 OR ABS(W_CUMULPARTANAL2) >= 1 OR ABS(W_CUMULPARTANAL1) >= 1 THEN
			GOSUB 1000	;* une ligne vierge
			GOSUB 600	;* Ajoute sous sous classe
			GOSUB 700	;* Ajoute sous classe
			GOSUB 800	;* Ajoute classe
			GOSUB 1000	;* une ligne vierge	
		END
	END
	W_RUPTURE = W_LIGNEID[6,3]
	W_CUMULBUDGET3 = W_CUMULBUDGET3 + W_VALEURBUDGETEE
	W_CUMULPARTANAL3 = W_CUMULPARTANAL3 + W_PARTANAL

	RETURN
			

****************************
* CALCUL DE LA VALEUR BUDGETEE
****************************

400
	W_NBMOIS = DCOUNT(ENR_BUDGET<2>,CHAR(253))
	W_VALEURBUDGETEE = 0
	FOR i = 1 TO W_NBMOIS
		IF (W_MOISDEBUT <= ENR_BUDGET<2,i>) AND (ENR_BUDGET<2,i> <= W_MOISFIN) THEN
			W_VALEURBUDGETEE = W_VALEURBUDGETEE + ENR_BUDGET<3,i>
		END
	NEXT i

	* prise en compte du signe pour un compte
	IF W_LIGNEID[6,1] = "7" THEN
		W_VALEURBUDGETEE = - W_VALEURBUDGETEE
	END

	RETURN

*****************************
* CALCUL POURCENTAGE
*****************************

500
	IF W_CODESECTANAL = "" THEN
		W_POURCENT = 10000
	END ELSE
		W_POURCENT = 0
		READ ENR_BUDGETCLES FROM F.BUDGETCLES, (TRIM(W_CODEENTITE) : TRIM(ENR_BUDGET<4>)) THEN
			W_NBSECTANAL = DCOUNT(ENR_BUDGETCLES<2>, CHAR(253))
			FOR i = 1 TO W_NBSECTANAL
				IF ENR_BUDGETCLES<2,i> = W_CODESECTANAL THEN
					IF W_EXER="0" THEN
						W_POURCENT = ENR_BUDGETCLES<3,i>
						EXIT
					END ELSE
						W_POURCENT = ENR_BUDGETCLES<4,i>
						EXIT
					END
				END
			NEXT i
		END ELSE
			W_POURCENT = "INTROUVABLE"
			PRINT "CODE REPARTION ", W_CODEENTITE : ENR_BUDGET<4>, " MANQUANTE POUR LE COMPTE ", W_LIGNEID
		END
	END
	RETURN	

*****************************
* Ajoute sous sous classe
*****************************
600
	IF ABS(W_CUMULPARTANAL3) >= 1 THEN
		W_POSITION = W_POSITION + 1
		ENR_TEMPO<W_POSITION,1> = 3

		ENR_TEMPO<W_POSITION,2> = W_RUPTURE[1,3] 

		READ ENR_SSCLASSE FROM F.SSCLASSE, W_RUPTURE[1,3] THEN
			ENR_TEMPO<W_POSITION,3> = ENR_SSCLASSE<1>
		END ELSE
			ENR_TEMPO<W_POSITION,3> = ""
		END

		ENR_TEMPO<W_POSITION,4> = W_CUMULBUDGET3 
		ENR_TEMPO<W_POSITION,5> = ""
		IF ABS(W_CUMULBUDGET3) >= 1 THEN
			ENR_TEMPO<W_POSITION,6> = INT((W_CUMULPARTANAL3 / W_CUMULBUDGET3) * 100 * 100 + 0.5)
		END ELSE
			ENR_TEMPO<W_POSITION,6> = 0
		END 
		ENR_TEMPO<W_POSITION,7> = W_CUMULPARTANAL3 

		W_CUMULBUDGET2 = W_CUMULBUDGET2 + W_CUMULBUDGET3
		W_CUMULPARTANAL2 = W_CUMULPARTANAL2 + W_CUMULPARTANAL3
		W_CUMULBUDGET3 = 0
		W_CUMULPARTANAL3 = 0

		GOSUB 1100	;* Mise en forme
	END

	RETURN		

*****************************
* Ajoute sous classe
*****************************
700
	IF ABS(W_CUMULPARTANAL2) >= 1 THEN
		W_POSITION = W_POSITION + 1
		ENR_TEMPO<W_POSITION,1> = 2

		ENR_TEMPO<W_POSITION,2> = W_RUPTURE[1,2] 

		READ ENR_SCLASSE FROM F.SCLASSE, W_RUPTURE[1,2] THEN
			ENR_TEMPO<W_POSITION,3> = ENR_SCLASSE<1>
		END ELSE
			ENR_TEMPO<W_POSITION,3> = ""
		END

		ENR_TEMPO<W_POSITION,4> = W_CUMULBUDGET2 
		ENR_TEMPO<W_POSITION,5> = ""
		IF ABS(W_CUMULBUDGET2) >= 1 THEN
			ENR_TEMPO<W_POSITION,6> = INT((W_CUMULPARTANAL2 / W_CUMULBUDGET2) * 100 * 100 + 0.5)
		END ELSE
			ENR_TEMPO<W_POSITION,6> = 0
		END 
		ENR_TEMPO<W_POSITION,7> = W_CUMULPARTANAL2 
	
		W_CUMULBUDGET1 = W_CUMULBUDGET1 + W_CUMULBUDGET2
		W_CUMULPARTANAL1 = W_CUMULPARTANAL1 + W_CUMULPARTANAL2
		W_CUMULBUDGET2 = 0
		W_CUMULPARTANAL2 = 0

		GOSUB 1100	;* Mise en forme
	END
	RETURN		

*****************************
* Ajoute classe
*****************************
800
	IF ABS(W_CUMULPARTANAL1) >= 1 THEN
		W_POSITION = W_POSITION + 1
		ENR_TEMPO<W_POSITION,1> = 1

		ENR_TEMPO<W_POSITION,2> = W_RUPTURE[1,1]

		READ ENR_CLASSE FROM F.CLASSE, W_RUPTURE[1,1] THEN
			ENR_TEMPO<W_POSITION,3> = ENR_CLASSE<1>
		END ELSE
			ENR_TEMPO<W_POSITION,3> = ""
		END

		ENR_TEMPO<W_POSITION,4> = W_CUMULBUDGET1 
		ENR_TEMPO<W_POSITION,5> = ""
		IF ABS(W_CUMULBUDGET1) >= 1 THEN
			ENR_TEMPO<W_POSITION,6> = INT((W_CUMULPARTANAL1 / W_CUMULBUDGET1) * 100 * 100 + 0.5)
		END ELSE
			ENR_TEMPO<W_POSITION,6> = 0
		END 
		ENR_TEMPO<W_POSITION,7> = W_CUMULPARTANAL1 

		W_CUMULBUDGET0 = W_CUMULBUDGET0 + W_CUMULBUDGET1
		W_CUMULPARTANAL0 = W_CUMULPARTANAL0 + W_CUMULPARTANAL1
		W_CUMULBUDGET1 = 0
		W_CUMULPARTANAL1 = 0

		GOSUB 1100	;* Mise en forme
	END

	RETURN		

*****************************
* Ajoute total
*****************************
900
	W_POSITION = W_POSITION + 1
	ENR_TEMPO<W_POSITION,1> = 0

	ENR_TEMPO<W_POSITION,2> = "" 

	ENR_TEMPO<W_POSITION,3> = "TOTAL"
	ENR_TEMPO<W_POSITION,4> = W_CUMULBUDGET0
	ENR_TEMPO<W_POSITION,5> = ""
	IF ABS(W_CUMULBUDGET0) >= 1 THEN
		ENR_TEMPO<W_POSITION,6> = INT((W_CUMULPARTANAL0 / W_CUMULBUDGET0) * 100 * 100 + 0.5)
	END ELSE
		ENR_TEMPO<W_POSITION,6> = 0
	END 
	ENR_TEMPO<W_POSITION,7> = W_CUMULPARTANAL0 

	GOSUB 1100	;* Mise en forme

	RETURN		

****************************
* Ajoute une ligne de vide
****************************
1000
	W_POSITION = W_POSITION + 1
	ENR_TEMPO<W_POSITION,1> = 4
	ENR_TEMPO<W_POSITION,2> = SPACE(10)
	ENR_TEMPO<W_POSITION,3> = ""
	ENR_TEMPO<W_POSITION,4> = SPACE(14)
	ENR_TEMPO<W_POSITION,5> = SPACE(3)
	ENR_TEMPO<W_POSITION,6> = SPACE(10)
	ENR_TEMPO<W_POSITION,7> = SPACE(14)

	RETURN

****************************
* Met en forme l'enr actuel
****************************
1100
	ENR_TEMPO<W_POSITION,2> = ENR_TEMPO<W_POSITION,2> "L#10"
	ENR_TEMPO<W_POSITION,4> = ENR_TEMPO<W_POSITION,4> "R26 #14"	;* signe+10+,+2
	ENR_TEMPO<W_POSITION,5> = ENR_TEMPO<W_POSITION,5> "L#3"
	ENR_TEMPO<W_POSITION,6> = ENR_TEMPO<W_POSITION,6> "R26 #10"	;*4+ 3+,+2
	ENR_TEMPO<W_POSITION,7> = ENR_TEMPO<W_POSITION,7> "R26 #14" ;* signe+10+,+2

	RETURN
