2010-02-18 3 views
0

J'essaie de publier un message XML en utilisant l'adaptateur tibco adb qui surveille une table. Il existe une colonne dans la table qui stocke une date sous la forme d'une valeur longue en millisecondes. Existe-t-il un moyen de convertir cette valeur longue en une date dans le cadre du marshaling XML?Tibco Businesswork, horodatage de format en long à mm/jj/aaaa

-tia

Répondre

1

je devais écrire un processus java personnalisé pour obtenir ce fait - Juste au cas où quelqu'un trouve utile

0

J'ai couru dans ce un peu. Nous utilisons l'option dans Adb pour écrire toutes les données dans l'autre table. Ce que vous pouvez faire alors effectuer les opérations suivantes

Option 1 1. Modifier le type de données de l'autre table pour être varchar 2. Mettre à jour le déclencheur pour faire la conversion e pour vous 3. Mise à jour du système de pc. - cela fera si vous ne pouvez pas utiliser l'interface graphique pour plus mises à jour de Adb

Option 2 Un autre boniment que nous utilisons pour Adb est d'utiliser Adb comme un déclencheur pour une action. Donc, au lieu d'utiliser toutes les informations d'Adb, nous utilisons la clé. Nous effectuons un rappel à une procédure stockée pour récupérer le reste. C'est là que nous réglons le problème de formatage. Donc, si vous êtes faimiliar avec faire un appel db en bw, la deuxième option est de loin la plus facile et moins sujette aux erreurs. Nous utilisons Tibco depuis environ 3 ans et avons trouvé des limites à l'adaptateur de base de données actif. Dans les coulisses, il s'agit juste d'un pooler avec une sérialisation XML et place les messages dans une file d'attente/sujet

Option 3 L'autre option que j'ai utilisée est de créer un mappeur assez compliqué dans votre processus BW. Recherchez un espace et remplacez-le par un "t".
Hope this helps

2

Vous pouvez traduire les millisecondes à une valeur xml datetime avec le x-chemin suivant:

tib:add-to-dateTime(tib:translate-timezone('1970-01-01T00:00:00Z', tib:get-timezone-from-dateTime(current-dateTime())), 0, 0, 0, 0, 0, (<your input in ms> div 1000)) 

Ce que cela fait est:

1) Trouver votre fuseau horaire:

tib:get-timezone-from-dateTime(current-dateTime()) 

2) Déplacez la date de base (1970-01-01) sur le fuseau horaire approprié:

tib:translate-timezone('1970-01-01T00:00:00Z' <result above>) 

3) Ajouter le nombre de secondes dans votre époque d'entrée:

tib:add-to-dateTime(<result above>, 0, 0, 0, 0, 0, (<your input in ms> div 1000)) 

Notez l'inconvénient de cette solution est en train de perdre la précision millisecondes. Le datetime final est en secondes. Si vous devez conserver les millisecondes dans le résultat final, il est préférable de les déléguer à une bibliothèque Java externe (comme vous l'avez déjà suggéré.) Vous pouvez facilement mettre une méthode Java à disposition dans le mappeur Designer en l'important une ressource Java Custom Function.

0

Cela fonctionne pour moi, et en prenant la date qui en résulte sans le 'Z' à la fin et en ajoutant les millisecondes, j'ai ma précision en arrière. Maintenant, juste pour travailler sur l'heure d'été ...

concat ( substring ( tib: add-to-dateTime (tib: translate-fuseau horaire ('1970-01-01T00: 00: 00Z', tib: get-fuseau horaire-de-dateTime (courant-dateTime ())), 0, 0, 0, 0, 0, ($ Element/racine/s_date_in_ms div 1000)) , 1,19) , ".", sous-chaîne ($ Element/root/s_date_in_ms, 12, 3) )

2014-11-10T23: 02: 28.858