Posible Bug y solución en Importador de Extracto

Inicio Foros Foro principal Desarrolladores Posible Bug y solución en Importador de Extracto

  • Este debate está vacío.
Viendo 9 entradas - de la 1 a la 9 (de un total de 9)
  • Autor
    Entradas
  • #31327

    Gente, quería hacerles una consulta sobre la Importación del Extracto Bancario… EL importador no importa nada desde las temporales. Voy con un ejemplo a ver si se entiende.

    En Importaciones => Importar Extracto Bancario cargue manualmente por esa misma ventana 3 líneas de un extracto para una cuenta bancaria que tengo creada. (Los datos que puse son el compañía, organización, nombre, nro de cta, fechas, importe, nro linea, moneda)

    Luego de intentar importalas, me informa que no importó ningúna. No hay errores.

    Hice un debugg a la clase ImportBankStatement y me parece que hay un problema con el método prepareImportation porque hace lo sgte:

    UPDATE I_BankStatement SET I_IsImported = ‘E’

    Y luego en el método importStatement intenta armar un RecordSet con las sgte query:

    SELECT * FROM I_BankStatement WHERE I_IsImported = ‘N’

    De manera que nunca logra capturar las líneas del extracto. Le quité el WHERE y me importó bien las líneas…

    Alguna advertencia con esta solución??

    #34192

    Aclaración: Mas alla de que sin el WHERE engancha todo incluso lo ya importado… habría que ponerle un I_IsImported != ‘Y’ o algo así. Mi pregunta refiere mas al estado ‘E’ y sus implicancias.

    #34196

    De todas formas, algo me esta faltando porque aunque las importó (después de importarlas comentando el WHERE del importStatement) no consigo verlas al momento de conciliar…

    #34197

    Ahora caigo que ‘E’ es error… y el error es que no puede validar la siguiente inecuación del método prepareImportantion en la línea 293:

    trxAmt + ChargeAmt + InteresesAmt <> StmtAmt
    El problema es que no estoy seguro de que campos conforman cada columna ni que significa esa validación.

    #34193
    Javier Ader
    Participante

    Bueno, exactamente no se por donde viene, pero a simple vista esa clase parece tener muchos bugs a nivel de sql; en particular por el tema de precedencia de operadores AND y OR; por ej, en muchos lugares se ve algo como

    SELECT o UPDTE….

    WHERE algunas codiciones separas por AND
    AND
    i.I_IsImported<>‘Y’ OR i.I_IsImported is NULL
    AND AD_Client_ID= xxxx

    [code]
    en donde el ultimo and es agregado por una expresión append( clientCheck ) , y la idea es solo tocar los registros de importacion o de la tabla en las que se impotan los registros que pertenezcan a al mismo cliente (para que importanciones de distintas companias no se mezcle).
    Bueno, en todas esas sentecias hay un error ya que la condicion
    i.I_IsImported<>‘Y’ OE i.I_IsImported is NULL debe ir entre parensis [ esto es exactamente decir que para multiplicar 2 por 3 + 1 uno tiene que escribri 2 * (3 + 1); si uno escibre sin parentesis, e.d 2 * 3 + 1, se evalua como (2 * 3) + 1).
    Por ej el codigo anterior tiene la misma evaluacion que
    [code]

    SELECT o UPDTE….

    WHERE
    (algunas codiciones separas por AND
    AND
    i.I_IsImported<>‘Y’)
    OR
    (i.I_IsImported is NULL
    AND AD_Client_ID= xxxx )

    [code]
    Lo cual obivmente no es la intención de la sentencia.
    No se si este error es el que te está generando problemas, depues miro un poco más. Si queres podes probar cambiando todas los
    i.I_IsImported<>‘Y’ OR i.I_IsImported is NULL
    por
    (i.I_IsImported<>‘Y’ OR i.I_IsImported is NULL)
    En cualuqier caso, eso de setear con ‘E’ algo que es boolena (e.d, puede tomar solo Y o N), me parece muy raro (si lo que se quiere es setear un error, se deberia usar la columan de mensaje de error en la tabla temporal).

    PD : Tambien es probable que haya un error cuando se setea el error de mensaje en expresiones como I_ErrorMsg=I_ErrorMsg||’ERR=Invalid Org
    ya eso concatena los errores solo I_ErrorMsg no es null (y es justamente seteado a NULL al principio de prepareImportatation, en la linea 139).
    Esto se soluciona en vez de seteandolo a null, seteandolo a ”,
    e.d en la linea 139 cambias [b]I_ErrorMsg = NULL[/b] por [b]I_ErrorMsg = ”[/b].
    Los errores seteados ahí son los que vana aparecer en Mensajes de Error al Importar dentro de Importar Extracto bancario (es probable que tengas que abrir y cerrar la ventana, me parece que no hace un refresh automático de todas las lineas…creo…)[code]

    SELECT o UPDTE….

    WHERE algunas codiciones separas por AND
    AND
    i.I_IsImported<>‘Y’ OR i.I_IsImported is NULL
    AND AD_Client_ID= xxxx

    en donde el ultimo and es agregado por una expresión append( clientCheck ) , y la idea es solo tocar los registros de importacion o de la tabla en las que se impotan los registros que pertenezcan a al mismo cliente (para que importanciones de distintas companias no se mezcle).
    Bueno, en todas esas sentecias hay un error ya que la condicion
    i.I_IsImported<>‘Y’ OE i.I_IsImported is NULL debe ir entre parensis [ esto es exactamente decir que para multiplicar 2 por 3 + 1 uno tiene que escribri 2 * (3 + 1); si uno escibre sin parentesis, e.d 2 * 3 + 1, se evalua como (2 * 3) + 1).
    Por ej el codigo anterior tiene la misma evaluacion que
    [code]

    SELECT o UPDTE….

    WHERE
    (algunas codiciones separas por AND
    AND
    i.I_IsImported<>‘Y’)
    OR
    (i.I_IsImported is NULL
    AND AD_Client_ID= xxxx )

    [code]
    Lo cual obivmente no es la intención de la sentencia.
    No se si este error es el que te está generando problemas, depues miro un poco más. Si queres podes probar cambiando todas los
    i.I_IsImported<>‘Y’ OR i.I_IsImported is NULL
    por
    (i.I_IsImported<>‘Y’ OR i.I_IsImported is NULL)
    En cualuqier caso, eso de setear con ‘E’ algo que es boolena (e.d, puede tomar solo Y o N), me parece muy raro (si lo que se quiere es setear un error, se deberia usar la columan de mensaje de error en la tabla temporal).

    PD : Tambien es probable que haya un error cuando se setea el error de mensaje en expresiones como I_ErrorMsg=I_ErrorMsg||’ERR=Invalid Org
    ya eso concatena los errores solo I_ErrorMsg no es null (y es justamente seteado a NULL al principio de prepareImportatation, en la linea 139).
    Esto se soluciona en vez de seteandolo a null, seteandolo a ”,
    e.d en la linea 139 cambias [b]I_ErrorMsg = NULL[/b] por [b]I_ErrorMsg = ”[/b].
    Los errores seteados ahí son los que vana aparecer en Mensajes de Error al Importar dentro de Importar Extracto bancario (es probable que tengas que abrir y cerrar la ventana, me parece que no hace un refresh automático de todas las lineas…creo…)[code]
    en donde el ultimo and es agregado por una expresión append( clientCheck ) , y la idea es solo tocar los registros de importacion o de la tabla en las que se impotan los registros que pertenezcan a al mismo cliente (para que importanciones de distintas companias no se mezcle).
    Bueno, en todas esas sentecias hay un error ya que la condicion
    i.I_IsImported<>‘Y’ OE i.I_IsImported is NULL debe ir entre parensis [ esto es exactamente decir que para multiplicar 2 por 3 + 1 uno tiene que escribri 2 * (3 + 1); si uno escibre sin parentesis, e.d 2 * 3 + 1, se evalua como (2 * 3) + 1).
    Por ej el codigo anterior tiene la misma evaluacion que

    SELECT o UPDTE….

    WHERE
    (algunas codiciones separas por AND
    AND
    i.I_IsImported<>‘Y’)
    OR
    (i.I_IsImported is NULL
    AND AD_Client_ID= xxxx )

    [code]
    Lo cual obivmente no es la intención de la sentencia.
    No se si este error es el que te está generando problemas, depues miro un poco más. Si queres podes probar cambiando todas los
    i.I_IsImported<>‘Y’ OR i.I_IsImported is NULL
    por
    (i.I_IsImported<>‘Y’ OR i.I_IsImported is NULL)
    En cualuqier caso, eso de setear con ‘E’ algo que es boolena (e.d, puede tomar solo Y o N), me parece muy raro (si lo que se quiere es setear un error, se deberia usar la columan de mensaje de error en la tabla temporal).

    PD : Tambien es probable que haya un error cuando se setea el error de mensaje en expresiones como I_ErrorMsg=I_ErrorMsg||’ERR=Invalid Org
    ya eso concatena los errores solo I_ErrorMsg no es null (y es justamente seteado a NULL al principio de prepareImportatation, en la linea 139).
    Esto se soluciona en vez de seteandolo a null, seteandolo a ”,
    e.d en la linea 139 cambias [b]I_ErrorMsg = NULL[/b] por [b]I_ErrorMsg = ”[/b].
    Los errores seteados ahí son los que vana aparecer en Mensajes de Error al Importar dentro de Importar Extracto bancario (es probable que tengas que abrir y cerrar la ventana, me parece que no hace un refresh automático de todas las lineas…creo…)[code]

    SELECT o UPDTE….

    WHERE
    (algunas codiciones separas por AND
    AND
    i.I_IsImported<>‘Y’)
    OR
    (i.I_IsImported is NULL
    AND AD_Client_ID= xxxx )

    Lo cual obivmente no es la intención de la sentencia.
    No se si este error es el que te está generando problemas, depues miro un poco más. Si queres podes probar cambiando todas los
    i.I_IsImported<>‘Y’ OR i.I_IsImported is NULL
    por
    (i.I_IsImported<>‘Y’ OR i.I_IsImported is NULL)
    En cualuqier caso, eso de setear con ‘E’ algo que es boolena (e.d, puede tomar solo Y o N), me parece muy raro (si lo que se quiere es setear un error, se deberia usar la columan de mensaje de error en la tabla temporal).

    PD : Tambien es probable que haya un error cuando se setea el error de mensaje en expresiones como I_ErrorMsg=I_ErrorMsg||’ERR=Invalid Org
    ya eso concatena los errores solo I_ErrorMsg no es null (y es justamente seteado a NULL al principio de prepareImportatation, en la linea 139).
    Esto se soluciona en vez de seteandolo a null, seteandolo a ”,
    e.d en la linea 139 cambias [b]I_ErrorMsg = NULL[/b] por [b]I_ErrorMsg = ”[/b].
    Los errores seteados ahí son los que vana aparecer en Mensajes de Error al Importar dentro de Importar Extracto bancario (es probable que tengas que abrir y cerrar la ventana, me parece que no hace un refresh automático de todas las lineas…creo…)[code]
    Lo cual obivmente no es la intención de la sentencia.
    No se si este error es el que te está generando problemas, depues miro un poco más. Si queres podes probar cambiando todas los
    i.I_IsImported<>‘Y’ OR i.I_IsImported is NULL
    por
    (i.I_IsImported<>‘Y’ OR i.I_IsImported is NULL)
    En cualuqier caso, eso de setear con ‘E’ algo que es boolena (e.d, puede tomar solo Y o N), me parece muy raro (si lo que se quiere es setear un error, se deberia usar la columan de mensaje de error en la tabla temporal).

    PD : Tambien es probable que haya un error cuando se setea el error de mensaje en expresiones como I_ErrorMsg=I_ErrorMsg||’ERR=Invalid Org
    ya eso concatena los errores solo I_ErrorMsg no es null (y es justamente seteado a NULL al principio de prepareImportatation, en la linea 139).
    Esto se soluciona en vez de seteandolo a null, seteandolo a ”,
    e.d en la linea 139 cambias I_ErrorMsg = NULL por I_ErrorMsg = ”.
    Los errores seteados ahí son los que vana aparecer en Mensajes de Error al Importar dentro de Importar Extracto bancario (es probable que tengas que abrir y cerrar la ventana, me parece que no hace un refresh automático de todas las lineas…creo…)

    #34194
    Javier Ader
    Participante

    mmm, por las cosas que mostre antes y por el hecho de que el formato de importacion para extractos bancarios no existe (al menos yo no lo encontré), me da la sensación de que esta funcionalidad no está implementada y la ventana de importación de extractos quedo de “antes”. Por lo anterior y tambien porque en la linea linea 139 aparece lo siguiente
    Created = COALESCE (Created, SysDate)
    Sysdate es una función de Oracle, no de postgres… e.d el código es viejo y no debería estar habilitado. Ese update tiene que fallar por un error de sintaxis a nivel de sql (lo raro es que debugueando la aplicacion no tiraba ningún error; simplemente el DB.executeUpdate retornaba 0… raro).
    Ahora ejecutando el siguiente update a desde pgadmin

    Code:
    UPDATE I_BankStatement SET AD_Client_ID = COALESCE (AD_Client_ID,1000010), AD_Org_ID = COALESCE (AD_Org_ID,1000047), IsActive = COALESCE (IsActive, ‘Y’), Created = COALESCE (Created, SysDate), CreatedBy = COALESCE (CreatedBy, 0), Updated = COALESCE (Updated, SysDate), UpdatedBy = COALESCE (UpdatedBy, 0), I_ErrorMsg = NULL, I_IsImported = ‘N’ WHERE I_IsImported<>‘Y’ OR I_IsImported IS NULL

    si tira un error de sintáxis debido al SysDate….

    Mi conclusión es que la ventana Importación de extractos debería también estar deshabilitada, ya que todas las demás cosas de las que dependen no están funcionales.

    #34205

    Javier, muchas gracias por el comentario! no se me había ocurrido reparar en esos detalles, sin embargo… creo que el importador anda y perfectamente… solo hay que tener en cuenta una cuestión que menciono mas abajo.

    Respecto a la estructura de las sentencias SQL por ejemplo con el tema del paréntesis en el último AND, creo que esta correctamente armada, porque siempre apenda de la sgte manera: “)” + ).append( clientCheck);

    Ahora lo del sysdate es muy cierto… quizá el COALESCE lo parche siempre por encontrar valor en CREATED, lo cierto es que en general no lo hace pinchar.

    El problema con la validación de la línea 293 se soluciona simplemente imputando un monto en el campo Importe del Estado de Cuenta, porque si no cargamos ahí va a intentar compensar con el Cargo y ahí es donde no valida. Pero mientras el cargo sumado al importe de el Importe del estado de cuenta, no debería haber problemas. Una vez hecho esto, las líneas están disponibles para ser conciliadas.

    Razón por la cual creo que no nos preocupemos por el importador, esta operativo 100%

    #34195
    Javier Ader
    Participante

    lo del and y or sigo creyendo que esta mal jaja. Fijate que en realidad tiene poco sentido chequear porque sea distinto de ‘Y’ o que sea NULL ya que en la primer sentencia sql se setea explícitamente a ‘N’ (el tema es que esta sentencia no creo que funcione por el tema del SysDate).
    Mirando la importación de productos (ImportProduct) se ve que en vez de usar Sysdate se usa current_timestamp lo cual si es una función de postgres. También fijate que lo de setear al principio I_ErrorMsg a NULL sigue siendo un error; lo podes verificar agreando una linea en la ventana de importacion que sepas que va a fallar por que la ecuación que decis no se cumple; en el campo Error De Importación te debería aparecer Err=Invalid Amount , lo cual estoy seguro que no te está apareciendo. Mi conclusión es que la segunda linea que sigue a “// Set Client, Org, IsActive, Created/Updated” hay que cambiarla por

    Code:
    sql.append( ” IsActive = COALESCE (IsActive, ‘Y’),” +
    “Created = COALESCE (Created, current_timestamp),” +
    ” CreatedBy = COALESCE (CreatedBy, 0),” +
    ” Updated = COALESCE (Updated, current_timestamp),” +
    ” UpdatedBy = COALESCE (UpdatedBy, 0),” +
    ” I_ErrorMsg = ”,” + ” I_IsImported = ‘N’ ” +
    “WHERE I_IsImported<>‘Y’ OR I_IsImported IS NULL” );

    el current_timestamp para que no haya error a nivel sintáctico y el I_ErrorMsg seteado a la string vacía para que los mensajes se puedan guardar (el tema de fondo que no dije antes que si vos concatenas NULL a cualquier string el resultado es NULL y eso es lo que estan haciendo los update que setean los errores; es por eso nunca muestra los errores en los campos de Error de Importacion).

    Ahora, después de esto, y asumiendo que esta consulta se ejecuta correctamente, no es posible que haya una fila en la tabla que tenga I_IsImported con NULL (la sentencia anterior la deberia haber puesto a ‘N’); por lo tanto esta condición se pueden borrar en todas las sentencias sql que siguen (por ej en “//set Banck Account” la string ” OR i.I_IsImported IS NULL” simplemente se puede borrar). De esta manera solucionas también el tema de los ORs y los ANDs (simplemente porque desaparecen los ORs!).
    Fijate también que el código debe ser más reciente (por ej el que el chequea la ecuación en cuestion) , NO usa la condición “OR i.I_IsImported IS NULL”, la condición “AND I_IsImported<>‘Y'” alcanza.

    Ahora, como decís, el importador aún funcione! Pero me da la sensación que va a funcionar correctamente cuando los datos en las tablas temporales sean correctos y por ej, va a fallar en poner los errores en la tabla I_ErrorMsg [no lo veo como un error grave, pero si por ej, hay un error como el que te ocurria a vos, es medio difícil de rastrear]. Mejorarlo un poco no cuesta nada.

    Saludos

    PD : a los que manejan el foro… puede ser que hayan dejado de andar los BBCode de Bold? por ej Bold , lo veo explicitamente con los tags “b” en vez de en negrita.

    PD2 : ah ahí haciendo un preview me di cuenta…. los tags b y supongo que casi todos los demás no funcionan dentro de las bbcode Code (algo que me parece de utilidad para remarcar partes especificas del código o cambios realizados). Pasemos a PhpBB ;) !

    #34214

    Gracias por la data Javier, voy a ver si le pego una depurada al importador, me parece que vale la pena.

Viendo 9 entradas - de la 1 a la 9 (de un total de 9)
  • Debes estar registrado para responder a este debate.