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

  2. #2
    Membre expert
    Avatar de Barbibulle
    Profil pro
    Inscrit en
    Octobre 2002
    Messages
    2 048
    Détails du profil
    Informations personnelles :
    Âge : 54
    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+

  4. #4
    Membre expert
    Avatar de Barbibulle
    Profil pro
    Inscrit en
    Octobre 2002
    Messages
    2 048
    Détails du profil
    Informations personnelles :
    Âge : 54
    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

  6. #6
    Membre expert
    Avatar de Barbibulle
    Profil pro
    Inscrit en
    Octobre 2002
    Messages
    2 048
    Détails du profil
    Informations personnelles :
    Âge : 54
    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

+ 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