2016-10-19 2 views
0

Ich habe versucht, dies zu suchen, ich verspreche, aber es ist eine schwierige Frage zu suchen ..."Eins" in einer Eins-zu-viele-DB-Beziehung nur dann genehmigen, wenn ALLE "Viele" genehmigt sind

Ich habe eine Datenbank mit zwei Tabellen, die in einer Eins-zu-viele-Beziehung verknüpft sind, wobei jede "Eins" ein Rechnungsheader ist, der mit "vielen" Rechnungszeilen verknüpft ist.

Ich entwerfe ein Tool, das jede Rechnungszeile mit einer Bestellung abgleicht, und ich möchte einen Rechnungsheader nur dann als "übereinstimmend" kennzeichnen, wenn alle Zeilen übereinstimmen.

Kann jemand diese Updateabfrage schreiben?

+2

Können Sie uns einige Beispieldaten geben? – JohnHC

+0

Sie sagen, Sie müssen sehen, ob es nicht übereinstimmende Rechnungszeilen gibt? Scheint so, als wäre es einfach – Phil

+0

Ich muss in der Lage sein, nicht nur zu sehen, dass es unübertroffene Zeilen gibt, die ich in der Lage sein muss, den Rechnungsdatensatz auf "abgestimmt" nur dann zu aktualisieren, wenn alle Rechnungszeilen als "übereinstimmend" markiert sind. – Pip

Antwort

0

Der relationale Operator, den Sie suchen, ist formal als division bekannt und umgangssprachlich als "die Lieferanten, die alle Teile liefern". Aus verschiedenen Gründen ist ein division-Operator in keinem der mir bekannten SQL-Produkte Access enthalten. Stattdessen müssen Sie andere Operatoren in Kombination verwenden, um dasselbe zu tun. Siehe Divided we stand: the SQL of relational division by Joe Celko.

0

Ein für Benutzer von Access 2010 und höher verfügbarer Ansatz besteht darin, ereignisgesteuerte Datenmakros in der untergeordneten Tabelle zu verwenden, um das Statusflag in der übergeordneten Tabelle zu verwalten. Zum Beispiel mit einer übergeordneten Tabelle

[InvHeader] 

InvID AllMatched 
----- ---------- 
    1   No 

und ein Kind Tisch

[InvItem] 

ItemID InvID Matched 
------ ----- ------- 
    1  1  Yes 
    2  1  No 

folgende Nach einem Update Daten Makro wird automatisch die entsprechende Zeile aktualisieren in [InvHeader], nachdem ein Kind Zeile geändert wurde in [ InvItem]

AfterUpdate.png

Code:

<?xml version="1.0" encoding="UTF-16" standalone="no"?> 
<DataMacros xmlns="http://schemas.microsoft.com/office/accessservices/2009/11/application"> 
    <DataMacro Event="AfterUpdate"> 
     <Statements> 
      <Action Collapsed="true" Name="SetLocalVar"> 
       <Argument Name="Name">newAllMatched</Argument> 
       <Argument Name="Value">True</Argument> 
      </Action> 
      <ForEachRecord> 
       <Data Alias="i"> 
        <Reference>InvItem</Reference> 
        <WhereCondition>[i].[InvID]=[InvItem].[InvID]</WhereCondition> 
       </Data> 
       <Statements> 
        <ConditionalBlock> 
         <If> 
          <Condition>Not [i].[Matched]</Condition> 
          <Statements> 
           <Action Collapsed="true" Name="SetLocalVar"> 
            <Argument Name="Name">newAllMatched</Argument> 
            <Argument Name="Value">False</Argument> 
           </Action> 
           <Action Name="ExitForEachRecord"/> 
          </Statements> 
         </If> 
        </ConditionalBlock> 
       </Statements> 
      </ForEachRecord> 
      <LookUpRecord> 
       <Data Alias="hdr"> 
        <Reference>InvHeader</Reference> 
        <WhereCondition>[hdr].[InvID]=[InvItem].[InvID]</WhereCondition> 
       </Data> 
       <Statements> 
        <ConditionalBlock> 
         <If> 
          <Condition>[hdr].[AllMatched]&lt;&gt;[newAllMatched]</Condition> 
          <Statements> 
           <EditRecord> 
            <Data Alias="hdr"/> 
            <Statements> 
             <Action Collapsed="true" Name="SetField"> 
              <Argument Name="Field">AllMatched</Argument> 
              <Argument Name="Value">[newAllMatched]</Argument> 
             </Action> 
            </Statements> 
           </EditRecord> 
          </Statements> 
         </If> 
        </ConditionalBlock> 
       </Statements> 
      </LookUpRecord> 
     </Statements> 
    </DataMacro> 
</DataMacros> 

Beachten Sie, dass dies nur ein Beispiel für Aktualisierungen ist. Der Vollständigkeit halber würde man normalerweise den obigen Code in ein benanntes Datenmakro einfügen und ihn von After Insert, After Update und After Delete aufrufen.

Verwandte Themen