PDA

Ver la Versión Completa : Norma 19


farnao
20-10-2006, 16:14:57
Hola amigos:

Sé que hace tiempo estaba disponible en el Club un componente para la norma 19 pero actualmente no sé donde encontrarlo. ¿Alguién me puede indicar dónde obtenerlo o si lo tiene enviármelo?

Muchas gracias.

tomasirolo
06-12-2006, 14:36:48
farnao,

Yo también ando buscando ese componente. ¿Lo has encontrado?

Gracias y un saludo!

Tomás

fly
07-12-2006, 03:10:08
No es un componente pero bueno...
AH!!!! NO TIENE EN CUENTA EL VENCIMIENTO,POR LO CUAL TODOS LOS COBROS SON A LA VISTA !!!!!!!!!!!!!!!!!!!!!!!!!
A ver si algún día lo termino

procedure TForm1.Button1Click(Sender: TObject);
type

T_concepto = string[40];

T_q19_cab_presentador = RECORD
a_cod_reg : String[2];
a_cod_dat : string[2];
b_nif : string[9];
b_sufijo : string[3];
b_f_soporte : string[6];
b_libre : string[6];
c_nom_pre : string[40]; // nombre del presentador
d_libre : string[20];
e_enti : string[4];
e_ofic : string[4];
e_libre : string[12];
f_libre : string[40];
g_libre : string[14];
end;

T_q19_cab_ordenante= RECORD
a_cod_reg : String[2];
a_cod_dat : string[2];
b_nif : string[9];
b_sufijo : string[3];
b_f_soporte : string[6];
b_f_cargo : string[6];
c_nom_ord : string[40]; // nombre del ordenante
d_enti : string[4];
d_ofic : string[4];
d_dc : string[2];
d_cta : string[10];
e_libre : string[8];
e_procedimiento : string[2];
e_libre2 : string[10];
f_libre : string[40];
g_libre : string[10];
end;

T_q19_ind_obligatorio = Record // datos individuales obligatorios (uno por recibo)
a_cod_reg : String[2];
a_cod_dat : string[2];
b_nif : string[9];
b_sufijo : string[3];
b_referencia : string[12];
c_titular : string[40];
d_enti : string[4];
d_ofic : string[4];
d_dc : string[2];
d_cta : string[10];
e_importe : string[10];
f_cod_dev : string[6];
f_cod_ref : string[10];
g_concepto: T_concepto;
h_libre : string[8];
end;

T_q19_opcional_1_5 = Record
a_cod_reg : String[2];
a_cod_dat : string[2];
b_nif : string[9];
b_sufijo : string[3];
b_referencia : string[12];
c_concepto : T_concepto;
d_concepto : T_concepto;
e_concepto : T_concepto;
f_libre : string[14];
end;

T_q19_opcional_6 = Record
a_cod_reg : String[2];
a_cod_dat : string[2];
b_nif : string[9];
b_sufijo : string[3];
b_referencia : string[12];
c_titular : string[40];
d_domicilio : string[40];
e_plaza : string[35];
e_CP : string[5];
f_libre : string[14];
end;

T_q19_tot_ordenante= RECORD
a_cod_reg : String[2];
a_cod_dat : string[2];
b_nif : string[9];
b_sufijo : string[3];
b_libre : string[12];
c_libre : string[40];
d_libre : string[20];
e_total : string[10];
e_libre : string[6];
f_num_dom : string[10]; // numero total de domiciliaciones
f_num_reg : string[10]; // numero total de registros del ordenante
f_libre : string[20];
g_libre : string[18];
end;

T_q19_tot_general= RECORD
a_cod_reg : String[2];
a_cod_dat : string[2];
b_nif : string[9];
b_sufijo : string[3];
b_libre : string[12];
c_libre : string[40];
d_ordenantes : string[4];
d_libre : string[16];
e_total : string[10];
e_libre : string[6];
f_num_dom : string[10]; // numero total de domiciliaciones
f_num_reg : string[10]; // numero total de registros en el soporte
f_libre : string[10];
g_libre : string[18];
end;

const
max_opc = 5;
cod_opc : array[1..max_opc+1] of string = ('81','82','83','84','85','86');

var
cab_pre : T_q19_cab_presentador; // datos del presentador
cab_ord : T_q19_cab_ordenante; //datos del ordenante
ind_obl : T_q19_ind_obligatorio; // datos de domiciliacion obligatorios
reg_opc : array [1..5] of T_q19_opcional_1_5; // registos opcionales para diferenciar conceptos
concepto : array [1..16] of T_concepto; // se usaran los impares para el concepto y los pares para la cantidad, así quedará ordenado en el recibo (ver documentacion sobre el formato q19)

opc_dat : T_q19_opcional_6; // registos opcionales con datos del librador


tot_ord : T_q19_tot_ordenante;
tot_general : T_q19_tot_general;

f: textfile;
linea : string;

fecha_soporte, fecha_cargo : string; // texto con formato fecha
Presentador, Ordenante : string; // Nombre máximo 40 caracteres
NIF_pre, NIF_ord : string; // NIF de presentador y ordenante YA VERIFICADOS
suf_pre, suf_ord : string; // Sufijo presentador y ordenante DADOS POR LA ENTIDAD
enti_pre,ofic_pre : string; // Entidad y oficina presentador y ordenante

enti_ord, ofic_ord, dc_ord, cta_ord: string; // CCC Ordenante
ref_ord : string; //referencia del ordenante

domiciliaciones_ord : integer;
registros_ord : integer;
domiciliaciones_total : integer;
registros_total : integer;

nom_cli :string;
enti_cli, ofic_cli, dc_cli, cta_cli: string; // CCC cliente
ref_cli, domic_cli, plaza_cli, cp_cli : string; //referencia del cliente

importe_dom : double; // importe de cada domiciliacion (temporal)
{todo: hay que añadir un campo en el cliente para indicar la referencia por defecto para sus domiciliaciones}
ref_dom : string; // referencia de la domiciliacion rapa el cliente (póliza, contrato...) para direfenciar diferentes domiciliaciones del mismo cliente
importe_ord : double; // total importes del ordenante
importe_total : double; // total importes del fichero

cont_opc : byte; // contador de registros opcionales
cont_dom : byte; // contador de domiciliaciones (recibos)

begin

fecha_soporte:=datetostr(today);
fecha_cargo:=datetostr(today);

// AQUI VAN LOS DATOS DE DOMICILIACIÓN ....
Presentador:='nombre del presentador';
NIF_pre:='00000000X';
suf_pre:='000';
enti_pre:='0000';
ofic_pre:='0000';

Ordenante:='nombre del presentador';
NIF_ord:='00000000X';
suf_ord:='000';
enti_ord:='0000';
ofic_ord:='0000';
dc_ord:='00';
cta_ord:='0000000000';
// .... DONDE SE ABONARAN LOS GIROS

importe_dom:=0;
importe_ord:=0;
importe_total:=0;
registros_total:=0;
registros_ord:=0;
domiciliaciones_ord:=0;

SaveDialog1.FileName:='remesa';
SaveDialog1.Execute;

{ $I-}
assignfile(f,SaveDialog1.FileName);
// FileMode := 0; {Set file access to read only }
rewrite(f);
{ $I+}

{ -----------------------------------------------------------
------------- CABECERA DEL PRESENTADOR ------------------
----------------------------------------------------------- }

cab_pre.a_cod_reg :='51';
cab_pre.a_cod_dat :='80';
cab_pre.b_nif :=NIF_pre;
cab_pre.b_sufijo :=suf_pre;
cab_pre.b_f_soporte :=FechaFormato('DDMMYY',fecha_soporte);
cab_pre.b_libre :=Format('%-6s',[ '']); //fillchar(cab_pre.b_libre,6,Ord(' '));
cab_pre.c_nom_pre :=Format('%-40s',[Presentador]);
cab_pre.d_libre :=Format('%-20s',[' ']); //fillchar(cab_pre.d_libre,20,Ord(' '));
cab_pre.e_enti :=enti_pre;
cab_pre.e_ofic :=ofic_pre;
cab_pre.e_libre :=Format('%-12s',[' ']); //fillchar(cab_pre.e_libre,12,Ord(' '));
cab_pre.f_libre :=Format('%-40s',[' ']); //fillchar(cab_pre.f_libre,40,Ord(' '));
cab_pre.g_libre :=Format('%-14s',[' ']); //fillchar(cab_pre.g_libre,14,Ord(' '));

with cab_pre
do Linea:= a_cod_reg+
a_cod_dat+
b_nif+
b_sufijo+
b_f_soporte+
b_libre+
c_nom_pre+
d_libre+
e_enti+
e_ofic+
e_libre+
f_libre+
g_libre;
writeln(f,linea);
inc(registros_total);

{ -----------------------------------------------------------
------------- CABECERA DEL ORDENANTE -------------------
----------------------------------------------------------- }

cab_ord.a_cod_reg :='53';
cab_ord.a_cod_dat :='80';
cab_ord.b_nif :=NIF_ord;
cab_ord.b_sufijo :=suf_ord;
cab_ord.b_f_soporte :=FechaFormato('DDMMYY',fecha_soporte);
cab_ord.b_f_cargo :=FechaFormato('DDMMYY',fecha_cargo);
cab_ord.c_nom_ord :=Format('%-40s',[Ordenante]);
cab_ord.d_enti :=enti_ord;
cab_ord.d_ofic :=ofic_ord;
cab_ord.d_dc :=dc_ord;
cab_ord.d_cta :=cta_ord;
cab_ord.e_libre :=Format('%-8s',[' ']); //fillchar(cab_ord.e_libre,sizeof(cab_ord.e_libre),Ord(' '));
cab_ord.e_procedimiento:='01'; // codigo del procedimiento a usar para crear el fichero "01" ó "02"
cab_ord.e_libre2 :=Format('%-10s',[' ']); //fillchar(cab_ord.e_libre2,sizeof(cab_ord.e_libre2),Ord(' '));
cab_ord.f_libre :=Format('%-40s',[' ']);//fillchar(cab_ord.f_libre,sizeof(cab_ord.f_libre),Ord(' '));
cab_ord.g_libre :=Format('%-10s',[' ']);//fillchar(cab_ord.g_libre,sizeof(cab_ord.g_libre),Ord(' '));

with cab_ord
do Linea:= a_cod_reg+
a_cod_dat+
b_nif+
b_sufijo+
b_f_soporte+
b_f_cargo+
c_nom_ord+
d_enti+
d_ofic+
d_dc+
d_cta+
e_libre+
e_procedimiento+
e_libre2+
f_libre+
g_libre;
writeln(f,linea);
inc(registros_total);
inc(registros_ord);

{ -----------------------------------------------------------
------------- DOMICILIACIONES -----------------------
----------------------------------------------------------- }

// E:\Fly\cuarta\prueba_q19.txt
// E:\Fly\cuarta\remesas\remesa.q19

nom_cli:='########################';
enti_cli:='####';
ofic_cli:='####';
dc_cli:='##';
cta_cli:='##########';
ref_dom:='############';
concepto[1]:='####################';

DMF1.IBQuery1.SQL.Text:=
' SELECT periodo_fac,serie_fac,num_fac, '+
' nom_comp AS CLIENTE, importe AS TOTAL, vto AS VTO, Fecha_valor AS FECHA, '+
' Banco_Cli as BANCO, enti_cli AS ENTI, ofic_cli AS OFIC, dc_cli AS DC, cta_cli AS CTA, '+
' dir_cli, cp_cli, loc_cli, prov_cli, ref_cli AS referencia, ref AS nota, extra '+
' FROM Efectos_Cobrar '+
' WHERE '+Filtro_efecto+
' ORDER BY enti_cli,ofic_cli,periodo_fac,serie_fac,num_fac'+
' ';
// es necesario que este ordenado por entidad+oficina para el fichero de adeudos
Dmf1.Actualiza_Query(dmf1.IBquery1);

while not dmf1.IBQuery1.Eof do
begin
nom_cli:=dmf1.IBQuery1.fieldbyname('cliente').AsString;
enti_cli:=dmf1.IBQuery1.fieldbyname('enti').AsString;
ofic_cli:=dmf1.IBQuery1.fieldbyname('ofic').AsString;
dc_cli:=dmf1.IBQuery1.fieldbyname('dc').AsString;
cta_cli:=dmf1.IBQuery1.fieldbyname('cta').AsString;
ref_dom:='Mant. '+dmf1.IBQuery1.fieldbyname('referencia').AsString;
importe_dom:=dmf1.IBQuery1.fieldbyname('total').AsFloat;
concepto[1]:=dmf1.IBQuery1.fieldbyname('nota').AsString;

domic_cli:=dmf1.IBQuery1.fieldbyname('dir_cli').AsString;
plaza_cli:=dmf1.IBQuery1.fieldbyname('loc_cli').AsString;
cp_cli:=dmf1.IBQuery1.fieldbyname('cp_cli').AsString;

ind_obl.a_cod_reg :='56';
ind_obl.a_cod_dat :='80';
ind_obl.b_nif :=NIF_ord;
ind_obl.b_sufijo :=suf_ord;
ind_obl.b_referencia :=Format('%-12s',[ref_dom]); {todo: no pueder ser todo blancos ni todo ceros}
ind_obl.c_titular :=Format('%-40s',[nom_cli]);
ind_obl.d_enti :=Format('%-4s',[enti_cli]);
ind_obl.d_ofic :=Format('%-4s',[ofic_cli]);
ind_obl.d_dc :=Format('%-2s',[dc_cli]);
ind_obl.d_cta :=Format('%-10s',[cta_cli]);
ind_obl.e_importe :=redondeo_str_sincoma(importe_dom,10,2); // 10 digitos incluyendo los 2 decimales
ind_obl.f_cod_dev :='000001';
ind_obl.f_cod_ref :='1234567890';
ind_obl.g_concepto :=Format('%-40s',[concepto[1]]); //
ind_obl.h_libre :=Format('%-8s',[' ']); // fillchar(ind_obl.h_libre,8,Ord(' '));

with ind_obl
do Linea:= a_cod_reg+
a_cod_dat+
b_nif+
b_sufijo+
b_referencia+
c_titular+
d_enti+
d_ofic+
d_dc+
d_cta+
e_importe+
f_cod_dev+
f_cod_ref+
g_concepto+
h_libre;
writeln(f,linea);

inc(registros_total);
inc(registros_ord);
inc(domiciliaciones_ord);
inc(domiciliaciones_total);
importe_total:=importe_total+importe_dom;
importe_ord:=importe_ord+importe_dom;

{
concepto[2]:=' tantos €';
concepto[3]:=' segundo concepto';
concepto[4]:=' mas €';

for cont_opc:=1 to max_opc do
begin
reg_opc[cont_opc].a_cod_reg :='56';
reg_opc[cont_opc].a_cod_dat :=cod_opc[cont_opc];
reg_opc[cont_opc].b_nif :=NIF_ord;
reg_opc[cont_opc].b_sufijo :=suf_ord;
reg_opc[cont_opc].b_referencia :=Format('%-12s',[ref_dom]); // todo: no pueder ser todo blancos ni tosdo ceros
reg_opc[cont_opc].c_concepto :=concepto[(cont_opc-1)*3+2];
reg_opc[cont_opc].d_concepto :=concepto[(cont_opc-1)*3+3];
reg_opc[cont_opc].e_concepto :=concepto[(cont_opc-1)*3+4];
reg_opc[cont_opc].f_libre :=Format('%-14s',[' ']);
inc(registros_total);
inc(registros_ord);
end;

for cont_opc:=1 to max_opc do
begin
with reg_opc[cont_opc]
do Linea:= a_cod_reg+
a_cod_dat+
b_nif+
b_sufijo+
b_referencia+
c_concepto+
d_concepto+
e_concepto+
f_libre;
writeln(f,linea);
end;
}


// datos opcionales del cliente
opc_dat.a_cod_reg :='56';
opc_dat.a_cod_dat :=cod_opc[max_opc+1];
opc_dat.b_nif :=NIF_ord;
opc_dat.b_sufijo :=suf_ord;
opc_dat.b_referencia :=Format('%-12s',[ref_dom]);
opc_dat.c_titular :=Format('%-40s',[nom_cli]);
opc_dat.d_domicilio :=Format('%-40s',[domic_cli]);
opc_dat.e_plaza :=Format('%-35s',[plaza_cli]);
opc_dat.e_CP :=Format('%.5d',[StrToInt(cp_cli)]);
opc_dat.f_libre :=Format('%-14s',[' ']);

with opc_dat
do Linea:= a_cod_reg+
a_cod_dat+
b_nif +
b_sufijo +
b_referencia+
c_titular +
d_domicilio+
e_plaza +
e_CP +
f_libre;
writeln(f,linea);
inc(registros_total);
inc(registros_ord);

dmf1.IBQuery1.Next;
end; // del while


{ -----------------------------------------------------------
------------- TOTAL DEL ORDENANTE ----------------------
----------------------------------------------------------- }

tot_ord.a_cod_reg :='58';
tot_ord.a_cod_dat :='80';
tot_ord.b_nif :=NIF_ord;
tot_ord.b_sufijo :=suf_ord;
tot_ord.b_libre :=Format('%-12s',[' ']) ;//fillchar(tot_ord.b_libre,sizeof(tot_ord.b_libre),Ord(' '));
tot_ord.c_libre :=Format('%-40s',[' ']); //fillchar(tot_ord.c_libre,sizeof(tot_ord.c_libre),Ord(' '));
tot_ord.d_libre :=Format('%-20s',[' ']); //fillchar(tot_ord.d_libre,sizeof(tot_ord.d_libre),Ord(' '));
tot_ord.e_total :=redondeo_str_sincoma(importe_ord,10,2); // 10 digitos incluyendo los 2 decimales
tot_ord.e_libre :=Format('%-6s',[' ']); //fillchar(tot_ord.e_libre,sizeof(tot_ord.e_libre),Ord(' '));
tot_ord.f_num_dom :=Format('%.10d',[domiciliaciones_ord]) ; // numero total de domiciliaciones
tot_ord.f_num_reg :=Format('%.10d',[registros_ord+1]); // numero total de registros del ordenante
tot_ord.f_libre :=Format('%-20s',[' ']); //fillchar(tot_ord.f_libre,sizeof(tot_ord.f_libre),Ord(' '));
tot_ord.g_libre :=Format('%-18s',[' ']); //fillchar(tot_ord.g_libre,sizeof(tot_ord.g_libre),Ord(' '));
with tot_ord
do Linea:= a_cod_reg+
a_cod_dat+
b_nif+
b_sufijo+
b_libre+
c_libre+
d_libre+
e_total+
e_libre+
f_num_dom+
f_num_reg+
f_libre+
g_libre;
writeln(f,linea);
inc(registros_total);


{ -----------------------------------------------------------
------------- TOTAL GENERAL -----------------------------
----------------------------------------------------------- }

tot_general.a_cod_reg :='59';
tot_general.a_cod_dat :='80';
tot_general.b_nif :=NIF_pre;
tot_general.b_sufijo :=suf_pre;
tot_general.b_libre :=Format('%-12s',[' ']); //fillchar(tot_general.b_libre,sizeof(tot_general.b_libre),Ord(' '));
tot_general.c_libre :=Format('%-40s',[' ']);//fillchar(tot_general.c_libre,sizeof(tot_general.c_libre),Ord(' '));
tot_general.d_ordenantes :=Format('%.4d',[1]);
tot_general.d_libre :=Format('%-16s',[' ']); //fillchar(tot_general.d_libre,sizeof(tot_general.d_libre),Ord(' '));
tot_general.e_total :=redondeo_str_sincoma(importe_total,10,2); // 10 digitos incluyendo los 2 decimales
tot_general.e_libre :=Format('%-6s',[' ']); //fillchar(tot_general.e_libre,sizeof(tot_general.e_libre),Ord(' '));
tot_general.f_num_dom :=Format('%.10d',[domiciliaciones_total]); // numero total de domiciliaciones
tot_general.f_num_reg :=Format('%.10d',[registros_total+1]); // numero total de registros en el soporte
tot_general.f_libre :=Format('%-10s',[' ']); //fillchar(tot_general.f_libre,sizeof(tot_general.f_libre),Ord(' '));
tot_general.g_libre :=Format('%-18s',[' ']); //fillchar(tot_general.g_libre,sizeof(tot_general.g_libre),Ord(' '));

with tot_general
do Linea:= a_cod_reg+
a_cod_dat+
b_nif+
b_sufijo+
b_libre+
c_libre+
d_ordenantes+
d_libre+
e_total+
e_libre+
f_num_dom+
f_num_reg+
f_libre+
g_libre;
writeln(f,linea);



closefile(f);

{ memo1.Clear;
reset(f);
while not eof(f) do
begin
readln(f,linea);
memo1.Lines.Add(linea);
end;
closefile(f);
}

end;



Espero que os sea util y si teneis alguna otra norma estaría bien dejarla por aquí.

Saludos.

PD: Para usar esto deberéis saber como funciona la norma, preguntad cualquier duda. Tambien tengo un PDF del banco donde la explica, por si os interesa.

fly
07-12-2006, 03:16:32
Ops!, veo que he usado alguna que otra función que no he adjuntado... bueno, si le interesa a alguien que de un toque, si no ya lo colgaré cuando esté terminado y si puede ser un poco más ordenado ;)

farnao
02-02-2007, 17:49:48
Gracias a fly por su interes. Disculpa no haberte contestado antes pero no he pasado por estos lares desde hace tiempo. De todas formas encontré el componente. Gracias a la página de archivos históricos (creo que de google) obtuve el componente cuando estaba colgado en ClubDelphi.