PDA

Vollständige Version anzeigen : Unterformular Sichtbar nein


arnoldvb
22.03.2004, 09:24
Hallo

Ich habe ein Hauptformular mit zwei UF. Nun habe ich im UF1 ein Kombifeld. Abhängig von der Auswahl werden im UF2 ein oder zwei Datensätze angelegt. Das klappt auch soweit. Jetzt hätte ich gerne, das das UF2 nicht sichtbar ist.
Dann funktioniert die Anlage der Datensätze jedoch nicht mehr. Ich bekomme den Laufzeitfehler 2110 und die Meldung das ich den Fokus nicht auf UF2 setzen kann. Wie kann ich das Problem lösem?

Arne Dieckmann
22.03.2004, 09:33
Du könntest auf das 2. UFo ganz verzichten (wenn es sowieso immer unsichtbar bleiben soll) und die Datensätze per VBA und

CurrentDb.Execute ...

anfügen.

arnoldvb
22.03.2004, 09:52
Hallo Arne

Danke für deine Antwort. Könntest du mir das anfügen per VBA etwas näher erläutern. Ich habe soetwas bisher noch nicht gemacht. Die Tabelle in die der Wert eingefügt werden soll heißt T_PRODUKTIONSSCHRITT verküpft ist es mit dem UF1 über AuftragID. Das Feld das befüllt werden soll heißt Produktionsschritt.
Ich habe in der OH unter CurrentDb.Execute nachgeschaut und bin nicht ganz schlau daraus geworden. Die Suche hier im Forum ergaben zu viele Treffer, die mit meinem Problem nichts zu tun haben.

Arne Dieckmann
22.03.2004, 09:58
Ich mache es immer so: Ich lege eine Anfügeabfrage an, in der ich feste Werte in die Zieltabelle eintrage. Dann kopiere ich die SQL-Ansicht der Abfrage in mein Modul und ersetze die festen Werte im SQL-String durch die Variablen/Feldwerte im Formular.
Anschliessend gebe ich testweise den SQL-String mit

Debug.Print sqlString 'gibt den sqlString im Direktfenster aus

aus und versuche ihn danach auch mit

CurrentDb.Execute(sqlString), dbFailOnerror

auszuführen.Wenn es zu einem Fehler oder unerwünschten Ergebnissen kommt, kopiere ich den SQL-String aus dem Direktfenster des VBA-Editors (im Modulentwurf mit STRG+G einblenden) in die SQL-Ansicht einer neuen Abfrage, wechsel zur Entwurfsansicht und schaue nach, was falsch läuft.

arnoldvb
22.03.2004, 10:02
Hallo Arne

Danke. Werde das mal ausprobieren. Melde mich, wenn ich dabei Probleme habe.

arnoldvb
22.03.2004, 11:19
Hallo

Ich habe folgendes Modul erstellt
<div><link href="http://www.ms-office-forum.net/forum/externals/codeconv.css" rel="stylesheet"><pre><span [CODE]<div><link href="http://www.ms-office-forum.net/forum/externals/codeconv.css" rel="stylesheet"><pre><span class="TOKEN">Public Function</span> Tabelle() <span class="TOKEN">As</span> <span class="TOKEN">String</span>
&nbsp;
<span class="TOKEN">Dim</span> sqlString <span class="TOKEN">As</span> <span class="TOKEN">String</span>
sqlString = &quot;INSERT INTO T_PRODUKTIONSSCHRITT ( Produktionsschritt, AuftragID )&quot; &amp; _
&quot;SELECT T_PRODUKTIONSSCHRITT.Produktionsschritt, T_PRODUKTIONSSCHRITT.AuftragID&quot; &amp; _
&quot;FROM T_PRODUKTIONSSCHRITT&quot; &amp; _
&quot;WHERE (((T_PRODUKTIONSSCHRITT.Produktionsschritt) = Produktion) <span class="TOKEN">And</span> ((T_PRODUKTIONSSCHRITT.AuftragID) = AuftragID))&quot;
&nbsp;
<span class="TOKEN">Debug.Print</span> sqlString
CurrentDb.Execute (sqlString), dbFailOnError
&nbsp;
<span class="TOKEN">End</span> <span class="TOKEN">Function</span><hr></pre></div>
Code eingefügt mit dem MOF Code Converter (http://www.ms-office-forum.net/forum/codeconverter.php)>

Debug.Print sqlString ergibt folgendes
<div><link href="http://www.ms-office-forum.net/forum/externals/codeconv.css" rel="stylesheet"><pre>INSERT INTO T_PRODUKTIONSSCHRITT ( Produktionsschritt, AuftragID )SELECT T_PRODUKTIONSSCHRITT.Produktionsschritt, T_PRODUKTIONSSCHRITT.AuftragIDFROM T_PRODUKTIONSSCHRITTWHERE (((T_PRODUKTIONSSCHRITT.Produktionsschritt) = Serie) <span class="TOKEN">And</span> ((T_PRODUKTIONSSCHRITT.AuftragID) = AuftragID))</pre></div>

Als Fehlermeldung bekomme ich:
Laufzeitfehler 3075
Syntaxfehler (fehlender Operator) im Abfrageausdruck

Sorry für die schlechte Darstellung

Arne Dieckmann
22.03.2004, 11:25
Achte zunächst einmal auf die fehlenden (!) Leerzeichen:

hier:
, AuftragID )SELECT T_PRODUKTIONSSCHRITT

und hier:

_PRODUKTIONSSCHRITTWHERE (((T

<STRIKE>Die Funktion wäre natürlich auch noch interessant ... - bist Du Dir sicher, dass Du dort alle erforderlichen Variablen bereits richtig einsetzt?</STRIKE>


Ausserdem müssen die Datentypen berücksichtigt werden:

Produktionsschritt) = Serie) And

Wenn Produktionsschritt ein Textfeld (s. Tabellenentwurf) ist, muss Serie in Hochkommata übergeben werden.


Edit: Was soll in Deiner Funktion flexibel sein (ich vermute einmal, es sind die Kriterien)?[/Edit]

Arne Dieckmann
22.03.2004, 11:33
Ein erster Versuch:

Public Function Tabelle(Prod, Auftr) As String

Dim sqlString As String
sqlString = "INSERT INTO T_PRODUKTIONSSCHRITT ( Produktionsschritt, AuftragID ) " & _
"SELECT T_PRODUKTIONSSCHRITT.Produktionsschritt, T_PRODUKTIONSSCHRITT.AuftragID " & _
"FROM T_PRODUKTIONSSCHRITT " & _
"WHERE (((T_PRODUKTIONSSCHRITT.Produktionsschritt) = '" & Prod & "') And ((T_PRODUKTIONSSCHRITT.AuftragID) = " & Auftr &"))"

Debug.Print sqlString
CurrentDb.Execute (sqlString), dbFailOnError

End Function

arnoldvb
22.03.2004, 12:20
Hallo Arne

Ich beschreibe mal, eas genau gemacht werden soll. Im UF1 gibt es das Feld Produktion. Es ist ein Textfeld hat als Herkunft eine Werteliste. Darin gibt es zwei Auswahlmöglichkeiten

- nur Muster
- Serie und Muster

Wählt man Muster soll in der Tabelle der T_Produktionsschritt der Datensatz Muster mit der AuftagsID aus dem UF1 angelegt werden.

Wählt man Serie und Muster sollen die Datensätze
- Muster mit der AuftragsID und
- Serie mit AuftragsID angelegt werden

Diese Aktionen soll nach Aktualisierung im Feld Produktion durchgeführt werden.
Muster oder eben Muster und Serie sollen im Feld Produktionsschritt in der Tabelle T_Produktionsschritt angelegt werden

Ich hoffe das war soweit verständlich.

Setze ich deinen Code ein erhalte ich die Fehlermeldung 3075. überzählig in
(((T_PRODUKTIONSSCHRITT.Produktionsschritt) = '" & Prod & "') And ((T_PRODUKTIONSSCHRITT.AuftragID) = " & Auftr & "))

ersetze ich Prod und Auftr durch Produktion und AuftragID erhalte ich die gleiche Fehlermeldung

Arne Dieckmann
22.03.2004, 12:44
Wie rufst Du denn nun die Funktion auf? Übergibst Du die erforderlichen Parameter "Prod" und "Auftr" (müsste die AuftragsID aus dem UFo sein)? Könnntest Du evtl. Deine Datenbank (auf die erforderlichen Teile abgemagert) hier hochladen?

arnoldvb
22.03.2004, 13:08
Hallo Arne

Anbei die DB. Danke für deine Mühe

Arne Dieckmann
22.03.2004, 13:25
Keine Ahnung, ob ich es jetzt richtig verstanden habe, aber evtl. brauchst Du eher so etwas. Im Formular muss der Code so aussehen:

Private Sub Produktion_AfterUpdate()

Select Case Me!Produktion
Case Is = "nur Muster"
Call Tabelle("Muster", Me!AuftragID)
Case Is = "Serie und Muster"
Call Tabelle("Serie", Me!AuftragID)
Call Tabelle("Muster", Me!AuftragID)
End Select

End Sub

Die Funktion "Tabelle" dann evtl. eher so (das Prinzip wird wohl so klar):

Public Function Tabelle(Produktion, AuftragID) As String

Dim sqlstring As String

'So kann es meiner Meinung nach nicht funktionieren
'(Code wurde aber trotzdem etwas angepasst, um das Prinzip
'zu verdeutlichen):
'sqlstring = "INSERT INTO T_PRODUKTIONSSCHRITT ( Produktionsschritt, AuftragID ) " & _
"SELECT T_PRODUKTIONSSCHRITT.Produktionsschritt, T_PRODUKTIONSSCHRITT.AuftragID " & _
"FROM T_PRODUKTIONSSCHRITT " & _
"WHERE T_PRODUKTIONSSCHRITT.Produktionsschritt = '" & Produktion & "' And T_PRODUKTIONSSCHRITT.AuftragID =" & AuftragID & ";"


'Ich denke, dass Du eher so etwas brauchst:
sqlstring = "INSERT INTO T_PRODUKTIONSSCHRITT ( AuftragID, Produktionsschritt ) " & _
"SELECT " & AuftragID & ",'" & Produktion & "';"

Debug.Print sqlstring
CurrentDb.Execute (sqlstring), dbFailOnError

End Function

arnoldvb
22.03.2004, 14:03
Hallo Arne

Ich mußte nur noch den aktuellen Datensatz speichern, damit die Verknüpfung zu T_Fertigung erstellt wird und schon funktioniert es, wie ich es mir vorstelle. Vielen Dank.

Ein Problem habe ich aber noch. Bei meiner ursprünglichen Lösung wird bei einer Änderung der Auswahl in Produktion die zuvor erzeugten Einträge gelöscht. Wie setze ich das jetzt um. Dort habe ich mit Sendkeys gearbeitet, so das ich denke diesen Ansatz jetzt nicht mehr verwenden zu können.

Arne Dieckmann
22.03.2004, 14:17
Dann rufe in der Funktion "Tabelle" vor dem Anlegen der neuen Datensätze eine entsprechende Löschabfrage auf, deren SQL-String Du ebenfalls per VBA bastelst.

Z.B.:

Public Function Tabelle(Produktion, AuftragID, MitLoeschen as Boolean) As String

Dim sqlstring As String

If MitLoeschen Then
sqlstring="DELETE * FROM T_PRODUKTIONSSCHRITT WHERE AuftragID=" & AuftragID
CurrentDb.Execute (sqlString)
End if

'hier der Rest der Funktion

Der Aufruf der Funktion muss natürlich um den 3. Parameter erweitert werden:

Private Sub Produktion_AfterUpdate()

Select Case Me!Produktion
Case Is = "nur Muster"
Call Tabelle("Muster", Me!AuftragID)
Case Is = "Serie und Muster"
'alte Datensätze löschen und dann den neuen anfügen
Call Tabelle("Serie", Me!AuftragID,True)
'eben angelegten/neuen DS natürlich nicht löschen
Call Tabelle("Muster", Me!AuftragID,False)
End Select

End Sub

arnoldvb
22.03.2004, 14:35
Hallo Arne

Super!!! Funktioniert einwandfrei. Vielen Dank :D