Lo Calc felokosítása dinamikus vonalkód használatra

Segítséget kaptál? Szívesen töltöd itt az idődet? Visszajársz hozzánk? Támogasd a munkákat: Ko-fi és Paypal!

A LibreOffice Calc rendelkezik beépített vonalkód / QR kód beszúrási letehetőséggel, ám ez egy párbeszéd ablakon megadott karaktersort alakít át beágyazott objektummá. Ennek hátránya az hogy nem dinamikus, a megváltoztatáshoz jobb egérgombbal kattintani kell az objektum felett, kiválasztani a szerkesztést majd beírni az új értéket…

A következőkben egy olyan módszert mutatok be, amellyel közvetlenül a számolótábla celláiba képezhetünk vonalkódot, ami egy másik cella értéke alapján képződik, ha ez utóbbi cella értéke változik, a vonalkód is frissül.

Vonalkódból nagyon sokféle szabvány létezik, ezek jellemzője hogy felső határa van a széllességének, a szabványok eltérő hosszakat engednek meg, és vagy csak számokat, vagy vegyesen számokat és betűket tartalmazhatnak, egyéb írásjelek nem mindegyikben lehetségesek. A maximálisan megjeleníthető karakterek jellemzően 128-256, ebbe a nagyon hosszú internetes link már nem fér bele, ahhoz már QR kód kell. Ugyancsak jellemző, hogy csak az angol ABC betűi támogatottak, azt hogy árvíztűrő tükörfúrógép nem lehet akármilyen vonalkóddal lekódolni (vannak ilyen próbálkozások, de azok olyan hosszú kódokat generálnak, hogy csak több sorban fér el, az egymás alá rendezett sorok meg már QR kódra hasonlítanak)

A most bemutatott módszer a CODE 128 -at használja, mert ez viszonylag egyszerű, a nevében a 128 azt jelenti hogy az ASCII tábla 128-g tartó karaktereit támogatja, ám ezt úgy kell érteni, hogy ebben nincsenek benne az alsó 32-ig tartó (nem nyomtatható) karakterek. Összesen 108 szimbólumot használ, ebben benne van a START és STOP meg az ellenőrző és a lapváltó szimbólumok is. Az ellenőrző szimbólum a karakterek értéke és pozíciója szerinti súlyozás modulo értékéből jön ki, a lapváltó meg azt adja meg, hogy melyik tábla szerint kell értelmezni az azt követő szimbólumokat (ugyanis a jelhalmazt 3 táblával tudja lefedni, ezek jelölése A, B, C, csak számok esetén az A tábla szerint kódol, a számokat és betűket vegyen használó értékekhez a B tábla való, de a felső ASCII karakterekhez szükséges egy további C tábla is.
https://en.wikipedia.org/wiki/Code_128

A vonalkód olvasókról röviden

Alapból minden PC-hez USB-vel, vagy vezeték nélkül csatlakoztatott vonalkód olvasó egy szabványos billentyűzetnek látszik a rendszer felől, a beolvasott, feldolgozott és átküldött kódot a rendszer úgy értelmezi, mintha a billentyűzeten lett volna begépelve. A vonalkód olvasók rendszerint ismernek egy rakat kódolási technikát, azt automatikusan dekódolni tudják, hogy ezek melyek is konkrétan, az a leírásukból megtudható. Ugyancsak lehetnek extra szolgáltatások, mint a STOP jel után ENTER vagy TAB átküldése, ami kényelmessé teszi egy bármilyen szoftverrel történő használatot (pl. táblázatkezelő), ezt nem szokták feltüntetni, ezekre a dolgokra célszerű rákérdezni vásárláskor. A dedikált programokat meg úgy szokták megírni, hogy az adatbekérő ablakon az első mező a cikkszám, vagy olyan adat bevitelére szolgál, aminek alapja a vonalkód, és a bevitel után a program automatikusan továbblép a közrevetkező műveletre.
A vonalkód olvasók ára széles határok között változik, vannak olyanok is, amik adott számú beolvasást is képesek tárolni, azt egy menetben átküldeni, dedikált szoftver jár hozzájuk stb.

No, térjünk rá a Calc-ra.

CODE 128 font beszerzése, telepítése

Az alábbi oldalról letölthető egy ingyenes GPL licencszelésű TTF vonalkód font, amire szükségünk lesz:

https://www.1001fonts.com/code-128-font.html

Ha majd használjuk a fontot, és ki akarjuk nyomtani, akkor jó tudni, hogy lézernyomtató esetén a betűméretet min. 17 pontosra, és tűéles tintás nyomtató esetén min. 15 pontosra kell állítani.

Ha letöltöttük, csomagoljuk ki a ZIP fájlból és másoljuk a saját mappánk alatt a .local/share/fonts/ mappába. (Nyomjunk Ctrl+H-t a rejtett fájlok /mappák megjelenítéséhez) Ha nincs fonts mappánk, akkor hozzuk létre.

Ha kész a bemásolás, akkor adjuk ki terminálban a

sudo fc-cache -v

parancsot. Ez frissíti a fontokat, bár a tapasztalatom az, hogy a programokban elég hosszú idő után lesz kiválasztható az új font, jobb ha újraindítjuk a gépet.

A Calc felokosítása

Az alábbiakhoz szükséges a CALC biztonsági beállításainál a makróbiztonság alacsonyabb szintre állítása, mert alapból minden makró letiltásra kerül.

Válaszuk az ESZKÖZÖK →BEÁLLÍTÁSOK alatt a Biztonságot, és állítsuk be a makróbiztonságot az közepesre alábbi ábra szerint:

Ezzel a beállítással minden makrót tartalmazó fájl megnyitásakor rákérdez a makrók engedélyezésére.

Nyissunk egy új munkafüzetet, amibe majd vonalkódokat fogunk használni.

Válasszuk az ESZKÖZÖK→ MAKRÓK → MAKRÓK SZERKESZTÉSE menüpontot


 

A makrószerkesztő ablakon balra látható a Saját makrók és párbeszédablakok alatt a Standard mappa, alatta a Modul 1 nevű modul. Ide is tehetjük a makrónkat, és ebben az esetben bármelyik megnyitott munkafüzetből is elérjük ezeket, Ám jó tudni hogy ennek a kapacitása 512 kB, ami hamar betelik, így most a makrónkat (ami valójában egy függvény) az aktuális munkafüzetbe fogjuk menteni, ez azzal jár, hogy a vonalkód függvény csak ebben a munkafüzetben fog működni.

Válasszuk az ESZKÖZÖK →MAKRÓK RENDEZÉSE →BASIC menüpontot


 

A bal oldalon a munkafüzetünk Standard mappájának kiválasztása után kattintsunk a jobb oldalon az ÚJ gombra…

A következő ablakon az automatikusan felajánlott Module 1 nevet át is írhatjuk ha szeretnénk, ha nem kattintsunk az OK gombra.


 

Miután létrejött az új modul a munkafüzetünkben, válasszuk ki, és nézzük meg jobbra a szerkesztőben, mit látunk.

Első sorban REM ***** BASIC ***** alatt a 3. sorban Sub Main, az 5. sorban pedig End Sub. Ez egy alap makró, amit a LO automatikusan létrehoz nekünk. Minden makró Sub <makró_neve> -vel kezdődik, és End Sub-al zárul. A kettő közé kell írni a kódot, de jelen esetben ezzel nem foglalkozunk, mert most függvényt fogunk létrehozni, ami Function <függvény_neve>(függvény paraméterei) -vel kezdődik és End Function-al zárul. A 6. sortól kezdve illesszük be az alábbi kódot:

Public Function barcode128$(sztring$)
  'Parameters : a string
  'Return : * a string which give the bar code when it is dispayed with CODE128.TTF font
  '         * an empty string if the supplied parameter is no good
  Dim i%, checksum&, mini%, dummy%, tableB As Boolean
  barcode128$ = ""
  If Len(sztring$) > 0 Then
  'Check for valid characters
    For i% = 1 To Len(sztring$)
      Select Case Asc(Mid$(sztring$, i%, 1))
      Case 32 To 126, 203
      Case Else
        i% = 0
        Exit For
      End Select
    Next
    'Calculation of the code string with optimized use of tables B and C
    barcode128$ = ""
    tableB = True
    If i% > 0 Then
      i% = 1 'i% become the string index
      Do While i% <= Len(sztring$)
        If tableB Then
          'See if interesting to switch to table C
          'yes for 4 digits at start or end, else if 6 digits
          mini% = IIf(i% = 1 Or i% + 3 = Len(sztring$), 4, 6)
          GoSub testnum
          If mini% < 0 Then 'Choice of table C
            If i% = 1 Then 'Starting with table C
              barcode128$ = Chr$(210)
            Else 'Switch to table B
              barcode128$ =barcode128$ & Chr$(204)
            End If
            tableB = False
          Else
            If i% = 1 Then barcode128$ = Chr$(209) 'Starting with table B
          End If
        End If
        If Not tableB Then
          'We are on table C, try to process 2 digits
          mini% = 2
          GoSub testnum
          If mini% < 0 Then 'OK for 2 digits, process it
            dummy% = Val(Mid$(sztring$, i%, 2))
            dummy% = IIf(dummy% < 95, dummy% + 32, dummy% + 105)
            barcode128$ = barcode128$ & Chr$(dummy%)
            i% = i% + 2
          Else 'We haven't 2 digits, switch to table B
            barcode128$ = barcode128$ & Chr$(205)
            tableB = True
          End If
        End If
        If tableB Then
          'Process 1 digit with table B
          barcode128$ = barcode128$ & Mid$(sztring$, i%, 1)
          i% = i% + 1
        End If
      Loop
      'Calculation of the checksum
      For i% = 1 To Len(barcode128$)
        dummy% = Asc(Mid$(barcode128$, i%, 1))
        dummy% = IIf(dummy% < 127, dummy% - 32, dummy% - 105)
        If i% = 1 Then checksum& = dummy%
        checksum& = (checksum& + (i% - 1) * dummy%) Mod 103
      Next
      'Calculation of the checksum ASCII code
      checksum& = IIf(checksum& < 95, checksum& + 32, checksum& + 105)
      'Add the checksum and the STOP
      barcode128$ = barcode128$ & Chr$(checksum&) & Chr$(211)
    End If
  End If
  Exit Function
testnum:
   'if the mini% characters from i% are numeric, then mini%=0
  mini% = mini% - 1
  If i% + mini% <= Len(sztring$) Then
    Do While mini% >= 0
      If Asc(Mid$(sztring$, i% + mini%, 1)) < 48 Or Asc(Mid$(sztring$, i% + mini%, 1)) > 57 Then Exit Do
      mini% = mini% - 1
    Loop
  End If
Return
End Function

Így kell kinéznie:


A függvény Public előírással van bevezetve, ezt a LO figyelmen kívül hagyja, ennek Excel alatt van értelme, és azt adja meg, hogy bármelyik nyitott munkafüzetből elérhető (ez a kód használható Excelben is, mert kereszt-kompatibilisan van megírva)
A függvény nem ad vissza értéket, ha a paramétreben bárhol nem támogatott karaktert talál (pl. ékezetes betű)

Csukjuk be a szerkesztőt, és próbáljuk ki a függvényünket. Első oszlopba írjunk ezt-azt, a második oszlopba meg használjuk a függvényt (írjuk be =BARCODE128(A2), a LO tündére sajnos nem kezeli csak a binárisan C-vel lefordított bővítménybe ágyazott függvényeket)

Azt látjuk hogy a függvény működik, de krix-kraxokkal tűzdeli az A oszlopba írt szöveget. (beleírja a START / hibajelző, és STOP szimbólumokat, sőt, ha számjegyek vannak a szövegben, akkor a tábla váltó kódokat is.

Jelöljük ki a függvényes cellákat, és állítsuk át a betűtípust CODE 128-ra.


És íme:


 

Ellenőrizzük a vonalkódjainkat. Ezt úgy tudjuk legegyszerűbben megejteni, ha letöltünk az okostelefonunkra egy vonalkód kezelő applikációt. Itt van egy nyílt forráskódú ingyenes, reklámmentes applikáció (képernyőről is beolvassa a vonalkódot):

https://f-droid.org/packages/com.atharok.barcodescanner/

Letölthetjük az APK fájlt is, de letölthetjük az F-droid appot is, azt telepítve, annak a felületéről úgy is tudjuk telepíteni az appokat, hogy új verzió esetén automatikusan frissülnek. (a letöltött, telepített APK nem frissül.

Ennyi az egész, használjátok örömmel :-)