3

MS-ACCESSデータベースを使用しています。私が使用し、他のいくつかの質問をしたプロジェクトから、テーブルNOEUDSとINFRA(更新する必要があります):

テーブルINFRA:

RECNO   -   NOEUD   -   SECURISE    
00000008    C002         F    
00000005    C009         F    
00000001    C035         F    
00000002    C001         F    
00000003    C036         F    
00000006    C012         F    
00000007    C013         F

テーブルノード:

NOEUD   TYPE_MAT  N_AMONT       
C021     COF       100          
C022     COF       229          
C023     COF       130          
C002     COF       111

INFRAテーブル内に欠落しているノードC*をNOEUDSでチェックするクエリを作成したいのですが、そうでない場合は、新しいノードを挿入する必要があります。問題は、コントロールとして機能し、複製できないRECNOフィールドです(すべてのDBは、それを制御するプログラムのリポジトリにすぎないため、主キーではありません)。すべてのフィールドはテキストであるため、RECNOは、示されているようにHEX番号を使用した連続カウントです。

クエリを使用して以下を選択しました:

SELECT (SELECT MAX(CINT(INFRA.RECNO))+1 AS N FROM INFRA), 
       NOEUDS.NOEUD, "F" AS Expr2
FROM NOEUDS
WHERE (((NOEUDS.NOEUD) Like "C*" 
       And (NOEUDS.NOEUD) Not In (SELECT NOEUD FROM INFRA)));

結果は次のとおりです。

9   C021   F    
9   C022   F    
9   C023   F

すべきこと:

9   C021   F    
A   C022   F    
B   C023   F

00000019が0000001Aに渡された後、16進数で正しいRECNOを挿入できるように、これについては助けが必要です。

前もって感謝します

更新1:

私たちが使用するプログラムは、Accessデータベースをストレージとして使用します。プログラムを使用してnoeudを追加するときは、マップに必要なメニューを使用して、構築された情報として、さらにいくつかの情報を挿入する必要があります。問題は、多くの情報が冗長であり、プログラムがそれを自動的に処理できないことです。私は粕を動かし、クエリを使用して可能な情報を挿入しようとしています。

noeudsテーブルにnoeudを挿入するたびに、RECNO(最後のテーブルからの順次カウント)、NOEUD、およびその他の情報(autocadテーブルタグを完成させるため)のみを含む行をINFRAテーブルに挿入する必要があります。私は何百ものCxxx、Bxxx、Pxxx、Gxxxの機器を持っているので、プロジェクトごとに数時間の退屈な作業をします。

INFRAテーブルに挿入されるNOEUDSテーブルで見つかったNOEUDごとにRECNOを追加するシーケンシャルな方法を数えるのに助けが必要です。

更新2:

それぞれのヌードを手で挿入しています。挿入したいnoeudsからリストを取得し、1つずつ実行する方法で参加することは可能ですか?リストを取得して順番に実行しますか?

2つのクエリは次のとおりです。

テーブルINFRAに追加したい機器:

SELECT NOEUDS.NOEUD FROM NOEUDS WHERE(((NOEUDS.NOEUD)Like "C *" And(NOEUDS.NOEUD)Not In(SELECT NOEUD FROM INFRA)));

手による挿入:

INSERT INTO INFRA(recno、NOEUD、SECURISE)SELECT(SELECT Right(String(8、 "0")&Hex(Max(Val( "&H"&RECNO))+ 1)、8)AS N FROM INFRA)、NOEUDS .NOEUD、 "F" AS Expr2 FROM NOEUDS WHERE(NOEUDS.NOEUD = [INSERT CHAMBRE?]);

4

2 に答える 2

1

SQL だけでやりたいことをやろうとするよりも、VBA ソリューションの方が優れていると思います。必要な VBA はかなり基本的なものである必要があるため、VBA の経験があまりない場合でも達成できる可能性があります。このコード アウトラインで作業を開始するのに十分かどうかを確認してください。

Public Sub AddToInfra()
    Const cstrQuery As String = "qryUnmatchedNoeuds" ' Note 1 '
    Dim db As DAO.Database ' Note 2 '
    Dim fld As DAO.Field
    Dim rsFrom As DAO.Recordset
    Dim rsTo As DAO.Recordset

    Set db = CurrentDb
    Set rsFrom = db.OpenRecordset(cstrQuery, dbOpenSnapshot)
    Set rsTo = db.OpenRecordset("infra", dbOpenTable, dbAppendOnly)

    Do While Not rsFrom.EOF
        rsTo.AddNew
        For Each fld In rsFrom.Fields ' Note 3 '
            If Not fld.Name = "RECNO" Then
                rsTo.Fields(fld.Name).Value = fld.Value
            End If
        Next fld
        rsTo!RECNO = Next_InfraRecno ' Note 4 '
        rsTo!SECURISE = "F" ' Note 5 '
        rsTo.Update
        rsFrom.MoveNext
    Loop

    rsTo.Close
    rsFrom.Close
    Set fld = Nothing
    Set rsFrom = Nothing
    Set rsTo = Nothing
    Set db = Nothing
End Sub

ノート:

  1. あなたが何を望んでいるかについての私の最善の推測に基づいて、保存されたクエリを使用しました。以下の SQL を参照してください。
  2. DAO.DatabaseMicrosoft DAO Object Library への参照が必要です。Access のバージョンが 2000 または Access XP の場合は、その参照を設定する必要がある場合があります (VBE メイン メニューの [ツール] -> [参照] から)。
  3. ソース レコードセットのフィールドの名前とデータ型に一致するフィールドを宛先テーブルに含めることにしました。それがうまくいかない場合は、各共通フィールドを次のように置き換えてください: (必要に応じてrsTo!YourFieldNameHere.Value = rsTo!YourFieldNameHere.Value削除してください)。.Value
  4. Next_InfraRecno()次の値を返す関数を作成しRECNOます。以前に使用したアプローチを関数に変換します。問題が発生した場合は、新しい質問を投稿してください。コード、エラー メッセージ、エラーをトリガーする行 (存在する場合)、その他必要な情報をお知らせください。:-)
  5. SECURISE = "F"挿入された行のそれぞれについて、あなたが望む印象を得ました。

コメントで、 「カウントの保存にフィールド ANCIEN を使用する」と述べました。何が関係しているのかはわかりませんが、それが何であれ、このコード アウトラインに統合できることを願っています。そうでない場合は、申し訳ありません。:-(

私のqryUnmatchedNoeudsクエリのSQLは次のとおりです。

SELECT n.DELETED, n.NOEUD
FROM
    noeuds AS n
    LEFT JOIN infra AS i
    ON n.NOEUD = i.NOEUD
WHERE
        (((n.NOEUD) Like "c*")
    AND ((i.NOEUD) Is Null));
于 2012-06-30T00:26:06.637 に答える
1

私はあなたの質問をよく理解していませんが、この回答が何かに役立つことを願っています。

INFRAテーブルに という名前のテキスト列がありますRECNO。テーブルには 1 行が含まれます。

RECNO
00000019

このクエリでは、「1A」が返されNます。

SELECT Hex(Max(Val("&H" & RECNO)) + 1) AS N
FROM INFRA;

幅 8 までゼロを埋め込むには、このクエリを使用して " 0000001A N" をN.

SELECT Right(String(8, "0") & Hex(Max(Val("&H" & RECNO)) + 1), 8) AS N
FROM INFRA;

あなたの質問の残りの部分に関して、私の本能は、一致しない値を含むレコードセットを開き、レコードNOEUDS.NOEUDセットの行を移動して、各NOEUD値、カスタムRECNOシーケンス番号、および「その他の情報」をINFRAテーブルに挿入することです。

于 2012-06-26T13:30:30.997 に答える