Unlock a world of possibilities! Login now and discover the exclusive benefits awaiting you.
Bonjour,
Je but sur le problème suivant depuis quelques jours, et je ne vois pas comment le résoudre. Je vais essayer d'être le plus clair possible afin que vous me donniez votre avis s'il vous plait.
J'ai deux tables :
- table DOSSIER avec comme champs DOSSIER_ID, DOSSIER_INFO, .... Le champ DOSSIER_INFO contient des textes du type "problème urgent à résoudre pour telle date"
- table KEYWORDS avec les champs KEYWORD_ID, KEYWORD (par exemple: urgent), KEYWORD_VAL
Ce que je souhaite pouvoir :
1) Au chargement de la table DOSSIER, pour chaque dossier, vérifier s'il y a des infos complémentaires (DOSSIER_INFO non vide)
2) Si oui, parcourir les infos complémentaires
3) Si dans les infos complémentaires il y a un mot clé (KEYWORD) référencé dans la table KEYWORDS, alors ajouter un champ KEYWORD_ID à la table DOSSIER et y affecter la valeur correspondante
4) Si pas de mot clé dans les infos complémentaires affecter la valeur 0 au champ KEYWORD_ID de la table dossier
Est-ce envisageable?
Si oui, comment procéder?
Merci par avance,
N'hésitez pas à me demander des précisions si je n'ai pas été assez clair.
Il vous faut rajouter un champ KEYWORD_ID à la tabel DOSSIER, en génratn dynamiquement son expression à partir des données de la table KEYWORDS.
Pour la structure de l'expression, le plus simple est d'utiliser la syntaxe:
pick( wildmatch( DOSSIER_INFO , '*KEYWORD_1*' , '*KEYWORD_2*', ....,'*')
,
KEYWORD_ID_1 , KEYWORD_ID_2 ,..... , 0
) as KEYWORD_ID
Il nous faut donc générer deux chaînes de caractères avec concat et pour s'assurer qu'elles sont dans le bon ordre, on utilisera le second paramètre optionnel, poids que l'on affectera à RecNo() .
Ce qui donne le code suivant:
tmp_expression :
NoConcatenate
LOAD
Concat( DISTINCT
chr(39) & '*' & KEYWORD & '*' & chr(39) ,
' , ' ,
RecNo()
) as matching_expression
,
Concat( DISTINCT KEYWORD_ID , ' , ', RecNo() ) as return_expression
RESIDENT KEYWORD
WHERE KEYWORD <> ''
;
LET matching_expression = peek( 'matching_expression' , -1 , 'tmp_expression' ) ;
LET return_expression = peek( 'return_expression' , -1 , 'tmp_expression' ) ;
DROP TABLE tmp_expression ;
LEFT JOIN( DOSSIER)
LOAD DISTINCT
DOSSIER_INFO ,
pick(
wildmatch( DOSSIER_INFO , $(matching_expression) , '*' )
,
$(return_expression) , 0
) as KEYWORD_ID
RESIDENT DOSSIER ;
Ce message a été modifié par: Richard Pressanti: Consolidation de l'expression suite aux problèmes indiqués dans le post suivant.
Ce message a été modifié par: Richard Pressanti: Correction d'une erreur de frappe au niveau du Concat( .. KEYWORD ...)
Il vous faut rajouter un champ KEYWORD_ID à la tabel DOSSIER, en génratn dynamiquement son expression à partir des données de la table KEYWORDS.
Pour la structure de l'expression, le plus simple est d'utiliser la syntaxe:
pick( wildmatch( DOSSIER_INFO , '*KEYWORD_1*' , '*KEYWORD_2*', ....,'*')
,
KEYWORD_ID_1 , KEYWORD_ID_2 ,..... , 0
) as KEYWORD_ID
Il nous faut donc générer deux chaînes de caractères avec concat et pour s'assurer qu'elles sont dans le bon ordre, on utilisera le second paramètre optionnel, poids que l'on affectera à RecNo() .
Ce qui donne le code suivant:
tmp_expression :
NoConcatenate
LOAD
Concat( DISTINCT
chr(39) & '*' & KEYWORD & '*' & chr(39) ,
' , ' ,
RecNo()
) as matching_expression
,
Concat( DISTINCT KEYWORD_ID , ' , ', RecNo() ) as return_expression
RESIDENT KEYWORD
WHERE KEYWORD <> ''
;
LET matching_expression = peek( 'matching_expression' , -1 , 'tmp_expression' ) ;
LET return_expression = peek( 'return_expression' , -1 , 'tmp_expression' ) ;
DROP TABLE tmp_expression ;
LEFT JOIN( DOSSIER)
LOAD DISTINCT
DOSSIER_INFO ,
pick(
wildmatch( DOSSIER_INFO , $(matching_expression) , '*' )
,
$(return_expression) , 0
) as KEYWORD_ID
RESIDENT DOSSIER ;
Ce message a été modifié par: Richard Pressanti: Consolidation de l'expression suite aux problèmes indiqués dans le post suivant.
Ce message a été modifié par: Richard Pressanti: Correction d'une erreur de frappe au niveau du Concat( .. KEYWORD ...)
Merci Richard,
c'est exactement ce dont j'ai besoin.
Il y a juste au niveau du concat suivant qu'il y a un soucis je pense:
Concat(chr(39) & '*' & KEYWORD * '*' & chr(39) , ' , ' , RecNo()) as matching_expression,
car au final dans le champ KEYWORD_ID de ma table DOSSIER j'ai toujours la même valeur (ici 1, et qui ne correspond pas au mot clé associé).
J'ai essayer de le modifier ainsi:
Concat(chr(39) & '*' & KEYWORD & '*' & chr(39) , ' , ' , RecNo()) as matching_expression,
mais là je n'ai plus aucune valeur dans mes champs KEYWORD_ID.
Etant novice, je ne suis pas à l'aise avec la syntaxe de QV et ne parviens pas à rectifier cette ligne.
Ou alors mon problème vient d'ailleur?
Essayez de remplacer Concat(...) par Concat( DISTINCT .. ) dans les deux expressions.
Si cela ne marche pas, allez dans Paramètres -> Apercu des variables : examinez les deux expressions: normalement les valeurs correspondantes de KEYWORD et KEYWORD_ID devraient être dans le même ordre.
Eventuellement postez ces deux expressions.
Vérifier également qu'il n'y ait pas de chaînes vides dans le champ KEYWORD associé à la valeur 1 de KEYWORD_ID car sinon çela générera le motif '**' qui matche toute chaîne de caractères: la valeur ré¤te 1 serait alors expliquée. Si c'est le cas, rajoutez:
WHERE KEYWORD <> ''
au chargement/concat
Bon courage!
Merci pour les pistes,
- l'ajout du DISTINCT dans les 2 expression ne change rien
- ma table KEYWORDS a la forme suivante (et sans chaine vide)
KEYWORD_ID, KEYWORD, KEYWORD_VAL
1, PA1, 500
2, urgent, 250
- Dans l'aperçu des variables :
Nom de la variable / Valeur
return_expression / 1,2
matching_expression / '*','*'
C'est donc au niveau de la variable matching_expression que le bas blesse.
Voici le code utilisé:
tmp_expression :
NoConcatenate
LOAD Concat(chr(39) & '*' & KEYWORD * '*' & chr(39), ',' ,RecNo()) as matching_expression,
Concat(KEYWORD_ID, ',', RecNo() ) as return_expression
RESIDENT KEYWORDS ;
LET matching_expression = peek( 'matching_expression' , -1 , 'tmp_expression' ) ;
LET return_expression = peek( 'return_expression' , -1 , 'tmp_expression' ) ;
DROP TABLE tmp_expression ;
CASE:
Load CASE_ID,
CASE_ADDITIONAL_INFO,
....,
pick( wildmatch( CASE_ADDITIONAL_INFO , $(matching_expression) , '*' ), $(return_expression)) as KEYWORD_ID;
Effectivement, j'ai commis une erreur de frappe en tapant l'expression:
Il ne faut pas ecrire :
Concat(chr(39) & '*' & KEYWORD * '*' & chr(39), ',' ,RecNo())
mais :
Concat(chr(39) & '*' & KEYWORD & '*' & chr(39), ',' ,RecNo())
Bonjour,
Je me permets de fournir une autre solution. J'avais commencé à la réaliser avant la réponse de Richard, je la poste pour qu'elle ne soit pas perdue.
Trouve ci-joint une appli avec script commenté point par point pour réaliser ta demande.
A ta dispo pour en rediscuter.
Amand
Avec la seconde expression, j'ai bien dans l'aperçu des variable:
Nom de la variable / Valeur
return_expression / 1,2
matching_expression / '*PA1*','*urgent*'
Par contre dans ma table DOSSIER, le champ KEYWORD_ID est à '-' au lieu de '0' .
Je ne vois pas pour quelle raison, ni comment y remédier.
Bonjour Amand,
Merci beaucoup pour votre réponse et le temps passé pour rédiger le script.
Malheureuseument j'ai une version d'essai qui m'empêche d'ouvrir les projets QV que je n'ai pas créés moi-même.
Peut être pouvez-vous copier/coller directement le script ici?
Voici le contenu de mon script :
//Chargement des dossiers
Dossier:
LOAD ID_DOSSIER,
DOSSIER_INFO,
//On identifie les lignes comportant des infos complémentaires
if(len(trim(DOSSIER_INFO))>0,'O','N') as Flag_info_complémentaire
FROM
Dossier_keyword.xlsx
(ooxml, embedded labels, table is Dossier);
//Chargement des keywords
Keyword:
LOAD ID_Keyword,
Keyword
FROM
Dossier_keyword.xlsx
(ooxml, embedded labels, table is Keyword);
//On compte le nombre de lignes dans la table des keywords
LET NbKeywords = NoOfRows('Keyword');
//Pour chacun des mot clé
For i=0 to $(NbKeywords)-1
//On récupère le keyword à l'index spécifié par la variable i
LET vKeywordEnCours = peek('Keyword',$(i),'Keyword') ;
LET vIDKeywordEnCours = peek('ID_Keyword',$(i),'Keyword') ; //De même pour l'id
//Création d'une table contenant tous les liens dossier_keyword
Lien_Dossier_Keyword:
LOAD ID_DOSSIER,
'$(vIDKeywordEnCours)' as ID_Keyword
Resident Dossier
//On ne traite que les lignes flaguées dans dossier
Where Flag_info_complémentaire='O'
//La recherche du kyword dans le texte s'effectue ici
and WildMatch(DOSSIER_INFO,'*$(vKeywordEnCours)*');
Next i;
En espérant que cela puisse aider.
Amand