|
Publicité ' | |||||||||||||||||||||||
|
|
#1 |
|
Invité de passage
![]() Perrine Ingénieur d'études et développement Inscription : novembre 2011 Messages : 6 ![]() |
Bonjour,
j'espère que le sujet n'a pas déjà été abordé ailleurs, je n'ai pas trouvé de réponse à mon problème. En bref : j'utilise un tMysqlRow pour exécuter une requête de type "INSERT ... ON DUPLICATE KEY UPDATE" Je voudrais savoir à la sortie de ce composant si j'ai inséré ou mis à jour mes données. Je n'ai pas trouvé de petite variable miracle qui me donne cette info... Dans la doc de MySQL je lis : "With ON DUPLICATE KEY UPDATE, the affected-rows value per row is 1 if the row is inserted as a new row and 2 if an existing row is updated. " Est-ce que je peux récupérer alors le nombre de lignes affectées ? Merci pour vos réponses et votre attention, toute aide sera la bienvenue ! |
|
|
00
|
|
|
#2 |
|
Invité de passage
![]() Perrine Ingénieur d'études et développement Inscription : novembre 2011 Messages : 6 ![]() |
Bonjour,
devant la foultitude de réponses proposées, je vais exposer le problème autrement En fait, je l'avais déjà "déplacé". Initialement, je veux simplement récupérer le contenu d'un fichier CSV et pour chaque ligne, l'insérer ou la mettre à jour en BDD. A la sortie, je veux savoir combien de lignes ont été ajoutées, combien ont été mises à jour. Jusque là, facile, tMysqlOuput sait le faire très facilement ! Là où ça se corse, c'est que je ne veux pas forcément mettre à jour tous les champs de la table : dans mon fichier, pour certains champs, un "?" indique que la valeur n'est pas à changer et doit absolument rester telle qu'elle était avant ! Je n'ai rien trouvé qui me permette de faire ça Du coup, je filtre les lignes de façon à ne laisser passer que celles ou il n'y pas de "?" d'un côté, et de l'autre, je construis une requête "à la mano" et je l'envoie dans un tMysqlRow... c'est ce que j'expliquais dans mon post précédent ! Finalement, il y avait peut être une solution à mon problème initial ??? Toutes les suggestions seront les bienvenues, merci à tous ! |
|
|
00
|
|
|
#3 |
|
Membre du Club
![]() Ingénieur développement logiciels Inscription : août 2011 Messages : 49 ![]() |
par rapport au PB initial:
Vous ajoutez un(ou plusieurs) flux input (lookup) avec les valeurs initiales de référence. Pour faire des contrôles supplémentaires l'opérateur ternaire s'y prête bien. Utilisez les var locales au tMap. Cela permet d'initialiser une variable avec une valeur par défaut (cas null ou "?") pour modifier ou non la valeur d'une variable dans le flux de sortie. ex: input1.col1.equals("?") input2.refCol1 :input1.Col1 ATTENTION: contrôle à prévoir si input1.col1 peut prendre la valeur null |
|
|
00
|
|
|
#4 |
|
Invité de passage
![]() Perrine Ingénieur d'études et développement Inscription : novembre 2011 Messages : 6 ![]() |
Bonjour jnbarthas, et merci pour cette réponse !
Etant novice avec cet outil, je ne suis pas sure d'avoir tout compris... Mon flux est le tFileInputDelimited, qui me parse correctement mon fichier CSV en me transmettant les champs comme je souhaite. Si je comprends bien, les contrôles supplémentaires doivent se faire dans le tMap ? Dans le champ "Expression" de la colonne de droite ? (je précise accessoirement que je suis en version Perl) Mais dans ce cas, je modifie la valeur de mon champ à la sortie du tMap ? Ce n'est pas ce que je souhaite, car il faudrait dans ce cas que je lui affecte la valeur qui se trouve en bdd... Je veux pouvoir dire "si mon champ, pour la ligne que je suis en train de traiter, est égal à "?", tu mets a jour toute la ligne SAUF ce champ". Est-ce bien ce que vous aviez compris ? |
|
|
00
|
|
|
#5 | |||
|
Membre du Club
![]() Ingénieur développement logiciels Inscription : août 2011 Messages : 49 ![]() |
Citation:
Attention PERL ne sera plus supporté en version 5 Citation:
OUI; ajoutez un lien lookup vers les données cible (référence); faire une "left outer join" sur une clé du flux input CSV pour récupérer la valeur significative de référence du champ qui peut être à "?" dans le CSV. Citation:
MAIS 2eme solution créer 2 flux de sortie * 1 complet avec tous les champs * 1 plus restreint pour ne pas écraser les champs avec valeurs non significatives du flux principal activer un FILTRE (Var.critere == true) pour orienter vers l'un ou l'autre (Var.critere == false) des flux dans le tMap La valeur de critère du filtre ((Var.critere de type boolean) est positionnée dans une Var locale selon les informations du flux CSV ("?", ...) Si ce n'est pas assez clair, vous pouvez suivre les tuto sur le tMap, utiliser la doc technique ou consulter le livre disponible en version numérique (ENI). Bonne continuation. |
|||
|
|
00
|
|
|
#6 |
|
Invité de passage
![]() Perrine Ingénieur d'études et développement Inscription : novembre 2011 Messages : 6 ![]() |
Merci pour cette deuxième réponse, et pour l'attention portée à mes questions !!
Pour ce qui est de la 2ème solution, j'y avais pensé dans un premier temps. Ce serait envisageable si je n'avais qu'un seul champ, mais comme j'en ai plusieurs, il faudrait que je considère chaque combinaison possible et ce serait simplement affreux... Pour la 1ère solution, celle qui consiste à aller chercher en base les données qui doivent remplacer le '?', elle me semble fort couteuse en termes de process !? Mon "INSERT ... ON DUPLICATE KEY ... " est finalement plus économe, ne peut-on réellement pas récupérer le "affected-rows" ? |
|
|
00
|
|
|
#7 |
|
Membre du Club
![]() Ingénieur développement logiciels Inscription : août 2011 Messages : 49 ![]() |
le composant de type "row" ne génère pas de flux de sortie; pas d'info sur nb lignes affectées.
Si la solution 1 vous parait couteuse, vous pouvez tout de même l'optimiser. - décomposer avec un premier tMap pour enrichir le flux principal CSV des infos complémentaires nécessaires - utiliser du SQL pur dans du code java (routine) et connaitre le nb de lignes affectées, tout en partageant les mêmes curseurs... |
|
|
00
|
|
|
#8 |
|
Invité de passage
![]() Perrine Ingénieur d'études et développement Inscription : novembre 2011 Messages : 6 ![]() |
Merci encore,
J'ai finalement opté pour le SQL pur dans du code.. Perl puisque nous sommes toujours en Perl. En parlant de Perl, peut-être que j'ai de sérieux problèmes de vue mais je ne trouve nulle part sur le site de Talend l'info concernant la version 5. Il s'agit d'un point important car nous avons un certain nombre de process sous Talend version Perl et une solution devra être envisagée rapidement. Pourriez-vous m'indiquer une page sur laquelle m'appuyer pour faire passer l'info au sein de nos équipes ? Merci encore pour votre aide et votre attention ! |
|
|
00
|
|
|
#9 |
|
Membre du Club
![]() Ingénieur développement logiciels Inscription : août 2011 Messages : 49 ![]() |
je ne travaille pas pour TALEND. Je suis avant tout un utilisateur enthousiaste du produit (disponible pour du conseil ou des formations).
J'ai appris que PERL est en mode "deprecated" en version 4.2 et doit disparaitre avec la version 5. http://www.talendforge.org/forum/viewtopic.php?id=15654 Bon WE. |
|
|
00
|
|
|
#10 |
|
Invité de passage
![]() Perrine Ingénieur d'études et développement Inscription : novembre 2011 Messages : 6 ![]() |
Merci beaucoup pour ces réponses et l'aide apportée.
Je marque le topic comme résolu bien qu'il soit plutôt contourné, et communiquerai l'information concernant Perl à mes collaborateurs. Merci & bonne continuation. |
|
|
00
|
Copyright © 2000-2012 - www.developpez.com