forum Ancestrologie
Ancestrologie - Plugins et Outils => BOA => Discussion démarrée par: Horemans le 08 Septembre 2005 à 13:13:02
-
je voudrais harmoniser la casse des extensions de fichiers media dans la table "MULTIMEDIA" colonne MULTI_PATH.
Je ne sais pas faire un update pour modifier la fin d'une chaine de caractère.
Si c'est possible, j'aimerai avoir la solution
-
Sous Oracle, on ferait :
update MULTIMEDIA
set MULTI_PATH = concat(concat(substr(MULTI_PATH,1,instr(upper(MULTI_PATH),'.JPG',1,1)-1),'.jpg'),substr(MULTI_PATH,instr(upper(MULTI_PATH),'.JPG',1,1)+length('.JPG'),length(MULTI_PATH)))
Cela te donnera une piste...
A noter que la concaténation sous firebird se fait par ||
Vérifie donc la syntaxe de substr et la commande équivalente à instr
-
Trop complexe pour moi, INSTR et SUBSTR ne sont pas reconnus, encore moins LENGTH.
Que se passerait-il, quelles seraient les conséquences dans Ancestrologie si je transforme la colonne MULTI_PATH tout en minuscules par
update multimedia set multi_path = lower(multi_path)
Des avis ?
-
Sous Firebird, çà devrait être:
update MULTIMEDIA
set MULTI_PATH=SUBSTR ( MULTI_PATH , 1 , STRLEN ( MULTI_PATH )-3)
||LOWER ( SUBSTR ( MULTI_PATH , STRLEN ( MULTI_PATH ) -2 , STRLEN ( MULTI_PATH )))
seulement voilà,çà ne marche pas. Les fonctions SUBSTR, STRLEN, LOWER sont bien déclarées dans la base comme fonctions externes (venant de ib_udf), mais en les déclarant, PCM a limité à 80 caractères les fonctions SUBSTR et LOWER, alors qu'elles pourraient en admettre jusqu'à 32767, et que le champ MULTI_PATH en fait 255.
Galère pour modifier les déclarations, car il faudrait d'abord modifier toutes les procédures qui les utilisent. Autant repartir des métadatas pour recréer une nouvelle base vide. Mais de toute façon pas à la portée des utilisateurs.
Pour aujourd'hui, il est plus simple d'utiliser IBEasy+ ou IBOconsole.
A+
André
PS, la dernière proposition de HOREMANS ne marche pas non plus à cause du LOWER
-
J'y arrive en 5 requêtes successives:
DECLARE EXTERNAL FUNCTION LOWER2
CSTRING(255) CHARACTER SET ISO8859_1
RETURNS CSTRING(255) CHARACTER SET ISO8859_1 FREE_IT
ENTRY_POINT 'IB_UDF_lower' MODULE_NAME 'ib_udf';
DECLARE EXTERNAL FUNCTION SUBSTR2
CSTRING(255) CHARACTER SET ISO8859_1, SMALLINT, SMALLINT
RETURNS CSTRING(255) CHARACTER SET ISO8859_1 FREE_IT
ENTRY_POINT 'IB_UDF_substr' MODULE_NAME 'ib_udf';
update MULTIMEDIA
set MULTI_PATH=SUBSTR2 ( MULTI_PATH , 1 , STRLEN ( MULTI_PATH )-3)
||LOWER2 ( SUBSTR2 ( MULTI_PATH , STRLEN ( MULTI_PATH ) -2 , STRLEN ( MULTI_PATH )));
DROP EXTERNAL FUNCTION LOWER2;
DROP EXTERNAL FUNCTION SUBSTR2;
Dans le BOA, il faut les exécuter une par une, et à la fin de chacune il y a une erreur (lecture adresse 000...) non bloquante. Avec IBOconsole je les fais toutes ensembles (Auto Commit activé).
Les 2 premières requêtes ont pour but de créer des fonctions LOWER2 et SUBSTR2 identiques aux LOWER et SUBSTR existantes mais capables de travailler sur des chaînes de 255 caractères :evil:
La troisième met en minuscules les 3 derniers caractères du champ MULTI_PATH.
Les 2 dernières suppriment les 2 fonctions LOWER2 et SUBSTR2, mais je ne pense pas qu'il y ait d'inconvénients à garder ces fonctions pour une utilisation ultérieure, bien que je préfèrerai que les LOWER et SUBSTR actuelles soient modifiées.
Pour ceux qui seraient tentés par l'expérience, n'oubliez pas la sauvegarde préalable de la base.
A+
André
PS: réédition du 01/02/2006: A partir de la version b4.04 de la base, les fontions externes de chaîne de caractères supportent jusqu'à 255 caractères. Il n'est donc plus nécessaire de créer les fonctions avec le "2".
-
çà marche !
La mémoire de Lau :D était bonne, mais il manquait les instructions pour le faire. Faute de passer par la porte, André est passé par la fenêtre !
j'obtiens des violation à chaque lancement, mais au final, les JPG sont devenus jpg.
Je conserve précieusement ces requêtes, car je ne doute pas d'en avoir encore l'usage..... jusqu'à ce qu'Ancestrologie ou Créationweb se chargent de la question.
Bravo et Merci :D