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 :

Instruction de concatenation dans une procedure stocké


Sujet :

SQL Firebird

  1. #1
    Membre éprouvé
    Avatar de Andry
    Profil pro
    Informaticien
    Inscrit en
    Juillet 2002
    Messages
    1 164
    Détails du profil
    Informations personnelles :
    Localisation : Madagascar

    Informations professionnelles :
    Activité : Informaticien

    Informations forums :
    Inscription : Juillet 2002
    Messages : 1 164
    Points : 1 181
    Points
    1 181
    Par défaut Instruction de concatenation dans une procedure stocké
    Salut à tous,

    J'ai deux table DOSSIER et UTILISATEUR dont voici les champs
    TABLE UTILISATEUR
    • US_NO SMALLINT
      US_INIT CHAR(02)
      US_ID VARCHAR(10)

    TABLE DOSSIER
    • DS_NO INTEGER
      DS_NUM VARCHAR(10)
      DS_PAR SMALLINT
      ...


    Et voici ma procedure qui insert dans DOSSIER
    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
     
    CREATE PROCEDURE DOSSIER_INSERT (
        DS_NUM VARCHAR(10),
        OPER VARCHAR(10))
    RETURNS (
        NUM INTEGER)
    AS
    DECLARE VARIABLE US_INIT CHAR(2);
    DECLARE VARIABLE US_NO  SMALLINT;
    BEGIN
      NUM = GEN_ID(GEN_DOSSIER_NO, 1);
      Select US_INIT,US_NO from TUTILISATEUR  where US_ID   = :OPER   into US_INIT, US_NO;
      INSERT INTO TDOSSIER (
        DS_NO,
        DS_NUM,
        DS_PAR)
      VALUES (
        :NUM,
        :DS_NUM,
        :US_NO);
    END
    Cette ps est incomplet DS_NUM n'est pas renseigné et est possible qu'il doit y avoir des erreur.
    En faite, DS_NUM est du style AN000047 qui est la concatenantion de NUM et de US_INIT puis formaté pour que le nombre de lettre après AN soit de 6 (000047).
    Actuellement, j'aliment DS_NUM manuellement en faisant la concatenantion sous Delphi.
    Y at-il un moyen de le faire dans le ps ?

    Merci

    COmment puis
    On progresse .....

  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
    Rfunc !!

    Avec IntToStr.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    DS_NUM = US_INIT || IntToStr(NUM,'%06u');

  3. #3
    Membre éprouvé
    Avatar de Andry
    Profil pro
    Informaticien
    Inscrit en
    Juillet 2002
    Messages
    1 164
    Détails du profil
    Informations personnelles :
    Localisation : Madagascar

    Informations professionnelles :
    Activité : Informaticien

    Informations forums :
    Inscription : Juillet 2002
    Messages : 1 164
    Points : 1 181
    Points
    1 181
    Par défaut
    Ok Barbibulle,

    Je vais télécharger l'UDF RFunc et procedé à son installation.
    Puis on verra

    A+
    On progresse .....

  4. #4
    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
    Sinon tu peux le faire sans rfunc mais c'est lourd :
    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
    ...
    DECLARE VARIABLE PREFIX VARCHAR(5);
    BEGIN
    ....
     
    If (NUM<10) then
      PREFIX='00000';
    else
    If (NUM<100) then
      PREFIX='0000';
    else
    If (NUM<1000) then
      PREFIX='000';
    else
    If (NUM<10000) then
      PREFIX='00';
    else
    If (NUM<100000) then
      PREFIX='0';
    else
      PREFIX='';
    DS_NUM = US_INIT || PREFIX || CAST(NUM as varchar(6));
    /*Le cast n'est pas obligatoire */

  5. #5
    Membre éprouvé
    Avatar de Andry
    Profil pro
    Informaticien
    Inscrit en
    Juillet 2002
    Messages
    1 164
    Détails du profil
    Informations personnelles :
    Localisation : Madagascar

    Informations professionnelles :
    Activité : Informaticien

    Informations forums :
    Inscription : Juillet 2002
    Messages : 1 164
    Points : 1 181
    Points
    1 181
    Par défaut
    C'est fabuleux, en plus c'est gratuit.

    En fin voilà mon procedure stocké en general :
    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
    94
    95
    96
     
    CREATE PROCEDURE DOSSIER_INSERT (
        DS_DT DATE,
        DS_TM TIME,
        OPER VARCHAR(10),
        DS_CRSPD VARCHAR(30),
        CLIENT VARCHAR(50),
        DS_AR VARCHAR(20),
        MARQUE VARCHAR(15),
        DS_SN VARCHAR(15),
        CATPB VARCHAR(50),
        ETAT CHAR(2),
        DS_DETAIL BLOB SUB_TYPE 1 SEGMENT SIZE 80,
        DS_FACT_NUM VARCHAR(15),
        DS_FACT_DT DATE,
        DS_WTLBR SMALLINT,
        DS_WTLBR_DEB DATE,
        DS_WTLBR_FIN DATE,
        DS_WTPCE SMALLINT,
        DS_WTPCE_DEB DATE,
        DS_WTPCE_FIN DATE,
        DS_CAR_BLK SMALLINT,
        DS_CAR_COL SMALLINT,
        DS_TONNER SMALLINT,
        DS_ALIM SMALLINT)
    RETURNS (
        NUM INTEGER)
    AS
    DECLARE VARIABLE MQ_NO SMALLINT;
    DECLARE VARIABLE CPB_NO SMALLINT;
    DECLARE VARIABLE ETA_NO SMALLINT;
    DECLARE VARIABLE US_NO SMALLINT;
    DECLARE VARIABLE US_INT CHAR(2);
    DECLARE VARIABLE CL_NO INTEGER;
    DECLARE VARIABLE DS_NUM VARCHAR(8);
    BEGIN
      NUM = GEN_ID(GEN_DOSSIER_NO, 1);
      Select MQ_NO from TMARQUE     where MQ_ID     = :MARQUE   into MQ_NO;
      Select CPB_NO from tcatprob   where CPB_DSC   = :catpb    into CPB_NO;
      Select ETA_NO from TETATDS    where ETA_ID    = :ETAT     into ETA_NO;
      Select US_NO,US_INT from TUSER       where US_ID     = :OPER     into US_NO,US_INT;
      Select CL_NO from TCLIENT     where CL_NOM    = :CLIENT   into CL_NO;
      DS_NUM = US_INT || IntToStr(NUM,'%06u');
      INSERT INTO TDOSSIER (
        DS_NO,
        DS_NUM,
        DS_DT,
        DS_TM,
        DS_PAR,
        DS_CRSPD,
        DS_CL,
        DS_AR,
        DS_MRQ,
        DS_SN,
        DS_CPB,
        DS_ETA,
        DS_DETAIL,
        DS_FACT_NUM,
        DS_FACT_DT,
        DS_WTLBR,
        DS_WTLBR_DEB,
        DS_WTLBR_FIN,
        DS_WTPCE,
        DS_WTPCE_DEB,
        DS_WTPCE_FIN,
        DS_CAR_BLK,
        DS_CAR_COL,
        DS_TONNER,
        DS_ALIM)
      VALUES (
        :NUM,
        :DS_NUM,
        :DS_DT,
        :DS_TM,
        :US_NO,
        :DS_CRSPD,
        :CL_NO,
        :DS_AR,
        :MQ_NO,
        :DS_SN,
        :CPB_NO,
        :ETA_NO,
        :DS_DETAIL,
        :DS_FACT_NUM,
        :DS_FACT_DT,
        :DS_WTLBR,
        :DS_WTLBR_DEB,
        :DS_WTLBR_FIN,
        :DS_WTPCE,
        :DS_WTPCE_DEB,
        :DS_WTPCE_FIN,
        :DS_CAR_BLK,
        :DS_CAR_COL,
        :DS_TONNER,
        :DS_ALIM);
    END
    La seconde question est est ce optimisé (je parle de l'utilisation des blob en paramètre).

    Merci
    On progresse .....

  6. #6
    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
    Je ne vois pas ou est le probleme. Ni comment faire autrement (pour le Blob).

  7. #7
    Membre éprouvé
    Avatar de Andry
    Profil pro
    Informaticien
    Inscrit en
    Juillet 2002
    Messages
    1 164
    Détails du profil
    Informations personnelles :
    Localisation : Madagascar

    Informations professionnelles :
    Activité : Informaticien

    Informations forums :
    Inscription : Juillet 2002
    Messages : 1 164
    Points : 1 181
    Points
    1 181
    Par défaut
    Merci de tes conseils Barbibule, tu es toujours là quand on en a besoin.
    Encore bravo.

    Sinon, je commence a beaucoup coder en ps vu que c'est plus facile à maintenir au cas ou on aura besoin de modification, plutot que de modifier la prog source cliente, et ça permet aussi de masquer le traitement du coté client.

    Encore merci
    On progresse .....

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Executer une chaine concatener dans une procedure stockée
    Par nic413 dans le forum SQL Procédural
    Réponses: 6
    Dernier message: 19/06/2006, 10h24
  2. alternative à la création de vues dans une procedure stockée
    Par cladsam dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 01/09/2005, 17h07
  3. Réponses: 6
    Dernier message: 24/09/2004, 13h10
  4. Réponses: 3
    Dernier message: 21/09/2004, 07h35
  5. Probleme dans une procedure stockée
    Par malbaladejo dans le forum MS SQL Server
    Réponses: 5
    Dernier message: 07/07/2004, 14h08

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