Foros del Web » Programación para mayores de 30 ;) » Programación General »

Digito Verificador

Estas en el tema de Digito Verificador en el foro de Programación General en Foros del Web. TENGO UN PEQUEÑO PROBLEMA ESTOY REALIANDO UN PROGRAMA QUE AL PASAR EL CODIGO DE BARRAR DE UN RECIBO MUESTRE LOS NUMEROS DEL MISMO RECIBO YA ...
  #1 (permalink)  
Antiguo 15/11/2004, 12:47
Avatar de Kenshin  
Fecha de Ingreso: agosto-2004
Ubicación: Mexico
Mensajes: 47
Antigüedad: 19 años, 8 meses
Puntos: 0
Digito Verificador

TENGO UN PEQUEÑO PROBLEMA ESTOY REALIANDO UN PROGRAMA QUE AL PASAR EL CODIGO DE BARRAR DE UN RECIBO MUESTRE LOS NUMEROS DEL MISMO RECIBO YA ESTA REALIZADA ESA PARTE

EL PROBLEMA ES QUE CUANDO CAPTURO LOS NUMEROS DEL RECIBO COMO POR EJEMPLO

No DE RECIBO 012199712046400105090001114804
VALOR 65432765432765432735432765432

LO QUE TENGO QUE REALIZAR ES MUTIPLICAR EL No DE RECIBO POR EL VALOR PERO NUMERO POR NUMERO EJEMPLIO 0*6,1*5 ASI, HASTA OBTENER EL REULTADO DESPUES DE CADA OPERACION, DESPUES DE ESO TENGO QUE SUMAR YAREALIZADA LA SUMA DIVIDIR ENTRE 11 Y SI EL RESIDUO ES MAYOR QUE 10, LE RESTAMOS 10 Y YA ESTA EL DIGITO VERIFICADOR QUE EN ESTE CASO SE EL 4


COMO PUEDO REALIZAR ESAS OOPERACIONES
ESPERO QUE ME PUEDAN AUXILIAR YA SEA UN RESPUESTA POSITIVA O NEGATIVA
  #2 (permalink)  
Antiguo 16/11/2004, 05:37
 
Fecha de Ingreso: noviembre-2004
Mensajes: 7
Antigüedad: 19 años, 5 meses
Puntos: 0
Esos números los tendrás almacenados en cadenas (son demasiado grandes como para almacenarlos como números), digo yo.

Pues basta que recorras las cadenas carácter por carácter (usando un bucle y la función Mid$) y los conviertas a números usando CInt() antes de multiplicarlos. Cada resultado lo puedes ir acumulando a una variable.
  #3 (permalink)  
Antiguo 23/11/2004, 15:09
Avatar de Kenshin  
Fecha de Ingreso: agosto-2004
Ubicación: Mexico
Mensajes: 47
Antigüedad: 19 años, 8 meses
Puntos: 0
Como hago lo de la funcion MID ya que en CInt ya tengo para ser las operaciones pero en MID no tengo idea de como manejarlos
  #4 (permalink)  
Antiguo 24/11/2004, 05:52
Avatar de lic_dahool  
Fecha de Ingreso: noviembre-2003
Mensajes: 418
Antigüedad: 20 años, 5 meses
Puntos: 0
Por ejemplo CInt(Mid($Cadena1,PosicionInicial,NumeroDeCaracter es))

PosicionInicial: tendras que poner aquí una variable incremental para recorrer toda la cadena.
NumeroDeCaracteres: cuantos caracteres usaras, en tu caso 1.

Saludos.
__________________
La cantidad total de inteligencia del planeta permanece constante.
La población, sin embargo, sigue aumentando.

COLE


:cool: Los ordenadores no resuelven problemas ... ejecutan soluciones.
Laurent Gasser


Tienes alguna duda :pensando: ? >>> www.google.com :aplauso: <<<

Última edición por lic_dahool; 24/11/2004 a las 05:57
  #5 (permalink)  
Antiguo 26/11/2004, 13:58
Avatar de Kenshin  
Fecha de Ingreso: agosto-2004
Ubicación: Mexico
Mensajes: 47
Antigüedad: 19 años, 8 meses
Puntos: 0
Aun no he podido sacar el digito verificardor ya que cuando inserto los numero en el textbox y querio realizar la converscion con la funcion mid y CInt memarca error en esas funciones y realizo la funcion CInt(Mid($Cadena1,PosicionInicial,NumeroDeCaracter es)) tal como me lo comentan pero no me deja solo me marca error con el CInt


Este codigo va en el form

Private Sub cmdExit_Click()
End
End Sub
Private Sub cmdPrint_Click()
Printer.PaintPicture Picture1, 5000, 5000
Printer.EndDoc
End Sub

Private Sub Form_Activate()
optSize(1) = 1
End Sub
Private Sub optSize_Click(Index As Integer)
Picture1.ScaleMode = 3
Select Case Index
Case 0
Picture1.Height = Picture1.Height * (1.4 * 40 / Picture1.ScaleHeight)
Picture1.FontSize = 8
Case 1
Picture1.Height = Picture1.Height * (2.4 * 40 / Picture1.ScaleHeight)
Picture1.FontSize = 10
Case 2
Picture1.Height = Picture1.Height * (3 * 40 / Picture1.ScaleHeight)
Picture1.FontSize = 14
End Select
Call Text1_Change
End Sub
Private Sub Text1_Change()
Call DrawBarcode(Text1, Picture1)
MinWidth = 2 * Text1.Left + Text1.Width
pw = 2 * Picture1.Left + Picture1.Width
fw = MinWidth
If pw > fw Then fw = pw
Form1.Width = fw
End Sub


Este codigo va en un modulo

Sub DrawBarcode(ByVal bc_string As String, obj As Control)

Dim xpos!, y1!, y2!, dw%, th!, tw, new_string$

'define barcode patterns
Dim bc(90) As String
bc(1) = "1 1221" 'pre-amble
bc(2) = "1 1221" 'post-amble
bc(48) = "11 221" 'digits
bc(49) = "21 112"
bc(50) = "12 112"
bc(51) = "22 111"
bc(52) = "11 212"
bc(53) = "21 211"
bc(54) = "12 211"
bc(55) = "11 122"
bc(56) = "21 121"
bc(57) = "12 121"
'capital letters
bc(65) = "211 12" 'A
bc(66) = "121 12" 'B
bc(67) = "221 11" 'C
bc(68) = "112 12" 'D
bc(69) = "212 11" 'E
bc(70) = "122 11" 'F
bc(71) = "111 22" 'G
bc(72) = "211 21" 'H
bc(73) = "121 21" 'I
bc(74) = "112 21" 'J
bc(75) = "2111 2" 'K
bc(76) = "1211 2" 'L
bc(77) = "2211 1" 'M
bc(78) = "1121 2" 'N
bc(79) = "2121 1" 'O
bc(80) = "1221 1" 'P
bc(81) = "1112 2" 'Q
bc(82) = "2112 1" 'R
bc(83) = "1212 1" 'S
bc(84) = "1122 1" 'T
bc(85) = "2 1112" 'U
bc(86) = "1 2112" 'V
bc(87) = "2 2111" 'W
bc(88) = "1 1212" 'X
bc(89) = "2 1211" 'Y
bc(90) = "1 2211" 'Z
'Misc
bc(32) = "1 2121" 'space
bc(35) = "" '# cannot do!
bc(36) = "1 1 1 11" '$
bc(37) = "11 1 1 1" '%
bc(43) = "1 11 1 1" '+
bc(45) = "1 1122" '-
bc(47) = "1 1 11 1" '/
bc(46) = "2 1121" '.
bc(64) = "" '@ cannot do!
bc(65) = "1 1221" '*



bc_string = UCase(bc_string)


'dimensions
obj.ScaleMode = 3 'pixels
obj.Cls
obj.Picture = Nothing
dw = CInt(obj.ScaleHeight / 40) 'space between bars
If dw < 1 Then dw = 1
'Debug.Print dw
th = obj.TextHeight(bc_string) 'text height
tw = obj.TextWidth(bc_string) 'text width
new_string = Chr$(1) & bc_string & Chr$(2) 'add pre-amble, post-amble

y1 = obj.ScaleTop
y2 = obj.ScaleTop + obj.ScaleHeight - 1.5 * th
obj.Width = 1.1 * Len(new_string) * (15 * dw) * obj.Width / obj.ScaleWidth


'draw each character in barcode string
xpos = obj.ScaleLeft
For n = 1 To Len(new_string)
c = Asc(Mid$(new_string, n, 1))
If c > 90 Then c = 0
bc_pattern$ = bc(c)

'draw each bar
For i = 1 To Len(bc_pattern$)
Select Case Mid$(bc_pattern$, i, 1)
Case " "
'space
obj.Line (xpos, y1)-(xpos + 1 * dw, y2), &HFFFFFF, BF
xpos = xpos + dw

Case "1"
'space
obj.Line (xpos, y1)-(xpos + 1 * dw, y2), &HFFFFFF, BF
xpos = xpos + dw
'line
obj.Line (xpos, y1)-(xpos + 1 * dw, y2), &H0&, BF
xpos = xpos + dw

Case "2"
'space
obj.Line (xpos, y1)-(xpos + 1 * dw, y2), &HFFFFFF, BF
xpos = xpos + dw
'wide line
obj.Line (xpos, y1)-(xpos + 2 * dw, y2), &H0&, BF
xpos = xpos + 2 * dw
End Select
Next
Next

'1 more space
obj.Line (xpos, y1)-(xpos + 1 * dw, y2), &HFFFFFF, BF
xpos = xpos + dw

'final size and text
obj.Width = (xpos + dw) * obj.Width / obj.ScaleWidth
obj.CurrentX = (obj.ScaleWidth - tw) / 2
obj.CurrentY = y2 + 0.25 * th
obj.Print bc_string

'copy to clipboard
obj.Picture = obj.Image
Clipboard.Clear
Clipboard.SetData obj.Image, 2
End Sub




Espero que me puedan ayudar
  #6 (permalink)  
Antiguo 26/11/2004, 14:19
Avatar de lic_dahool  
Fecha de Ingreso: noviembre-2003
Mensajes: 418
Antigüedad: 20 años, 5 meses
Puntos: 0
La sintaxis es correcta. Podrías poner el código en donde usas la función?
__________________
La cantidad total de inteligencia del planeta permanece constante.
La población, sin embargo, sigue aumentando.

COLE


:cool: Los ordenadores no resuelven problemas ... ejecutan soluciones.
Laurent Gasser


Tienes alguna duda :pensando: ? >>> www.google.com :aplauso: <<<
  #7 (permalink)  
Antiguo 26/11/2004, 15:01
Avatar de Kenshin  
Fecha de Ingreso: agosto-2004
Ubicación: Mexico
Mensajes: 47
Antigüedad: 19 años, 8 meses
Puntos: 0
Private Sub Text1_Change()
Dim a As String
Call DrawBarcode(Text1, Picture1)
MinWidth = 2 * Text1.Left + Text1.Width
pw = 2 * Picture1.Left + Picture1.Width
fw = MinWidth
If pw > fw Then fw = pw
Form1.Width = fw
a = Text1.Text
CInt(Mid($a,i,1))

End Sub

No se si esta bien escrita la sintaxis
  #8 (permalink)  
Antiguo 26/11/2004, 18:25
Avatar de lic_dahool  
Fecha de Ingreso: noviembre-2003
Mensajes: 418
Antigüedad: 20 años, 5 meses
Puntos: 0
pero debes asignarle el resultado a alguna variable:

VariableInteger = CInt(Mid(a,i,1))

Saludos.
__________________
La cantidad total de inteligencia del planeta permanece constante.
La población, sin embargo, sigue aumentando.

COLE


:cool: Los ordenadores no resuelven problemas ... ejecutan soluciones.
Laurent Gasser


Tienes alguna duda :pensando: ? >>> www.google.com :aplauso: <<<
  #9 (permalink)  
Antiguo 29/11/2004, 12:18
Avatar de Kenshin  
Fecha de Ingreso: agosto-2004
Ubicación: Mexico
Mensajes: 47
Antigüedad: 19 años, 8 meses
Puntos: 0
No tienes algun programam donde me pueda ir guiando, y viendo como se realiza paso por paso
  #10 (permalink)  
Antiguo 29/11/2004, 16:38
 
Fecha de Ingreso: noviembre-2004
Ubicación: Corrientes, Arg.
Mensajes: 129
Antigüedad: 19 años, 5 meses
Puntos: 0
Bueno Kenshin, ahí va un código, pero tengo dos observaciones que hacerte:
1. Las dos tiras de números que nos das tienen distinta longitud, así que le inventé un 0 al principio de la segunda para que las dos tengan 30.
2. Tenés que tratar de trabajar un poquito más vos mismo.

Este código va en un Form cuyo único control es una Label1

Dim Suma As Integer
Dim Resto As Integer
Dim N As Integer
Dim CadRecib As String
Dim CadValor As String
Dim C1 As Integer
Dim C2 As Integer
_______________________________________________
Private Sub Form_Load()
CadRecib = "012199712046400105090001114804"
CadValor = "065432765432765432735432765432"
Suma = 0

For N = 1 To 30
C1 = Val(Mid(CadRecib, N, 1))
C2 = Val(Mid(CadValor, N, 1))
Suma = Suma + C1 * C2
Next N

Resto = Suma Mod 11
If Resto > 9 Then Resto = Resto - 10
Label1.Caption = Str(Resto)
End Sub

Mod es una función de VB que devuelve el resto de una división.
Cuando la ejecuto da 1 en el label, no 4. Así que la cifra faltante seguramente no es el 0 que yo puse. Y al final comparo con >9 porque si es 10 ya no es un dígito sino 2.

Suerte.
  #11 (permalink)  
Antiguo 14/12/2004, 14:23
Avatar de Kenshin  
Fecha de Ingreso: agosto-2004
Ubicación: Mexico
Mensajes: 47
Antigüedad: 19 años, 8 meses
Puntos: 0
Muchas gracias por su ayuda ya quedo lo del digito verificador, ahora tengo una pequeña duda cobol es compatible con Visual Basic, o Visual Basic a Cobol ya que ese pequeño programa sera enviado a sucursales donde pagaran un recibo y los datos se van a introducir en fotmato de cobol o algo parecido.

Espero que me puedan auxiliar
  #12 (permalink)  
Antiguo 29/12/2004, 18:35
 
Fecha de Ingreso: octubre-2004
Mensajes: 12
Antigüedad: 19 años, 6 meses
Puntos: 0
arghh Cobol!!! attchisszz , soy alérgico al polvo

Ya casi no recuerdo Cobol pero es muy difícil que encuentres las funciones Val() y Mid(), pero es posible que existan sus equivalentes.
O deberás crear en Cobol las funciones Val() y Mid() y luego te serviría el código de Alberto.
No te aflijas Val() y Mid() no son difíciles de implementar usando código simple.
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 04:23.