COBOLプログラミングでコンパイルエラーが発生!解決方法を教えてください

このQ&Aのポイント
  • COBOLプログラミングでコンパイルエラーが発生し、困っています。具体的にはIF文の条件に誤りがあり、書き方が不完全です。また、SELECT文の実行方法にも問題があります。正しい書き方や解決方法を教えていただきたいです。
  • COBOLプログラミングにおいて、コンパイルエラーが発生しました。エラーの内容は、IF文の条件中のオペランドに誤りがあるというものです。また、IF文の書き方が不完全であることも指摘されています。詳細な問題点や解決策を教えてください。
  • COBOLプログラミングでのコンパイルエラーに困っています。具体的には、IF文の条件に誤りがあり、書き方が不完全であるという問題があります。また、SELECT文の実行方法にも問題があります。正しい書き方や解決方法を教えていただけると助かります。
回答を見る
  • ベストアンサー

COBOL プログラミング

プログラミングでコンパイルエラーがでて困っています。 問題があったら 指摘していただきたいです。 IF文の条件に合致したときは上のSELECT文 合致しなかったときは下のSELECT文を実行するプログラム コンパイルエラーの内容 条件中のオペランドに誤りがあります。                IF文の書き方が不完全です。 :VSL.MECIDENPYO_NO は定義がなされているものとします IF  :VSL.MECIDENPYO_NO NOT = SPACE EXEC SQL SELECT  抽出したい項目1,  抽出したい項目2, 抽出したい項目3, 抽出したい項目4            * FROM テーブル名 * WHERE 条件1 AND 条件2 AND 条件3   END-EXEC ELSE EXEC SQL     SELECT   抽出したい項目1,  抽出したい項目2, 抽出したい項目3, 抽出したい項目4            * FROM テーブル名 WHERE 条件1 AND 条件2 END-EXEC   END-IF

noname#179158
noname#179158

質問者が選んだベストアンサー

  • ベストアンサー
  • Siegrune
  • ベストアンサー率35% (316/895)
回答No.3

COBOLもEND-IFを使うならTHENが必要だったはず。 if ・・・ then EXEC SQL ・・・END-EXEC else EXEC SQL ・・・END-EXEC end if また、data divisionに :VSL.MECIDENPYO_NO が定義されていない。 というより、:を含む項目名は定義できないので別の項目名にする必要がありますけれど。 (以上は一般的なCOBOLの文法のはず。といってもCOBOL85くらいまでしか知りませんが。)

noname#179158
質問者

お礼

.ありがとうございます。無事コンパイルが通りました!!

その他の回答 (4)

  • SaKaKashi
  • ベストアンサー率24% (755/3136)
回答No.5

データベースとCOBOLのコンパイラの組み合わせにもよりますが、 たいていは、:で始まる変数を記述できるのはEXEC-SQLからEND-EXECの間だけなのです。 EXEC-SQLからEND-EXECの外では:始まりの変数は使えないので、 >IF  :VSL.MECIDENPYO_NO NOT = SPACE ではなく IF  VSL.MECIDENPYO_NO NOT = SPACE としてみてください。

noname#179158
質問者

お礼

ありがとうございます。無事コンパイルが通りました!!

  • ricman
  • ベストアンサー率58% (10/17)
回答No.4

IF  :VSL.MECIDENPYO_NO NOT = SPACE IF  :VSL.  に . が有るので IF分がここで終わっていると判断されていると思われます。 変数名を変更するとOKでしょう

noname#179158
質問者

お礼

.ありがとうございます。無事コンパイルが通りました!! ..

回答No.2

IFの後のはプログラムで定義しているデータ項目なんですよね? 「:」がついてるのはなぜでしょう? SQL文の中ではホスト変数につけますけど、こういう使い方はみたことがないような…

noname#179158
質問者

お礼

.ありがとうございます。無事コンパイルが通りました!! ..

  • tunamelt
  • ベストアンサー率75% (9/12)
回答No.1

「項目」や「条件」と置き換わっていたり半角スペースや全角スペースが混じっていたりで、正確にどこが悪いのか判断が付きません。 どのコンパイラにも言えることですが、エラー内容はコンパイル時に問題が起きた箇所であって、それが問題の原因の箇所とは限りません。どこが間違っているか分からない場合は問題の切り分けをしてみましょう。 まずはIF文が正しいかを判断してみてください。 IF :VSL.MECIDENPYO_NO NOT = SPACE ELSE END-IF のようにIF文のみにしてコンパイルしてみてください。 エラーがでなければIF文ではなく中身のSELECT文がおかしいことになります。 IF文のみでのコンパイルが通った場合は、そのIF文を一旦コメントアウトしておいて、TRUEだった場合の処理、FALSEだった場合の処理だけでそれぞれコンパイルしてみます。エラーになった箇所がありましたら、その部分を修正してIF文として組み立てなおしてください。

noname#179158
質問者

お礼

.ありがとうございます。無事コンパイルが通りました!! ..

関連するQ&A

  • COBOL プログラミング

    以下の処理でエラーがでてしまっていますがどこが間違っているのかよくわかりません。 文法の間違いを指摘していただけますでしょうか?? ROWNUM と副問い合わせを使用したプログラムです。  ただし全角半角はエラーに含まないものとします。 よろしくお願いいたします。             IF MECIDENPYO_NO NOT = SPACE  THEN   EXEC SQL    SELECT  SKA_SAKI_CD --出荷先           ,SKA_TYPE --出荷タイプ    INTO :A. SKA_SAKI_CD,        :A. SKA_TYPE   FROM (SELECT  SKA_SAKI_CD --出荷先              ,SKA_TYPE --出荷タイプ        INTO   :A. SKA_SAKI_CD,              :A. SKA_TYPE FROM  テーブル名 * WHERE SKA_SLIP_NO LIKE '____' || :HST-EDIT_BIKOU AND DEL_FLG = '0' * ORDER BY INCE_DATE DESC) WHERE ROWNUM <=1 END-EXEC END-IF.

  • COBOL プログラミング

    課題で「DBからデータを取得する際、それぞれの項目から登録日が最新のデータを1件取得する」という課題をしています。 そこで以下のような処理のプログラムを書きました。 IF MECIDENPYO_NO NOT = SPACE EXEC SQL SELECT  SKA_SAKI_CD --出荷先        ,SKA_TYPE --出荷タイプ INTO :A. SKA_SAKI_CD,   :A. SKA_TYPE FROM テーブル名 WHERE SKA_SLIP_NO LIKE '____' || :HST-EDIT_BIKOU AND DEL_FLG = '0' AND INS_DATE =(SELECT MAX(INS_DATE) FROM テーブル名 END-EXEC END-IF 上記の処理だとテーブルの中で登録日(INS_DATE)の最大値であるデータ1件だけしか取得できません。 私が実現したい機能はたとえば Aという項目とBという項目があったとして      登録日 A    2011/9/9 A 2011/9/11 A 2011/9/10 B 2011/8/9 B 2011/8/18 B 2011/9/20 Aの中で登録日が最新(最大)である A 2011/9/11 Aの中で登録日が最新(最大)である B 2011/9/20 を取得する処理を実現したいです!! これを実現するにはORDER BY して降順に並べた後に、ROWNUMを使うらしいのですが よくわかりません。どなたかプログラムで書いていただけますかか?? ヒントや考え方でもかまいません よろしくお願いいたします。

  • PLSQLで条件によりSQLを動的に変えたい

    例えば、あらかじめテーブルなどを読み、その内容により、 SQLの文そのものを非常に変えたいとします。 SQLその1 select * from TABLEA where A = 1 SQLその2 select * from TABLEA where A = 1 and B = 2 and C = 3 and D = 4 上記は例ですが、内容などにより複雑な条件式を追加したい。 ベースのSQLは非常に長い為、 例えば 完全に切り分けるのでは無く、共通の部分は共通ソースとしたい。 また、プリプロセッサみたいに、条件式が追加された場合 あたかも、初めからそのSQLのみがあり、他の制御文などをSQL文自身には追加したくない。 動的SQLでは無い方法でそのような事が可能でしょうか? ----- イメージ ----- select * from TABLEA where A = 1 IF (条件がある時のみ) B = 2 and C = 3 and D = 4 END IF; ------------------- 実際には、SQL文の中にPLSQLの制御文をうまく追加できない。

  • SQL SERVER の Where条件

    初めて質問させて頂きます。 VB内でSQL文を作成し、それをSqlServerに送り実行させているのですが、 VB内でSQL文を作成する時に、Whereの条件を入れたり入れなかったりします。 その時、都度、WhereをつけるのかAndをつけるのか判断してプログラムを書くのが億劫なので Dim SqlString as string SqlString = "SELECT * FROM テーブルA WHERE 0 = 0" IF txtA.text <> "" then SqlString = SqlString & " AND 項目A = " & txtA.text END IF IF txtB.text <> "" then SqlString = SqlString & " AND 項目B = " & txtB.text END IF こういうズボラをしてるのですが、これってSqlの実行スピードに影響したりしますか? 思うようにインデックス使ってくれなかったりしますか? ご存知の方がご教授下さい。 よろしくお願いします。

  • タイムスタンプ型を抽出条件に指定した場合のSQL

    タイムスタンプ型を抽出条件に指定した場合、どの様なSQL文を指定すれば良いでしょうか? 該当するレコードは確かに存在していますが、以下のSQL文では「空」になってしまいました。 【実行したSQL文】 SELECT フィールド FROM テーブル WHERE タムスタンプ型フィールド BETWEEN '2011-08-05 20:00:00' AND '2011-08-06 19:59:59' 何卒、ご教授頂ければと存じます。 宜しくお願いします。

    • ベストアンサー
    • MySQL
  • Pro COBOLでは、最後執行したSQL文を取得したい

    【背景】バッチプログラムを実行中、トラブルが発生した場合、どのSQL文が発行されてトラブルになったか知りたいです。   例えば、EXEC SQL SELECT * FROM USE_TABLE WHERE USE_ID=:USE_ID直後でトラブルになった場合、仮に:USE_ID='yxy19700804'でしたら、COBOLがOracleにEXEC SQL SELECT * FROM USE_TABLE WHERE USE_ID='yxy19700804'といったSQL文を発行した直後、トラブルになります。「EXEC SQL SELECT * FROM USE_TABLE WHERE USE_ID='yxy19700804'」をシステム的に取得方法がありますか?

  • Oracle+ProCOBOLで項目のNULLを判定する方法

    Oracle8i、ProCOBOL でソフト開発中の者です。 ProCOBOLで SELECT文で読み込んだ項目が NULL かどうか を判定する方法がわからず困ってます。 SymfoWareServer の時は、次の様にしてやりました。 01 ID01 PIC S9(04) BINARY. *>INDICATOR   ・・・・・   ・・・・・ EXEC SQL SELECT ITEM01 INTO :ABC.ITEM01 :ID01 FROM ABC END-EXEC. IF ID01 = -1 ・・・・NULL ・・・ END-IF. SELECT文を実行した後で ID01 の内容を聞けば その項目が NULL かどうか判定できたんです。 Oracle+ProCOBOLの場合はどうするのかご存じの方 おりましたらお教え下さい。

  • VBとDB連携について

    VB.NETとDB(オラクル)を使って開発をしています。 画像の左側のテキストボックスは上から  textbox1(Nameプロパティ:txt_Name)  textbox2(Nameプロパティ:txt_Tihou)  textbox3(Nameプロパティ:txt_Category) としています SQL文で textbox1~textbox3の内容が入っている項目だけWHERE句で抽出させたいです たとえば画像の例で、 textbox1に「みかん」、textbox3に「果物」と入れているとき、 赤の四角で囲った2行をdatagridviewとかに表示しようとおもっています 実際のコード(変数等は中略しています) 'textbox1、textbox2、textbox3が空白でない if textbox1.text <> "" And textbox2.text <> "" And textbox3.text <> "" SQL = "select * from ["表名"] where 名前 = " & textbox1.text & _ " and 地方 = " &textbox2.text & " and カテゴリ = " & textbox3.text" end if 'textbox1が空白でない if textbox1.text <> "" And textbox2.text = "" And textbox3.text = "" SQL = "select * from ["表名"] where 名前 = " & textbox1.text & " end if ・ ・ ・ ・ ・・・という感じで全ての組み合わせ(10通りくらい)でIF文を書いています この例では3つなのでまだいいかもしれませんが、 テキストボックスが10個とか100個とかになったらどのように判断したらいいのか分からないです 何か効率いい方法、知っている方いましたら教えてください

  • 【至急】SQLの結合について教えてください。

    select * from A where ab = '1' and cd = '2' select ef from B where ab = '1' and cd = '2' and ef = '3' 至急質問させてください。 上記SQLを結合したいです。(Oracleです) 取得したいデータはAのテーブルの全項目で、 取得条件として、Bのテーブルの項目ef = '3' だったらという条件を加えたいです。 キー項目は両テーブルとも同じ(ab, cd)です。 どのようなSQLがスマートでしょうか。。 無知で申し訳ございませんが、ご教授いただけますと幸いです。 よろしくお願いいたします。

  • 【再投稿】Pro*Cの大文字小文字

    こんにちは。 現在Oracle9 Pro*Cで開発をしているのですが、下記のSQLが変です。 どう変かというと・・・ (1)EXEC SQL SELECT ABC FROM DB1 WHERE A_NUM = \'1\'; (2)EXEC SQL SELECT abc FROM DB1 WHERE A_NUM = \'1\'; (3)EXEC SQL SELECT Abc FROM DB1 WHERE A_NUM = \'1\'; 元々(1)のように記述してありました。 それがある日突然データがあるのにNotFoundになって、ためしに項目名ABCをabcに変えたところ、なぜだかselectできるようになりました。 しかし(2)も今日突然データがあるのにNotFoundになり、(3)のようにAbcにかえたところ、selectできるようになりました。 大文字小文字は関係ないと誰に聞いても言われるのですが、実際今は(3)でないと同じデータでもselectできません。 今はこれでいいですが、この調子で行くときっといつか(3)でもselectできなくなり、aBcとかにしなくてはいけない日が来ると思うのです。 なんででしょう? 環境の問題とかでしょうか? 何か分かる方がいたら、よろしくお願いします。

専門家に質問してみよう