∴   Az érték a mérték

            

2014.03.23. 16:33

Pascal-t oktató tanárom szavai jutottak nemrég az eszembe, aki azt mondta anno, hogy igyekezzünk minden eshetőségre felkészíteni programjainkat, próbáljuk "bolondbiztossá" tenni.

Ami miatt eszembe jutott a fenti gondolat, az egy program beviteli mezőjénél jelentkezett. A felhasználó fogalmam sincs hogy honnan másolt egy nevet (sajnos később Ő sem emlékezett rá, így nem tudtam leellenőrizni), amit beillesztett az ominózus beviteli mezőbe, majd lementette az adatot. A másolt névben egy speciális karakter is szerepelt, egy vezérlő karakter.

KovacsEva.jpg

Ezt a program lementette, ami nem is jelentett volna problémát, de aztán egy másik rendszer másik programhoz került át paraméterként, ahol ez hibát okozott. Ezt nem részletezem, hanem inkább azt a program részletet mutatom meg, amit az esetet követően egyszerre beépítettem az alap program ellenőrzési rendszerébe. Nos lássuk is. A D kártyán az alábbi bejegyzéseket helyeztem el (a ? az a színezés miatt található a komment sorban):

      *?ellenőrzésekhez
     D  R#Akt          S              2  0
     D  R#Hosz         S              2  0
     D  R#POS          S              2  0
     D  R$Char         S              1A
      *
     D R$ALAP          C                   'abcdefghijklmnopqrstuvwxyzöüóőúéáűí-
     D                                     ABCDEFGHIJKLMNOPQRSTUVWXYZÖÜÓŐÚÉÁŰÍ-
     D                                     0123456789()-_.;,'
      *?Char -> Hex
     D ToHex           PR                  EXTPROC('cvthc')
     D  szHexVal                  65535A   OPTIONS(*VARSIZE)
     D  szCharVal                 65535A   CONST OPTIONS(*VARSIZE)
     D  nSrcLen                      10I 0 VALUE
      *
      *?Hex -> Dec
     D CVTHex2To1      PR                  EXTPROC('cvtch')
     D  shortReceiver                  *   VALUE
     D  longSource                     *   VALUE
     D  sourceBytes                  10i 0 VALUE
      *
     D Alpha           S          65535A
     D Hex             S          65535A
     D CharVal         S              2a   inz('0A')
     D intResult       S              3i 0
     D NumResult       S              4  0

Itt pedig a programrészlet, ami elvégzi az ellenőrzéseket. A 99-es indikátor a hibaindikátor, ha ez átbillen, akkor az ellenőrzés folytatása felesleges. A konkrét esetben már korábban is átbillenthetett, ezért a /Free utáni IF vizsgálat. WSNEVE a vizsgált mező neve. Első körben megnézzük a Scan függvénnyel, hogy az aktuális karakter szerepel-e az ALAP felsorolásban. Ebben a magyar kis- és nagybetűk mellett számokat és pár gyakran használt egyéb karaktert helyeztem el. Ha ebben nem találjuk meg a vizsgált karaktert, akkor nézzük meg, hogy mennyi a dec kódja. Ha ez 64 alatti, vagy 255, akkor ezt nem fogadjuk el. Ekkor egy MSGF-ból íratunk ki a képernyőre egy üzenetet (ERR0083):

      /Free
         If *in99=*Off;
           R#Akt  = 1;
           R#Hosz = %Len(%Trim(WSNEVE));
           Dow (R#Akt <= R#Hosz) and *in99=*Off;
             R$Char = %Subst(WSNEVE:R#Akt);
             If R$Char <> ' ';
               R#POS  = %Scan(R$Char : R$ALAP);  //az alapkészletben megtalálható?
                 //?Elfogadott karakterek: dec(64)-től a dec(255)-ig
                 // ?Cél: ?vezérlő karaktereket ne lehessen rögzíteni, mert
                 //?  azok hibás működéshez vezethetnek, ha más rendszerekbe
                 //?  is átkerülnek.
                //?1.CH
               If R#POS = 0;                  //ha nem található meg, akkor további ellenőrzés
                 Alpha = R$Char;
                 Hex = *BLANKS;
                 ToHex(Hex : Alpha : %LEN(Alpha));

                //?2.HD
                 CharVal = %Subst( Hex : 1 : 2 );
                 Callp CVThex2To1 (%addr(intResult)
                                   : %addr(CharVal)
                                   : %size(intResult) * 2);

                //? 128
                 If intResult < 0;
                   NumResult = intResult + 256;
                 Else;
                   NumResult = intResult;
                 Endif;

                 If ((NumResult < 64 and NumResult >= 0)  //?vezérlő karakter?
                     or NumResult = 255);                 //?EO-? EndOf
                   *in99=*On;                       // *In99 bebillentése
                   *in53=*On;                       // mezőhöz tartozó indikátor bebillentése
                     //?0083: Érvénytelen karakter szerepel a névben!
                   WSER01='ERR0083';
                 Endif;
               Endif;
             Endif;
             R#Akt += 1;
           EndDo;
         Endif;
      /End-Free
 

A bejegyzés trackback címe:

https://as400programozas.blog.hu/api/trackback/id/tr625875408

Kommentek:

A hozzászólások a vonatkozó jogszabályok  értelmében felhasználói tartalomnak minősülnek, értük a szolgáltatás technikai  üzemeltetője semmilyen felelősséget nem vállal, azokat nem ellenőrzi. Kifogás esetén forduljon a blog szerkesztőjéhez. Részletek a  Felhasználási feltételekben és az adatvédelmi tájékoztatóban.

dumakanyar 2014.03.27. 08:50:09

Ezt én is használni fogom! Remélem működik!

zummazumm 2014.04.11. 09:16:13

Működik, kipróbáltam!
süti beállítások módosítása