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 05/08/2004, 11h09   #1
Membre émérite
 
Avatar de Andry
 
Inscription : juillet 2002
Messages : 1 109
Détails du profil
Informations personnelles :
Localisation : Madagascar

Informations forums :
Inscription : juillet 2002
Messages : 1 109
Points : 949
Points : 949
Envoyer un message via MSN à Andry
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 :
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 .....
Andry est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 05/08/2004, 11h25   #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
Rfunc !!

Avec IntToStr.

Code :
DS_NUM = US_INIT || IntToStr(NUM,'%06u');
Barbibulle est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 05/08/2004, 11h42   #3
Membre émérite
 
Avatar de Andry
 
Inscription : juillet 2002
Messages : 1 109
Détails du profil
Informations personnelles :
Localisation : Madagascar

Informations forums :
Inscription : juillet 2002
Messages : 1 109
Points : 949
Points : 949
Envoyer un message via MSN à Andry
Ok Barbibulle,

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

A+
__________________
On progresse .....
Andry est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 05/08/2004, 11h53   #4
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
Sinon tu peux le faire sans rfunc mais c'est lourd :
Code :
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 */
Barbibulle est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 05/08/2004, 12h13   #5
Membre émérite
 
Avatar de Andry
 
Inscription : juillet 2002
Messages : 1 109
Détails du profil
Informations personnelles :
Localisation : Madagascar

Informations forums :
Inscription : juillet 2002
Messages : 1 109
Points : 949
Points : 949
Envoyer un message via MSN à Andry
C'est fabuleux, en plus c'est gratuit.

En fin voilà mon procedure stocké en general :
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
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 .....
Andry est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 05/08/2004, 12h37   #6
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
Je ne vois pas ou est le probleme. Ni comment faire autrement (pour le Blob).
Barbibulle est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 05/08/2004, 13h15   #7
Membre émérite
 
Avatar de Andry
 
Inscription : juillet 2002
Messages : 1 109
Détails du profil
Informations personnelles :
Localisation : Madagascar

Informations forums :
Inscription : juillet 2002
Messages : 1 109
Points : 949
Points : 949
Envoyer un message via MSN à Andry
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 .....
Andry est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 15h38.


 
 
 
 
Partenaires

Hébergement Web