Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Otros entornos y lenguajes > JAVA
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 24-07-2010
waly2k1 waly2k1 is offline
Miembro
 
Registrado: dic 2006
Ubicación: El país de las maravillas(Argentina)
Posts: 251
Poder: 18
waly2k1 Va por buen camino
Traducción de rutina JAVA

Hola muchachos, estoy desarrollando una mini aplicación en Delphi
y para ellos necesito validar un codigo de destinación que sea válido
en el momento de la carga. Existe una aplicación en Java que valida
eso, el tema es que no manejo Java y hay cosas que no entiendo. Con
lo cual posteo aquí la rutina y sin abusar de nadie me interesaría que
alguien me comente más o menos los pasos realizados. Nose
tampoco como depurar esa rutina en Java como para seguirla paso a
paso y ver lo que va realizando.

Veo que almacena en un array todos los caracteres de la cadena, pero
el valor ASCII o qué?
Luego acá k = j % 23 + 65 que hace ?
el operador %es el resto, esto sería k = (j mod 23) + 65 ???

En fin los dejo en sus manos y espero encontrar una pronta respuesta.
Desde ya muchisimas gracias por el tiempo dedicado. Abrazo!
Walter


Código:
  public static void a(String paramString)
  {
    if ((paramString == null) || (paramString.length() != 16))
      throw new b("destinacion debe tener 16 digitos");
    a(paramString, "nro de a?o", paramString.substring(0, 2));
    a(paramString, "nro de aduana", paramString.substring(2, 5));
    a(paramString, "nro de registro", paramString.substring(9, 14));
    int i;
    if ((i = ((localObject = paramString.toUpperCase()).indexOf("MANE") == 5) ? 1 : 0) != 0)
      localObject = ((String)localObject).replace("MANE", "MANI");
    Object localObject = ((String)localObject).toCharArray();
    
    int j = 0;
    for (int k = 0; k < 15; ++k)
      j += localObject[k];
    k = j % 23 + 65;
    if (i != 0)
      ++k;
    switch (k)
    {
    case 73:
      k = 88;
      break;
    case 79:
      k = 89;
      break;
    case 81:
      k = 90;
      break;
    case 91:
      k = 65;
    }
    if (k == localObject[15])
      return;
    throw new b("destinacion [" + paramString + "] " + "con digito verificador [" + localObject[15] + "] invalido");
  }
Responder Con Cita
  #2  
Antiguo 24-07-2010
mcs mcs is offline
Miembro
 
Registrado: may 2007
Ubicación: Girona
Posts: 229
Poder: 18
mcs Va por buen camino
Hola,

Imagino que solo tienes problemas con este bloque de codigo:
Código:
    int j = 0;
    for (int k = 0; k < 15; ++k)
      j += localObject[k];
    k = j % 23 + 65;
    if (i != 0)
      ++k;
La traducción a Delphi sería:
Código:
j:=0;
for k:=0 to 15 do
  j:=j+localObject[k];

k:=(j mod 23) + 65;
if i<>0 then
  Inc(k);
Responder Con Cita
  #3  
Antiguo 24-07-2010
waly2k1 waly2k1 is offline
Miembro
 
Registrado: dic 2006
Ubicación: El país de las maravillas(Argentina)
Posts: 251
Poder: 18
waly2k1 Va por buen camino
Hola mcs, desde ya muchas gracias por contestar

Esta es una Destinacion valida: '10042EC01004391D'
y te paso mi rutina
recorro la cadena (sDest) y voy cargando en el array mediante un for
porque desconozco las funciones para hacerlo mas 'comodo'

Pero el primer elemento del array pone 1 y el segundo q deberia ser 0 vuelve a repetir 1 y recien continua cargando bien, con lo cual me faltaria
un item (la D final) y desde el vamos que es invalida si no posee el digito
verificador. Estoy viendo eso ahora, pero si me trabo mucho mas le agrego un elemento mas al array y comienzo a contar desde el segundo elemento y listo. No puedo detenerme demasiado.

Saludos y muchisimas gracias!!!

Código:
function TData.ValDestinacion( sDest:string; blnMSG:boolean ):boolean;
var
    i: integer;
    j: integer;
    k: integer;
    aNro:array[0..15] of Char;
    iSuma: Integer;
begin
    iSuma := 0;
    i := Pos( 'MANE', sDest );
    sDest := ReplaceStr( sDest, 'MANE', 'MANI' );

    if Length( sDest ) <> 16 then
    begin
        Result := false;
        exit;
    end;

    for i := 0 to 15 do
    begin
        aNro[i] := Chr( Ord( Copy( sDest, i, 1 )[1] ) );
    end;

    j := 0;
    for k := 0 to 14 do
    begin
        j := j + Ord( aNro[k] );
    end;

    k := ( j mod 23 ) + 65;
    if i <> 0 then
    begin
        k := k + 1;
    end;

    case k of
        73:
            begin
                k:= 78;
            end;
        79:
            begin
                k:= 89;
            end;
        81:
            begin
                k:= 90;
            end;
        91:
            begin
                k:= 65;
            end;
    end;

    Result := ( k = Ord( aNro[15] ) );
end;
Responder Con Cita
Respuesta



Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro

Temas Similares
Tema Autor Foro Respuestas Último mensaje
Rutina que ocupa el 100% del procesador egostar Varios 10 09-08-2007 01:27:20
Rutina muy lenta... KAYO Firebird e Interbase 10 04-07-2007 17:14:44
Rutina de digito verificador tulio Varios 4 09-08-2006 17:43:18
Que tiene esta Rutina? esimon OOP 5 04-07-2006 17:19:03
No sale rutina SQl ............ Coco_jac SQL 2 30-11-2005 16:52:44


La franja horaria es GMT +2. Ahora son las 01:46:50.


Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi
Copyright 1996-2007 Club Delphi