ATOUTFOX
COMMUNAUTÉ FRANCOPHONE DES PROFESSIONNELS FOXPRO
Visual FoxPro : le développement durable

aColsIns () - Insère physiquement une ou plusieurs colonne(s) dans un tableau   



L'auteur

FoxInCloud (Th. Nivelet)
France France
Membre Simple
# 0000000014
enregistré le 13/10/2004

http://www.foxincloud.com/
Nivelet Thierry
75016 Paris
de la société Abaque
Fiche personnelle


Note des membres
pas de note

Contributions > 01 - PRG : Programmation

aColsIns () - Insère physiquement une ou plusieurs colonne(s) dans un tableau
# 0000000152
ajouté le 26/02/2005 15:50:21 et modifié le 26/02/2005
consulté 4399 fois
Niveau débutant

Version(s) Foxpro :
VFP 9.0
VFP 8.0
VFP 7.0
VFP 6.0
VFP 5.0
VFP 3.0

Description

La gestion des tableaux dans Visual FoxPro est puissante mais délicate.

aColsIns() insère physiquement une ou plusieurs colonnes dans un tableau existant, comme si on insérait des champs dans une table.

Attention à bien passer le tableau par référence !

Exemple d'appel pour insérer 3 colonnes après la colonne n° 2 :

aColsIns(@m.laTest, 2, 3) && m.laTest est passé par référence

aColsIns() signale les paramètres erronés par ASSERT ; ceci fonctionne seulement si SET ASSERT ON !

Retour analogue aux fonctions tableau de VFP :

  • tableau non passé : 0
  • n° de colonne invalide : nombre de colonnes du tableau source
  • sinon : nombre de colonnes du tableau transformé
Code source :
  *===================================================================
  FUNCTION aColsIns && Insère physiquement une ou plusieurs colonne(s) dans un tableau
  LPARAMETERS ;
    ta,; && @ tableau résultat
    tnColBef,; && [dernière] n° de la colonne AVANT la(es) nouvelle(s) colonne(s)
    tnColsIns && [1] Nombre de colonnes à insérer
  LOCAL lnResult && Nombre de colonnes après l'insersion
  m.lnResult = 0

  * Si un tableau a été passé
  LOCAL llResult
  m.llResult = NOT Type('m.ta[1]') == 'U'
  ASSERT m.llResult MESSAGE Program() + " : le premier paramètre doit être un tableau passé par référence @"
  IF m.llResult

    * Si tableau à une dim.
    LOCAL lnRows, lnCols, lnColBef
    m.lnRows = Alen(m.ta, 1)
    m.lnCols = Alen(m.ta, 2)
    IF m.lnCols = 0

      * Convertir à 2 dimensions
      STORE 1 TO m.lnCols, m.lnColBef
      DIMENSION m.ta[m.lnRows, m.lnCols]

    * Sinon (tableau à 2 dim.)
    ELSE

      * Vérifier la validité du n° de colonne passé
      IF Vartype(m.tnColBef) == 'N'
        m.llResult = m.tnColBef > 0 AND m.tnColBef <= m.lnCols
        ASSERT m.llResult MESSAGE Program() + " : le n° de colonne est hors des limites du tableau : " + Transform(m.tnColBef) +;
            Chr(13) + Chr(10) + "Aucune colonne insérée"
        m.lnColBef = m.tnColBef
      ELSE
        m.lnColBef = m.lnCols && après la dernière colonne
      ENDIF
    ENDIF
    m.lnResult = m.lnCols
  ENDIF

  IF m.llResult

    * Donner sa valeur par défaut au nombre de colonnes insérées
    LOCAL lnColsIns
    m.lnColsIns = Iif(Vartype(m.tnColsIns) == 'N' AND m.tnColsIns > 0, m.tnColsIns, 1)
    m.lnResult = m.lnCols + m.lnColsIns

    * Créer un tableau de travail
    LOCAL ARRAY la[m.lnRows, m.lnResult]

    * Remplir le tableau de travail avant la(es) nouvelle(s) colonne(s)
    LOCAL lnCol, lnRow
    FOR m.lnCol = 1 TO m.lnColBef
      FOR m.lnRow = 1 TO m.lnRows
        m.la[m.lnRow, m.lnCol] = m.ta[m.lnRow, m.lnCol]
      ENDFOR
    ENDFOR

    * Si la(es) nouvelle(s) colonne(s) sont insérées à l intérieur du tableau
    IF m.lnColBef < m.lnCols

      * Remplir le tableau de travail après la(es) nouvelle(s) colonne(s)
      FOR m.lnCol = m.lnColBef + 1 TO m.lnCols
        FOR m.lnRow = 1 TO m.lnRows
          m.la[m.lnRow, m.lnCol + m.lnColsIns] = m.ta[m.lnRow, m.lnCol]
        ENDFOR
      ENDFOR
    ENDIF

    * Copier le tableau de travail dans le tableau résultat
    DIMENSION ta[m.lnRows, m.lnResult]
    Acopy(m.la, m.ta) && contrairement à ce que dit la doc, ne dimensionne pas correctement ta
  ENDIF

  RETURN m.lnResult

  * --------------------------------------
  PROCEDURE aColsIns_Test && Teste aColsIns()
  ? Sys(16)
  LOCAL ARRAY m.laTest[1]
  LOCAL lnSeconds

  ?
  ? "Tableau à une dimension"
  DIMENSION m.laTest[3]
  m.laTest = .F.
  m.laTest[1] = 1
  m.laTest[2] = 2
  m.laTest[3] = 3
  m.lnSeconds = Seconds()
  ? aColsIns(@m.laTest, , 2) = 3
  ? "aColsIns() exécuté en", (Seconds()-m.lnSeconds)*1000, "millisecondes"

  ? m.laTest[1,1] = 1
  ? m.laTest[2,1] = 2
  ? m.laTest[3,1] = 3
  ? m.laTest[1,2] = .F.
  ? m.laTest[2,2] = .F.
  ? m.laTest[3,2] = .F.
  ? m.laTest[1,3] = .F.
  ? m.laTest[2,3] = .F.
  ? m.laTest[3,3] = .F.

  ?
  ? "Tableau à deux dimensions"
  DIMENSION m.laTest[2,3]
  m.laTest = .F.
  m.laTest[1,1] = 1
  m.laTest[2,1] = 2
  m.laTest[1,2] = 3
  m.laTest[2,2] = 4
  m.laTest[1,3] = 5
  m.laTest[2,3] = 6
  ? aColsIns(@m.laTest, , 2) = 5 && ajoute à la fin
  m.lnSeconds = Seconds()
  ? aColsIns(@m.laTest, 2) = 6 && ajoute à l'intérieur
  ? "aColsIns() exécuté en", (Seconds()-m.lnSeconds)*1000, "millisecondes"
  ? m.laTest[1,1] = 1
  ? m.laTest[2,1] = 2
  ? m.laTest[1,2] = 3
  ? m.laTest[2,2] = 4
  ? m.laTest[1,3] = .F.
  ? m.laTest[2,3] = .F.
  ? m.laTest[1,4] = 5
  ? m.laTest[2,4] = 6

Commentaires
Aucun commentaire enregistré ...

Publicité

Les pubs en cours :

www.atoutfox.org - Site de la Communauté Francophone des Professionnels FoxPro - v3.4.0 - © 2004-2018.
Cette page est générée par un composant COM+ développé en Visual FoxPro 9.0