3 Stimmen

INSERT INTO inkrementelles Kontrollfeld

Ich verwende eine MS-ACCESS-Datenbank. Aus dem Projekt verwende ich und einige andere Fragen die Tabelle NOEUDS und INFRA (die aktualisiert werden sollte):

Tabelle 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

TABELLE NOEUDS:

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

Ich möchte eine Abfrage erstellen, die auf NOEUDS die Knoten C* überprüft, die in der INFRA-Tabelle fehlen, wenn nicht, sollte ein neuer eingefügt werden. Das Problem ist das Feld RECNO, das als Kontrolle fungiert und nicht dupliziert werden kann (kein Primärschlüssel, da die gesamte DB nur ein Repository für das Programm ist, das sie steuert). Alle Felder sind Text und RECNO ist eine fortlaufende Zählung mit HEX-Zahlen, wie gezeigt.

Ich habe die Abfrage zur Auswahl verwendet:

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)));

Das Ergebnis war:

9   C021   F    
9   C022   F    
9   C023   F

SOLLTE SEIN:

9   C021   F    
A   C022   F    
B   C023   F

Ich brauche Hilfe, damit ich die richtige RECNO in hexadezimaler Zählweise einfügen kann, nachdem 00000019 zu 0000001A übergeht und so weiter.

vielen Dank im Voraus

UPDATE 1:

Das von uns verwendete Programm verwendet eine Access-Datenbank als Speicher. Wenn ich mit dem Programm einen Ort hinzufüge, muss ich weitere Informationen über die Menüs eingeben, die für die Karten und die Bauinformationen benötigt werden. Das Problem ist, dass viele Informationen redundant sind und das Programm sie nicht automatisch verarbeiten kann. Ich versuche, die möglichen Informationen mit Hilfe von Abfragen einzugeben.

Jedes Mal, wenn ich ein Noeud in die Noeuds-Tabelle einfüge, muss ich eine Zeile in die INFRA-Tabelle einfügen, die nur die RECNO (fortlaufende Zählung ab der letzten), das NOEUD und einige andere Informationen enthält (um das Autocad-Tabellen-Tag zu vervollständigen). Da ich Hunderte von Cxxx-, Bxxx-, Pxxx- und Gxxx-Anlagen habe, kann ich für jedes Projekt einige Stunden langweiliger Arbeit aufwenden.

Ich benötige Hilfe bei der Zählung einer sequentiellen Methode zum Hinzufügen von RECNO für jedes NOEUD, das in der Tabelle NOEUDS gefunden und in die Tabelle INFRA eingefügt wird.

UPDATE 2:

Ich füge jedes Nudelholz von Hand ein. Ist es möglich, in einer Weise zu verbinden, dass es die Liste von den noeuds, die ich einfügen möchten und insead von tun 1 durch 1 nimmt es die Liste und tut in einer Reihenfolge?

die 2 Abfragen sind folgende:

Ausrüstungen, die ich am Tisch INFRA hinzufügen möchte:

SELECT NOEUDS.NOEUD FROM NOEUDS WHERE (((NOEUDS.NOEUD) Like "C*" und (NOEUDS.NOEUD) nicht in (SELECT NOEUD FROM INFRA)));

Einsetzen von Hand:

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=[CHAMBRE? EINFÜGEN]);

1voto

HansUp Punkte 93765

Auch wenn ich Ihre Frage nicht sehr gut verstehe, hoffe ich, dass Sie mit dieser Antwort etwas anfangen können.

Meine INFRA Tabelle hat eine Textspalte namens RECNO . Die Tabelle enthält eine Zeile.

RECNO
00000019

Diese Abfrage gibt mir "1A" als N .

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

Auffüllen N mit Nullen zu einer Breite von 8, kann ich diese Abfrage verwenden, die mir "0000001A" als N .

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

Was den Rest Ihrer Frage betrifft, so würde ich instinktiv einen Datensatz öffnen, der die nicht übereinstimmenden NOEUDS.NOEUD Werte, gehen dann durch die Datensatzzeilen und fügen jede NOEUD Wert, Ihre benutzerdefinierte RECNO Sequenznummer und die "sonstigen Informationen" in die INFRA Tisch.

1voto

HansUp Punkte 93765

Ich denke, eine VBA-Lösung sollte besser sein als der Versuch, das Gewünschte nur mit SQL zu erreichen. Wenn Sie nicht viel VBA-Erfahrung haben, könnte es trotzdem machbar sein, da das erforderliche VBA relativ einfach sein sollte. Schauen Sie, ob diese Code-Skizze für den Anfang ausreicht.

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

Anmerkungen:

  1. Ich habe eine gespeicherte Abfrage verwendet, die auf meiner besten Vermutung basiert, was Sie wollen. Siehe die SQL unten.
  2. DAO.Database erfordert einen Verweis auf die Microsoft DAO Object Library. Wenn Ihre Access-Version 2000 oder vielleicht Access XP ist, müssen Sie diesen Verweis einstellen (im VBE-Hauptmenü, Werkzeuge->Verweise).
  3. Ich habe beschlossen, dass die Zieltabelle Felder enthalten soll, die dem Namen und dem Datentyp der Felder im Quelldatensatz entsprechen. Wenn das für Sie nicht funktioniert, ersetzen Sie jedes der gemeinsamen Felder durch etwas wie dieses: rsTo!YourFieldNameHere.Value = rsTo!YourFieldNameHere.Value (Und fallen lassen .Value wenn Sie es vorziehen).
  4. Erstellen einer Next_InfraRecno() Funktion, um die nächste RECNO Wert. Übertragen Sie den Ansatz, den wir zuvor verwendet haben, in eine Funktion. Stellen Sie eine neue Frage, wenn Sie auf Probleme stoßen ... zeigen Sie uns Ihren Code, die Fehlermeldung und die Zeile, die den Fehler auslöst (falls vorhanden), und alles andere, was wir wissen müssen :-)
  5. Ich habe den Eindruck, Sie wollen SECURISE = "F" für jede der eingefügten Zeilen.

In einem Kommentar erwähnten Sie " Verwenden Sie das Feld ANCIEN für die Speicherung der Zählung ". Ich weiß nicht, was dafür nötig ist und hoffe, dass Sie es in diesen Codeentwurf integrieren können, was auch immer es ist. Wenn nicht, tut es mir leid :-(

Hier ist die SQL für meine qryUnmatchedNoeuds Abfrage:

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));

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X