Ms-Dos - Variables no reconocidas en dos bucles de búsqueda

 
Vista:
Imágen de perfil de Ferran
Val: 5
Ha aumentado 1 puesto en Ms-Dos (en relación al último mes)
Gráfica de Ms-Dos

Variables no reconocidas en dos bucles de búsqueda

Publicado por Ferran (3 intervenciones) el 17/02/2020 13:15:38
Una explicación previa

Estoy haciendo un pequeño programa de contabilidad en batch para windows 10. Todo está hecho a excepción del último paso que consiste en recalcular los importes de un fichero (temp2.txt) en el general (temp1.txt). Ambos coinciden en el campo "código" (que en temp2 se encuentra en el token T y en temp1 se encuentra en G).

Cuando hay coincidencia en el código entonces campos de importe que se hallan en temp2.txt (campos V y W además de una suma de estos para dar un saldo) deben añadirse por acumulación a los de temp1.txt (campos I,J y K) .

Estas tres operaciones se realizarán en las variables %entrada%, %salida% y %saldo% para cambiar los campos I, J y K de "temp1.txt" mediante un fichero de transición "temp3.txt" allí donde el campo código de temp2.txt y temp1.txt hayan coincidido. En el caso de que no exista coincidencia simplemente la linea que pertoque en temp1.txt se guardará en temp3.txt. Al final se vuelca temp3.txt a temp1.txt y de esta manera queda actualizado.

Adjunto el script y hago explicación de ello en los REM


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
@echo off
setlocal enabledelayedexpansion
 
if not exist temp1.txt (
echo No existe temp1.txt & goto :final
)
 
REM EXTRACCION DE TODOS LOS DATOS DE TEMP1 Y TEMP2
 
for /f "tokens=1,2,3,4,5,6" %%F in (temp1.txt) do (
set entrada=%%I
set salida=%%J
set saldo=%%K
	for /f "tokens=1,2,3,4,5,6" %%R in (temp2.txt) do (
	call set "ent_Diario=%%V"
	call set "sal_Diario=%%W"
 
REM SE COMPARARAN EL CAMPO CODIGO DE TEMP1 (%%T) Y EL CAMPO CODIGO DE TEMP2 (%%G)
 
	if %%T EQU %%G (
 
		REM SI HAY COINCIDENCIA ENTONCES SE CAMBIAN LOS IMPORTES DE TEMP1 Y SE REDIRIGEN A TEMP3
		REM DEJANDO EL RESTO DE CAMPOS IGUAL
 
		set/a "entrada+=%ent_Diario%"
		set/a "salida+=%sal_Diario%"
		set/a "saldo=%saldo%+(%entrada%-%salida%)"
		call echo %%F %%G %%H %%entrada%% %%salida%% %%saldo%%>>temp3.txt
		entrada=0
		salida=0
		saldo=0
		break=TRUE
		)
	)
 
	REM SI NO COINCIDE NO HAY CAMBIOS Y SE COPIA LA LINEA ORIGINAL DE TEMP1 A TEMP3
 
	call echo %%F %%G %%H %%I %%J %%K>>temp3.txt
)
 
REM AHORA SE VUELCA TEMP3 EN TEMP1 PARA SUBSTITUIRLO Y DESPUES SE BORRA TEMP3
 
copy temp3.txt temp1.txt
del temp3.txt
 
:final
endlocal
echo(
REM echo Recalculados los importes al Plan de Cuentas
echo(
exit /b

La salida a la consola es la siguiente

Falta un operando.
Falta un operando.
Falta un operando.
"entrada" no se reconoce como un comando interno o externo,
programa o archivo por lotes ejecutable.
"salida" no se reconoce como un comando interno o externo,
programa o archivo por lotes ejecutable.
"saldo" no se reconoce como un comando interno o externo,
programa o archivo por lotes ejecutable.


Este es el problema y no sé como arreglarlo. Gracias de antemano a quien pueda ayudar.
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder
Imágen de perfil de Antoni Masana
Val: 1.419
Oro
Ha mantenido su posición en Ms-Dos (en relación al último mes)
Gráfica de Ms-Dos

Variables no reconocidas en dos bucles de búsqueda

Publicado por Antoni Masana (811 intervenciones) el 17/02/2020 15:24:00
Sin los fichero no puedo ver donde falla.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
@echo off
setlocal enabledelayedexpansion
 
if not exist temp1.txt (
    echo No existe temp1.txt & goto :final
)
 
REM EXTRACCION DE TODOS LOS DATOS DE TEMP1 Y TEMP2
 
for /f "tokens=1,2,3,4,5,6" %%F in (temp1.txt) do (
    set entrada=%%I
    set salida=%%J
    set saldo=%%K
    for /f "tokens=1,2,3,4,5,6" %%R in (temp2.txt) do (
        call set "ent_Diario=%%V"
        call set "sal_Diario=%%W"
 
        REM SE COMPARARAN EL CAMPO CODIGO DE TEMP1 (%%T) Y EL CAMPO CODIGO DE TEMP2 (%%G)
 
        if %%T EQU %%G (
 
             REM SI HAY COINCIDENCIA ENTONCES SE CAMBIAN LOS IMPORTES DE TEMP1 Y SE REDIRIGEN A TEMP3
             REM DEJANDO EL RESTO DE CAMPOS IGUAL
 
             set/a "entrada+=%ent_Diario%"
             set/a "salida+=%sal_Diario%"
             set/a "saldo=%saldo%+(%entrada%-%salida%)"
             call echo %%F %%G %%H %%entrada%% %%salida%% %%saldo%%>>temp3.txt
             entrada=0
             salida=0
             saldo=0
             break=TRUE
        )
    )
 
    REM SI NO COINCIDE NO HAY CAMBIOS Y SE COPIA LA LINEA ORIGINAL DE TEMP1 A TEMP3
 
    call echo %%F %%G %%H %%I %%J %%K>>temp3.txt
)
 
REM AHORA SE VUELCA TEMP3 EN TEMP1 PARA SUBSTITUIRLO Y DESPUES SE BORRA TEMP3
 
copy temp3.txt temp1.txt
del temp3.txt
 
:final
    endlocal
    echo(
        REM echo Recalculados los importes al Plan de Cuentas
    echo(
    exit /b

Pero si vero cosas que me chirrían las neuronas:

Que se supone que hace esto: call set "ent_Diario=%%V"

Y esto: call echo %%F %%G %%H %%entrada%% %%salida%% %%saldo%%>>temp3.txt

Para ver donde falla cambia la primera linea por @echo ON

Saludos.
\\//_
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de Ferran
Val: 5
Ha aumentado 1 puesto en Ms-Dos (en relación al último mes)
Gráfica de Ms-Dos

Variables no reconocidas en dos bucles de búsqueda

Publicado por Ferran (3 intervenciones) el 17/02/2020 20:36:16
1) El fichero temp1.txt es el listado de códigos de cada cuenta (que se deben usar en temp2). La primera columna se refiere al número de linea, después va el número de código de cuenta, el nombre de la cuenta y ya despues va la suma total de entradas, la de salidas y su saldo resultante de cada cuenta.

0 100 Banc1 0 0 0
1 101 Banc2 0 0 0
2 200 Butxaca 0 0 0
3 300 Lloguer 0 0 0
4 400 Super 0 0 0
5 410 Subministres 0 0 0
6 420 Assegurances 0 0 0
7 430 Transport 0 0 0
8 440 Internet 0 0 0
9 450 Impostos 0 0 0
10 600 Extres 0 0 0

El fichero temp2.txt es el fichero de Diario (donde se reflejan las operaciones contables. La primera columna es la referencia del asiento, la fecha del asiento, el código de la cuenta, el nombre de la cuenta, el importe de entrada y finalmente el importe de salida. Nunca se llenan entrada y salida a la vez, siempre ha de existir una de las dos a 0.

En este caso hice 2 asientos (0 y 1 y ambos reflejan una entrada con un código y una salida con otro código, por eso el 0 tiene 2 lineas y el 1 igual. El 0 dice que se cobra un alquiler que va a banco y el 1 se refiere a un pago en efectivo para comprar en el Super.

0 13/02/2020 100 Banc1 500 0
0 13/02/2020 300 Lloguer 0 500
1 13/02/2020 400 Super 40 0
1 13/02/2020 200 Butxaca 0 40

Por esto el cógido 100 de temp2.txt debe coincidir con el código 100 de temp1.txt y si eso ocurre la columna de importes de entradas (entDiario) de temp2.txt ha de acumularse en el saldo de entradas ("entrada")de temp1.txt. Y lo mismo con "salDiario" con respeto a "salidas".

2) call set "ent_Diario=%%V" se supone que debe obtener del token %%V de temp2.txt y acumularlo en la variable "ent_Diario". Esa es la intención... Lo mismo que call set "sal_Diario=%%W" con respecto al token %%W de temp2.txt.

3) Te he adjuntado el log completo de la salida del script. Es un poco largo pido disculpas por ello.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de Antoni Masana
Val: 1.419
Oro
Ha mantenido su posición en Ms-Dos (en relación al último mes)
Gráfica de Ms-Dos

Variables no reconocidas en dos bucles de búsqueda

Publicado por Antoni Masana (811 intervenciones) el 17/02/2020 22:27:16
Este código ya debería funcionar bien.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
@echo off
 
if not exist temp1.txt (
    echo No existe temp1.txt & goto :final
)
if not exist temp2.txt (
    echo No existe temp2.txt & goto :final
)
 
REM EXTRACCION DE TODOS LOS DATOS DE TEMP1 Y TEMP2
 
for /f "tokens=1,2,3,4,5,6" %%F in (temp1.txt) do call :Paso_1 %%F %%G %%H %%I %%J %%K
 
REM AHORA SE VUELCA TEMP3 EN TEMP1 PARA SUBSTITUIRLO Y DESPUES SE BORRA TEMP3
 
copy temp3.txt temp1.txt
del  temp3.txt
 
:final
    endlocal
    echo(
        REM echo Recalculados los importes al Plan de Cuentas
    echo(
    goto :EOF
 
:Paso_1
    set Var_F=%1
    set Var_G=%2
    set Var_H=%3
    set Var_I=%4
    set Var_J=%5
    set Var_K=%6
 
    set entrada=%Var_I%
    set salida=%Var_J%
    set saldo=%Var_K%
 
    for /f "tokens=1,2,3,4,5,6" %%R in (temp2.txt) do call :Paso_2 %%R %%S %%T %%U %%V %%W
    echo %Var_F% %Var_G% %Var_H% %entrada% %salida% %saldo% >>temp3.txt
 
    SET entrada=0
    SET salida=0
    SET saldo=0
    goto :Eof
 
:Paso_2
    set Var_R=%1
    set Var_S=%2
    set Var_T=%3
    set Var_U=%4
    set Var_V=%5
    set Var_W=%6
 
    set ent_Diario=%Var_V%
    set sal_Diario=%Var_W%
 
    REM SE COMPARARAN EL CAMPO CODIGO DE TEMP1 (%Var_T%) Y EL CAMPO CODIGO DE TEMP2 (%Var_G%)
 
    if %Var_T% EQU %Var_G% call :Paso_3
    goto :EOF
 
:Paso_3
    REM SI HAY COINCIDENCIA ENTONCES SE CAMBIAN LOS IMPORTES DE TEMP1 Y SE REDIRIGEN A TEMP3
    REM DEJANDO EL RESTO DE CAMPOS IGUAL
 
    set /a entrada+=%ent_Diario%
    set /a salida+=%sal_Diario%
    set /a saldo=%saldo%+(%entrada%-%salida%)
 
    goto :EOF


Como habrás podido ver esta muy cambiado y te voy a contar porque y que cosas estaban mal

1º.- El Call set y el Call echo funcionan por algún misterio de la informática pero la sintaxis en principio no padece correcta.
2º.- El set "a=35" tres cuantos de lo mismo.
3º.- Las variables dentro del FOR cuando se asigna un valor hay que poner esto: setlocal enabledelayedexpansion pero para usarlas no sirve %variable% hay que cambiarlo por !variable!
4º.- Como lo que se ejecuta entre paréntesis ( FOR, IF, etc.) no se puede ver la asignación de las variables, no se puede depurar.
5º.- En tu diseño el fichero temp1.txt se ivá corrompiendo cada vez que ejecutaba el BAT
6º.- Con mi nuevo diseño solo conseguía que me grabase 4 registros.

Y el problema esta en la falta del espacio antes del signo >

1
2
3
echo %Var_F% %Var_G% %Var_H% %entrada% %salida% %saldo% >>temp3.txt
                                                       ^
                                    Este de aquí ------|

¿Y eso por que? Pues cuando el Saldo es 0 y no había el espacio asumia esto:

1
echo 8;440;Internet;0;0; 0>>temp3.txt

Que lo interpreta como 0>> que es... como vete tu a saber el que.

Poniendo el espacio la cosa cambia a esto:

1
echo 8;440;Internet;0;0;0  1>>temp3.txt

Y este uno no esta en el BAT y es la salida estandard. El 2> es la salida de error y el 0< es la entrada estandard.


Saludos.
\\//_
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de Ferran
Val: 5
Ha aumentado 1 puesto en Ms-Dos (en relación al último mes)
Gráfica de Ms-Dos

Variables no reconocidas en dos bucles de búsqueda

Publicado por Ferran (3 intervenciones) el 17/02/2020 23:32:56
Muchísimas gracias Antoni. Funciona perfectamente!.

Y tengo que aprender poco a poco todo lo que me has ilustrado en tu respuesta porque para mí es un salto cualitativo en la forma de programar.

Supongo que has estado un buen rato en resolver este problema que era importante para mí, así que te lo reconozco de corazón.

Un saludo.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar