Container mit Script auslesen bzw. durchsuchen

Hallo,

möchte einen Verweiscontainer in meiner Ansicht Kontakte nach bestimmten Einträgen durchsuchen, um die Datensätze zu filtern, die bereits diesen Eintrag haben oder nicht.

Dabei habe ich derzeit keine Ahnung wie ich überhaupt an den Container ran komme bzw. Auslese und vergleiche.

Kann mir da bitte jemand helfen. Vielleicht gibts auch einen Link auf einen Beitrag der schon vorhanden ist und den ich noch nicht gefunden habe.

Vielen vielen Dank!

Viele Grüße

Robert

Hallo zusammen,

als Ergänzung zu dieser meiner Anfrage. So weit bin ich bis jetzt:

Dim oProject, oActiveView, oCurrentRecordSet, bFilter
Set oProject = cRM.CurrentProject
Set oActiveView = oProject.ActiveViews.ActiveView

Dim oCurrentInputForm, oContainers, oContainer, oRecord
Set oCurrentInputForm = oActiveView.CurrentInputForm(2)
Set oContainers = oCurrentInputForm.Containers
Set oContainer = oContainers.ItemByName(„ID.Objektnachweis.ObjektID#{49FE0E18-D2E5-4F80-8BD5-E9107D0BD8A1}“)

Set oRecord = oContainer.Record

bFilter = oRecord.SetFilter(„ObjektID = 0x55f56157f0724ba4b2ea3854d2790297“)

Bei „Set oRecord = oContainer.Record“ bekomme ich immer einen Laufzeitfehler: Objekt erforderlich. Eigentlich müsste dies nach der Objekthierarchie im Handbuch aber richtig sein.
Habs auch schon mit oContainer.CurrentRecord versucht. Gleiches Ergebnis.

Es steht auch im Handbuch auf Seite 41 ein Beispiel, was auch hier im Forum schon mal behandelt wurde. Jedoch leider auch nicht funktioniert.

Was mache ich falsch bzw. wie müsste es anders geschrieben werden, dass es geht?

Vielen Dank und viele Grüße

Robert

Hi Robert,

hier gehen ein paar Sachen wild durcheinander:

Auf ein Record Objekt kannst du keinen Filter anwenden, denn ein Record ist EIN Datensatz. Filter können nur auf RecordSet Objekte (also eine Sammlung aus Datensätzen) angewendet werden. Daher steht die SetFilter Methode in der SDK Referenz auch bei RecordSET und nicht bei Record.

Der Name, den du bei oContainers.ItemByName übergibst, muss zu deinem Container-Objekt in deiner Eingabemaske genau passen, d.h. die GUID, die hinter dem ‚#‘ steht, muss genau die sein, die im Eingabemasken-Designer für den betreffenden Container auch angezeigt wird. Sonst bekommst du „Nothing“ zurück (= „nicht gefunden“) und alle Methoden/-Eigenschaften, die du danach auf das Objekt anwendest liefern „Objekt erforderlich“ (weil du eben keines bekommen hast, weil er es nicht finden konnte). Wichtig ist auch zu wissen, dass der Container in dem Augenblick, wo du das Script ausführst, in der Eingabemaske auch gerade angezeigt werden muss (sonst liefert die Methode ebenfalls „Nothing“).

Kann es sein, dass du Container und Relation miteinander vermischt? Willst du wirklich die VISUELLE „Liste“ der aktuell angezeigten 1:N Datensätze (=„Container“,) durchsuchen? Oder willst du alle 1:N verknüpften Objektnachweis-Datensätze durchsuchen (egal ob grad in der Maske ein Container angezeigt wird, oder nicht).

Um hier auf die richtige Fährte zu kommen, die Frage: Was willst du mit den potentiellen Treffern denn dann konkret machen?

Gruß

Alex

PS: Alles in allem denke ich, dass eine Scripting Schulung bei/von combit am zielführendsten sein dürfte. Das spart eine Menge deiner (Lebens)zeit! :slight_smile: Die Zeit, die du danach sparst, sollte diese Investition locker wett machen.

Hallo Alex,

danke für Deine ausführliche Stellungnahme. Grundsätzlich geht es darum, die Kontakte/Adressen aus dem Datenbestand heraus zu filtern, die ein bestimmtes Angebot noch nicht bekommen haben.

Es sind drei Ansichten davon betroffen: Kontakte 1:N Objektnachweis (N:1) Objekte. In der Sicht Kontakte befindet sich ein Container (allerdings nicht immer sichtbar, weil auf einer Registerkarte), der die einzelnen Datensätze zu Objektnachweis beinhaltet und darüber die Verknüpfung zum jeweiligen Objekt herstellt.

Bei meiner bisherigen Lösung läuft es nun so ab, dass ich mittels Button auf der Sicht Objekte die ID in das Clipbord übernehme, ein Script aufrufe welche auf die Seite Kontakte wechselt und welches dann über SetFilterByName einen Filter aufruft, der seinerseits über AskString$ die manuelle Eingabe der ObjektID anfordert, aus der Sicht Kontakte über den Container Objektnachweis diese durchsucht und alle entsprechenden AdressDatensätze in der Sicht Kontakte anzeigt.

Soweit so gut, aber etwas umständlich und auch Fehlerbehaftet. Fehlerbehaftet deswegen, weil die Filterung nach „Objektnachweis“.„ObjektID“ <> 0xübergebeneID alle Datensätze filtert, die eben ungleich der ID sind. Dabei werden aber auch Datensätze mit ausgegeben, die einen zweiten Eintrag im Container enthalten, der ja dann ungleich der ID ist, wo aber auch die auszuschließende ID auch schon drin ist.

Daher trifft Dein Satz „Oder willst du alle 1:N verknüpften Objektnachweis-Datensätze durchsuchen (egal ob grad in der Maske ein Container angezeigt wird, oder nicht).“ am besten zu. Mein Ansatz war der frühere Container des „am“, der ja ein Bemerkungsfeld war und aus dem man den String durchsuchen konnte nach einem bestimmten Eintrag (ID oder Nr) .

Wie könnte ich das nun am besten lösen?

Vielen, vielen Dank und viele Grüße

Robert

Ja, eine Scripting Schulung wäre schon zu überlegen.

Hallo Alex,
hallo zusammen,

über die freie SQL Abfrage funktioniert mein Filter jetzt einwandfrei und bringt das gewünschte Ergebnis.

Wenn ich die Abfrage aber über Script starte, kommt eine Fehlermeldung: Falsche Syntax.

Meine Abfrage:

Dim sSQLAbfrage
sSQLAbfrage = „Contacts“.„ID“ FROM „Contacts“ WHERE (upper(„Contacts“.„IKStatus“) = upper(N’Aktuell’) OR upper(„Contacts“.„IKStatus“) = upper(N’Sucht Objekt’)) AND SUBSTRING(„Contacts“.„IKSuchKrit“, 17, 1) = ‚1‘ AND NOT EXISTS(SELECT „Objektnachweis“.„ID“ FROM „Objektnachweis“ WHERE „Objektnachweis“.„ObjektID“ = 0x55f56157f0724ba4b2ea3854d2790297 AND „Objektnachweis“.„KontaktID“ = „Contacts“.„ID“)

SQLShell.ExecuteCommandRaw(sSQLAbfrage)

Was ist das falsch ?

Vielen Dank und viele Grüße

Robert

Hi Robert,

in VBScript werden Zeichenketten immer in doppelte Anführungszeichen eingeschlossen. D.h. in deiner Abfrage fehlen noch doppelte Anführungszeichen „komplett drum herum“.

Das Gemeine in deinem Fall ist jedoch, dass der Inhalt der Zeichenkette selbst auch wiederum doppelte Anführungszeichen benutzt (erforderlich für die korrekte T-SQL Syntax). Das bedeuted, die „inneren“ doppelten Anführungszeichen müssen „maskiert“ werden, damit sie die „äußeren“ für VBScript als Zeichenkettenbegrenzung notwendigen doppelten Anführungszeichen nicht „kaputt machen“. Das macht man, indem man die inneren einfach verdoppelt. (google nach „vbscript escape quotation marks“.)

Dein Scriptcode muss dann also so aussehen:

[code]Dim sSQLAbfrage, sObjectID

sObjectID = „55f56157f0724ba4b2ea3854d2790297“
sSQLAbfrage = „“„Contacts“"."„ID“" FROM „„Contacts““ WHERE (upper("„Contacts“"."„IKStatus“") = upper(N’Aktuell’) OR upper("„Contacts“"."„IKStatus“") = upper(N’Sucht Objekt’)) AND SUBSTRING("„Contacts“"."„IKSuchKrit“", 17, 1) = ‚1‘ AND NOT EXISTS(SELECT „„Objektnachweis““."„ID“" FROM „„Objektnachweis““ WHERE „„Objektnachweis““."„ObjektID“" = 0x" & sObjectID & " AND „„Objektnachweis““."„KontaktID“" = „„Contacts““."„ID“")"

SQLShell.ExecuteCommandRaw(sSQLAbfrage)
[/code]

ich habe die betreffende ObjektID vorsorglich schon in eine separate Variable umgelagert (die wird per & in die eigentlichen Abfrage-Zeichkette „eingebaut“), weil die Variable sich ja aus dem Kontext irgendwie dynamisch erst zur Laufzeit ergeben wird.

Durch alles weitere musst du dich selber durchwurschteln, ich kann nur nochmal eine VBScript Schulung raten - die muss ja nicht bei combit sein, wäre dort im Kontext mit der combit Produkte Scripting Schnittstelle natürlich besonders effektiv.

Beste Grüße

Alex.

Hallo Alex,

den Fehler hab ich mittlerweile sogar auch wegbekommen. Aber dennoch vielen Dank für Deine Antwort heute am Sonntag. Die Abfrage müsste auch ohne Anführungszeichen funktionieren. Es ergibt jedenfalls keinen Fehler und ich frage viele Filter ohne die Anführungszeichen ab.

Aber jetzt hab ich ein ganz anderes Problem; diese Abfrage ergibt leider nichts. Absolut nichts. Auch keine Fehlermeldung. Es werden keine Datensätze gefunden. Während die absolut gleiche Formel über freien SQL Filter genau das richtige Ergebnis bringt.

nAbfrage = SQLShell.ExecuteCommandRaw(sSQLAbfrage)
MsgBox "Test " & nAbfrage ergibt „Test -1“

Starte das Script über einen Button aus der Sicht Objekte, weil ich ja von dort die ID brauche. Alles ist da. Wechsel zur Sicht Kontakte, Variablen, usw. Nur die SQL Abfrage findet nichts

Dim oProject, oActiveView, oCurrentRecordSet, bFilter, sHinweis
Set oProject = cRM.CurrentProject

If cRM.CurrentProject.ActiveViews.ItemByName(„Kontakte“) Is Nothing Then
cRM.CurrentProject.OpenNewViewByName(„Kontakte“)
Else
cRM.CurrentProject.OpenActiveViewByName(„Kontakte“).Activate
End If

Set oActiveView = oProject.ActiveViews.ActiveView
Set oCurrentRecordSet = oActiveView.CurrentRecordset

Dim sSQLAbfrage, sObjectID, nAbfrage

sObjectID = „55f56157f0724ba4b2ea3854d2790297“
sSQLAbfrage = „“„Contacts“"."„ID“" FROM „„Contacts““ WHERE (upper("„Contacts“"."„IKStatus“") = upper(N’Aktuell’) OR upper("„Contacts“"."„IKStatus“") = upper(N’Sucht Objekt’)) AND SUBSTRING("„Contacts“"."„IKSuchKrit“", 17, 1) = ‚1‘ AND NOT EXISTS(SELECT „„Objektnachweis““."„ID“" FROM „„Objektnachweis““ WHERE „„Objektnachweis““."„ObjektID“" = 0x" & sObjectID & " AND „„Objektnachweis““."„KontaktID“" = „„Contacts““."„ID“")"

nAbfrage = SQLShell.ExecuteCommandRaw(sSQLAbfrage)

MsgBox "Robert " & nAbfrage

Danke nochmals und viele Grüße

Robert

Hallo Alex,

ja das durchwurschteln triffts schon bei mir. Deswegen werd ich auch eine Schulung machen. Derzeit habe ich aber noch nicht die Zeit dazu weil meine Aufgabe eigentlich eine andere ist. Dennoch brauch ich halt ab und an mal so bestimmte Lösungen.

Und deshalb auch vielen herzlichen Dank Deine Bemühungen. Das Problem ist aber, dass die Abfrage leider nichts bringt. Also ich mein leider kein Ergebnis.

Hab folgende Abfrageformen zum Test geschrieben:

Dim oProject, oActiveView, oCurrentRecordSet
Set oProject = cRM.CurrentProject
Set oActiveView = oProject.ActiveViews.ActiveView
Set oCurrentRecordSet = oActiveView.CurrentRecordset

Dim sSQLAbfrage, sObjectID, nAbfrage

'Weder so
sSQLAbfrage = "SELECT ""Contacts"".""ID"" FROM ""Contacts"" WHERE (upper(""Contacts"".""Firstname"") = upper(N'Robert')"

'noch so
sSQLAbfrage = CStr("SELECT ""Contacts"".""ID"" FROM ""Contacts"" WHERE (upper(""Contacts"".""Firstname"") = upper(N'Robert')")

'noch so
sSQLAbfrage = CStr("SELECT Contacts.ID FROM Contacts WHERE (upper(Contacts.Firstname) = upper(N'Robert')")

'oder ganz einfach mal so
sSQLAbfrage = "SELECT  ID FROM Contacts WHERE Firstname = Robert"

nAbfrage = SQLShell.ExecuteCommandRaw(sSQLAbfrage)

MsgBox "Test " & nAbfrage 'ergibt immer Test -1

...........

'Die Freie SQL Abfrage
SELECT "Contacts"."ID" FROM "Contacts" WHERE upper("Contacts"."Firstname") = upper(N'Robert')

'bringt 23 Ergebnisse

Woran könnte das liegen ? Kommt keine Fehlermeldung, aber auch kein Ergebnis. Es hat fast den Anschein, als wäre etwas „ausgeschaltet“

Danke und viele Grüße

Robert

Hi,

sehe ich jetzt erst:

SQLShell.ExecuteCommandRaw(sSQLAbfrage)
ist die falsche Methode!

Du brauchst

oCurrentRecordSet.SetFilterDirectSQL(sSQLAbfrage)
Gruß

Alex

Perfekt !
Danke Alex.

Viele Grüße

Robert

Hi Alex,

das ist nun draus geworden :slight_smile:

sSQLAbfrage = "SELECT ""Contacts"".""ID"" FROM ""Contacts"" WHERE (upper(""Contacts"".""IKStatus"") = upper(N'Aktuell') OR upper(""Contacts"".""IKStatus"") = upper(N'Sucht Objekt')) AND SUBSTRING(""Contacts"".""IKSuchKrit"", " & sPos & ", 1) = '1'  AND (""Contacts"".""ObjNotNr"" NOT LIKE '%" & sObjID & "%' OR ""Contacts"".""ObjNotNr"" IS NULL) AND NOT EXISTS(SELECT ""Objektnachweis"".""ID"" FROM ""Objektnachweis"" WHERE ""Objektnachweis"".""ObjektID"" = 0x" & sDSID & " AND ""Objektnachweis"".""KontaktID"" = ""Contacts"".""ID"")"

Danke nochmal und viele Grüße

Robert