Du Basic à l'SQL en évitant les notations scientifiques

Ulun - 4 janv. 2013 à 12:20
 Ulun - 7 janv. 2013 à 10:05
Bonjour!

J'ai une question conernant plusieurs choses en même temps.

Je travail actuellement sur PcVue (ARCInfo) qui utilise un langage crée par eux-mêmes le SCADA Basic. Ca se rapproche du VBA pour cela que je l'ai posté ici.

Je dois écrire dans une base de donnée et mon soucis est le suivant:
Dans ma table il y a une colonne chrono qui représente le temps écoulé en milliseconde depuis 1970 je crois. Sous PcVue la commande permettant de récupérer cette valeur est datetimevalue()

Je la mets ensuite en format texte et l'envoît dans ma table sauf qu'elle arrive en notation scientifique (Ex: 1.37529E+017) donc la requête ne passe pas car il n'attend ce E+017!! Je le veux en brut mais je ne trouve pas la commande approprié.
Quel qu'un aurait-il une solution?

8 réponses

cs_Jack Messages postés 14006 Date d'inscription samedi 29 décembre 2001 Statut Modérateur Dernière intervention 28 août 2015 79
4 janv. 2013 à 13:22
Salut Marc

Ce genre de notation n'apparait que sur les types de variables Single ou Double.
Pour savoir pourquoi ce chiffre 'arrive en notation scientifique', il faut déjà que tu nous dises où tu vois ce chiffre sous cette forme.
Est-ce lors de l'écriture ou de la relecture ?
Montre nous un bout de code.

Sauf erreur de ma part, PcVue travaille en 32 bits.
Le TimeStamp dont tu parles (*) est donc un grand nombre, mais stockable dans un entier de 32 bits, c'est à dire un Long en VBA.
En fait, pour un Long signé, on peut stocker ce TimeStamp jusqu'en 2038 (18 janvier 2038 : date du futur bug façon bug an 2000)

TimeStamp : Nombre de secondes écoulées depuis 01/01/1970 et défini comme l'an 0 de l'informatique par Apple.

Vala
Jack, MVP VB
NB : Je ne répondrai pas aux messages privés

Le savoir est la seule matière qui s'accroit quand on le partage (Socrate)
0
Bonjour,
Merci pour ton attention.
Tout d'abord j'ai réussi à afficher mon chrono comme je le voulais (cad sans les exposants) J'ai utilisé (voir ci-dessous) la commande Format qui me permet d'afficher ma variable avec le nombre de chiffre que je souhaite.
Le chrono s'affiche donc bien comme je le veux (voir dans Résultat = DH sans la modif HDS)

MAIS, il se pose un autre problème. SQL Est censé prendre la date et l'heure grâçe à ce chrono, or il m'affiche la valeur par défaut 01/01/1900. Ce qui veut dire que mon chrono ne part pas de la bonne date.
Est ce que tu saurais quel calcul je dois faire pour partir de la bonne date?

Merci d'avance



{Dim DateHeure As Double;
Dim DateHeure2 As Double;
Dim DateHeureStr As Str;
Dim Date_heure As Str;
Dim Entier As Integer;
Dim lReturn As Long;
Dim Linehandle As Long;
Dim Result As Str;


DateHeure = datetimevalue()*10000+116444736000000000;
DateHeure2=datetimevalue();

DateheureStr=Format("%20.20g", DateHeure);
Date_heure = Format("%20.20g", DateHeure2);
'Date_heure = datetimestring(Dateheure2);

Print ("Date et heure sans la modif HDS", Date_Heure);
Print ("DH sans les exposants et modif HDS", DateHeureStr);
Print ("Date heure à l'instant t ", datetimestring(DateHeure2));
Print ("Date Heure TOC ", datetimestring(DateHeure));


==============Résultat affiché dans le "débuggeur" SCADA===============

Date et heure sans la modif HDS 1357307612324
DH sans les exposants et modif HDS 130017812123240000
Date heure à l'instant t 04/01/13 14:53:32
Date Heure TOC #D/#M/#Y #h:#m:#s
Requête Evenement INSERT INTO dbo.CONSIGNATIONS VALUES(' 130017812123240000','CONSIGNATION ','','0','De 0 à 0','CHANGEMENT AFFECTATION','0','','192','','','','','','','Chgnt affctn','57','60','0','','1','04/01/13 14:53:32')}
0
cs_Jack Messages postés 14006 Date d'inscription samedi 29 décembre 2001 Statut Modérateur Dernière intervention 28 août 2015 79
4 janv. 2013 à 15:27
Du bricolage et un risque d'arrondi non acceptable dans une application industrielle.
Regarde dans ta doc, mais je pense que ta fonction DateTimeValue() doit renvoyer un Long, donc il est plus logique de dimensionner une variable intermédiaire du même type.
Dim DateHeure As Long
DateHeure = datetimevalue()

Pour ce qui est des dates, VBA possède des instructions sûres pour transformer ce genre de variable en date/heure : DateAdd et DateDiff.

Par contre, je viens de regarder un peu à quoi ressemble ton langage Scala; il semble que cela ressemble plus à du Java qu'à du VBA.
Veux-tu que je transfère ta question dans le forum de ce langage ?
0
cs_Jack Messages postés 14006 Date d'inscription samedi 29 décembre 2001 Statut Modérateur Dernière intervention 28 août 2015 79
4 janv. 2013 à 15:34
lol, c'est Scada et pas Scala (qui est aussi un langage)
Pour Scada, on peut dire que le concepteur n'est pas généreux en documentation sur le net ... Rien trouvé
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
Le langage SCADA est (selon un formateur PcVue) un langage BASIC qui se rapproche plus du VBA mais si jamais ça peut aider je te laisse transférer .

Pour le calcul (si c'est celui là que tu appelles du bricolage)
DateHeure = datetimevalue()*10000+116444736000000000;
Je reprends exactement les mêmes termes que m'ont donnés le support technique PcVue. Donc bon si c'est du bricolage merci à leurs documentations .

Enfin là pour le moment je récupère un chrono et pour le calcul de la date_heure je ne l'utilise pas et j'écris directement la date actuelle dans ma base.
0
cs_Jack Messages postés 14006 Date d'inscription samedi 29 décembre 2001 Statut Modérateur Dernière intervention 28 août 2015 79
5 janv. 2013 à 13:41
La vraie question est : Ton langage permet-il d'utiliser les instructions propres au VBA ?
Si ton support technique n'a pu te fournir que cette technique pour atteindre ton but, c'est que le langage est relativement restreint et je ne vois pas trop comment on pourrait t'aider - ne trouvant aucune documentation sur les mots clés de ce langage sur le net (si tu as un lien ...).

Ce que j'ai voulu dire, concernant la précision des données, c'est que ce genre de chiffre, 116.444.736.000.000.000, nécessite de faire attention au type de variable dans laquelle on la stocke car certains types de flottants ont des mantisses de faible étendue.

En relisant ta question initiale, je m'aperçois que j'ai lu de travers : Ta donnée représente des millisecondes, et pas des secondes. Du coup, le type Long que je te suggérait ne suffira pas.

Tu dis que tu gères une base de données : Le fais-tu aussi au travers de ce langage ?

Tu dis que SQL ne t'affiche pas la bonne date.
Dans quel champ vois-tu cela ?
Vu d'ici, on ne sait rien de la structure de ta table, ni de quel champ tu parles.
Ce qu'il faudrait savoir, c'est le type du premier champ de ta table, celui dans lequel tu entres ce gros chiffre.
D'après la requète que tu nous montres dans la fenêtre de debug, la donnée est encadrée par des apostrophes, ce qui semblerait vouloir dire qu'il s'agit d'un texte (comme tous les champs, d'ailleurs).
Est-ce vraiment le cas ?
Fonctionne t-elle ?

Pour info, rappelle des syntaxes SQL : Si le champ de la table est de type :
- texte : encadrement de la donnée par des apostrophes '
- numérique : pas d'encadrement
- date : encadrement par des # (attention, surement au format US, avec le mois en premier)
0
cs_Kaniass Messages postés 2 Date d'inscription mercredi 16 octobre 2002 Statut Membre Dernière intervention 5 janvier 2013
5 janv. 2013 à 17:14
Je travaille sur PcVue.
PcVue embarque aussi un vrai VBA. Je te conseille d'utiliser plutôt le VBA que le Scada Basic car c'est beaucoup plus pratique que le Scada Basic.

Je te conseille aussi de contacter leur support (services@arcinfo.com) car ils ont le code qui te dépannera.
0
Bonjour,
Donc après plusieurs essais j'ai réussi à me débrouiller
Tout d'abord, mon langage SCADA ne me permet pas d'utiliser toutes les instructions liées au VBA. Mais après quelques manipulations j'ai réussi à me débrouiller avec mon chrono.
Pour plus de précisions, j'ai une base de données SQL et je lui envois des requêtes (SQL) via PcVue afin de tracer des évènements et autres. Et en faît SQL calcul NORMALEMENT tout seul à partir de ce chrono (qui est la mesure du nombre de ms écoulé depuis les années 19XX). Sauf que PcVue et SQL ne partent pas de la même date!!

Enfin bref j'ai fini par lui envoyer directement la date au format qu'on connaît
(Ex.: 07/01/2013 15:00:00.000) et voilà. J'espère juste que ça ne va pas poser de problème car la colonne date (sous SQL) calcul la date à partir de la colonne chrono...
0
Rejoignez-nous