Upload
phamnguyet
View
213
Download
0
Embed Size (px)
Citation preview
Exercice d’Entraînement TP-11
l) Enoncé
Une société de vente par correspondance « Les Trois Russes » désire mettre en oeuvre un programme permettant :
- d’éditer chaque jour les factures relatives aux commandes émises par ses clients
- d’actualiser le fichier de ses clients en effectuant une mise à jour quotidienne
- de produire le premier jour de chaque mois, la liste des clients ayant le plus acheté depuis leur inscription au fichier confidentiel.
On vous demande de concevoir un programme permettant de réaliser ces différents objectifs
LES FICHIERS EN ENTREE
Les fichiers ne comportent pas d’anomalies
Un fichier en organisation séquentielle F_CLIENT, fichier donnant diverses informations sur les clients des « Trois Russes ».
Position Intitulé Caractéristique longueur 1 Numéro du client AN 5 6 Code de tarification N 1 7 Nom du Client AN 20 27 Adresse du Client AN 30 57 Cumul Montant des commandes N 10 dont 2
décimales
Ce fichier est trié en croissant sur le numéro de client.
Le code de tarification peut prendre les valeurs 1 ou 2, ce code servira à définir le prix de chaque produit.
Un fichier en organisation séquentielle F_MVT, donnant diverses informations sur les clients et sur les commandes effectuées par ces clients. Ce fichier est constitué chaque jour au fur et à mesure de la réception des informations. La saisie se termine à 21 heures, les informations et commandes non prises en compte seront réalisées lors du traitement du lendemain. Ce fichier comporte plusieurs types d’enregistrements : des enregistrements concernant le client et des enregistrements concernant les commandes
Description Enregistrements de type Client (type 0)
Position Intitulé Caractéristique Longueur 1 Type d’enregistrement : 0 AN 1 2 Numéro du client AN 5 7 Code Mise à Jour AN 1 8 Nom du client AN 20 28 Adresse du client AN 30
Description Enregistrements de type Commande (type 1)
Position Intitulé Caractéristique Longueur 1 Type d’enregistrement : 1 AN 1 2 Numéro du client AN 5 3 à blanc AN 1 8 à 57 10 zones produits commandés N 50 8 à 12 Un produit commandé AN 5 8 à 10 Numéro du produit N 3 11 à 12 Quantité commandée N 2 13 à 17 Un produit commandé AN 5 13 à 15 Numéro du produit N 3 16 à 17 Quantité commandée N 2 ................................................................................
Ce fichier est trié en croissant sur le numéro de client, le type d’enregistrement.
Les enregistrements de type client (Type 0) du fichier F_MVT
Il ne peut y avoir au maximum qu’ UN SEUL enregistrement de type 0 par client
Le code mise à jour peut prendre les valeurs « C », « M » ou « S ».
Le code « C » concerne un nouveau client
Le code « S » concerne une demande de suppression d’un client
Le code « M » concerne une modification, seules les zones modifiées sont renseignées.
Les enregistrements de type commande (Type 1) du fichier F_MVT
Il ne peut y avoir de 0 à N enregistrement de type 1 par client
Pour chaque enregistrement, les occurrences non renseignées sont en fin d’enregistrement.
Un fichier en organisation séquentielle F_TPU, donnant les prix unitaires de chaque produit. Il existe 300 produits (code produit 1 à 300) dans le catalogue des « Trois Russes ».
Position Intitulé Caractéristique Longueur 1 à 130 10 zones produits AN 130 1 à 13 Un produit AN 13 1 à 3 Un numéro de produit N 3 4 à 8 Prix unitaire code tarification 1 N 5 dont 2 décimales 9 à 13 Prix unitaire code tarification 2 N 5 dont 2 décimales 14 à 26 Un produit AN 13 14 à 16 Un numéro de produit N 3 17 à 21 Prix unitaire code tarification 1 N 5 dont 2 décimales 22 à 26 Prix unitaire code tarification 2 N 5 dont 2 décimales ............................................................................................
LES FICHIERS EN SORTIE
1) Un fichier F_CLIENTMAJ, fichier identique au fichier F_CLIENT d’entrée
2) Un fichier F_FACTURE sur imprimante dont la maquette est décrite ci dessous JJ mois en clair AAAA Nom du client Adresse du client CLIENT NUMERO DE PRODUIT MONTANT xxxxx xxx xxxxx,xx xxxxx xxx xxxxx,xx xxxxx xxx xxxxx,xx TOTAL : xxxxxxx,xx
La facture d’un client tient sur une page Les intitulés sont en gras sur la maquette Saut de page pour chaque nouveau client.
3) Un fichier F_BESTCLIENT donnant sur imprimante chaque mois les dix meilleurs clients des « Trois Russes ».
mois en clair AAAA NOM CLIENT ADRESSE xxxxxxxxxxxxxxxxxx xxxxxxxxxxxxxxxxxxxxxxxxxxx xxxxxxxxxxxxxxxxxx xxxxxxxxxxxxxxxxxxxxxxxxxxxxx xxxxxxxxxxxxxxxxxx xxxxxxxxxxxxxxxxxxxxxxxxxxxxx xxxxxxxxxxxxxxxxxx xxxxxxxxxxxxxxxxxxxxxxxxxxxxx
Les intitulés sont en gras sur la maquette
Cette statistique n’est produite que le premier de chaque mois et doit être triée en ordre décroissant
LES REGLES DE GESTION
- Le code de tarification attribué à un nouveau client a la valeur 1
- Un client ayant en montant cumulé des commandes dépassé la somme de 10 000€ se voit attribuer un code de tarification 2 après le traitement en cours.
- Le montant d’un produit commandé est égal au Prix unitaire * Quantité commandé
- Le Prix unitaire utilisé sera celui correspondant à la tarification du client
Il) Travail Demandé
1- Unité de traitement ou Diagramme
2- Description des données
3- Arbre programmatique général
4- Arbres programmatiques détaillés
5- Cobol des déclarations des enregistrements des fichiers d’entrée et des différentes tables.
Corrigé de l’Exercice d’Entraînement TP-11
I) Diagramme de Traitement
Le diagramme de traitement nous indique les fichiers à traiter en entrée et en sortie.
F_CLIENT
OrganisationSéquentielle
PROG_TROIS_RUSSES
Trié NuméroClient
F_MVTOrganisationSéquentielle
F_BESTCLIENT
F_CLIENTMAJ
F_TPUOrganisationSéquentielle
Trié NuméroClient et Type
F_FACTURE
Chaque mois
- Le fichier en entrée F_TPU est en accès séquentiel, il comporte 30 enregistrements de 10 produits
chacun. Nous devons disposer des Prix Unitaires de ces 300 produits en mémoire centrale afin de pouvoir effectuer les divers traitements demandés. Ce fichier sera chargé sous forme d’une table T_Produits.
-
II) Analyse du problème
Cette solution va se baser sur une séparation des différents types de clients.
Le fichier F_TPU sera chargé sous forme de table T_Produits en début de traitement.
La particularité de ce traitement consiste dans le fait que le fichier mouvement permet d’effectuer une mise à jour sur les clients (Création, Modification, Suppression) mais également nous permet de gérer les éventuelles commandes de ces différents clients. Dans le fichier mouvement, on peut avoir pour un client donné plusieurs enregistrements mais le type, le code de mise à jour et la séquence de ces enregistrements sont différents en fonction de la nature du client NOUVEAU ou ANCIEN.
La séquence d’enregistrements d’un nouveau client aura la nature suivante :
• Obligatoirement un type « 0 » avec un code de mise à jour « C »
• Puis de 0 à N enregistrements de type « 1 ».
La séquence d’enregistrements d’un ancien client aura la nature suivante :
• Eventuellement un type « 0 » avec un code de mise à jour « M » ou « S »
• De 0 à N enregistrements de type « 1 ».
On peut considérer qu’un client supprimé ne fait pas de commandes.
Si Identifiant de F_CLIENT < Identifiant de F_MVT
Il s’agit d’un client qui ne subit aucune modification administrative et qui n’a effectué aucune commande.
Si Identifiant Identifiant de F_MVT < F_CLIENT
Il s’agit d’un nouveau client qui n’existe pas dans le fichier de base, il s’agit donc logiquement d’une CREATION.
Si Identifiant Identifiant de F_MVT = F_CLIENT
Il s’agit d’un ancien client,
Si l’enregistrement est de type « 0 » et le code de mise à jour « M », on prend en compte les modifications avant de traiter éventuellement les commandes.
Si l’enregistrement est de type « 0 » et le code de mise à jour « S », on supprime ce client, logiquement il n’existe pas de commandes associés.
Si l’enregistrement est de type « 1 », on traite les commandes de ce client sans modification administrative.
Les traitements pour les différents clients concerneront : prise en compte des différentes mises à jour (Création, Modification, Suppression), Cumul du montant des commandes, Modification éventuelle du code de tarification, mise à jour du fichier F_CLIENTMAJ, édition d’une facture si une commande a été effectuée, vérification si le client est parmi les 10 plus gros acheteurs.
Si le traitement est effectué le Premier jour du mois, édition des 10 meilleurs clients.
La fin de traitement est conditionnée par la fin du fichier F_CLIENT et du fichier F_MVT.
Analysons la structure du fichier F_CLIENT.
Le Fichier F_CLIENT est trié sur le numéro de client, on y trouve
Plusieurs CLIENTS
Pour chaque Client UN SEUL enregistrement
Analysons la structure du fichier F_MVT.
Le Fichier F_MVT est trié sur le numéro de client, on y trouve
Plusieurs CLIENTS
Pour chaque Client de 0 à 1 enregistrement de type « 0 »
Pour chaque Client de 0 à N enregistrement de type « 1 »
Nous allons donc appliquer le principe relatif à la mise à jour séquentielle pour différencier les différents types de clients et le principe de la rupture de groupe pour mettre en place la structure du traitement associé.
FICHIERCLIENT
CLIENT
1
N
1
1
TANT QUE
TANT QUE
ENREGISTREMENT Lecture
FICHIERMVT
CLIENT
TYPE 0
1N
1
0,1
TYPE 1
1
N
ENREGISTREMENT Lecture
Dans le fichier F_CLIENT, pour un client, il existe un seul enregistrement
Dans le fichier F_MVT, pour un client il existe 0 ou 1 enregistrement de type « 0 » et de 0 à N enregistrements de type « 1 ».
III) Description des données
En Pseudo-Code
FICHIER F_CLIENT
E_Client : Fiche ( E_NumCli_Client Texte (5) E_CodeTarif_Client Numérique (1) E_Nom_Client Texte (20) E_Adresse_Client Texte (30) E_CumulMt_Client Numérique (8,2) )
E_Client Texte(66) (par défaut) FICHIER F_MVT
E_Mvt : Fiche ( E_Type_Mvt Texte (1) E_NumCli_Mvt Texte (5 E_CodMaj_Mvt Texte(1) 50 caractères)
)
E_Mvt Texte (57) (par défaut)
Le fichier F_MVT ayant plusieurs types d’enregistrements, ceux ci seront décrits sous forme de zones de travail.
FICHIER F_TPU
E_Tpu : Fiche ( E_Produit_Tpu [1 : 10] : Fiche (
E_CodProd_Tpu Numérique (3) E_PU1_Tpu Numérique (3,2) E_PU2_Tpu Numérique (3,2)
)
E_Tpu Texte (130) (par défaut)
Chaque enregistrement du fichier F_TPU a été décrit sous forme d’une zone indicée de 10 occurrences.
FICHIER F_CLIENTMAJ
S_ClientMaj : Fiche ( S_NumCli_CliMaj Texte (5) S_CodeTarif_CliMaj Numérique (1) S_Nom_CliMaj Texte (20) S_Adresse_CliMaj Texte (30) S_CumulMt_CliMaj Numérique (8,2) )
S_ClientMaj Texte(66) (par défaut)
FICHIER F_FACTURE
S_Facture Texte (132)
FICHIER F_BESTCLIENT
S_BestClient Texte (132)
Les fichiers F_FACTURE et F_BESTCLIENT ayant plusieurs types d’enregistrements différents, nous avons déclaré ci-dessus les zones de communication associées. Les différents enregistrements seront décrits sous forme de zones de travail.
ZONES de TRAVAIL
T_Fin_F_Tpu Logique
Variable identifiant la fin du fichier Fichier Terminé ==> « Vrai » Fichier Non Terminé ==> « Faux »
T_Sov_Client Texte (5)
Variable de stockage du numéro de client en en cours de traitement
T_IndProd Numérique (2)
Indice gérant la zone indicée de l’enregistrement du fichier F_TPU
T_IndProd_Mvt Numérique (2)
Indice gérant la zone indicée de l’enregistrement du fichier F_MVT
T_IndDec Numérique (2)
Indice permettant d’effectuer un décalage dans la table T_T_Best
T_Date Fiche ( T_AAAA Numérique (4) T_MM Numérique (2) T_JJ Numérique (2) )
T_Date Texte (8) (par défaut)
Date Système
T_Typ0_Mvt Fiche ( T_NumTyp0_Mvt Texte (1) T_NumCli0_Mvt Texte (5) T_CodMaj_Mvt Texte (1) T_NomCli_Mvt Texte (20) T_AdrCli_Mvt Texte (30) )
T_Typ0_Mvt Texte (57) (par défaut)
Enregistrement Client du fichier Mouvement
T_Typ1_Mvt Fiche ( T_NumTyp1_Mvt Texte (1) T_NumCli1_Mvt Texte (5) 1 caractère à blanc
T_Produit_Mvt [1 : 10] : Fiche ( T_CodProd_Mvt Numérique (3) T_Qte_Mvt Numérique (2) )
T_Typ1_Mvt Texte (57) (par défaut)
Enregistrement Commandes du fichier Mouvement
T_LgnTitre_Fact Fiche (
30 caractères à blanc T_Int1_Fact Texte (6) 20 caractères à blanc T_Int2_Fact Texte (17) 20 caractères à blanc T_Int3_Fact Texte (7) 32 caractères à blanc )
T_LgnTitre_Fact Texte (132) (par défaut)
Ligne Titre de la Facture
T_LgnTitre_Best Fiche ( 40 caractères à blanc T_Int1_Best Texte (10) 40 caractères à blanc T_Int2_Fact Texte (7) 35 caractères à blanc )
T_LgnTitre_Best Texte (132) (par défaut)
Ligne Titre de l’état meilleurs clients
T_LgnDate_Fact Fiche ( T_DateJ_Fact Texte (2) 1 caractère à blanc T_DateM_Fact Texte (9) 1 caractère à blanc T_DateA_Fact Texte (4) 115 caractères à blanc )
T_LgnDate_Fact Texte (132) (par défaut)
Ligne Date de la Facture
T_LgnNom_Fact Fiche ( T_Nom_Fact Texte (20) 112 caractère à blanc )
T_LgnNom_Fact Texte (132) (par défaut)
Ligne Nom de la Facture
T_LgnAdr_Fact Fiche ( T_Adr_Fact Texte (30) 102 caractère à blanc )
T_LgnAdr_Fact Texte (132) (par défaut)
Ligne Adresse de la Facture
T_LgnProd_Fact Fiche ( 30 caractères à blanc T_NumCli_Fact Texte (5) 27 caractères à blanc T_NumProd_Fact Texte (3) 27 caractères à blanc T_MontProd_Fact Numérique Editée (5,2) 32 caractères à blanc )
T_LgnProd_Fact Texte (132) (par défaut)
Ligne Produit de la Facture
T_LgnTot_Fact Fiche ( 30 caractères à blanc T_IntTot_Fact Texte (8) T_MontTot_Fact Numérique Editée (7,2) 84 caractères à blanc )
T_LgnTot_Fact Texte (132) (par défaut)
Ligne Total de la Facture
T_LgnDate_Best Fiche ( T_DateM_Best Texte (9) 1 caractère à blanc T_DateA_Best Texte (4) 118 caractères à blanc )
T_LgnDate_Best Texte (132) (par défaut)
Ligne Date de l’état meilleurs clients
T_LgnCli_Best Fiche ( 35 caractères à blanc T_NomCli_Best Texte (20) 23 caractères à blanc T_AdrCli_Best Texte (30) 24 caractères à blanc )
T_LgnCli_Best Texte (132) (par défaut)
Ligne Client de l’état meilleurs clients
T_MtProd Numérique (5,2)
Zone de calcul montant du produit
T_MtTotProd Numérique (7,2)
Zone de calcul du total de la commande
*****************************************************************************************
Nous avons indiqué que le fichier F_TPU est chargé en mémoire centrale sous forme de table T_Produits comment définir cette table ?
Quels sont les arguments ==> On peut identifier 2 arguments, le numéro de produit et le code de tarification qui détermine le prix unitaire à affecter.
Le numéro de produit prend les valeurs de 1 à 300, il s’agit d’une séquence absolue donc l’argument n’appartient pas à la table
Chargement Direct Recherche Directe 300 postes
Le code de tarification prend les valeurs 1 et 2, il s’agit d’une séquence absolue donc l’argument n’appartient pas à la table
Chargement Direct Recherche Directe 2 postes
La fonction associée ==> un prix unitaire
T_Produits : TABLEAU ( [1 :30], [1,2] : T_PU_Tab Numérique (3,2))
*****************************************************************************************
Puisque les mois doivent être édités en clair, on va initialiser une table interne T_TabMois
Combien de postes ==> 12 mois
Quel est l’argument ==> Le numéro du mois est l’argument, il s’agit d’une séquence absolue donc l’argument n’appartient pas à la table
Recherche Directe
Les fonctions associées ==> Libellé du mois.
T_TabMois : TABLEAU [1 : 12] (T_Libel_Mois Texte (9) )
*****************************************************************************************
Il faut identifier les 10 meilleurs clients chaque mois, pour cela il faut stocker dans une table les informations permettant d’identifier les meilleurs clients (Cumul des commandes) et les informations demabées lors de l’édition du fichier F_BESTCLIENT (Nom du client et Adresse du client)
Combien de postes ==> 10 postes
Cette table sera traitée séquentiellement, il faudra la charger en conservant un tri décroissant dans le cumul des montants.
T_TabBest : TABLEAU ([1 :10] : FICHE ( T_CumMt_TabBest Numérique(8,2) T_NomCli_TabBest Texte (20) T_AdrCli_TabBest Texte (30)
) )
T_IndBest Numérique (2)
Indice gérant la table TabBest
IV) Arbre Général PROG TP11 Trois_Russes
Débu_Trois_Russes Fin_Trois_RussesTANT QUE
E_NumCli_Client ^=Valeur maximale
OUE_NumCli_Mvt ^=Valeur maximale
Un_CLIENT
SI ALORS SINON
E_NumCli_Client <E_NumCli_Mvt
Le traitement Un_CLIENTs'effectuera TANT QUE UN des 2
fichiers n'est pas terminé
IV - ARBRE GENERAL PROG TP11
OuverturesInit
Trois_Russes Char_T_Produits LecturesF_CLIENT F_MVT
SI ALORS SINON
E_NumCli_Client =E_NumCli_Mvt
Ancien_Client_Recopie
Ancien_Client Nouveau_Client
FermeturesSI ALORS
T_JJ=1
Edition_Best
Le traitementeffectué le premier
de chaque mois
Trait_AncCli_Recopie Lecture F_CLIENT
Trait_Ancien_Client Lecture F_CLIENTLe client du fichier de base
n'ayant qu'un enregistrementaprès traitement, on passe au
suivant
Ancien_Client_Recopie
Nouveau_Client
Ecrire S_ClientMajS_ClientMaj
<==E_Client
IV - ARBRE DETAILLE PROG TP11
Charg_T_TabBest
Trait_Creation_Client Trait_Commandes
Ecrire s_ClientMaj
T_Sov_Client<==
E_NumCli_Mvt
Ce bloc prendra encompte si le client aeffectué ou non des
commandes
Charg_T_TabBest
Ecriture en sortieaprès avoir pris en
compte leséventuellescommandes
Cet ancien client participe à larecherche des 10 meilleurs
clients
Lecture F_MVT
Ce nouveau client participe à larecherche des 10 meilleurs
clients
Logiquement, on traite, un enreg de type"0" et code mise à jour "C"
Ayant traité l'enreg detype "0", on passe à
l'enreg suivant du fichierF_MVT
IV - ARBRE DETAILLEPROG TP11
Trait_Ancien_Client
E_CodMaj_Mvt
Lecture F_MVT
Dans le cas d'une suppression, pasde traitement spécifique, on passe à
l'eneg suivant du fichier F_MVT Ancien client avec modifs administratives etéventuellement des commandes
Il peut s'agir d'un ancien client avec modifsadministratives suiviesou non de commandes
OU BIENde la suppression d'un ancien client
OU BIENd''un ancie client avec uniquement des commandes
SELON
"S" "M" àblanc
Modif_Ancien_Client Commandes_Ancien_Client
Ancien client avec uniquement descommandes
Le code E_CodMaj_Mvt à blanccorrespond à la lecture d'un type "1" dans
la zone de communication
T_SovClient<==E_NumCli_Mvt
S_ClientMaj <== E_Client
IV - ARBRE DETAILLEPROG TP11
Init_Trois_Russes
Recuperez datesysteme
==> T_Date
Lecture F_CLIENT
LireF_CLIENT
E_NumCli_Client<==
Valeur Maximale
SI ALORS
Fin de Fichier
Ouvertures
Ouvrir en entréeF_CLIENT, F_MVT
Fermetures
Fermer F_CLIENT,F_MVT, F_FACTURE,
F_BESTCLIENT
InitialisationT_TabBest, et
T_TabMois
T_Int1_Fact <=="CLIENT"
T_Int2_Fact <=="NUMERO DU
PRODUIT"T_Int3_Fact <==
"MONTANT"T_IntTot_Fact <==
"TOTAL : "
T_Int1_Best <=="NOM CLIENT"T_Int2_Best <==
"ADRESSE"
Ouvrir en sortieF_FACTURE,
F_BESTCLIENT
LecturesF_CLIENT_F_MVT
Lecture F_MVT Lecture F_CLIENT
LireF_MVT
E_NumCli_Mvt<==
Valeur Maximale
SI ALORS
Fin de Fichier
IV - ARBRE DETAILLEPROG TP11
Trait_Creation_Client
T_Typ0_Mvt<==
E_Mvt
S_NumCli_CliMaj<== T_NumCli0_MvtS_CodeTarif_CliMaj
<== 1
S_Nom_CliMaj<== T_NomCli_MvtS_Adresse_CliMaj<== T_AdrCli_Mvt
S_CumulMt_CliMaj<==
0
Trait_Modif_Client
SI ALORS SI ALORST_Typ0_Mvt<==E_Mvt
T_NomCli_Mvt ^='blanc"
T_AdrCli_Mvt ^='blanc"
S_NomCli_Maj<==
T_NomCli_Mvt
S_Adresse_CliMaj<==
T_AdrCli_Mvt
Il s'agit d'unenreg de type 0,
on le stockedans la zone de
travail à sonimage
On construit l'enreg du nouveau client dansla zone de communication du fichier de
sortie
On prend en compte les modifications du client dans lazone de communication du fichier de sortie préalablement
renseignée par l'enregistrement du fichier F_CLIENT
Modif_Ancien_Client
Ecire S_ClientMajLecture F_MVT Trait_Commandes Charg_T_TabBest
Ayant traité l'enreg de type"0", on pase à l'enreg
suivant du fichier F_MVT
Ce bloc prendra en comptesi le client a effectué ou non
des commandes
Ecriture en sortie après avoirpris en compte les
éventuelles commandes
Ce client participe à larecherche des 10 meilleurs
clients
IV - ARBRE DETAILLEPROG TP11
Commandes_Ancien_Client
Ecire S_ClientMajTrait_Commandes Charg_T_TabBest
Ce bloc prendra en compteles commandes de cet
ancien client
Ecriture en sortie après avoirpris en compte les
éventuelles commandes
Ce client participe à larecherche des 10 meilleurs
clientsIl s'agit d'un ancien client pour lequel le fichier F_MVT apporte que desinformations concrnant des commandes
IV - ARBRE DETAILLEPROG TP11
Char_T_Produits
T_Fin_F_Tpu=
"Faux"
Lecture F_TPU
Chargement de la table du prixunitaire des différents produits
TANT QUE
Un_Enreg_F_TPU
Debut_Char_T_Produits Fin_Char_T_Produits
T_Fin_Tpu<==
"Faux"Ouverture F_T_PU
en entrée
Debut_Enreg_F_TPU
T_IndProd<==
1
TANT QUE
T_IndProd <= 10
Un_PRODUIT
T_PU_Tab(E_CodProd_Tpu(T_IndProd),1)
<== E_PU1_Tpu(T_IndProd)
T_PU _Tab(E_CodProd_Tpu(T_IndProd),2)
<== E_PU2_Tpu(T_IndProd)
T_IndProd<== T_IndProd
+ 1
Fin_Enreg_F_TPU
Lecture F_TPU
FermerF_TPU
Positionnementpremière
occurrencede l'enregistrement
Tant que l'on n'apas traité les 10
postes
Positionnementsur la prochaine
occurrencede l'enregistrement
Le traitement del'enreg.
est terminé, on lit lesuivant
Quelques commentaires sur ce chargement de la table T_Produits
Après la lecture d’un enregistrement du fichier F_TPU, on se positionne sur la première occurrence de la zone indicée de l’enregistrement.
On va effectuer le transfert des prix unitaires de l’enregistrement vers la table TANT QUE l’on n'a pas dépassé les 10 occurrences d’un enregistrement.
Le transfert consiste à prendre le premier prix unitaire E_PU1_Tpu de l’enregistrement, or cette information appartient à une zone indicée par T_IndProd ==> E_PU1_Tpu (T_IndProd). Cette information est transférée dans la table T_Produits, or pour accéder à cette table il faut 2 indices :
Le premier concerne le code produit (1 à 300), le code produit se trouve dans l’enregistrement du fichier F_TPU dans la zone indicée par T_IndProd ==> E_CodProd_Tpu(T_IndProd)
Le second concerne le code de tarification (1 à 2) or E_PU1_Tpu (T_IndProd) correspond à la tarification 1, le second indice prendra la valeur 1.
E_PU1_Tpu (T_IndProd).==> T_PU_Tab (E_CodProd_Tpu(T_IndProd),1)
Le transfert consiste ensuite à prendre le second prix unitaire E_PU2_Tpu de l’enregistrement, or cette information appartient à une zone indicée par T_IndProd ==> E_PU2_Tpu (T_IndProd). Cette information est transférée dans la table T_Produits, or pour accéder à cette table il faut 2 indices :
Le premier concerne le code produit (1 à 300), le code produit se trouve dans l’enregistrement du fichier F_TPU dans la zone indicée par T_IndProd ==> E_CodProd_Tpu(T_IndProd)
Le second concerne le code de tarification (1 à 2) or E_PU2_Tpu (T_IndProd).correspond à la tarification 2, le second indice prendra la valeur 2.
E_PU2_Tpu (T_IndProd).==> T_PU_Tab (E_CodProd_Tpu(T_IndProd),2)
Poste repéré par T_IndProd Numéro
de produit
PU1 PU2
25 52,5 41,5 Enregistrement de F_TPU Table T_Produits
Code Tarif 1 Code Tarif 2 Ligne 25 =====>
52,5 41,5
IV - ARBRE DETAILLEPROG TP11
Trait_Commandes
T_Sov_Client=
E_Numcli_Mvt
T_Typ1_Mvt<== E_Mvt
Traitement éventuel descommandes, on est positionné par
les lectures sur le prochainenregistrement de F_MVT à traiter
TANT QUE
Un_Enreg_Commande
Debut_Trait_Commandes Fin_Trait_Commandes
Debut_Enreg_Commande
T_IndProd_Mvt<==
1
TANT QUE
T_Produit_Mvt(T_IndProd_Mvt)
^= à blanc ETT_IndProd _Mvt<= 10
Un_PRODUIT_CMDE
T_IndProd_Mvt<== T_IndProdMvt
+ 1
Fin_Enreg_Commande
Lecture F_MVT
Positionnementpremière
occurrencede l'enregistrement
Tant quel'occurrence
renseignée et quel'on a pas traité les
10 postes
Positionnementsur la prochaine
occurrencede l'enregistrement
Le traitement del'enreg.
est terminé, on lit lesuivant
T_MtToTProd<== 0
En_Tete_Facture
Lgn_Facture
Lgn_Tot_Facture Cumul_Cmd Code_Tarif
Montant_Produit Cumul_Facture
T_Numcli_Fact<== T_Sov_Client
IV - ARBRE DETAILLEPROG TP11
Montant_Produit
En_Tete_Facture
Cumul_Facture
T_MtTotProd<==
T_MtTotProd+
T_MtProd
T_MtProd<==
T_PU_Tab ( T_CodProd_Mvt (T_IndProd_Mvt) , S_CodeTarif_CliMaj)*
T_Qte_Mvt (T_IndProd_Mvt)
LgnDate_Facture LgnNom_Facture LgnAdr_Facture LgnInt_Facture Saut_Lgn_Facture
Lgn_Facture
T_NumProd_Fact<==
T_CodProd_Mvt(T_IndProd_Mvt)
T_MontProd_Fact<==
T_MtProd
Ecrire S_Facture<==
T_LgnProd_Fact
T_MontTot_Fact<==
T_MtTotProd
Ecrire S_Facture<== T_LgnTot_Fact
après saut de 2 lignes
Total_Facture
T_Numcli_Fact<==
à blanc
Quelques commentaires sur la calcul du montant d’un produit
Le montant d’un produit est égal = Prix unitaire du produit * Quantité de produit commandé
Le Prix unitaire d’un produit se trouve dans la table des produits, on accède par une recherche directe dans cette table à l’aide de deux informations qui permettent de positionner les indices.
Premier indice : le numéro de produit
Le numéro de produit commandé se trouve dans l’enregistrement du fichier F_MVT, enregistrement stocké dans la zone de travail T_Typ1_Mvt. La zone T_CodProd_Mvt contient ce numéro de produit, or cette zone appartient à une zone indicée par T_IndProd_Mvt
numéro de produit ==> T_CodProd_Mvt (T_IndProd_Mvt )
Second indice : le code de tarification du client
Le code de tarification du client est dans la zone de communication S_ClientMaj du fichier de sortie F_CLIENTMAJ, nous avons transféré toutes les informations concernant un ancien client dans cette zone et avons construit également dans cette zone les caractéristiques d’un nouveau client.
code de tarification ==> S_CodeTarif_Climaj
le prix unitaire à utiliser est identifié par :
T_PU_Tab (T_CodProd_Mvt (T_IndProd_Mvt ), S_CodeTarif_Climaj )
La Quantité commandé pour un produit se trouve dans l’enregistrement du fichier F_MVT, enregistrement stocké dans la zone de travail T_Typ1_Mvt. La zone T_Qte_Mvt contient cette quantité, or cette zone appartient à une zone indicée par T_IndProd_Mvt
quantité commandée ==> T_Qte_Mvt (T_IndProd_Mvt )
Le montant du produit traité est donc égal à :
T_PU_Tab (T_CodProd_Mvt (T_IndProd_Mvt ), S_CodeTarif_Climaj )*T_Qte_Mvt (T_IndProd_Mvt)
IV - ARBRE DETAILLEPROG TP11
LgnDate_Facture LgnNom_Facture
T_Nom_Fact<==S_Nom_CliMaj
T_DateJ_Fact<==T_JJ
T_DateM_Fact<==
T_Libel_Mis(T_MM)
T_DateA_Fact<==
T_AAAA
Ecrire S_Facture<==
T_LgnDate_Factaprès saut de page
Ecrire S_Facture<==
T_LgnNom_Fact
LgnAdr_Facture
T_Adr_Fact<==S_Adr_CliMaj
Ecrire S_Facture<== T_LgnAdr_Fact
LgnInt_Facture
Ecrire S_Facture<== T_LgnTitre_Factaprès saut de 2 lignes
Saut_Lgn_Facture
Ecrire S_Facture
après saut de 2 lignes
S_Facture<== à blanc
v
Cumul_Cmd
S_CumulMt_CliMaj<==
S_CumulMt_CliMaj+
T_MtTotProd
SI ALORS
S_CodeTarif_CliMaj<==
2
S_CumulMt_CliMaj> 10 000
Code_Tarif
IV - ARBRE DETAILLEPROG TP11
Char_T_TabBest
T_IndBest <= 10ET
T_CumMt_TabBest(T_IndBest)
>S_CumulMt_CliMaj
Alimentation régulière de la tabledes meilleurs clients
TANT QUEDebut_Char_T_TabBest Fin_Char_T_TabbBest
T_IndBest<== 1
POSTE_SUIVANT
T_IndBest<== T_IndBest + 1
Positionnementpremièr poste
de la table
Tant que l'on n'a pas traité les 10 posteset que le client du poste examiné a plus
dépensé que le client en cours
Positionnementsur le prochainposte de la table
SI ALORS
T_IndBest <= 10
Decalage_T_TabbBest
En quittant la répétitive si T_IndBest <= 10, on atrouvé dans la table un client qui a moins dépensé
que le client en cours, il faut alors décaler les postesvers le bas pour insérer ce client
IV - ARBRE DETAILLEPROG TP11
Decalage_T_TabBest
T_IndDec > T_IndBest
Insertion du clent dans la tableT_TabBest
TANT QUEDebut_Decalage Fin_Decalage
T_IndDec<== 10
Un_DECALAGE
TabBest (T_IndDec - 1)<== T_IndDec
T_CumMt_TabBest <== S_CumulMt_CliMaj
T_NomCli_TabBest <== S_Nom_CliMaj
T_AdrCli_TabBest <== S_Adr_CliMajPositionnementdernier poste
de la tableTant que l'on n'a pas décalé tous les
postes en dessous du poste d'insertion
T_IndDec<== T_IndDec - 1
On transfère le 9ème poste de la table sur le 1Oème poste (qui est donc écrasé) puis le 8ème sur le 9ème poste jusqu'auposte où il faut insérer le client. Cette insertion s'effectue en fin de décalage.
Au départ, la table est initialisée pour les cumuls à 0
IV - ARBRE DETAILLEPROG TP11
Edition_Best
T_IndBest <= 10
Déchargement de la tableT_TabBest
TANT QUEDebut_Edition_Best Fin_Decalage
T_IndBest<== 1
Un_Poste_Edite
T_NomCli_Best<==
T_NomCli_TabBest(T_IndBest)
RIEN
Positionnementpremier poste
de la table
Tant que l'on n'a pas traité les 10 postes
T_AdrCli_Best<==
T_AdrCli_TabBest(T_IndBest)
Titre_Best
Ecrire S_Best<==
T_LgnCli_Best
T_IndBest<==
t_IndBest + 1
Ecriture d'un poste
COBOL des enregistrement des fichiers en entrée et des différentes tables de l’algorithme
7 8 12 73
DATA DIVISION.
FILE SECTION.
FD F_CLIENT.
1 E_Client.
2 E_NumCli_Client PIC X(5).
2 E_CodeTarif_Client PIC 9.
2 E_Nom_Client PIC X (20).
2 E_Adresse_Client PIC X(30).
2 E_CumulMt_Client PIC ç(8)V99.
FD F_CLIENT
1 E_Mvt.
2 E_Type_Mvt PIC X.
2 E_Numcli_Mvt PIC X(5).
2 E_CodMaj_Mvt PIC X.
2 PIC X(50).
1 T_TyP0_Mvt.
2 T_NumTyp0_Mvt PIC X.
2 T_Numcli0_Mvt PIC X(5).
2 T_CodMaj_Mvt PIC X.
2 T_NomCli_Mvt PIC X(20).
2 T_AdrCli_Mvt PIC X(30).
1 T_TyP1_Mvt.
2 T_NumTyp1_Mvt PIC X.
2 T_Numcli1_Mvt PIC X(5).
2 PIC X.
2 T_Produit_Mvt OCCURS 10.
3 T_CodProd_Mvt PIC 9(30).
3 T_Qte_Mvt PIC99.
7 8 12 73
WORKING-STORAGE SECTION.
1 T_Produits.
2 T_NivProd OCCURS 30.
3 T_PU PIC 999V99 OCCURS 2.
1 T_TabBest.
2 T_Poste_TabBest OCCURS 10.
3 T_CumMt_TabBest PIC 9(8)V99.
3 T_NomCli_TabBest PIC X (20).
3 T_AdrCli_TabBest PIC X (30).
1 T_ZoneMois.
2 PIC X(9) VALUE “Janvier”.
2 PIC X(9) VALUE “Février”.
2 PIC X(9) VALUE “Mars”.
2 PIC X(9) VALUE “Avril”.
2 PIC X(9) VALUE “Mai”.
2 PIC X(9) VALUE “Juin”.
2 PIC X(9) VALUE “Juillet”.
2 PIC X(9) VALUE “Aout”.
2 PIC X(9) VALUE “Septembre”.
2 PIC X(9) VALUE “Octobre”.
2 PIC X(9) VALUE “Novembre”.
2 PIC X(9) VALUE “Décembre”.
1 T_TabMois REDEFINES T_ZoneMois.
2 T_Libel_Mois PIC X(9) OCCURS 12.
Remarques sur le COBOL.
Le fichier F_MVT comporte plusieurs enregistrements, nous aurions pu dans le COBOL décrire ces différents enregistrements dans la WORKING-STORAGE SECTION sous forme de zones de travail comme dans le pseudo code.
Le langage COBOL permet de déclarer plusieurs images de la zone de communication associée à un fichier, pour désigner ce genre de description on utilise le terme de REDEFINES implicite, alors que pour la table des mois on effectue un REDEFINES explicite.