2009-05-28 8 views
3

Je travaille avec un produit vb6 hérité et j'ai rencontré un problème pour lequel je devais obtenir le nom de fichier d'un chemin complet à partir d'une table de base de données via DAO. Je n'ai pas accès aux fonctions VBA ici, donc je recherche spécifiquement MS Access SQL. Je n'ai aucun moyen de déposer du code supplémentaire après la requête. I NE PEUT PAS modifier/refactoriser la solution à court de modifier le SQL.Problème de manipulation de chaînes DAO maladroit

Maintenant, DAO n'a aucune fonctionnalité instrrev ou replace donc je suis assez limité.

Un doute? Merci d'avance.

Répondre

2

En supposant que vous ne pouvez pas modifier la base de données actuelle. . . La seule chose à laquelle je peux penser (et je me suis fait avoir par les cerveaux sur celui-ci, désolé compagnon) est d'utiliser des appels répétés à instr, imbriqués dans des déclarations iif par exemple. pour remplacer cet appel à instrrev

SELECT IIf(InStr([FileName],""\"")>0,Mid$([Filename],InStrRev([Filename],""\"")+1),[Filename]) FROM Table1 

Vous auriez un fou compeltely

SELECT IIf(InStr([FileName],""\"")>0,Mid$([Filename],iif(InStr(1, [FileName], ""\"") > 0, iif(InStr(2, [FileName], ""\"") > 0, iif(InStr(3, [FileName], ""\"") > 0, iif(InStr(4, [FileName], ""\"") > 0, iif(InStr(5, [FileName], ""\"") > 0, iif(InStr(6, [FileName], ""\"") > 0, iif(InStr(7, [FileName], ""\"") > 0, iif(InStr(8, [FileName], ""\"") > 0, iif(InStr(9, [FileName], ""\"") > 0, 1, InStr(9, [FileName], ""\"")), InStr(8, [FileName], ""\"")), InStr(7, [FileName], ""\"")), InStr(6, [FileName], ""\"")), InStr(5, [FileName], ""\"")), InStr(4, [FileName], ""\"")), InStr(3, [FileName], ""\"")), InStr(2, [FileName], ""\"")), InStr(1, [FileName], ""\""))),[Filename]) from table1 

Cela fonctionne pour un chemin des thats 10 ou si des sous-dossiers en profondeur. Si vous pensez que 10 sous-dossiers sont trop petits, j'ai un peu de vba pour générer la déclaration à quelle profondeur vous avez besoin.

Il est obscène, mais devrait fonctionner

+0

lol. Oui, obscène est le mot. Si je pouvais vous donner plus de 1+ je voudrais juste avoir la constitution pour écrire ça! J'avais considéré cela comme une solution, mais ce n'est qu'un non-sens. Tout cela a fini par être considéré comme un changement de code pour une version de Service Pack maintenant, donc nous n'avons pas besoin de faire ce genre de chose. Bon travail si mec. – Stimul8d

+0

Merci pour ça! J'ai été dans des positions où une abomination comme ci-dessus est la seule solution ou quand une solution est nécessaire pour quelque chose dès maintenant. Je suis content que ces IIf imbriqués ne verront jamais la lumière du jour. Bonne chance –

+0

@Binary Worrier: Ma première intuition était aussi d'écrire un ensemble de IIf() imbriqués et de leur substituer InStrRev(). Mais j'ai rejeté l'idée d'être si laide et limitée. +1 pour l'effort pur de votre part. :RÉ – Tomalak

0

que je faisais beaucoup de programmation DAO, mais qui était il y a quelques années 10-15 ...

Pouvez-vous changer le DAO pour appeler un accès QueryDef puis fixer là-bas?

+0

homme Désolé, pas de dés. J'ai le même problème en utilisant QueryDefs. Bien essayé. – Stimul8d

+0

Comment est-ce possible? Cela fait un moment mais je suis certain que QueryDefs peut utiliser les fonctions Access Basic. – RBarryYoung

2

Vous devriez pouvoir utiliser les fonctions de vba intégré comme instr, replace, mid, etc.

Il y a un mode « bac à sable » qui peut les bloquer - voir ceci sur la façon de les débloquer http://support.microsoft.com/kb/294698

+0

Bien essayé mais je cours sous NetworkService donc je n'ai pas d'autorisations sur le registre et c'est un problème de support donc je ne peux rien faire dans InstallShield à ce stade. Bon appel cependant. – Stimul8d