Précédent   Forum des professionnels en informatique > Bases de données > Firebird > SQL
SQL Forum d'entraide sur le SQL pour Firebird
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 20/05/2005, 10h59   #1
Invité de passage
 
Inscription : mai 2005
Messages : 12
Détails du profil
Informations forums :
Inscription : mai 2005
Messages : 12
Points : 1
Points : 1
Par défaut Pb avec une UDF sur firebird v1.5

Bonjour,

J'utilise un serveur en FB 1.5. J'ai des UDFs en C qui marchaient tres bien avant mais désormais je perds la connection à la base quand je fais appel à cette fonction:

int Month (ISC_QUAD * ib_date)
{
struct tm t;
isc_decode_date(ib_date, &t);
return t.tm_mon + 1;
}

Quand j'enleve le code isc_decode_date ca marche sans pb. Est-ce qu'il ya des changements sur l'utilisation des fonctions de decodage des dates?

Merci pour votre aide
jeanafond est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 20/05/2005, 11h34   #2
Membre Expert
 
Avatar de Barbibulle
 
Frédéric
Inscription : octobre 2002
Messages : 1 722
Détails du profil
Informations personnelles :
Nom : Frédéric
Âge : 42

Informations forums :
Inscription : octobre 2002
Messages : 1 722
Points : 2 025
Points : 2 025
Par défaut Re: Pb avec une UDF sur firebird v1.5

Citation:
Envoyé par jeanafond
J'utilise un serveur en FB 1.5. J'ai des UDFs en C qui marchaient tres bien avant
Pouriez vous être plus précis sur le avant ??? ca pourrait aider ?

Avant JC ?
Avant sous fb1.0 ?
avant sous Ib6 ?
Avant hier ?
Barbibulle est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 20/05/2005, 11h37   #3
Invité de passage
 
Inscription : mai 2005
Messages : 12
Détails du profil
Informations forums :
Inscription : mai 2005
Messages : 12
Points : 1
Points : 1
Désolé le : Avant c'était en firebird V1.0
Je viens de passer en V1.5
Merci
jeanafond est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 20/05/2005, 14h41   #4
Membre éclairé
 
Inscription : décembre 2004
Messages : 379
Détails du profil
Informations forums :
Inscription : décembre 2004
Messages : 379
Points : 304
Points : 304
j'ai constaté des différences entres interbase 6 /FB 1.0 et firebird 1.5

notament dans le moyen qu'utilise le serveur pour passer les dates, en principe, une recompliation avec les fichiers (include) de la version 1.5 devrait corriger le problème!?

cela dit, à plusieurs reprise j'ai eu des surprises avec "isc_decode_date", j'ai donc fait ma propre fonction (méthode de bourrin...) pour contourner les plaisanteries...

à titre d'infos, voiçi ce que j'utilise en lieu et place de "isc_decode_date", mais encore une fois, c'est une méthode de brute!
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
/****************************************************************************************************************
   BUT: Décoder une date en séparant l'année, le mois et le jour.
 
   La fonction DecodeDate n'est pas directement compatible Interbase/Firebird!
   La présente fonction est extraite des sources de Delphi et traduite en C
 
  CE: Date = Valeur Date
  --
 
  CS: (unsigned short) Year = année, Month = mois et Day = jour
  --
*/
void InternalDecodeDate( int Date, struct tm *Times )
{
  int D1 = 365;
 
  int D4 = D1 * 4 + 1;
 
  int D100 = D4 * 25 - 1;
  int D400 = D100 * 4 + 1;
  int Y, M, I;
  div_t X;
  int (*DayTable)[12];
  int MonthDays[2][12] = { { 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 },
                           { 31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 } };
 
  //pas de date, alors tout à 0
  IF( !Date )
  {
    Times->tm_year = 0;
    Times->tm_mon  = 0;
    Times->tm_mday = 0;
    RETURN;
  }
 
  //convertion de la date Interbase/Firebird (base 01/01/100) sur la base du 01/01/0001
  Date += DeltaDate;
  Y     = 1;
 
  while( Date >= D400 )
  {
    Date -= D400;
    Y    += 400;
  };
 
 
  X = div( Date, D100 );
 
  IF( X.quot == 4 )
  {
    X.quot--;
    X.rem += D100;
  }
 
  Y += X.quot * 100;
 
  X  = div( X.rem, D4 );
  Y += X.quot * 4 ;
 
  X  = div( X.rem, D1 );
 
  IF( X.quot == 4 )
  {
    X.quot--;
    X.rem += D1;
 
 
  }
 
 
  Y += X.quot;
  M  = 1;
 
 
  //isole la TABLE des nombres de jours en fonction de l'année bissextile
  DayTable = &MonthDays[ ( Y % 4 == 0 ) && ( ( Y % 100 != 0 ) || ( Y % 400 == 0 ) ) ];
 
  while( 1 )
  {
    I = (*DayTable)[M - 1];
 
    if( X.rem < I )
      break;
 
    X.rem -= I;
    M++;
  }
 
  //résultat de la convertion
  Times->tm_year = Y;
  Times->tm_mon  = M;
  Times->tm_mday = X.rem + 1;
}
DeltaDate est déclaré comme suit: "const int DeltaDate = 678575;"

un usage pex:
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
/***************************************************************************
 
  BUT: Formater une date en format ISO: yyyy-mm-dd
 
  CE: DateTime = Date
  --  SOut     = Buffer de 10 caracteres plus le 0 terminal
 
  CS:
  --
 
DECLARE EXTERNAL FUNCTION ISODate
        TimeStamp,
        CSTRING(10) CHARACTER SET NONE
        RETURNS PARAMETER 2
        ENTRY_POINT 'FISODate' MODULE_NAME 'udfsys2002';
 
*/
UDFEXPORT void FISODate( ISC_TIMESTAMP *DT, UNSIGNED char *SOut )
{
  struct tm Times;
  InternalDecodeDate( DT->timestamp_date, &Times );
 
  sprintf( (char *)SOut, "%04d-%02d-%02d", Times.tm_year, Times.tm_mon, Times.tm_mday );
 
  RETURN;
 
}
UDFEXPORT est déclaré comme suit:
Code :
1
2
3
4
5
6
7
#undef UDFEXPORT
 
#if (defined(_MSC_VER) && defined(_WIN32)) || (defined(__BORLANDC__) && (defined(__WIN32__) || defined(__OS2__)))
#define UDFEXPORT extern "C" __declspec(dllexport)
#else
#define UDFEXPORT extern "C"
#endif
en espérant que cela t'aide.

a propos, tu fais quoi lorsque le mois et le 12ème??
jean-jacques varvenne est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 20/05/2005, 15h05   #5
Membre Expert
 
Avatar de Barbibulle
 
Frédéric
Inscription : octobre 2002
Messages : 1 722
Détails du profil
Informations personnelles :
Nom : Frédéric
Âge : 42

Informations forums :
Inscription : octobre 2002
Messages : 1 722
Points : 2 025
Points : 2 025
Citation:
Envoyé par jean-jacques varvenne
a propos, tu fais quoi lorsque le mois et le 12ème??
Ben quoi tu n'as pas de 13eme mois ?
Barbibulle est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 20/05/2005, 16h11   #6
Invité de passage
 
Inscription : mai 2005
Messages : 12
Détails du profil
Informations forums :
Inscription : mai 2005
Messages : 12
Points : 1
Points : 1
Merci pour votre aide, ca me dépanne bien. J'ai recompilé avec les includes mais ca ne compile pas.
Sinon c'est quoi le type div_t qui est utilisé dans la fonction?
Au risuqe d'abuser, je n'ai pas fait d'essai mais est-ce qu'il faut faire pareil pour encode_date?
jeanafond est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 20/05/2005, 16h28   #7
Invité de passage
 
Inscription : mai 2005
Messages : 12
Détails du profil
Informations forums :
Inscription : mai 2005
Messages : 12
Points : 1
Points : 1
Désolé j'ai trouvé pour div_t dans stdlib. Par contre, j'ai pas compreis avec le 12 eme mois??? Je teste le enconde date pour voir si j'ai le problème aussi. Encore merci
jeanafond est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 20/05/2005, 17h29   #8
Membre Expert
 
Avatar de Barbibulle
 
Frédéric
Inscription : octobre 2002
Messages : 1 722
Détails du profil
Informations personnelles :
Nom : Frédéric
Âge : 42

Informations forums :
Inscription : octobre 2002
Messages : 1 722
Points : 2 025
Points : 2 025
Citation:
Envoyé par jeanafond
Désolé j'ai trouvé pour div_t dans stdlib. Par contre, j'ai pas compreis avec le 12 eme mois??? Je teste le enconde date pour voir si j'ai le problème aussi. Encore merci
Non rien c'est qu'en lisant vite ton code on a l'impression que tu veux incrémenté le mois de un. Sans tester si le résultat > 12 alors renvoyer 1.

Mais en lisant mieux ta fonction (qui exite déjà en natif d'ailleur) renvoit tout simplement le numéro du mois. Tu y ajoutes 1 car tm_mon commence à 0 pour janvier...

J'ai juste surenchérie sur la remarqye de jjv.


Extract( month from date )
Et pas mal d'UDF ont cette fonction également.
Barbibulle 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 07h40.


 
 
 
 
Partenaires

Hébergement Web