2010-10-19 5 views
1

D'accord, j'ai deux tables dans ma base de données Access 2007 (bien, plus que cela, mais la question s'applique à ces deux ...):Alias ​​une légende dans Access 2007

part 
    part_no 
    ... 
    supplier_id 
    special_supplier_id 
    ... 

Et

supplier 
    supplier_id 
    supplier_nm  (NB: Caption="Supplier Name") 
    special_supplier_flg 

maintenant, j'ai construit une requête:

SELECT p.part_no, s.supplier_nm, ss.supplier_nm AS special_supplier_nm 
FROM 
    part AS p INNER JOIN 
    supplier AS s ON p.supplier_id = s.supplier_id INNER JOIN 
    supplier AS ss on p.supplier_id = ss.supplier_id 

Tout va bien, et il semble fonctionner pour la sélection simple (s'il y a des erreurs dans la requête elle-même, c'est un artefact de retaper pour la question, et pas ce que la question est sur), et devrait fonctionner aussi bien pour les applications de code. Le problème, cependant, est que si j'ouvre l'affichage de la feuille de données de la requête, les deux champs de nom sont étiquetés "Nom du fournisseur". Y at-il un moyen de contourner cela?

Répondre

2

Essayez ceci:

SELECT p.part_no, s.supplier_nm, (ss.supplier_nm + '') AS special_supplier_nm. . . 

Toutefois, si vous utilisez le générateur de requêtes, vous devrez peut-être prudent de ne pas construire la requête avec l'alias "par défaut" (de la légende) d'abord, parce que cela semble rester dans certaines métadonnées non visibles. En outre, si vous pouvez modifier cette requête dans le générateur de requête Access, si vous cliquez avec le bouton droit sur le champ en question, il y a une option pour définir la propriété de légende dans la requête, et cela annulera la légende colonne de table.

+0

Cette dérogation a fait l'affaire - exactement ce que je voulais. – RolandTumble

0

Avez-vous des légendes dans la définition de votre table? Ces définitions montreront à la place de ce que vous alias. Puisque vous sélectionnez une colonne qui aura la même légende (sans alias), vous verrez la même légende pour les deux dans la vue de la feuille de données.

Avez-vous la possibilité de modifier le champ de légende? Le laisser vide utilisera son nom donné (ou alias dans le cas d'une vue)

+0

Oui, je parle d'un ensemble de légendes dans la définition de la table, et j'ai observé exactement le comportement que vous décrivez (je l'ai fait vide pendant un certain temps). Ce n'est pas vraiment un gros problème, car je ne montrerai presque jamais la fiche technique aux utilisateurs et je pourrai redéfinir l'étiquette sur Forms & Reports. J'espérais juste un moyen de le faire dans le cadre de la définition de la requête. Merci d'avoir pris le temps de répondre (j'accepterai si personne ne m'en donne un meilleur demain). – RolandTumble

3

Je vois la même chose avec Access 2003 même pour une requête à table unique ... si le champ source a une légende assignée, La légende est utilisée comme en-tête de colonne dans la vue de la feuille de données de la requête, que je lui attribue ou non un alias dans la définition de la requête.

Outre la suppression de la légende de la définition de la table source, la seule façon de contourner ce problème était de réattribuer manuellement la propriété Caption du champ à VBA. Query1 comprend un champ id nom qui a « Foo ID » comme sa légende dans la table source:

CurrentDb.QueryDefs("Query1").Fields("id").Properties("Caption") = "foo_id" 

Cette commande a causé la vue fiche requête à utiliser foo_id comme l'en-tête de colonne.

Si vous affectez un alias à un champ de requête, cet alias est utilisé comme nom dans la collection Fields de la requête. Vous pouvez examiner votre noms de champ de requête et leurs légendes avec cette procédure:

Public Sub InspectQueryFieldCaptions(ByVal pQuery As String) 
    Dim fld As DAO.Field 
    Dim strMsg As String 

On Error GoTo ErrorHandler 

    For Each fld In CurrentDb.QueryDefs(pQuery).Fields 
     Debug.Print "Field: " & fld.Name, "Caption: " & fld.Properties("Caption") 
    Next fld 

ExitHere: 
    Set fld = Nothing 
    On Error GoTo 0 
    Exit Sub 

ErrorHandler: 
    Select Case Err.Number 
    Case 3270 ' Property not found. ' 
     Debug.Print "Field: " & fld.Name, "no caption" 
     Resume Next 
    Case Else 
     strMsg = "Error " & Err.Number & " (" & Err.Description _ 
      & ") in procedure InspectQueryFieldCaptions" 
     MsgBox strMsg 
     GoTo ExitHere 
    End Select 
End Sub 
+0

Je vais certainement y jeter un coup d'oeil, mais la réponse de Larry était exactement ce que je cherchais quand j'ai posé la question. – RolandTumble

+0

Oui, Larry est définitivement plus pratique. Si vous explorez ce sujet, regardez 'fld.Properties (" Caption "). Inherited' ... qui m'a aidé à mieux comprendre le fonctionnement de l'ensemble de l'activité Caption. – HansUp

0

Contournement QUI FONCTIONNE

OK celui-ci a été me rend dingue parce que je utilise beaucoup de données à partir de tables liées (importées) de financement de notre entreprise, les systèmes RH et CRM tous mis en place par le même développeur qui Le sous-titrage pensé chaque Index "ID:" était une bonne idée. mais quand vous avez une agrégation qui amène plusieurs d'entre eux ensemble, vous obtenez une grosse erreur causée par le désordre parce que la requête suivante ne peut pas déterminer quel "ID:" est lequel. Il est ma solution:

Plutôt que de passer simplement les valeurs, qui passe simplement la légende: Si le champ que vous voulez re-légender est un champ de valeur, il suffit de le ré-étiqueter et de le multiplier par 1 comme ce mon champ per_id est sous-titré ID :):

Perid: 1*[pe_id] 

il en résulte un nouveau champ intitulé Perid

Si elle est un champ de texte juste concaténer avec rien comme ceci:

Perid: ""&[fname] 

Cela fonctionne.