Skip to main content
cancel
Showing results for 
Search instead for 
Did you mean: 
jorge_redondo
Contributor III
Contributor III

Acumulación condicional durante la carga

Hola!

Estoy dando mis primeros pasos en QV y esta es mi primera consulta en esta gran comunidad.

Estoy creando un script que carga una tabla de una BD de MsAccess que son los apuntes bancarios importados por un programa contable y cuyo origen son los típicos ficheros n43 que te descargas de los bancos.

Como los ficheros n43 no proporcionan un campo 'SALDO' y en la tabla de MsAccess conviven varias cuentas de la misma empresa, y obviamente cada cuenta tiene un saldo distinto, necesito asociar un campo que vaya acumulando el saldo según qué cuenta esté leyendo en la sentencia LOAD.

He probado varias formas pero todas acaban por darme algún error y por eso me he decidido a consultaros.

Observareis que no tengo un estilo muy 'depurado' de programación, pero es lo que hay 🙂

Hasta ahora tengo algo así:

...

// Establezco los slados iniciales de partida según las cuentas

SET vsaldoBSA = 4598,54;

SET vsaldoCAR = -17964,20;

ODBC CONNECT TO [MS Access Database;DBQ=C:\Contasol\Datos\1002013.MDB];

Movimientos_Actual:

LOAD

    ENTOPE as Entidad,

    OFIOPE as Oficina,

    CUEOPE as CC,

    if (CUEOPE = '0001159020', 'BSA', 'CAR',) as MovBanco, //Lee el nº de cuenta y asigna el banco correspondiente (solo hay dos cuentas posibles)

    Day(FECOPE) as MovDia,

    Week(FECOPE) as MovSemana,

    Month(FECOPE) as MovMes,

    FECOPE as [Fecha Operación],

    ORDOPE as Orden,

    COOOPE as [Oficina Origen],

    FVAOPE as [Fecha Valor],

    CCOOPE as [Código Común],

    CPROPE as [Código Propio],

    if([D-HOPE]='D', IMPOPE* -1, IMPOPE) as MovImporte, //Cambia el signo del importe según sea D o H

    // Aquí debería incluir el código para acumular en la variable correspondiente el saldo

    trim(DOCOPE) as Documento,

    trim(RE1OPE) & '' & trim(RE2OPE) as Referencia,

    CO1OPE & ' ' & CO2OPE as Concepto,

    if(PUNOPE=1,'*','') as Punteado,

    IDEOPE as Identificación;

   

SQL SELECT * FROM F_OPE;

1 Solution

Accepted Solutions
Not applicable

Quizás entonces te puedan valer las siguientes expresiones, una por cada cuenta, que partirían de un importe inicial (100 para una y 1000 para otra) e irían acumulando los importes en dos campos distintos. También te adjunto el documento con el script:

If(CUEOPE = '0001159020', NumSum(If([D-HOPE] = 'D', IMPOPE * -1, IMPOPE), Peek('Acum020'), If(IsNull(Peek('Acum020')), 100))) as Acum020,

If(CUEOPE = '2164138022', NumSum(If([D-HOPE] = 'D', IMPOPE * -1, IMPOPE), Peek('Acum022'), If(IsNull(Peek('Acum022')), 1000))) as Acum022,

JG

View solution in original post

5 Replies
Not applicable

Prueba la siguiente combinación, que utiliza Peek() para obtener el valor anterior y NumSum() para ir sumando ignorando los nulos. Tendrás que cambiar el campo Valor por el que tú utilices para el saldo:

Directory;

LOAD Orden,

     Valor,

     NumSum(Valor, Peek('Acum')) as Acum

FROM

Values.xlsx

(ooxml, embedded labels, table is Sheet1);

JG

jorge_redondo
Contributor III
Contributor III
Author

Juan, muchas gracias por tu interés.

Voy encaminado con tu solución pero lo cierto es que me atasco al controlar los dos saldos partiendo del valor inicial asignado en las sentencias SET ya que debo acumular en una variable o en otra dependiendo del nº de cuenta con el que me encuentre en la lectura y ahí es donde no sé cómo emplear las variables.

// Si cuenta = 0001159020 hacer que acumule en una

NumSum( if([D-HOPE]='D', IMPOPE* -1, IMPOPE), Peek('Acum')) as Acum,

Else...

...

Por favor, un cable?

gracias!!

jorge_redondo
Contributor III
Contributor III
Author

Debo añadir que la tabla original está ordenada por nº de cuenta con lo que sólo hay una ruptura a lo largo de la tabla, ya que, como dije sólo contiene dos cuentas distintas.

Adjunto los archivos necesarios. Rogaría que si alguien facilita esa/s lineas de código las plasme en un mensaje.

Gracias!

Not applicable

Quizás entonces te puedan valer las siguientes expresiones, una por cada cuenta, que partirían de un importe inicial (100 para una y 1000 para otra) e irían acumulando los importes en dos campos distintos. También te adjunto el documento con el script:

If(CUEOPE = '0001159020', NumSum(If([D-HOPE] = 'D', IMPOPE * -1, IMPOPE), Peek('Acum020'), If(IsNull(Peek('Acum020')), 100))) as Acum020,

If(CUEOPE = '2164138022', NumSum(If([D-HOPE] = 'D', IMPOPE * -1, IMPOPE), Peek('Acum022'), If(IsNull(Peek('Acum022')), 1000))) as Acum022,

JG

jorge_redondo
Contributor III
Contributor III
Author

Funciona a la perfectión, muchísimas gracias. Ahora voy a analizar lo que hiciste 🙂