変数でという事が分からなかったみたいなので詳しく説明します。データベースで生年月日を20001220というように持っています。それをdelphi側で取り出し、2000/12/20というような感じでDBGridに表示したいという事です。
データベースから取り出す際に、delphi側で、自由に使用できたらと思っています。誰かお願いします。

このQ&Aに関連する最新のQ&A

A 回答 (3件)

状況がよくわからないのでいくつか仮定の上で話します。


前提としてTQueryを使用している。
目的の項目は文字列型で、"20001231"のように年4桁月2桁日2桁の固定文字列である。
文字列型を日付型として取り出したい。
TQueryの名前はQuery1,目的の項目名をDATE
とすると。

変数宣言は
var Birthday:TDateTime;
s:string;
DBから変数への格納。
s:=Query1.FieldByName('DATE').AsString;
Birthday:=EncodeDate(StrtoInt(Copy(s,1,4)),StrtoInt(Copy(s,5,2)),StrtoInt(Copy(s,7,2)));

とゆう具合になります。

この回答への補足

たびたび、すみません。分かりやすい説明ありがとうございます。教えてもらったとおりにやったのですが、うまくできません。
出来れば詳しいソースがほしいのですが・・・・・・
先程教えて頂いたのに加え、onClickしたというイベントを起してText.Editに入れるというまでの一連の過程を作ってもらえないでしょうか?
お願いします。

補足日時:2000/12/22 15:27
    • good
    • 0

単に表示上の問題ならTQueryに静的項目を追加し項目のEditMaskに !9999/99/00;0;_ の様に指定すれば表示されます。


変数として取り出してプログラム中で使用するなら年月日をそれぞれ文字列として取り出してEncodeDate関数で日付型に変換すればいいと思います。

この回答への補足

回答ありがとうございます。もう少し詳しく聞きたいのですが・・・・・
もう少し詳しく説明します。
変数として取り出すという事ですが、データベースからデータを取り出し表示する事は出来るのですが、データベースから取り出し変数に格納する方法を教えて下さい。

補足日時:2000/12/22 09:33
    • good
    • 0

Delphi使いのT.Nakです。



フォーマットが固定されているという条件なら、

dt := '20001220';
temp := Format('%s/%s/%s',[Copy(dt,1,4),Copy(dt,5,2),Copy(dt,7,2)]);

で可能だと思います。

この回答への補足

回答ありがとうございます。もう少し詳しく聞きたいのですが・・・・・
もう少し詳しく説明します。
変数として取り出すという事ですが、データベースからデータを取り出し表示する事は出来るのですが、データベースから取り出し変数に格納する方法を教えて下さい。

補足日時:2000/12/22 09:21
    • good
    • 0

このQ&Aに関連する人気のQ&A

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aと関連する良く見られている質問

QDelphiで扱うデータベース上の日付について

Delphiで扱うデータベース上の日付について
 質問させていただきます。何かしらのマナー違反等ありましたらご指摘願います。
 TDataBaseでデータベースにアクセスし、TQuery、TDatasourceでTDBEditにデータを表示させています。接続するテーブルには日付型のフィールドがありそれをTDBEditに表示させて、編集したのち更新する、もしくは行を挿入してから更新する場合、入力した値が正しく日付であるかどうかはどのようにチェックすればよろしいのでしょうか。
 フィールドにはMaskEditプロパティで2010/06/07とTDBEditに表示するよう設定してあります。

 文字列として保存したものをTDBEditに表示する際日付に変換して表示することも考えたのですが、データベース上で日付による絞り込みや並べ替えをするため、そちらは断念しました。

 まとまりのない文章で申し訳ありませんが、お教えいただければ幸いです。よろしくお願いします。

Aベストアンサー

回答が付かないようですが、質問が理解されていないためかもしれません。

TDataBaseは使用したことがないですが、TADO などでは日付でないデータ(ex. 2010/6/40)を入力するとレコードのアップデート時にエラーになります。
それともご質問の趣旨は、それ以前に「日付」だけを入力したときにチェックしたいと云うことでしょうか?
それならばTDBEditとは別に、TDateTimePicker を使用しては如何でしょうか。入力時に即チェックしてくれます。このTDateTimePickerの OnChenge イベントハンドラに、レコードの当該フィールドに代入するコードを書けばよろしいかと。

QDelphi BDE 複数ユーザによるデータベース共有ができない

環境は、WindowsXP Delphi3.0 BDE→PARADOXを使用

複数ユーザによるデータベースの共有ができなくて困っています。
エラーメッセージは「テーブルは使用中です。テーブル:\\○○○\○○\○○.DB ユーザー:○○○○○」とでます。

複数というのはPC2台を使用しての共有なのですが、どちらもBDEの設定をそろえております。いろいろなサイトを探し回ったのですが何分初心者なので解決策が見つかりません。
ちなみにデータベースはサーバー上に上げています。
複数でなければエラーもなくきちんと動作します。
お分かりになる方いらっしゃいましたらご教授よろしくお願いいたします。

Aベストアンサー

例えば、TTableでアクセスしていて、TTableのExclusiveプロパティがtrueになっていませんか?

排他的にオープンしているので、早い者勝ちです。後からアクセスした人は、テーブルを開けません。

前の人がテーブルを閉じるまで、他の人はテーブルを開くことができません。

QDelphi データベースコンポーネント使用時におけるIDの自動生成に

Delphi データベースコンポーネント使用時におけるIDの自動生成について
 質問させていただきます。よろしくお願いします。現在DelphiでTQuery,TDatabase,TDataSourceを使用し、データベースに接続、DBGridでレコードを一覧表示し、DBEditとDBNavigatorでレコードの新規登録や編集が行えるようにしています。

 ここでIDというフィールドを作り、これを主キーとして扱っていますが、レコードの新規作成時、自動的に連番で数値が挿入されるようにするにはどうすればいいのでしょうか? 

 ひとつ方法を思い付き実際やってみて今のところうまくいってはいるのですが、私が採択した方法だと少々問題があります。

 exe起動時にレコードをソート、IDのフィールドで一番値の大きい数値を取得し、新規作成時にはその値に+1してDBEditに挿入するようにしています。しかしこれだと、いくらIDの値が小さいレコードを削除しても値の大きいレコードがある限り、新規作成時にIDとして挿入される値は大きくなるばかりなのです。

 稚拙な文章で申し訳ありませんが、お教えいただければと思います。
 よろしくお願いします。

Delphi データベースコンポーネント使用時におけるIDの自動生成について
 質問させていただきます。よろしくお願いします。現在DelphiでTQuery,TDatabase,TDataSourceを使用し、データベースに接続、DBGridでレコードを一覧表示し、DBEditとDBNavigatorでレコードの新規登録や編集が行えるようにしています。

 ここでIDというフィールドを作り、これを主キーとして扱っていますが、レコードの新規作成時、自動的に連番で数値が挿入されるようにするにはどうすればいいのでしょうか? 

 ひとつ方法を思い付...続きを読む

Aベストアンサー

>exe起動時にレコードをソート、IDのフィールドで一番値の大きい数値を取得し、新規作成時にはその値に+1してDBEditに挿入するようにしています。

普通はこの方法ですね。
そのために、IDの桁数を十分大きく設定しておきます。
例えば、毎日1000件くらいの新規登録があったとしても、IDの桁数を8桁にしておけば100年は大丈夫です。

それでも、空き番が多くなって使いづらくなってきたら、IDをリナンバリングすることもあります。


どうしても空き番を作りたくないのであれば、
レコードを削除したときに削除IDリストを作成しておき、新規作成時にはその削除IDを使用するという方法もあります。

QVBAで変数の数/変数名を動的に変化させる

こんにちは。プログラミング初心者です。

VBAで質問です。
以下のようなシートがあるとします。

 A | B | C | D | E | F
1 シート選択 | (プルダウンリストで選択します)
2 果物シート | りんご | みかん | ばなな
3 教科シート | 国語 | 算数 | 理科 | 社会 | 図工 | 体育
4 乗物シート | 車 | 電車 | 船 | 飛行機

そして、以下のようにB1セルのプルダウンで選択されたシート名をA列で検索してヒットした行の文字列を配列に格納します。

selectedSheet = cells(1, 2).Value

for i = 2 To 4
if cells(i , 1).Value = selectedSheet Then
rightRow = Cells(i, Columns.Count).End(xlToLeft).Column
Redim rowArray(rightRow - 1)
for j = 1 To rightRow
rowArray(j - 1) = cells(i, j).Value
Next j
Exit For
End if
next i

次に、配列に格納された文字列をB1のプルダウンで選択されたシートの1行目で、配列の各要素を検索して、それぞれが何列目にあるかを調べます。

sheetName = rowArray(0)
sheetObject = Worksheets(sheetName)
lastColumn = sheetObject.Cells(1, Columns.Count).End(xlToLeft).Column
Set searchRange = sheetObject.Range((cells(1, 1), cells(1, lastColumn))

col_01 = Find(rowArray(1), searchRange)  'りんごを検索してます
col_02 = Find(rowArray(2), searchRange)  'みかんを検索してます
col_03 = Find(rowArray(3), searchRange)  'バナナを検索してます

その後、これで得られた列情報をもとにいろいろと処理をするのですが、上記のように「col_01 = ***」のような書き方ができるのは、あらかじめ「果物シート」がセラばれることが分かっている場合のみです。

「教科シート」が選択された場合は、「col_**」の「**」の部分が「6」まである必要がありますし、「乗物シート」の場合は変数が4つになります。

このように必要となる変数の数が動的に変化する場合に変化する場合、どのように処理したらよいでしょうか。

最初の「for i = 2 To 4」のループとのころで、ヒットしたシート名によって、それぞれ別のSubやFunctionを呼ぶというのは避けたいです。

というのも、VBAをまったく知らないユーザでも上記テーブルの「果物シート」行に「メロン」を足したり、「乗物シート」の「飛行機」を削除することで、処理対象列を自由にカスタマイズできるようにしてあげたいのです。

(あるいは、乗物シートの下に「肩書シート | 社長 | 部長| 係長」のような行を挿入して、処理対象のシートそのものを増やしたり)

どなたか、よい方法をご存知でしたら、教えていただけないでしょうか。
よろしくお願いいたします。

こんにちは。プログラミング初心者です。

VBAで質問です。
以下のようなシートがあるとします。

 A | B | C | D | E | F
1 シート選択 | (プルダウンリストで選択します)
2 果物シート | りんご | みかん | ばなな
3 教科シート | 国語 | 算数 | 理科 | 社会 | 図工 | 体育
4 乗物シート | 車 | 電車 | 船 | 飛行機

そして、以下のようにB1セルのプルダウンで選択されたシート名をA列で検索してヒットした行の文字列を配列に格納します。

selectedSheet = cells(1, 2).Value

for i = 2 To 4
if cells(i...続きを読む

Aベストアンサー

途中から失礼します。
結局、
Sub try()
  Dim s As String
  Dim r As Range
  Dim n As Long
  Dim i As Long
  Dim x, y, z

  With ActiveSheet
    s = .Cells(1, 2).Value
    x = Application.Match(s, .Columns(1), 0)
    n = .Cells(x, .Columns.Count).End(xlToLeft).Column - 1
    If n = 0 Then MsgBox "no data": Exit Sub
    y = Application.Transpose(.Cells(x, 2).Resize(, n))
    y = Application.Transpose(y)
  End With

  With Sheets(s)
    z = Application.Match(y, .Rows(1), 0)
    If n = 1 Then
      If IsNumeric(z) Then
        Set r = .Columns(z)
      End If
    Else
      For i = 1 To UBound(z)
        If IsNumeric(z(i)) Then
          If r Is Nothing Then
            Set r = .Columns(z(i))
          Else
            Set r = Union(r, .Columns(z(i)))
          End If
        End If
      Next
    End If
  End With

  If Not r Is Nothing Then
    r.Copy Worksheets.Add.Range("A1")
    Set r = Nothing
  End If
End Sub

こういう事なんでしょうか。
列位置を変数にとって、必要な列だけを別シートに抜き出すという処理。
行方向のLoopに条件分岐処理がないなら列ごとコピーで良さそうですが。
上記例みたく。

でもそういう処理の場合で、抜き出す項目名が必ず元データにある、
という事が保証されているならAdvancedFilterメソッドが簡単です。

Sub try_2()
  Dim s As String
  Dim n As Long
  Dim x

  With ActiveSheet
    s = .Cells(1, 2).Value
    x = Application.Match(s, .Columns(1), 0)
    n = .Cells(x, .Columns.Count).End(xlToLeft).Column - 1
    If n = 0 Then MsgBox "no data": Exit Sub
    .Cells(x, 2).Resize(, n).Copy Worksheets.Add.Range("A1")
  End With

  Sheets(s).Range("A1").CurrentRegion.AdvancedFilter Action:=xlFilterCopy, _
      CopyToRange:=Range("A1").Resize(, n), Unique:=False
End Sub

もしLoop処理が必要な場合でも、1セルずつ書き出しているから遅いんであって、
一旦、配列に入れて、書き出しはまとめて1回で済ますようにすれば速度的にも改善します。

途中から失礼します。
結局、
Sub try()
  Dim s As String
  Dim r As Range
  Dim n As Long
  Dim i As Long
  Dim x, y, z

  With ActiveSheet
    s = .Cells(1, 2).Value
    x = Application.Match(s, .Columns(1), 0)
    n = .Cells(x, .Columns.Count).End(xlToLeft).Column - 1
    If n = 0 Then MsgBox "no data": Exit Sub
    y = Application.Transpose(.Cells(x, 2).Resize(, n))
    y = Application.Transpose(y)
  End With

  With Sheets(s)
  ...続きを読む

Qdelphi 変数

サブフォームでメインフォームが使用している変数を使いたい時、なんと記述するんでしょうか?

Aベストアンサー

メインフォームにアクセサメソッドを追加しては。


人気Q&Aランキング

おすすめ情報