Précédent   Forum des professionnels en informatique > Bases de données > Oracle > Outils > Forms
Forms Forum d'entraide sur Oracle Forms
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 04/12/2006, 17h26   #1
Invité de passage
 
Inscription : décembre 2006
Messages : 6
Détails du profil
Informations forums :
Inscription : décembre 2006
Messages : 6
Points : 0
Points : 0
Par défaut Développement code barre

bonjour,

je travaille en Afrique de l'ouest (Dakar et Abidjan).
j'utilise une base 10g, mon application est developpée avec forms6i et reports6i.
Pour faire simple, je dois développer des add-on qui permettront d'une part d'éditer des étiquettes avec un code barre, d'autre part de facturer avec la lecture de ces étiquettes.

Pour l'édition des étiquettes, est-il plus facile d'utiliser un logiciel qui ira chercher les infos dans ma base ?

Si j'ajoute une zone dans ma table ARTICLE, est-elle en VARCHAR2(13) ?

Pour ce qui est de la facturation, si je mets sur mes postes, un lecteur de code à barre, comment cela se programme-t-il directement dans mon source en 6i ?

Pour l'édition de la facture, si je passe par une imprimante thermique, comment se fait le passage des données entre le report en 6i et l'impression du ticket ?

Merci d'avance et bonne journée à vs tous
bernabe est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 05/12/2006, 11h16   #2
McM
Expert Confirmé Sénior
 
Inscription : juillet 2003
Messages : 3 450
Détails du profil
Informations forums :
Inscription : juillet 2003
Messages : 3 450
Points : 4 209
Points : 4 209
Salut,

Pour les code barre, tu as le site de GrandZebu
http://grandzebu.net/informatique/codbar/codbar.htm
McM est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 05/12/2006, 11h20   #3
Rédacteur
 
Avatar de bouyao
 
Inscription : janvier 2005
Messages : 1 778
Détails du profil
Informations forums :
Inscription : janvier 2005
Messages : 1 778
Points : 1 857
Points : 1 857
La lecture d'un code à barre c'est comme vous tapez sur le clavier. Donc ca ne se programme pas dans Forms.
bouyao est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 05/12/2006, 11h58   #4
McM
Expert Confirmé Sénior
 
Inscription : juillet 2003
Messages : 3 450
Détails du profil
Informations forums :
Inscription : juillet 2003
Messages : 3 450
Points : 4 209
Points : 4 209
Citation:
Envoyé par bernabe
Pour l'édition des étiquettes, est-il plus facile d'utiliser un logiciel qui ira chercher les infos dans ma base ?
Tout dépend comment tu imprimes.

1 - Si c'est par report sur une imprimante normale, tu peux le faire avec une fonction qui te crée le code et une police de code barre. (Pb : Installer la police code barre sur le report serveur).
Autre solution : Avoir une fonction qui à partir du code te donne les 1 et 0 (barres noires et blanches). Ensuite avec 2 images (1 barre noire - 1 barre blanche) tu crées ton code barre dans le report.
Dernière solution (en exemple à la fin) : Pas d'image, tout est géré dans le report par un champ de taille fixe pour les barres

2 - Si c'est sur une imprimante thermique de gestion d'étiquette, elles ont leur propre langage de programmation.

Citation:
Si j'ajoute une zone dans ma table ARTICLE, est-elle en VARCHAR2(13) ?
Crée une zone de la taille des données que tu vas avoir à coder.
Logiquement tu ne dois pas stocker le code résultant.

Citation:
Pour ce qui est de la facturation, si je mets sur mes postes, un lecteur de code à barre, comment cela se programme-t-il directement dans mon source en 6i ?
Le lecteur code barre lit un code barre et envoie la donnée dans le buffer clavier, puis fait un "ENTREE" (paramétrage par défaut en général).
C'est comme si tu tappais sur ton clavier. Donc pas de souci de ce côté.

Citation:
Pour l'édition de la facture, si je passe par une imprimante thermique, comment se fait le passage des données entre le report en 6i et l'impression du ticket ?
Faut voir la programmation de l'imprimante thermique.
Celle que j'ai : C'est du mode DOS Parallèle.
J'ai créé les fonds d'étiquette, envoyé ces fonds dans la mémoire de l'imprimante. Ensuite dans mon écran, je crée un fichier txt sur le poste client avec les paramètres pour le fond, je fait un print par le host et l'impression sort.

Voici quelques fonctions qui peuvent servir.

Voici la fonction de Renvoi du code EAN128 format B+C
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
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
CREATE OR REPLACE FUNCTION STO_F_TRANSFO_EAN128( chaine IN VARCHAR2)
 
RETURN VARCHAR2
IS
/* Fonction pour transformer une chaine de caractere en chaine code 128 en PL/SQL */
/* Traduction de la fonction VB de Grandzebu par Nicolas Fanchamps en PL/SQL */
 
  ind INT := 1; /* Indice d'avancement dans la chaine de caractère */
  checksum INT; /* Caractère de vérification de la chaine codée */
  mini INT; /* nbr de caractères numériques en suivant */
  dummy INT; /* Traitement de 2 caractères à la fois */
  tableB BOOLEAN; /* Booleen pour vérifier si on doit utiliser la table B du code 128 */
  code128 VARCHAR2(100); /* Chaine codée */
  longueur INT; /* Longueur de la chaine à coder pour valeur max de la boucle */
 
BEGIN
 
  code128 := '';
  longueur := LENGTH(chaine);
 
--###############################################
--# Première partie : vérification de la chaine #
--###############################################  
  IF longueur IS NULL 
  THEN 
        RETURN ('Chaine vide!!!');
  ELSE --Vérification de la validité de la chaine
        FOR  ind  IN 1 .. longueur
        LOOP
            IF ASCII(SUBSTR(chaine, ind, 1)) < 32
            OR ASCII(SUBSTR(chaine, ind, 1)) > 126
            THEN
                RETURN ('Chaine invalide!!!');
            END IF;
        END LOOP;
  END IF;
 
--##############################################
--# Deuxieme partie : encodage de la chaine en #
--#  optimisant l'usage des table B et C       #
--##############################################  
 
tableB := TRUE;
WHILE ind <= longueur
LOOP
 
      IF tableB = TRUE
      THEN    
          --Voir si c'est intéressant de passer en table C
          --Oui pour 4 chiffres au début ou a la fin, sinon pour 6 chiffres (repassage en B)
          IF ind = 1 OR ind + 3 = longueur
          THEN mini := 4;
          ELSE mini := 6;
          END IF;
 
          --TestNum : si les caractères à partir de ind sont numériques, alors on passe en table C 
          IF LENGTH(SUBSTR(chaine, ind)) 
			- NVL( LENGTH(LTRIM(SUBSTR(chaine, ind), '0123456789')),0) >= mini
          THEN
              IF ind = 1
              THEN --Débuter sur la table C
                  code128 := CHR(205);
              ELSE --Commuter sur la table C
                code128 := code128 || CHR(199);
              END IF;
              tableB := FALSE;
          ELSE
			IF ind = 1
			THEN --Débuter sur la table B 
			code128 := CHR(204);
			END IF;
          END IF;
 
      END IF;
 
      IF tableB = FALSE
      THEN --On est sur la table C, on va essayer de traiter 2 chiffres
 
          IF LENGTH(SUBSTR(chaine, ind)) 
			 - NVL( LENGTH(LTRIM(SUBSTR(chaine, ind), '0123456789')),0) >= 2
          THEN --OK Pour 2 chiffres, les traiter
              dummy := TO_NUMBER(SUBSTR(chaine, ind, 2));
              IF (dummy < 95)
              THEN
                  dummy := dummy + 32;
              ELSE
                dummy := dummy + 100;
              END IF;
            code128 := code128 || CHR(dummy);
            ind := ind + 2;
          ELSE
            --On n'a pas deux chiffres, retourner en table B  
            code128 := code128 || CHR(200);
            tableB := TRUE;
          END IF;
 
      END IF;
 
      IF tableB = TRUE
      THEN
          code128 := code128 || SUBSTR(chaine, ind, 1);
          ind := ind + 1;
      END IF;
 
END LOOP;
 
--Calcul de la clef de controle
FOR ind IN 1 .. LENGTH(code128)
LOOP
    dummy := ASCII(SUBSTR(code128, ind, 1));
 
    IF dummy < 127
    THEN dummy := dummy - 32;
    ELSE dummy := dummy - 100;
    END IF;
 
    IF ind = 1
    THEN checksum := dummy;
    END IF;
 
    checksum := MOD(checksum + (ind-1) * dummy, 103);
END LOOP;
 
      --Calcul du code ascii de la clef de controle
    IF checksum < 95
    THEN checksum := checksum + 32;
    ELSE checksum := checksum + 100;
    END IF;
 
    --Ajout de la clef et du STOP a la fin de la chaine codée
    code128 := code128 || CHR(checksum) || CHR(206);
 
    RETURN code128;
 
END;
/

Pour le report, j'ai une Query sur ma TABLE TARTICLE (je vais coder le champ article en EAN128).
Une 2ème Query va ramener les 0,1 qui composent le code.
Une repeating frame Horizontale sur cette query avec un champ (Noir pour les barres) va simplement afficher le code bar
Query 2 :
Code :
1
2
3
SELECT cod_ascii FROM 
  TABLE(STO_Pkg_Cur.F_Get_128(:article))
ORDER BY num
Un format trigger sur mon champ
Code :
1
2
3
4
5
6
7
8
IF (:COD_ASCII = '0')
  then
    srw.set_foreground_border_color('white');
    srw.set_border_pattern('solid');
    srw.set_foreground_fill_color('white');
    srw.set_fill_pattern('solid');
    srw.set_text_color('white');
  end IF;
Pour le package voici les choses nécessaire (y'a peut-être des améliorations)
Code :
1
2
3
4
5
6
7
8
CREATE OR REPLACE
TYPE TYP_REC_128 AS OBJECT 
(   NUM         NUMBER, 
  COD_ASCII    NUMBER(4) 
)
 
CREATE OR REPLACE
TYPE TYP_TAB_REC_128 AS TABLE OF TYP_REC_128
Code :
1
2
3
4
5
CREATE OR REPLACE PACKAGE STO_PKG_CUR
IS
	FUNCTION F_Get_128 (p_label IN VARCHAR2) RETURN TYP_TAB_REC_128 PIPELINED ;
	TYPE BARCODE IS TABLE OF VARCHAR2(20) INDEX BY BINARY_INTEGER;
END  STO_PKG_CUR ;
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
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
CREATE OR REPLACE PACKAGE BODY STO_PKG_CUR
IS
 
  FUNCTION F_Get_128(p_label IN VARCHAR2) RETURN TYP_TAB_REC_128 PIPELINED
  IS
   Trec  TYP_REC_128 := TYP_REC_128(NULL, NULL);
	code_bar BARCODE;
	v_ascii VARCHAR2(20);
	v_code VARCHAR2(2000);
	j NUMBER := 0;
  BEGIN
 
code_bar(32) :='11011001100';
code_bar(33) :='11001101100';
code_bar(34) :='11001100110';
code_bar(35) :='10010011000';
code_bar(36) :='10010001100';
code_bar(37) :='10001001100';
code_bar(38) :='10011001000';
code_bar(39) :='10011000100';
code_bar(40) :='10001100100';
code_bar(41) :='11001001000';
code_bar(42) :='11001000100';
code_bar(43) :='11000100100';
code_bar(44) :='10110011100';
code_bar(45) :='10011011100';
code_bar(46) :='10011001110';
code_bar(47) :='10111001100';
code_bar(48) :='10011101100';
code_bar(49) :='10011100110';
code_bar(50) :='11001110010';
code_bar(51) :='11001011100';
code_bar(52) :='11001001110';
code_bar(53) :='11011100100';
code_bar(54) :='11001110100';
code_bar(55) :='11101101110';
code_bar(56) :='11101001100';
code_bar(57) :='11100101100';
code_bar(58) :='11100100110';
code_bar(59) :='11101100100';
code_bar(60) :='11100110100';
code_bar(61) :='11100110010';
code_bar(62) :='11011011000';
code_bar(63) :='11011000110';
code_bar(64) :='11000110110';
code_bar(65) :='10100011000';
code_bar(66) :='10001011000';
code_bar(67) :='10001000110';
code_bar(68) :='10110001000';
code_bar(69) :='10001101000';
code_bar(70) :='10001100010';
code_bar(71) :='11010001000';
code_bar(72) :='11000101000';
code_bar(73) :='11000100010';
code_bar(74) :='10110111000';
code_bar(75) :='10110001110';
code_bar(76) :='10001101110';
code_bar(77) :='10111011000';
code_bar(78) :='10111000110';
code_bar(79) :='10001110110';
code_bar(80) :='11101110110';
code_bar(81) :='11010001110';
code_bar(82) :='11000101110';
code_bar(83) :='11011101000';
code_bar(84) :='11011100010';
code_bar(85) :='11011101110';
code_bar(86) :='11101011000';
code_bar(87) :='11101000110';
code_bar(88) :='11100010110';
code_bar(89) :='11101101000';
code_bar(90) :='11101100010';
code_bar(91) :='11100011010';
code_bar(92) :='11101111010';
code_bar(93) :='11001000010';
code_bar(94) :='11110001010';
code_bar(95) :='10100110000';
code_bar(96) :='10100001100';
code_bar(97) :='10010110000';
code_bar(98) :='10010000110';
code_bar(99) :='10000101100';
code_bar(100) :='10000100110';
code_bar(101) :='10110010000';
code_bar(102) :='10110000100';
code_bar(103) :='10011010000';
code_bar(104) :='10011000010';
code_bar(105) :='10000110100';
code_bar(106) :='10000110010';
code_bar(107) :='11000010010';
code_bar(108) :='11001010000';
code_bar(109) :='11110111010';
code_bar(110) :='11000010100';
code_bar(111) :='10001111010';
code_bar(112) :='10100111100';
code_bar(113) :='10010111100';
code_bar(114) :='10010011110';
code_bar(115) :='10111100100';
code_bar(116) :='10011110100';
code_bar(117) :='10011110010';
code_bar(118) :='11110100100';
code_bar(119) :='11110010100';
code_bar(120) :='11110010010';
code_bar(121) :='11011011110';
code_bar(122) :='11011110110';
code_bar(123) :='11110110110';
code_bar(124) :='10101111000';
code_bar(125) :='10100011110';
code_bar(126) :='10001011110';
code_bar(195) :='10111101000';
code_bar(196) :='10111100010';
code_bar(197) :='11110101000';
code_bar(198) :='11110100010';
code_bar(199) :='10111011110';
code_bar(200) :='10111101110';
code_bar(201) :='11101011110';
code_bar(202) :='11110101110';
code_bar(203) :='11010000100';
code_bar(204) :='11010010000';
code_bar(205) :='11010011100';
code_bar(206) :='1100011101011';
 
v_code := STO_F_TRANSFO_EAN128(p_label);
 
		FOR i IN 1..LENGTH(v_code)
		LOOP
			v_ascii := code_bar(ASCII(SUBSTR(v_code, i, 1)));
 
			FOR l IN 1..LENGTH(v_ascii)
			LOOP
				j := j + 1;
 
				Trec.num  		:= j;
				Trec.cod_ascii  := SUBSTR(v_ascii, l, 1);
 
		       -- Return value --
		       PIPE ROW( Trec );
			END LOOP;
   END LOOP ;
   RETURN ;
 
  END ;
 
END  STO_PKG_CUR ;
/
McM est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 11/08/2008, 21h56   #5
Membre habitué
 
Inscription : octobre 2005
Messages : 125
Détails du profil
Informations forums :
Inscription : octobre 2005
Messages : 125
Points : 108
Points : 108
Envoyer un message via Yahoo à tostinni
Par défaut ¡ Superbe !

Salut McM,
Mille mercis, ta solution est brillante et fonctionne extremement bien tout en etant tres simple a deployer.
Je jette a la poubelle mes polices de code barre...
tostinni est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 11/08/2008, 23h35   #6
McM
Expert Confirmé Sénior
 
Inscription : juillet 2003
Messages : 3 450
Détails du profil
Informations forums :
Inscription : juillet 2003
Messages : 3 450
Points : 4 209
Points : 4 209
Salut,
Je suis content que ça ait servi à quelqu'un parce que suite à ce post que j'avais fait, pas de réponses.

Autre truc pour les tests rapides : On me redemande souvent pour des formations une liste de codes à scanner...
J'ai installé la police du site de zebu sur mon ordi, je récupère le code ean128 de mes codes articles sous Toad, je colle tout ça sous Excel et je change la police, et hop à l'impression.
__________________
More Code : More Bugs. Less Code : Less Bugs
McM est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 12/08/2008, 16h30   #7
Membre habitué
 
Inscription : octobre 2005
Messages : 125
Détails du profil
Informations forums :
Inscription : octobre 2005
Messages : 125
Points : 108
Points : 108
Envoyer un message via Yahoo à tostinni
Bon apparement sur notre serveur de reports j'ai pas la meme version des runtimes et y a l'air d'avoir un gros bug qui genere une erreur interne de reports a cause du trigger sur le champs pour changer sa couleur...
Du coup j'ai mis un champs image avec une tite barre noire dedans...
Ca fait rajouter une image sur le serveur, mais bon ca fonctionne
tostinni 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 19h05.


 
 
 
 
Partenaires

Hébergement Web