IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

SQL Firebird Discussion :

Pb avec une UDF sur firebird v1.5


Sujet :

SQL Firebird

  1. #1
    Futur Membre du Club
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    12
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2005
    Messages : 12
    Points : 6
    Points
    6
    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

  2. #2
    Membre expert
    Avatar de Barbibulle
    Profil pro
    Inscrit en
    Octobre 2002
    Messages
    2 048
    Détails du profil
    Informations personnelles :
    Âge : 53
    Localisation : France

    Informations forums :
    Inscription : Octobre 2002
    Messages : 2 048
    Points : 3 342
    Points
    3 342
    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 ?

  3. #3
    Futur Membre du Club
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    12
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2005
    Messages : 12
    Points : 6
    Points
    6
    Par défaut
    Désolé le : Avant c'était en firebird V1.0
    Je viens de passer en V1.5
    Merci

  4. #4
    Membre averti

    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    379
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2004
    Messages : 379
    Points : 376
    Points
    376
    Par défaut
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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??

  5. #5
    Membre expert
    Avatar de Barbibulle
    Profil pro
    Inscrit en
    Octobre 2002
    Messages
    2 048
    Détails du profil
    Informations personnelles :
    Âge : 53
    Localisation : France

    Informations forums :
    Inscription : Octobre 2002
    Messages : 2 048
    Points : 3 342
    Points
    3 342
    Par défaut
    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 ?

  6. #6
    Futur Membre du Club
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    12
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2005
    Messages : 12
    Points : 6
    Points
    6
    Par défaut
    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?

  7. #7
    Futur Membre du Club
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    12
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2005
    Messages : 12
    Points : 6
    Points
    6
    Par défaut
    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

  8. #8
    Membre expert
    Avatar de Barbibulle
    Profil pro
    Inscrit en
    Octobre 2002
    Messages
    2 048
    Détails du profil
    Informations personnelles :
    Âge : 53
    Localisation : France

    Informations forums :
    Inscription : Octobre 2002
    Messages : 2 048
    Points : 3 342
    Points
    3 342
    Par défaut
    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.

Discussions similaires

  1. Réponses: 1
    Dernier message: 23/08/2006, 14h11
  2. Comment interfacer une apllication pour mobile gsm avec une application sur pc
    Par appsn dans le forum Développement Mobile en Java
    Réponses: 2
    Dernier message: 19/08/2006, 13h22
  3. [Oracle 10g]probleme avec une CONSTRAINT sur UPDATE
    Par Battosaiii dans le forum Langage SQL
    Réponses: 5
    Dernier message: 17/04/2006, 19h05
  4. pb avec une sauvegarde sur disquette
    Par kivoch dans le forum Débuter
    Réponses: 5
    Dernier message: 09/01/2005, 12h19
  5. Problème avec une UDF
    Par kanmaber dans le forum Bases de données
    Réponses: 2
    Dernier message: 27/08/2004, 23h42

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo