Tema: Norma 19
Ver Mensaje Individual
  #3  
Antiguo 07-12-2006
fly fly is offline
Miembro
 
Registrado: abr 2005
Posts: 65
Reputación: 20
fly Va por buen camino
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
Código Delphi [-]
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.

Última edición por fly fecha: 07-12-2006 a las 03:13:29.
Responder Con Cita