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

Forms Oracle Discussion :

Développement code barre


Sujet :

Forms Oracle

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    6
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2006
    Messages : 6
    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

  2. #2
    McM
    McM est déconnecté
    Expert confirmé

    Homme Profil pro
    Développeur Oracle
    Inscrit en
    Juillet 2003
    Messages
    4 580
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur Oracle

    Informations forums :
    Inscription : Juillet 2003
    Messages : 4 580
    Billets dans le blog
    4
    Par défaut
    Salut,

    Pour les code barre, tu as le site de GrandZebu
    http://grandzebu.net/informatique/codbar/codbar.htm

  3. #3
    Membre Expert
    Avatar de bouyao
    Inscrit en
    Janvier 2005
    Messages
    1 778
    Détails du profil
    Informations forums :
    Inscription : Janvier 2005
    Messages : 1 778
    Par défaut
    La lecture d'un code à barre c'est comme vous tapez sur le clavier. Donc ca ne se programme pas dans Forms.

  4. #4
    McM
    McM est déconnecté
    Expert confirmé

    Homme Profil pro
    Développeur Oracle
    Inscrit en
    Juillet 2003
    Messages
    4 580
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur Oracle

    Informations forums :
    Inscription : Juillet 2003
    Messages : 4 580
    Billets dans le blog
    4
    Par défaut
    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.

    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.

    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é.

    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 : 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
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    begin
      if :COD_ASCII = '0'
      then
        return (FALSE);
      end if;
      return (TRUE);
    end;
    Anciennement :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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 : 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
    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 ;
    /

  5. #5
    Membre éprouvé
    Inscrit en
    Octobre 2005
    Messages
    125
    Détails du profil
    Informations forums :
    Inscription : Octobre 2005
    Messages : 125
    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...

  6. #6
    McM
    McM est déconnecté
    Expert confirmé

    Homme Profil pro
    Développeur Oracle
    Inscrit en
    Juillet 2003
    Messages
    4 580
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur Oracle

    Informations forums :
    Inscription : Juillet 2003
    Messages : 4 580
    Billets dans le blog
    4
    Par défaut
    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.

  7. #7
    Membre éprouvé
    Inscrit en
    Octobre 2005
    Messages
    125
    Détails du profil
    Informations forums :
    Inscription : Octobre 2005
    Messages : 125
    Par défaut
    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

  8. #8
    McM
    McM est déconnecté
    Expert confirmé

    Homme Profil pro
    Développeur Oracle
    Inscrit en
    Juillet 2003
    Messages
    4 580
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur Oracle

    Informations forums :
    Inscription : Juillet 2003
    Messages : 4 580
    Billets dans le blog
    4
    Par défaut
    Mise à jour de mon message du 05/12/2006 pour éviter les manip avec srw.set_

    Un format trigger sur mon champ
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    begin
      if :COD_ASCII = '0'
      then
        return (FALSE);
      end if;
      return (TRUE);
    end;

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

Discussions similaires

  1. Impression étiquettes codes barre ?
    Par donia dans le forum QuickReport
    Réponses: 4
    Dernier message: 14/03/2016, 10h20
  2. [CR8.5] Utilisation des codes barre
    Par Robert dans le forum SAP Crystal Reports
    Réponses: 4
    Dernier message: 20/01/2005, 16h13
  3. [HARDWARE] [Conseil] Lecteur code barre
    Par Ni(o dans le forum Périphériques
    Réponses: 4
    Dernier message: 22/06/2004, 19h14
  4. [CR 8.5] Impression Codes Barre
    Par Phy dans le forum SAP Crystal Reports
    Réponses: 2
    Dernier message: 14/10/2003, 12h18
  5. Réponses: 5
    Dernier message: 24/04/2003, 22h08

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