Gambas-it

Gambas3 => Programmazione => Topic aperto da: domenico - 07 Luglio 2016, 13:01:15

Titolo: ean13
Inserito da: domenico - 07 Luglio 2016, 13:01:15
Buonasera ragazzi. ho un problema sulla generazione dell'ean 13. il codice lo genera ma omette la prima cifra e l'ultima se la inventa! come mai ??. il codice che uso è quello di pdf writer. Potete aiutarmi?

Codice: [Seleziona]
Public Sub EAN13(x As Float, y As Float, barcode As String, Optional h As Float = 16, Optional w As Float = 0.35)

  _Barcode(x, y, barcode, h, w, 13)
 
End

Private Function _TestCheckDigit(barcode As String) As Boolean
  Dim sum, i As Integer
  'Test validity of check digit
  sum = 0
  For i = 2 To 12 Step 2
    sum += 3 * Val(Mid(barcode, i, 1))
  Next
  For i = 1 To 11 Step 2
    sum += Val(Mid(barcode, i, 1))
  Next
  Return (sum + Val(Mid(barcode, 13, 1)) Mod 10 == 0)
End

'Barcodes (Olivier)


Private Sub _Barcode(x As Float, y As Float, barcode As String, h As Float, w As Float, length As Integer)
Dim codes, parities As Collection
  Dim p As String[]
  Dim i As Integer
  Dim code As String
 
  'Padding
  barcode = Right(String(length - 1, "0") & barcode, length - -1)
  If (length = 12) Then barcode = "0" & barcode
  'Add or control the check digit
  If (Len(barcode) = 12) Then
    barcode &= _GetCheckDigit(barcode)
  Else If (Not _TestCheckDigit(barcode)) Then
    Error.Raise("Incorrect check digit")
  End If
  'Convert digits to bars
  codes = New Collection
  codes.Add(["0001101", "0011001", "0010011", "0111101", "0100011",
             "0110001", "0101111", "0111011", "0110111", "0001011"], "A")
  codes.Add(["0100111", "0110011", "0011011", "0100001", "0011101",
             "0111001", "0000101", "0010001", "0001001", "0010111"], "B")
  codes.Add(["1110010", "1100110", "1101100", "1000010", "1011100",
             "1001110", "1010000", "1000100", "1001000", "1110100"], "C")
  parities = New Collection
  parities.Add(["A", "A", "A", "A", "A", "A"], "0")
  parities.Add(["A", "A", "B", "A", "B", "B"], "1")
  parities.Add(["A", "A", "B", "B", "A", "B"], "2")
  parities.Add(["A", "A", "B", "B", "B", "A"], "3")
  parities.Add(["A", "B", "A", "A", "B", "B"], "4")
  parities.Add(["A", "B", "B", "A", "A", "B"], "5")
  parities.Add(["A", "B", "B", "B", "A", "A"], "6")
  parities.Add(["A", "B", "A", "B", "A", "B"], "7")
  parities.Add(["A", "B", "A", "B", "B", "A"], "8")
  parities.Add(["A", "B", "B", "A", "B", "A"], "9")
 
  code &= "101"
  p = parities[Mid(barcode, 1, 1)]


  For i = 1 To 6
    code &= codes[p[i - 1]][Val(Mid(barcode, i, 1))]
 
  Next
  code &= "01010"
 
 
  For i = 7 To 12
    code &= codes["A"][Val(Mid(barcode, i, 1))]
 
 
 
  Next
  code &= "101"
  'Draw bars
  For i = 1 To Len(code)
    If (Mid(code, i, 1) = "1") Then Me.Rect(x + (i - 1) * w, y, w, h, "F")
  Next
  'Print text uder barcode
  Me.SetFont("Arial", "", m1.fstamp)
 
  Me.Text(x, y + h + 11 / $k, Right(barcode, length))
End
Titolo: Re:ean13
Inserito da: Gianluigi - 07 Luglio 2016, 13:18:03
Sei pregato di non postare lo stesso argomento in più punti (ho rimosso quello in Gambas2 perché presumo tu abbia Gambas3).

Il codice va inserito fra i cancelletti (#) per favore cerca di seguire le regole, grazie.
Titolo: Re:ean13
Inserito da: domenico - 07 Luglio 2016, 13:30:49
Chiedo scusa, mi sono accorto che avevo postato in gambas 2 ma non sono riuscito ad eliminare il posto. Per quanto riguarda il codice non sapevo questa regola! Scusate!
Titolo: Re:ean13
Inserito da: Gianluigi - 07 Luglio 2016, 13:35:00
Di niente, figurati.
Ti basta andare sul vecchio post e cliccare su Modifica, quindi evidenzi il codice e clicchi sui cancelletti.
Ciao

Perfetto!

Riguardo al tuo quesito occorre aspettare un esperto (Golia  ;D)
Titolo: Re:ean13
Inserito da: domenico - 07 Luglio 2016, 13:37:38
Si, fatto, grazie! :)
Titolo: Re:ean13
Inserito da: Golia - 07 Luglio 2016, 16:25:31
Ciao
Mi spiace per te ma non sono un'esperto come dice gianluigi.. sopratutto per i codici a barre, mai usati.
Siccome il vero esperto e creatore di Pdfwriter non si fà vivo spesso  (Ciao MD :ciao:) cerchiamo di capire come funzica sta roba.
Ho provato a modificare il codice, in effetti in questa riga.. (Nella sub _Barcode)
Codice: [Seleziona]
barcode = Right(String(length - 1, "0") & barcode, length - 1)
se a length non viene tolto l'ultimo carattere, quasi tutto funziona...quasi
se togli queste 2 righe
Citazione
'   Else If (Not _TestCheckDigit(barcode)) Then
'     Error.Raise("Incorrect check digit")
Sembra funzionare.. sembra perchè come ti ho detto non conosco i codici a barre.
Comunque la sub _Barcode è richiamata solo da EAN13 e UPC_A che mi sembra funzionano
Prova e fammi sapere, per favore prova anche altri codici a barre per vedere se ci sono anomalie.
Allego PdfWriter con tutti gli esempi, ho aggiunto anche EAN13 e UPC_A
Ciao  :2birre:
Allego
Titolo: Re:ean13
Inserito da: domenico - 07 Luglio 2016, 18:15:29
Ciao golia, grazie per la risposta! Ho provato il codice e scrive bene (almeno x la parte numerica), ma ho provato a sparare con il lettore senza nessun risultato. Non legge. Quelli che ho testato sono stati ean13, upc, i25 e code39. L'unico che il lettore riesce a leggere è il code39.
Titolo: Re:ean13
Inserito da: Golia - 07 Luglio 2016, 19:14:01
Mi spiace ma non saprei come aiutarti
prova a dare un'occhiata quà http://www.fpdf.org/en/script/script5.php (http://www.fpdf.org/en/script/script5.php), pdfwriter è un porting di questo.
Ciao
Titolo: Re:ean13
Inserito da: domenico - 07 Luglio 2016, 20:25:49
Ho modificato questo codice


Codice: [Seleziona]
Private Function _GetCheckDigitOriginale(barcode As String) As String
  Dim sum, i, r As Integer
  'Compute the check digit
  sum = 0
  For i = 2 To 12 Step 2
    sum += 3 * Val(Mid(barcode, i, 1))
  Next
  For i = 1 To 11 Step 2
    sum += Val(Mid(barcode, i, 1))
  Next
  r = sum Mod 10
  If (r > 0) Then r = 10 - r
  Return Str(r)
End



codice modificato

Codice: [Seleziona]
domenico

Private Function _GetCheckDigit(barcode As String) As String
 
   Dim sum, i, r As Integer
  'Compute the check digit
  sum = 0
  For i = 2 To 12 Step 2
    sum = sum + Val(Mid(barcode, i, 1))
  Next
  For i = 1 To 11 Step 2
    sum = sum + Val(Mid(barcode, i, 1))
  Next
  r = sum Mod 10
  If (r > 0) Then r = 10 - r
  Return Str(r)
End


abbiamo fatto un passo avanti. adesso lo legge. però sulla lettura ho il problema iniziale. omette il primo numero e si inventa l'ultimo!
Titolo: Re:ean13
Inserito da: domenico - 07 Luglio 2016, 21:52:27
ragazzi, ho notato anche un altro particolare. Il lettore legge il codice a barre solamente se c'è il 4 come primo numero. Se il codice a barre è 4578698742156 il lettore mi legge 4457869874215
Titolo: Re:ean13
Inserito da: Golia - 08 Luglio 2016, 09:26:37
Citazione
abbiamo fatto un passo avanti. adesso lo legge. però sulla lettura ho il problema iniziale. omette il primo numero e si inventa l'ultimo!
intendi che lo stampa corretto ma quando lo leggi con la pistola trasla a dx tutto il codice?
Forse cambiando il codice abbiamo solo sistemato il testo sotto, bisogna vedere dove sposta i caratteri sopra
Titolo: Re:ean13
Inserito da: domenico - 08 Luglio 2016, 10:02:24
si, facendo quella modifica abbiamo cambiato il codice che esce sotto. Comunque si,viene translato a dx
Titolo: Re:ean13
Inserito da: Gianluigi - 08 Luglio 2016, 10:23:20
Ciao Domenico,

scusa se mi intrometto in cose che poco conosco e che ho dimenticato, ma tu se stampi su l'editor di testo il codice a barre si stampa correttamente? La pistola funziona bene?

 :ciao:
Titolo: Re:ean13
Inserito da: domenico - 08 Luglio 2016, 11:48:17
si si, la pistola funziona bene. era venuto anche a me questo dubbio ma l'ho testata, riconfigurata e va bene.!
Titolo: Re:ean13
Inserito da: Gianluigi - 11 Luglio 2016, 16:08:13
Prova un po a stampare il tuo codice ean13 qui.
 :ciao:

Ho rimosso un post frutto del troppo caldo  ;D
Titolo: Re:ean13
Inserito da: domenico - 20 Luglio 2016, 16:18:15
ciao gianluigi. non ho capito cosa devo fare. non riesco a scrivere l'ean
Titolo: Re:ean13
Inserito da: Gianluigi - 20 Luglio 2016, 22:19:44
Ho ricavato la textbox da un suggerimento (http://gambas.8142.n7.nabble.com/Keyboard-input-help-requested-td2440.html#a2447) di Minisini sulla ML.
Fai partire l'applicazione e vedi cosa appare nella textbox se spari con la pistola su di un codice ean.

Non avendo pistole non saprei come altro aiutarti.

 :ciao:
Titolo: Re:ean13
Inserito da: domenico - 21 Luglio 2016, 10:07:34
buongiorno. ho sparato con la pistola il questo codice 4025089073178 e mi è uscito: Il codice 74 ' ' è stato premuto. che vuol dire?
Titolo: Re:ean13
Inserito da: Gianluigi - 21 Luglio 2016, 11:33:17
buongiorno. ho sparato con la pistola il questo codice 4025089073178 e mi è uscito: Il codice 74 ' ' è stato premuto. che vuol dire?

Il codice 74 corrisponde al carattere " j " non ho idea del perché ti ha letto questo carattere.
Direi che l'esperimento è fallito.
Ma tu attualmente riesci a leggere quello che spari con Gambas, o sei sempre in alto mare?

 :ciao:
Titolo: Re:ean13
Inserito da: domenico - 21 Luglio 2016, 12:38:46
No, non ho risolto niente. sono stato parecchio tempo per cercare di capire senza nessun risultato. non ho proprio idea :rolleyes:
Titolo: Re:ean13
Inserito da: Gianluigi - 21 Luglio 2016, 13:51:42
Guarda un po qui (http://gambas.8142.n7.nabble.com/usb-codebar-reader-how-to-handle-events-td55079.html#a55083) e scarica gli esempi postati da Charlie (sono due con lo stesso nome).
Titolo: Re:ean13
Inserito da: domenico - 21 Luglio 2016, 18:48:50
buonasera. si ho visto. resituisce solamente il numero del codice a barre grafico. a me serve il contrario! :)
Titolo: Re:ean13
Inserito da: Gianluigi - 21 Luglio 2016, 19:00:33
buonasera. si ho visto. resituisce solamente il numero del codice a barre grafico. a me serve il contrario! :)

E l'esempio che c'è nella software farm?
 :ciao:
Titolo: Re:ean13
Inserito da: domenico - 21 Luglio 2016, 19:11:46
non ho capito dove devo vedere ;D
Titolo: Re:ean13
Inserito da: Gianluigi - 21 Luglio 2016, 19:20:22
Dalla versione 3.6 se la memoria non mi inganna puoi avere un sacco di esempi scaricandoli dalla Software Farm.
Puoi accedervi dalla finestra iniziale o dal menu Tools.
Bar code creator lo trovi sotto esempi, guarda tutto il software potrebbe esserci dell'altro.
 :ciao:

Dalla versione 3.7 sono sicuro che c'è, sulla 3.6 non ci giurerei  ;D
Titolo: Re:ean13
Inserito da: domenico - 25 Luglio 2016, 23:08:24
ciao gianluigi. come avrai potuto vedere ho trovato qualcosa ma non riesco a stampare :D. che casino! grazie di tutto comunque!