Exemple de gestion de sous-fichier en SQL

 **FREE

// Programme: FOURN01R - Gestion liste des fournisseurs
// Description: Sous-fichier dynamique pour gérer les fournisseurs
// F6=Créer  Opt2=Modifier  Opt4=Supprimer

Ctl-Opt DftActGrp(*No) ActGrp(*Caller) Option(*SrcStmt:*NoDebugIO);

Dcl-F FOURN01D WorkStn Sfile(SFL:RRN) IndDs(Ind) UsrOpn;

// =========================================================================
// INCLUSION DES PROTOTYPES PARTAGÉS
// =========================================================================
/INCLUDE '/includes/prototypes.rpgleinc'

// Indicateurs
Dcl-Ds Ind;
  Fin Ind Pos(3);
  Refresh Ind Pos(5);
  Creer Ind Pos(6);
  Retour Ind Pos(12);
  SflDsp Ind Pos(91);
  SflDspCtl Ind Pos(92);
  SflClr Ind Pos(93);
  SflEnd Ind Pos(94);
End-Ds;

// Variables globales
Dcl-S RRN Zoned(4:0);
Dcl-S OldFiltre Char(30);
Dcl-S PageSize Int(10) Inz(15);
Dcl-S LastCode Int(10) Inz(0);
Dcl-S FinLecture Ind Inz(*Off);

// Variables SQL
Dcl-S SqlCode Int(10);
Dcl-S SqlState Char(5);

Exec SQL Set Option Commit = *None, CloSqlCsr = *EndMod;
Exec SQL Declare C1 Cursor For
  Select CODE, SOCIETE,
         Char(DATE_CREATION, ISO) as DATCRT,
         Char(DATE_MODIFICATION, ISO) as DATMAJ
  From FOURNISSEUR
  Where SUPPRESSION = '0'
    And (SOCIETE Like :Filtre Or :Filtre = ' ')
    And CODE > :LastCode
  Order By CODE
  Fetch First :PageSize Rows Only;

// Programme principal
Open FOURN01D;
OldFiltre = *Blanks;
Filtre = *Blanks;
ChargerSousfichier();

DoU Fin or Retour;
  Write FOOTER;
  ExFmt SFLCTL;
 
  If Fin or Retour;
    Leave;
  EndIf;
 
  // F6 = Créer un nouveau fournisseur
  If Creer;
    FOURN02R('C':0);
    ChargerSousfichier();
    Iter;
  EndIf;
 
  If Refresh or (Filtre <> OldFiltre);
    OldFiltre = Filtre;
    ChargerSousfichier();
    Iter;
  EndIf;
 
  TraiterOptions();
  ChargerSousfichier();
EndDo;

Close FOURN01D;
*InLr = *On;
Return;

// Procédure: Charger le sous-fichier
Dcl-Proc ChargerSousichier;
  SflClr = *On;
  SflDspCtl = *On;
  Write SFLCTL;
  SflClr = *Off;
 
  RRN = 0;
  LastCode = 0;
  FinLecture = *Off;
  SflEnd = *Off;
 
  Exec SQL Open C1;
 
  DoU FinLecture;
    Exec SQL Fetch C1 Into :CODE, :SOCIETE, :DATCRT, :DATMAJ;
   
    If SqlCode = 100 or SqlCode < 0;
      FinLecture = *On;
      SflEnd = *On;
      Leave;
    EndIf;
   
    RRN += 1;
    OPT = *Blanks;
    Write SFL;
    LastCode = CODE;
   
    If RRN >= PageSize;
      Leave;
    EndIf;
  EndDo;
 
  Exec SQL Close C1;
 
  If RRN > 0;
    SflDsp = *On;
  Else;
    SflDsp = *Off;
  EndIf;
 
  SflDspCtl = *On;
End-Proc;

// Procédure: Traiter les options du sous-fichier
Dcl-Proc TraiterOptions;
  Dcl-S i Zoned(4:0);
  Dcl-S Reponse Char(1);
  Dcl-S Message Char(50);
 
  For i = 1 To RRN;
    Chain i SFL;
   
    If %Found() and OPT <> *Blanks;
      Select;
        // Option 2 = Modifier
        When OPT = '2';
          FOURN02R('M':CODE);
          OPT = *Blanks;
          Update SFL;
         
        // Option 4 = Supprimer
        When OPT = '4';
          Message = 'Voulez-vous supprimer le fournisseur ' +
                    %Trim(SOCIETE) + ' ?';
          CONFIRMER(Message:Reponse);
         
          If Reponse = 'O';
            Exec SQL Update FOURNISSEUR
                     Set SUPPRESSION = '1',
                     DAT_MAJ = Current_Date
                     Where CODE = :CODE;
          EndIf;
         
          OPT = *Blanks;
          Update SFL;
         
        // Option 8 = Voir les produits
        When OPT = '8';
          PRODUIT1R(CODE);
          OPT = *Blanks;
          Update SFL;
         
        // Option invalide
        Other;
          OPT = *Blanks;
          Update SFL;
      EndSl;
    EndIf;
  EndFor;
End-Proc;

Commentaires

Articles les plus consultés