2016-04-05 1 views
1

J'ai besoin de créer une longue liste de chaînes complexes, contenant les données de différents champs dans différents endroits pour créer des rapports explicatifs. La seule façon que j'ai conçue, dans Access 2010, est de sauvegarder des parties de texte dans une table, ainsi que les noms de champs à utiliser pour composer la chaîne à afficher (voir l'expression line1 dans la figure). En bref:Comment évaluer un nom de champ contenu dans un autre champ dans une requête Access?

//field A contain a string with a field name: 
A = "[Quantity]" 
//query expression: 
=EVAL(A) 
//return error instead the number contained in field [Quantity], present in the query dataset 

Je pensais faire un EVAL sur un terrain (A), pour obtenir la valeur du champ (B) dont le nom est contenu dans le champ A. Mais semble ne fonctionne pas. N'importe quelle façon existe?

Exemple (très simplifié): Sample query that EVAL a field containing other field names to obtain the value of the fields

Toute idée? PS: Désolé pour mon anglais, pas ma langue maternelle.

Répondre

1

J'ai trouvé une solution de contournement intéressante dans un autre forum. D'autres personnes ont rencontré le même problème lors de l'utilisation d'EVAL, mais ont trouvé qu'il était possible de remplacer une chaîne par un contenu de champ à l'aide de la fonction REPLACE.

REPLACE("The value of field Quantity is {Quantity}";"{Quantity}";[Quantity]) 

({} ne sont utilisés que pour plus de clarté, ne sont pas nécessaires si l'on sait que les mots à remplacer ne se comparent pas dans la chaîne). En utilisant ce code dans une requête, et l'imbrication autant REPLACE autant de champs différent à utiliser:

REPLACE(REPLACE("<Salutation> <Name>";"<Salutation>";[Salutation]);"<Name>";[Name]) 

il est possible d'intégrer le nom des champs dans une chaîne et les remplacer par la valeur actuelle de ce champ dans un question. Bien sûr, le dernier exemple peut être fait plus simplement avec une concaténation (&), mais si la chaîne est contenue dans un champ à la place de celui codé en dur, il peut être lié aux enregistrements si nécessaire.

REPLACE(REPLACE([DescriptiveString];"[Salutation]";[Salutation]);"[Name]";[Name]) 

De plus, il est possibile de créer des chaînes complexes selon le contexte que:

REPLACE(REPLACE(REPLACE("{Salutation} {Name} {MaidenName}";"{Salutation}";[Salutation]);"{Name}";[Name]);"{MaidenName}";IIF(Isnull([MaidenName]);"";[MaidenName])) 

La partie difficile est d'énumérer tout est le champ placeholders on veut insérer dans la chaîne (comme {Quantité} , {Salutation}, {Nom}, {MaidenName}) dans l'appel REPLACE, tandis qu'avec EVAL on éviterait cette partie ennuyeuse, si seulement cela fonctionnait.

Pas aussi propre que je le ferais, mais fonctionne.