Question

J'ai bats ma tête contre cela, et je suis sûr que je manque juste quelque chose d'évident, mais ...

J'ai une table dans la base de données d'un client, ce qui est essentiellement:

Item_Set_Key int
Item_1       bit
Notes_1      nvarchar(80)
Item_2       bit
Notes_2      nvarchar(80)
Item_3       bit
Notes_3      nvarchar(80)
...

Il y a 99 articles dans chaque enregistrement, et aucun changement de schéma n'est pas une option (d'autres considérations externes impliqués).

Cependant, pour l'afficher en quoi que ce soit à distance qui ressemble à l'intelligence à l'utilisateur, nous devons UNPIVOT (via une vue) comme ceci:

SELECT i.Item_Set_Key, i.Item_Number, i.Selected, i.Item, i2.Notes, i2.Note
FROM (
SELECT Item_Set_Key, SUBSTRING (Item, 6, 2) AS Item_Number, Selected, Item
    FROM Item_Set
    UNPIVOT (Selected FOR Item IN
        (Item_1, Item_2, Item_3, Item_4, Item_5, ...)
    ) as u
) AS i
LEFT JOIN (
SELECT Item_Set_Key, SUBSTRING (Note, 7, 2) AS Item_Number, Notes
    FROM Item_Set
    UNPIVOT (Notes FOR Note IN
        (Notes_1, Notes_2, Notes_3, Notes_4, Notes_5, ...)
    ) as n
) AS i2 ON i2.Item_Set_Key = i.Item_Set_Key
    AND i2.Item_Number = i.Item_Number

Je fais la liaison standard que pour la grille. Cependant, je suis quelque chose d'une perte à la façon de construire UpdateCommand pour cela, parce que le texte devrait nommer explicitement la colonne dans le SET, mais les noms de colonnes sont dynamiques dans les colonnes de l'objet et de note, et je peux « t vient de mettre toutes les colonnes, car chaque enregistrement aurait seulement des données pour un élément / paire de note.

Idées?

Était-ce utile?

La solution

Vous ne pourrez pas compter sur des données de liaison pour envoyer les modifications à la base de données dans la table pivotante originale. Au lieu de cela, vous devez saisir chaque mise à jour en une seule « unité de travail ». Par exemple, l'article id = 92, value = "Tom". Peut-être que précédemment la valeur de l'article 92 était « Joe ». ici Votre unité de travail est de changer la valeur de l'article 92.

Lorsque l'utilisateur effectue des modifications via l'interface utilisateur, vous pouvez chaque lot ensemble UOW et les tenir à jusqu'à ce qu'ils soient prêts à cliquer sur Enregistrer. Lorsque l'utilisateur demande la sauvegarde, chaque UOW capturé est « joué » contre la base de données. Recherche autour du motif « de commande » et / ou certains des articles de Jeremy Miller.

Une autre idée est que vous avez dit que vous ne pouvez pas changer le schéma, mais peut-être vous pouvez vraiment. Envisager la création d'une véritable table qui est dans le format non pivotée. Remplacez ensuite la table en cours en vue qui utilise la commande PIVOT. En effet, vous stockez les données dans une meilleure conception, mais pour l'application existante, vous pivotent en arrière. Cela pourrait fonctionner à moins que vous devez faire des mises à jour alors qu'il est dans la conception pivotante.

La dernière option est que vous pouvez simplement maintenir deux tables physiques, puis d'écrire une opération de fusion complexe pour les synchroniser périodiquement.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top