Código en pascal
¿No sabés como puedo hacer un código en pascal de un listado con cortes? El mismo se trata de archivos de registros de artículos(supermercado), y están ordenados por un nro. De articulo. Un archivo (movimientos) contiene las ventas y compras de cada articulo y el otro (artículos) los nombres de c/artic.y su stock. Sólo debo hacer corte cuando cambie de articulo y sólo con los artículos de venta, no así de compra
Respuesta de elrata
1
1
elrata, Soy tecnico programador/Analista de sistemas
Para eso, hacete un While Do por cada corte de control y uno general por el tema del EOF guardando los datos anteriores en aun variable auxiliar.
Por ejemplo
art_ant <- ''
While no fin_de_archivo DO
While art = ant_art y no fin_de_archivo DO
Begin
Leer registro
Imprimir art
End
art_ant <- art
End
Espero te sirva, sino, pásame los archivo o el programita que genera los archivos y te lo hago más especifico
Por ejemplo
art_ant <- ''
While no fin_de_archivo DO
While art = ant_art y no fin_de_archivo DO
Begin
Leer registro
Imprimir art
End
art_ant <- art
End
Espero te sirva, sino, pásame los archivo o el programita que genera los archivos y te lo hago más especifico
Esto estaría en el archivo artículos.dat:
Archivo: ARTI.DAT
NroArt Artic PU Stock StockMinimo
1 Artic 1 5,00 15 10
2 Artic 2 5,35 10 30
3 Artic 3 2,00 5 10
4 Artic 4 2,85 20 10
5 Artic 5 3,45 30 15
6 Artic 6 1,25 8 5
7 Artic 7 4,80 10 10
8 Artic 8 3,00 7 10
9 Artic 9 15,00 3 5
10 Artic 10 1,50 5 10
11 Artic 11 2,50 9 5
12 Artic 12 3,15 18 10
13 Artic 13 5,50 9 5
14 Articulo 14 4,25 6 5
15 Articulo 15 3,80 6 10
16 Articulo 16 7,20 11 10
17 Articulo 17 4,25 10 5
18 Articulo 18 4,30 13 10
19 Articulo 19 2,95 20 10
20 Articulo 20 1,99 7 5
22 Articulo 22 8,00 15 20
23 Articulo 23 7,50 12 10
25 Articulo 25 3,00 16 15
27 Articulo 27 6,25 14 8
29 Articulo 29 5,10 19 10
30 Articulo 30 2,00 7 5
Y Esto en el movimientos.dat:
Archivo: MOVÍ.DAT
NroArt Cantidad Op
2 5 V
2 10 C
2 2 V
3 3 C
3 5 C
5 3 V
5 7 V
5 10 V
7 5 V
7 1 V
7 5 C
7 4 V
8 5 C
9 10 C
10 5 C
10 3 C
13 9 C
13 5 V
13 3 V
14 2 V
15 6 V
17 3 C
19 5 V
19 3 V
21 5 C
21 3 V
22 3 C
23 5 C
23 1 V
23 5 V
24 5 V
24 8 V
27 3 C
27 10 V
27 5 V
27 3 C
28 4 V
29 2 V
29 2 V
29 3 C
29 2 V
29 2 V
31 5 C
32 8 V
33 3 C
33 5 V
Y debo mostrar error cuando hay un artic.en movimientos que no esté en artículos.y solo debo imprimir en pantalla los que son son con operación V(venta).
Este seria el formato de impresión:
Listado de ventas de artic.
Numero: *** articulo: **********
cantidad PU Importe(cant*Pu)
*** ***.***,** ***.***,**
*** ***.***,** ***.***,**
..................................
Importe vendido del articulo:***.***,**
Numero: *** articulo: **********
cantidad PU Importe(cant*Pu)
*** ***.***,** ***.***,**
..................................
Importe vendido del articulo:***.***,**
Esto fue lo que hice:
Procedure listadoventas(articulos:string; movimientos:string);
{}
Const
tope=20;
Var
archArt:TarchA;
archMov:TarchM;
regA:Tartireg;
regM:Tmovreg;
hojas:integer;
lineas:integer;
importeV:real;
totalA:integer;
Ant:Tmovreg;
ImporteT:real;
c:char;
HiceSubE:boolean;
pos:integer;
Begin
lineas:=0;
hojas:=0;
ImporteV:=0;
ImporteT:=0;
TotalA:=0;
c:=' ';
Assign(archArt,articulos);
Assign(archMov,movimientos);
reset(archart);
reset(archmov);
IniciarAnt(archMov,Ant);
EncabezadoM(lineas,hojas);
HiceSubE:=false;
While not EOF(archMov) do
Begin
Read (ArchMov,RegM);
If regM.op = 'V' then
Begin
If regM.NroArt <> ant.NroArt then
BuscarBin(archArt,regM.NroArt,regA,pos);
if pos <> -1 then
begin
Subtotal(ImporteV,ImporteT,TotalA,lineas);
Subencabezado(RegM.NroArt, RegA, HiceSubE,lineas);
end
Else
Begin
If not HiceSubE then
Subencabezado(RegM.NroArt,RegA,HiceSubE,lineas);
End;
If lineas > tope then
Begin
piedepagina;
encabezadoM(lineas,hojas);
End;
writeln(' ',RegM.cantidad:3,' ',RegA.pu:6:2,' ',(RegM.cantidad*regA.pu):6:2);
ImporteV:=ImporteV + (RegM.cantidad*regA.pu);
lineas:=lineas+1;
End;
Ant:=RegM;
End;
Writeln('total de articulos listados:', totalA:3);
Writeln('importe total vendido:', importeT:6:2);
Piedepagina;
Close(archArt);
Close(archMov);
End;
Procedure subencabezado(numero:integer; regA:Tartireg; var hicesube:boolean; var lin:integer);
Procedure piedepagina;
{}
var
s:string;
begin
writeln ('oprima enter para continuar');
readln (s);
End;
Procedure iniciarant(var archmov:TarchM;var reg:Tmovreg);
{}
Begin
if not Eof(archmov) then
begin
read(archmov,reg);
seek(archmov,Filepos(archmov)-1);
End;
End;
Procedure Buscarbin(var arch:TarchA; dato:integer; var reg:Tartireg; var pos:integer);
{Precondicion:arch:A y dato:D y A esta abierto y ordenado por su clave
Poscondicion:(pos=-1 y dato no pertenece a A) o (pos>=0 y pos <= tama¤o(A)-1)
y reg=R y regM.NroArt=D y posicion(R)=pos
}
Const
Noesta=-1;
Var
p,f,m:integer;
Begin
p:=0;
f:=fileSize(arch)-1;
pos:=noesta;
while (p<=f) and (pos=noesta) do
begin
m:=((p+f) div 2);
seek(arch,m);
read(arch,reg);
if (reg.NroArt=dato) then {PREGUNTAR}
pos:=m
else
if (reg.nroArt< dato) then
p:=m+1
Else
f:=m-1;
end;
end;
Procedure subtotal(var impV:real; var impT:real;var totA,lin:integer );
begin
writeln('Importe total vendido del articulo:',impv:6:2);
lin:=lin+1;
tota:=tota+1;
impt:=impt+impv;
end;
Procedure encabezadoM(var lin:integer; var hojas: integer);
{}
Begin
clrscr;
hojas:=hojas+1;
writeln(' ');
writeln(' pagina:' ,hojas);
writeln(' Listado de ventas de articulos al dia: ');
writeln(' ');
lin:=4;
end;
Var
c:char;
begin
c:= ' ';
if regA.stock < regA.stockm then
begin
c:= '*';
end;
writeln('Numero: ',c, numero,' Articulo: ',regA.arti:4);
writeln(' Cantidad Pu Importe ');
hicesube:= true;
lin:=lin+2;
end;
AH! Y aclaro que cuando un articulo tenia el stock por debajo del mínimo había que impromirle un * antes del numero de articulo.
Este programa lo corro en pascal y anda bien, lo único que por ahí en algunos artículos me mezcla los PU de uno con el siguiente por ej.
Perdón por la molestia y porque es un montón lo que te mande, pero es para que te ubiques mejor. Desde ya muchas gracias!
Archivo: ARTI.DAT
NroArt Artic PU Stock StockMinimo
1 Artic 1 5,00 15 10
2 Artic 2 5,35 10 30
3 Artic 3 2,00 5 10
4 Artic 4 2,85 20 10
5 Artic 5 3,45 30 15
6 Artic 6 1,25 8 5
7 Artic 7 4,80 10 10
8 Artic 8 3,00 7 10
9 Artic 9 15,00 3 5
10 Artic 10 1,50 5 10
11 Artic 11 2,50 9 5
12 Artic 12 3,15 18 10
13 Artic 13 5,50 9 5
14 Articulo 14 4,25 6 5
15 Articulo 15 3,80 6 10
16 Articulo 16 7,20 11 10
17 Articulo 17 4,25 10 5
18 Articulo 18 4,30 13 10
19 Articulo 19 2,95 20 10
20 Articulo 20 1,99 7 5
22 Articulo 22 8,00 15 20
23 Articulo 23 7,50 12 10
25 Articulo 25 3,00 16 15
27 Articulo 27 6,25 14 8
29 Articulo 29 5,10 19 10
30 Articulo 30 2,00 7 5
Y Esto en el movimientos.dat:
Archivo: MOVÍ.DAT
NroArt Cantidad Op
2 5 V
2 10 C
2 2 V
3 3 C
3 5 C
5 3 V
5 7 V
5 10 V
7 5 V
7 1 V
7 5 C
7 4 V
8 5 C
9 10 C
10 5 C
10 3 C
13 9 C
13 5 V
13 3 V
14 2 V
15 6 V
17 3 C
19 5 V
19 3 V
21 5 C
21 3 V
22 3 C
23 5 C
23 1 V
23 5 V
24 5 V
24 8 V
27 3 C
27 10 V
27 5 V
27 3 C
28 4 V
29 2 V
29 2 V
29 3 C
29 2 V
29 2 V
31 5 C
32 8 V
33 3 C
33 5 V
Y debo mostrar error cuando hay un artic.en movimientos que no esté en artículos.y solo debo imprimir en pantalla los que son son con operación V(venta).
Este seria el formato de impresión:
Listado de ventas de artic.
Numero: *** articulo: **********
cantidad PU Importe(cant*Pu)
*** ***.***,** ***.***,**
*** ***.***,** ***.***,**
..................................
Importe vendido del articulo:***.***,**
Numero: *** articulo: **********
cantidad PU Importe(cant*Pu)
*** ***.***,** ***.***,**
..................................
Importe vendido del articulo:***.***,**
Esto fue lo que hice:
Procedure listadoventas(articulos:string; movimientos:string);
{}
Const
tope=20;
Var
archArt:TarchA;
archMov:TarchM;
regA:Tartireg;
regM:Tmovreg;
hojas:integer;
lineas:integer;
importeV:real;
totalA:integer;
Ant:Tmovreg;
ImporteT:real;
c:char;
HiceSubE:boolean;
pos:integer;
Begin
lineas:=0;
hojas:=0;
ImporteV:=0;
ImporteT:=0;
TotalA:=0;
c:=' ';
Assign(archArt,articulos);
Assign(archMov,movimientos);
reset(archart);
reset(archmov);
IniciarAnt(archMov,Ant);
EncabezadoM(lineas,hojas);
HiceSubE:=false;
While not EOF(archMov) do
Begin
Read (ArchMov,RegM);
If regM.op = 'V' then
Begin
If regM.NroArt <> ant.NroArt then
BuscarBin(archArt,regM.NroArt,regA,pos);
if pos <> -1 then
begin
Subtotal(ImporteV,ImporteT,TotalA,lineas);
Subencabezado(RegM.NroArt, RegA, HiceSubE,lineas);
end
Else
Begin
If not HiceSubE then
Subencabezado(RegM.NroArt,RegA,HiceSubE,lineas);
End;
If lineas > tope then
Begin
piedepagina;
encabezadoM(lineas,hojas);
End;
writeln(' ',RegM.cantidad:3,' ',RegA.pu:6:2,' ',(RegM.cantidad*regA.pu):6:2);
ImporteV:=ImporteV + (RegM.cantidad*regA.pu);
lineas:=lineas+1;
End;
Ant:=RegM;
End;
Writeln('total de articulos listados:', totalA:3);
Writeln('importe total vendido:', importeT:6:2);
Piedepagina;
Close(archArt);
Close(archMov);
End;
Procedure subencabezado(numero:integer; regA:Tartireg; var hicesube:boolean; var lin:integer);
Procedure piedepagina;
{}
var
s:string;
begin
writeln ('oprima enter para continuar');
readln (s);
End;
Procedure iniciarant(var archmov:TarchM;var reg:Tmovreg);
{}
Begin
if not Eof(archmov) then
begin
read(archmov,reg);
seek(archmov,Filepos(archmov)-1);
End;
End;
Procedure Buscarbin(var arch:TarchA; dato:integer; var reg:Tartireg; var pos:integer);
{Precondicion:arch:A y dato:D y A esta abierto y ordenado por su clave
Poscondicion:(pos=-1 y dato no pertenece a A) o (pos>=0 y pos <= tama¤o(A)-1)
y reg=R y regM.NroArt=D y posicion(R)=pos
}
Const
Noesta=-1;
Var
p,f,m:integer;
Begin
p:=0;
f:=fileSize(arch)-1;
pos:=noesta;
while (p<=f) and (pos=noesta) do
begin
m:=((p+f) div 2);
seek(arch,m);
read(arch,reg);
if (reg.NroArt=dato) then {PREGUNTAR}
pos:=m
else
if (reg.nroArt< dato) then
p:=m+1
Else
f:=m-1;
end;
end;
Procedure subtotal(var impV:real; var impT:real;var totA,lin:integer );
begin
writeln('Importe total vendido del articulo:',impv:6:2);
lin:=lin+1;
tota:=tota+1;
impt:=impt+impv;
end;
Procedure encabezadoM(var lin:integer; var hojas: integer);
{}
Begin
clrscr;
hojas:=hojas+1;
writeln(' ');
writeln(' pagina:' ,hojas);
writeln(' Listado de ventas de articulos al dia: ');
writeln(' ');
lin:=4;
end;
Var
c:char;
begin
c:= ' ';
if regA.stock < regA.stockm then
begin
c:= '*';
end;
writeln('Numero: ',c, numero,' Articulo: ',regA.arti:4);
writeln(' Cantidad Pu Importe ');
hicesube:= true;
lin:=lin+2;
end;
AH! Y aclaro que cuando un articulo tenia el stock por debajo del mínimo había que impromirle un * antes del numero de articulo.
Este programa lo corro en pascal y anda bien, lo único que por ahí en algunos artículos me mezcla los PU de uno con el siguiente por ej.
Perdón por la molestia y porque es un montón lo que te mande, pero es para que te ubiques mejor. Desde ya muchas gracias!
- Compartir respuesta
- Anónimo
ahora mismo