SQL文の書き方とマイナス赤の表示は?

解決


ちゃん  2006-03-08 16:07:24  No: 20420  IP: 192.*.*.*

SQL文の書き方とマイナスの表示

以下の表があった場合
                                          計2−計1の式
                                              |
                                              |
数量1  単価1  計1  数量2  単価2  計2  損得    *<−−損得の合計
  2      2      4    3      1      3  ー1    15
                  4                    6    2    16
                  3                    7    4    14
                  3                    5    2    10
                  2                  10    8      8


select 数量1,単価1,数量1*単価1 as 計1,
       数量2,単価2,数量2*単価2 as 計2,
       計2ー計1 as 損得 from DB名前

  上記の式で損得の箇所が計算されないのですが
  式がいけないのでしょうか?
  また、損得の列を合計する式(*の部分)はどのように考えるのでしょうか?
  また  
  マイナスの表示を赤色にするにはどうすればよいのでしょうか?
  あれこれやってみたのですがうまくいきませんお教え願いたいのですが。。
  
  よろしくお願いします。      ちゃん

編集 削除
Syake  2006-03-08 18:30:14  No: 20421  IP: 192.*.*.*

私の解釈が間違いなければ・・・
計算結果のカラムと計算結果のカラムに対して更に、計算
させる事はできなかったような。

SQL文考えてると面倒なので、損得ははずして取得して
その後再計算させるのはいかがでしょうか?

>マイナスの表示を赤色にするにはどうすればよいのでしょうか?
これは結果の表示時ですよね。
結果表示はStringGridしか使わないのですが・・・
私なら、OnDrawCellを使います。

編集 削除
HOta  2006-03-08 20:32:14  No: 20422  IP: 192.*.*.*

select 数量1,単価1,数量1*単価1 as 計1,
       数量2,単価2,数量2*単価2 as 計2,
       (数量1*単価1)ー(数量2*単価2) as 損得 from DB名前
だとどうでしょうか?

また、集計は、Unionで集計行を連結するとできます。ただ、表示順などに工夫がいります。

編集 削除
ちゃん  2006-03-09 12:54:27  No: 20423  IP: 192.*.*.*

SyakeさんHOtaさn
ありがとうございます。下記の要領でできました。
助かりました。

select 数量1,単価1,数量1*単価1 as 計1,
       数量2,単価2,数量2*単価2 as 計2,
       (数量1*単価1)ー(数量2*単価2) as 損得 from DB名前

ついでと言ってはなんですが?
DBgrind 内の表示された数字を変更するのはどうすればいいのでしょうか?
数字を変えようとすると受け付けてくれません。

新規登録もできなくなりました。

SQLで計算をさせてしまうと、その表はDBGrid内を直接変更できないのでしょうか?
ここら辺のつながりがわかりません。


よろしくお願いします。


ちゃん

編集 削除
自前で  2006-03-09 13:06:03  No: 20424  IP: 192.*.*.*

OnGetTextイベントで書き換えてみたら?

編集 削除
HOta  2006-03-09 13:33:23  No: 20425  IP: 192.*.*.*

TQueryは、Orderや式があると更新ができません。
対応は、TQueryにTUpdateSQLを付け足して、ModifySQL,DeleteSQL,InsertSQLのSQLを設定します。これは一つのテーブルに対しての捜査です。複数の場合は、そのテーブルの数だけ用意します。
TQueryのCanModifyをTrueにして、Insert,Postイベントで、ApplyUpdateをします。

編集 削除
ちゃん  2006-03-10 17:54:28  No: 20426  IP: 192.*.*.*

データの入力と再計算はどうしたらよいのでしょうか?

CachedUpdate  をTrueにしたら文字の変更はできました。
当然とは思いますが、再計算はされませんし、元のデータは変更されません。

UpdateSQLを  SQLと並んで取り付けました。
Query1.UpdateObject  プロパティにUpdateSQL1をセットした。
    DeleteSQL
    InsertSQL
    ModifySQL
がありますが  
HOtaさんが書かれました
「SQLを設定するとは?」どういうことでしょうか?
「TQueryのCanModifyをTrueにして、Insert,Postイベントで、ApplyUpdateをします。」
これが解りません。

はてこれからどうすればよいのでしょう。

DBGrid1.OnKeyDown  の場所に
--------------------------------------------------
if not (Query1.State in [dsBrowse,dsInsert]) then
   Query1.Edit
   else
   Query1.Edit;
-------------------------------------------------
というようなものを書くのでしょうか?

それともボタンを作成してSQL文
select 数量1,単価1,数量1*単価1 as 計1,
       数量2,単価2,数量2*単価2 as 計2,
       (数量1*単価1)ー(数量2*単価2) as 損得 from DB名前
を追加するのでしょうか?
的を外しいるかもしれませんが、、、

迷い込んでいます。でも少し進みました。
よろしくお願いします。
ちゃん

編集 削除
HOta  2006-03-10 20:33:12  No: 20427  IP: 192.*.*.*

TQueryで数量1*単価1 as 計1や複数のテーブルからのSQLを作った場合やOrder By句などを使った場合は、どのレコードをUpdateすればよいかがわからなくなります。その場合、TUpdateSQLを使います。
TQueryのUpdateObjectに追加したTUpdateSQLを設定します。
TUpdateSQLの右クリックから、「UpdateSQLの設定」を選びます。この場合は、更新対象のテーブルは一つですから、DB名前を選びます。「テーブル項目の取得」「データーセットのデフォルト」「主インデックスを選択」「SQL文を生成」とボタンを押すと、
    DeleteSQL
    InsertSQL
    ModifySQL
が自動で生成されます。更新する項目を設定すれば、コンパクトになります。
これで更新の用意ができます。
TQueryのOnPostイベントやOnDeleteイベントに

  try
    TIBQuery(DataSet).ApplyUpdates;
  except
    TIBQuery(DataSet).CancelUpdates;
    raise;
  end;
などとかいて更新します。
ちょっと面倒ですが、VBなどでそれぞれに更新SQLを書くよりは、すっきりします。

編集 削除
ちゃん  2006-03-13 15:50:44  No: 20428  IP: 192.*.*.*

1から10までお世話になってしまいます。
delphiの参考書でSQLのところを読んではみたのですが、、、
UpdateSQLの項目はあったのですが、、、、
結局お世話になってしまいます。
上記の
UpdateSQLの設定を通過して
DeleteSQL
InsertSQL
ModifySQL
が作られましてSQL文が自動記入されました。
ここまではできたのですが

そのあとはどのようにするのでしょうか?

-----------------------
TQueryのOnPostイベントやOnDeleteイベントに

  try
    TIBQuery(DataSet).ApplyUpdates;
  except
    TIBQuery(DataSet).CancelUpdates;
    raise;
  end;
------------------------
この部分ができません。
Query1 には  after あるいはbefore イベントしかないのですが
TQueryと書いてありますのでそこに記入するのではないですよね、
それに TIBQuery(DataSet)の部分はこのまま記入するのでしょうか?
ぜーんぶお世話になってしまいます。すみません。
よろしくお願いします。
ちゃん

編集 削除
HOta  2006-03-13 17:48:17  No: 20429  IP: 192.*.*.*

TUpdateSQLはキャッシュを持って、データーベースを操作します。
TUpdateSQLの設定迄ができていて、
次に、TQueryのイベントで、AfterPostやAfterDeleteなどのいずれかにイベントを作り、
  try
    TQuery(DataSet).ApplyUpdates;
  except
    TQuery(DataSet).CancelUpdates;
    raise;
  end;
を書いて、キャッシュを適用する用意をします。
あとはDBgrindの操作をすれば更新できると思います。

編集 削除
ちゃん  2006-03-15 08:36:06  No: 20430  IP: 192.*.*.*

データの変更はできました。
しかし全部同じデータに変更になってしまいます。
これからは自分であれこれやってみますので、
これは後でどうにかなると思います。

データの変更ができることが確認できましたので
今までの質問は解決されたことにさせて頂きます。
また他の方法もあるようですのでそちらも勉強してみます。

随分とお世話になりました。
ありがとうございます。
ちゃん

編集 削除
HOta  2006-03-15 14:37:23  No: 20431  IP: 192.*.*.*

>データの変更はできました。
>しかし全部同じデータに変更になってしまいます。
UpdateSQLの
ModifySQL
でキーがおかしくなっていませんか?

編集 削除