Quoi, tu ne connais pas PB ? Va falloir parcourir tout le forum alors !

Le forum (ô combien francophone) des utilisateurs de Powerbuilder.

Recherche rapide

Annonce

Certaines rubriques, dont des cours, sont uniquement visibles par les membres du forum ^^.
Dans la rubrique Liens & Références, vous avez accès à un sommaire de téléchargement, profitez-en !
Il existe maintenant un nouveau TOPIC "Votre CV en Ligne" accessible uniquement par demande.

#1 21-12-2010 14:57:43

bga  
Membre Geek
Date d'inscription: 02-09-2010
Messages: 54
Pépites: 225
Banque: 0

Plantage lors de conversion d'un BLOB en DATETIME

Bonjour,
je suis en PB11.1 avec une base oracle 11G, mais lorsque je recupère un BLOB depuis ma base de donnée, j'ai un souci de conversion en DateTime, la fonction ne me rend pas la main mais ne génère pas d'erreur. Vous auriez une idée du souci?
Une autre question en rapport avec ces BLOB, j'ai vu que pour écrire dans un blob avec BLOBEDIT on choisissait le type d'encodage, unicode ou ansi alors qu'en relecture BLOBMID on ne specifie rien? il gère tout seul?

merci

Hors ligne

 

#2 21-12-2010 15:08:46

JCZ  
Builder Power
Award: bf
Lieu: 75019 paris
Date d'inscription: 21-05-2007
Messages: 1724
Pépites: 496,453,703,213
Banque: 9,223,372,036,854,776,000

Re: Plantage lors de conversion d'un BLOB en DATETIME

salut
c'est quoi ton ordre sql ?


Face à l'agression, la puissance de l'intelligence

Hors ligne

 

#3 21-12-2010 15:18:53

bga  
Membre Geek
Date d'inscription: 02-09-2010
Messages: 54
Pépites: 225
Banque: 0

Re: Plantage lors de conversion d'un BLOB en DATETIME

blob2 = BlobMid(lblob, 1)
adt_exit_date = DateTime(blob2)



et mon lblob vient d'une fonction :
SELECTBLOB VAL_BLOB INTO :ablob_val_blob FROM

mais je reste bloquer sur le dateTime, la lecture se fait bien

Hors ligne

 

#4 21-12-2010 16:08:14

JCZ  
Builder Power
Award: bf
Lieu: 75019 paris
Date d'inscription: 21-05-2007
Messages: 1724
Pépites: 496,453,703,213
Banque: 9,223,372,036,854,776,000

Re: Plantage lors de conversion d'un BLOB en DATETIME

Tu es sur que c'est le DateTime(blob2) qui bloque et pas un verrouillage de la table ?

Tentes un if IsDate(blob2) Then ... avant

Sinon je peux te conseiller de mettre les dates dans des champs dates ...


Face à l'agression, la puissance de l'intelligence

Hors ligne

 

#5 21-12-2010 16:17:15

bga  
Membre Geek
Date d'inscription: 02-09-2010
Messages: 54
Pépites: 225
Banque: 0

Re: Plantage lors de conversion d'un BLOB en DATETIME

oui je suis sur que c'est le datetime qui reste bloqué, j'ai mis des traces, bizarre que le datetime ne sorte pas en erreur.

Hors ligne

 

#6 23-12-2010 09:56:37

bga  
Membre Geek
Date d'inscription: 02-09-2010
Messages: 54
Pépites: 225
Banque: 0

Re: Plantage lors de conversion d'un BLOB en DATETIME

Bonjour, personne n'a d'idée?

en plus le IsDate ne fonctionne pas avec un blob en paramètre.
Je ne sais plus quoi faire. Si mon blob n'était pas bon, je devrais sortir en erreur, mais la on reste dans le 'DateTime'

merci

Hors ligne

 

#7 23-12-2010 10:20:17

buck  
Modérateur
Lieu: Dijon
Date d'inscription: 31-07-2008
Messages: 747
Pépites: 1,028,843
Banque: 171,170,849,654

Re: Plantage lors de conversion d'un BLOB en DATETIME

Bonjour,

Tu devrais peut-être essayer de le convertir en string dans un premier temps et analyser ce que contient la chaîne retournée.

Hors ligne

 

#8 23-12-2010 10:32:29

bga  
Membre Geek
Date d'inscription: 02-09-2010
Messages: 54
Pépites: 225
Banque: 0

Re: Plantage lors de conversion d'un BLOB en DATETIME

ok merci

bon j'ai fait le test de passer en string mais c'est illisible, j'ai tester la conversion string avec les différents formats :
ainsi=xÚ
EncodingUTF8=x?
EncodingUTF16LE=?n???
EncodingUTF16BE=??????

je suis désolé mais je débute en PB

et je ne comprend pas non plus pourquoi le DateTime ne spécifie pas le format du blob!

Hors ligne

 

#9 23-12-2010 15:11:27

shahin  
Modérateur
Award: bf
Lieu: val de marne
Date d'inscription: 26-09-2006
Messages: 938
Pépites: 8,675,050,269
Banque: 16,218,225,127,617

Re: Plantage lors de conversion d'un BLOB en DATETIME

JCZ a écrit:

Sinon je peux te conseiller de mettre les dates dans des champs dates ...

+1
Tu cherche un bug, dans la lecture de ton blob alors que si ça se trouve l'erreur vient de l'écriture.

Quoi qu'il en soit, un blob n'est pas fait pour ça. Ajoute une colonne datetime sur ta table.


never let people work on more than one thing at once.

Hors ligne

 

#10 23-12-2010 15:56:09

bga  
Membre Geek
Date d'inscription: 02-09-2010
Messages: 54
Pépites: 225
Banque: 0

Re: Plantage lors de conversion d'un BLOB en DATETIME

oui je sais bien que le champ Blob n'est pas fait pour ca, mais je reprend de l'existant, je dois faire avec.

Je suis conscient que le problème vient surement de l'écriture mais la fonction dateTime devrait ressortir en erreur et pas rester planter! :-(

Hors ligne

 

#11 24-12-2010 08:38:35

xlat  
0xc0000005
Award: bf
Lieu: Tanger (طنج)
Date d'inscription: 04-12-2010
Messages: 720
Pépites: 11,343
Banque: 100,221,387,868,884,300
Site web

Re: Plantage lors de conversion d'un BLOB en DATETIME

Tu as vérifier le contenu binaire dans ta table : est-ce que ton datetime est stocké sous forme de chaine texte (si quel encodage) ou en binaire ?


https://lut.im/eJINqa9o/vAtyxD0h "Don't believe everything you read on the Internet"
    -- Abraham Lincoln

www.ngs.ma

Hors ligne

 

#12 03-01-2011 16:01:32

bga  
Membre Geek
Date d'inscription: 02-09-2010
Messages: 54
Pépites: 225
Banque: 0

Re: Plantage lors de conversion d'un BLOB en DATETIME

je ne sais pas trop comment faire pour comparer le contenu binaire!
si tu as une solution je suis preneur. je n'ai plus d'idées.

j'aurais au moins aimer tester avec un IsDate ou un truc dans le style avant de lancer DateTime qui ne redonne pas la main.
merci de m'aider

PS : je sais qu'un date time dans un Blob c'est pas beau mais j'ai pas le choix, l'appli est faite comme ca. Mais avec le passage en PB11 ca ne semble plus fonctionner, en tout cas pour ce cas particulier

Hors ligne

 

#13 03-01-2011 16:05:59

bga  
Membre Geek
Date d'inscription: 02-09-2010
Messages: 54
Pépites: 225
Banque: 0

Re: Plantage lors de conversion d'un BLOB en DATETIME

en fait si je fais
SELECT dbms_lob.substr(val_blob,20000,1)

j'ai
78DA02006E000B170A0D0E0A00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000


ca vous cause?

Hors ligne

 

#14 03-01-2011 19:30:58

xlat  
0xc0000005
Award: bf
Lieu: Tanger (طنج)
Date d'inscription: 04-12-2010
Messages: 720
Pépites: 11,343
Banque: 100,221,387,868,884,300
Site web

Re: Plantage lors de conversion d'un BLOB en DATETIME

Hmm, ca ressemblerait à "2010-12-23 10:13:14.187000" n'est-ce pas ?
Un petit reverse engineering et :

[1 .. 4]  : fraction of second as a long
[5 .. 6] = years - 1900 as an int
[7] = month -1 as a byte
[8] = day as a byte
[9] = hour as a byte
[10] = minute as a byte
[11] = second as a byte

Mais çà devrait suffir :-) :

Code: pb

messagebox("Relecture du datetime : ", string( DateTime(BlobMid(ablob_val_blob ,1,12)) ) )

https://lut.im/eJINqa9o/vAtyxD0h "Don't believe everything you read on the Internet"
    -- Abraham Lincoln

www.ngs.ma

Hors ligne

 

#15 04-01-2011 08:32:41

bga  
Membre Geek
Date d'inscription: 02-09-2010
Messages: 54
Pépites: 225
Banque: 0

Re: Plantage lors de conversion d'un BLOB en DATETIME

ouai c'est bien ca mais en fait j'ai dit une bétise, cette pas cette valeur qui déconne.

Par contre j'ai pas compris comment tu étais remonté a cette date, tu pourrais m'expliquer? ca ne depend pas du format ansi ou unicode?

merci

Hors ligne

 

#16 04-01-2011 09:14:07

bga  
Membre Geek
Date d'inscription: 02-09-2010
Messages: 54
Pépites: 225
Banque: 0

Re: Plantage lors de conversion d'un BLOB en DATETIME

ok en fait j'ai compris, mais il faut lire de gauche a droite et pas de droite a gauche
et comme c'est des nombre, ca ne tient pas compte du format ansi ou utf?
mes données ont été inscrite dans une version de pb en ansi alors que le le relis en PB11 qui est passé en unicode! ca peut poser problème.


Mais bon ce qui me gêne c'est que le DateTime ne rend pas la main même si le blob n'est pas bon
faut que je trouve une solution pour tester mon champ avant de faire un datetime

merci

Hors ligne

 

#17 04-01-2011 09:56:49

bga  
Membre Geek
Date d'inscription: 02-09-2010
Messages: 54
Pépites: 225
Banque: 0

Re: Plantage lors de conversion d'un BLOB en DATETIME

le 12eme octet 0A sert a quoi?

car sur ma date qui pose probleme j'ai 04!!
20 00 0D 00   6E 00   0B 11 0F 0A 35 04   ->  2010-12-17 15:10:53.852000

merci encore, au moins j'ai pas resolu mon problème mais j'arrive a comprendre. :-)

Hors ligne

 

#18 04-01-2011 10:56:09

bga  
Membre Geek
Date d'inscription: 02-09-2010
Messages: 54
Pépites: 225
Banque: 0

Re: Plantage lors de conversion d'un BLOB en DATETIME

encore moi, apres avoir fait des tests (update sur mon champ blob), le souci vient de la fraction de seconde!!! si je met 00 00 00 00 en place du 20 00 0D 00 ca passe....

du coup ca fait ramer (pas planter) le :
messagebox("Relecture du datetime : ", string( DateTime(BlobMid(lblob ,1,12)) ) )

Hors ligne

 

#19 04-01-2011 16:35:01

bga  
Membre Geek
Date d'inscription: 02-09-2010
Messages: 54
Pépites: 225
Banque: 0

Re: Plantage lors de conversion d'un BLOB en DATETIME

sinon comment tronquer le blob pour se limiter au seconde et virer les fractions de seconde?
on peut pas avec la fonction blob ecrire directement de l'hexa. car si je fait blob("0000") c'est pas 0x0000... snif

merci de votre aide

Hors ligne

 

#20 04-01-2011 19:09:03

xlat  
0xc0000005
Award: bf
Lieu: Tanger (طنج)
Date d'inscription: 04-12-2010
Messages: 720
Pépites: 11,343
Banque: 100,221,387,868,884,300
Site web

Re: Plantage lors de conversion d'un BLOB en DATETIME

bga a écrit:

ouai c'est bien ca mais en fait j'ai dit une bétise, cette pas cette valeur qui déconne.

Par contre j'ai pas compris comment tu étais remonté a cette date, tu pourrais m'expliquer? ca ne depend pas du format ansi ou unicode?

merci

Démonstration :

le code suivant montre comment j'en suis arrivé à cette conclusion de structure interne du datetime:

Code: pb

datetime ldt_now
blob{20} lbl_tmp  // 20 devrait suffir pour stocker une datetime (je ne sais pas encore la taille que cela prendra)
long i, m
//on prépare un datetime avec des valeurs remarquables
ldt_now= datetime( 1999-02-03, 04:05:06.789012)
//on encore le datetime dans notre blob cobaie
i = blobedit( lbl_tmp, 1, ldt_now )
//on va dumper le blob sous forme binaire (byte par byte, sans signification particuliere)
m = len( lbl_tmp )
byte b
string ls_dump
for i = 1 to m
  b = byte( BlobMid( lbl_tmp, i, 1 ) )
  ls_dump += string( b ) +', '
next
messagebox( "dump now ( "+string( ldt_now, "yyyy-mm-dd hh:mm:ss.ffffff" ) + ")", ls_dump )
/*
Output:
  ---------------------------
  dump now ( 1999-02-03 04:05:06.789012)
  ---------------------------
  20, 10, 12, 0, 99, 0, 1, 3, 4, 5, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
  ---------------------------
  OK   
  ---------------------------
*/
//On arrive à repérer la structure correspondante, partie par partie :
ulong fsec
uint years
byte month, day, hour, minute, second
fsec = long( blobmid( lbl_tmp, 1, 4 ) )
years = integer(blobmid( lbl_tmp, 5, 2 ) ) + 1900
month = byte( blobmid( lbl_tmp, 7, 1 ) ) + 1
day = byte( blobmid( lbl_tmp, 8, 1 ) ) 
hour = byte( blobmid( lbl_tmp, 9, 1 ) ) 
minute = byte( blobmid( lbl_tmp, 10, 1 ) ) 
second = byte( blobmid( lbl_tmp, 11, 1 ) ) 
messagebox( "les elements séparés:", string(years,'0000')+"-"+string(month,'00')+"-"+string(day,'00')+' '+&
  string(hour,'00')+':'+string(minute,'00')+':'+string(second,'00')+'.'+string(fsec,'000000') )
/*
Output:
---------------------------
les elements séparés:
---------------------------
1999-02-03 04:05:06.789012
---------------------------
OK   
---------------------------
*/
//on peut maitenant facilement récupérer le datetime connaissant sa taille ( 12 bytes ).
messagebox("Le datetime provenant du blob", string( DateTime(BlobMid(lbl_tmp ,1,12)),"yyyy-mm-dd hh:mm:ss.ffffff" ) )
/*
Output:
---------------------------
Le datetime provenant du blob
---------------------------
1999-02-03 04:05:06.789012
---------------------------
OK   
---------------------------
*/

https://lut.im/eJINqa9o/vAtyxD0h "Don't believe everything you read on the Internet"
    -- Abraham Lincoln

www.ngs.ma

Hors ligne

 

#21 04-01-2011 19:27:36

xlat  
0xc0000005
Award: bf
Lieu: Tanger (طنج)
Date d'inscription: 04-12-2010
Messages: 720
Pépites: 11,343
Banque: 100,221,387,868,884,300
Site web

Re: Plantage lors de conversion d'un BLOB en DATETIME

Je viens de faire un test avec la date qui plante chez toi et je reproduis la lenteur, sans l'histoire du 04 final en fait; il n'est pas pris en compte si tu fais le BlobMid(..., 12). pour le 04 final, j'obtiens 05 avec mon test, cela pourrait ressembler à un checksum ou numéro de version par exemple.
Je prend le code que j'ai mis au dessus et j'utilise la date que tu as remonté avant :

Code: pb

ldt_now= datetime( 2010-12-11, 15:10:35.852000 )

, et là, PB prend 100% du processeur et ne rend pas la main (je suis en 10.5.0.4523 pour ce test).

Dernière modification par xlat (04-01-2011 19:38:53)


https://lut.im/eJINqa9o/vAtyxD0h "Don't believe everything you read on the Internet"
    -- Abraham Lincoln

www.ngs.ma

Hors ligne

 

#22 04-01-2011 19:47:31

xlat  
0xc0000005
Award: bf
Lieu: Tanger (طنج)
Date d'inscription: 04-12-2010
Messages: 720
Pépites: 11,343
Banque: 100,221,387,868,884,300
Site web

Re: Plantage lors de conversion d'un BLOB en DATETIME

Pour finir, voici l'astuce que tu pourras utiliser pour neutraliser les fractions de secondes :

Code: pb

//on nettoie les factions de secondes :
long fsec_clear = 0
BlobEdit( lbl_tmp, 1, fsec_clear)
messagebox("Le datetime provenant du blob", string( DateTime(BlobMid(lbl_tmp ,1,12)),"yyyy-mm-dd hh:mm:ss.ffffff" ) )


Cela fonctionne bien sur la date qui "plantait" chez moi aussi.


https://lut.im/eJINqa9o/vAtyxD0h "Don't believe everything you read on the Internet"
    -- Abraham Lincoln

www.ngs.ma

Hors ligne

 

#23 05-01-2011 08:17:10

bga  
Membre Geek
Date d'inscription: 02-09-2010
Messages: 54
Pépites: 225
Banque: 0

Re: Plantage lors de conversion d'un BLOB en DATETIME

ouaou la demonstration du type datetime dans le blob...

en tout cas merci, donc il y a bien un bug sur cette date, je vais tronquer les fractions de secondes avec ta méthode, en tout cas merci beaucoup.

Hors ligne

 

#24 05-01-2011 15:10:09

xlat  
0xc0000005
Award: bf
Lieu: Tanger (طنج)
Date d'inscription: 04-12-2010
Messages: 720
Pépites: 11,343
Banque: 100,221,387,868,884,300
Site web

Re: Plantage lors de conversion d'un BLOB en DATETIME

xlat a écrit:

Je viens de faire un test avec la date qui plante chez toi et je reproduis la lenteur, sans l'histoire du 04 final en fait; il n'est pas pris en compte si tu fais le BlobMid(..., 12). pour le 04 final, j'obtiens 05 avec mon test, cela pourrait ressembler à un checksum ou numéro de version par exemple.
Je prend le code que j'ai mis au dessus et j'utilise la date que tu as remonté avant :

Code: pb

ldt_now= datetime( 2010-12-11, 15:10:35.852000 )

, et là, PB prend 100% du processeur et ne rend pas la main (je suis en 10.5.0.4523 pour ce test).

J'ai fais le même test en 11.5.1.4843 : ça ne plante pas et ne rame pas non plus.

Dernière modification par xlat (05-01-2011 15:10:24)


https://lut.im/eJINqa9o/vAtyxD0h "Don't believe everything you read on the Internet"
    -- Abraham Lincoln

www.ngs.ma

Hors ligne

 

#25 05-01-2011 16:00:03

bga  
Membre Geek
Date d'inscription: 02-09-2010
Messages: 54
Pépites: 225
Banque: 0

Re: Plantage lors de conversion d'un BLOB en DATETIME

moi je suis en 11.1 8123

ce qui voudrait dire que le bug a été corrigé!

Hors ligne

 

Pied de page des forums

Propulsé par FluxBB 1.2.22