IT's AGENT
標準入力 リダイレクト
Bottom

レガシー

まだFD、それも8インチが使われていた頃の話。
商品の受注して発注して、納品された商品を納入するという受発注システムで、あるコンビニでは専用マシンで、受信データを専用FDに保存して、専用のメニュー通りに処理。印刷された受注表を元に転記してFAX発注し、出力された専用の仕分表でピッキングして、店舗毎に分けて納品するという業務フローがあった。

他の量販とのEDIは、JCA手順で受信するのでオフコンで管理するため、受注データを集計して発注するのもまとめて行えるし、発注作業もオフコンであるAS400からPCへ落とし、エクセル&VBAおよびFaxサーバーソフトを用いて各仕入先に半自動で6回線でのFAX送信ができていた。  専用マシンだとすぐには統合できず、転記して発注した後、紙から手入力で、オフコンでは売上計上だけのデータとなっていた。そのため、受信したFDからのデータ変換を試みるが、無手順通信とかで固定長データではなく、データの隙間にNULL文字が不定に詰まっており、データファイルとしては読み込むことができない状態。

標準入力をリダイレクトで受信したFDのファイルに指定して、よくわからないが、Cで印刷不能文字を除去して出力するだけの数行のプログラムを作り、標準出力を別のファイルにリダイレクトした。また、固定長データになるようにファイルの区分を見ながら改行する数行のプログラムを作りこれまたリダイレクトして他の受注データ同様に、半自動FAX発注に結び付けることができた。 なお、これらのリダイレクトの流れはバッチファイルに登録し、担当者はFDをセットしたら、バッチを走らせてデータ変換まで行うボタンのクリックだけで仕事がすむようになり、転記ミスもなくなった。AS400での受注データにも変換する。

過去の遺物で、もうこんなケースはありえないので、誰にもなんの参考にもならないが、苦肉の策の記録。もっと良い方法もあっただろうけど、なんとかなるもんだ。

昔の記録

フィルター C

Cでは標準入力で1文字ずつ入力に対応することができるらしく、入力元をファイルにリダイレクトしたら、通常の読み込みで問題になるNULL文字などを除去できるかも?と考えた。
ポイントはgetchar()だけ。実際には、そのあとに、行のアレンジや通信手順のヘッダー、ボディーの整形処理も行う。

(もともとは使い道のなくなったDOSの98Noteを利用したかったため)

#include <stdio.h>
#include <jctype.h>
main()
{
int c,p,g,s,h;
s=0;
p=0;
g=0;
h=0;
while((c=getchar()) !=EOF){
if (c=='H' && s=='\n'){
g=1;
}
if (c=='H'){
h=1;
}
if (isprint(c)||iskana(c)){
if (g==1){
if (isalpha(c) && c!='H'){
}else{
putchar(c);
p=p+1;
}
}
}else{
if (g==1){
if (c=='\n' && isalpha(s) && p>5){
putchar('\n');
s=0;
p=0;
h=0;
}else{
if (h==1){
if (c=='\n' && p>30){
putchar('\n');
s=0;
p=0;
h=0;
}
}else{
if (c=='\n' && p>38){
putchar('\n');
s=0;
p=0;
h=0;
}
}
}
}
}
s=c;
}
}

リダイレクト DOS bat

リダイレクトをバッチファイルに登録。実際にはWindowsアプリケーションからバッチファイルを作動させる。

echo off
cls
echo :::::::::::::::::::::::::::::::::::::::
echo    データのFDを確認して下さい。
echo :::::::::::::::::::::::::::::::::::::::
pause
cls
c:
cd\
cd targetdir
del target1.txt
del target2.txt
del target.txt
c:\targetdir\O_FLT < a:\moto.dat > target1.txt
c:\targetdir\O_rowarg < target1.txt > target2.txt
c:\targetdir\O_clmext < target2.txt > target.txt
cd\
Topへ
by IT's AGENT