全銀フォーマットの書き出しのperl

全銀フォーマットの振替デートを書き出すperlが出来た。

Aドライブに直接ドンと書きだすようにしたかったのだが、上手くいかないのが残念である。(まだ…..)

ファイル名や銀行毎の振替先のデータを入れ込む口座番号とかファイルで用意しておいてwebからのパラメータでくっつけて持ってくるのをもっと早く仕掛け作っておけばよかった。


今回は結構辛かったが、perlは固定長の操作が上手だなあと実感したのである。

エンコードの扱いに苦労した。

完成したのでアップすることにした。

全銀データのフォーマットはネット上にたくさんあったのだが、適切な所が少なかった。

ここが一番参考になった。東京三菱銀行に感謝である。
特に「ヘッダレコードの種別」(91:振替)に関しての記述が少ないのが困った。
ちなみにヘッダレコードの種別を色々と調べてみた。これが結構面白かったのである。

91:預金口座振替
71:給与(公務員
72:賞与(公務員)
38:地銀協統一基準<----この場合はデータフォーマットが変わる
23:ファクタリング
21:総合振込
11:給与振込
12:賞与振込<---------羨ましい
09:自受け <--------何かわからない
03:入出金明細
01:振込入金通知

などがあったりする。
多分若い順に付いていると思うので、番号発生の歴史などを考えると楽しい。




下記のモジュールに関しての説明

このモジュールの最初に変換する配列をsortした上でリファレンスで渡して、長い文字列を作りjisに書いてファイルに落としている。

この日の日記の続きであり完結編である。

次は不能データの取り込みと各ファイルへの書き込みである。



ここまで出来ればあと僅かなのである。


########引き落としのセレクト
sub zengin_make{##########引き落とし明細の検索の最初のルーチン

	my $down_file_ref=shift;

	my @tagfile=@$down_file_ref;##();###"" = @$down_file_ref;
	@$csv_array_ref = ();
	my ($hiki_mmdd,$h_b_h_ref,$mojiretu)=&hiki_jyunbi($main::p{hiki_bank});#####引き落とし日の文字列と

	my $crlf ="\r\n";

		#####ヘッダレコード作成
	$val_write.="1";######1桁目
	$val_write.="910";######預金口座振替文字コード=jis
	$val_write.=&chg_st($$h_b_h_ref{t_itaku_cd},10,"mae","0");###委託者CD 10桁 前ゼロ
	$val_write.=&chg_st($$h_b_h_ref{t_itaku_name},40,"ato"," ");###委託者名 40桁 後スペース
	$val_write.=$hiki_mmdd;###引き落とし日
	$val_write.=$$h_b_h_ref{t_bank_cd};###取り引き銀行番号
	$val_write.=&chg_st("",15,"ato"," ");###澱引き銀行名(不使用)
	$val_write.=$$h_b_h_ref{t_tori_brancd};###取り引き銀行番号
	$val_write.=&chg_st("",15,"ato"," ");###澱引き銀行名(不使用)
	$val_write.=$$h_b_h_ref{t_tori_syu};###取り引き銀行番号
	$val_write.=$$h_b_h_ref{t_kouza};###取り引き銀行番号
	$val_write.=&chg_st("",17,"ato"," ");###澱引き銀行名(不使用)


	$val_write.=$crlf;
	my $count=0;
	my $sum=0;
	foreach my $rec (@tagfile){
		$rec = decode("UTF-8",$rec);
		my $record="";
		
		my ($meigi)=$rec=~m[j_b_mei>(.*?)(.*?)(.*?)(....)(...)(.*?)(.*?)$record ."0";###新規コード 面倒なのでいつも0をセットここ間違えていた。
		$record .="0";###新規コード 面倒なのでいつも0をセット
		====>正解はこちら「.=」でなければならなかった。
		地元銀行さんの大変新設な対応で何とか切り抜けた。


		$record .=&chg_st("$kaiinncd",20,"mae","0");###会員CD
		$record .="0";###振替結果CD
		$record .=&chg_st("",8,"ato"," ");###ダミー
		$record .=$crlf;
		
		$val_write .= $record;
		
		$sum+= $j_keiri_sum;
		$count++;
	}
	
	#######トレーラーレコード
	
	$val_write .= "8";
	$val_write .= &chg_st("$count",6,"mae","0");###合計件数
	$val_write .= &chg_st("$sum",12,"mae","0");###合計金額
	$val_write .=&chg_st("",6,"ato","0");###振替済み件数
	$val_write .=&chg_st("",12,"ato","0");###振替済み金額
	$val_write .=&chg_st("",6,"ato","0");###振替不能件数
	$val_write .=&chg_st("",12,"ato","0");###振替不能金額
	$val_write .=&chg_st("",65,"ato"," ");###ダミー
	$val_write .= $crlf;

	
	$val_write .= "9";
	$val_write .=&chg_st("",119,"ato"," ");###ダミー
	$val_write .= $crlf;###############################最後に cr-lf 入れるの忘れていた


	$val_write = encode('Shift_JIS',$val_write);
	
	my $filename = $main::path{k_path}."csv.down";
	unlink $filename;
	open(DATA, ">>", $filename);
	print DATA $val_write;
}
	

sub zengin_down{##########引き落とし明細の検索の最初のルーチン
	my ($hiki_mmdd,$h_b_h_ref,$mojiretu)=hiki_jyunbi($main::p{hiki_bank});



		my $data="";
		my $filename = $main::path{k_path}."csv.down";
		open(DATA, "<", $filename);
			while(){
				$data .= $_;
				}
			close DATA;

######$$h_b_h_ref{t_path}.
		my $csv_file_name = $$h_b_h_ref{t_fname};
		print $z_perl->get_csv_h($csv_file_name);
		print $data;


		unlink $filename;

}

sub hiki_jyunbi{

	my $bank_cd=shift;
	my $hiki_mmdd;
	my $hiki_bank_hash_ref;
	my ($hiki_mm,$hiki_dd)=$main::p{hiki_date}=~m[^.*?/(..)/(..)$];# =>$main::cp->get("&hiki_date"),
	my $hikaku = "".$bank_cd."";

	my $rec_st="";
		
	foreach my $k (keys(%main::t_bank_has)){
		my $rec =$main::t_bank_has{$k};
			if($rec !~ /$hikaku/){
				next;
			}
		$rec_st.=$rec;
	}
	my $work_st=decode("UTF-8",$rec_st);

	my %rec_hash;########取り込むハッシュ
	&main::field2hash(\$work_st,\%rec_hash,"");###################1レコードの情報をハッシュに入れるルーチン



	return ($hiki_mm.$hiki_dd,\%rec_hash,$work_st);


}
	
	
sub chg_st{	
	my $string=shift;
	my $leng=shift;
	my $maeusiro=shift;
	my $tumemono=shift;
	my $rtnst="";
	
	my $tume_leng=$leng-length($string);
	
	my $tume = $tumemono x $tume_leng;
	
	if($maeusiro eq "mae"){
		$rtnst= $tume.$string;
	}else{
		$rtnst=$string.$tume;
	}
	
	
	
	return $rtnst;
}
	
	
	
return 1;


株式会社 全銀電子債権ネットワークというところではこんな種別を決めていた。
11: 発生記録請求(債務者請求方式)
12: 発生記録請求(債権者請求方式)
20: 譲渡記録請求
30: 分割譲渡記録請求

何でもありのようである。


416924



自信あったのだけど、一回目のテストは全滅だった。
返ってくるエラーが「データ部分 改行コード不整合」だった。

桁ズレを起こしているために起こったエラーだった。

テラパッドのおかげで何とか見つけられた。
MAC版でないかなあ。
固定長のレコード扱う時には超強力である。

こういう間違いを見つけると自分の愚かさを実感する
同時に、助けていただけた素晴らしい方との出会いに感謝を感じる事しきりである。
2014/2/6

417944