/*============================================================================= ファイル名:CDEMO.C 「iii/Win」 C言語 サンプル・プログラム コンパイラ : Micorsoft Visual C++ =============================================================================*/ #include #include // iii/Win用ヘッダ・ファイル #define WIN32_LEAN_AND_MEAN #include //関数宣言 void DenpyoInput(void ); void KingakuDisplay(char *TankaFname,char *KingakuFname); void FileWrite(void ); void TokuiWindow(void ); void SyohinWindow(void ); void LineShift(char Mode); void PrintSyori(void); //グロ-バル変数 int DenNo = 10001; // 伝票番号 /*----------------------------------------------------------------------------- 業務メニューの選択(この例では6番のみ有効) [F2]:終了 -----------------------------------------------------------------------------*/ int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,LPSTR lpCmdLine,int nCmdShow) { int SelNo; // 選択項目番号 //初期準備 psinit(); // 画面プロセッサを初期化 psscrn("URIMNU.SCR" ); // 業務メニュー画面を表示 SelNo =1; do{ SelNo = psslct( SelNo ); // 業務メニューの選択 switch( SelNo ){ case 6: // 項目No6 = 伝票入力へ psscrn("URI122.SCR" );// 伝票入力画面 DenpyoInput(); // 伝票入力処理 psscrn("URIMNU.SCR" );// 戻って来ると業務メニュー再表示 break; case 132: break;// Menu項目[F2=終了]:終了処理へ default: psalrm( 23, 6, "項目C以外は選択できません。"); break; } }while( SelNo != 132 ); // Menu項目[F2=終了]まで繰り返す //終了処理 psquit(); return 0; } /*----------------------------------------------------------------------------- 伝票入力処理: [F2]終了が押されるまで行う -----------------------------------------------------------------------------*/ void DenpyoInput(void) { int ItemId; // メニューバーのメニュー項目ID int EventNo; // イベント番号 psiput( "DVCODE", DenNo ); // 伝票番号を表示 psdset( "DATE" ); // 本日の日付をセット while(TRUE) { //1.フルスクリーン入力 EventNo = psinpt( "/nextv" ); if( EventNo == 133 ) return; // Menu項目[F2=終了] //2.入力の結果フィールド値が変化していれば必要な後処理をする. if(pschnd() == 1) // 内容が変わったか? { //今、入力を終えたフィールド(/CUR)の処理コードに応じて金額欄の表示を更新 switch( pscode( "/cur" )){ //注:"/*FieldName"は/CURと同行の配列フィールドを意味する //数量欄 case 'Q': KingakuDisplay("/*UTANKA","/*UKIN"); KingakuDisplay("/*STANKA","/*SKIN"); break; //販売単価欄 case 'U': KingakuDisplay("/*UTANKA","/*UKIN"); break; //仕入単価欄 case 'I': KingakuDisplay("/*STANKA","/*SKIN"); break; default: break; } } //3.メニューバー項目の選択に対応する処理に分岐 if(EventNo == 132)//メニューバー・イベント { ItemId = psiquery("MN_SELECTNO","","");//選択されたメニュー項目ID switch( ItemId ) { case 2: // Menu項目[F4=行削除]:行削除処理へ LineShift('U'); break; case 3: // Menu項目[F5=行挿入]:行挿入処理へ LineShift('D'); break; case 401: // サブMenu項目[営業1課]:得意先選択処理へ TokuiWindow(); break; case 501: // サブMenu項目[文具メーカA]:商品選択処理へ SyohinWindow(); break; case 6: // Menu項目[F6=印刷]:印刷指定処理へ PrintSyori(); break; case 7: // Menu項目[F9=書込み]:ファイル出力処理へ FileWrite(); break; case 8: // Menu項目[F1=ヘルプ]:ヘルプ画面表示を行う pswndw("URIHLP.SCR"); // 内容はファイルから自動ロード psinpt("/EVENT"); // イベント待ち psrstr(); break; default:psalrm( 23, 6, "該当のデータは登録されていません。"); break; } } } } /*----------------------------------------------------------------------------- 販売金額を算出して表示する 引数:販売、または、仕入れの単価欄と金額欄のフィールド名 -----------------------------------------------------------------------------*/ void KingakuDisplay(char *TankaFname,char *KingakuFname) { int TfLen,QfLen; // フィ-ルド内文字数 double Qty; // 数量 double Tanka; // 売り単価 double Kingaku; QfLen = psflen( "/*QTY" ); // 数量の文字数 TfLen = psflen( TankaFname ); // 単価の文字数 //単価、数量とも空白でなければ金額表示 if(TfLen != 0 && QfLen !=0) { Qty = psrget( "/*QTY" ); // 数量取り込み Tanka = psrget( TankaFname ); // 単価取り込み Kingaku = Qty * Tanka ; if(Kingaku > 9999999.0){ psalrm( 23, 6, "数量が大きすぎます。"); psfclr(KingakuFname); psposn("/*QTY"); } else{ psrput( KingakuFname, Kingaku); // 金額表示 } } //単価、数量のいずれかが空白だと金額クリア else{ psfclr( KingakuFname ); } } /*----------------------------------------------------------------------------- 伝票の内容をファイルに出力する -----------------------------------------------------------------------------*/ void FileWrite(void) { int i; struct ItemRec{ // アイテム部データ構造体 char Code[6]; char Name[21]; double Qty; double Utanka; double Stanka; double Ukingaku; double Skingaku; }Item[5]; if(psichk() == 0) // 画面上の必要な入力が完了なら書き込みへ { //画面データのアイテム部の取得 //配列フィールドをループ処理で順次アクセスする例 for(i=0;i<=4;i++) { pssgetn("SVCODE",i+1,Item[i].Code); pssgetn("SVNAME",i+1,Item[i].Name); Item[i].Qty = psrgetn( "QTY" , i+1 ); Item[i].Utanka = psrgetn( "UTANKA", i+1 ); Item[i].Stanka = psrgetn( "STANKA", i+1 ); Item[i].Ukingaku = psrgetn( "UKIN" , i+1 ); Item[i].Skingaku = psrgetn( "SKIN" , i+1 ); } /*------------------------------- ファイル出力処理(省略) ---------------------------------*/ psalrm( 23, 6, "ファイルに書き込みました。" ); //次の入力準備 psposn( "/home" ); psfclr( "/all" ); DenNo++; psiput( "DVCODE", DenNo ); psdset( "DATE" ); } } /*----------------------------------------------------------------------------- 得意先ウィンドウを表示して得意先名を選択 TVLB.SCRのリストボックスにはデータファイル名が定義されており、 画面表示を指示するだけでデータが自動的にロードされる。 また、LIST BOXとのデータの授受は、行単位ではなくフィールド単位で行なえるので 非常に取り扱いが便利。 放棄終了:イベント111 = [ESC]キー、取り消しボタン 選択決定:イベント210 = LIST BOX選択 190 = 確定ボタン -----------------------------------------------------------------------------*/ void TokuiWindow(void) { unsigned char Code[5 + 1]; // 得意先コード unsigned char Name[30 + 1]; // 得意先名 int EventNo; // イベント番号 int LbSelNo; // ListBoxでの選択行No pswndw("TVLB.SCR"); psset("LB_SELECTNO","LB1","1"); // 先頭行に選択バーをセット EventNo = psinpt("/EVENT"); // イベント待ち //選択されたLBの行のデータ取得 if(EventNo != 111){ LbSelNo = psiquery("LB_SELECTNO","LB1",""); pssgetn("TVCODE",LbSelNo,Code); pssgetn("TVNAME",LbSelNo,Name); } //親画面に戻り、選択された得意先を表示 psrstr(); if(EventNo != 111){ psfclr("TVADR"); pssput("TVCODE",Code); pssput("TVNAME",Name); } } /*----------------------------------------------------------------------------- 商品ウィンドウを表示して商品名を選択 SVLB.SCRのリストボックスにはデータファイル名が定義されており、 画面表示を指示するだけでデータが自動的にロードされる。 また、LIST BOXとのデータの授受は、行単位ではなくフィールド単位で行なえるので 非常に取り扱いが便利。 放棄終了:イベント111 = [ESC]キー、取り消しボタン 選択決定:イベント210 = LIST BOX選択 190 = 確定ボタン -----------------------------------------------------------------------------*/ void SyohinWindow(void) { int LbSelNo; // ListBoxでの選択行No int EventNo; // イベント番号 char Fcode; // フィ-ルドコ-ド unsigned char Code[5 + 1]; // 商品コード unsigned char Name[20 + 1]; // 商品名 unsigned char Utanka[9+ 1]; // 販売単価 unsigned char Stanka[9+ 1]; // 仕入単価 Fcode = pscode("/CUR"); if(strchr("SQIUN",Fcode) == NULL){ psalrm( 23, 6, "商品選択は明細行で行なって下さい。"); return; } pswndw("SVLB.SCR"); psset("LB_SELECTNO","LB1","1"); EventNo = psinpt("/EVENT"); //選択されたLBの行のデータ取得 if(EventNo != 111){ LbSelNo = psiquery("LB_SELECTNO","LB1",""); pssgetn("SVCODE",LbSelNo,Code); pssgetn("SVNAME",LbSelNo,Name); pssgetn("UTANKA",LbSelNo,Utanka); pssgetn("STANKA",LbSelNo,Stanka); } //親画面に戻り、選択された得意先を表示 psrstr(); if(EventNo != 111) { pssput("/*SVCODE",Code); pssput("/*SVNAME",Name); pssput("/*UTANKA",Utanka); pssput("/*STANKA",Stanka); psfclr( "/*UKIN"); psfclr( "/*SKIN"); psfclr( "/*QTY"); psposn( "/*QTY"); } } /*----------------------------------------------------------------------------- 行挿入・行削除の処理 カレントフィールドの処理コードによって、アイテム部に居る事を確認し、 各欄のプッシュまたはポップを行う 注:"/E"は最終番号の配列フィールドを意味する -----------------------------------------------------------------------------*/ void LineShift(char Mode ) { char Fcode; // フィ-ルドコ-ド Fcode = pscode("/CUR"); if(strchr("SQIUN",Fcode) == NULL) return; if(Mode=='D'){ // 行挿入 pspush( "/*SVCODE", "/E" ); pspush( "/*SVNAME", "/E" ); pspush( "/*QTY" , "/E" ); pspush( "/*UTANKA", "/E" ); pspush( "/*UKIN" , "/E" ); pspush( "/*STANKA", "/E" ); pspush( "/*SKIN" , "/E" ); } else{ // 行削除 pspop( "/*SVCODE" , "/E" ); pspop( "/*SVNAME" , "/E" ); pspop( "/*QTY" , "/E" ); pspop( "/*UTANKA" , "/E" ); pspop( "/*UKIN" , "/E" ); pspop( "/*STANKA" , "/E" ); pspop( "/*SKIN" , "/E" ); } } /*----------------------------------------------------------------------------- 印刷処理 イベント 111 =放棄終了ボタンと [ESC]キー イベント 101 =印刷実行ボタン -----------------------------------------------------------------------------*/ void PrintSyori(void) { int EventNo; // イベント番号 //ウィンドウ表示と各ボタンの初期状態設定 pswndw("URIPRN.SCR"); psiput("C01",1); psiput("R02",1); psiput("R03",1); while(TRUE){ EventNo = psinpt("/NEXT"); if(EventNo == 111) break; if(EventNo == 101){ if(psflen("F01")==0 || psflen("F02") == 0){ psalrm(0,0,"開始と終了番号を入力して下さい。"); } else{ psalrm(0,0,"サンプルですので実際の印刷はできません"); } } } psrstr(); }