OVH Cloud OVH Cloud

Champs nombreux (tableau)

4 réponses
Avatar
YannX
Bonsoir,

Je crois connaitre la réponse (négative) !
Mais au cas où mon ignorance serait crasse ...... ;-)

Peut-on déclarer un champ indicé (au sens d'un Array), dans une base Access
?

J'explicite : je voudrais stocker dans un enregistrement de table Access,
avec une clé composite (multi-champs) un nombre certain de valeurs
numériques
(un vecteur mathématique de longueur N ).
N étant actuellement défini à 10, mais sans doute plus tard à 20, 35
ou......

Comment nommer les champs, ou les déclarer de façon à y accéder par une
boucle ?

Les deux seuls "walk-around" que je vois sont :

1°/ utiliser le principe de normalisation d'une BdD pour générer
une boucle d'enregistrements rajoutant à la clé composite,
un champ supplémentaire correspondant à l'indice :
garanti, aux performances près.......et pbs. de mise à jour !

2°/ définir les champs nommés en "val1", "val2", "val3"........
et programmer une boucle en lecture et une boucle en écriture,
qui recompose le nom de champ dans l'instruction RecordSet("val"&i)
/syntaxe correcte ? / avec une borne définie en constante...

Avez-vous de meilleures solutions à me suggérer ?
Merci de vos avis "circonstanciés" !
après nuit portant conseil


YannX

4 réponses

Avatar
Daniel Carollo
Bonsoir Yann!

Il faudrait voir quelle sera l'utilisation finale, mais une des facons de
faire serait de definir une classe (dans un module de classe) qui definit un
vecteur comme etant une collection de valeurs.

Cela aurait plusieurs avantage: le code qui fait l'implementation des
fonctions de stockage et de lecture des variables est independant du reste
du code. Le jours ou vous mettez le stockage des vecteurs sur un vrai
serveur de donnees, il sera possible de faire une implementation du stockage
completement differente, tout en gardant le reste du code sans changement.

Le vecteur etant une collection, on pourrait envisager autant d'elements que
necessaire...

Pour ce qui est du stockage physique des donnees, il me semble en effet
naturel d'avoir une table avec trois colonnes : l'index du vecteur, l'index
de la dimension, et sa valeur... Il faudra voir s'il est possible d'obtenir
des temps de reponse acceptables pour ce scenario.

Une autre technique possible serait de generer une valeur de donnees unique
pour un vecteur, peut-etre a l'aide d'une fonction implementee dans une DLL
externe, cette valeur unique serait alors stockee dans un champ de type
approprie dans la table principale.

J'espere que ca vous donne des idees.

--
Daniel :-)

Computing Technologies International - www.computing-tech.com - We
provide solutions...

"YannX" wrote in message
news:
Bonsoir,

Je crois connaitre la réponse (négative) !
Mais au cas où mon ignorance serait crasse ...... ;-)

Peut-on déclarer un champ indicé (au sens d'un Array), dans une base
Access

?

J'explicite : je voudrais stocker dans un enregistrement de table Access,
avec une clé composite (multi-champs) un nombre certain de valeurs
numériques
(un vecteur mathématique de longueur N ).
N étant actuellement défini à 10, mais sans doute plus tard à 20, 35
ou......

Comment nommer les champs, ou les déclarer de façon à y accéder par une
boucle ?

Les deux seuls "walk-around" que je vois sont :

1°/ utiliser le principe de normalisation d'une BdD pour générer
une boucle d'enregistrements rajoutant à la clé composite,
un champ supplémentaire correspondant à l'indice :
garanti, aux performances près.......et pbs. de mise à jour !

2°/ définir les champs nommés en "val1", "val2", "val3"........
et programmer une boucle en lecture et une boucle en écriture,
qui recompose le nom de champ dans l'instruction RecordSet("val"&i)
/syntaxe correcte ? / avec une borne définie en constante...

Avez-vous de meilleures solutions à me suggérer ?
Merci de vos avis "circonstanciés" !
après nuit portant conseil


YannX






Avatar
YannX
Bnsr,

Merci pour ces idées : la notion de collection est une excellente idée
pour l'utilisation au sein d'une classe OK !

"Daniel Carollo" a écrit dans le
message de
faire serait de definir une classe (dans un module de classe) qui definit
un

vecteur comme etant une collection de valeurs.
OK

Le vecteur etant une collection, on pourrait envisager autant d'elements
que

necessaire...

Pour ce qui est du stockage physique des donnees, il me semble en effet
naturel d'avoir une table avec trois colonnes : l'index du vecteur,
l'index

de la dimension, et sa valeur... Il faudra voir s'il est possible
d'obtenir

des temps de reponse acceptables pour ce scenario.
etant donné qu'il s'agit alors d'une requete SQL pré-indexée,

le Dynaset doit etre automatiquement lu-effacé-écrit !
(avec nouvelle DMAJ !)

Une autre technique possible serait de generer une valeur de donnees
unique

pour un vecteur, peut-etre a l'aide d'une fonction implementee dans une
DLL

externe, cette valeur unique serait alors stockee dans un champ de type
Un champ binaire.........à réflechir !


J'espere que ca vous donne des idees.
Tout a fait !


Merci Daniel

Du coup, je vais lire ton site.....
Computing Technologies International - www.computing-tech.com - We
provide solutions...

"YannX" wrote in message
news:
Bonsoir,

Je crois connaitre la réponse (négative) !
Mais au cas où mon ignorance serait crasse ...... ;-)

Peut-on déclarer un champ indicé (au sens d'un Array), dans une base
Access

?

J'explicite : je voudrais stocker dans un enregistrement de table
Access,


avec une clé composite (multi-champs) un nombre certain de valeurs
numériques
(un vecteur mathématique de longueur N ).
N étant actuellement défini à 10, mais sans doute plus tard à 20, 35
ou......

Comment nommer les champs, ou les déclarer de façon à y accéder par une
boucle ?

Les deux seuls "walk-around" que je vois sont :

1°/ utiliser le principe de normalisation d'une BdD pour générer
une boucle d'enregistrements rajoutant à la clé composite,
un champ supplémentaire correspondant à l'indice :
garanti, aux performances près.......et pbs. de mise à jour !

2°/ définir les champs nommés en "val1", "val2", "val3"........
et programmer une boucle en lecture et une boucle en écriture,
qui recompose le nom de champ dans l'instruction RecordSet("val"&i)
/syntaxe correcte ? / avec une borne définie en constante...

Avez-vous de meilleures solutions à me suggérer ?
Merci de vos avis "circonstanciés" !
après nuit portant conseil


YannX










Avatar
Clive Lumb
"YannX" a écrit dans le message de
news:
Bonsoir,

Je crois connaitre la réponse (négative) !
Mais au cas où mon ignorance serait crasse ...... ;-)

Peut-on déclarer un champ indicé (au sens d'un Array), dans une base
Access

?

J'explicite : je voudrais stocker dans un enregistrement de table Access,
avec une clé composite (multi-champs) un nombre certain de valeurs
numériques
(un vecteur mathématique de longueur N ).
N étant actuellement défini à 10, mais sans doute plus tard à 20, 35
ou......

Comment nommer les champs, ou les déclarer de façon à y accéder par une
boucle ?

Les deux seuls "walk-around" que je vois sont :

1°/ utiliser le principe de normalisation d'une BdD pour générer
une boucle d'enregistrements rajoutant à la clé composite,
un champ supplémentaire correspondant à l'indice :
garanti, aux performances près.......et pbs. de mise à jour !

2°/ définir les champs nommés en "val1", "val2", "val3"........
et programmer une boucle en lecture et une boucle en écriture,
qui recompose le nom de champ dans l'instruction RecordSet("val"&i)
/syntaxe correcte ? / avec une borne définie en constante...

Avez-vous de meilleures solutions à me suggérer ?
Merci de vos avis "circonstanciés" !
après nuit portant conseil


YannX


Hello YannX,

Personellement je le ferais par la manière purement "base de données", à
savoir :
Une table d'enregistrements principale avec une clé "compteur" (ou autre
chose unique) ainsi que les autres champs nécessaires
Une table pour les valeurs avec une clé compteur, un champ qui correspond à
la clé unique de la table principale et un champ "Valeur".

Ensuite on utilise ADO SHAPE pour lier les deux tableaux.
Maintenant tu disposes d'un recordset de la table principale dont un des
champs contient le recordset de la table des valeurs correspondants à
l'enregistrement en cours.
Voir http://support.microsoft.com/kb/q189657/ pour des exemples de code dont
ceci:

Simple Relation Hierarchy:
SHAPE {select * from customers}
APPEND ({select * from orders} AS rsOrders
RELATE customerid TO customerid)
which yields:
Customers.*
rsOrders
|
+----Orders.*
In the previous diagram, the parent recordset contains all fields from
the Customers table and a field called rsOrders. rsOrders provides a
reference to the child recordset, and contains all the fields from the
Orders table. The other examples use a similar notation.

Clive

Avatar
YannX
Bonjour Clive,

Merci pour cet avis qui me confirme.....mais aussi !
et c'est bien mieux, m'informe de ADO SHAPE !
Grâce à ta citation j'imagine déjà meiux ce que
cette construction peut apporter,
et je vais me r enseigner.

Merci pour cette piste
YannX
"Clive Lumb" a écrit dans le message
de news:

"YannX" a écrit dans le message de
news:
Bonsoir,

Je crois connaitre la réponse (négative) !
Mais au cas où mon ignorance serait crasse ...... ;-)

Peut-on déclarer un champ indicé (au sens d'un Array), dans une base
Access

?

J'explicite : je voudrais stocker dans un enregistrement de table
Access,


avec une clé composite (multi-champs) un nombre certain de valeurs
numériques
(un vecteur mathématique de longueur N ).
N étant actuellement défini à 10, mais sans doute plus tard à 20, 35
ou......

Comment nommer les champs, ou les déclarer de façon à y accéder par une
boucle ?

Les deux seuls "walk-around" que je vois sont :

1°/ utiliser le principe de normalisation d'une BdD pour générer
une boucle d'enregistrements rajoutant à la clé composite,
un champ supplémentaire correspondant à l'indice :
garanti, aux performances près.......et pbs. de mise à jour !

2°/ définir les champs nommés en "val1", "val2", "val3"........
et programmer une boucle en lecture et une boucle en écriture,
qui recompose le nom de champ dans l'instruction RecordSet("val"&i)
/syntaxe correcte ? / avec une borne définie en constante...

Avez-vous de meilleures solutions à me suggérer ?
Merci de vos avis "circonstanciés" !
après nuit portant conseil


YannX


Hello YannX,

Personellement je le ferais par la manière purement "base de données", à
savoir :
Une table d'enregistrements principale avec une clé "compteur" (ou autre
chose unique) ainsi que les autres champs nécessaires
Une table pour les valeurs avec une clé compteur, un champ qui correspond
à

la clé unique de la table principale et un champ "Valeur".

Ensuite on utilise ADO SHAPE pour lier les deux tableaux.
Maintenant tu disposes d'un recordset de la table principale dont un des
champs contient le recordset de la table des valeurs correspondants à
l'enregistrement en cours.
Voir http://support.microsoft.com/kb/q189657/ pour des exemples de code
dont

ceci:

Simple Relation Hierarchy:
SHAPE {select * from customers}
APPEND ({select * from orders} AS rsOrders
RELATE customerid TO customerid)
which yields:
Customers.*
rsOrders
|
+----Orders.*
In the previous diagram, the parent recordset contains all fields from
the Customers table and a field called rsOrders. rsOrders provides a
reference to the child recordset, and contains all the fields from the
Orders table. The other examples use a similar notation.

Clive