Précédent   Forum des professionnels en informatique > Logiciels > Solutions d'entreprise > Business Intelligence > ETL > Talend
Talend Forum d'entraide sur Talend (Talend Open Studio, ...). Avant de poster --> FAQ Talend, Tutoriels Talend
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 25/01/2011, 10h37   #1
Membre du Club
 
Inscription : mars 2007
Messages : 248
Détails du profil
Informations forums :
Inscription : mars 2007
Messages : 248
Points : 46
Points : 46
Par défaut [TDQ 4.1.1] job générique (simuler schéma dynamique)

Bonjour
Comment parvenir à créer un job générique afin d'insérer dans n tables le contenu de n feuilles excel ?

Ceci en respectant le fait que les noms et tailles de colonnes sont propres à chaque table (intégrent le nom de la feuille Excel)
Code :
1
2
3
4
5
6
7
8
9
CREATE TABLE "REF2"."FP_REF_T1" (
        CODE_REF_T1 character varying (1),  
	LIB_REF_T1 character varying(50), 
	CONSTRAINT "PK_FP_REF_T1" PRIMARY KEY (CODE_REF_T1)) WITH (OIDS=FALSE);
--
CREATE TABLE "REF2"."FP_REF_T2" ( 
	CODE_REF_T2 character varying (4),  
	LIB_REF_T2 character varying(10), 
	CONSTRAINT "PK_FP_REF_T2" PRIMARY KEY (CODE_REF_T2)) WITH (OIDS=FALSE);
L'exemple de fichier en entrée est en PJ.

Mon job actuel, fonctionne mais avec les tables créées comme ceci :
Code :

Code :
1
2
3
4
5
6
7
8
9
CREATE TABLE "REF2"."FP_REF_T1" (
        CODE_REF character varying ,  
	LIB_REF character varying, 
	CONSTRAINT "PK_FP_REF_T1" PRIMARY KEY (CODE_REF)) WITH (OIDS=FALSE);
--
CREATE TABLE "REF2"."FP_REF_T2" ( 
	CODE_REF character varying ,  
	LIB_REF character varying, 
	CONSTRAINT "PK_FP_REF_T2" PRIMARY KEY (CODE_REF)) WITH (OIDS=FALSE);

D'avance merci de votre attention
msomso
Fichiers attachés
Type de fichier : xls Data.xls (13,5 Ko, 2 affichages)
msomso est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 26/01/2011, 10h15   #2
Membre émérite
 
Homme Nicolas Saumande
Architecte Décisionnel
Inscription : février 2008
Messages : 693
Détails du profil
Informations personnelles :
Nom : Homme Nicolas Saumande
Âge : 36
Localisation : France, Haute Garonne (Midi Pyrénées)

Informations professionnelles :
Activité : Architecte Décisionnel

Informations forums :
Inscription : février 2008
Messages : 693
Points : 879
Points : 879
Bonjour,

Une solution, qui n'est peut-être pas la meilleure serait d'utiliser un tBaseRow afin de coder une requête du genre insert into MaTable Values('Code', 'Libelle').

En récupérant les valeurs de MaTable, Code et Libelle des feuilles excel.
Ainsi il est possible de faire les insert sans spécifier le nom des colonnes.

Nicolas
DevNico est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 26/01/2011, 10h40   #3
Membre du Club
 
Inscription : mars 2007
Messages : 248
Détails du profil
Informations forums :
Inscription : mars 2007
Messages : 248
Points : 46
Points : 46
Bonjour
J'y ai pensé un peu, mais cette solution ne permet pas gérer proprement les rejets/erreurs etc.
Merci tout de même

msomso
msomso est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 26/01/2011, 18h55   #4
Membre du Club
 
Inscription : mars 2007
Messages : 248
Détails du profil
Informations forums :
Inscription : mars 2007
Messages : 248
Points : 46
Points : 46
Bonjour
J'avance en effet sur la solution avec tPostgresqlRow.
Mais, je n'arrive pas à récupérer les erreurs d'insertion effectuées dans ce composant.
Comment utiliser le lien "Reject" du composant tPostgresqlRow pour diriger la sortie vers un fichier ?
Merci
msomso
msomso est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 27/01/2011, 10h25   #5
Membre émérite
 
Homme Nicolas Saumande
Architecte Décisionnel
Inscription : février 2008
Messages : 693
Détails du profil
Informations personnelles :
Nom : Homme Nicolas Saumande
Âge : 36
Localisation : France, Haute Garonne (Midi Pyrénées)

Informations professionnelles :
Activité : Architecte Décisionnel

Informations forums :
Inscription : février 2008
Messages : 693
Points : 879
Points : 879
Citation:
Envoyé par msomso Voir le message
Comment utiliser le lien "Reject" du composant tPostgresqlRow pour diriger la sortie vers un fichier ?
Il suffit de rediriger le lien de sortie Rejects du composant tPostgresqlRow vers un composant d'écriture dans un fichier.

Nicolas
DevNico est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 27/01/2011, 10h55   #6
Membre du Club
 
Inscription : mars 2007
Messages : 248
Détails du profil
Informations forums :
Inscription : mars 2007
Messages : 248
Points : 46
Points : 46
Non, malheureusement cela génère une erreur :

Citation:
Démarrage du job t2 a 08:47 27/01/2011.

[statistics] connecting to socket on port 3661
[statistics] connected
Exception in thread "main" java.lang.Error: Problèmes de compilation non résolus :
Iterate ne peut pas être résolu
Iterate ne peut pas être résolu
Le code java correspondant est :
Code :
1
2
3
4
5
6
7
8
9
	} catch (Exception e) {
		whetherReject_tPostgresqlRow_1 = true;
		err = new errStruct();
		err.CODE_REF = Iterate.CODE_REF;
		err.LIB_REF = Iterate.LIB_REF;
		err.errorMessage = e.getMessage()
				+ " - Line: "
				+ tos_count_tPostgresqlRow_1;
	}
C'est le problème de schéma, j'ai essayé tIterateToFlow mais sans sucés non plus ...
Images attachées
Type de fichier : png err_reject.png (17,4 Ko, 6 affichages)
msomso est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 27/01/2011, 11h51   #7
Membre émérite
 
Homme Nicolas Saumande
Architecte Décisionnel
Inscription : février 2008
Messages : 693
Détails du profil
Informations personnelles :
Nom : Homme Nicolas Saumande
Âge : 36
Localisation : France, Haute Garonne (Midi Pyrénées)

Informations professionnelles :
Activité : Architecte Décisionnel

Informations forums :
Inscription : février 2008
Messages : 693
Points : 879
Points : 879
J'ai fait un petit test rapide, et je n'ai pas d'erreur de compilation en utilisant un lien rejet après un lien iterate...

J'ai regardé le code généré, en fait ça semble poser problème à partir du moment où tu définis un schéma au niveau du tPostgresqlRow.

A priori, tu n'en as pas besoin. L'ordre sql que tu mets dans le tPostgresqlRow utilise les variables du tFlowToIterate, c'est bien ça ?

Nicolas
DevNico est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 27/01/2011, 14h28   #8
Membre du Club
 
Inscription : mars 2007
Messages : 248
Détails du profil
Informations forums :
Inscription : mars 2007
Messages : 248
Points : 46
Points : 46
Bonjour
Citation:
sql que tu mets dans le tPostgresqlRow utilise les variables du tFlowToIterate, c'est bien ça ?
Oui, c'est ça.


Après avoir supprimé le schema de tPostgresql Row l'erreur est :
Citation:
Démarrage du job t2 a 14:23 27/01/2011.

[statistics] connecting to socket on port 3476
[statistics] connected
Exception in component tFileOutputExcel_1
jxl.read.biff.BiffException: The input file was not found
at jxl.read.biff.File.<init>(File.java:124)
at jxl.Workbook.getWorkbook(Workbook.java:221)
at jxl.Workbook.getWorkbook(Workbook.java:198)
at rpd1.t2_0_1.t2.tForeach_1Process(t2.java:2621)
at rpd1.t2_0_1.t2.runJobInTOS(t2.java:3853)
at rpd1.t2_0_1.t2.main(t2.java:3594)
Et le lignes: 123,124,125 du code java:
Code :
1
2
3
IF (ITERATION != NULL) {
 
	this.setProperty("ITERATION", ITERATION.toString());
Quel est le schéma de fichier de rejets dans ton test ?

msomso
msomso est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 27/01/2011, 14h48   #9
Membre du Club
 
Inscription : mars 2007
Messages : 248
Détails du profil
Informations forums :
Inscription : mars 2007
Messages : 248
Points : 46
Points : 46
Par défaut résultat avec tFileOutputDelimited

Bonjour
en utilisant tFileOutputDelimited à la place tFileOutputExcel, je n'ai pas d'erreur de compilation/exécution.
Mais le fichier trace contient juste ceci (cf. png en PJ):
Citation:
errorCode|errorMessage
""|"ERREUR: la transaction est annulée, les commandes sont ignorées jusqu'à la fin du bloc
de la transaction - Line: 0"
Alors que j'ai 6 ordres 'insert' en échec en raison de 'duplicate primary key'.

Avec quel type de fichier as-tu testé Nicolas ?
Arrives-tu à traces en détail les rejets (enregistrement et message d'errreur) ?

msosmo
Images attachées
Type de fichier : png ko_trace_reject.png (49,2 Ko, 3 affichages)
msomso est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 27/01/2011, 17h01   #10
Membre émérite
 
Homme Nicolas Saumande
Architecte Décisionnel
Inscription : février 2008
Messages : 693
Détails du profil
Informations personnelles :
Nom : Homme Nicolas Saumande
Âge : 36
Localisation : France, Haute Garonne (Midi Pyrénées)

Informations professionnelles :
Activité : Architecte Décisionnel

Informations forums :
Inscription : février 2008
Messages : 693
Points : 879
Points : 879
Alors je ne suis pas allé jusqu'à l'exécution, j'avais juste essayé de compiler un job avec un lien iterate suivi d'un tPostgresqlRow avec un lien rejet.

Mon lien rejet a les mêmes champs que toi :
errorCode
errorMessage

Mais tu peux le compléter en ajoutant un tMap et en récupérant les valeurs qui ont posé problème, de la même façon que tu les as utilisées dans le tPostgresqlRow.

Sinon, je n'ai effectivement jamais essayé de gérer des rejets sur un tBaseRow... Donc je ne te pourrai pas te garantir que cela fonctionne comme tu le souhaites.

Nicolas
DevNico est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 28/01/2011, 08h38   #11
Membre du Club
 
Inscription : mars 2007
Messages : 248
Détails du profil
Informations forums :
Inscription : mars 2007
Messages : 248
Points : 46
Points : 46
Bonjour
Effectivement avec tMap j'arrive à tracer tous les enregistrements rejetés, mais le fichier doit être en ajout (a cause de "iterate") donc il faut y ajouter date, penser à le purger etc ...

Est-ce que quelqu'un a testé les schémas dynamiques ?
Comment ça marche ?

Merci bien
msomso est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 02h52.


 
 
 
 
Partenaires

Hébergement Web