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é 9098 fois
Niveau
débutant
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 = NOTType('m.ta[1]') == 'U' ASSERT m.llResult MESSAGEProgram() + " : 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é IFVartype(m.tnColBef) == 'N'
m.llResult = m.tnColBef > 0 AND m.tnColBef <= m.lnCols ASSERT m.llResult MESSAGEProgram() + " : 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 LOCALARRAYla[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 DIMENSIONta[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) LOCALARRAY m.laTest[1] LOCAL lnSeconds