Utilisation de l'outil SQL pour générer un champs d'une table

Bonjour,
je souhaite mettre à jour automatiquement un champs d’une table avec la condition suivante:
Le champs “Code d’accès” est généré automatiquement avec les 6 derniers caractéres à partir d’une valeur que je récupére dans un autre champs appelé “NuméroPortable” .

J’ai fait la commande suivante :
ALTER TABLE “Clients” ALTER COLUMN “Code Accès” SET DEFAULT RIGHT(“NuméroPortable”,6)

Mais ça ne fonctionne pas, j’ai l’erreur suivante:
1: Wrong data type or data too long in DEFAULT clause: RIGHT in statement [ALTER TABLE “Clients” ALTER COLUMN “Code Accès” SET DEFAULT RIGHT].

Si je mets une valeur fixe ça marche.
Quelqu’un peut m’éclairer?

La fonction RIGHT étant une fonction de chaîne de caractères, ne produit-il pas une chaîne de caractères, alors que ton champs Code Accès est du type entier? Si tel est le cas, il ne va pas aimer que tu lui dise d’inserer une chaîne varchar dans un champs à entier.

Sinon, si les champs sont du même type, il faut vérifier si RIGHT n’ajoute pas de caractères de remplissage invisibles ou autres du fait de l’utilisation d’utf8 codant chaque caractère sur 4 bits au lieu d’un, ce qui ferait dépasser la limite de ce que tu peux insérer dans Code Accès.

Bonjour, je pense avoir respecté les syntaxe de la table…
image
merci de votre aide.

Quel type de base de données, Hsqldb intégré, Firebird intégré, ou autre chose ?

Si Hsqldb, l’aide indique:

For character column, a single-quoted string or NULL. The only SQL function that can be used is CURRENT_USER.

Cela voudrait dire à priori que la fonction RIGHT ne pourra pas fonctionner pour régler la valeur par défaut.

Pour Firebird 3, les choix de valeur par défaut sont également limités:
DEFAULT { | NULL | <context_var>}]

Expression n’en fait pas partie, c’est peut-être là le problème ?

Bonjour,
Je ne comprends pas bien, tu souhaite modifier la structure de la table en mettant par défaut dans tous les enregistrements le même numéro de téléphone portable ?
Si chaque enregistrement doit être modifié avec un autre champ du même enregistrement,
c’est la commande UPDATE qui doit être utilisée et non ALTER
A moins que je n’y connaisse rien en SQL…
A plus,
JM

Bonjour, je souhaite "simplement " renseigner le champs “Cde Accès” à chaque nouvel enregistrement avec la condition suivante :
Le champ “Code Accés” est égal aux 6 derniers chiffres du champs “NuméroPortable”.
J’ai bien les 2 mêmes type de variable pour ces champs (Texte[VARCHAR]).
Pour info je ne suis pas un pro de SQL … je butine ce que je peux aux travers d’exemples sur le NET…
Donc le pourquoi de ma demande…
Merci de votre aide.

Pour illustrer ma demande, sous CALC (XLS) la formule est faite comme ça.

1 Like

Dans ce cas, il faut un déclencheur (trigger). On ne peut pas le faire avec l’interface utilisateur de définition de table, et la syntaxe pour le créer diffère en fonction du moteur de base de données utilisé.

Par exemple, pour Hsqldb, les déclencheurs sont définis ainsi:

CREATE TRIGGER EMPLOYEE_LOG AFTER INSERT ON EMPLOYEE
REFERENCING NEW ROW as newrow FOR EACH ROW
INSERT INTO EMPLOYEE_LOG(LNAME, STATUS) values (newrow.lname, ‘INSERT’)

Je ne sais pas si cette forme de déclencheur est accessible ou fonctionnelle depuis Outils > SQL avec hsqldb 1.8.

Qq chose de semblable devrait néanmoins fonctionner avec Firebird, par contre.

Bonjour,
Plus simple qu’avec le “trigger”, on peut, avec une macro déclenchée par la perte du focus du champ téléphone, aller remplir le champ code avec les six derniers chiffres.
Pour ça, il faudrait avoir un exemplaire (anonymisé) de la base pour connaître les noms des contrôles de formulaire
A plus,
JM

Bonjour comme convenu j’ai modifié la base avec les noms et N° Tél .
Je cherche le moyen d’envoyer le fichier car il est plus gros que ce que m’autorise le site …

Bonsoir,
Tu peux poser le fichier sur
Le site cjoint
Et nous communiquer le lien de téléchargement.
Bonne soiree

Boinjour,
Merci pour votre patience et l’aide apportée.
Lien vers la BAse : Loc-saison--brouillon.odb
Dans l’attente de vos réfléxions sur le sujet.

Bjr,

voici un bout de code à associer au champ “code acces” .
PascalB_codacces

@+

Salut,
J’ai implanté la macro dans le fichier cijoint : https://www.cjoint.com/c/MAFpwwUaDql)
La macro se déclenche lorsque l’on quitte le champ “N° Telephone”.
Juste une remarque : j’évite les caractères spéciaux , les accents et les espaces dans les nom de champ. Ca peut poser des problèmes dans certaines requêtes SQL…
@HRK2O : c’est gentil de ta part de faire une proposition, mais il y manque le mode d’emploi.
A plus
Le code:

Sub RempirCode (oEvenement as Object) 'Déclenché à la perte du focus de "N° telephone"
oSource = oEvenement.Source ' récupération de l'objet
sCode = Right (oSource.Text,6) ' récupération du code
OFormulaire = oSource.MOdel.Parent ' récupération du formulaire
oCtrlCode = oFormulaire.GetByName("Code acces") ' récupération du champ
oCtrlCode.Text = sCode ' remplissage du champ
oCtrlCode.Commit
End Sub

@jeanmi2403
c’est juste!
suis parti dans l’idée que Pascal.B saurait y faire puisqu’il a déjà créé quelques codes.
un peu de réflexion pour l’apprentissage !
@+

Merci beaucoup pour votre aide. Il me reste une question par rapprot à la Macro, Comment je l’implante dans ma base de travail? J’ai bien vu quelle est dans le module Test avec le nom RempirCode. mais je ne trouve pas à qui elle rattachée…
Encore Merci.

Ok j’ai trouvé elle est associé au Champs NuméroPortable.
Excusez moi .
Bravo pour votre participation…